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