]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/type_traits/include/boost/type_traits/integral_constant.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / type_traits / include / boost / type_traits / integral_constant.hpp
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(__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
18
19 namespace boost{
20 namespace mpl
21 {
22 template <bool B> struct bool_;
23 template <class I, I val> struct integral_c;
24 struct integral_c_tag;
25 }
26 }
27
28 #else
29
30 namespace mpl_{
31
32 template <bool B> struct bool_;
33 template <class I, I val> struct integral_c;
34 struct integral_c_tag;
35 }
36
37 namespace boost
38 {
39 namespace mpl
40 {
41 using ::mpl_::bool_;
42 using ::mpl_::integral_c;
43 using ::mpl_::integral_c_tag;
44 }
45 }
46
47 #endif
48
49 namespace boost{
50
51 template <class T, T val>
52 struct integral_constant
53 {
54 typedef mpl::integral_c_tag tag;
55 typedef T value_type;
56 typedef integral_constant<T, val> type;
57 static const T value = val;
58 //
59 // This helper function is just to disable type-punning
60 // warnings from GCC:
61 //
62 template <class U>
63 static U& dereference(U* p) { return *p; }
64
65 operator const mpl::integral_c<T, val>& ()const
66 {
67 static const char data[sizeof(long)] = { 0 };
68 return dereference(reinterpret_cast<const mpl::integral_c<T, val>*>(&data));
69 }
70 BOOST_CONSTEXPR operator T()const { return val; }
71 };
72
73 template <class T, T val>
74 T const integral_constant<T, val>::value;
75
76 template <bool val>
77 struct integral_constant<bool, val>
78 {
79 typedef mpl::integral_c_tag tag;
80 typedef bool value_type;
81 typedef integral_constant<bool, val> type;
82 static const bool value = val;
83 //
84 // This helper function is just to disable type-punning
85 // warnings from GCC:
86 //
87 template <class T>
88 static T& dereference(T* p) { return *p; }
89
90 operator const mpl::bool_<val>& ()const
91 {
92 static const char data = 0;
93 return dereference(reinterpret_cast<const mpl::bool_<val>*>(&data));
94 }
95 BOOST_CONSTEXPR operator bool()const { return val; }
96 };
97
98 template <bool val>
99 bool const integral_constant<bool, val>::value;
100
101 typedef integral_constant<bool, true> true_type;
102 typedef integral_constant<bool, false> false_type;
103
104 }
105
106 #endif