annotate foosdk/sdk/pfc/binary_search.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 class comparator_default;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 template<typename t_comparator = comparator_default>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class binarySearch {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 template<typename t_container,typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 static bool run(const t_container & p_container,t_size p_base,t_size p_count,const t_param & p_param,t_size & p_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 t_size max = p_base + p_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 t_size min = p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 while(min<max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 t_size ptr = min + ( (max-min) >> 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 int state = t_comparator::compare(p_param,p_container[ptr]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 if (state > 0) min = ptr + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 else if (state < 0) max = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 p_result = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 p_result = min;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 template<typename t_container,typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 static bool runGroupBegin(const t_container & p_container,t_size p_base,t_size p_count,const t_param & p_param,t_size & p_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 t_size max = p_base + p_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 t_size min = p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 while(min<max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 t_size ptr = min + ( (max-min) >> 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 int state = t_comparator::compare(p_param,p_container[ptr]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 if (state > 0) min = ptr + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 else if (state < 0) max = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 found = true; max = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 p_result = min;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 return found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 template<typename t_container,typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 static bool runGroupEnd(const t_container & p_container,t_size p_base,t_size p_count,const t_param & p_param,t_size & p_result) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 t_size max = p_base + p_count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_size min = p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 while(min<max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 t_size ptr = min + ( (max-min) >> 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 int state = t_comparator::compare(p_param,p_container[ptr]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (state > 0) min = ptr + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 else if (state < 0) max = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 found = true; min = ptr + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 p_result = min;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 return found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 template<typename t_container,typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 static bool runGroup(const t_container & p_container,t_size p_base,t_size p_count,const t_param & p_param,t_size & p_result,t_size & p_resultCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (!runGroupBegin(p_container,p_base,p_count,p_param,p_result)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 p_resultCount = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 t_size groupEnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 if (!runGroupEnd(p_container,p_result,p_count - p_result,p_param,groupEnd)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 //should not happen..
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 PFC_ASSERT(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 p_resultCount = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 PFC_ASSERT(groupEnd > p_result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 p_resultCount = groupEnd - p_result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 };