aboutsummaryrefslogtreecommitdiff
path: root/include/__bsearch.h
blob: 36dc6f32d9f2d4b4344ab2b4c153fe9e278a5e6b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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; \
	}

// [[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;
// }