arena.cpp

cross platform rendering playground

src/core/arena.cpp

990 B
#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);
}