Utility.cppm 2.5 KB

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