diff options
Diffstat (limited to 'boost/type_traits/make_unsigned.hpp')
-rw-r--r-- | boost/type_traits/make_unsigned.hpp | 89 |
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 |