diff --git a/coding/coding.pro b/coding/coding.pro index ee1b9c4de6..e79f8a2786 100644 --- a/coding/coding.pro +++ b/coding/coding.pro @@ -27,7 +27,7 @@ SOURCES += \ zip_reader.cpp \ mmap_reader.cpp \ reader_streambuf.cpp \ - reader_writer_ops.cpp + reader_writer_ops.cpp \ HEADERS += \ internal/xmlparser.h \ @@ -82,6 +82,5 @@ HEADERS += \ file_reader_stream.hpp \ file_writer_stream.hpp \ reader_streambuf.hpp \ - reader_writer_ops.hpp - - + reader_writer_ops.hpp \ + reader_wrapper.hpp \ diff --git a/coding/reader.hpp b/coding/reader.hpp index edbb2833a4..9aa5d5fff8 100644 --- a/coding/reader.hpp +++ b/coding/reader.hpp @@ -134,6 +134,8 @@ public: { m_p->ReadAsString(s); } + + ReaderT * GetPtr() const { return m_p.get(); } }; // Model reader store file id as string. diff --git a/coding/reader_wrapper.hpp b/coding/reader_wrapper.hpp new file mode 100644 index 0000000000..e45b940e9e --- /dev/null +++ b/coding/reader_wrapper.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include "../base/assert.hpp" + + +/// Reader wrapper to avoid penalty on copy and polymorphic SubReader creation. +template class SubReaderWrapper +{ + ReaderT * m_p; + uint64_t m_pos; + uint64_t m_size; + +protected: + SubReaderWrapper(ReaderT * p, uint64_t pos, uint64_t size) + : m_p(p), m_pos(pos), m_size(size) + { + ASSERT_LESS_OR_EQUAL ( pos + size, m_p->Size(), (pos, size) ); + } + +public: + explicit SubReaderWrapper(ReaderT * p) : m_p(p), m_pos(0), m_size(p->Size()) {} + + uint64_t Size() const { return m_size; } + + void Read(uint64_t pos, void * p, size_t size) const + { + ASSERT_LESS_OR_EQUAL ( pos + size, m_size, (pos, size) ); + m_p->Read(pos + m_pos, p, size); + } + + SubReaderWrapper SubReader(uint64_t pos, uint64_t size) const + { + return SubReaderWrapper(m_p, pos + m_pos, size); + } +}; diff --git a/map/navigator.hpp b/map/navigator.hpp index 4f0e5b3313..77b95df6b9 100644 --- a/map/navigator.hpp +++ b/map/navigator.hpp @@ -4,9 +4,6 @@ #include "../base/matrix.hpp" -class FileReader; -template class ReaderSource; -class FileWriter; // Calculates screen parameters in navigation (dragging, scaling, etc.). class Navigator diff --git a/search/search_query.cpp b/search/search_query.cpp index ccbcf250e9..d05e964f30 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -13,6 +13,7 @@ #include "../indexer/categories_holder.hpp" #include "../coding/multilang_utf8_string.hpp" +#include "../coding/reader_wrapper.hpp" #include "../base/logging.hpp" #include "../base/string_utils.hpp" @@ -643,10 +644,12 @@ void Query::SearchFeatures(vector > const & tokens, continue; serial::CodingParams cp(GetCPForTrie(header.GetDefCodingParams())); + + ModelReaderPtr searchReader = pMwm->m_cont.GetReader(SEARCH_INDEX_FILE_TAG); scoped_ptr pTrieRoot(::trie::reader::ReadTrie( - pMwm->m_cont.GetReader(SEARCH_INDEX_FILE_TAG), - trie::ValueReader(cp), - trie::EdgeValueReader())); + SubReaderWrapper(searchReader.GetPtr()), + trie::ValueReader(cp), + trie::EdgeValueReader())); // Get categories edge root. scoped_ptr pCategoriesRoot;