[feature] Put m_metaDeserializer into SharedLoadInfo.

Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
This commit is contained in:
Viktor Govako
2025-06-24 23:53:01 -03:00
committed by Konstantin Pastbin
parent 6beabb2fe1
commit 588028c9eb
13 changed files with 80 additions and 70 deletions

View File

@@ -15,7 +15,7 @@
#include "geometry/rect2d.hpp" #include "geometry/rect2d.hpp"
#include "geometry/screenbase.hpp" #include "geometry/screenbase.hpp"
#include "base/buffer_vector.hpp" #include "base/string_utils.hpp"
#include <set> #include <set>
#include <string> #include <string>

View File

@@ -5,6 +5,8 @@
#include "geometry/mercator.hpp" #include "geometry/mercator.hpp"
#include "base/string_utils.hpp"
#include <sstream> #include <sstream>
namespace df namespace df

View File

@@ -22,9 +22,9 @@ public:
WriteToSink(sink, m_featuresSize); WriteToSink(sink, m_featuresSize);
} }
void Read(Reader & reader) template <typename Source>
void Read(Source & source)
{ {
NonOwningReaderSource source(reader);
m_version = static_cast<Version>(ReadPrimitiveFromSource<uint8_t>(source)); m_version = static_cast<Version>(ReadPrimitiveFromSource<uint8_t>(source));
CHECK_EQUAL(static_cast<uint8_t>(m_version), static_cast<uint8_t>(Version::V0), ()); CHECK_EQUAL(static_cast<uint8_t>(m_version), static_cast<uint8_t>(Version::V0), ());
m_featuresOffset = ReadPrimitiveFromSource<uint32_t>(source); m_featuresOffset = ReadPrimitiveFromSource<uint32_t>(source);

View File

@@ -184,11 +184,9 @@ uint8_t ReadByte(TSource & src)
} }
} // namespace } // namespace
FeatureType::FeatureType(SharedLoadInfo const * loadInfo, vector<uint8_t> && buffer, FeatureType::FeatureType(SharedLoadInfo const * loadInfo, vector<uint8_t> && buffer)
indexer::MetadataDeserializer * metadataDeserializer)
: m_loadInfo(loadInfo) : m_loadInfo(loadInfo)
, m_data(std::move(buffer)) , m_data(std::move(buffer))
, m_metadataDeserializer(metadataDeserializer)
{ {
CHECK(m_loadInfo, ()); CHECK(m_loadInfo, ());
@@ -608,10 +606,10 @@ void FeatureType::ParseMetadata()
if (m_parsed.m_metadata) if (m_parsed.m_metadata)
return; return;
CHECK(m_metadataDeserializer, ()); CHECK(m_loadInfo->m_metaDeserializer, ());
try 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 &) catch (Reader::OpenException const &)
{ {
@@ -626,10 +624,10 @@ void FeatureType::ParseMetaIds()
if (m_parsed.m_metaIds) if (m_parsed.m_metaIds)
return; return;
CHECK(m_metadataDeserializer, ()); CHECK(m_loadInfo->m_metaDeserializer, ());
try 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 &) 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; }); auto const it = base::FindIf(m_metaIds, [&type](auto const & v) { return v.first == type; });
if (it != m_metaIds.end()) 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; return meta;
} }

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "indexer/feature_data.hpp" #include "indexer/feature_data.hpp"
#include "indexer/metadata_serdes.hpp"
#include "geometry/point2d.hpp" #include "geometry/point2d.hpp"
#include "geometry/rect2d.hpp" #include "geometry/rect2d.hpp"
@@ -34,8 +35,7 @@ class FeatureType
public: public:
using GeometryOffsets = buffer_vector<uint32_t, feature::DataHeader::kMaxScalesCount>; using GeometryOffsets = buffer_vector<uint32_t, feature::DataHeader::kMaxScalesCount>;
FeatureType(feature::SharedLoadInfo const * loadInfo, std::vector<uint8_t> && buffer, FeatureType(feature::SharedLoadInfo const * loadInfo, std::vector<uint8_t> && buffer);
indexer::MetadataDeserializer * metadataDeserializer);
static std::unique_ptr<FeatureType> CreateFromMapObject(osm::MapObject const & emo); static std::unique_ptr<FeatureType> CreateFromMapObject(osm::MapObject const & emo);
@@ -248,9 +248,6 @@ private:
feature::SharedLoadInfo const * m_loadInfo = nullptr; feature::SharedLoadInfo const * m_loadInfo = nullptr;
std::vector<uint8_t> m_data; std::vector<uint8_t> m_data;
// Pointer to shared metedata deserializer. Must be set for mwm format >= Format::v11
indexer::MetadataDeserializer * m_metadataDeserializer = nullptr;
ParsedFlags m_parsed; ParsedFlags m_parsed;
Offsets m_offsets; Offsets m_offsets;
uint32_t m_ptsSimpMask = 0; uint32_t m_ptsSimpMask = 0;

View File

