diff options
author | Yuri Gorshenin <mipt.vi002@gmail.com> | 2017-07-13 18:04:37 +0300 |
---|---|---|
committer | Arsentiy Milchakov <milcars@mapswithme.com> | 2017-07-13 18:04:37 +0300 |
commit | 92358135885b3f71767fa8b6fc53af160ae58d9d (patch) | |
tree | 1a37c4f0935ebbe5668180a93e9841b50d963cee /coding/text_storage.hpp | |
parent | 498e98f8d0baf92b75ecac31cf96dbee2f3ec041 (diff) |
[ugc] Binary SerDes. (#6577)
* [ugc] Binary SerDes.
* Review fixes.
Diffstat (limited to 'coding/text_storage.hpp')
-rw-r--r-- | coding/text_storage.hpp | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/coding/text_storage.hpp b/coding/text_storage.hpp index ac4f7065ce..5994c9c0bf 100644 --- a/coding/text_storage.hpp +++ b/coding/text_storage.hpp @@ -205,16 +205,29 @@ private: std::vector<BlockInfo> m_blocks; }; -template <typename Reader> class BlockedTextStorageReader { public: - explicit BlockedTextStorageReader(Reader & reader) : m_reader(reader) { m_index.Read(reader); } + template <typename Reader> + void InitializeIfNeeded(Reader & reader) + { + if (m_initialized) + return; + m_index.Read(reader); + m_initialized = true; + } - size_t GetNumStrings() const { return m_index.GetNumStrings(); } + size_t GetNumStrings() const + { + CHECK(m_initialized, ()); + return m_index.GetNumStrings(); + } - std::string ExtractString(size_t stringIx) + template <typename Reader> + std::string ExtractString(Reader & reader, size_t stringIx) { + InitializeIfNeeded(reader); + auto const blockIx = m_index.GetBlockIx(stringIx); CHECK_LESS(blockIx, m_index.GetNumBlockInfos(), ()); @@ -227,7 +240,7 @@ public: auto & entry = m_cache[blockIx]; if (!entry.m_valid) { - NonOwningReaderSource source(m_reader); + NonOwningReaderSource source(reader); source.Skip(bi.m_offset); entry.m_value.clear(); @@ -278,8 +291,26 @@ private: bool m_valid = false; }; - Reader & m_reader; BlockedTextStorageIndex m_index; std::vector<CacheEntry> m_cache; + bool m_initialized = false; +}; + +template <typename Reader> +class BlockedTextStorage +{ +public: + explicit BlockedTextStorage(Reader & reader) : m_reader(reader) + { + m_storage.InitializeIfNeeded(m_reader); + } + + size_t GetNumStrings() const { return m_storage.GetNumStrings(); } + std::string ExtractString(size_t stringIx) { return m_storage.ExtractString(m_reader, stringIx); } + void ClearCache() { m_storage.ClearCache(); } + +private: + BlockedTextStorageReader m_storage; + Reader & m_reader; }; } // namespace coding |