diff options
Diffstat (limited to 'include/__bsearch.h')
-rw-r--r-- | include/__bsearch.h | 55 |
1 files changed, 18 insertions, 37 deletions
diff --git a/include/__bsearch.h b/include/__bsearch.h index 36dc6f3..6abcff6 100644 --- a/include/__bsearch.h +++ b/include/__bsearch.h @@ -40,40 +40,21 @@ return false; \ } -// [[gnu::always_inline]] static TYPE -// lookup(rune ch) -// { -// ptrdiff_t i, lo, hi; -// -// #ifdef LATIN1_TABLE -// if (ch <= LATIN1_MAX) -// return LATIN1_TABLE[ch]; -// #endif -// if (ch >= lengthof(TABLE)) -// return DEFAULT; -// -// lo = 0; -// hi = lengthof(TABLE) - 1; -// -// #ifdef INITIAL_INDEX -// i = INITIAL_INDEX; -// #else -// i = (lo + hi) / 2; -// #endif -// -// do { -// if (ch < TABLE[i].LO) -// hi = i - 1; -// else if (ch > TABLE[i].HI) -// lo = i + 1; -// else -// #if HAS_VALUE -// return TABLE[i].val; -// #else -// return true; -// #endif -// i = (lo + hi) / 2; -// } while (lo <= hi); -// -// return DEFAULT; -// } +#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; \ + } |