@@ -24,6 +24,34 @@ char constexpr const * kBaseCommonsUrl =
#endif #endif
} // namespace } // 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) string Metadata::ToWikiURL(std::string v)
{ {
auto const colon = v.find(':'); auto const colon = v.find(':');

View File

@@ -1,13 +1,9 @@
#pragma once #pragma once
#include "indexer/metadata_serdes.hpp"
#include "coding/reader.hpp"
#include "coding/string_utf8_multilang.hpp" #include "coding/string_utf8_multilang.hpp"
#include "base/stl_helpers.hpp" #include "base/stl_helpers.hpp"
#include <algorithm>
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
@@ -17,23 +13,10 @@ namespace feature
class MetadataBase class MetadataBase
{ {
public: public:
bool Has(uint8_t type) const bool Has(uint8_t type) const { return m_metadata.find(type) != m_metadata.end(); }
{
auto const it = m_metadata.find(type);
return it != m_metadata.end();
}
std::string_view Get(uint8_t type) const std::string_view Get(uint8_t type) const;
{ std::string_view Set(uint8_t type, std::string value);
std::string_view sv;
auto const it = m_metadata.find(type);
if (it != m_metadata.end())
{
sv = it->second;
ASSERT(!sv.empty(), ());
}
return sv;
}
inline bool Empty() const { return m_metadata.empty(); } inline bool Empty() const { return m_metadata.empty(); }
inline size_t Size() const { return m_metadata.size(); } inline size_t Size() const { return m_metadata.size(); }
@@ -66,24 +49,6 @@ public:
void Clear() { m_metadata.clear(); } void Clear() { m_metadata.clear(); }
protected: 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. /// @todo Change uint8_t to appropriate type when FMD_COUNT reaches 256.
std::map<uint8_t, std::string> m_metadata; std::map<uint8_t, std::string> m_metadata;
}; };

View File

@@ -7,9 +7,8 @@
FeaturesVector::FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header, FeaturesVector::FeaturesVector(FilesContainerR const & cont, feature::DataHeader const & header,
feature::FeaturesOffsetsTable const * table, feature::FeaturesOffsetsTable const * table,
indexer::MetadataDeserializer * metaDeserializer) indexer::MetadataDeserializer * metaDeserializer)
: m_loadInfo(cont, header) : m_loadInfo(cont, header, metaDeserializer)
, m_table(table) , m_table(table)
, m_metaDeserializer(metaDeserializer)
{ {
InitRecordsReader(); InitRecordsReader();
} }
@@ -17,17 +16,19 @@ FeaturesVector::FeaturesVector(FilesContainerR const & cont, feature::DataHeader
void FeaturesVector::InitRecordsReader() void FeaturesVector::InitRecordsReader()
{ {
FilesContainerR::TReader reader = m_loadInfo.GetDataReader(); FilesContainerR::TReader reader = m_loadInfo.GetDataReader();
ReaderSource src(reader);
feature::DatSectionHeader header; feature::DatSectionHeader header;
header.Read(*reader.GetPtr()); header.Read(src);
CHECK(header.m_version == feature::DatSectionHeader::Version::V0, (base::Underlying(header.m_version)));
CHECK_EQUAL(header.m_version, feature::DatSectionHeader::Version::V0, ());
m_recordReader = std::make_unique<RecordReader>(reader.SubReader(header.m_featuresOffset, header.m_featuresSize)); m_recordReader = std::make_unique<RecordReader>(reader.SubReader(header.m_featuresOffset, header.m_featuresSize));
} }
std::unique_ptr<FeatureType> FeaturesVector::GetByIndex(uint32_t index) const std::unique_ptr<FeatureType> FeaturesVector::GetByIndex(uint32_t index) const
{ {
auto const ftOffset = m_table ? m_table->GetFeatureOffset(index) : index; auto const ftOffset = m_table ? m_table->GetFeatureOffset(index) : index;
return std::make_unique<FeatureType>(&m_loadInfo, m_recordReader->ReadRecord(ftOffset), m_metaDeserializer); return std::make_unique<FeatureType>(&m_loadInfo, m_recordReader->ReadRecord(ftOffset));
} }
size_t FeaturesVector::GetNumFeatures() const size_t FeaturesVector::GetNumFeatures() const
@@ -47,11 +48,11 @@ FeaturesVectorTest::FeaturesVectorTest(FilesContainerR const & cont)
m_vector.m_table = feature::FeaturesOffsetsTable::Load(m_cont).release(); m_vector.m_table = feature::FeaturesOffsetsTable::Load(m_cont).release();
if (m_cont.IsExist(METADATA_FILE_TAG)) 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() FeaturesVectorTest::~FeaturesVectorTest()
{ {
delete m_vector.m_table; delete m_vector.m_table;
delete m_vector.m_metaDeserializer; delete m_vector.m_loadInfo.m_metaDeserializer;
} }

View File

@@ -1,12 +1,10 @@
#pragma once #pragma once
#include "indexer/feature.hpp" #include "indexer/feature.hpp"
#include "indexer/metadata_serdes.hpp"
#include "indexer/shared_load_info.hpp" #include "indexer/shared_load_info.hpp"
#include "coding/var_record_reader.hpp" #include "coding/var_record_reader.hpp"
#include <cstdint>
#include <memory> #include <memory>
#include <vector> #include <vector>
@@ -35,7 +33,7 @@ public:
uint32_t index = 0; uint32_t index = 0;
m_recordReader->ForEachRecord([&](uint32_t pos, std::vector<uint8_t> && data) m_recordReader->ForEachRecord([&](uint32_t pos, std::vector<uint8_t> && 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 // We can't properly set MwmId here, because FeaturesVector
// works with FileContainerR, not with MwmId/MwmHandle/MwmValue. // works with FileContainerR, not with MwmId/MwmHandle/MwmValue.
@@ -57,7 +55,7 @@ public:
private: private:
/// Actually, this ctor is needed only for ForEachOffset call. /// Actually, this ctor is needed only for ForEachOffset call.
/// Didn't find a better solution without big refactoring. /// 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(); InitRecordsReader();
} }
@@ -70,7 +68,6 @@ private:
feature::SharedLoadInfo m_loadInfo; feature::SharedLoadInfo m_loadInfo;
std::unique_ptr<RecordReader> m_recordReader; std::unique_ptr<RecordReader> m_recordReader;
feature::FeaturesOffsetsTable const * m_table; feature::FeaturesOffsetsTable const * m_table;
indexer::MetadataDeserializer * m_metaDeserializer;
}; };
/// Test features vector (reader) that combines all the needed data for stand-alone work. /// Test features vector (reader) that combines all the needed data for stand-alone work.

View File

@@ -1,10 +1,9 @@
#include "indexer/mwm_set.hpp" #include "indexer/mwm_set.hpp"
#include "indexer/features_offsets_table.hpp" #include "indexer/features_offsets_table.hpp"
#include "indexer/metadata_serdes.hpp" // needed for MwmValue dtor
#include "indexer/scales.hpp" #include "indexer/scales.hpp"
#include "coding/reader.hpp"
#include "platform/local_country_file_utils.hpp" #include "platform/local_country_file_utils.hpp"
#include "base/assert.hpp" #include "base/assert.hpp"
@@ -391,6 +390,8 @@ MwmValue::MwmValue(LocalCountryFile const & localFile)
m_header.Load(m_cont); m_header.Load(m_cont);
} }
MwmValue::~MwmValue() {}
void MwmValue::SetTable(MwmInfoEx & info) void MwmValue::SetTable(MwmInfoEx & info)
{ {
m_table = info.m_table.lock(); m_table = info.m_table.lock();

View File

@@ -6,6 +6,8 @@
#include "platform/local_country_file.hpp" #include "platform/local_country_file.hpp"
#include "platform/mwm_version.hpp" #include "platform/mwm_version.hpp"
#include "coding/files_container.hpp"
#include "geometry/rect2d.hpp" #include "geometry/rect2d.hpp"
#include "base/macros.hpp" #include "base/macros.hpp"
@@ -26,6 +28,10 @@ namespace feature
{ {
class FeaturesOffsetsTable; class FeaturesOffsetsTable;
} }
namespace indexer
{
class MetadataDeserializer;
}
/// Information about stored mwm. /// Information about stored mwm.
class MwmInfo class MwmInfo
@@ -387,6 +393,8 @@ public:
public: public:
explicit MwmValue(platform::LocalCountryFile const & localFile); explicit MwmValue(platform::LocalCountryFile const & localFile);
~MwmValue();
void SetTable(MwmInfoEx & info); void SetTable(MwmInfoEx & info);
feature::DataHeader const & GetHeader() const { return m_header; } feature::DataHeader const & GetHeader() const { return m_header; }

View File

@@ -6,7 +6,11 @@
namespace feature 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 SharedLoadInfo::Reader SharedLoadInfo::GetDataReader() const

View File

@@ -7,6 +7,11 @@
#include "base/macros.hpp" #include "base/macros.hpp"
namespace indexer
{
class MetadataDeserializer;
}
namespace feature namespace feature
{ {
// This info is created once per FeaturesVector. // This info is created once per FeaturesVector.
@@ -15,7 +20,8 @@ class SharedLoadInfo
public: public:
using Reader = FilesContainerR::TReader; 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 GetDataReader() const;
Reader GetGeometryReader(size_t ind) const; Reader GetGeometryReader(size_t ind) const;
@@ -39,6 +45,9 @@ private:
FilesContainerR const & m_cont; FilesContainerR const & m_cont;
DataHeader const & m_header; DataHeader const & m_header;
public:
indexer::MetadataDeserializer * m_metaDeserializer;
DISALLOW_COPY_AND_MOVE(SharedLoadInfo); DISALLOW_COPY_AND_MOVE(SharedLoadInfo);
}; };
} // namespace feature } // namespace feature