annotate foosdk/sdk/pfc/bit_array_impl_part2.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 #include "avltree.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "bsearch_inline.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "array.h"
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 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! Generic variable bit array implementation. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Not very efficient to handle lots of items set to true but offers fast searches for true values and accepts arbitrary indexes, contrary to bit_array_bittable. Note that searches for false values are relatively inefficient.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class bit_array_var_impl : public bit_array_var {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 bit_array_var_impl( ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 bit_array_var_impl( const bit_array & source, size_t sourceCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 bool get(t_size n) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 t_size find(bool val,t_size start,t_ssize count) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void set(t_size n,bool val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 void set(t_size n) {m_data += n;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 void unset(t_size n) {m_data -= n;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 t_size get_true_count() const {return m_data.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 void clear() {m_data.remove_all();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 avltree_t<t_size> m_data;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Specialized implementation of bit_array. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! Indended for scenarios where fast searching for true values in a large list is needed, combined with low footprint regardless of the amount of items.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! Call add() repeatedly with the true val indexes. If the indexes were not added in increasing order, call presort() when done with adding.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 class bit_array_flatIndexList : public bit_array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 bit_array_flatIndexList();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 void add( size_t n );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 bool get(t_size n) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 t_size find(bool val,t_size start,t_ssize count) const;
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 void presort();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 size_t get_count() const { return m_content.get_size(); }
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 bool _findNearestUp( size_t val, size_t & outIdx ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 bool _findNearestDown( size_t val, size_t & outIdx ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 bool _find( size_t val, size_t & outIdx ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 return pfc::bsearch_simple_inline_t( m_content, m_content.get_size(), val, outIdx);
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 pfc::array_t< size_t, pfc::alloc_fast > m_content;
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 }