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