imgtools/imglib/boostlibrary/boost/type_traits/make_signed.hpp
changeset 2 39c28ec933dd
equal deleted inserted replaced
1:820b22e13ff1 2:39c28ec933dd
       
     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