1 /////////////////////////////////////////////////////////////// 2 // Copyright 2012 John Maddock. Distributed under the Boost 3 // Software License, Version 1.0. (See accompanying file 4 // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt 5 6 #ifndef BOOST_MP_STD_INTEGER_TRAITS_HPP 7 #define BOOST_MP_STD_INTEGER_TRAITS_HPP 8 9 #include <type_traits> 10 11 namespace boost { 12 namespace multiprecision { 13 namespace detail { 14 15 template <class T> 16 struct is_signed : public std::is_signed<T> {}; 17 template <class T> 18 struct is_unsigned : public std::is_unsigned<T> {}; 19 template <class T> 20 struct is_integral : public std::is_integral<T> {}; 21 template <class T> 22 struct is_arithmetic : public std::is_arithmetic<T> {}; 23 template <class T> 24 struct make_unsigned : public std::make_unsigned<T> {}; 25 template <class T> 26 struct make_signed : public std::make_signed<T> {}; 27 28 #ifdef BOOST_HAS_INT128 29 30 template <> 31 struct is_signed<__int128> : public std::integral_constant<bool, true> {}; 32 template <> 33 struct is_signed<unsigned __int128> : public std::integral_constant<bool, false> {}; 34 template <> 35 struct is_unsigned<__int128> : public std::integral_constant<bool, false> {}; 36 template <> 37 struct is_unsigned<unsigned __int128> : public std::integral_constant<bool, true> {}; 38 template <> 39 struct is_integral<__int128> : public std::integral_constant<bool, true> {}; 40 template <> 41 struct is_integral<unsigned __int128> : public std::integral_constant<bool, true> {}; 42 template <> 43 struct is_arithmetic<__int128> : public std::integral_constant<bool, true> {}; 44 template <> 45 struct is_arithmetic<unsigned __int128> : public std::integral_constant<bool, true> {}; 46 template <> 47 struct make_unsigned<__int128> 48 { 49 using type = unsigned __int128; 50 }; 51 template <> 52 struct make_unsigned<unsigned __int128> 53 { 54 using type = unsigned __int128; 55 }; 56 template <> 57 struct make_signed<__int128> 58 { 59 using type = __int128; 60 }; 61 template <> 62 struct make_signed<unsigned __int128> 63 { 64 using type = __int128; 65 }; 66 67 #endif 68 69 }}} // namespace boost::multiprecision::detail 70 71 #endif 72