diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-04-16 10:39:47 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-04-16 10:49:21 +0200 |
commit | 402f5b4777897f0400a6a3e710452f6f64edb7d2 (patch) | |
tree | f49762ea36389ab6202be8076a73b5c08620dd32 /include/_bsearch.h | |
parent | c84f2f1b74d362054ecde1838cbc13a953cae8aa (diff) |
Change private symbol prefix from ‘__’ to ‘_’
Diffstat (limited to 'include/_bsearch.h')
-rw-r--r-- | include/_bsearch.h | 60 |
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; \ + } |