| |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // Copyright 2005-2010 Google, Inc. |
| // Author: sorenj@google.com (Jeffrey Sorensen) |
| |
| #ifndef FST_LIB_MAPPED_FILE_H_ |
| #define FST_LIB_MAPPED_FILE_H_ |
| |
| #include <unistd.h> |
| #include <sys/mman.h> |
| |
| #include <fst/fst.h> |
| #include <iostream> |
| #include <fstream> |
| #include <sstream> |
| |
| DECLARE_int32(fst_arch_alignment); // defined in mapped-file.h |
| |
| namespace fst { |
| |
| // A memory region is a simple abstraction for allocated memory or data from |
| // mmap'ed files. If mmap equals 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 refers and data refer to a block of memory managed |
| // externally by some other allocator. |
| struct MemoryRegion { |
| void *data; |
| void *mmap; |
| size_t size; |
| }; |
| |
| class MappedFile { |
| public: |
| virtual ~MappedFile(); |
| |
| void* mutable_data() const { |
| return reinterpret_cast<void*>(region_.data); |
| } |
| |
| const void* data() const { |
| return reinterpret_cast<void*>(region_.data); |
| } |
| |
| // Returns a MappedFile object that contains the contents of the input |
| // stream s starting from the current file position with size bytes. |
| // The file name must also be provided in the FstReadOptions as opts.source |
| // or else mapping will fail. If mapping is not possible, then a MappedFile |
| // object with a new[]'ed block of memory will be created. |
| static MappedFile* Map(istream* s, const FstReadOptions& opts, size_t size); |
| |
| // Creates a MappedFile object with a new[]'ed block of memory of size. |
| // RECOMMENDED FOR INTERNAL USE ONLY, may change in future releases. |
| static MappedFile* Allocate(size_t size); |
| |
| // 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. |
| // RECOMMENDED FOR INTERNAL USE ONLY, may change in future releases. |
| static MappedFile* Borrow(void *data); |
| |
| static const int kArchAlignment; |
| |
| private: |
| explicit MappedFile(const MemoryRegion ®ion); |
| |
| MemoryRegion region_; |
| DISALLOW_COPY_AND_ASSIGN(MappedFile); |
| }; |
| } // namespace fst |
| |
| #endif // FST_LIB_MAPPED_FILE_H_ |