3#ifndef PIXIE_PASTA_SUPPORT
4#error "PastaRankSelectSupport requires PIXIE_THIRD_PARTY_BACKENDS"
13#include <pasta/bit_vector/bit_vector.hpp>
14#include <pasta/bit_vector/support/flat_rank.hpp>
15#include <pasta/bit_vector/support/flat_rank_select.hpp>
16#include <pasta/bit_vector/support/l12_type.hpp>
32 using PastaSupport = pasta::FlatRankSelect<>;
34 static uint64_t logical_word(std::span<const uint64_t> source,
35 std::size_t word_index,
36 std::size_t num_bits) {
37 uint64_t word = source[word_index];
38 const std::size_t remaining = num_bits - word_index * 64;
40 word &= (uint64_t{1} << remaining) - 1;
45 pasta::BitVector bits_;
46 PastaSupport support_;
47 std::size_t num_bits_ = 0;
48 std::size_t max_rank_ = 0;
58 : bits_(std::min(num_bits, source_words.
size() * 64)),
59 num_bits_(std::min(num_bits, source_words.
size() * 64)) {
60 std::fill(bits_.data().begin(), bits_.data().end(), 0);
61 const std::size_t word_count = (num_bits_ + 63) / 64;
62 for (std::size_t word_index = 0; word_index < word_count; ++word_index) {
63 bits_.data()[word_index] =
64 logical_word(source_words, word_index, num_bits_);
66 support_ = PastaSupport(bits_);
67 max_rank_ = num_bits_ == 0 ? 0 : support_.rank1(num_bits_);
75 return static_cast<bool>(bits_[position]);
79 uint64_t
rank_impl(std::size_t end_position)
const {
80 return end_position >= num_bits_ ? max_rank_ : support_.rank1(end_position);
88 return rank > max_rank_ ? num_bits_ : support_.select1(
rank);
96 return rank > num_bits_ - max_rank_ ? num_bits_ : support_.select0(
rank);
112 (
sizeof(*this) -
sizeof(bits_) -
sizeof(support_));
117 return bits_.space_usage() -
sizeof(pasta::BitVector);
125 const std::size_t l12_entries =
126 bits_.data().size() / pasta::FlatRankSelectConfig::L1_WORD_SIZE + 1;
127 return (support_.space_usage() -
sizeof(PastaSupport)) +
128 l12_entries *
sizeof(pasta::BigL12Type);
std::size_t source_copy_bytes() const
Return bytes in Pasta's owned normalized source copy.
Definition pasta.h:116
std::size_t memory_usage_bytes_impl() const
Return bytes owned by the converted source and Pasta metadata.
Definition pasta.h:110
uint64_t rank_impl(std::size_t end_position) const
Return the one rank in [0, end_position).
Definition pasta.h:79
bool supports_select1_impl() const
Pasta constructs support for one selects unconditionally.
Definition pasta.h:100
bool supports_select0_impl() const
Pasta constructs support for zero selects unconditionally.
Definition pasta.h:103
int bit_impl(std::size_t position) const
Return the bit at a zero-based valid position.
Definition pasta.h:74
uint64_t select0_impl(std::size_t rank) const
Return the zero-based position of a one-based zero rank.
Definition pasta.h:92
std::size_t index_logical_bytes() const
Return Pasta's logical index bytes, excluding its owned source.
Definition pasta.h:124
PastaRankSelectSupport(std::span< const uint64_t > source_words, std::size_t num_bits)
Construct an owning Pasta index from caller-provided packed words.
Definition pasta.h:56
uint64_t select_impl(std::size_t rank) const
Return the zero-based position of a one-based one rank.
Definition pasta.h:84
std::size_t size_impl() const
Return the number of valid source bits.
Definition pasta.h:71
CRTP facade for immutable rank/select queries and bit access.
Definition rank_select.h:32
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
Common interface for rank/select support over packed bit sequences.