Joos1W Compiler Framework
All Classes Functions Typedefs Pages
BumpAllocator.h
1 #pragma once
2 
3 #include <cstring>
4 #include <memory_resource>
5 
6 using BumpAllocator = std::pmr::polymorphic_allocator<std::byte>;
7 
8 namespace utils {
9 
10 class CustomBufferResource : public std::pmr::memory_resource {
11 public:
12  CustomBufferResource() : CustomBufferResource{128 * sizeof(void*)} {}
13  CustomBufferResource(size_t size);
14 
15  void* do_allocate(std::size_t bytes, std::size_t alignment) override;
16 
17  inline void reset() {
18  alloc_top_ = 0;
19  cur_buf_ = buffers_.begin();
20 #ifdef DEBUG
21  clear_all_buffers();
22 #endif
23  }
24 
25  void destroy() {
26  invalid = true;
27  clear_all_buffers();
28  }
29 
30  void clear_all_buffers();
31 
32  ~CustomBufferResource();
33 
34  void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {
35  // No-op
36  (void)p;
37  (void)bytes;
38  (void)alignment;
39  }
40 
41  bool do_is_equal(
42  const std::pmr::memory_resource& other) const noexcept override {
43  // No-op
44  (void)other;
45  return false;
46  }
47 
48 private:
49  static constexpr float growth_factor = 1.5;
50  struct Buffer {
51  size_t size;
52  void* buf;
53  };
54  void* alloc_top_;
55  size_t avail_;
56  std::vector<Buffer>::iterator cur_buf_;
57  std::vector<Buffer> buffers_;
58  bool invalid = false;
59 };
60 
61 } // namespace utils