Utility.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef CORE_UTILITY_H
  2. #define CORE_UTILITY_H
  3. #include <stdlib.h>
  4. #define IntSize(t) static_cast<int>(sizeof(t))
  5. namespace Core {
  6. namespace Internal {
  7. template<typename T>
  8. struct BaseRemoveReference {
  9. typedef T t;
  10. };
  11. template<typename T>
  12. struct BaseRemoveReference<T&> {
  13. typedef T t;
  14. };
  15. template<typename T>
  16. struct BaseRemoveReference<T&&> {
  17. typedef T t;
  18. };
  19. template<typename A, typename B>
  20. struct BaseIsSame {
  21. static constexpr bool value = false;
  22. };
  23. template<typename T>
  24. struct BaseIsSame<T, T> {
  25. static constexpr bool value = true;
  26. };
  27. }
  28. template<typename T>
  29. using RemoveReference = Internal::BaseRemoveReference<T>::t;
  30. template<typename T, typename U>
  31. constexpr bool IsSame = Internal::BaseIsSame<T, U>::value;
  32. template<typename T>
  33. constexpr RemoveReference<T>&& move(T&& t) {
  34. return static_cast<RemoveReference<T>&&>(t);
  35. }
  36. template<typename T>
  37. constexpr T&& forward(RemoveReference<T>& t) {
  38. return static_cast<T&&>(t);
  39. }
  40. template<typename T>
  41. constexpr T&& forward(RemoveReference<T>&& t) {
  42. return static_cast<T&&>(t);
  43. }
  44. template<typename T>
  45. void swap(T& a, T& b) {
  46. T tmp = Core::move(a);
  47. a = Core::move(b);
  48. b = Core::move(tmp);
  49. }
  50. template<typename T>
  51. int popCount(const T& t) {
  52. static constexpr int map[16] = {0, 1, 1, 2, 1, 2, 2, 3,
  53. 1, 2, 2, 3, 2, 3, 3, 4};
  54. int sum = 0;
  55. for(int i = 0; i < static_cast<int>(sizeof(T) * 8); i += 4) {
  56. sum += map[(t >> i) & 0xF];
  57. }
  58. return sum;
  59. }
  60. using ExitHandler = void (*)(int, void*);
  61. void exitWithHandler(int value);
  62. void setExitHandler(ExitHandler eh, void*);
  63. }
  64. void* operator new(size_t bytes) noexcept;
  65. void* operator new[](size_t bytes) noexcept;
  66. void operator delete(void* p) noexcept;
  67. void operator delete[](void* p) noexcept;
  68. void operator delete(void* p, size_t bytes) noexcept;
  69. void operator delete[](void* p, size_t bytes) noexcept;
  70. void* operator new(size_t bytes, void* p) noexcept;
  71. // void* operator new[](size_t bytes, void* p) noexcept;
  72. #endif