diff options
author | Denis Koronchik <denis@mapswithme.com> | 2014-09-16 12:05:39 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:28:17 +0300 |
commit | d8f3008ecc7300e87262308e753c7bf3d850c9e9 (patch) | |
tree | 44b2d2bc6df3299d66681a200bf4d7f2962f4d59 /coding/file_container.hpp | |
parent | b353a8adaef05206e4bf6769695e566d8e5989ce (diff) |
[coding] Implement FileMappingContainer
Diffstat (limited to 'coding/file_container.hpp')
-rw-r--r-- | coding/file_container.hpp | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/coding/file_container.hpp b/coding/file_container.hpp index aa42a0f4a9..a9d8011098 100644 --- a/coding/file_container.hpp +++ b/coding/file_container.hpp @@ -23,6 +23,13 @@ public: friend string DebugPrint(Info const & info); }; + Info const * GetInfo(Tag const & tag) const; + + bool IsExist(Tag const & tag) const + { + return GetInfo(tag) != 0; + } + protected: struct LessInfo { @@ -74,7 +81,6 @@ protected: } }; - typedef vector<Info> InfoContainer; InfoContainer m_info; @@ -94,8 +100,6 @@ public: ReaderT GetReader(Tag const & tag) const; - bool IsReaderExist(Tag const & tag) const; - template <typename F> void ForEachTag(F f) const { for (size_t i = 0; i < m_info.size(); ++i) @@ -109,6 +113,46 @@ private: ReaderT m_source; }; +class FilesMappingContainer : public FilesContainerBase +{ +public: + explicit FilesMappingContainer(string const & fName); + ~FilesMappingContainer(); + + class Handle + { + public: + Handle() + : m_base(0), m_origBase(0), m_size(0), m_origSize(0) + { + } + + Handle(char const * base, char const * alignBase, uint64_t size, uint64_t origSize) + : m_base(base), m_origBase(alignBase), m_size(size), m_origSize(origSize) + { + } + + ~Handle(); + + void Unmap(); + + bool IsValid() const { return (m_base != 0 && m_size > 0); } + uint64_t GetSize() const { return m_size; } + char const * GetData() const { return m_base; } + + private: + char const * m_base; + char const * m_origBase; + uint64_t m_size; + uint64_t m_origSize; + }; + + Handle Map(Tag const & tag) const; + +private: + int m_fd; +}; + class FilesContainerW : public FilesContainerBase { public: |