#pragma once #include "generator/collector_interface.hpp" #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 #include #include #include #include namespace generator { namespace cache { class IntermediateDataReaderInterface; } // namespace cache } // namespace generator namespace feature { // A string of connected ways. class LineString { public: using Ways = std::vector; explicit LineString(OsmElement const & way); bool Add(LineString & line); void Reverse(); Ways const & GetWays() const { return m_ways; } 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; Ways m_ways; }; class LineStringMerger { public: using LinePtr = std::shared_ptr; using InputData = std::unordered_multimap; using OutputData = std::map>; static OutputData Merge(InputData const & data); private: using Buffer = std::unordered_map; static bool TryMerge(LinePtr const & lineString, Buffer & buffer); static bool TryMergeOne(LinePtr const & lineString, Buffer & buffer); static OutputData OrderData(InputData const & data); }; // Merges road segments with similar name and ref values into groups called metalines. class MetalinesBuilder : public generator::CollectorInterface { public: explicit MetalinesBuilder(std::string const & filename); // CollectorInterface overrides: std::shared_ptr Clone( std::shared_ptr const & = {}) const override; /// 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; protected: void Save() override; void OrderCollectedData() override; private: std::unique_ptr m_writer; }; // Read an intermediate file from MetalinesBuilder and convert it to an mwm section. bool WriteMetalinesSection(std::string const & mwmPath, std::string const & metalinesPath, std::string const & osmIdsToFeatureIdsPath); }