diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-09-01 21:45:18 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2025-09-01 21:45:18 +0100 |
commit | 1aa01d2a893350d979f1c763f0216ba2dcf501bc (patch) | |
tree | ce3a8799c08f36d36c64f52d5ea75bfee259ab7a /vec.c | |
parent | a9b08d3a1158042d36ee07a2513d5c8b654b8f85 (diff) | |
parent | 700c3b1d1b3ed835ffab3fd502ab91baba8e2d1f (diff) | |
download | alisp-1aa01d2a893350d979f1c763f0216ba2dcf501bc.tar.gz alisp-1aa01d2a893350d979f1c763f0216ba2dcf501bc.tar.bz2 alisp-1aa01d2a893350d979f1c763f0216ba2dcf501bc.zip |
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'vec.c')
-rw-r--r-- | vec.c | 94 |
1 files changed, 0 insertions, 94 deletions
@@ -1,94 +0,0 @@ -/* 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 Unlicense - * for details. - - * You may distribute and modify this code under the terms of the - * Unlicense, which you should have received a copy of along with this - * program. If not, please go to <https://unlicense.org/>. - - * Created: 2025-08-20 - * Description: Stable Vector implementation - */ - -#include <malloc.h> -#include <string.h> - -#include "./alisp.h" - -void vec_init(vec_t *vec, u64 size) -{ - memset(vec, 0, sizeof(*vec)); - if (!vec) - return; - else if (size <= VEC_INLINE_CAPACITY) - { - vec->is_inlined = 1; - vec->capacity = VEC_INLINE_CAPACITY; - vec->ptr = NULL; - } - else - { - vec->is_inlined = 0; - vec->capacity = size; - vec->ptr = calloc(1, vec->capacity); - } -} - -void vec_free(vec_t *vec) -{ - if (!vec) - return; - if (!vec->is_inlined && vec->ptr) - free(vec->ptr); - memset(vec, 0, sizeof(*vec)); -} - -void *vec_data(vec_t *vec) -{ - return vec->is_inlined ? vec->inlined : vec->ptr; -} - -void vec_ensure_free(vec_t *vec, u64 size) -{ - if (!vec) - return; - if (vec->capacity - vec->size < size) - { - vec->capacity = MAX(vec->capacity * VEC_MULT, vec->size + size); - if (vec->is_inlined) - { - // If we're inlined, we need to allocate on the heap now. So let's copy - // vec->inlined over to vec->ptr, then turn off inlining. - - // We need to do a two-way swap since vec->ptr and vec->inlined are taking - // up the same space. - u8 buffer[VEC_INLINE_CAPACITY]; - memcpy(buffer, vec->inlined, vec->size); - vec->ptr = calloc(1, vec->capacity); - memcpy(vec->ptr, buffer, vec->size); - vec->is_inlined = 0; - } - else - vec->ptr = realloc(vec->ptr, vec->capacity); - } -} - -void vec_append(vec_t *vec, const void *const ptr, u64 size) -{ - if (!vec) - return; - vec_ensure_free(vec, size); - memcpy(vec_data(vec) + vec->size, ptr, size); - vec->size += size; -} - -void vec_clone(vec_t *dest, vec_t *src) -{ - if (!src || !dest) - return; - vec_init(dest, src->capacity); - memcpy(vec_data(dest), vec_data(src), src->size); -} |