mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-19 04:53:36 +00:00
[feature] Put m_metaDeserializer into SharedLoadInfo.
Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
This commit is contained in:
committed by
Konstantin Pastbin
parent
6beabb2fe1
commit
588028c9eb
@@ -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>
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include "geometry/mercator.hpp"
|
||||
|
||||
#include "base/string_utils.hpp"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
namespace df
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(':');
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user