OGLplus  (0.59.0) a C++ wrapper for rendering APIs

alloc_arena.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_MEMORY_ALLOC_ARENA_HPP
10 #define EAGINE_MEMORY_ALLOC_ARENA_HPP
11 
12 #include "../assert.hpp"
13 #include "../span.hpp"
14 #include "../string_span.hpp"
15 #include "c_realloc.hpp"
16 #include <algorithm>
17 #include <utility>
18 #include <vector>
19 
20 namespace eagine::memory {
21 
22 template <typename Alloc>
23 class basic_allocation_arena : public block_owner {
24 
25 public:
26  basic_allocation_arena() = default;
27 
28  template <typename... P>
29  explicit basic_allocation_arena(P&&... p)
30  : _alloc(std::forward<P>(p)...) {}
31 
32  explicit basic_allocation_arena(Alloc&& alloc)
33  : _alloc(std::move(alloc)) {}
34 
35  basic_allocation_arena(basic_allocation_arena&&) noexcept = default;
36  basic_allocation_arena(const basic_allocation_arena&) = delete;
37  auto operator=(basic_allocation_arena&&) = delete;
38  auto operator=(const basic_allocation_arena&) = delete;
39 
40  ~basic_allocation_arena() {
41  clear();
42  }
43 
44  auto empty() const noexcept -> bool {
45  EAGINE_ASSERT(_blks.empty() == _alns.empty());
46  return _blks.empty();
47  }
48 
49  void clear();
50 
51  auto allocate(span_size_t size, span_size_t align) -> block {
52  _blks.push_back(_alloc.allocate(size, align));
53  _alns.push_back(align);
54  return _blks.back();
55  }
56 
57  template <typename T>
58  auto make_aligned_array(const span_size_t count, const span_size_t align)
59  -> span<T>;
60 
61  template <typename T>
62  auto make_array(const span_size_t count) {
63  return make_aligned_array<T>(count, 1);
64  }
65 
66  template <typename T, typename P, typename S>
67  auto copy_aligned_array(basic_span<T, P, S> src, const span_size_t align)
68  -> span<std::remove_const_t<T>> {
69  auto dst =
70  make_aligned_array<std::remove_const_t<T>>(src.size(), align);
71  std::copy(src.begin(), src.end(), dst.begin());
72  return dst;
73  }
74 
75  template <typename T, typename P, typename S>
76  auto copy_array(basic_span<T, P, S> src) -> span<std::remove_const_t<T>> {
77  return copy_aligned_array<T>(src, span_size(alignof(T)));
78  }
79 
80  template <typename T, typename... Args>
81  auto make_aligned(const span_size_t align, Args&&... args) -> T&;
82 
83  template <typename T, typename... Args>
84  auto make(Args&&... args) -> T& {
85  return make_aligned<T>(
86  span_size(alignof(T)), std::forward<Args>(args)...);
87  }
88 
89  template <typename T>
90  void destroy(T& v) {
91  v.~T();
92  }
93 
94 protected:
95  auto allocator() const -> const Alloc& {
96  return _alloc;
97  }
98 
99 private:
100  Alloc _alloc;
101  std::vector<owned_block> _blks;
102  std::vector<span_size_t> _alns;
103 
104  auto _do_allocate(const span_size_t size, const span_size_t align) -> block;
105 
106  template <typename T>
107  auto _allocate(const span_size_t count, const span_size_t align) -> block;
108 
109  template <typename T>
110  auto _make_n(const span_size_t count, const span_size_t align) -> T*;
111 
112  template <typename T, typename... Args>
113  auto _make_1(const span_size_t align, Args&&... args) -> T*;
114 };
115 
116 using system_allocation_arena =
117  basic_allocation_arena<c_byte_reallocator<byte_alloc_managed_policy>>;
118 
119 } // namespace eagine::memory
120 
121 #include <eagine/memory/alloc_arena.inl>
122 
123 #endif // EAGINE_MEMORY_ALLOC_ARENA_HPP
std::ptrdiff_t span_size_t
Signed span size type used by eagine.
Definition: types.hpp:36
static constexpr auto span_size(T v) noexcept
Converts argument to span size type.
Definition: types.hpp:59
basic_block< false > block
Alias for non-const byte memory span.
Definition: block.hpp:27
static auto copy(const_block source, block dest) -> block
Copies the content of source block to destination block.
Definition: copy.hpp:23

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).