annotate foosdk/sdk/pfc/bsearch.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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //deprecated
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class NOVTABLE bsearch_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 virtual int test(t_size n) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 bool bsearch(t_size p_count, bsearch_callback const & p_callback,t_size & p_result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 template<typename t_container,typename t_compare, typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 class bsearch_callback_impl_simple_t : public bsearch_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 int test(t_size p_index) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 return m_compare(m_container[p_index],m_param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 bsearch_callback_impl_simple_t(const t_container & p_container,t_compare p_compare,const t_param & p_param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 : m_container(p_container), m_compare(p_compare), m_param(p_param)
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 const t_container & m_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 t_compare m_compare;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 const t_param & m_param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 template<typename t_container,typename t_compare, typename t_param,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 class bsearch_callback_impl_permutation_t : public bsearch_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 int test(t_size p_index) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 return m_compare(m_container[m_permutation[p_index]],m_param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 bsearch_callback_impl_permutation_t(const t_container & p_container,t_compare p_compare,const t_param & p_param,const t_permutation & p_permutation)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 : m_container(p_container), m_compare(p_compare), m_param(p_param), m_permutation(p_permutation)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 const t_container & m_container;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 t_compare m_compare;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 const t_param & m_param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 const t_permutation & m_permutation;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 template<typename t_container,typename t_compare, typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 bool bsearch_t(t_size p_count,const t_container & p_container,t_compare p_compare,const t_param & p_param,t_size & p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return bsearch(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 p_count,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 bsearch_callback_impl_simple_t<t_container,t_compare,t_param>(p_container,p_compare,p_param),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 template<typename t_container,typename t_compare,typename t_param,typename t_permutation>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 bool bsearch_permutation_t(t_size p_count,const t_container & p_container,t_compare p_compare,const t_param & p_param,const t_permutation & p_permutation,t_size & p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 t_size index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 if (bsearch(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 p_count,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 bsearch_callback_impl_permutation_t<t_container,t_compare,t_param,t_permutation>(p_container,p_compare,p_param,p_permutation),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 index))
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 p_index = p_permutation[index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 template<typename t_container,typename t_compare, typename t_param>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 bool bsearch_range_t(const t_size p_count,const t_container & p_container,t_compare p_compare,const t_param & p_param,t_size & p_range_base,t_size & p_range_count)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_size probe;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (!bsearch(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 p_count,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bsearch_callback_impl_simple_t<t_container,t_compare,t_param>(p_container,p_compare,p_param),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 probe)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 t_size base = probe, count = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 while(base > 0 && p_compare(p_container[base-1],p_param) == 0) {base--; count++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 while(base + count < p_count && p_compare(p_container[base+count],p_param) == 0) {count++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 p_range_base = base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 p_range_count = count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }