From 4916fd63a12a097861f1813acdd482b63b98d5e5 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 29 Jan 2020 00:55:26 +0300 Subject: [PATCH] [generator] Review fixes. --- .../final_processor_intermediate_mwm.cpp | 39 +++++------ .../final_processor_intermediate_mwm.hpp | 4 +- generator/isolines_generator.cpp | 64 ++++++++++--------- generator/isolines_generator.hpp | 9 ++- generator/raw_generator.cpp | 2 +- 5 files changed, 60 insertions(+), 58 deletions(-) diff --git a/generator/final_processor_intermediate_mwm.cpp b/generator/final_processor_intermediate_mwm.cpp index bb9e2f80da..9e3d4de887 100644 --- a/generator/final_processor_intermediate_mwm.cpp +++ b/generator/final_processor_intermediate_mwm.cpp @@ -127,11 +127,6 @@ std::string GetCountryNameFromTmpMwmPath(std::string filename) return filename; } -{ - strings::ReplaceLast(filename, DATA_FILE_EXTENSION_TMP, ""); - return filename; -} - bool FilenameIsCountry(std::string const & filename, AffiliationInterface const & affiliation) { return affiliation.HasCountryByName(GetCountryNameFromTmpMwmPath(filename)); @@ -279,12 +274,10 @@ bool FinalProcessorIntermediateMwmInterface::operator!=( CountryFinalProcessor::CountryFinalProcessor(std::string const & borderPath, std::string const & temporaryMwmPath, - std::string const & isolinesPath, bool haveBordersForWholeWorld, size_t threadsCount) : FinalProcessorIntermediateMwmInterface(FinalProcessorPriority::CountriesOrWorld) , m_borderPath(borderPath) , m_temporaryMwmPath(temporaryMwmPath) - , m_isolinesPath(isolinesPath) , m_haveBordersForWholeWorld(haveBordersForWholeWorld) , m_threadsCount(threadsCount) { @@ -334,6 +327,11 @@ void CountryFinalProcessor::SetMiniRoundabouts(std::string const & filename) m_miniRoundaboutsFilename = filename; } +void CountryFinalProcessor::SetIsolinesDir(std::string const & dir) +{ + m_isolinesPath = dir; +} + void CountryFinalProcessor::Process() { if (!m_hotelsFilename.empty()) @@ -422,24 +420,19 @@ void CountryFinalProcessor::AddIsolines() { IsolineFeaturesGenerator isolineFeaturesGenerator(m_isolinesPath); auto const affiliation = CountriesFilesIndexAffiliation(m_borderPath, m_haveBordersForWholeWorld); - { - ThreadPool pool(m_threadsCount); - ForEachCountry(m_temporaryMwmPath, [&](auto const & filename) { - pool.SubmitWork([&, filename]() { - if (!FilenameIsCountry(filename, affiliation)) - return; - auto const countryName = GetCountryNameFromTmpMwmPath(filename); + ThreadPool pool(m_threadsCount); + ForEachCountry(m_temporaryMwmPath, [&](auto const & filename) { + pool.SubmitWork([&, filename]() { + if (!FilenameIsCountry(filename, affiliation)) + return; + auto const countryName = GetCountryNameFromTmpMwmPath(filename); - std::vector fbs; - isolineFeaturesGenerator.GenerateIsolines(countryName, fbs); - - auto const fullPath = base::JoinPath(m_temporaryMwmPath, filename); - FeatureBuilderWriter writer(fullPath, FileWriter::Op::OP_APPEND); - for (auto const & fb : fbs) - writer.Write(fb); - }); + auto const fullPath = base::JoinPath(m_temporaryMwmPath, filename); + FeatureBuilderWriter writer(fullPath, FileWriter::Op::OP_APPEND); + isolineFeaturesGenerator.GenerateIsolines( + countryName, [&writer](feature::FeatureBuilder && fb){ writer.Write(fb); }); }); - } + }); } void CountryFinalProcessor::ProcessRoutingCityBoundaries() diff --git a/generator/final_processor_intermediate_mwm.hpp b/generator/final_processor_intermediate_mwm.hpp index eb9259842a..c6f1edfb22 100644 --- a/generator/final_processor_intermediate_mwm.hpp +++ b/generator/final_processor_intermediate_mwm.hpp @@ -49,7 +49,6 @@ class CountryFinalProcessor : public FinalProcessorIntermediateMwmInterface public: CountryFinalProcessor(std::string const & borderPath, std::string const & temporaryMwmPath, - std::string const & isolinesPath, bool haveBordersForWholeWorld, size_t threadsCount); void SetBooking(std::string const & filename); @@ -59,6 +58,7 @@ public: std::string const & worldCoastsFilename); void SetFakeNodes(std::string const & filename); void SetMiniRoundabouts(std::string const & filename); + void SetIsolinesDir(std::string const & dir); void DumpCitiesBoundaries(std::string const & filename); void DumpRoutingCitiesBoundaries(std::string const & collectorFilename, @@ -73,8 +73,8 @@ private: void ProcessCities(); void ProcessCoastline(); void ProcessRoundabouts(); - void AddIsolines(); void AddFakeNodes(); + void AddIsolines(); void Finish(); std::string m_borderPath; diff --git a/generator/isolines_generator.cpp b/generator/isolines_generator.cpp index 39a73a97e4..e0e831c2c5 100644 --- a/generator/isolines_generator.cpp +++ b/generator/isolines_generator.cpp @@ -9,41 +9,47 @@ namespace generator { namespace { -static std::vector const kAltClasses = {1000, 500, 100, 50, 10}; -static std::vector const kNamedAltClasses = {1000, 500, 100, 50}; -static std::string const kTypePrefix = "step_"; - -std::string GetIsolineType(topography_generator::Altitude altitude) -{ - ASSERT(std::is_sorted(kAltClasses.cbegin(), kAltClasses.cend(), std::greater()), ()); - if (altitude == 0) - return kTypePrefix + strings::to_string(kAltClasses.back()); - - for (auto altStep : kAltClasses) - { - if (altitude % altStep == 0) - return kTypePrefix + strings::to_string(altStep); - } - return ""; -} +std::vector const kAltClasses = {1000, 500, 100, 50, 10}; +int const kNamedAltStep = 50; +std::string const kTypePrefix = "step_"; +std::string const kTypeZero = "zero"; +uint32_t const kInvalidType = 0; std::string GetIsolineName(topography_generator::Altitude altitude) { - for (auto altStep : kNamedAltClasses) - { - if (altitude % altStep == 0) - return strings::to_string(altitude); - } + if (altitude % kNamedAltStep == 0) + return strings::to_string(altitude); return ""; } } // namespace IsolineFeaturesGenerator::IsolineFeaturesGenerator(std::string const & isolinesDir) : m_isolinesDir(isolinesDir) -{} +{ + ASSERT(std::is_sorted(kAltClasses.cbegin(), kAltClasses.cend(), std::greater()), ()); + for (auto alt : kAltClasses) + { + auto const type = kTypePrefix + strings::to_string(alt); + m_altClassToType[alt] = classif().GetTypeByPath({"isoline", type}); + } + m_altClassToType[0] = classif().GetTypeByPath({"isoline", kTypeZero}); +} + +uint32_t IsolineFeaturesGenerator::GetIsolineType(int altitude) const +{ + if (altitude == 0) + return m_altClassToType.at(0); + + for (auto altStep : kAltClasses) + { + if (altitude % altStep == 0) + return m_altClassToType.at(altStep); + } + return kInvalidType; +} void IsolineFeaturesGenerator::GenerateIsolines(std::string const & countryName, - std::vector & fbs) const + FeaturesCollectFn const & fn) const { auto const isolinesPath = topography_generator::GetIsolinesFilePath(countryName, m_isolinesDir); @@ -56,24 +62,22 @@ void IsolineFeaturesGenerator::GenerateIsolines(std::string const & countryName, auto const altitude = levelIsolines.first; auto const isolineName = GetIsolineName(altitude); auto const isolineType = GetIsolineType(altitude); - if (isolineType.empty()) + if (isolineType == kInvalidType) { LOG(LWARNING, ("Skip unsupported altitudes level", altitude, "in", countryName)); continue; } - auto const type = classif().GetTypeByPath({"isoline", isolineType}); for (auto const & isoline : levelIsolines.second) { feature::FeatureBuilder fb; - fb.SetLinear(); for (auto const & pt : isoline) fb.AddPoint(pt); - - fb.AddType(type); + fb.AddType(isolineType); if (!isolineName.empty()) fb.AddName("default", isolineName); - fbs.emplace_back(std::move(fb)); + fb.SetLinear(); + fn(std::move(fb)); } } } diff --git a/generator/isolines_generator.hpp b/generator/isolines_generator.hpp index 6026a8c9cb..3f0b6631e4 100644 --- a/generator/isolines_generator.hpp +++ b/generator/isolines_generator.hpp @@ -2,7 +2,9 @@ #include "generator/feature_builder.hpp" +#include #include +#include namespace generator { @@ -11,10 +13,13 @@ class IsolineFeaturesGenerator public: explicit IsolineFeaturesGenerator(std::string const & isolinesDir); - void GenerateIsolines(std::string const & countryName, - std::vector & fbs) const; + using FeaturesCollectFn = std::function; + void GenerateIsolines(std::string const & countryName, FeaturesCollectFn const & fn) const; private: + uint32_t GetIsolineType(int altitude) const; + std::string m_isolinesDir; + std::unordered_map m_altClassToType; }; } // namespace generator diff --git a/generator/raw_generator.cpp b/generator/raw_generator.cpp index b6668a590d..f32d54e303 100644 --- a/generator/raw_generator.cpp +++ b/generator/raw_generator.cpp @@ -111,8 +111,8 @@ RawGenerator::FinalProcessorPtr RawGenerator::CreateCountryFinalProcessor(bool a { auto finalProcessor = make_shared(m_genInfo.m_targetDir, m_genInfo.m_tmpDir, - m_genInfo.m_isolinesDir, m_genInfo.m_haveBordersForWholeWorld, m_threadsCount); + finalProcessor->SetIsolinesDir(m_genInfo.m_isolinesDir); finalProcessor->SetBooking(m_genInfo.m_bookingDataFilename); finalProcessor->SetCitiesAreas(m_genInfo.GetIntermediateFileName(CITIES_AREAS_TMP_FILENAME)); finalProcessor->SetPromoCatalog(m_genInfo.m_promoCatalogCitiesFilename);