xref: /aosp_15_r20/external/marisa-trie/lib/marisa/grimoire/io/mapper.h (revision ab8db090fce404b23716c4c9194221ee27efe31c)
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