commit ef37deaa386184fed131019b7e08ab3b03151608
parent 424a4eeada99bddb85484982ebf9e886c95a9d62
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Sun, 12 Mar 2023 15:27:36 -0700
Optimize
Diffstat:
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 */