9 #ifndef EAGINE_MEMORY_ALLOC_ARENA_HPP
10 #define EAGINE_MEMORY_ALLOC_ARENA_HPP
12 #include "../assert.hpp"
13 #include "../span.hpp"
14 #include "../string_span.hpp"
20 namespace eagine::memory {
22 template <
typename Alloc>
23 class basic_allocation_arena :
public block_owner {
26 basic_allocation_arena() =
default;
28 template <
typename... P>
29 explicit basic_allocation_arena(P&&... p)
30 : _alloc(std::forward<P>(p)...) {}
32 explicit basic_allocation_arena(Alloc&& alloc)
33 : _alloc(std::move(alloc)) {}
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;
40 ~basic_allocation_arena() {
44 auto empty() const noexcept ->
bool {
45 EAGINE_ASSERT(_blks.empty() == _alns.empty());
52 _blks.push_back(_alloc.allocate(size, align));
53 _alns.push_back(align);
63 return make_aligned_array<T>(count, 1);
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>> {
70 make_aligned_array<std::remove_const_t<T>>(src.size(), align);
71 std::copy(src.begin(), src.end(), dst.begin());
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)));
80 template <
typename T,
typename... Args>
81 auto make_aligned(
const span_size_t align, Args&&... args) -> T&;
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)...);
95 auto allocator() const -> const Alloc& {
101 std::vector<owned_block> _blks;
102 std::vector<span_size_t> _alns;
106 template <
typename T>
109 template <
typename T>
112 template <
typename T,
typename... Args>
113 auto _make_1(
const span_size_t align, Args&&... args) -> T*;
116 using system_allocation_arena =
117 basic_allocation_arena<c_byte_reallocator<byte_alloc_managed_policy>>;
121 #include <eagine/memory/alloc_arena.inl>
123 #endif // EAGINE_MEMORY_ALLOC_ARENA_HPP