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