allocator.hpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #pragma once
  2. #include <types/types.h>
  3. inline void* operator new(size_t, void* ptr)
  4. {
  5. return ptr;
  6. }
  7. namespace types {
  8. template <typename T>
  9. class kernel_allocator {
  10. public:
  11. using value_type = T;
  12. static value_type* allocate_memory(size_t count)
  13. {
  14. return static_cast<value_type*>(::k_malloc(sizeof(value_type) * count));
  15. }
  16. static void deallocate_memory(value_type* ptr)
  17. {
  18. ::k_free(ptr);
  19. }
  20. };
  21. template <typename Allocator>
  22. class allocator_traits {
  23. public:
  24. using value_type = typename Allocator::value_type;
  25. static value_type* allocate(size_t count)
  26. {
  27. if (count == 0)
  28. return nullptr;
  29. return Allocator::allocate_memory(sizeof(value_type) * count);
  30. }
  31. template <typename... Args>
  32. static value_type* construct(value_type* ptr, Args... args)
  33. {
  34. new (ptr) value_type(args...);
  35. return ptr;
  36. }
  37. template <typename... Args>
  38. static value_type* allocate_and_construct(Args... args)
  39. {
  40. auto* ptr = allocate(1);
  41. construct(ptr, args...);
  42. return ptr;
  43. }
  44. static void deconstruct(value_type* ptr)
  45. {
  46. if (!ptr)
  47. return;
  48. ptr->~value_type();
  49. }
  50. static void deallocate(value_type* ptr)
  51. {
  52. if (!ptr)
  53. return;
  54. Allocator::deallocate_memory(ptr);
  55. }
  56. static void deconstruct_and_deallocate(value_type* ptr)
  57. {
  58. if (!ptr)
  59. return;
  60. deconstruct(ptr);
  61. deallocate(ptr);
  62. }
  63. };
  64. } // namespace types