48#include <gtest/gtest.h>
77 EXPECT_EQ(arena.available_size(), BUFFER_SIZE);
84 void* ptr = arena.alloc(100);
89 EXPECT_EQ(arena.available_size(), BUFFER_SIZE - 100);
95 void*
ptr1 = arena.alloc(100);
96 void*
ptr2 = arena.alloc(200);
97 void*
ptr3 = arena.alloc(50);
112 void*
ptr1 = arena.alloc(BUFFER_SIZE - 10);
116 void*
ptr2 = arena.alloc(20);
120 EXPECT_EQ(arena.allocated_size(), BUFFER_SIZE - 10);
125 void* ptr = arena.alloc(BUFFER_SIZE);
132 void*
ptr2 = arena.alloc(1);
138 void* ptr = arena.alloc(0);
145 void*
ptr1 = arena.alloc(100);
146 void*
ptr2 = arena.alloc(200);
151 arena.dealloc(
ptr2, 200);
154 arena.dealloc(
ptr1, 100);
161 void*
ptr1 = arena.alloc(100);
162 (
void)arena.alloc(200);
167 arena.dealloc(
ptr1, 100);
173 (
void)arena.alloc(100);
174 (
void)arena.alloc(200);
175 (
void)arena.alloc(50);
183 EXPECT_EQ(arena.available_size(), BUFFER_SIZE);
186 void* ptr = arena.alloc(500);
193 void* ptr = arena.alloc(100);
197 EXPECT_TRUE(arena.contains(buffer + BUFFER_SIZE - 1));
246 void* ptr =
arena1.alloc(100);
289#pragma GCC diagnostic push
290#pragma GCC diagnostic ignored "-Wself-move"
291 arena = std::move(arena);
292#pragma GCC diagnostic pop
309 static int construct_count;
310 static int destruct_count;
312 TestObject(
int v,
const std::string& n) : value(v), name(n)
323int TestObject::construct_count = 0;
324int TestObject::destruct_count = 0;
326class TypedAllocationTest :
public ::testing::Test
329 void SetUp()
override
331 TestObject::construct_count = 0;
332 TestObject::destruct_count = 0;
346 EXPECT_EQ(TestObject::construct_count, 1);
350 EXPECT_EQ(TestObject::destruct_count, 1);
361 EXPECT_EQ(TestObject::construct_count, 3);
368 EXPECT_EQ(TestObject::destruct_count, 3);
379 EXPECT_EQ(TestObject::construct_count, 2);
384 EXPECT_EQ(TestObject::destruct_count, 0);
390 char buffer[
sizeof(TestObject) - 1];
396 EXPECT_EQ(TestObject::construct_count, 0);
458 static_assert(!std::is_copy_constructible_v<AhArenaAllocator>);
459 static_assert(!std::is_copy_assignable_v<AhArenaAllocator>);
464 static_assert(std::is_move_constructible_v<AhArenaAllocator>);
465 static_assert(std::is_move_assignable_v<AhArenaAllocator>);
470 static_assert(std::is_nothrow_move_constructible_v<AhArenaAllocator>);
471 static_assert(std::is_nothrow_move_assignable_v<AhArenaAllocator>);
483 void* ptr = arena.
alloc(1);
494 void* ptr = arena.
alloc(100);
557 ::testing::InitGoogleTest(&
argc,
argv);
Memory arena for fast bulk allocations.
TEST_F(ExternalBufferArena, InitialState)
Arena allocator for fast bump-pointer allocation.
void deallocate(const void *addr, size_t size) noexcept
bool is_valid() const noexcept
Returns true if the arena is valid (has memory).
void * alloc(const size_t size) noexcept
Allocate raw memory from the arena.
void * alloc_aligned(const size_t size, const size_t alignment) noexcept
Allocate aligned memory from the arena.
void reset() noexcept
Reset arena, making all memory available again.
void dealloc(const void *addr, const size_t size) noexcept
Deallocate memory (only effective for LIFO pattern).
bool owns_memory() const noexcept
Returns true if the arena owns its memory.
size_t capacity() const noexcept
Get total arena capacity.
size_t allocated_size() const noexcept
Get total bytes currently allocated.
bool full() const noexcept
Returns true if the arena is full (no space left).
bool empty() const noexcept
Returns true if the arena is empty (no allocations).
static constexpr size_t DEFAULT_SIZE
Default arena size (1 MB).
void * allocate(size_t size) noexcept
static constexpr size_t BUFFER_SIZE
Main namespace for Aleph-w library functions.
void dealloc(AhArenaAllocator &arena, T *ptr) noexcept
Alias for deallocate (backward compatibility).
void deallocate(AhArenaAllocator &arena, T *ptr) noexcept
Destruct and deallocate an object from an arena.
DynList< T > maps(const C &c, Op op)
Classic map operation.