/* * Copyright (C) 2025 Johnny Richard * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include void* obe_array_new(obe_arena_t* arena, size_t item_size) { obe_array_header_t* h = obe_arena_alloc( arena, (item_size * OBE_ARRAY_INITIAL_CAPACITY) + sizeof(obe_array_header_t)); if (h == NULL) { return NULL; } h->arena = arena; h->length = 0; h->item_size = item_size; h->capacity = OBE_ARRAY_INITIAL_CAPACITY; return ((uint8_t *)h) + sizeof(obe_array_header_t); } obe_array_header_t* obe_array_get_header(void* arr) { return (obe_array_header_t*)(((uint8_t *)arr) - sizeof(obe_array_header_t)); } void* obe_array_grow(void* arr) { obe_array_header_t* h = obe_array_get_header(arr); size_t old_size = sizeof(obe_array_header_t) + (h->capacity * h->item_size); h->capacity *= 2; size_t new_size = sizeof(obe_array_header_t) + (h->capacity * h->item_size); h = obe_arena_realloc(h->arena, h, old_size, new_size); return ((uint8_t *)h) + sizeof(obe_array_header_t); } size_t obe_array_length(void* arr) { assert(arr); obe_array_header_t* header = obe_array_get_header(arr); return header->length; }