Pixie
Loading...
Searching...
No Matches
rmm.h
Go to the documentation of this file.
1#pragma once
2
10
11#include <cstddef>
12#include <limits>
13
14namespace pixie {
15
28template <class Impl>
29class RmMBase {
30 public:
34 static constexpr std::size_t npos = std::numeric_limits<std::size_t>::max();
35
39 std::size_t size() const { return impl().size_impl(); }
40
44 std::size_t rank1(std::size_t end_position) const {
45 return impl().rank1_impl(end_position);
46 }
47
51 std::size_t rank0(std::size_t end_position) const {
52 return impl().rank0_impl(end_position);
53 }
54
59 std::size_t select1(std::size_t rank) const {
60 return impl().select1_impl(rank);
61 }
62
67 std::size_t select0(std::size_t rank) const {
68 return impl().select0_impl(rank);
69 }
70
77 std::size_t rank10(std::size_t end_position) const {
78 return impl().rank10_impl(end_position);
79 }
80
85 std::size_t select10(std::size_t rank) const {
86 return impl().select10_impl(rank);
87 }
88
92 int excess(std::size_t end_position) const {
93 return impl().excess_impl(end_position);
94 }
95
102 std::size_t fwdsearch(std::size_t start_position, int delta) const {
103 return impl().fwdsearch_impl(start_position, delta);
104 }
105
112 std::size_t bwdsearch(std::size_t start_position, int delta) const {
113 return impl().bwdsearch_impl(start_position, delta);
114 }
115
122 std::size_t range_min_query_pos(std::size_t range_begin,
123 std::size_t range_end) const {
124 return impl().range_min_query_pos_impl(range_begin, range_end);
125 }
126
132 int range_min_query_val(std::size_t range_begin,
133 std::size_t range_end) const {
134 return impl().range_min_query_val_impl(range_begin, range_end);
135 }
136
143 std::size_t range_max_query_pos(std::size_t range_begin,
144 std::size_t range_end) const {
145 return impl().range_max_query_pos_impl(range_begin, range_end);
146 }
147
153 int range_max_query_val(std::size_t range_begin,
154 std::size_t range_end) const {
155 return impl().range_max_query_val_impl(range_begin, range_end);
156 }
157
162 std::size_t mincount(std::size_t range_begin, std::size_t range_end) const {
163 return impl().mincount_impl(range_begin, range_end);
164 }
165
171 std::size_t minselect(std::size_t range_begin,
172 std::size_t range_end,
173 std::size_t rank) const {
174 return impl().minselect_impl(range_begin, range_end, rank);
175 }
176
183 std::size_t close(std::size_t open_position) const {
184 return impl().close_impl(open_position);
185 }
186
193 std::size_t open(std::size_t close_position) const {
194 return impl().open_impl(close_position);
195 }
196
203 std::size_t enclose(std::size_t open_position) const {
204 return impl().enclose_impl(open_position);
205 }
206
210 int bit(const size_t& position) const noexcept {
211 return impl().bit_impl(position);
212 }
213
214 private:
215 const Impl& impl() const { return static_cast<const Impl&>(*this); }
216};
217
218} // namespace pixie
CRTP facade for rank/select and range min-max tree operations.
Definition rmm.h:29
std::size_t rank0(std::size_t end_position) const
Count 0 bits in the prefix [0, end_position).
Definition rmm.h:51
std::size_t open(std::size_t close_position) const
Matching opening parenthesis for the parenthesis at close_position.
Definition rmm.h:193
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.h:122
std::size_t size() const
Number of bits in the represented sequence.
Definition rmm.h:39
std::size_t close(std::size_t open_position) const
Matching closing parenthesis for the parenthesis at open_position.
Definition rmm.h:183
std::size_t select0(std::size_t rank) const
Return the zero-based position of the rank-th 0 bit.
Definition rmm.h:67
std::size_t rank10(std::size_t end_position) const
Count "10" bit patterns fully contained in [0, end_position).
Definition rmm.h:77
std::size_t select1(std::size_t rank) const
Return the zero-based position of the rank-th 1 bit.
Definition rmm.h:59
int excess(std::size_t end_position) const
Prefix excess on [0, end_position): +1 for 1 bits, -1 for 0 bits.
Definition rmm.h:92
std::size_t rank1(std::size_t end_position) const
Count 1 bits in the prefix [0, end_position).
Definition rmm.h:44
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.h:153
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.h:143
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.h:171
int bit(const size_t &position) const noexcept
Read bit at position position (LSB-first across words).
Definition rmm.h:210
static constexpr std::size_t npos
Sentinel returned by position queries when no valid answer exists.
Definition rmm.h:34
std::size_t enclose(std::size_t open_position) const
Closest opening parenthesis strictly enclosing position.
Definition rmm.h:203
std::size_t fwdsearch(std::size_t start_position, int delta) const
Forward excess search from a prefix boundary.
Definition rmm.h:102
std::size_t select10(std::size_t rank) const
Return the zero-based start position of the rank-th "10" pattern.
Definition rmm.h:85
std::size_t bwdsearch(std::size_t start_position, int delta) const
Backward excess search from a prefix boundary.
Definition rmm.h:112
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.h:162
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.h:132