Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuri Gorshenin <mipt.vi002@gmail.com>2017-07-13 18:04:37 +0300
committerArsentiy Milchakov <milcars@mapswithme.com>2017-07-13 18:04:37 +0300
commit92358135885b3f71767fa8b6fc53af160ae58d9d (patch)
tree1a37c4f0935ebbe5668180a93e9841b50d963cee /coding/text_storage.hpp
parent498e98f8d0baf92b75ecac31cf96dbee2f3ec041 (diff)
[ugc] Binary SerDes. (#6577)
* [ugc] Binary SerDes. * Review fixes.
Diffstat (limited to 'coding/text_storage.hpp')
-rw-r--r--coding/text_storage.hpp43
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