diff options
Diffstat (limited to 'lib/arena.h')
-rw-r--r-- | lib/arena.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/arena.h b/lib/arena.h new file mode 100644 index 0000000..3b0724f --- /dev/null +++ b/lib/arena.h @@ -0,0 +1,51 @@ +/* Copyright (C) 2025 Aryadev Chavali + + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License Version 2 for + * details. + + * You may distribute and modify this code under the terms of the GNU General + * Public License Version 2, which you should have received a copy of along with + * this program. If not, please go to <https://www.gnu.org/licenses/>. + + * Created: 2025-04-05 + * Description: Arena + */ + +#ifndef ARENA_H +#define ARENA_H + +#include <base.h> +#include <stdio.h> + +#define PAGE_DEFAULT_SIZE 1024 +#define MEMORY_ALIGNMENT 8 + +typedef struct Page +{ + struct Page *next; + u64 size, capacity; + u8 data[]; +} page_t; + +page_t *page_create(u64 size); +void page_resize(page_t **page, u64 newsize); +// Append - fail (by returning <0) if not enough space. +i64 page_append(page_t *page, void *data, u64 size); +// Append - will resize if necessary +u64 page_rappend(page_t **page, void *data, u64 size); + +typedef struct Aren +{ + page_t *start, *end; +} arena_t; + +void *arena_alloc(arena_t *arena, u64 size); +void *arena_realloc(arena_t *arena, void *ptr, u64 oldsize, u64 newsize); +void *arena_copy(arena_t *arena, void *ptr, u64 size); +void arena_attach(arena_t *arena, page_t *page); +void arena_reset(arena_t *arena); +void arena_cleanup(arena_t *arena); + +#endif |