aboutsummaryrefslogtreecommitdiff
path: root/include/_bsearch.h
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-04-16 10:39:47 +0200
committerThomas Voss <mail@thomasvoss.com> 2024-04-16 10:49:21 +0200
commit402f5b4777897f0400a6a3e710452f6f64edb7d2 (patch)
treef49762ea36389ab6202be8076a73b5c08620dd32 /include/_bsearch.h
parentc84f2f1b74d362054ecde1838cbc13a953cae8aa (diff)
Change private symbol prefix from ‘__’ to ‘_’
Diffstat (limited to 'include/_bsearch.h')
-rw-r--r--include/_bsearch.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/include/_bsearch.h b/include/_bsearch.h
new file mode 100644
index 0000000..ce8f118
--- /dev/null
+++ b/include/_bsearch.h
@@ -0,0 +1,60 @@
+#include <stddef.h>
+
+#include "macros.h"
+
+#define _MLIB_DEFINE_BSEARCH(TYPE, TABLE, DEFAULT) \
+ static TYPE mlib_lookup(rune ch) \
+ { \
+ ptrdiff_t i, lo, hi; \
+ lo = 0; \
+ hi = lengthof(TABLE) - 1; \
+ i = (lo + hi) / 2; \
+ do { \
+ if (ch < TABLE[i].lo) \
+ hi = i - 1; \
+ else if (ch > TABLE[i].hi) \
+ lo = i + 1; \
+ else \
+ return TABLE[i].val; \
+ i = (lo + hi) / 2; \
+ } while (lo <= hi); \
+ return DEFAULT; \
+ }
+
+#define _MLIB_DEFINE_BSEARCH_CONTAINS(TABLE) \
+ static bool mlib_lookup_contains(rune ch) \
+ { \
+ ptrdiff_t i, lo, hi; \
+ lo = 0; \
+ hi = lengthof(TABLE) - 1; \
+ i = (lo + hi) / 2; \
+ do { \
+ if (ch < TABLE[i].lo) \
+ hi = i - 1; \
+ else if (ch > TABLE[i].hi) \
+ lo = i + 1; \
+ else \
+ return true; \
+ i = (lo + hi) / 2; \
+ } while (lo <= hi); \
+ return false; \
+ }
+
+#define _MLIB_DEFINE_BSEARCH_KV(TYPE, TABLE, DEFAULT) \
+ static TYPE mlib_lookup_kv(rune ch) \
+ { \
+ ptrdiff_t i, lo, hi; \
+ lo = 0; \
+ hi = lengthof(TABLE) - 1; \
+ i = (lo + hi) / 2; \
+ do { \
+ if (ch < TABLE[i].k) \
+ hi = i - 1; \
+ else if (ch > TABLE[i].k) \
+ lo = i + 1; \
+ else \
+ return TABLE[i].v; \
+ i = (lo + hi) / 2; \
+ } while (lo <= hi); \
+ return DEFAULT; \
+ }