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
Definition: accessor.hxx:43
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