Pixie
Loading...
Searching...
No Matches
rmm_base.h
1#pragma once
2
3#include <cstddef>
4#include <limits>
5
6namespace pixie {
7
17template <class Impl>
18class RmMBase {
19 public:
23 static constexpr std::size_t npos = std::numeric_limits<std::size_t>::max();
24
28 std::size_t size() const { return impl().size_impl(); }
29
33 std::size_t rank1(std::size_t end_position) const {
34 return impl().rank1_impl(end_position);
35 }
36
40 std::size_t rank0(std::size_t end_position) const {
41 return impl().rank0_impl(end_position);
42 }
43
48 std::size_t select1(std::size_t rank) const {
49 return impl().select1_impl(rank);
50 }
51
56 std::size_t select0(std::size_t rank) const {
57 return impl().select0_impl(rank);
58 }
59
66 std::size_t rank10(std::size_t end_position) const {
67 return impl().rank10_impl(end_position);
68 }
69
74 std::size_t select10(std::size_t rank) const {
75 return impl().select10_impl(rank);
76 }
77
81 int excess(std::size_t end_position) const {
82 return impl().excess_impl(end_position);
83 }
84
91 std::size_t fwdsearch(std::size_t start_position, int delta) const {
92 return impl().fwdsearch_impl(start_position, delta);
93 }
94
101 std::size_t bwdsearch(std::size_t start_position, int delta) const {
102 return impl().bwdsearch_impl(start_position, delta);
103 }
104
111 std::size_t range_min_query_pos(std::size_t range_begin,
112 std::size_t range_end) const {
113 return impl().range_min_query_pos_impl(range_begin, range_end);
114 }
115
121 int range_min_query_val(std::size_t range_begin,
122 std::size_t range_end) const {
123 return impl().range_min_query_val_impl(range_begin, range_end);
124 }
125
132 std::size_t range_max_query_pos(std::size_t range_begin,
133 std::size_t range_end) const {
134 return impl().range_max_query_pos_impl(range_begin, range_end);
135 }
136
142 int range_max_query_val(std::size_t range_begin,
143 std::size_t range_end) const {
144 return impl().range_max_query_val_impl(range_begin, range_end);
145 }
146
151 std::size_t mincount(std::size_t range_begin, std::size_t range_end) const {
152 return impl().mincount_impl(range_begin, range_end);
153 }
154
160 std::size_t minselect(std::size_t range_begin,
161 std::size_t range_end,
162 std::size_t rank) const {
163 return impl().minselect_impl(range_begin, range_end, rank);
164 }
165
172 std::size_t close(std::size_t open_position) const {
173 return impl().close_impl(open_position);
174 }
175
182 std::size_t open(std::size_t close_position) const {
183 return impl().open_impl(close_position);
184 }
185
192 std::size_t enclose(std::size_t open_position) const {
193 return impl().enclose_impl(open_position);
194 }
195
199 int bit(const size_t& position) const noexcept {
200 return impl().bit_impl(position);
201 }
202
203 private:
204 const Impl& impl() const { return static_cast<const Impl&>(*this); }
205};
206
207} // namespace pixie
CRTP facade for rank/select and range min-max tree operations.
Definition rmm_base.h:18
std::size_t rank0(std::size_t end_position) const
Count 0 bits in the prefix [0, end_position).
Definition rmm_base.h:40
std::size_t open(std::size_t close_position) const
Matching opening parenthesis for the parenthesis at close_position.
Definition rmm_base.h:182
std::size_t range_min_query_pos(std::size_t range_begin, std::size_t range_end) const
Position of the first minimum relative excess in [range_begin, range_end].
Definition rmm_base.h:111
std::size_t size() const
Number of bits in the represented sequence.
Definition rmm_base.h:28
std::size_t close(std::size_t open_position) const
Matching closing parenthesis for the parenthesis at open_position.
Definition rmm_base.h:172
std::size_t select0(std::size_t rank) const
Return the zero-based position of the rank-th 0 bit.
Definition rmm_base.h:56
std::size_t rank10(std::size_t end_position) const
Count "10" bit patterns fully contained in [0, end_position).
Definition rmm_base.h:66
std::size_t select1(std::size_t rank) const
Return the zero-based position of the rank-th 1 bit.
Definition rmm_base.h:48
int excess(std::size_t end_position) const
Prefix excess on [0, end_position): +1 for 1 bits, -1 for 0 bits.
Definition rmm_base.h:81
std::size_t rank1(std::size_t end_position) const
Count 1 bits in the prefix [0, end_position).
Definition rmm_base.h:33
int range_max_query_val(std::size_t range_begin, std::size_t range_end) const
Maximum relative excess value over [range_begin, range_end].
Definition rmm_base.h:142
std::size_t range_max_query_pos(std::size_t range_begin, std::size_t range_end) const
Position of the first maximum relative excess in [range_begin, range_end].
Definition rmm_base.h:132
std::size_t minselect(std::size_t range_begin, std::size_t range_end, std::size_t rank) const
Select a position attaining the minimum relative excess in [range_begin, range_end].
Definition rmm_base.h:160
int bit(const size_t &position) const noexcept
Read bit at position position (LSB-first across words).
Definition rmm_base.h:199
static constexpr std::size_t npos
Sentinel returned by position queries when no valid answer exists.
Definition rmm_base.h:23
std::size_t enclose(std::size_t open_position) const
Closest opening parenthesis strictly enclosing position.
Definition rmm_base.h:192
std::size_t fwdsearch(std::size_t start_position, int delta) const
Forward excess search from a prefix boundary.
Definition rmm_base.h:91
std::size_t select10(std::size_t rank) const
Return the zero-based start position of the rank-th "10" pattern.
Definition rmm_base.h:74
std::size_t bwdsearch(std::size_t start_position, int delta) const
Backward excess search from a prefix boundary.
Definition rmm_base.h:101
std::size_t mincount(std::size_t range_begin, std::size_t range_end) const
Count positions attaining the minimum relative excess in [range_begin, range_end].
Definition rmm_base.h:151
int range_min_query_val(std::size_t range_begin, std::size_t range_end) const
Minimum relative excess value over [range_begin, range_end].
Definition rmm_base.h:121