1 #ifndef MARISA_GRIMOIRE_IO_MAPPER_H_ 2 #define MARISA_GRIMOIRE_IO_MAPPER_H_ 3 4 #include <cstdio> 5 6 #include "marisa/base.h" 7 8 namespace marisa { 9 namespace grimoire { 10 namespace io { 11 12 class Mapper { 13 public: 14 Mapper(); 15 ~Mapper(); 16 17 void open(const char *filename); 18 void open(const void *ptr, std::size_t size); 19 20 template <typename T> map(T * obj)21 void map(T *obj) { 22 MARISA_THROW_IF(obj == NULL, MARISA_NULL_ERROR); 23 *obj = *static_cast<const T *>(map_data(sizeof(T))); 24 } 25 26 template <typename T> map(const T ** objs,std::size_t num_objs)27 void map(const T **objs, std::size_t num_objs) { 28 MARISA_THROW_IF((objs == NULL) && (num_objs != 0), MARISA_NULL_ERROR); 29 MARISA_THROW_IF(num_objs > (MARISA_SIZE_MAX / sizeof(T)), 30 MARISA_SIZE_ERROR); 31 *objs = static_cast<const T *>(map_data(sizeof(T) * num_objs)); 32 } 33 34 void seek(std::size_t size); 35 36 bool is_open() const; 37 38 void clear(); 39 void swap(Mapper &rhs); 40 41 private: 42 const void *ptr_; 43 void *origin_; 44 std::size_t avail_; 45 std::size_t size_; 46 #if (defined _WIN32) || (defined _WIN64) 47 void *file_; 48 void *map_; 49 #else // (defined _WIN32) || (defined _WIN64) 50 int fd_; 51 #endif // (defined _WIN32) || (defined _WIN64) 52 53 void open_(const char *filename); 54 void open_(const void *ptr, std::size_t size); 55 56 const void *map_data(std::size_t size); 57 58 // Disallows copy and assignment. 59 Mapper(const Mapper &); 60 Mapper &operator=(const Mapper &); 61 }; 62 63 } // namespace io 64 } // namespace grimoire 65 } // namespace marisa 66 67 #endif // MARISA_GRIMOIRE_IO_MAPPER_H_ 68