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
20namespace 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
31namespace mpl_{
32
33 template <bool B> struct bool_;
34 template <class I, I val> struct integral_c;
35 struct integral_c_tag;
36}
37
38namespace 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
50namespace 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
60 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 }
66 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
80 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 }
86 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

source code of include/boost/type_traits/integral_constant.hpp