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: