From 528855f9694590311a1851e8f06830fb8382065f Mon Sep 17 00:00:00 2001 From: Maksim Andrianov Date: Fri, 5 Mar 2021 13:57:01 +0300 Subject: [generator] Saving LineStrings to file. --- generator/metalines_builder.cpp | 24 ++++++++++++++++++++---- generator/metalines_builder.hpp | 30 +++++++++++++++++++++++++++++- 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(GetTmpFilename())) +{ +} std::shared_ptr MetalinesBuilder::Clone( std::shared_ptr const &) const @@ -187,15 +190,27 @@ void MetalinesBuilder::CollectFeature(FeatureBuilder const & feature, OsmElement return; auto const key = std::hash{}(name + '\0' + params.ref); - m_data.emplace(key, std::make_shared(element)); + WriteVarUint(*m_writer, key); + LineString(element).Serialize(*m_writer); } +void MetalinesBuilder::Finish() { m_writer.reset(); } + void MetalinesBuilder::Save() { + std::unordered_multimap> keyToLineString; + FileReader reader(GetTmpFilename()); + ReaderSource src(reader); + while (src.Size() > 0) + { + auto const key = ReadVarUint(src); + keyToLineString.emplace(key, std::make_shared(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 #include #include @@ -37,7 +41,29 @@ public: uint64_t GetStart() const { return m_start; } uint64_t GetEnd() const { return m_end; } + template + void Serialize(T & w) + { + WriteVarUint(w, m_start); + WriteVarUint(w, m_end); + WriteToSink(w, m_oneway); + rw::WriteVectorOfPOD(w, m_ways); + } + + template + static LineString Deserialize(T & r) + { + LineString ls; + ls.m_start = ReadVarUint(r); + ls.m_end = ReadVarUint(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> m_data; + std::unique_ptr m_writer; }; // Read an intermediate file from MetalinesBuilder and convert it to an mwm section. -- cgit v1.2.3