97 lines
2.2 KiB
C++
97 lines
2.2 KiB
C++
#ifndef MARISA_BITVECTOR_H_
|
|
#define MARISA_BITVECTOR_H_
|
|
|
|
#include "rank.h"
|
|
#include "vector.h"
|
|
|
|
namespace marisa {
|
|
|
|
class BitVector {
|
|
public:
|
|
BitVector();
|
|
|
|
void build();
|
|
|
|
void clear_select0s() {
|
|
select0s_.clear();
|
|
}
|
|
void clear_select1s() {
|
|
select1s_.clear();
|
|
}
|
|
|
|
void mmap(Mapper *mapper, const char *filename,
|
|
long offset = 0, int whence = SEEK_SET);
|
|
void map(const void *ptr, std::size_t size);
|
|
void map(Mapper &mapper);
|
|
|
|
void load(const char *filename,
|
|
long offset = 0, int whence = SEEK_SET);
|
|
void fread(std::FILE *file);
|
|
void read(int fd);
|
|
void read(std::istream &stream);
|
|
void read(Reader &reader);
|
|
|
|
void save(const char *filename, bool trunc_flag = true,
|
|
long offset = 0, int whence = SEEK_SET) const;
|
|
void fwrite(std::FILE *file) const;
|
|
void write(int fd) const;
|
|
void write(std::ostream &stream) const;
|
|
void write(Writer &writer) const;
|
|
|
|
void push_back(bool bit) {
|
|
MARISA_THROW_IF(size_ == max_size(), MARISA_SIZE_ERROR);
|
|
if ((size_ % 32) == 0) {
|
|
blocks_.push_back(0);
|
|
}
|
|
if (bit) {
|
|
blocks_.back() |= 1U << (size_ % 32);
|
|
}
|
|
++size_;
|
|
}
|
|
|
|
bool operator[](std::size_t i) const {
|
|
MARISA_DEBUG_IF(i >= size_, MARISA_PARAM_ERROR);
|
|
return (blocks_[i / 32] & (1U << (i % 32))) != 0;
|
|
}
|
|
|
|
UInt32 rank0(UInt32 i) const {
|
|
MARISA_DEBUG_IF(i > size_, MARISA_PARAM_ERROR);
|
|
return i - rank1(i);
|
|
}
|
|
UInt32 rank1(UInt32 i) const;
|
|
|
|
UInt32 select0(UInt32 i) const;
|
|
UInt32 select1(UInt32 i) const;
|
|
|
|
std::size_t size() const {
|
|
return size_;
|
|
}
|
|
bool empty() const {
|
|
return blocks_.empty();
|
|
}
|
|
std::size_t max_size() const {
|
|
return MARISA_UINT32_MAX;
|
|
}
|
|
std::size_t total_size() const {
|
|
return blocks_.total_size() + sizeof(size_) + ranks_.total_size()
|
|
+ select0s_.total_size() + select1s_.total_size();
|
|
}
|
|
|
|
void clear();
|
|
void swap(BitVector *rhs);
|
|
|
|
private:
|
|
Vector<UInt32> blocks_;
|
|
UInt32 size_;
|
|
Vector<Rank> ranks_;
|
|
Vector<UInt32> select0s_;
|
|
Vector<UInt32> select1s_;
|
|
|
|
// Disallows copy and assignment.
|
|
BitVector(const BitVector &);
|
|
BitVector &operator=(const BitVector &);
|
|
};
|
|
|
|
} // namespace marisa
|
|
|
|
#endif // MARISA_BITVECTOR_H_
|