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:
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?