blob: dd24f3ef81f25b47afd4a2566b0899ec1b42710e [file] [log] [blame]
#ifndef MARISA_GRIMOIRE_TRIE_TAIL_H_
#define MARISA_GRIMOIRE_TRIE_TAIL_H_
#include "marisa/agent.h"
#include "marisa/grimoire/vector.h"
#include "marisa/grimoire/trie/entry.h"
namespace marisa {
namespace grimoire {
namespace trie {
class Tail {
public:
Tail();
void build(Vector<Entry> &entries, Vector<UInt32> *offsets,
TailMode mode);
void map(Mapper &mapper);
void read(Reader &reader);
void write(Writer &writer) const;
void restore(Agent &agent, std::size_t offset) const;
bool match(Agent &agent, std::size_t offset) const;
bool prefix_match(Agent &agent, std::size_t offset) const;
const char &operator[](std::size_t offset) const {
MARISA_DEBUG_IF(offset >= buf_.size(), MARISA_BOUND_ERROR);
return buf_[offset];
}
TailMode mode() const {
return end_flags_.empty() ? MARISA_TEXT_TAIL : MARISA_BINARY_TAIL;
}
bool empty() const {
return buf_.empty();
}
std::size_t size() const {
return buf_.size();
}
std::size_t total_size() const {
return buf_.total_size() + end_flags_.total_size();
}
std::size_t io_size() const {
return buf_.io_size() + end_flags_.io_size();
}
void clear();
void swap(Tail &rhs);
private:
Vector<char> buf_;
BitVector end_flags_;
void build_(Vector<Entry> &entries, Vector<UInt32> *offsets,
TailMode mode);
void map_(Mapper &mapper);
void read_(Reader &reader);
void write_(Writer &writer) const;
// Disallows copy and assignment.
Tail(const Tail &);
Tail &operator=(const Tail &);
};
} // namespace trie
} // namespace grimoire
} // namespace marisa
#endif // MARISA_GRIMOIRE_TRIE_TAIL_H_