34 static constexpr std::size_t
npos = std::numeric_limits<std::size_t>::max();
39 std::size_t
size()
const {
return impl().size_impl(); }
44 std::size_t
rank1(std::size_t end_position)
const {
45 return impl().rank1_impl(end_position);
51 std::size_t
rank0(std::size_t end_position)
const {
52 return impl().rank0_impl(end_position);
59 std::size_t
select1(std::size_t rank)
const {
60 return impl().select1_impl(rank);
67 std::size_t
select0(std::size_t rank)
const {
68 return impl().select0_impl(rank);
77 std::size_t
rank10(std::size_t end_position)
const {
78 return impl().rank10_impl(end_position);
86 return impl().select10_impl(rank);
92 int excess(std::size_t end_position)
const {
93 return impl().excess_impl(end_position);
102 std::size_t
fwdsearch(std::size_t start_position,
int delta)
const {
103 return impl().fwdsearch_impl(start_position, delta);
112 std::size_t
bwdsearch(std::size_t start_position,
int delta)
const {
113 return impl().bwdsearch_impl(start_position, delta);
123 std::size_t range_end)
const {
124 return impl().range_min_query_pos_impl(range_begin, range_end);
133 std::size_t range_end)
const {
134 return impl().range_min_query_val_impl(range_begin, range_end);
144 std::size_t range_end)
const {
145 return impl().range_max_query_pos_impl(range_begin, range_end);
154 std::size_t range_end)
const {
155 return impl().range_max_query_val_impl(range_begin, range_end);
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);
172 std::size_t range_end,
173 std::size_t rank)
const {
174 return impl().minselect_impl(range_begin, range_end, rank);
183 std::size_t
close(std::size_t open_position)
const {
184 return impl().close_impl(open_position);
193 std::size_t
open(std::size_t close_position)
const {
194 return impl().open_impl(close_position);
203 std::size_t
enclose(std::size_t open_position)
const {
204 return impl().enclose_impl(open_position);
210 int bit(
const size_t& position)
const noexcept {
211 return impl().bit_impl(position);
215 const Impl& impl()
const {
return static_cast<const Impl&
>(*this); }
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