summaryrefslogtreecommitdiff
path: root/boost/type_traits/make_unsigned.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/type_traits/make_unsigned.hpp')
-rw-r--r--boost/type_traits/make_unsigned.hpp89
1 files changed, 34 insertions, 55 deletions
diff --git a/boost/type_traits/make_unsigned.hpp b/boost/type_traits/make_unsigned.hpp
index 239153a863..4b21ebaeb2 100644
--- a/boost/type_traits/make_unsigned.hpp
+++ b/boost/type_traits/make_unsigned.hpp
@@ -9,7 +9,7 @@
#ifndef BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED
#define BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED
-#include <boost/mpl/if.hpp>
+#include <boost/type_traits/conditional.hpp>
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_signed.hpp>
#include <boost/type_traits/is_unsigned.hpp>
@@ -20,58 +20,44 @@
#include <boost/type_traits/is_volatile.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/add_volatile.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
#include <boost/static_assert.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
template <class T>
-struct make_unsigned_imp
+struct make_unsigned
{
- BOOST_STATIC_ASSERT(
- (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_enum<T>::value>::value));
- BOOST_STATIC_ASSERT(
- (::boost::type_traits::ice_not< ::boost::is_same<
- typename remove_cv<T>::type, bool>::value>::value));
+private:
+ BOOST_STATIC_ASSERT_MSG((::boost::is_integral<T>::value || ::boost::is_enum<T>::value), "The template argument to make_unsigned must be an integer or enum type.");
+ BOOST_STATIC_ASSERT_MSG((! ::boost::is_same<typename remove_cv<T>::type, bool>::value), "The template argument to make_unsigned must not be the type bool");
typedef typename remove_cv<T>::type t_no_cv;
- typedef typename mpl::if_c<
- (::boost::type_traits::ice_and<
- ::boost::is_unsigned<T>::value,
- ::boost::is_integral<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value >::value),
+ typedef typename conditional<
+ (::boost::is_unsigned<T>::value && ::boost::is_integral<T>::value
+ && ! ::boost::is_same<t_no_cv, char>::value
+ && ! ::boost::is_same<t_no_cv, wchar_t>::value
+ && ! ::boost::is_same<t_no_cv, bool>::value),
T,
- typename mpl::if_c<
- (::boost::type_traits::ice_and<
- ::boost::is_integral<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value>
- ::value),
- typename mpl::if_<
- is_same<t_no_cv, signed char>,
+ typename conditional<
+ (::boost::is_integral<T>::value
+ && ! ::boost::is_same<t_no_cv, char>::value
+ && ! ::boost::is_same<t_no_cv, wchar_t>::value
+ && ! ::boost::is_same<t_no_cv, bool>::value),
+ typename conditional<
+ is_same<t_no_cv, signed char>::value,
unsigned char,
- typename mpl::if_<
- is_same<t_no_cv, short>,
+ typename conditional<
+ is_same<t_no_cv, short>::value,
unsigned short,
- typename mpl::if_<
- is_same<t_no_cv, int>,
+ typename conditional<
+ is_same<t_no_cv, int>::value,
unsigned int,
- typename mpl::if_<
- is_same<t_no_cv, long>,
+ typename conditional<
+ is_same<t_no_cv, long>::value,
unsigned long,
#if defined(BOOST_HAS_LONG_LONG)
#ifdef BOOST_HAS_INT128
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(boost::ulong_long_type),
boost::ulong_long_type,
boost::uint128_type
@@ -89,21 +75,21 @@ struct make_unsigned_imp
>::type
>::type,
// Not a regular integer type:
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned char),
unsigned char,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned short),
unsigned short,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned int),
unsigned int,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned long),
unsigned long,
#if defined(BOOST_HAS_LONG_LONG)
#ifdef BOOST_HAS_INT128
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(boost::ulong_long_type),
boost::ulong_long_type,
boost::uint128_type
@@ -124,28 +110,21 @@ struct make_unsigned_imp
>::type base_integer_type;
// Add back any const qualifier:
- typedef typename mpl::if_<
- is_const<T>,
+ typedef typename conditional<
+ is_const<T>::value,
typename add_const<base_integer_type>::type,
base_integer_type
>::type const_base_integer_type;
-
+public:
// Add back any volatile qualifier:
- typedef typename mpl::if_<
- is_volatile<T>,
+ typedef typename conditional<
+ is_volatile<T>::value,
typename add_volatile<const_base_integer_type>::type,
const_base_integer_type
>::type type;
};
-
-} // namespace detail
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_unsigned,T,typename boost::detail::make_unsigned_imp<T>::type)
-
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED