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