annotate foosdk/sdk/pfc/bit_array.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 #include <functional>
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 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 //! Bit array interface class, constant version (you can only retrieve values). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! Range of valid indexes depends on the context. When passing a bit_array as a parameter to some code, valid index range must be signaled independently.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class NOVTABLE bit_array {
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 bool get(t_size n) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! Returns the first occurance of val between start and start+count (excluding start+count), or start+count if not found; count may be negative to search back rather than forward. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Can be overridden by bit_array implementations for improved speed in specific cases.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 virtual t_size find(bool val, t_size start, t_ssize count) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 bool operator[](t_size n) const { return get(n); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 t_size calc_count(bool val, t_size start, t_size count, t_size count_max = ~0) const;//counts number of vals for start<=n<start+count
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_size find_first(bool val, t_size start, t_size max) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 t_size find_next(bool val, t_size previous, t_size max) const;
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 void for_each( bool value, size_t base, size_t max, std::function<void(size_t)> f) const;
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 void walk(size_t to, std::function< void ( size_t ) > f, bool val = true ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void walkBack(size_t from, std::function< void ( size_t ) > f, bool val = true ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 bit_array() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 ~bit_array() {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Minimal lambda-based bit_array implementation, no find(), only get().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 class bit_array_lambda : public bit_array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 typedef std::function<bool (size_t)> f_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 f_t f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 bit_array_lambda( f_t f_ ) : f(f_) { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 bool get(t_size n) const {return f(n);}
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 //! Bit array interface class, variable version (you can both set and retrieve values). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! As with the constant version, valid index range depends on the context.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class NOVTABLE bit_array_var : public bit_array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 virtual void set(t_size n,bool val)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 bit_array_var() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 ~bit_array_var() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 class bit_array_wrapper_permutation : public bit_array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 bit_array_wrapper_permutation(const t_size * p_permutation, t_size p_size) : m_permutation(p_permutation), m_size(p_size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 bool get(t_size n) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (n < m_size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 return m_permutation[n] != n;
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 return false;
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 const t_size * const m_permutation;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 const t_size m_size;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 #define PFC_FOR_EACH_INDEX( bitArray, var, count ) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 for( size_t var = (bitArray).find_first( true, 0, (count) ); var < (count); var = (bitArray).find_next( true, var, (count) ) )