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
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
93class Int_type_not_supported_on_this_platform {};
95#ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION
99template<
class T,
class NEXT>
102 enum { size =
sizeof(T)*8 };
107template<
int SIZE,
class LIST>
108struct SelectIntegerType
111 IfBool<(SIZE == LIST::size),
113 typename SelectIntegerType<SIZE, typename LIST::next>::type >::type
118struct SelectIntegerType<SIZE, Int_type_not_supported_on_this_platform>
120 typedef Int_type_not_supported_on_this_platform type;
124struct 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
137struct SelectBiggestIntegerType<Int_type_not_supported_on_this_platform>
140 typedef Int_type_not_supported_on_this_platform type;
143typedef 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;
149typedef 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;
171typedef detail::SelectIntegerType<8, detail::SignedIntTypes>::type
Int8;
173typedef detail::SelectIntegerType<16, detail::SignedIntTypes>::type
Int16;
175typedef detail::SelectIntegerType<32, detail::SignedIntTypes>::type
Int32;
177typedef detail::SelectIntegerType<64, detail::SignedIntTypes>::type
Int64;
179typedef detail::SelectIntegerType<8, detail::UnsignedIntTypes>::type
UInt8;
181typedef detail::SelectIntegerType<16, detail::UnsignedIntTypes>::type
UInt16;
183typedef detail::SelectIntegerType<32, detail::UnsignedIntTypes>::type
UInt32;
185typedef detail::SelectIntegerType<64, detail::UnsignedIntTypes>::type
UInt64;
188typedef detail::SelectBiggestIntegerType<detail::SignedIntTypes>::type
IntBiggest;
190typedef detail::SelectBiggestIntegerType<detail::UnsignedIntTypes>::type
UIntBiggest;
196typedef signed char Int8;
197typedef signed short Int16;
198typedef signed int Int32;
199typedef Int_type_not_supported_on_this_platform
Int64;
200typedef unsigned char UInt8;
201typedef unsigned short UInt16;
202typedef unsigned int UInt32;
203typedef Int_type_not_supported_on_this_platform
UInt64;
detail::SelectBiggestIntegerType< detail::SignedIntTypes >::type IntBiggest
the biggest signed integer type of the system
Definition: sized_int.hxx:188
detail::SelectIntegerType< 16, detail::SignedIntTypes >::type Int16
16-bit signed int
Definition: sized_int.hxx:173
detail::SelectIntegerType< 8, detail::UnsignedIntTypes >::type UInt8
8-bit unsigned int
Definition: sized_int.hxx:179
detail::SelectIntegerType< 32, detail::UnsignedIntTypes >::type UInt32
32-bit unsigned int
Definition: sized_int.hxx:183
detail::SelectIntegerType< 8, detail::SignedIntTypes >::type Int8
8-bit signed int
Definition: sized_int.hxx:171
detail::SelectIntegerType< 64, detail::UnsignedIntTypes >::type UInt64
64-bit unsigned int
Definition: sized_int.hxx:185
detail::SelectIntegerType< 16, detail::UnsignedIntTypes >::type UInt16
16-bit unsigned int
Definition: sized_int.hxx:181
detail::SelectBiggestIntegerType< detail::UnsignedIntTypes >::type UIntBiggest
the biggest unsigned integer type of the system
Definition: sized_int.hxx:190
detail::SelectIntegerType< 64, detail::SignedIntTypes >::type Int64
64-bit signed int
Definition: sized_int.hxx:177
detail::SelectIntegerType< 32, detail::SignedIntTypes >::type Int32
32-bit signed int
Definition: sized_int.hxx:175