Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaksim Andrianov <maksimandrianov1@gmail.com>2021-03-05 13:57:01 +0300
committerTatiana Yan <tatiana.kondakova@gmail.com>2021-03-10 15:27:51 +0300
commit528855f9694590311a1851e8f06830fb8382065f (patch)
treed60b0d5d2b5a6c280b542acbe5627a88358cdead
parentf8935645f44eae12f1cbd6f78f9a548a2770b1ca (diff)
[generator] Saving LineStrings to file.
-rw-r--r--generator/metalines_builder.cpp24
-rw-r--r--generator/metalines_builder.hpp30
2 files changed, 49 insertions, 5 deletions
diff --git a/generator/metalines_builder.cpp b/generator/metalines_builder.cpp
index 707819a812..93a774badc 100644
--- a/generator/metalines_builder.cpp
+++ b/generator/metalines_builder.cpp
@@ -164,7 +164,10 @@ LineStringMerger::OutputData LineStringMerger::OrderData(InputData const & data)
// MetalinesBuilder --------------------------------------------------------------------------------
MetalinesBuilder::MetalinesBuilder(std::string const & filename)
- : generator::CollectorInterface(filename) {}
+ : generator::CollectorInterface(filename)
+ , m_writer(std::make_unique<FileWriter>(GetTmpFilename()))
+{
+}
std::shared_ptr<generator::CollectorInterface> MetalinesBuilder::Clone(
std::shared_ptr<generator::cache::IntermediateDataReaderInterface> const &) const
@@ -187,15 +190,27 @@ void MetalinesBuilder::CollectFeature(FeatureBuilder const & feature, OsmElement
return;
auto const key = std::hash<std::string>{}(name + '\0' + params.ref);
- m_data.emplace(key, std::make_shared<LineString>(element));
+ WriteVarUint(*m_writer, key);
+ LineString(element).Serialize(*m_writer);
}
+void MetalinesBuilder::Finish() { m_writer.reset(); }
+
void MetalinesBuilder::Save()
{
+ std::unordered_multimap<size_t, std::shared_ptr<LineString>> keyToLineString;
+ FileReader reader(GetTmpFilename());
+ ReaderSource<FileReader> src(reader);
+ while (src.Size() > 0)
+ {
+ auto const key = ReadVarUint<size_t>(src);
+ keyToLineString.emplace(key, std::make_shared<LineString>(LineString::Deserialize(src)));
+ }
+
FileWriter writer(GetFilename());
uint32_t countLines = 0;
uint32_t countWays = 0;
- auto const mergedData = LineStringMerger::Merge(m_data);
+ auto const mergedData = LineStringMerger::Merge(keyToLineString);
for (auto const & p : mergedData)
{
for (auto const & lineString : p.second)
@@ -236,7 +251,8 @@ void MetalinesBuilder::Merge(generator::CollectorInterface const & collector)
void MetalinesBuilder::MergeInto(MetalinesBuilder & collector) const
{
- collector.m_data.insert(std::begin(m_data), std::end(m_data));
+ CHECK(!m_writer || !collector.m_writer, ("Finish() has not been called."));
+ base::AppendFileToFile(GetTmpFilename(), collector.GetTmpFilename());
}
// Functions --------------------------------------------------------------------------------
diff --git a/generator/metalines_builder.hpp b/generator/metalines_builder.hpp
index 8fd89af7f1..43c4c2fba6 100644
--- a/generator/metalines_builder.hpp
+++ b/generator/metalines_builder.hpp
@@ -4,6 +4,10 @@
#include "generator/feature_builder.hpp"
#include "generator/osm_element.hpp"
+#include "coding/reader.hpp"
+#include "coding/write_to_sink.hpp"
+#include "coding/writer.hpp"
+
#include <cstdlib>
#include <cstdint>
#include <map>
@@ -37,7 +41,29 @@ public:
uint64_t GetStart() const { return m_start; }
uint64_t GetEnd() const { return m_end; }
+ template <typename T>
+ void Serialize(T & w)
+ {
+ WriteVarUint(w, m_start);
+ WriteVarUint(w, m_end);
+ WriteToSink(w, m_oneway);
+ rw::WriteVectorOfPOD(w, m_ways);
+ }
+
+ template <typename T>
+ static LineString Deserialize(T & r)
+ {
+ LineString ls;
+ ls.m_start = ReadVarUint<uint64_t>(r);
+ ls.m_end = ReadVarUint<uint64_t>(r);
+ ReadPrimitiveFromSource(r, ls.m_oneway);
+ rw::ReadVectorOfPOD(r, ls.m_ways);
+ return ls;
+ }
+
private:
+ LineString() = default;
+
uint64_t m_start;
uint64_t m_end;
bool m_oneway;
@@ -75,6 +101,8 @@ public:
/// Add a highway segment to the collection of metalines.
void CollectFeature(FeatureBuilder const & feature, OsmElement const & element) override;
+ void Finish() override;
+
void Merge(generator::CollectorInterface const & collector) override;
void MergeInto(MetalinesBuilder & collector) const override;
@@ -83,7 +111,7 @@ protected:
void OrderCollectedData() override;
private:
- std::unordered_multimap<size_t, std::shared_ptr<LineString>> m_data;
+ std::unique_ptr<FileWriter> m_writer;
};
// Read an intermediate file from MetalinesBuilder and convert it to an mwm section.