12ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// (C) Copyright 2002-2008, Fernando Luis Cacciola Carballal. 22ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 32ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Distributed under the Boost Software License, Version 1.0. (See 42ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// accompanying file LICENSE_1_0.txt or copy at 52ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// http://www.boost.org/LICENSE_1_0.txt) 62ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 72ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 21 Ago 2002 (Created) Fernando Cacciola 82ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker 92ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola 102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola 112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola 122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 03 Apr 2010 (Added initialized<T>, suggested by Jeffrey Hellrung, fixing #3472) Niels Dekker 132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 30 May 2010 (Made memset call conditional, fixing #3869) Niels Dekker 142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP 162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP 172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Note: The implementation of boost::value_initialized had to deal with the 192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// fact that various compilers haven't fully implemented value-initialization. 202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// The constructor of boost::value_initialized<T> works around these compiler 212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// issues, by clearing the bytes of T, before constructing the T object it 222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// contains. More details on these issues are at libs/utility/value_init.htm 232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/aligned_storage.hpp> 252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/config.hpp> // For BOOST_NO_COMPLETE_VALUE_INITIALIZATION. 262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/detail/workaround.hpp> 272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/static_assert.hpp> 282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/type_traits/cv_traits.hpp> 292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/type_traits/alignment_of.hpp> 302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/swap.hpp> 312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <cstring> 322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <new> 332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifdef BOOST_MSVC 352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#pragma warning(push) 362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if _MSC_VER >= 1310 372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// It is safe to ignore the following warning from MSVC 7.1 or higher: 382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// "warning C4351: new behavior: elements of array will be default initialized" 392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#pragma warning(disable: 4351) 402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// It is safe to ignore the following MSVC warning, which may pop up when T is 412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// a const type: "warning C4512: assignment operator could not be generated". 422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#pragma warning(disable: 4512) 432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifdef BOOST_NO_COMPLETE_VALUE_INITIALIZATION 472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED 482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // suggests that a workaround should be applied, because of compiler issues 492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // regarding value-initialization. 502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh #define BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED 512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Implementation detail: The macro BOOST_DETAIL_VALUE_INIT_WORKAROUND 542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// switches the value-initialization workaround either on or off. 552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_DETAIL_VALUE_INIT_WORKAROUND 562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh #ifdef BOOST_DETAIL_VALUE_INIT_WORKAROUND_SUGGESTED 572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh #define BOOST_DETAIL_VALUE_INIT_WORKAROUND 1 582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh #else 592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh #define BOOST_DETAIL_VALUE_INIT_WORKAROUND 0 602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh #endif 612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace boost { 642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass initialized 672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh private : 692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct wrapper 702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) 722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename 732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh remove_const<T>::type data; 752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh wrapper() 772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : 782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh data() 792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh wrapper(T const & arg) 832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : 842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh data(arg) 852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; 882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh mutable 902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) 912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename 922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh aligned_storage<sizeof(wrapper), alignment_of<wrapper>::value>::type x; 942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh wrapper * wrapper_address() const 962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return static_cast<wrapper *>( static_cast<void*>(&x)); 982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh public : 1012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh initialized() 1032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_DETAIL_VALUE_INIT_WORKAROUND 1052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh std::memset(&x, 0, sizeof(x)); 1062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 1072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh new (wrapper_address()) wrapper(); 1082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh initialized(initialized const & arg) 1112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh new (wrapper_address()) wrapper( static_cast<wrapper const &>(*(arg.wrapper_address()))); 1132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh explicit initialized(T const & arg) 1162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh new (wrapper_address()) wrapper(arg); 1182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh initialized & operator=(initialized const & arg) 1212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // Assignment is only allowed when T is non-const. 1232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_ASSERT( ! is_const<T>::value ); 1242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh *wrapper_address() = static_cast<wrapper const &>(*(arg.wrapper_address())); 1252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return *this; 1262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ~initialized() 1292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh wrapper_address()->wrapper::~wrapper(); 1312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh T const & data() const 1342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return wrapper_address()->data; 1362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh T& data() 1392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return wrapper_address()->data; 1412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh void swap(initialized & arg) 1442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ::boost::swap( this->data(), arg.data() ); 1462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh operator T const &() const 1492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return wrapper_address()->data; 1512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh operator T&() 1542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return wrapper_address()->data; 1562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} ; 1592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 1612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehT const& get ( initialized<T> const& x ) 1622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 1632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return x.data() ; 1642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 1652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 1672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehT& get ( initialized<T>& x ) 1682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 1692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return x.data() ; 1702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 1712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 1732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehvoid swap ( initialized<T> & lhs, initialized<T> & rhs ) 1742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 1752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh lhs.swap(rhs) ; 1762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 1772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 1792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass value_initialized 1802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 1812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh private : 1822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // initialized<T> does value-initialization by default. 1842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh initialized<T> m_data; 1852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh public : 1872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh value_initialized() 1892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : 1902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh m_data() 1912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { } 1922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh T const & data() const 1942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 1952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return m_data.data(); 1962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 1972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh T& data() 1992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 2002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return m_data.data(); 2012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 2022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh void swap(value_initialized & arg) 2042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 2052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh m_data.swap(arg.m_data); 2062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 2072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh operator T const &() const 2092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 2102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return m_data; 2112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 2122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh operator T&() 2142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 2152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return m_data; 2162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 2172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} ; 2182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 2212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehT const& get ( value_initialized<T> const& x ) 2222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return x.data() ; 2242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 2252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 2272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehT& get ( value_initialized<T>& x ) 2282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return x.data() ; 2302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 2312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<class T> 2332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehvoid swap ( value_initialized<T> & lhs, value_initialized<T> & rhs ) 2342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh lhs.swap(rhs) ; 2362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} 2372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass initialized_value_t 2402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 2412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh public : 2422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template <class T> operator T() const 2442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { 2452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh return initialized<T>().data(); 2462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh } 2472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinitialized_value_t const initialized_value = {} ; 2502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace boost 2532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifdef BOOST_MSVC 2552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#pragma warning(pop) 2562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 2572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 259