#include "arena.h"
#include <cassert>
#include <cstdlib>
#include <cstring>
ArenaC::ArenaC(usize requested_capacity) {
base = static_cast<u8 *>(malloc(requested_capacity));
capacity = requested_capacity;
position = 0;
}
void *ArenaC::push(u64 push_size, u64 push_alignment, bool zero_init) {
u64 aligned_pos = align_up_pow_2(position, push_alignment);
u64 final_pos = aligned_pos + push_size;
if (final_pos > capacity) {
assert(false && "ARENA CAPPED OUT");
return nullptr;
}
position = final_pos;
u8 *out = base + aligned_pos;
if (zero_init) {
memset(out, 0, push_size);
}
return out;
}
void ArenaC::pop(u64 pop_size) {
assert(pop_size <= position && "ARENA POP UNDERFLOW");
position -= pop_size;
}
void ArenaC::reset() {
position = 0;
}
u64 ArenaC::used() const {
return position;
}
u64 ArenaC::remaining() const {
return capacity - position;
}
ArenaC::~ArenaC() {
free(base);
}