Pixie
Loading...
Searching...
No Matches
pasta.h
1#pragma once
2
3#ifndef PIXIE_PASTA_SUPPORT
4#error "PastaRankSelectSupport requires PIXIE_THIRD_PARTY_BACKENDS"
5#endif
6
7#include <pixie/rank_select.h>
8
9#include <algorithm>
10#include <bit>
11#include <cstddef>
12#include <cstdint>
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>
17#include <span>
18
19namespace pixie {
20
30class PastaRankSelectSupport : public RankSelectBase<PastaRankSelectSupport> {
31 private:
32 using PastaSupport = pasta::FlatRankSelect<>;
33
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;
39 if (remaining < 64) {
40 word &= (uint64_t{1} << remaining) - 1;
41 }
42 return word;
43 }
44
45 pasta::BitVector bits_;
46 PastaSupport support_;
47 std::size_t num_bits_ = 0;
48 std::size_t max_rank_ = 0;
49
50 public:
56 explicit PastaRankSelectSupport(std::span<const uint64_t> source_words,
57 std::size_t num_bits)
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_);
65 }
66 support_ = PastaSupport(bits_);
67 max_rank_ = num_bits_ == 0 ? 0 : support_.rank1(num_bits_);
68 }
69
71 std::size_t size_impl() const { return num_bits_; }
72
74 int bit_impl(std::size_t position) const {
75 return static_cast<bool>(bits_[position]);
76 }
77
79 uint64_t rank_impl(std::size_t end_position) const {
80 return end_position >= num_bits_ ? max_rank_ : support_.rank1(end_position);
81 }
82
84 uint64_t select_impl(std::size_t rank) const {
85 if (rank == 0) {
86 return 0;
87 }
88 return rank > max_rank_ ? num_bits_ : support_.select1(rank);
89 }
90
92 uint64_t select0_impl(std::size_t rank) const {
93 if (rank == 0) {
94 return 0;
95 }
96 return rank > num_bits_ - max_rank_ ? num_bits_ : support_.select0(rank);
97 }
98
100 bool supports_select1_impl() const { return true; }
101
103 bool supports_select0_impl() const { return true; }
104
110 std::size_t memory_usage_bytes_impl() const {
112 (sizeof(*this) - sizeof(bits_) - sizeof(support_));
113 }
114
116 std::size_t source_copy_bytes() const {
117 return bits_.space_usage() - sizeof(pasta::BitVector);
118 }
119
124 std::size_t index_logical_bytes() const {
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);
129 }
130};
131
132} // namespace pixie
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.