|
1 |
|
2 // (C) Copyright John Maddock 2007. |
|
3 // Use, modification and distribution are subject to the Boost Software License, |
|
4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
|
5 // http://www.boost.org/LICENSE_1_0.txt). |
|
6 // |
|
7 // See http://www.boost.org/libs/type_traits for most recent version including documentation. |
|
8 |
|
9 #ifndef BOOST_TT_MAKE_SIGNED_HPP_INCLUDED |
|
10 #define BOOST_TT_MAKE_SIGNED_HPP_INCLUDED |
|
11 |
|
12 #include <boost/mpl/if.hpp> |
|
13 #include <boost/type_traits/is_integral.hpp> |
|
14 #include <boost/type_traits/is_signed.hpp> |
|
15 #include <boost/type_traits/is_unsigned.hpp> |
|
16 #include <boost/type_traits/is_enum.hpp> |
|
17 #include <boost/type_traits/is_same.hpp> |
|
18 #include <boost/type_traits/remove_cv.hpp> |
|
19 #include <boost/type_traits/is_const.hpp> |
|
20 #include <boost/type_traits/is_volatile.hpp> |
|
21 #include <boost/type_traits/add_const.hpp> |
|
22 #include <boost/type_traits/add_volatile.hpp> |
|
23 #include <boost/type_traits/detail/ice_or.hpp> |
|
24 #include <boost/type_traits/detail/ice_and.hpp> |
|
25 #include <boost/type_traits/detail/ice_not.hpp> |
|
26 #include <boost/static_assert.hpp> |
|
27 |
|
28 // should be the last #include |
|
29 #include <boost/type_traits/detail/type_trait_def.hpp> |
|
30 |
|
31 namespace boost { |
|
32 |
|
33 namespace detail { |
|
34 |
|
35 template <class T> |
|
36 struct make_signed_imp |
|
37 { |
|
38 BOOST_STATIC_ASSERT( |
|
39 (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_enum<T>::value>::value)); |
|
40 #if !BOOST_WORKAROUND(BOOST_MSVC, <=1300) |
|
41 BOOST_STATIC_ASSERT( |
|
42 (::boost::type_traits::ice_not< ::boost::is_same< |
|
43 typename remove_cv<T>::type, bool>::value>::value)); |
|
44 #endif |
|
45 |
|
46 typedef typename remove_cv<T>::type t_no_cv; |
|
47 typedef typename mpl::if_c< |
|
48 (::boost::type_traits::ice_and< |
|
49 ::boost::is_signed<T>::value, |
|
50 ::boost::is_integral<T>::value, |
|
51 ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value, |
|
52 ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value, |
|
53 ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value >::value), |
|
54 T, |
|
55 typename mpl::if_c< |
|
56 (::boost::type_traits::ice_and< |
|
57 ::boost::is_integral<T>::value, |
|
58 ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value, |
|
59 ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value, |
|
60 ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value> |
|
61 ::value), |
|
62 typename mpl::if_< |
|
63 is_same<t_no_cv, unsigned char>, |
|
64 signed char, |
|
65 typename mpl::if_< |
|
66 is_same<t_no_cv, unsigned short>, |
|
67 signed short, |
|
68 typename mpl::if_< |
|
69 is_same<t_no_cv, unsigned int>, |
|
70 int, |
|
71 typename mpl::if_< |
|
72 is_same<t_no_cv, unsigned long>, |
|
73 long, |
|
74 #if defined(BOOST_HAS_LONG_LONG) |
|
75 boost::long_long_type |
|
76 #elif defined(BOOST_HAS_MS_INT64) |
|
77 __int64 |
|
78 #else |
|
79 long |
|
80 #endif |
|
81 >::type |
|
82 >::type |
|
83 >::type |
|
84 >::type, |
|
85 // Not a regular integer type: |
|
86 typename mpl::if_c< |
|
87 sizeof(t_no_cv) == sizeof(unsigned char), |
|
88 signed char, |
|
89 typename mpl::if_c< |
|
90 sizeof(t_no_cv) == sizeof(unsigned short), |
|
91 signed short, |
|
92 typename mpl::if_c< |
|
93 sizeof(t_no_cv) == sizeof(unsigned int), |
|
94 int, |
|
95 typename mpl::if_c< |
|
96 sizeof(t_no_cv) == sizeof(unsigned long), |
|
97 long, |
|
98 #if defined(BOOST_HAS_LONG_LONG) |
|
99 boost::long_long_type |
|
100 #elif defined(BOOST_HAS_MS_INT64) |
|
101 __int64 |
|
102 #else |
|
103 long |
|
104 #endif |
|
105 >::type |
|
106 >::type |
|
107 >::type |
|
108 >::type |
|
109 >::type |
|
110 >::type base_integer_type; |
|
111 |
|
112 // Add back any const qualifier: |
|
113 typedef typename mpl::if_< |
|
114 is_const<T>, |
|
115 typename add_const<base_integer_type>::type, |
|
116 base_integer_type |
|
117 >::type const_base_integer_type; |
|
118 |
|
119 // Add back any volatile qualifier: |
|
120 typedef typename mpl::if_< |
|
121 is_volatile<T>, |
|
122 typename add_volatile<const_base_integer_type>::type, |
|
123 const_base_integer_type |
|
124 >::type type; |
|
125 }; |
|
126 |
|
127 |
|
128 } // namespace detail |
|
129 |
|
130 BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_signed,T,typename boost::detail::make_signed_imp<T>::type) |
|
131 |
|
132 } // namespace boost |
|
133 |
|
134 #include <boost/type_traits/detail/type_trait_undef.hpp> |
|
135 |
|
136 #endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED |
|
137 |