5 #ifndef HERALD_MEMORY_ARENA_H
6 #define HERALD_MEMORY_ARENA_H
21 unsigned short startPageIndex = 0;
22 unsigned short byteLength = 0;
24 bool isInitialised()
const {
25 return 0 != byteLength;
29 constexpr
unsigned long pagesRequired(std::size_t size,std::size_t pageSize)
31 return (size + pageSize - 1) / pageSize;
39 template <std::
size_t MaxSize, std::
size_t AllocationSize>
43 static constexpr std::size_t
Size = MaxSize;
46 static constexpr std::size_t
PageSize = AllocationSize;
49 : arena(), pagesInUse(false)
57 if (newSize <= entry.byteLength) {
60 auto newEntry = allocate(newSize);
61 for (std::size_t i = 0;i < entry.byteLength;++i) {
62 set(newEntry,i,get(entry,i));
68 MemoryArenaEntry allocate(std::size_t size) {
70 return MemoryArenaEntry{0,0};
73 unsigned long pages = pagesRequired(size,
PageSize);
75 unsigned long lastEmptyIndex = 0;
76 for (std::size_t i = 0;i < pagesInUse.size();++i) {
77 if (!pagesInUse.test(i)) {
83 if (i - lastEmptyIndex + 1 == pages) {
85 for (
unsigned long f = lastEmptyIndex;f <= i;++f) {
86 pagesInUse.set(f,
true);
88 return MemoryArenaEntry{(
unsigned short)lastEmptyIndex,(
unsigned short)size};
95 throw std::runtime_error(
"Unable to allocate memory in arena");
98 void deallocate(MemoryArenaEntry& entry) {
99 if (!entry.isInitialised()) {
103 long pages = pagesRequired(entry.byteLength,
PageSize);
104 for (
int i = 0;i < pages;++i) {
105 pagesInUse.set(entry.startPageIndex + i,
false);
107 entry.byteLength = 0;
108 entry.startPageIndex = 0;
111 void set(
const MemoryArenaEntry& entry,
unsigned short bytePosition,
unsigned char value) {
112 if (!entry.isInitialised()) {
115 arena[(entry.startPageIndex *
PageSize) + bytePosition] = value;
118 char get(
const MemoryArenaEntry& entry,
unsigned short bytePosition) {
119 if (!entry.isInitialised()) {
122 return arena[(entry.startPageIndex *
PageSize) + bytePosition];
125 std::size_t pagesFree()
const {
126 return pagesRequired(
Size,
PageSize) - pagesInUse.count();
130 std::array<unsigned char,Size> arena;
Very basic paged memory arena class.
Definition: memory_arena.h:40
static constexpr std::size_t Size
The Maximum size to use for data (doesn't include page table)
Definition: memory_arena.h:43
static constexpr std::size_t PageSize
The allocation size for each page. Note total mem usage is Size + (Size / PageSize) Thus for MemoryAr...
Definition: memory_arena.h:46
Acts as a non-global memory arena for arbitrary classes.
Definition: aggregates.h:15
Represents an external 'pointer' to an allocated memory area.
Definition: memory_arena.h:20