value_init: Removed aligned_storage::address() calls, to improve TR1 compatibility, as confirmed by John Maddock. Added internal helper function, wrapper_address(), as discussed with Fernando.

[SVN r43025]
This commit is contained in:
Niels Dekker 2008-01-30 22:42:23 +00:00
parent 1beca24dd8
commit 28596e678d

View File

@ -5,7 +5,7 @@
// http://www.boost.org/LICENSE_1_0.txt) // http://www.boost.org/LICENSE_1_0.txt)
// //
// 21 Ago 2002 (Created) Fernando Cacciola // 21 Ago 2002 (Created) Fernando Cacciola
// 19 Jan 2008 (Worked around compiler bugs, added initialized_value) Fernando Cacciola, Niels Dekker // 30 Jan 2008 (Worked around compiler bugs, added initialized_value) Fernando Cacciola, Niels Dekker
// //
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP #ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP #define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
@ -37,13 +37,22 @@ class value_initialized
remove_const<T>::type data; remove_const<T>::type data;
}; };
mutable aligned_storage<sizeof(wrapper), alignment_of<wrapper>::value> x; mutable
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
typename
#endif
aligned_storage<sizeof(wrapper), alignment_of<wrapper>::value>::type x;
wrapper * wrapper_address() const
{
return static_cast<wrapper *>( static_cast<void*>(&x));
}
public : public :
value_initialized() value_initialized()
{ {
std::memset(x.address(), 0, sizeof(x)); std::memset(&x, 0, sizeof(x));
#ifdef BOOST_MSVC #ifdef BOOST_MSVC
#pragma warning(push) #pragma warning(push)
#if _MSC_VER >= 1310 #if _MSC_VER >= 1310
@ -53,7 +62,7 @@ class value_initialized
#pragma warning(disable: 4345) #pragma warning(disable: 4345)
#endif #endif
#endif #endif
new (x.address()) wrapper(); new (wrapper_address()) wrapper();
#ifdef BOOST_MSVC #ifdef BOOST_MSVC
#pragma warning(pop) #pragma warning(pop)
#endif #endif
@ -61,24 +70,23 @@ class value_initialized
value_initialized(value_initialized const & arg) value_initialized(value_initialized const & arg)
{ {
new (x.address()) wrapper( *static_cast<wrapper const *>(arg.x.address()) ); new (wrapper_address()) wrapper( static_cast<wrapper const &>(*(arg.wrapper_address())));
} }
value_initialized & operator=(value_initialized const & arg) value_initialized & operator=(value_initialized const & arg)
{ {
T const & arg_data = arg.data(); this->data() = static_cast<T const &>( arg.data() );
this->data() = arg_data;
return *this; return *this;
} }
~value_initialized() ~value_initialized()
{ {
static_cast<wrapper *>(x.address())->wrapper::~wrapper(); wrapper_address()->wrapper::~wrapper();
} }
T& data() const T& data() const
{ {
return static_cast<wrapper *>(x.address())->data; return wrapper_address()->data;
} }
operator T&() const { return this->data(); } operator T&() const { return this->data(); }