[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/screenbase.hpp"
#include "base/buffer_vector.hpp"
#include "base/string_utils.hpp"
#include <set>
#include <string>

View File

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

View File

@@ -22,9 +22,9 @@ public:
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));
CHECK_EQUAL(static_cast<uint8_t>(m_version), static_cast<uint8_t>(Version::V0), ());
m_featuresOffset = ReadPrimitiveFromSource<uint32_t>(source);

View File

@@ -184,11 +184,9 @@ uint8_t ReadByte(TSource & src)
}
} // namespace
FeatureType::FeatureType(SharedLoadInfo const * loadInfo, vector<uint8_t> && buffer,
indexer::MetadataDeserializer * metadataDeserializer)
FeatureType::FeatureType(SharedLoadInfo const * loadInfo, vector<uint8_t> && 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;
}

View File

@@ -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<uint32_t, feature::DataHeader::kMaxScalesCount>;
FeatureType(feature::SharedLoadInfo const * loadInfo, std::vector<uint8_t> && buffer,
indexer::MetadataDeserializer * metadataDeserializer);
FeatureType(feature::SharedLoadInfo const * loadInfo, std::vector<uint8_t> && buffer);
static std::unique_ptr<FeatureType> CreateFromMapObject(osm::MapObject const & emo);
@@ -248,9 +248,6 @@ private:
feature::SharedLoadInfo const * m_loadInfo = nullptr;
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;
Offsets m_offsets;
uint32_t m_ptsSimpMask = 0;

View File

@@ -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(':');

View File

@@ -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 <algorithm>
#include <map>
#include <string>
#include <vector>
@@ -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<uint8_t, std::string> m_metadata;
};

View File

@@ -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<RecordReader>(reader.SubReader(header.m_featuresOffset, header.m_featuresSize));
}
std::unique_ptr<FeatureType> FeaturesVector::GetByIndex(uint32_t index) const
{
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
@@ -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;
}

View File

@@ -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 <cstdint>
#include <memory>
#include <vector>
@@ -35,7 +33,7 @@ public:
uint32_t index = 0;
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
// 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<RecordReader> 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.

View File

@@ -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();

View File

@@ -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; }

View File

@@ -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

View File

@@ -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