37 #ifndef VIGRA_SIZED_INT_HXX 
   38 #define VIGRA_SIZED_INT_HXX 
   40 #include "metaprogramming.hxx" 
   44 # define VIGRA_BITSOF_SHORT 8 
   45 #elif SHRT_MAX  == 0x7FFFL 
   46 # define VIGRA_BITSOF_SHORT 16 
   47 #elif SHRT_MAX  == 0x7FFFFFFFL 
   48 # define VIGRA_BITSOF_SHORT 32 
   49 #elif SHRT_MAX  > 0xFFFFFFFFL 
   50 # define VIGRA_BITSOF_SHORT 64 
   52 # define VIGRA_BITSOF_SHORT -1 
   56 # define VIGRA_BITSOF_INT 8 
   57 #elif INT_MAX  == 0x7FFFL 
   58 # define VIGRA_BITSOF_INT 16 
   59 #elif INT_MAX  == 0x7FFFFFFFL 
   60 # define VIGRA_BITSOF_INT 32 
   61 #elif INT_MAX  > 0xFFFFFFFFL 
   62 # define VIGRA_BITSOF_INT 64 
   64 # define VIGRA_BITSOF_INT -1 
   68 # define VIGRA_BITSOF_LONG 8 
   69 #elif LONG_MAX  == 0x7FFFL 
   70 # define VIGRA_BITSOF_LONG 16 
   71 #elif LONG_MAX  == 0x7FFFFFFFL 
   72 # define VIGRA_BITSOF_LONG 32 
   73 #elif LONG_MAX  > 0xFFFFFFFFL 
   74 # define VIGRA_BITSOF_LONG 64 
   76 # define VIGRA_BITSOF_LONG -1 
   79 #if   LLONG_MAX  == 0x7FL 
   80 # define VIGRA_BITSOF_LONG_LONG 8 
   81 #elif LLONG_MAX  == 0x7FFFL 
   82 # define VIGRA_BITSOF_LONG_LONG 16 
   83 #elif LLONG_MAX  == 0x7FFFFFFFL 
   84 # define VIGRA_BITSOF_LONG_LONG 32 
   85 #elif LLONG_MAX  > 0xFFFFFFFFL 
   86 # define VIGRA_BITSOF_LONG_LONG 64 
   88 # define VIGRA_BITSOF_LONG_LONG -1 
   93 class Int_type_not_supported_on_this_platform {};
 
   95 #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION 
   99 template<
class T, 
class NEXT>
 
  102     enum { size = 
sizeof(T)*8 };
 
  107 template<
int SIZE, 
class LIST>
 
  108 struct SelectIntegerType
 
  111        IfBool<(SIZE == LIST::size), 
 
  113            typename SelectIntegerType<SIZE, typename LIST::next>::type >::type
 
  118 struct SelectIntegerType<SIZE, Int_type_not_supported_on_this_platform>
 
  120     typedef Int_type_not_supported_on_this_platform type;
 
  124 struct SelectBiggestIntegerType
 
  126     enum { cursize = 
static_cast<int>(LIST::size), 
 
  127            nextsize = static_cast<int>(SelectBiggestIntegerType<typename LIST::next>::size),
 
  128            size = (cursize < nextsize) ? nextsize : cursize };
 
  130        IfBool<(cursize < nextsize), 
 
  131            typename SelectBiggestIntegerType<typename LIST::next>::type,
 
  132            typename LIST::type>::type
 
  137 struct SelectBiggestIntegerType<Int_type_not_supported_on_this_platform>
 
  140     typedef Int_type_not_supported_on_this_platform type;
 
  143 typedef IntTypeList<
signed char, 
 
  144         IntTypeList<
signed short,
 
  145         IntTypeList<
signed int,
 
  146         IntTypeList<
signed long,
 
  147         IntTypeList<
signed long long,
 
  148         Int_type_not_supported_on_this_platform > > > > > SignedIntTypes;
 
  149 typedef IntTypeList<
unsigned char, 
 
  150         IntTypeList<
unsigned short,
 
  151         IntTypeList<
unsigned int,
 
  152         IntTypeList<
unsigned long,
 
  153         IntTypeList<
unsigned long long,
 
  154         Int_type_not_supported_on_this_platform > > > > > UnsignedIntTypes;
 
  171 typedef detail::SelectIntegerType<8,  detail::SignedIntTypes>::type 
Int8;
 
  173 typedef detail::SelectIntegerType<16, detail::SignedIntTypes>::type 
Int16;
 
  175 typedef detail::SelectIntegerType<32, detail::SignedIntTypes>::type 
Int32;
 
  177 typedef detail::SelectIntegerType<64, detail::SignedIntTypes>::type 
Int64;
 
  179 typedef detail::SelectIntegerType<8,  detail::UnsignedIntTypes>::type 
UInt8;
 
  181 typedef detail::SelectIntegerType<16, detail::UnsignedIntTypes>::type 
UInt16;
 
  183 typedef detail::SelectIntegerType<32, detail::UnsignedIntTypes>::type 
UInt32;
 
  185 typedef detail::SelectIntegerType<64, detail::UnsignedIntTypes>::type 
UInt64;
 
  188 typedef detail::SelectBiggestIntegerType<detail::SignedIntTypes>::type   
IntBiggest;
 
  190 typedef detail::SelectBiggestIntegerType<detail::UnsignedIntTypes>::type 
UIntBiggest;
 
  194 #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION 
  196 typedef signed char    Int8;
 
  197 typedef signed short   Int16;
 
  198 typedef signed int     Int32;
 
  199 typedef Int_type_not_supported_on_this_platform 
Int64;
 
  200 typedef unsigned char  UInt8;
 
  201 typedef unsigned short UInt16;
 
  202 typedef unsigned int   UInt32;
 
  203 typedef Int_type_not_supported_on_this_platform 
UInt64;
 
  208 #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION 
detail::SelectIntegerType< 8, detail::UnsignedIntTypes >::type UInt8
8-bit unsigned int 
Definition: sized_int.hxx:179
detail::SelectIntegerType< 16, detail::UnsignedIntTypes >::type UInt16
16-bit unsigned int 
Definition: sized_int.hxx:181
detail::SelectIntegerType< 64, detail::SignedIntTypes >::type Int64
64-bit signed int 
Definition: sized_int.hxx:177
detail::SelectBiggestIntegerType< detail::UnsignedIntTypes >::type UIntBiggest
the biggest unsigned integer type of the system 
Definition: sized_int.hxx:190
detail::SelectIntegerType< 16, detail::SignedIntTypes >::type Int16
16-bit signed int 
Definition: sized_int.hxx:173
detail::SelectIntegerType< 32, detail::SignedIntTypes >::type Int32
32-bit signed int 
Definition: sized_int.hxx:175
detail::SelectBiggestIntegerType< detail::SignedIntTypes >::type IntBiggest
the biggest signed integer type of the system 
Definition: sized_int.hxx:188
detail::SelectIntegerType< 32, detail::UnsignedIntTypes >::type UInt32
32-bit unsigned int 
Definition: sized_int.hxx:183
detail::SelectIntegerType< 64, detail::UnsignedIntTypes >::type UInt64
64-bit unsigned int 
Definition: sized_int.hxx:185
detail::SelectIntegerType< 8, detail::SignedIntTypes >::type Int8
8-bit signed int 
Definition: sized_int.hxx:171