From 9f197086a4c48524c5e36e414c5f5073f514fb37 Mon Sep 17 00:00:00 2001 From: Jake Koroman Date: Tue, 14 Apr 2026 14:58:09 -0400 Subject: update dynamic array. --- jrk.h | 55 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/jrk.h b/jrk.h index c2f841b..b5365d3 100644 --- a/jrk.h +++ b/jrk.h @@ -193,7 +193,7 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*); #define __jrk_array_alloc(arr, count, len) (arr)->allocfn ? (arr)->allocfn((count), (len), (arr)->allocfn_user) : JRK_ARRAY_DEFAULT_ALLOC_FN((count), (len)) #define __jrk_array_realloc(arr, _len) (arr)->reallocfn ? (arr)->reallocfn((arr)->items, (arr)->len * sizeof((arr)->items[0]), (_len), (arr)->allocfn_user) : JRK_ARRAY_DEFAULT_REALLOC_FN((arr)->items, (_len)) -#define jrk_array_prototype(type) \ +#define jrk_array_prototype(type, fnname, typename) \ typedef struct { \ type *items; \ u64 len; \ @@ -201,17 +201,17 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*); jrk_array_alloc_function_t allocfn; \ jrk_array_realloc_function_t reallocfn; \ void *allocfn_user; \ - } jrk_Array_##type; \ + } jrk_Array_##typename; \ \ - bool jrk_array_##type##_init_ex(jrk_Array_##type*, u64, jrk_array_alloc_function_t, jrk_array_realloc_function_t, void*); \ - bool jrk_array_##type##_init(jrk_Array_##type*, u64); \ - void jrk_array_##type##_deinit(jrk_Array_##type*); \ - bool jrk_array_##type##_setcap(jrk_Array_##type*, u64); \ - bool jrk_array_##type##_push(jrk_Array_##type*, type); \ - bool jrk_array_##type##_pushn(jrk_Array_##type*, const type*, u64) - -#define jrk_array_impl(type) \ - bool jrk_array_##type##_init_ex(jrk_Array_##type *arr, u64 capacity, jrk_array_alloc_function_t allocfn, jrk_array_realloc_function_t reallocfn, void *allocfn_user) \ + bool jrk_array_##fnname##_init_ex(jrk_Array_##typename*, u64, jrk_array_alloc_function_t, jrk_array_realloc_function_t, void*); \ + bool jrk_array_##fnname##_init(jrk_Array_##typename*, u64); \ + void jrk_array_##fnname##_destroy(jrk_Array_##typename*); \ + bool jrk_array_##fnname##_setcap(jrk_Array_##typename*, u64); \ + bool jrk_array_##fnname##_push(jrk_Array_##typename*, type); \ + bool jrk_array_##fnname##_pushn(jrk_Array_##typename*, const type*, u64); + +#define jrk_array_impl(type, fnname, typename) \ + bool jrk_array_##fnname##_init_ex(jrk_Array_##typename *arr, u64 capacity, jrk_array_alloc_function_t allocfn, jrk_array_realloc_function_t reallocfn, void *allocfn_user) \ { \ (arr)->allocfn = (allocfn) ? (allocfn) : NULL; \ (arr)->reallocfn = (reallocfn) ? (reallocfn) : NULL; \ @@ -224,18 +224,18 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*); return true; \ } \ \ - bool jrk_array_##type##_init(jrk_Array_##type *arr, u64 capacity) \ + bool jrk_array_##fnname##_init(jrk_Array_##typename *arr, u64 capacity) \ { \ - return jrk_array_##type##_init_ex(arr, capacity, NULL, NULL, NULL); \ + return jrk_array_##fnname##_init_ex(arr, capacity, NULL, NULL, NULL); \ } \ \ - void jrk_array_##type##_deinit(jrk_Array_##type *arr) \ + void jrk_array_##fnname##_destroy(jrk_Array_##typename *arr) \ { \ if ((arr)->items && !(arr)->allocfn) \ JRK_ARRAY_DEFAULT_FREE_FN((arr)->items); \ } \ \ - bool jrk_array_##type##_setcap(jrk_Array_##type *arr, u64 new_capacity) \ + bool jrk_array_##fnname##_setcap(jrk_Array_##typename *arr, u64 new_capacity) \ { \ if (new_capacity < (arr)->capacity) return false; \ (arr)->items = __jrk_array_realloc((arr), new_capacity * sizeof(type)); \ @@ -245,7 +245,7 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*); return true; \ } \ \ - bool jrk_array_##type##_push(jrk_Array_##type *arr, type val) \ + bool jrk_array_##fnname##_push(jrk_Array_##typename *arr, type val) \ { \ if ((arr)->len+ 1 > (arr)->capacity) { \ while ((arr)->len + 1 > ((arr)->capacity)) \ @@ -257,7 +257,7 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*); return true; \ } \ \ - bool jrk_array_##type##_pushn(jrk_Array_##type *arr, const type *vals, u64 count) \ + bool jrk_array_##fnname##_pushn(jrk_Array_##typename *arr, const type *vals, u64 count) \ { \ if ((arr)->len+ count > (arr)->capacity) { \ while ((arr)->len+ count > ((arr)->capacity)) \ @@ -271,19 +271,23 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*); return true; \ } +#define jrk_array_prototype_and_impl(type, fnname, typename) \ + jrk_array_prototype(type, fnname, typename); \ + jrk_array_impl(type, fnname, typename) + #define jrk_array_foreach(type, it, arr) for (type *it = (arr)->items; it < (arr)->items + (arr)->len; ++it) -jrk_array_prototype(char); -typedef jrk_Array_char jrk_String_Builder; +jrk_array_prototype(char, string_builder, String_Builder) +typedef jrk_Array_String_Builder jrk_String_Builder; -#define jrk_sb_append_null(sb) jrk_array_char_push((sb), 0) +#define jrk_sb_append_null(sb) jrk_array_string_builder_push((sb), 0) #define jrk_sb_append_cstr(sb, str) jrk_sb_appendf((sb), (str)) -#define jrk_sb_append_buf(sb, buf, bufsz) jrk_array_char_pushn((sb), (buf), (bufsz)) +#define jrk_sb_append_buf(sb, buf, bufsz) jrk_array_string_builder_pushn((sb), (buf), (bufsz)) #define jrk_sb_append_string(sb, string) jrk_sb_append_buf((sb), (string).data, (string).len) #define jrk_sb_append_lit(sb, str_lit) jrk_sb_append_buf((sb), (str_lit), sizeof((str_lit)) - 1) -#define jrk_sb_init_ex(sb, size, allocfn, reallocfn, userarg) jrk_array_char_init_ex((sb), (size), (allocfn), (reallocfn), (userarg)) +#define jrk_sb_init_ex(sb, size, allocfn, reallocfn, userarg) jrk_array_string_builder_init_ex((sb), (size), (allocfn), (reallocfn), (userarg)) #define jrk_sb_init_arena(sb, size, arena) jrk_sb_init_ex((sb), (size), jrk_array_alloc_function_arena, jrk_array_realloc_function_arena, (void *)(arena)) -#define jrk_sb_deinit(sb) jrk_array_char_deinit((sb)) +#define jrk_sb_destroy(sb) jrk_array_string_builder_destroy((sb)) #define jrk_sb_to_string(sb) jrk_string_from_parts((sb).items, (sb).len) bool jrk_sb_appendf(jrk_String_Builder*, const char*, ...); @@ -506,8 +510,7 @@ jrk_align_forward(uintptr_t ptr, u64 alignment) return result; } -/* NOTE: for jrk_String_Builder */ -jrk_array_impl(char) +jrk_array_impl(char, string_builder, String_Builder) void * jrk_array_alloc_function_arena(u64 size, u64 count, void *user) @@ -551,7 +554,7 @@ jrk_sb_appendf(jrk_String_Builder *sb, const char *fmt, ...) actual_sz = buf_sz; } - if (!jrk_array_char_pushn(sb, buf, actual_sz)) { + if (!jrk_array_string_builder_pushn(sb, buf, actual_sz)) { jrk_errorv("jrk_sb_appendf(%p, %s): failed to push '%s' into sb", (void *) sb, fmt, fmt); return false; } -- cgit v1.2.3