Line data Source code
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 : || 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 : 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 16376 : operator const mpl::bool_<val>& ()const 81 : { 82 : static const char data[sizeof(long)] = { 0 }; 83 : static const void* pdata = data; 84 0 : 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