1 #ifndef MARISA_GRIMOIRE_TRIE_HEADER_H_
2 #define MARISA_GRIMOIRE_TRIE_HEADER_H_
3 
4 #include "marisa/grimoire/io.h"
5 
6 namespace marisa {
7 namespace grimoire {
8 namespace trie {
9 
10 class Header {
11  public:
12   enum {
13     HEADER_SIZE = 16
14   };
15 
Header()16   Header() {}
17 
map(Mapper & mapper)18   void map(Mapper &mapper) {
19     const char *ptr;
20     mapper.map(&ptr, HEADER_SIZE);
21     MARISA_THROW_IF(!test_header(ptr), MARISA_FORMAT_ERROR);
22   }
read(Reader & reader)23   void read(Reader &reader) {
24     char buf[HEADER_SIZE];
25     reader.read(buf, HEADER_SIZE);
26     MARISA_THROW_IF(!test_header(buf), MARISA_FORMAT_ERROR);
27   }
write(Writer & writer)28   void write(Writer &writer) const {
29     writer.write(get_header(), HEADER_SIZE);
30   }
31 
io_size()32   std::size_t io_size() const {
33     return HEADER_SIZE;
34   }
35 
36  private:
37 
get_header()38   static const char *get_header() {
39     static const char buf[HEADER_SIZE] = "We love Marisa.";
40     return buf;
41   }
42 
test_header(const char * ptr)43   static bool test_header(const char *ptr) {
44     for (std::size_t i = 0; i < HEADER_SIZE; ++i) {
45       if (ptr[i] != get_header()[i]) {
46         return false;
47       }
48     }
49     return true;
50   }
51 
52   // Disallows copy and assignment.
53   Header(const Header &);
54   Header &operator=(const Header &);
55 };
56 
57 }  // namespace trie
58 }  // namespace marisa
59 }  // namespace grimoire
60 
61 #endif  // MARISA_GRIMOIRE_TRIE_HEADER_H_
62