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