diff --git a/libs/drape/overlay_handle.hpp b/libs/drape/overlay_handle.hpp index 873715128..c6f0c613e 100644 --- a/libs/drape/overlay_handle.hpp +++ b/libs/drape/overlay_handle.hpp @@ -15,7 +15,7 @@ #include "geometry/rect2d.hpp" #include "geometry/screenbase.hpp" -#include "base/buffer_vector.hpp" +#include "base/string_utils.hpp" #include #include diff --git a/libs/drape_frontend/tile_key.cpp b/libs/drape_frontend/tile_key.cpp index 5b97b7739..add1a7356 100644 --- a/libs/drape_frontend/tile_key.cpp +++ b/libs/drape_frontend/tile_key.cpp @@ -5,6 +5,8 @@ #include "geometry/mercator.hpp" +#include "base/string_utils.hpp" + #include namespace df diff --git a/libs/indexer/dat_section_header.hpp b/libs/indexer/dat_section_header.hpp index 66bc218d6..07e5e6a29 100644 --- a/libs/indexer/dat_section_header.hpp +++ b/libs/indexer/dat_section_header.hpp @@ -22,9 +22,9 @@ public: WriteToSink(sink, m_featuresSize); } - void Read(Reader & reader) + template + void Read(Source & source) { - NonOwningReaderSource source(reader); m_version = static_cast(ReadPrimitiveFromSource(source)); CHECK_EQUAL(static_cast(m_version), static_cast(Version::V0), ()); m_featuresOffset = ReadPrimitiveFromSource(source); diff --git a/libs/indexer/feature.cpp b/libs/indexer/feature.cpp index 96964f16e..8361e8395 100644 --- a/libs/indexer/feature.cpp +++ b/libs/indexer/feature.cpp @@ -184,11 +184,9 @@ uint8_t ReadByte(TSource & src) } } // namespace -FeatureType::FeatureType(SharedLoadInfo const * loadInfo, vector && buffer, - indexer::MetadataDeserializer * metadataDeserializer) +FeatureType::FeatureType(SharedLoadInfo const * loadInfo, vector && buffer) : m_loadInfo(loadInfo) , m_data(std::move(buffer)) - , m_metadataDeserializer(metadataDeserializer) { CHECK(m_loadInfo, ()); @@ -608,10 +606,10 @@ void FeatureType::ParseMetadata() if (m_parsed.m_metadata) return; - CHECK(m_metadataDeserializer, ()); + CHECK(m_loadInfo->m_metaDeserializer, ()); try { - UNUSED_VALUE(m_metadataDeserializer->Get(m_id.m_index, m_metadata)); + UNUSED_VALUE(m_loadInfo->m_metaDeserializer->Get(m_id.m_index, m_metadata)); } catch (Reader::OpenException const &) { @@ -626,10 +624,10 @@ void FeatureType::ParseMetaIds() if (m_parsed.m_metaIds) return; - CHECK(m_metadataDeserializer, ()); + CHECK(m_loadInfo->m_metaDeserializer, ()); try { - UNUSED_VALUE(m_metadataDeserializer->GetIds(m_id.m_index, m_metaIds)); + UNUSED_VALUE(m_loadInfo->m_metaDeserializer->GetIds(m_id.m_index, m_metaIds)); } catch (Reader::OpenException const &) { @@ -845,7 +843,7 @@ std::string_view FeatureType::GetMetadata(feature::Metadata::EType type) { auto const it = base::FindIf(m_metaIds, [&type](auto const & v) { return v.first == type; }); if (it != m_metaIds.end()) - meta = m_metadata.Set(type, m_metadataDeserializer->GetMetaById(it->second)); + meta = m_metadata.Set(type, m_loadInfo->m_metaDeserializer->GetMetaById(it->second)); } return meta; } diff --git a/libs/indexer/feature.hpp b/libs/indexer/feature.hpp index 1824e0fb3..c2b4ce582 100644 --- a/libs/indexer/feature.hpp +++ b/libs/indexer/feature.hpp @@ -1,5 +1,6 @@ #pragma once #include "indexer/feature_data.hpp" +#include "indexer/metadata_serdes.hpp" #include "geometry/point2d.hpp" #include "geometry/rect2d.hpp" @@ -34,8 +35,7 @@ class FeatureType public: using GeometryOffsets = buffer_vector; - FeatureType(feature::SharedLoadInfo const * loadInfo, std::vector && buffer, - indexer::MetadataDeserializer * metadataDeserializer); + FeatureType(feature::SharedLoadInfo const * loadInfo, std::vector && buffer); static std::unique_ptr CreateFromMapObject(osm::MapObject const & emo); @@ -248,9 +248,6 @@ private: feature::SharedLoadInfo const * m_loadInfo = nullptr; std::vector m_data; - // Pointer to shared metedata deserializer. Must be set for mwm format >= Format::v11 - indexer::MetadataDeserializer * m_metadataDeserializer = nullptr; - ParsedFlags m_parsed; Offsets m_offsets; uint32_t m_ptsSimpMask = 0; diff --git a/libs/indexer/feature_meta.cpp b/libs/indexer/feature_meta.cpp index ca06fadb0..ca3476a85 100644 --- a/libs/indexer/feature_meta.cpp +++ b/libs/indexer/feature_meta.cpp @@ -24,6 +24,34 @@ char constexpr const * kBaseCommonsUrl = #endif } // namespace +std::string_view MetadataBase::Get(uint8_t type) const +{ + std::string_view sv; + auto const it = m_metadata.find(type); + if (it != m_metadata.end()) + { + sv = it->second; + ASSERT(!sv.empty(), ()); + } + return sv; +} + +std::string_view MetadataBase::Set(uint8_t type, std::string value) +{ + std::string_view sv; + + if (value.empty()) + m_metadata.erase(type); + else + { + auto & res = m_metadata[type]; + res = std::move(value); + sv = res; + } + + return sv; +} + string Metadata::ToWikiURL(std::string v) { auto const colon = v.find(':'); diff --git a/libs/indexer/feature_meta.hpp b/libs/indexer/feature_meta.hpp index 94c8badb0..b286c4de9 100644 --- a/libs/indexer/feature_meta.hpp +++ b/libs/indexer/feature_meta.hpp @@ -1,13 +1,9 @@ #pragma once -#include "indexer/metadata_serdes.hpp" - -#include "coding/reader.hpp" #include "coding/string_utf8_multilang.hpp" #include "base/stl_helpers.hpp" -#include #include #include #include @@ -17,23 +13,10 @@ namespace feature class MetadataBase { public: - bool Has(uint8_t type) const - { - auto const it = m_metadata.find(type); - return it != m_metadata.end(); - } + bool Has(uint8_t type) const { return m_metadata.find(type) != m_metadata.end(); } - std::string_view Get(uint8_t type) const - { - std::string_view sv; - auto const it = m_metadata.find(type); - if (it != m_metadata.end()) - { - sv = it->second; - ASSERT(!sv.empty(), ()); - } - return sv; - } + std::string_view Get(uint8_t type) const; + std::string_view Set(uint8_t type, std::string value); inline bool Empty() const { return m_metadata.empty(); } inline size_t Size() const { return m_metadata.size(); } @@ -66,24 +49,6 @@ public: void Clear() { m_metadata.clear(); } protected: - friend bool indexer::MetadataDeserializer::Get(uint32_t id, MetadataBase & meta); - - std::string_view Set(uint8_t type, std::string value) - { - std::string_view sv; - - if (value.empty()) - m_metadata.erase(type); - else - { - auto & res = m_metadata[type]; - res = std::move(value); - sv = res; - } - - return sv; - } - /// @todo Change uint8_t to appropriate type when FMD_COUNT reaches 256. std::map m_metadata; }; diff --git a/libs/indexer/features_vector.cpp b/libs/indexer/features_vector.cpp index 656fd9036..af2bd5dd6 100644 --- a/libs/indexer/features_vector.cpp +++ b/libs/indexer/features_vector.cpp @@ -7,9 +7,8 @@ FeaturesVector::FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header, feature::FeaturesOffsetsTable const * table, indexer::MetadataDeserializer * metaDeserializer) - : m_loadInfo(cont, header) + : m_loadInfo(cont, header, metaDeserializer) , m_table(table) - , m_metaDeserializer(metaDeserializer) { InitRecordsReader(); } @@ -17,17 +16,19 @@ FeaturesVector::FeaturesVector(FilesContainerR const & cont, feature::DataHeader void FeaturesVector::InitRecordsReader() { FilesContainerR::TReader reader = m_loadInfo.GetDataReader(); + ReaderSource src(reader); feature::DatSectionHeader header; - header.Read(*reader.GetPtr()); - CHECK(header.m_version == feature::DatSectionHeader::Version::V0, (base::Underlying(header.m_version))); + header.Read(src); + + CHECK_EQUAL(header.m_version, feature::DatSectionHeader::Version::V0, ()); m_recordReader = std::make_unique(reader.SubReader(header.m_featuresOffset, header.m_featuresSize)); } std::unique_ptr FeaturesVector::GetByIndex(uint32_t index) const { auto const ftOffset = m_table ? m_table->GetFeatureOffset(index) : index; - return std::make_unique(&m_loadInfo, m_recordReader->ReadRecord(ftOffset), m_metaDeserializer); + return std::make_unique(&m_loadInfo, m_recordReader->ReadRecord(ftOffset)); } size_t FeaturesVector::GetNumFeatures() const @@ -47,11 +48,11 @@ FeaturesVectorTest::FeaturesVectorTest(FilesContainerR const & cont) m_vector.m_table = feature::FeaturesOffsetsTable::Load(m_cont).release(); if (m_cont.IsExist(METADATA_FILE_TAG)) - m_vector.m_metaDeserializer = indexer::MetadataDeserializer::Load(m_cont).release(); + m_vector.m_loadInfo.m_metaDeserializer = indexer::MetadataDeserializer::Load(m_cont).release(); } FeaturesVectorTest::~FeaturesVectorTest() { delete m_vector.m_table; - delete m_vector.m_metaDeserializer; + delete m_vector.m_loadInfo.m_metaDeserializer; } diff --git a/libs/indexer/features_vector.hpp b/libs/indexer/features_vector.hpp index 60728572e..b7280c4c4 100644 --- a/libs/indexer/features_vector.hpp +++ b/libs/indexer/features_vector.hpp @@ -1,12 +1,10 @@ #pragma once #include "indexer/feature.hpp" -#include "indexer/metadata_serdes.hpp" #include "indexer/shared_load_info.hpp" #include "coding/var_record_reader.hpp" -#include #include #include @@ -35,7 +33,7 @@ public: uint32_t index = 0; m_recordReader->ForEachRecord([&](uint32_t pos, std::vector && data) { - FeatureType ft(&m_loadInfo, std::move(data), m_metaDeserializer); + FeatureType ft(&m_loadInfo, std::move(data)); // We can't properly set MwmId here, because FeaturesVector // works with FileContainerR, not with MwmId/MwmHandle/MwmValue. @@ -57,7 +55,7 @@ public: private: /// Actually, this ctor is needed only for ForEachOffset call. /// Didn't find a better solution without big refactoring. - FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header) : m_loadInfo(cont, header) + FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header) : m_loadInfo(cont, header, nullptr) { InitRecordsReader(); } @@ -70,7 +68,6 @@ private: feature::SharedLoadInfo m_loadInfo; std::unique_ptr m_recordReader; feature::FeaturesOffsetsTable const * m_table; - indexer::MetadataDeserializer * m_metaDeserializer; }; /// Test features vector (reader) that combines all the needed data for stand-alone work. diff --git a/libs/indexer/mwm_set.cpp b/libs/indexer/mwm_set.cpp index e9203c4a0..b16191f1a 100644 --- a/libs/indexer/mwm_set.cpp +++ b/libs/indexer/mwm_set.cpp @@ -1,10 +1,9 @@ #include "indexer/mwm_set.hpp" #include "indexer/features_offsets_table.hpp" +#include "indexer/metadata_serdes.hpp" // needed for MwmValue dtor #include "indexer/scales.hpp" -#include "coding/reader.hpp" - #include "platform/local_country_file_utils.hpp" #include "base/assert.hpp" @@ -391,6 +390,8 @@ MwmValue::MwmValue(LocalCountryFile const & localFile) m_header.Load(m_cont); } +MwmValue::~MwmValue() {} + void MwmValue::SetTable(MwmInfoEx & info) { m_table = info.m_table.lock(); diff --git a/libs/indexer/mwm_set.hpp b/libs/indexer/mwm_set.hpp index 9454e1f7b..5d309f21a 100644 --- a/libs/indexer/mwm_set.hpp +++ b/libs/indexer/mwm_set.hpp @@ -6,6 +6,8 @@ #include "platform/local_country_file.hpp" #include "platform/mwm_version.hpp" +#include "coding/files_container.hpp" + #include "geometry/rect2d.hpp" #include "base/macros.hpp" @@ -26,6 +28,10 @@ namespace feature { class FeaturesOffsetsTable; } +namespace indexer +{ +class MetadataDeserializer; +} /// Information about stored mwm. class MwmInfo @@ -387,6 +393,8 @@ public: public: explicit MwmValue(platform::LocalCountryFile const & localFile); + ~MwmValue(); + void SetTable(MwmInfoEx & info); feature::DataHeader const & GetHeader() const { return m_header; } diff --git a/libs/indexer/shared_load_info.cpp b/libs/indexer/shared_load_info.cpp index fc399effe..638fa7a53 100644 --- a/libs/indexer/shared_load_info.cpp +++ b/libs/indexer/shared_load_info.cpp @@ -6,7 +6,11 @@ namespace feature { -SharedLoadInfo::SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header) : m_cont(cont), m_header(header) +SharedLoadInfo::SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header, + indexer::MetadataDeserializer * metaDeserializer) + : m_cont(cont) + , m_header(header) + , m_metaDeserializer(metaDeserializer) {} SharedLoadInfo::Reader SharedLoadInfo::GetDataReader() const diff --git a/libs/indexer/shared_load_info.hpp b/libs/indexer/shared_load_info.hpp index 89aa841ca..157a3ea04 100644 --- a/libs/indexer/shared_load_info.hpp +++ b/libs/indexer/shared_load_info.hpp @@ -7,6 +7,11 @@ #include "base/macros.hpp" +namespace indexer +{ +class MetadataDeserializer; +} + namespace feature { // This info is created once per FeaturesVector. @@ -15,7 +20,8 @@ class SharedLoadInfo public: using Reader = FilesContainerR::TReader; - SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header); + SharedLoadInfo(FilesContainerR const & cont, DataHeader const & header, + indexer::MetadataDeserializer * metaDeserializer); Reader GetDataReader() const; Reader GetGeometryReader(size_t ind) const; @@ -39,6 +45,9 @@ private: FilesContainerR const & m_cont; DataHeader const & m_header; +public: + indexer::MetadataDeserializer * m_metaDeserializer; + DISALLOW_COPY_AND_MOVE(SharedLoadInfo); }; } // namespace feature