23 static constexpr std::size_t
npos = std::numeric_limits<std::size_t>::max();
28 std::size_t
size()
const {
return impl().size_impl(); }
33 std::size_t
rank1(std::size_t end_position)
const {
34 return impl().rank1_impl(end_position);
40 std::size_t
rank0(std::size_t end_position)
const {
41 return impl().rank0_impl(end_position);
48 std::size_t
select1(std::size_t rank)
const {
49 return impl().select1_impl(rank);
56 std::size_t
select0(std::size_t rank)
const {
57 return impl().select0_impl(rank);
66 std::size_t
rank10(std::size_t end_position)
const {
67 return impl().rank10_impl(end_position);
75 return impl().select10_impl(rank);
81 int excess(std::size_t end_position)
const {
82 return impl().excess_impl(end_position);
91 std::size_t
fwdsearch(std::size_t start_position,
int delta)
const {
92 return impl().fwdsearch_impl(start_position, delta);
101 std::size_t
bwdsearch(std::size_t start_position,
int delta)
const {
102 return impl().bwdsearch_impl(start_position, delta);
112 std::size_t range_end)
const {
113 return impl().range_min_query_pos_impl(range_begin, range_end);
122 std::size_t range_end)
const {
123 return impl().range_min_query_val_impl(range_begin, range_end);
133 std::size_t range_end)
const {
134 return impl().range_max_query_pos_impl(range_begin, range_end);
143 std::size_t range_end)
const {
144 return impl().range_max_query_val_impl(range_begin, range_end);
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);
161 std::size_t range_end,
162 std::size_t rank)
const {
163 return impl().minselect_impl(range_begin, range_end, rank);
172 std::size_t
close(std::size_t open_position)
const {
173 return impl().close_impl(open_position);
182 std::size_t
open(std::size_t close_position)
const {
183 return impl().open_impl(close_position);
192 std::size_t
enclose(std::size_t open_position)
const {
193 return impl().enclose_impl(open_position);
199 int bit(
const size_t& position)
const noexcept {
200 return impl().bit_impl(position);
204 const Impl& impl()
const {
return static_cast<const Impl&
>(*this); }
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