1 #ifndef MARISA_GRIMOIRE_TRIE_TAIL_H_
2 #define MARISA_GRIMOIRE_TRIE_TAIL_H_
3 
4 #include "marisa/agent.h"
5 #include "marisa/grimoire/vector.h"
6 #include "marisa/grimoire/trie/entry.h"
7 
8 namespace marisa {
9 namespace grimoire {
10 namespace trie {
11 
12 class Tail {
13  public:
14   Tail();
15 
16   void build(Vector<Entry> &entries, Vector<UInt32> *offsets,
17       TailMode mode);
18 
19   void map(Mapper &mapper);
20   void read(Reader &reader);
21   void write(Writer &writer) const;
22 
23   void restore(Agent &agent, std::size_t offset) const;
24   bool match(Agent &agent, std::size_t offset) const;
25   bool prefix_match(Agent &agent, std::size_t offset) const;
26 
27   const char &operator[](std::size_t offset) const {
28     MARISA_DEBUG_IF(offset >= buf_.size(), MARISA_BOUND_ERROR);
29     return buf_[offset];
30   }
31 
mode()32   TailMode mode() const {
33     return end_flags_.empty() ? MARISA_TEXT_TAIL : MARISA_BINARY_TAIL;
34   }
35 
empty()36   bool empty() const {
37     return buf_.empty();
38   }
size()39   std::size_t size() const {
40     return buf_.size();
41   }
total_size()42   std::size_t total_size() const {
43     return buf_.total_size() + end_flags_.total_size();
44   }
io_size()45   std::size_t io_size() const {
46     return buf_.io_size() + end_flags_.io_size();
47   }
48 
49   void clear();
50   void swap(Tail &rhs);
51 
52  private:
53   Vector<char> buf_;
54   BitVector end_flags_;
55 
56   void build_(Vector<Entry> &entries, Vector<UInt32> *offsets,
57       TailMode mode);
58 
59   void map_(Mapper &mapper);
60   void read_(Reader &reader);
61   void write_(Writer &writer) const;
62 
63   // Disallows copy and assignment.
64   Tail(const Tail &);
65   Tail &operator=(const Tail &);
66 };
67 
68 }  // namespace trie
69 }  // namespace grimoire
70 }  // namespace marisa
71 
72 #endif  // MARISA_GRIMOIRE_TRIE_TAIL_H_
73