18 #ifndef FST_EXTENSIONS_NGRAM_BITMAP_INDEX_H_ 19 #define FST_EXTENSIONS_NGRAM_BITMAP_INDEX_H_ 103 bool enable_select_0_index =
false,
104 bool enable_select_1_index =
false) {
105 BuildIndex(bits, num_bits, enable_select_0_index, enable_select_1_index);
108 bool Get(
size_t index)
const {
return Get(bits_, index); }
110 static bool Get(
const uint64_t* bits,
size_t index) {
112 (
kOne << (index & kStorageBlockMask))) != 0;
115 static void Set(uint64_t* bits,
size_t index) {
119 static void Clear(uint64_t* bits,
size_t index) {
123 size_t Bits()
const {
return num_bits_; }
132 return (rank_index_.size() *
sizeof(rank_index_[0]) +
133 select_0_index_.size() *
sizeof(select_0_index_[0]) +
134 select_1_index_.size() *
sizeof(select_1_index_[0]));
140 return rank_index_.back().absolute_ones_count();
145 size_t Rank1(
size_t end)
const;
174 size_t Select1(
size_t bit_index)
const;
178 size_t Select0(
size_t bit_index)
const;
182 std::pair<size_t, size_t>
Select0s(
size_t bit_index)
const;
187 void BuildIndex(
const uint64_t* bits,
size_t num_bits,
188 bool enable_select_0_index =
false,
189 bool enable_select_1_index =
false);
191 static constexpr uint64_t
kOne = 1;
196 static constexpr uint32_t kUnitsPerRankIndexEntry = 8;
197 static constexpr uint32_t kBitsPerRankIndexEntry =
199 static constexpr uint32_t kStorageBlockMask = kStorageBitSize - 1;
204 static constexpr uint32_t kBitsPerSelect0Block = 512;
205 static constexpr uint32_t kBitsPerSelect1Block = 512;
215 static constexpr uint32_t kMaxLinearSearchBlocks = 8;
224 class RankIndexEntry {
227 : absolute_ones_count_(0),
228 relative_ones_count_1_(0),
229 relative_ones_count_2_(0),
230 relative_ones_count_3_(0),
231 relative_ones_count_4_(0),
232 relative_ones_count_5_(0),
233 relative_ones_count_6_(0),
234 relative_ones_count_7_(0) {}
236 uint32_t absolute_ones_count()
const {
return absolute_ones_count_; }
237 uint32_t relative_ones_count_1()
const {
return relative_ones_count_1_; }
238 uint32_t relative_ones_count_2()
const {
return relative_ones_count_2_; }
239 uint32_t relative_ones_count_3()
const {
return relative_ones_count_3_; }
240 uint32_t relative_ones_count_4()
const {
return relative_ones_count_4_; }
241 uint32_t relative_ones_count_5()
const {
return relative_ones_count_5_; }
242 uint32_t relative_ones_count_6()
const {
return relative_ones_count_6_; }
243 uint32_t relative_ones_count_7()
const {
return relative_ones_count_7_; }
245 void set_absolute_ones_count(uint32_t v) { absolute_ones_count_ = v; }
246 void set_relative_ones_count_1(uint32_t v) {
248 relative_ones_count_1_ = v;
250 void set_relative_ones_count_2(uint32_t v) {
252 relative_ones_count_2_ = v;
254 void set_relative_ones_count_3(uint32_t v) {
256 relative_ones_count_3_ = v;
258 void set_relative_ones_count_4(uint32_t v) {
260 relative_ones_count_4_ = v;
262 void set_relative_ones_count_5(uint32_t v) {
264 relative_ones_count_5_ = v;
266 void set_relative_ones_count_6(uint32_t v) {
268 relative_ones_count_6_ = v;
270 void set_relative_ones_count_7(uint32_t v) {
272 relative_ones_count_7_ = v;
278 uint32_t absolute_ones_count_;
293 unsigned int relative_ones_count_1_ : 7;
294 unsigned int relative_ones_count_2_ : 8;
295 unsigned int relative_ones_count_3_ : 8;
296 unsigned int relative_ones_count_4_ : 9;
297 unsigned int relative_ones_count_5_ : 9;
298 unsigned int relative_ones_count_6_ : 9;
299 unsigned int relative_ones_count_7_ : 9;
301 static_assert(
sizeof(RankIndexEntry) == 4 + 8,
302 "RankIndexEntry should be 12 bytes.");
305 uint32_t GetIndexOnesCount(
size_t array_index)
const;
309 const RankIndexEntry& FindRankIndexEntry(
size_t bit_index)
const;
313 const RankIndexEntry& FindInvertedRankIndexEntry(
size_t bit_index)
const;
317 size_t rank_index_size()
const {
318 return (
ArraySize() + kUnitsPerRankIndexEntry - 1) /
319 kUnitsPerRankIndexEntry +
323 const uint64_t* bits_ =
nullptr;
324 size_t num_bits_ = 0;
326 std::vector<RankIndexEntry> rank_index_;
333 std::vector<uint32_t> select_0_index_;
340 std::vector<uint32_t> select_1_index_;
345 #endif // FST_EXTENSIONS_NGRAM_BITMAP_INDEX_H_
BitmapIndex & operator=(BitmapIndex &&)=default
static void Clear(uint64_t *bits, size_t index)
static constexpr uint32_t kStorageBitSize
static void Set(uint64_t *bits, size_t index)
void BuildIndex(const uint64_t *bits, size_t num_bits, bool enable_select_0_index=false, bool enable_select_1_index=false)
size_t Select1(size_t bit_index) const
static constexpr uint64_t kOne
BitmapIndex(const uint64_t *bits, std::size_t num_bits, bool enable_select_0_index=false, bool enable_select_1_index=false)
size_t Rank1(size_t end) const
size_t Select0(size_t bit_index) const
size_t GetOnesCount() const
static size_t StorageSize(size_t num_bits)
size_t ArrayBytes() const
size_t GetZeroesCountInRange(size_t start, size_t end) const
bool TestRange(size_t start, size_t end) const
bool Get(size_t index) const
size_t GetOnesCountInRange(size_t start, size_t end) const
std::pair< size_t, size_t > Select0s(size_t bit_index) const
static bool Get(const uint64_t *bits, size_t index)
size_t IndexBytes() const
size_t Rank0(size_t end) const
static constexpr uint32_t kStorageLogBitSize