From a258804a4fad640b86d7a7c6aba71a871c833b3d Mon Sep 17 00:00:00 2001 From: Maksim Andrianov Date: Thu, 5 Dec 2019 18:23:50 +0300 Subject: [PATCH] [generator] Moved code to hierarchy.hpp|cpp --- .../final_processor_intermediate_mwm.cpp | 89 ++++--------------- .../final_processor_intermediate_mwm.hpp | 5 -- generator/hierarchy.cpp | 60 +++++++++++++ generator/hierarchy.hpp | 15 ++++ 4 files changed, 91 insertions(+), 78 deletions(-) diff --git a/generator/final_processor_intermediate_mwm.cpp b/generator/final_processor_intermediate_mwm.cpp index 7c0683f27d..d69f4adc4a 100644 --- a/generator/final_processor_intermediate_mwm.cpp +++ b/generator/final_processor_intermediate_mwm.cpp @@ -656,10 +656,24 @@ void ComplexFinalProcessor::Process() // building // |_building-part // |_building-part - FlattenBuildingParts(trees); + hierarchy::FlattenBuildingParts(trees); // In the end we add objects, which were saved by the collector. if (m_buildingToParts) - AddRelationBuildingParts(trees, relationBuildingParts); + { + hierarchy::AddChildrenTo(trees, [&](auto const & compositeId) { + auto const & ids = m_buildingToParts->GetBuildingPartsByOutlineId(compositeId); + std::vector places; + places.reserve(ids.size()); + for (auto const & id : ids) + { + if (relationBuildingParts.count(id) == 0) + continue; + + places.emplace_back(hierarchy::HierarchyPlace(relationBuildingParts[id])); + } + return places; + }); + } // We create and save hierarchy lines. hierarchy::HierarchyLinesBuilder hierarchyBuilder(std::move(trees)); @@ -702,77 +716,6 @@ ComplexFinalProcessor::RemoveRelationBuildingParts(std::string const & mwmTmpFil return relationBuildingParts; } -void ComplexFinalProcessor::AddRelationBuildingParts( - hierarchy::HierarchyBuilder::Node::Ptrs & nodes, - std::unordered_map const & m) -{ - CHECK(m_buildingToParts, ()); - - hierarchy::HierarchyBuilder::Node::Ptrs newNodes; - for (auto & node : nodes) - { - if (node->HasParent()) - continue; - - tree_node::PostOrderVisit(node, [&](auto const & n) { - auto const buildingId = n->GetData().GetCompositeId(); - auto const & ids = m_buildingToParts->GetBuildingPartsByOutlineId(buildingId); - for (auto const & id : ids) - { - if (m.count(id) == 0) - continue; - - auto const newNode = tree_node::MakeTreeNode(hierarchy::HierarchyPlace(m.at(id))); - tree_node::Link(newNode, n); - newNodes.emplace_back(newNode); - } - }); - } - std::move(std::begin(newNodes), std::end(newNodes), std::back_inserter(nodes)); -} - -// static -void ComplexFinalProcessor::FlattenBuildingParts(hierarchy::HierarchyBuilder::Node::Ptrs & nodes) -{ - for (auto & node : nodes) - { - if (node->HasParent()) - continue; - - std::vector< - std::pair> - buildingPartsTrees; - - static auto const & buildingPartChecker = ftypes::IsBuildingPartChecker::Instance(); - std::function visit; - visit = [&](auto const & nd) { - if (buildingPartChecker(nd->GetData().GetTypes())) - { - CHECK(nd->HasParent(), ()); - auto building = nd->GetParent(); - buildingPartsTrees.emplace_back(building, nd); - return; - } - - CHECK(!buildingPartChecker(node->GetData().GetTypes()), ()); - for (auto const & ch : nd->GetChildren()) - visit(ch); - }; - - visit(node); - - for (auto const & buildingAndParts : buildingPartsTrees) - { - Unlink(buildingAndParts.second, buildingAndParts.first); - tree_node::PostOrderVisit(buildingAndParts.second, [&](auto const & buildingPartNode) { - CHECK(buildingPartChecker(buildingPartNode->GetData().GetTypes()), ()); - buildingPartNode->RemoveChildren(); - tree_node::Link(buildingPartNode, buildingAndParts.first); - }); - } - } -} - void ComplexFinalProcessor::WriteLines(std::vector const & lines) { std::ofstream stream; diff --git a/generator/final_processor_intermediate_mwm.hpp b/generator/final_processor_intermediate_mwm.hpp index 0d6cffca70..bb538b4f52 100644 --- a/generator/final_processor_intermediate_mwm.hpp +++ b/generator/final_processor_intermediate_mwm.hpp @@ -158,16 +158,11 @@ public: void Process() override; private: - static void FlattenBuildingParts(hierarchy::HierarchyBuilder::Node::Ptrs & nodes); - std::unique_ptr CreateEnricher( std::string const & countryName) const; void WriteLines(std::vector const & lines); std::unordered_map RemoveRelationBuildingParts( std::string const & mwmTmpFilename); - void AddRelationBuildingParts( - hierarchy::HierarchyBuilder::Node::Ptrs & nodes, - std::unordered_map const & m); hierarchy::GetMainTypeFn m_getMainType; hierarchy::PrintFn m_printFunction; diff --git a/generator/hierarchy.cpp b/generator/hierarchy.cpp index 20d36dc787..1fad76f1c5 100644 --- a/generator/hierarchy.cpp +++ b/generator/hierarchy.cpp @@ -310,5 +310,65 @@ HierarchyEntry HierarchyLinesBuilder::Transform(HierarchyBuilder::Node::Ptr cons line.m_center = GetCenter(node); return line; } + +void AddChildrenTo(HierarchyBuilder::Node::Ptrs & trees, + std::function(CompositeId const &)> const & fn) +{ + for (auto & tree : trees) + { + CHECK(!tree->HasParent(), ()); + + tree_node::PostOrderVisit(tree, [&](auto const & n) { + auto const id = n->GetData().GetCompositeId(); + auto const & places = fn(id); + for (auto place : places) + { + auto const newNode = tree_node::MakeTreeNode(std::move(place)); + tree_node::Link(newNode, n); + } + }); + } +} + +void FlattenBuildingParts(HierarchyBuilder::Node::Ptrs & trees) +{ + for (auto & tree : trees) + { + + CHECK(!tree->HasParent(), ()); + + std::vector< + std::pair> + buildingPartsTrees; + + static auto const & buildingPartChecker = ftypes::IsBuildingPartChecker::Instance(); + std::function visit; + visit = [&](auto const & n) { + if (buildingPartChecker(n->GetData().GetTypes())) + { + CHECK(n->HasParent(), ()); + auto building = n->GetParent(); + buildingPartsTrees.emplace_back(building, n); + return; + } + + CHECK(!buildingPartChecker(n->GetData().GetTypes()), ()); + for (auto const & ch : n->GetChildren()) + visit(ch); + }; + + visit(tree); + + for (auto const & buildingAndParts : buildingPartsTrees) + { + Unlink(buildingAndParts.second, buildingAndParts.first); + tree_node::PostOrderVisit(buildingAndParts.second, [&](auto const & buildingPartNode) { + CHECK(buildingPartChecker(buildingPartNode->GetData().GetTypes()), ()); + buildingPartNode->RemoveChildren(); + tree_node::Link(buildingPartNode, buildingAndParts.first); + }); + } + } +} } // namespace hierarchy } // namespace generator diff --git a/generator/hierarchy.hpp b/generator/hierarchy.hpp index 93a816402b..d4c7661feb 100644 --- a/generator/hierarchy.hpp +++ b/generator/hierarchy.hpp @@ -151,5 +151,20 @@ private: storage::CountryId m_countryName; std::unique_ptr m_enricher; }; + +// AddChildrenTo adds children to node of tree if fn returns not empty vector of HierarchyPlaces +// for node id. +void AddChildrenTo(HierarchyBuilder::Node::Ptrs & trees, + std::function(CompositeId const &)> const & fn); + +// FlattenBuildingParts transforms trees from +// building +// |_building-part +// |_building-part +// to +// building +// |_building-part +// |_building-part +void FlattenBuildingParts(HierarchyBuilder::Node::Ptrs & trees); } // namespace hierarchy } // namespace generator