diff --git a/indexer/feature.cpp b/indexer/feature.cpp index 3f0adf0e28..01e1210f3b 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -18,8 +18,8 @@ using namespace feature; void FeatureBase::Deserialize(feature::LoaderBase * pLoader, BufferT buffer) { - m_pLoader.reset(pLoader); - m_pLoader->Deserialize(buffer); + m_pLoader = pLoader; + m_pLoader->Init(buffer); m_LimitRect = m2::RectD::GetEmptyRect(); m_bTypesParsed = m_bCommonParsed = false; @@ -87,7 +87,7 @@ void FeatureType::Deserialize(feature::LoaderBase * pLoader, BufferT buffer) { base_type::Deserialize(pLoader, buffer); - m_pLoader->AssignFeature(this); + m_pLoader->InitFeature(this); m_bHeader2Parsed = m_bPointsParsed = m_bTrianglesParsed = false; diff --git a/indexer/feature.hpp b/indexer/feature.hpp index cd51be82c6..a0d62a9a4f 100644 --- a/indexer/feature.hpp +++ b/indexer/feature.hpp @@ -8,7 +8,6 @@ #include "../base/buffer_vector.hpp" #include "../std/string.hpp" -#include "../std/shared_ptr.hpp" namespace feature @@ -123,7 +122,7 @@ protected: inline uint8_t Header() const { return m_Header; } protected: - shared_ptr m_pLoader; + feature::LoaderBase * m_pLoader; uint8_t m_Header; diff --git a/indexer/feature_loader_base.cpp b/indexer/feature_loader_base.cpp index d9b3804626..bc69121361 100644 --- a/indexer/feature_loader_base.cpp +++ b/indexer/feature_loader_base.cpp @@ -21,6 +21,12 @@ namespace feature SharedLoadInfo::SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header) : m_cont(cont), m_header(header) { + CreateLoader(); +} + +SharedLoadInfo::~SharedLoadInfo() +{ + delete m_pLoader; } SharedLoadInfo::ReaderT SharedLoadInfo::GetDataReader() const @@ -38,22 +44,18 @@ SharedLoadInfo::ReaderT SharedLoadInfo::GetTrianglesReader(int ind) const return m_cont.GetReader(GetTagForIndex(TRIANGLE_FILE_TAG, ind)); } -LoaderBase * SharedLoadInfo::CreateLoader() const +void SharedLoadInfo::CreateLoader() { - LoaderBase * p; - switch (m_header.GetVersion()) { case DataHeader::v1: - p = new old_101::feature::LoaderImpl(*this); + m_pLoader = new old_101::feature::LoaderImpl(*this); break; default: - p = new LoaderCurrent(*this); + m_pLoader = new LoaderCurrent(*this); break; } - - return p; } @@ -66,11 +68,16 @@ LoaderBase::LoaderBase(SharedLoadInfo const & info) { } -void LoaderBase::Deserialize(BufferT data) +void LoaderBase::Init(BufferT data) { m_Data = data; + m_pF = 0; + m_CommonOffset = m_Header2Offset = 0; m_ptsSimpMask = 0; + + m_ptsOffsets.clear(); + m_trgOffsets.clear(); } uint32_t LoaderBase::CalcOffset(ArrayByteSource const & source) const diff --git a/indexer/feature_loader_base.hpp b/indexer/feature_loader_base.hpp index 962e8d71be..1a1d31473d 100644 --- a/indexer/feature_loader_base.hpp +++ b/indexer/feature_loader_base.hpp @@ -4,6 +4,8 @@ #include "../coding/file_container.hpp" +#include "../std/noncopyable.hpp" + class FeatureType; class ArrayByteSource; @@ -13,21 +15,25 @@ namespace feature class LoaderBase; /// This info is created once. - class SharedLoadInfo + class SharedLoadInfo : private noncopyable { FilesContainerR const & m_cont; DataHeader const & m_header; typedef FilesContainerR::ReaderT ReaderT; + LoaderBase * m_pLoader; + void CreateLoader(); + public: SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header); + ~SharedLoadInfo(); ReaderT GetDataReader() const; ReaderT GetGeometryReader(int ind) const; ReaderT GetTrianglesReader(int ind) const; - LoaderBase * CreateLoader() const; + LoaderBase * GetLoader() const { return m_pLoader; } inline serial::CodingParams const & GetDefCodingParams() const { @@ -49,11 +55,15 @@ namespace feature LoaderBase(SharedLoadInfo const & info); virtual ~LoaderBase() {} - inline void AssignFeature(FeatureType * p) { m_pF = p; } - // It seems like no need to store a copy of buffer (see FeaturesVector). typedef char const * BufferT; + /// @name Initialize functions. + //@{ + void Init(BufferT data); + inline void InitFeature(FeatureType * p) { m_pF = p; } + //@} + virtual uint8_t GetHeader() = 0; virtual void ParseTypes() = 0; @@ -62,8 +72,6 @@ namespace feature virtual uint32_t ParseGeometry(int scale) = 0; virtual uint32_t ParseTriangles(int scale) = 0; - void Deserialize(BufferT data); - inline uint32_t GetTypesSize() const { return m_CommonOffset - m_TypesOffset; } protected: diff --git a/indexer/features_vector.hpp b/indexer/features_vector.hpp index c66bbd1bee..93bea22d58 100644 --- a/indexer/features_vector.hpp +++ b/indexer/features_vector.hpp @@ -20,7 +20,7 @@ public: uint32_t offset; m_RecordReader.ReadRecord(pos, m_buffer, offset); - ft.Deserialize(m_LoadInfo.CreateLoader(), &m_buffer[offset]); + ft.Deserialize(m_LoadInfo.GetLoader(), &m_buffer[offset]); } template void ForEachOffset(ToDo toDo) const @@ -43,7 +43,7 @@ private: void operator() (uint32_t pos, char const * data, uint32_t /*size*/) const { FeatureType ft; - ft.Deserialize(m_loadInfo.CreateLoader(), data); + ft.Deserialize(m_loadInfo.GetLoader(), data); m_toDo(ft, pos); } diff --git a/search/search_query.cpp b/search/search_query.cpp index fb2fc37dcf..dc654d4b1e 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -405,6 +405,7 @@ namespace impl scoped_ptr m_pFV; + // For the best performance, incoming id's should be sorted by id.first (mwm file id). void LoadFeature(pair const & id, FeatureType & f, string & name, string & country) { @@ -424,7 +425,6 @@ namespace impl { } - // For the best performance, impl::PreResult1 should be sorted by impl::PreResult1::GetID(). impl::PreResult2 * operator() (impl::PreResult1 const & res) { FeatureType feature;