Home | History | Annotate | Download | only in marisa_alpha
      1 #ifndef MARISA_ALPHA_BITVECTOR_H_
      2 #define MARISA_ALPHA_BITVECTOR_H_
      3 
      4 #include "rank.h"
      5 #include "vector.h"
      6 
      7 namespace marisa_alpha {
      8 
      9 class BitVector {
     10  public:
     11   BitVector();
     12 
     13   void build();
     14 
     15   void clear_select0s() {
     16     select0s_.clear();
     17   }
     18   void clear_select1s() {
     19     select1s_.clear();
     20   }
     21 
     22   void mmap(Mapper *mapper, const char *filename,
     23       long offset = 0, int whence = SEEK_SET);
     24   void map(const void *ptr, std::size_t size);
     25   void map(Mapper &mapper);
     26 
     27   void load(const char *filename,
     28       long offset = 0, int whence = SEEK_SET);
     29   void fread(std::FILE *file);
     30   void read(int fd);
     31   void read(std::istream &stream);
     32   void read(Reader &reader);
     33 
     34   void save(const char *filename, bool trunc_flag = true,
     35       long offset = 0, int whence = SEEK_SET) const;
     36   void fwrite(std::FILE *file) const;
     37   void write(int fd) const;
     38   void write(std::ostream &stream) const;
     39   void write(Writer &writer) const;
     40 
     41   void push_back(bool bit) {
     42     MARISA_ALPHA_THROW_IF(size_ == max_size(), MARISA_ALPHA_SIZE_ERROR);
     43     if ((size_ % 32) == 0) {
     44       blocks_.push_back(0);
     45     }
     46     if (bit) {
     47       blocks_.back() |= 1U << (size_ % 32);
     48     }
     49     ++size_;
     50   }
     51 
     52   bool operator[](std::size_t i) const {
     53     MARISA_ALPHA_DEBUG_IF(i >= size_, MARISA_ALPHA_PARAM_ERROR);
     54     return (blocks_[i / 32] & (1U << (i % 32))) != 0;
     55   }
     56 
     57   UInt32 rank0(UInt32 i) const {
     58     MARISA_ALPHA_DEBUG_IF(i > size_, MARISA_ALPHA_PARAM_ERROR);
     59     return i - rank1(i);
     60   }
     61   UInt32 rank1(UInt32 i) const;
     62 
     63   UInt32 select0(UInt32 i) const;
     64   UInt32 select1(UInt32 i) const;
     65 
     66   std::size_t size() const {
     67     return size_;
     68   }
     69   bool empty() const {
     70     return blocks_.empty();
     71   }
     72   std::size_t max_size() const {
     73     return MARISA_ALPHA_UINT32_MAX;
     74   }
     75   std::size_t total_size() const {
     76     return blocks_.total_size() + sizeof(size_) + ranks_.total_size()
     77         + select0s_.total_size() + select1s_.total_size();
     78   }
     79 
     80   void clear();
     81   void swap(BitVector *rhs);
     82 
     83  private:
     84   Vector<UInt32> blocks_;
     85   UInt32 size_;
     86   Vector<Rank> ranks_;
     87   Vector<UInt32> select0s_;
     88   Vector<UInt32> select1s_;
     89 
     90   // Disallows copy and assignment.
     91   BitVector(const BitVector &);
     92   BitVector &operator=(const BitVector &);
     93 };
     94 
     95 }  // namespace marisa_alpha
     96 
     97 #endif  // MARISA_ALPHA_BITVECTOR_H_
     98