Utility.cppm 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. module;
  2. #include <cstddef>
  3. #include <source_location>
  4. export module Core.Utility;
  5. import Core.Meta;
  6. #define SOURCE const std::source_location& l = std::source_location::current()
  7. #ifdef CHECK_MEMORY
  8. export void* operator new(size_t count, const std::source_location& l);
  9. export void* operator new[](size_t count, const std::source_location& l);
  10. #endif
  11. export namespace Core {
  12. template<typename T, typename C = int>
  13. C popCount(const T& t) {
  14. static constexpr C map[16] = {0, 1, 1, 2, 1, 2, 2, 3,
  15. 1, 2, 2, 3, 2, 3, 3, 4};
  16. C sum = 0;
  17. for(size_t i = 0; i < sizeof(T) * 8; i += 4) {
  18. sum += map[(t >> i) & 0xF];
  19. }
  20. return sum;
  21. }
  22. using ExitHandler = void (*)(int, void*);
  23. [[noreturn]] void exitWithHandler(int value, SOURCE);
  24. void setExitHandler(ExitHandler h, void* data);
  25. using OutOfMemoryHandler = void (*)(void*);
  26. void setOutOfMemoryHandler(OutOfMemoryHandler h, void* data);
  27. #ifdef CHECK_MEMORY
  28. void* allocateRaw(size_t n, SOURCE);
  29. void* zeroAllocateRaw(size_t n, SOURCE);
  30. void* reallocateRaw(void* p, size_t n, SOURCE);
  31. void deallocateRaw(void* p, SOURCE);
  32. template<typename T, typename... Args>
  33. T* newWithSource(Args&&... args) {
  34. return new(std::source_location::current())
  35. T(Core::forward<Args>(args)...);
  36. }
  37. template<typename T>
  38. T* newWithSourceN(size_t n) {
  39. return new(std::source_location::current()) T[n];
  40. }
  41. #else
  42. void* allocateRaw(size_t n);
  43. void* zeroAllocateRaw(size_t n);
  44. void* reallocateRaw(void* p, size_t n);
  45. void deallocateRaw(void* p);
  46. template<typename T, typename... Args>
  47. T* newWithSource(Args&&... args) {
  48. return new T(Core::forward<Args>(args)...);
  49. }
  50. template<typename T>
  51. T* newWithSourceN(size_t n) {
  52. return new T[n];
  53. }
  54. #endif
  55. void printMemoryReport();
  56. template<typename T>
  57. void deleteWithSource(T* p) {
  58. delete p;
  59. }
  60. template<typename T>
  61. void deleteWithSourceN(T* p) {
  62. delete[] p;
  63. }
  64. template<typename T>
  65. void bubbleSort(T* data, size_t n) {
  66. bool swapped = true;
  67. while(swapped && n > 0) {
  68. swapped = false;
  69. n--;
  70. for(size_t i = 0; i < n; i++) {
  71. if(data[i] > data[i + 1]) {
  72. swap(data[i], data[i + 1]);
  73. swapped = true;
  74. }
  75. }
  76. }
  77. }
  78. }