General Purpose library for Freestanding C++ and POSIX systems
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

100 linhas
1.5 KiB

há 4 anos
há 4 anos
há 4 anos
há 4 anos
  1. #pragma once
  2. #include "gp_config.hpp"
  3. #include "gp/buffer.hpp"
  4. #include <type_traits>
  5. #include <gp/algorithm/tmp_manip.hpp>
  6. namespace gp{
  7. template<typename page_allocator = int, size_t align = 1>
  8. class arena{
  9. page_allocator allocator;
  10. gp::buffer<char> data;
  11. size_t last;
  12. size_t count;
  13. public:
  14. arena()
  15. :last(0)
  16. ,count(0)
  17. ,data(gp::buffer<char>(nullptr,nullptr))
  18. {}
  19. arena(size_t sz)
  20. :last(0)
  21. ,count(0)
  22. ,data(nullptr,nullptr)
  23. {
  24. if constexpr (gp::has_allocator_interface<page_allocator>::value)
  25. {
  26. if(sz!=0)
  27. {
  28. auto v=allocator.allocate(sz);
  29. if(v!=nullptr)
  30. {
  31. data=gp::buffer<char>(reinterpret_cast<char*>(v),reinterpret_cast<char*>(v)+sz);
  32. }
  33. }
  34. }
  35. }
  36. arena(char* pos,size_t sz)
  37. :last(0)
  38. ,count(0)
  39. ,data(pos,pos+sz)
  40. {
  41. }
  42. void* allocate(size_t sz)
  43. {
  44. [[maybe_unused]]
  45. size_t mod = 0;
  46. if constexpr (align != 1)
  47. {
  48. mod = align - ((intptr_t)data.begin())%align;
  49. }
  50. auto ret=data.begin()+last+mod;
  51. if(data.contains(ret))
  52. {
  53. count++;
  54. last+=sz+mod;
  55. return &*(ret);
  56. }
  57. else
  58. {
  59. return nullptr;
  60. }
  61. }
  62. constexpr bool try_reallocate(void*, size_t) {
  63. return false;
  64. }
  65. bool deallocate(void* ptr)
  66. {
  67. if(data.contains((char*)ptr))
  68. {
  69. count--;
  70. if(count==0)
  71. {
  72. for(auto& i : data)
  73. {
  74. i=0;
  75. }
  76. last=0;
  77. }
  78. return true;
  79. }
  80. return false;
  81. }
  82. ~arena()
  83. {
  84. if constexpr(gp::has_allocator_interface<page_allocator>::value)
  85. {
  86. allocator.deallocate(&data[0]);
  87. }
  88. }
  89. };
  90. }