|
@@ -0,0 +1,43 @@
|
|
|
+#ifndef TYPES_H
|
|
|
+#define TYPES_H
|
|
|
+
|
|
|
+namespace Size {
|
|
|
+ namespace {
|
|
|
+
|
|
|
+ template<bool condition, typename IfTrue, typename IfFalse>
|
|
|
+ struct Conditional {
|
|
|
+ typedef IfTrue dummy;
|
|
|
+ };
|
|
|
+
|
|
|
+ template<typename IfTrue, typename IfFalse>
|
|
|
+ struct Conditional<false, IfTrue, IfFalse> {
|
|
|
+ typedef IfFalse dummy;
|
|
|
+ };
|
|
|
+
|
|
|
+ template<int N, typename A, typename B>
|
|
|
+ using SizeCheck = Conditional<sizeof (A) == N, A, B>;
|
|
|
+
|
|
|
+ template<int N>
|
|
|
+ using Signed = SizeCheck<N, long long,
|
|
|
+ typename SizeCheck<N, long,
|
|
|
+ typename SizeCheck<N, int,
|
|
|
+ typename SizeCheck<N, short, char>::dummy>::dummy>::dummy>;
|
|
|
+
|
|
|
+ template<int N>
|
|
|
+ using Unsigned = SizeCheck<N, unsigned long long,
|
|
|
+ typename SizeCheck<N, unsigned long,
|
|
|
+ typename SizeCheck<N, unsigned int,
|
|
|
+ typename SizeCheck<N, unsigned short, unsigned char>::dummy>::dummy>::dummy>;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+typedef Size::Signed<8>::dummy int64;
|
|
|
+typedef Size::Signed<4>::dummy int32;
|
|
|
+typedef Size::Signed<2>::dummy int16;
|
|
|
+typedef Size::Signed<1>::dummy int8;
|
|
|
+typedef Size::Unsigned<8>::dummy uint64;
|
|
|
+typedef Size::Unsigned<4>::dummy uint32;
|
|
|
+typedef Size::Unsigned<2>::dummy uint16;
|
|
|
+typedef Size::Unsigned<1>::dummy uint8;
|
|
|
+
|
|
|
+#endif
|