sl@0: // Copyright 2002, Fernando Luis Cacciola Carballal.
sl@0: //
sl@0: // Distributed under the Boost Software License, Version 1.0. (See
sl@0: // accompanying file LICENSE_1_0.txt or copy at
sl@0: // http://www.boost.org/LICENSE_1_0.txt)
sl@0: //
sl@0: // 21 Ago 2002 (Created) Fernando Cacciola
sl@0: //
sl@0: #ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
sl@0: #define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
sl@0: 
sl@0: #include "boost/detail/select_type.hpp"
sl@0: #include "boost/type_traits/cv_traits.hpp"
sl@0: 
sl@0: namespace boost {
sl@0: 
sl@0: namespace vinit_detail {
sl@0: 
sl@0: template<class T>
sl@0: class const_T_base
sl@0: {
sl@0:   protected :
sl@0: 
sl@0:    const_T_base() : x() {}
sl@0: 
sl@0:    T x ;
sl@0: } ;
sl@0: 
sl@0: template<class T>
sl@0: struct non_const_T_base
sl@0: {
sl@0:   protected :
sl@0: 
sl@0:    non_const_T_base() : x() {}
sl@0: 
sl@0:    mutable T x ;
sl@0: } ;
sl@0: 
sl@0: template<class T>
sl@0: struct select_base
sl@0: {
sl@0:   typedef typename
sl@0:     boost::detail::if_true< ::boost::is_const<T>::value >
sl@0:       ::template then< const_T_base<T>, non_const_T_base<T> >::type type ;
sl@0: } ;
sl@0: 
sl@0: } // namespace vinit_detail
sl@0: 
sl@0: template<class T>
sl@0: class value_initialized : private vinit_detail::select_base<T>::type
sl@0: {
sl@0:   public :
sl@0: 
sl@0:     value_initialized() {}
sl@0: 
sl@0:     operator T&() const { return this->x ; }
sl@0: 
sl@0:     T& data() const { return this->x ; }
sl@0: 
sl@0: } ;
sl@0: 
sl@0: template<class T>
sl@0: T const& get ( value_initialized<T> const& x )
sl@0: {
sl@0:   return x.data() ;
sl@0: }
sl@0: template<class T>
sl@0: T& get ( value_initialized<T>& x )
sl@0: {
sl@0:   return x.data() ;
sl@0: }
sl@0: 
sl@0: } // namespace boost
sl@0: 
sl@0: 
sl@0: #endif
sl@0: