rcx

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

commit ef37deaa386184fed131019b7e08ab3b03151608
parent 424a4eeada99bddb85484982ebf9e886c95a9d62
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Sun, 12 Mar 2023 15:27:36 -0700

Optimize

Diffstat:
Minc/deque.h | 31++++++++++---------------------
Minc/vector.h | 15+++------------
Msrc/unicode.c | 3+++
3 files changed, 16 insertions(+), 33 deletions(-)

diff --git a/inc/deque.h b/inc/deque.h @@ -8,10 +8,14 @@ /* Defaults */ #define R_DEQUE_STATIC #define R_DEQUE_METHOD(name, prefix) JOIN(JOIN(prefix,_),name) -#define R_DEQUE_MIN_BITS 3 /* 1<<3 = 8 elements */ +#define R_DEQUE_MIN_BITS 3 /* 1<<3 == 8 elements */ #define R_DEQUE_REALLOCN r_ereallocn #define R_DEQUE_FREE free +/* TODO: Storing power-of-2 cap as a usize is a waste. We could store the + * shift count as a u8 and then use the 7 saved bytes for, e.g., a reference + * counter an a flags field. */ + #define R_DEQUE_TYPEDEF(D, T)\ typedef struct D { \ T *arr; \ @@ -25,29 +29,23 @@ typedef struct D { \ * Full iff l == r */ #define R_DEQUE_DECLARE(D, T, ...)\ +static inline UNUSED usize R_DEQUE_METHOD(len,##__VA_ARGS__)(D *d) { return d->l == d->r ? d->cap : (d->r - d->l) & (d->cap - 1); } \ +static inline UNUSED usize R_DEQUE_METHOD(cap,##__VA_ARGS__)(D *d) { return d->cap; } \ R_DEQUE_STATIC UNUSED void R_DEQUE_METHOD(free,##__VA_ARGS__)(D *d); \ -R_DEQUE_STATIC UNUSED usize R_DEQUE_METHOD(len,##__VA_ARGS__)(D *d); \ -R_DEQUE_STATIC UNUSED usize R_DEQUE_METHOD(cap,##__VA_ARGS__)(D *d); \ R_DEQUE_STATIC UNUSED int R_DEQUE_METHOD(reserve,##__VA_ARGS__)(D *d, usize n); \ R_DEQUE_STATIC UNUSED int R_DEQUE_METHOD(pushl,##__VA_ARGS__)(D *d, T e); \ R_DEQUE_STATIC UNUSED int R_DEQUE_METHOD(pushr,##__VA_ARGS__)(D *d, T e); \ R_DEQUE_STATIC UNUSED T R_DEQUE_METHOD(popl,##__VA_ARGS__)(D *d); \ R_DEQUE_STATIC UNUSED T R_DEQUE_METHOD(popr,##__VA_ARGS__)(D *d); \ -R_DEQUE_STATIC UNUSED T R_DEQUE_METHOD(peekl,##__VA_ARGS__)(D *d); \ -R_DEQUE_STATIC UNUSED T R_DEQUE_METHOD(peekr,##__VA_ARGS__)(D *d); \ -R_DEQUE_STATIC UNUSED T *R_DEQUE_METHOD(idx,##__VA_ARGS__)(D *d, usize i); +static inline UNUSED T R_DEQUE_METHOD(peekl,##__VA_ARGS__)(D *d) { return d->arr[d->l]; } \ +static inline UNUSED T R_DEQUE_METHOD(peekr,##__VA_ARGS__)(D *d) { return d->arr[(d->r - 1) & (d->cap - 1)]; } \ +static inline UNUSED T *R_DEQUE_METHOD(idx,##__VA_ARGS__)(D *d, usize i) { return &d->arr[(d->l + i) & (d->cap - 1)]; } #define R_DEQUE_DEFINE(D, T, ...)\ void R_DEQUE_METHOD(free,##__VA_ARGS__)(D *d) { \ R_DEQUE_FREE(d->arr); \ *d = (D){0}; \ } \ -usize R_DEQUE_METHOD(len,##__VA_ARGS__)(D *d) { \ - return d->l == d->r ? d->cap : (d->r - d->l) & (d->cap - 1); \ -} \ -usize R_DEQUE_METHOD(cap,##__VA_ARGS__)(D *d) { \ - return d->cap; \ -} \ int R_DEQUE_METHOD(reserve,##__VA_ARGS__)(D *d, usize n) { \ usize rem = d->cap - R_DEQUE_METHOD(len,##__VA_ARGS__)(d); \ if (n <= rem) \ @@ -110,13 +108,4 @@ T R_DEQUE_METHOD(popr,##__VA_ARGS__)(D *d) { \ d->r = 0; \ } \ return e; \ -} \ -T R_DEQUE_METHOD(peekl,##__VA_ARGS__)(D *d) { \ - return d->arr[d->l]; \ -} \ -T R_DEQUE_METHOD(peekr,##__VA_ARGS__)(D *d) { \ - return d->arr[(d->r - 1) & (d->cap - 1)]; \ -} \ -T *R_DEQUE_METHOD(idx,##__VA_ARGS__)(D *d, usize i) { \ - return &d->arr[(d->l + i) & (d->cap - 1)]; \ } diff --git a/inc/vector.h b/inc/vector.h @@ -29,8 +29,8 @@ struct r_vector_generic_hdr_ { #define R_VECTOR_FREE free #define R_VECTOR_DECLARE(T, ...)\ -R_VECTOR_STATIC UNUSED usize R_VECTOR_METHOD(len,##__VA_ARGS__)(T *v); \ -R_VECTOR_STATIC UNUSED usize R_VECTOR_METHOD(cap,##__VA_ARGS__)(T *v); \ +static inline UNUSED usize R_VECTOR_METHOD(len,##__VA_ARGS__)(T *v) { return v ? R_VECTOR_HDR_(v)->len : 0; } \ +static inline UNUSED usize R_VECTOR_METHOD(cap,##__VA_ARGS__)(T *v) { return v ? R_VECTOR_HDR_(v)->cap : 0; } \ R_VECTOR_STATIC UNUSED void R_VECTOR_METHOD(free,##__VA_ARGS__)(T **v); \ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(resize,##__VA_ARGS__)(T **v, usize cap); \ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(reserve,##__VA_ARGS__)(T **v, usize n); \ @@ -42,15 +42,9 @@ R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(cat,##__VA_ARGS__)(T **dst, T *src); R_VECTOR_STATIC UNUSED int R_VECTOR_METHOD(catn,##__VA_ARGS__)(T **dst, T *src, usize n); \ R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(del,##__VA_ARGS__)(T **v, usize i); \ R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(pop,##__VA_ARGS__)(T **v); \ -R_VECTOR_STATIC UNUSED T R_VECTOR_METHOD(peek,##__VA_ARGS__)(T **v); +static inline UNUSED T R_VECTOR_METHOD(peek,##__VA_ARGS__)(T **v) { return (*v)[R_VECTOR_HDR_(*v)->len - 1]; } #define R_VECTOR_DEFINE(T, ...)\ -usize R_VECTOR_METHOD(len,##__VA_ARGS__)(T *v) { \ - return v ? R_VECTOR_HDR_(v)->len : 0; \ -} \ -usize R_VECTOR_METHOD(cap,##__VA_ARGS__)(T *v) { \ - return v ? R_VECTOR_HDR_(v)->cap : 0; \ -} \ void R_VECTOR_METHOD(free,##__VA_ARGS__)(T **v) { \ if (*v) \ R_VECTOR_FREE(R_VECTOR_HDR_(*v)); \ @@ -131,9 +125,6 @@ T R_VECTOR_METHOD(del,##__VA_ARGS__)(T **v, usize i) { \ } \ T R_VECTOR_METHOD(pop,##__VA_ARGS__)(T **v) { \ return R_VECTOR_METHOD(del,##__VA_ARGS__)(v, R_VECTOR_HDR_(*v)->len - 1); \ -} \ -T R_VECTOR_METHOD(peek,##__VA_ARGS__)(T **v) { \ - return (*v)[R_VECTOR_HDR_(*v)->len - 1]; \ } /* TODO? diff --git a/src/unicode.c b/src/unicode.c @@ -10,6 +10,9 @@ static char ucats[] = "Zs\0Zl\0Zp\0" "Cc\0Cf\0Cs\0Co\0Cn"; +/* TODO: Optimization opportunity: Do the Latin 1 check inside a static inline + * function inside the header file. */ + char * r_unicode_category(rune r) { if (r <= 0xff) /* Latin 1 */