#ifndef MARISA_ALPHA_MAPPER_H_ #define MARISA_ALPHA_MAPPER_H_ #include <cstdio> #include "base.h" namespace marisa_alpha { class Mapper { public: Mapper(); Mapper(const void *ptr, std::size_t size); ~Mapper(); void open(const char *filename, long offset = 0, int whence = SEEK_SET); template <typename T> void map(T *obj) { MARISA_ALPHA_THROW_IF(obj == NULL, MARISA_ALPHA_PARAM_ERROR); *obj = *static_cast<const T *>(map_data(sizeof(T))); } template <typename T> void map(const T **objs, std::size_t num_objs) { MARISA_ALPHA_THROW_IF((objs == NULL) && (num_objs != 0), MARISA_ALPHA_PARAM_ERROR); MARISA_ALPHA_THROW_IF(num_objs > (MARISA_ALPHA_UINT32_MAX / sizeof(T)), MARISA_ALPHA_SIZE_ERROR); *objs = static_cast<const T *>(map_data(sizeof(T) * num_objs)); } bool is_open() const { return ptr_ != NULL; } void clear(); void swap(Mapper *rhs); private: const void *ptr_; void *origin_; std::size_t avail_; std::size_t size_; #if defined _WIN32 || defined _WIN64 void *file_; void *map_; #else // defined _WIN32 || defined _WIN64 int fd_; #endif // defined _WIN32 || defined _WIN64 void seek(long offset, int whence); const void *map_data(std::size_t size); // Disallows copy and assignment. Mapper(const Mapper &); Mapper &operator=(const Mapper &); }; } // namespace marisa_alpha #endif // MARISA_ALPHA_MAPPER_H_