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