From b5b63552ff48ceb440a8dac590628ffe4e5e5751 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Sat, 6 Apr 2024 13:06:21 +0200 Subject: Add uprop_get_nv() --- include/__bsearch.h | 55 ++++++++++++++++++----------------------------------- 1 file changed, 18 insertions(+), 37 deletions(-) (limited to 'include/__bsearch.h') 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; \ + } -- cgit v1.2.3