Utility.hpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #ifndef CORE_UTILITY_HPP
  2. #define CORE_UTILITY_HPP
  3. #include "core/utils/Check.hpp"
  4. #include "core/utils/Error.hpp"
  5. #include "core/utils/Types.hpp"
  6. namespace Core {
  7. template<typename T, typename C = int>
  8. C popCount(const T& t) {
  9. static constexpr C map[16] = {0, 1, 1, 2, 1, 2, 2, 3,
  10. 1, 2, 2, 3, 2, 3, 3, 4};
  11. C sum = 0;
  12. for(size_t i = 0; i < sizeof(T) * 8; i += 4) {
  13. sum += map[(t >> i) & 0xF];
  14. }
  15. return sum;
  16. }
  17. using ExitHandler = void (*)(int, void*);
  18. void exitWithHandler(const char* file, int line, int value);
  19. void setExitHandler(ExitHandler eh, void* data);
  20. #define CORE_EXIT(exitValue) \
  21. Core::exitWithHandler(__FILE__, __LINE__, exitValue)
  22. size_t toString(signed short s, char* buffer, size_t size);
  23. size_t toString(unsigned short s, char* buffer, size_t size);
  24. size_t toString(signed int i, char* buffer, size_t size);
  25. size_t toString(unsigned int i, char* buffer, size_t size);
  26. size_t toString(signed long l, char* buffer, size_t size);
  27. size_t toString(unsigned long l, char* buffer, size_t size);
  28. size_t toString(signed long long ll, char* buffer, size_t size);
  29. size_t toString(unsigned long long ll, char* buffer, size_t size);
  30. size_t toString(float f, char* buffer, size_t size);
  31. size_t toString(double d, char* buffer, size_t size);
  32. size_t toString(long double ld, char* buffer, size_t size);
  33. void print(int c);
  34. void print(const char* s);
  35. void printLine(const char* s);
  36. using OutOfMemoryHandler = void (*)(void*);
  37. void setOutOfMemoryHandler(OutOfMemoryHandler h, void* data);
  38. void* allocate(size_t n);
  39. void* reallocate(void* p, size_t n);
  40. }
  41. #endif