3#ifndef PIXIE_3STAR_SUPPORT
4#error "ThreeStarRankSelectSupport requires PIXIE_THIRD_PARTY_BACKENDS"
19#define printf(...) static_cast<void>(0)
23static void print_overhead_line(
const std::string&, int64_t) {}
25static void print_separator() {}
49 std::span<const std::uint64_t> source_words,
51 : num_bits_(std::min(num_bits, source_words.
size() * kWordBits)) {
52 const std::size_t source_word_count =
53 (num_bits_ + kWordBits - 1) / kWordBits;
54 const std::size_t padded_word_count =
55 ((source_word_count + kWordsPerSuperblock - 1) / kWordsPerSuperblock) *
57 const std::size_t stored_words =
58 padded_word_count + kSentinelSuperblocks * kWordsPerSuperblock;
62 N_words = padded_word_count;
63 bits.assign(stored_words, 0);
65 for (std::size_t word_index = 0; word_index < source_word_count;
67 const std::uint64_t word =
68 logical_word(source_words, word_index, num_bits_);
69 bits[word_index] = word;
70 one_count_ += std::popcount(word);
73 N_zeros = num_bits_ - one_count_;
79 TREE3_STRATEGY = GET_LIFTED_CUBIC_THEORY_PARAMS;
82 support_.build_auxiliaries();
84 source_copy_bytes_ = stored_words *
sizeof(std::uint64_t);
92 return (bits[position / kWordBits] >> (position % kWordBits)) & 1;
96 std::uint64_t
rank_impl(std::size_t end_position)
const {
97 return end_position >= num_bits_ ? one_count_
98 : support_.rank_1(end_position);
106 return rank > one_count_ ? num_bits_ : support_.select_1(
rank);
117 return occurrence == 0 ? 0 :
size();
122 return static_cast<std::size_t
>(support_.space_in_bits() / 8);
134 static constexpr std::size_t kWordBits = 64;
135 static constexpr std::size_t kWordsPerSuperblock = 1024;
136 static constexpr std::size_t kSentinelSuperblocks = 5;
138 static std::uint64_t logical_word(std::span<const std::uint64_t> source,
139 std::size_t word_index,
140 std::size_t num_bits) {
141 std::uint64_t word = source[word_index];
142 const std::size_t remaining = num_bits - word_index * kWordBits;
143 if (remaining < kWordBits) {
144 word &= (std::uint64_t{1} << remaining) - 1;
150 std::size_t num_bits_ = 0;
151 std::size_t one_count_ = 0;
152 std::size_t source_copy_bytes_ = 0;
CRTP facade for immutable rank/select queries and bit access.
Definition rank_select.h:32
std::size_t memory_usage_bytes() const
Definition rank_select.h:135
std::size_t size() const
Definition rank_select.h:39
std::uint64_t rank(std::size_t end_position) const
Definition rank_select.h:66
std::uint64_t select0_impl(std::size_t occurrence) const
Return zero for occurrence zero, otherwise size(): disabled.
Definition three_star.h:116
ThreeStarRankSelectSupport(std::span< const std::uint64_t > source_words, std::size_t num_bits)
Build the upstream uncompressed 3-star configuration.
Definition three_star.h:48
int bit_impl(std::size_t position) const
Read a source bit; position must be below size().
Definition three_star.h:91
std::uint64_t rank_impl(std::size_t end_position) const
Return the one rank in [0, end_position).
Definition three_star.h:96
std::size_t index_logical_bytes() const
Return upstream-reported logical metadata bytes.
Definition three_star.h:129
std::uint64_t select_impl(std::size_t rank) const
Return the zero-based position of a one-based one rank.
Definition three_star.h:102
bool supports_select0_impl() const
3-star's upstream zero-select implementation is incomplete.
Definition three_star.h:113
bool supports_select1_impl() const
3-star implements one-select, but not zero-select.
Definition three_star.h:110
std::size_t memory_usage_bytes_impl() const
Return upstream-reported logical bytes for source and metadata.
Definition three_star.h:121
std::size_t source_copy_bytes() const
Return logical bytes in 3-star's uncompressed source copy.
Definition three_star.h:126
std::size_t size_impl() const
Return the logical source length.
Definition three_star.h:88
Common interface for rank/select support over packed bit sequences.