12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // (C) Copyright John Maddock 2015.
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0. (See accompanying file
- // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
- #define BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
- #include <boost/config.hpp>
- #include <boost/detail/workaround.hpp>
- #if (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
- || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
- || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
- || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) )\
- || defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE)
- namespace boost{
- namespace mpl
- {
- template <bool B> struct bool_;
- template <class I, I val> struct integral_c;
- struct integral_c_tag;
- }
- }
- #else
- namespace mpl_{
- template <bool B> struct bool_;
- template <class I, I val> struct integral_c;
- struct integral_c_tag;
- }
- namespace boost
- {
- namespace mpl
- {
- using ::mpl_::bool_;
- using ::mpl_::integral_c;
- using ::mpl_::integral_c_tag;
- }
- }
- #endif
- namespace boost{
- template <class T, T val>
- struct integral_constant
- {
- typedef mpl::integral_c_tag tag;
- typedef T value_type;
- typedef integral_constant<T, val> type;
- static const T value = val;
- operator const mpl::integral_c<T, val>& ()const
- {
- static const char data[sizeof(long)] = { 0 };
- static const void* pdata = data;
- return *(reinterpret_cast<const mpl::integral_c<T, val>*>(pdata));
- }
- BOOST_CONSTEXPR operator T()const { return val; }
- };
- template <class T, T val>
- T const integral_constant<T, val>::value;
-
- template <bool val>
- struct integral_constant<bool, val>
- {
- typedef mpl::integral_c_tag tag;
- typedef bool value_type;
- typedef integral_constant<bool, val> type;
- static const bool value = val;
- operator const mpl::bool_<val>& ()const
- {
- static const char data[sizeof(long)] = { 0 };
- static const void* pdata = data;
- return *(reinterpret_cast<const mpl::bool_<val>*>(pdata));
- }
- BOOST_CONSTEXPR operator bool()const { return val; }
- };
- template <bool val>
- bool const integral_constant<bool, val>::value;
- typedef integral_constant<bool, true> true_type;
- typedef integral_constant<bool, false> false_type;
- }
- #endif
|