allocator.hpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include <kernel/mem.hpp>
  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, typename... Args>
  25. T* kernel_allocator_new(Args... args)
  26. {
  27. return allocator_traits<kernel_allocator<T>>::allocate_and_construct(args...);
  28. }
  29. template <typename Allocator>
  30. class allocator_traits {
  31. public:
  32. using value_type = typename Allocator::value_type;
  33. static value_type* allocate(size_t count)
  34. {
  35. if (count == 0)
  36. return nullptr;
  37. return Allocator::allocate_memory(sizeof(value_type) * count);
  38. }
  39. template <typename... Args>
  40. static value_type* construct(value_type* ptr, Args... args)
  41. {
  42. new (ptr) value_type(args...);
  43. return ptr;
  44. }
  45. template <typename... Args>
  46. static value_type* allocate_and_construct(Args... args)
  47. {
  48. auto* ptr = allocate(1);
  49. construct(ptr, args...);
  50. return ptr;
  51. }
  52. static void deconstruct(value_type* ptr)
  53. {
  54. if (!ptr)
  55. return;
  56. ptr->~value_type();
  57. }
  58. static void deallocate(value_type* ptr)
  59. {
  60. if (!ptr)
  61. return;
  62. Allocator::deallocate_memory(ptr);
  63. }
  64. static void deconstruct_and_deallocate(value_type* ptr)
  65. {
  66. if (!ptr)
  67. return;
  68. deconstruct(ptr);
  69. deallocate(ptr);
  70. }
  71. };
  72. } // namespace types