131 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | //  (C) Copyright John Maddock 2007. | ||
|  | //  Use, modification and distribution are subject to the Boost Software License, | ||
|  | //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | ||
|  | //  http://www.boost.org/LICENSE_1_0.txt). | ||
|  | // | ||
|  | //  See http://www.boost.org/libs/type_traits for most recent version including documentation. | ||
|  | 
 | ||
|  | #ifndef BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED | ||
|  | #define BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED | ||
|  | 
 | ||
|  | #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> | ||
|  | #include <boost/type_traits/is_enum.hpp> | ||
|  | #include <boost/type_traits/is_same.hpp> | ||
|  | #include <boost/type_traits/remove_cv.hpp> | ||
|  | #include <boost/type_traits/is_const.hpp> | ||
|  | #include <boost/type_traits/is_volatile.hpp> | ||
|  | #include <boost/type_traits/add_const.hpp> | ||
|  | #include <boost/type_traits/add_volatile.hpp> | ||
|  | #include <boost/static_assert.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct make_unsigned | ||
|  | { | ||
|  | 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 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 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 conditional< | ||
|  |                is_same<t_no_cv, short>::value, | ||
|  |                unsigned short, | ||
|  |                typename conditional< | ||
|  |                   is_same<t_no_cv, int>::value, | ||
|  |                   unsigned int, | ||
|  |                   typename conditional< | ||
|  |                      is_same<t_no_cv, long>::value, | ||
|  |                      unsigned long, | ||
|  | #if defined(BOOST_HAS_LONG_LONG) | ||
|  | #ifdef BOOST_HAS_INT128 | ||
|  |                      typename conditional< | ||
|  |                         sizeof(t_no_cv) == sizeof(boost::ulong_long_type),  | ||
|  |                         boost::ulong_long_type,  | ||
|  |                         boost::uint128_type | ||
|  |                      >::type | ||
|  | #else | ||
|  |                      boost::ulong_long_type | ||
|  | #endif | ||
|  | #elif defined(BOOST_HAS_MS_INT64) | ||
|  |                      unsigned __int64 | ||
|  | #else | ||
|  |                      unsigned long | ||
|  | #endif | ||
|  |                   >::type | ||
|  |                >::type | ||
|  |             >::type | ||
|  |          >::type, | ||
|  |          // Not a regular integer type: | ||
|  |          typename conditional< | ||
|  |             sizeof(t_no_cv) == sizeof(unsigned char), | ||
|  |             unsigned char, | ||
|  |             typename conditional< | ||
|  |                sizeof(t_no_cv) == sizeof(unsigned short), | ||
|  |                unsigned short, | ||
|  |                typename conditional< | ||
|  |                   sizeof(t_no_cv) == sizeof(unsigned int), | ||
|  |                   unsigned int, | ||
|  |                   typename conditional< | ||
|  |                      sizeof(t_no_cv) == sizeof(unsigned long), | ||
|  |                      unsigned long, | ||
|  | #if defined(BOOST_HAS_LONG_LONG) | ||
|  | #ifdef BOOST_HAS_INT128 | ||
|  |                      typename conditional< | ||
|  |                         sizeof(t_no_cv) == sizeof(boost::ulong_long_type),  | ||
|  |                         boost::ulong_long_type,  | ||
|  |                         boost::uint128_type | ||
|  |                      >::type | ||
|  | #else | ||
|  |                      boost::ulong_long_type | ||
|  | #endif | ||
|  | #elif defined(BOOST_HAS_MS_INT64) | ||
|  |                      unsigned __int64 | ||
|  | #else | ||
|  |                      unsigned long | ||
|  | #endif | ||
|  |                   >::type | ||
|  |                >::type | ||
|  |             >::type | ||
|  |          >::type | ||
|  |       >::type | ||
|  |    >::type base_integer_type; | ||
|  |     | ||
|  |    // Add back any const qualifier: | ||
|  |    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 conditional< | ||
|  |       is_volatile<T>::value, | ||
|  |       typename add_volatile<const_base_integer_type>::type, | ||
|  |       const_base_integer_type | ||
|  |    >::type type; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED | ||
|  | 
 |