#ifndef CORE_UTILITY_H #define CORE_UTILITY_H #include #define CORE_SIZE(t) static_cast(sizeof(t)) namespace Core { namespace Internal { template struct BaseRemoveReference { typedef T t; }; template struct BaseRemoveReference { typedef T t; }; template struct BaseRemoveReference { typedef T t; }; template struct BaseIsSame { static constexpr bool value = false; }; template struct BaseIsSame { static constexpr bool value = true; }; } template using RemoveReference = Internal::BaseRemoveReference::t; template constexpr bool IsSame = Internal::BaseIsSame::value; template constexpr RemoveReference&& move(T&& t) { return static_cast&&>(t); } template constexpr T&& forward(RemoveReference& t) { return static_cast(t); } template constexpr T&& forward(RemoveReference&& t) { return static_cast(t); } template void swap(T& a, T& b) { T tmp = Core::move(a); a = Core::move(b); b = Core::move(tmp); } template int popCount(const T& t) { static constexpr int map[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; int sum = 0; for(int i = 0; i < CORE_SIZE(T) * 8; i += 4) { sum += map[(t >> i) & 0xF]; } return sum; } using ExitHandler = void (*)(int, void*); void exitWithHandler(int value); void setExitHandler(ExitHandler eh, void*); } void* operator new(size_t bytes) noexcept; void* operator new[](size_t bytes) noexcept; void operator delete(void* p) noexcept; void operator delete[](void* p) noexcept; void operator delete(void* p, size_t bytes) noexcept; void operator delete[](void* p, size_t bytes) noexcept; void* operator new(size_t bytes, void* p) noexcept; // void* operator new[](size_t bytes, void* p) noexcept; #endif