1 //  (C) Copyright John Maddock 2015.
2 //  Use, modification and distribution are subject to the
3 //  Boost Software License, Version 1.0. (See accompanying file
4 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #ifndef BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
7 #define BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
8 
9 #include <boost/config.hpp>
10 #include <boost/detail/workaround.hpp>
11 
12 #if (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
13    || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x610)) \
14    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \
15    || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
16    || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) )\
17    || defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE)
18 
19 
20 namespace boost{
21    namespace mpl
22    {
23       template <bool B> struct bool_;
24       template <class I, I val> struct integral_c;
25       struct integral_c_tag;
26    }
27 }
28 
29 #else
30 
31 namespace mpl_{
32 
33    template <bool B> struct bool_;
34    template <class I, I val> struct integral_c;
35    struct integral_c_tag;
36 }
37 
38 namespace boost
39 {
40    namespace mpl
41    {
42       using ::mpl_::bool_;
43       using ::mpl_::integral_c;
44       using ::mpl_::integral_c_tag;
45    }
46 }
47 
48 #endif
49 
50 namespace boost{
51 
52    template <class T, T val>
53    struct integral_constant
54    {
55       typedef mpl::integral_c_tag tag;
56       typedef T value_type;
57       typedef integral_constant<T, val> type;
58       static const T value = val;
59 
operator const mpl::integral_c<T,val>&boost::integral_constant60       operator const mpl::integral_c<T, val>& ()const
61       {
62          static const char data[sizeof(long)] = { 0 };
63          static const void* pdata = data;
64          return *(reinterpret_cast<const mpl::integral_c<T, val>*>(pdata));
65       }
operator Tboost::integral_constant66       BOOST_CONSTEXPR operator T()const { return val; }
67    };
68 
69    template <class T, T val>
70    T const integral_constant<T, val>::value;
71 
72    template <bool val>
73    struct integral_constant<bool, val>
74    {
75       typedef mpl::integral_c_tag tag;
76       typedef bool value_type;
77       typedef integral_constant<bool, val> type;
78       static const bool value = val;
79 
operator const mpl::bool_<val>&boost::integral_constant80       operator const mpl::bool_<val>& ()const
81       {
82          static const char data[sizeof(long)] = { 0 };
83          static const void* pdata = data;
84          return *(reinterpret_cast<const mpl::bool_<val>*>(pdata));
85       }
operator boolboost::integral_constant86       BOOST_CONSTEXPR operator bool()const { return val; }
87    };
88 
89    template <bool val>
90    bool const integral_constant<bool, val>::value;
91 
92    typedef integral_constant<bool, true> true_type;
93    typedef integral_constant<bool, false> false_type;
94 
95 }
96 
97 #endif
98