os/ossrv/ossrv_pub/boost_apis/boost/utility/value_init.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright 2002, Fernando Luis Cacciola Carballal.
sl@0
     2
//
sl@0
     3
// Distributed under the Boost Software License, Version 1.0. (See
sl@0
     4
// accompanying file LICENSE_1_0.txt or copy at
sl@0
     5
// http://www.boost.org/LICENSE_1_0.txt)
sl@0
     6
//
sl@0
     7
// 21 Ago 2002 (Created) Fernando Cacciola
sl@0
     8
//
sl@0
     9
#ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
sl@0
    10
#define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
sl@0
    11
sl@0
    12
#include "boost/detail/select_type.hpp"
sl@0
    13
#include "boost/type_traits/cv_traits.hpp"
sl@0
    14
sl@0
    15
namespace boost {
sl@0
    16
sl@0
    17
namespace vinit_detail {
sl@0
    18
sl@0
    19
template<class T>
sl@0
    20
class const_T_base
sl@0
    21
{
sl@0
    22
  protected :
sl@0
    23
sl@0
    24
   const_T_base() : x() {}
sl@0
    25
sl@0
    26
   T x ;
sl@0
    27
} ;
sl@0
    28
sl@0
    29
template<class T>
sl@0
    30
struct non_const_T_base
sl@0
    31
{
sl@0
    32
  protected :
sl@0
    33
sl@0
    34
   non_const_T_base() : x() {}
sl@0
    35
sl@0
    36
   mutable T x ;
sl@0
    37
} ;
sl@0
    38
sl@0
    39
template<class T>
sl@0
    40
struct select_base
sl@0
    41
{
sl@0
    42
  typedef typename
sl@0
    43
    boost::detail::if_true< ::boost::is_const<T>::value >
sl@0
    44
      ::template then< const_T_base<T>, non_const_T_base<T> >::type type ;
sl@0
    45
} ;
sl@0
    46
sl@0
    47
} // namespace vinit_detail
sl@0
    48
sl@0
    49
template<class T>
sl@0
    50
class value_initialized : private vinit_detail::select_base<T>::type
sl@0
    51
{
sl@0
    52
  public :
sl@0
    53
sl@0
    54
    value_initialized() {}
sl@0
    55
sl@0
    56
    operator T&() const { return this->x ; }
sl@0
    57
sl@0
    58
    T& data() const { return this->x ; }
sl@0
    59
sl@0
    60
} ;
sl@0
    61
sl@0
    62
template<class T>
sl@0
    63
T const& get ( value_initialized<T> const& x )
sl@0
    64
{
sl@0
    65
  return x.data() ;
sl@0
    66
}
sl@0
    67
template<class T>
sl@0
    68
T& get ( value_initialized<T>& x )
sl@0
    69
{
sl@0
    70
  return x.data() ;
sl@0
    71
}
sl@0
    72
sl@0
    73
} // namespace boost
sl@0
    74
sl@0
    75
sl@0
    76
#endif
sl@0
    77