Types.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #ifndef TYPES_H
  2. #define TYPES_H
  3. namespace NumberSize {
  4. template<bool condition, typename IfTrue, typename IfFalse>
  5. struct Conditional {
  6. typedef IfTrue dummy;
  7. };
  8. template<typename IfTrue, typename IfFalse>
  9. struct Conditional<false, IfTrue, IfFalse> {
  10. typedef IfFalse dummy;
  11. };
  12. template<int N, typename A, typename B>
  13. using SizeCheck = Conditional<sizeof(A) == N, A, B>;
  14. template<int N>
  15. using Signed =
  16. SizeCheck<N, long long,
  17. typename SizeCheck<
  18. N, long, typename SizeCheck<N, int, typename SizeCheck<N, short, char>::dummy>::dummy>::dummy>;
  19. template<int N>
  20. using Unsigned =
  21. SizeCheck<N, unsigned long long,
  22. typename SizeCheck<
  23. N, unsigned long,
  24. typename SizeCheck<N, unsigned int,
  25. typename SizeCheck<N, unsigned short, unsigned char>::dummy>::dummy>::dummy>;
  26. }
  27. typedef NumberSize::Signed<8>::dummy int64;
  28. typedef NumberSize::Signed<4>::dummy int32;
  29. typedef NumberSize::Signed<2>::dummy int16;
  30. typedef NumberSize::Signed<1>::dummy int8;
  31. typedef NumberSize::Unsigned<8>::dummy uint64;
  32. typedef NumberSize::Unsigned<4>::dummy uint32;
  33. typedef NumberSize::Unsigned<2>::dummy uint16;
  34. typedef NumberSize::Unsigned<1>::dummy uint8;
  35. #endif