allocator.hpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #pragma once
  2. #include <kernel/mem.h>
  3. #include <types/types.h>
  4. inline void* operator new(size_t, void* ptr)
  5. {
  6. return ptr;
  7. }
  8. namespace types {
  9. template <typename Allocator>
  10. class allocator_traits;
  11. template <typename T>
  12. class kernel_allocator {
  13. public:
  14. using value_type = T;
  15. static value_type* allocate_memory(size_t count)
  16. {
  17. return static_cast<value_type*>(::k_malloc(count));
  18. }
  19. static void deallocate_memory(value_type* ptr)
  20. {
  21. ::k_free(ptr);
  22. }
  23. };
  24. template <typename T>
  25. class kernel_ident_allocator {
  26. public:
  27. using value_type = T;
  28. static value_type* allocate_memory(size_t count)
  29. {
  30. return static_cast<value_type*>(::ki_malloc(count));
  31. }
  32. static void deallocate_memory(value_type* ptr)
  33. {
  34. ::ki_free(ptr);
  35. }
  36. };
  37. template <typename T, typename... Args>
  38. T* kernel_allocator_new(Args... args)
  39. {
  40. return allocator_traits<kernel_allocator<T>>::allocate_and_construct(args...);
  41. }
  42. template <typename T, typename... Args>
  43. T* kernel_ident_allocator_new(Args... args)
  44. {
  45. return allocator_traits<kernel_ident_allocator<T>>::allocate_and_construct(args...);
  46. }
  47. template <typename Allocator>
  48. class allocator_traits {
  49. public:
  50. using value_type = typename Allocator::value_type;
  51. static value_type* allocate(size_t count)
  52. {
  53. if (count == 0)
  54. return nullptr;
  55. return Allocator::allocate_memory(sizeof(value_type) * count);
  56. }
  57. template <typename... Args>
  58. static value_type* construct(value_type* ptr, Args... args)
  59. {
  60. new (ptr) value_type(args...);
  61. return ptr;
  62. }
  63. template <typename... Args>
  64. static value_type* allocate_and_construct(Args... args)
  65. {
  66. auto* ptr = allocate(1);
  67. construct(ptr, args...);
  68. return ptr;
  69. }
  70. static void deconstruct(value_type* ptr)
  71. {
  72. if (!ptr)
  73. return;
  74. ptr->~value_type();
  75. }
  76. static void deallocate(value_type* ptr)
  77. {
  78. if (!ptr)
  79. return;
  80. Allocator::deallocate_memory(ptr);
  81. }
  82. static void deconstruct_and_deallocate(value_type* ptr)
  83. {
  84. if (!ptr)
  85. return;
  86. deconstruct(ptr);
  87. deallocate(ptr);
  88. }
  89. };
  90. } // namespace types