/* * Copyright (C) 2025 Johnny Richard * * SPDX-License-Identifier: LGPL-3.0-or-later * * This file is part of obe. * * obe is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * obe 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 Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with obe. If not, see . */ #ifndef OBE_ARRAY_H #define OBE_ARRAY_H #include #include #define OBE_ARRAY_INITIAL_CAPACITY 4 #define obe_array(arena, T) (T*)obe_array_new((arena), sizeof(T)) #define obe_array_append(arr, item) \ do { \ obe_array_header_t* h = obe_array_get_header(arr); \ if (h->capacity < h->length + 1) { \ arr = obe_array_grow(arr); \ h = obe_array_get_header(arr); \ } \ arr[h->length++] = item; \ } while (0) typedef struct obe_array_header { obe_arena_t* arena; size_t capacity; size_t item_size; size_t length; } obe_array_header_t; void* obe_array_new(obe_arena_t* arena, size_t item_size); obe_array_header_t* obe_array_get_header(void* arr); void* obe_array_grow(void* arr); size_t obe_array_length(void* arr); #endif /* OBE_ARRAY_H */