Blame view

tools/openfst-1.6.7/include/fst/mapped-file.h 2.6 KB
8dcb6dfcb   Yannick Estève   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  // See www.openfst.org for extensive documentation on this weighted
  // finite-state transducer library.
  
  #ifndef FST_MAPPED_FILE_H_
  #define FST_MAPPED_FILE_H_
  
  #include <cstddef>
  #include <istream>
  #include <string>
  
  #include <fst/compat.h>
  #include <fst/flags.h>
  
  namespace fst {
  
  // A memory region is a simple abstraction for allocated memory or data from
  // memory-mapped files. If mmap is null, then data represents an owned region
  // of size bytes. Otherwise, mmap and size refer to the mapping and data is a
  // casted pointer to a region contained within [mmap, mmap + size). If size is
  // 0, then mmap and data refer to a block of memory managed externally by some
  // other allocator. The offset is used when allocating memory to providing
  // padding for alignment.
  struct MemoryRegion {
    void *data;
    void *mmap;
    size_t size;
    int offset;
  };
  
  class MappedFile {
   public:
    ~MappedFile();
  
    void *mutable_data() const { return region_.data; }
  
    const void *data() const { return region_.data; }
  
    // Returns a MappedFile object that contains the contents of the input stream
    // strm starting from the current file position with size bytes. The memorymap
    // bool is advisory, and Map will default to allocating and reading. The
    // source argument needs to contain the filename that was used to open the
    // input stream.
    static MappedFile *Map(std::istream *istrm, bool memorymap,
                           const string &source, size_t size);
  
    // Creates a MappedFile object with a new[]'ed block of memory of size. The
    // align argument can be used to specify a desired block alignment.
    // This is RECOMMENDED FOR INTERNAL USE ONLY as it may change in future
    // releases.
    static MappedFile *Allocate(size_t size, int align = kArchAlignment);
  
    // Creates a MappedFile object pointing to a borrowed reference to data. This
    // block of memory is not owned by the MappedFile object and will not be
    // freed. This is RECOMMENDED FOR INTERNAL USE ONLY, may change in future
    // releases.
    static MappedFile *Borrow(void *data);
  
    // Alignment required for mapping structures in bytes. Regions of memory that
    // are not aligned upon a 128-bit boundary are read from the file instead.
    // This is consistent with the alignment boundary set in ConstFst and
    // CompactFst.
    static constexpr int kArchAlignment = 16;
  
    static constexpr size_t kMaxReadChunk = 256 * 1024 * 1024;  // 256 MB.
  
   private:
    explicit MappedFile(const MemoryRegion &region);
  
    MemoryRegion region_;
    MappedFile(const MappedFile &) = delete;
    MappedFile &operator=(const MappedFile &) = delete;
  };
  }  // namespace fst
  
  #endif  // FST_MAPPED_FILE_H_