1b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#ifndef MARISA_ALPHA_TAIL_H_
2b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#define MARISA_ALPHA_TAIL_H_
3b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
4b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "marisa-string.h"
5b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "vector.h"
6b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
7b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaknamespace marisa_alpha {
8b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
9b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass Tail {
10b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak public:
11b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Tail();
12b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
13b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void build(const Vector<String> &keys,
14b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      Vector<UInt32> *offsets, int mode);
15b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
16b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void mmap(Mapper *mapper, const char *filename,
17b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      long offset = 0, int whence = SEEK_SET);
18b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void map(const void *ptr, std::size_t size);
19b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void map(Mapper &mapper);
20b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
21b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void load(const char *filename,
22b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      long offset = 0, int whence = SEEK_SET);
23b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void fread(::FILE *file);
24b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void read(int fd);
25b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void read(std::istream &stream);
26b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void read(Reader &reader);
27b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
28b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void save(const char *filename, bool trunc_flag = true,
29b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      long offset = 0, int whence = SEEK_SET) const;
30b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void fwrite(::FILE *file) const;
31b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void write(int fd) const;
32b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void write(std::ostream &stream) const;
33b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void write(Writer &writer) const;
34b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
35b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  const UInt8 *operator[](std::size_t offset) const {
36b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    MARISA_ALPHA_DEBUG_IF(offset >= buf_.size(), MARISA_ALPHA_PARAM_ERROR);
37b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return &buf_[offset];
38b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
39b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
40b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  int mode() const {
41b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return (buf_.front() == '\0') ?
42b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak        MARISA_ALPHA_BINARY_TAIL : MARISA_ALPHA_TEXT_TAIL;
43b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
44b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  bool empty() const {
45b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return buf_.empty();
46b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
47b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  std::size_t size() const {
48b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return buf_.size();
49b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
50b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  std::size_t total_size() const {
51b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak    return buf_.total_size();
52b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  }
53b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
54b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void clear();
55b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void swap(Tail *rhs);
56b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
57b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak private:
58b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Vector<UInt8> buf_;
59b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
60b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void build_binary_tail(const Vector<String> &keys,
61b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      Vector<UInt32> *offsets);
62b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  bool build_text_tail(const Vector<String> &keys,
63b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak      Vector<UInt32> *offsets);
64b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  void build_empty_tail(Vector<UInt32> *offsets);
65b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
66b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  // Disallows copy and assignment.
67b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Tail(const Tail &);
68b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak  Tail &operator=(const Tail &);
69b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak};
70b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
71b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak}  // namespace marisa_alpha
72b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak
73b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#endif  // MARISA_ALPHA_TAIL_H_
74