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