rcx

library of miscellaneous bits of C code
git clone git://git.rr3.xyz/rcx
Log | Files | Refs | README | LICENSE

commit 2d7c0bf2ccc361d6072b7038db4fee5f06eac6ad
parent ad49ce7df1d5fe6a11532d233d2bcd20e037f94e
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Wed,  7 Sep 2022 20:13:05 -0700

Make vector header type changable

This will be useful when I introduce character vectors as a
replacement for strings. For space efficiency, we do not want
extra padding introduced due to maxalign.

Diffstat:
Minc/rcx/unicode.h | 6++++++
Minc/rcx/vector.h | 25+++++++++++++------------
2 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/inc/rcx/unicode.h b/inc/rcx/unicode.h @@ -2,4 +2,10 @@ #include "rcx/def.h" +/* TODO: idea: +#define r_unicode_is_letter(r) (r_unicode_category(r)[0] == 'L') +etc... +Actually, this is wrong, because r_unicode_category can return NULL +*/ + char *r_unicode_category(rune r); diff --git a/inc/rcx/vector.h b/inc/rcx/vector.h @@ -12,14 +12,15 @@ typedef struct { usize len; usize cap; maxalign arr[]; -} r_vechdr_; +} r_vector_generic_hdr_; -#define R_VECHDR_(v) ((r_vechdr_ *)(v) - 1) +#define R_VECTOR_HDR_(v) ((R_VECTOR_HDR_TYPE *)(v) - 1) /* Defaults */ #define R_VECTOR_STATIC #define R_VECTOR_METHOD(name, prefix) JOIN(JOIN(prefix,_),name) #define R_VECTOR_MIN_CAP 8 +#define R_VECTOR_HDR_TYPE r_vector_generic_hdr_ #define R_VECTOR_REALLOC r_erealloc #define R_VECTOR_FREE free @@ -37,21 +38,21 @@ R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(pop,##__VA_ARGS__)(T **v); #define R_VECTOR_DEFINE(T, ...)\ void R_VECTOR_METHOD(free,##__VA_ARGS__)(T **v) { \ if (*v) \ - R_VECTOR_FREE(R_VECHDR_(*v)); \ + R_VECTOR_FREE(R_VECTOR_HDR_(*v)); \ *v = 0; \ } \ usize R_VECTOR_METHOD(len,##__VA_ARGS__)(T **v) { \ - return *v ? R_VECHDR_(*v)->len : 0; \ + return *v ? R_VECTOR_HDR_(*v)->len : 0; \ } \ usize R_VECTOR_METHOD(cap,##__VA_ARGS__)(T **v) { \ - return *v ? R_VECHDR_(*v)->cap : 0; \ + return *v ? R_VECTOR_HDR_(*v)->cap : 0; \ } \ int R_VECTOR_METHOD(resize,##__VA_ARGS__)(T **v, usize cap) { \ if (cap == 0) { \ R_VECTOR_METHOD(free,##__VA_ARGS__)(v); \ } else { \ cap = MAX(cap, R_VECTOR_MIN_CAP); \ - r_vechdr_ *h = *v ? R_VECHDR_(*v) : 0; \ + R_VECTOR_HDR_TYPE *h = *v ? R_VECTOR_HDR_(*v) : 0; \ usize len = h ? h->len : 0; \ usize arrsize = cap * sizeof (*v)[0]; \ if (r_mul_will_overflow_(cap, sizeof (*v)[0]) \ @@ -68,7 +69,7 @@ int R_VECTOR_METHOD(resize,##__VA_ARGS__)(T **v, usize cap) { \ return 0; \ } \ int R_VECTOR_METHOD(reserve,##__VA_ARGS__)(T **v, usize n) { \ - r_vechdr_ *h = *v ? R_VECHDR_(*v) : 0; \ + R_VECTOR_HDR_TYPE *h = *v ? R_VECTOR_HDR_(*v) : 0; \ usize rem = h ? h->cap - h->len : 0; \ if (n > rem) { \ usize need = n - rem; \ @@ -86,9 +87,9 @@ int R_VECTOR_METHOD(ins,##__VA_ARGS__)(T **v, usize i, T e) { \ if (R_VECTOR_METHOD(reserve,##__VA_ARGS__)(v, 1)) \ return -1; \ memmove(&(*v)[i+1], &(*v)[i], \ - (R_VECHDR_(*v)->len - i) * sizeof (*v)[0]); \ + (R_VECTOR_HDR_(*v)->len - i) * sizeof (*v)[0]); \ (*v)[i] = e; \ - R_VECHDR_(*v)->len++; \ + R_VECTOR_HDR_(*v)->len++; \ return 0; \ } \ int R_VECTOR_METHOD(push,##__VA_ARGS__)(T **v, T e) { \ @@ -98,12 +99,12 @@ int R_VECTOR_METHOD(push,##__VA_ARGS__)(T **v, T e) { \ T R_VECTOR_METHOD(del,##__VA_ARGS__)(T **v, usize i) { \ T e = (*v)[i]; \ memmove(&(*v)[i], &(*v)[i+1], \ - (R_VECHDR_(*v)->len - i - 1) * sizeof (*v)[0]); \ - R_VECHDR_(*v)->len--; \ + (R_VECTOR_HDR_(*v)->len - i - 1) * sizeof (*v)[0]); \ + R_VECTOR_HDR_(*v)->len--; \ return e; \ } \ T R_VECTOR_METHOD(pop,##__VA_ARGS__)(T **v) { \ - return R_VECTOR_METHOD(del,##__VA_ARGS__)(v, R_VECHDR_(*v)->len - 1); \ + return R_VECTOR_METHOD(del,##__VA_ARGS__)(v, R_VECTOR_HDR_(*v)->len - 1); \ } /* TODO?