diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index 7e759bd037..3de0346048 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt @@ -124,7 +124,6 @@ set( osm_o5m_source.hpp osm_source.cpp osm_xml_source.hpp - place_node.hpp place_processor.cpp place_processor.hpp platform_helpers.cpp @@ -207,6 +206,7 @@ set( translator_world.hpp translators_pool.cpp translators_pool.hpp + tree_node.hpp type_helper.cpp type_helper.hpp ugc_db.cpp diff --git a/generator/complex_generator/complex_generator.cpp b/generator/complex_generator/complex_generator.cpp index ee2ca24590..7c0d60be04 100644 --- a/generator/complex_generator/complex_generator.cpp +++ b/generator/complex_generator/complex_generator.cpp @@ -100,7 +100,7 @@ MAIN_WITH_ERROR_HANDLING([](int argc, char ** argv) { if (FLAGS_debug) { finalProcessor->SetPrintFunction( - static_cast( + static_cast( generator::hierarchy::DebugPrint)); } rawGenerator.GenerateCustom(translator, finalProcessor); diff --git a/generator/final_processor_intermediate_mwm.cpp b/generator/final_processor_intermediate_mwm.cpp index 36d78e6477..7da6546fa9 100644 --- a/generator/final_processor_intermediate_mwm.cpp +++ b/generator/final_processor_intermediate_mwm.cpp @@ -546,7 +546,7 @@ std::shared_ptr ComplexFinalProcessor::CreateE void ComplexFinalProcessor::Process() { ThreadPool pool(m_threadsCount); - std::vector>> futures; + std::vector>> futures; ForEachCountry(m_mwmTmpPath, [&](auto const & filename) { auto future = pool.Submit([&, filename]() { auto countryName = filename; @@ -567,7 +567,7 @@ void ComplexFinalProcessor::Process() }); futures.emplace_back(std::move(future)); }); - std::vector allLines; + std::vector allLines; for (auto & f : futures) { auto const lines = f.get(); @@ -576,7 +576,7 @@ void ComplexFinalProcessor::Process() WriteLines(allLines); } -void ComplexFinalProcessor::WriteLines(std::vector const & lines) +void ComplexFinalProcessor::WriteLines(std::vector const & lines) { std::ofstream stream; stream.exceptions(std::fstream::failbit | std::fstream::badbit); diff --git a/generator/final_processor_intermediate_mwm.hpp b/generator/final_processor_intermediate_mwm.hpp index e041e4dc1e..de91b0c26b 100644 --- a/generator/final_processor_intermediate_mwm.hpp +++ b/generator/final_processor_intermediate_mwm.hpp @@ -141,7 +141,7 @@ public: private: std::shared_ptr CreateEnricher( std::string const & countryName) const; - void WriteLines(std::vector const & lines); + void WriteLines(std::vector const & lines); hierarchy::PrintFunction m_printFunction = hierarchy::PrintDefault; std::string m_mwmTmpPath; diff --git a/generator/hierarchy.cpp b/generator/hierarchy.cpp index 4b87cc1dc1..aad80bd263 100644 --- a/generator/hierarchy.cpp +++ b/generator/hierarchy.cpp @@ -53,7 +53,7 @@ uint32_t GetTypeDefault(FeatureParams::Types const &) { return ftype::GetEmptyVa std::string GetNameDefault(StringUtf8Multilang const &) { return {}; } -std::string PrintDefault(HierarchyLine const &) { return {}; } +std::string PrintDefault(HierarchyEntry const &) { return {}; } HierarchyPlace::HierarchyPlace(FeatureBuilder const & fb) : m_id(MakeCompositeId(fb)) @@ -145,8 +145,7 @@ HierarchyLinker::Node::PtrList HierarchyLinker::Link() if (!parentPlace) continue; - parentPlace->AddChild(node); - node->SetParent(parentPlace); + tree_node::Link(node, parentPlace); } return m_nodes; } @@ -206,7 +205,7 @@ boost::optional HierarchyLineEnricher::GetFeatureCenter(CompositeId return ftPtr ? feature::GetCenter(*ftPtr) : boost::optional(); } -std::string DebugPrint(HierarchyLine const & line) +std::string DebugPrint(HierarchyEntry const & line) { std::stringstream stream; stream << std::fixed << std::setprecision(7); @@ -243,9 +242,9 @@ void HierarchyLinesBuilder::SetHierarchyLineEnricher( m_enricher = enricher; } -std::vector HierarchyLinesBuilder::GetHierarchyLines() +std::vector HierarchyLinesBuilder::GetHierarchyLines() { - std::vector lines; + std::vector lines; lines.reserve(m_nodes.size()); std::transform(std::cbegin(m_nodes), std::cend(m_nodes), std::back_inserter(lines), [&](auto const & n) { return Transform(n); }); @@ -262,9 +261,9 @@ m2::PointD HierarchyLinesBuilder::GetCenter(HierarchyBuilder::Node::Ptr const & return optCenter ? *optCenter : data.GetCenter(); } -HierarchyLine HierarchyLinesBuilder::Transform(HierarchyBuilder::Node::Ptr const & node) +HierarchyEntry HierarchyLinesBuilder::Transform(HierarchyBuilder::Node::Ptr const & node) { - HierarchyLine line; + HierarchyEntry line; auto const & data = node->GetData(); line.m_id = data.GetCompositeId(); auto const parent = node->GetParent(); @@ -300,7 +299,7 @@ uint32_t GetMainType(FeatureParams::Types const & types) std::string GetName(StringUtf8Multilang const & str) { return GetRussianName(str); } -std::string Print(HierarchyLine const & line) +std::string Print(HierarchyEntry const & line) { std::stringstream stream; stream << std::fixed << std::setprecision(7); diff --git a/generator/hierarchy.hpp b/generator/hierarchy.hpp index 86c11e0726..bc7873c2a0 100644 --- a/generator/hierarchy.hpp +++ b/generator/hierarchy.hpp @@ -2,8 +2,8 @@ #include "generator/feature_builder.hpp" #include "generator/gen_mwm_info.hpp" -#include "generator/place_node.hpp" #include "generator/platform_helpers.hpp" +#include "generator/tree_node.hpp" #include "generator/utils.hpp" #include "indexer/classificator.hpp" @@ -31,16 +31,16 @@ namespace generator { namespace hierarchy { -struct HierarchyLine; +struct HierarchyEntry; using GetMainType = std::function; using GetName = std::function; -using PrintFunction = std::function; +using PrintFunction = std::function; // These are dummy functions. uint32_t GetTypeDefault(FeatureParams::Types const &); std::string GetNameDefault(StringUtf8Multilang const &); -std::string PrintDefault(HierarchyLine const &); +std::string PrintDefault(HierarchyEntry const &); // The HierarchyPlace class is an abstraction of FeatureBuilder to build a hierarchy of objects. // It allows you to work with the geometry of points and areas. @@ -78,7 +78,7 @@ private: class HierarchyLinker { public: - using Node = PlaceNode; + using Node = tree_node::TreeNode; using Tree4d = m4::Tree; explicit HierarchyLinker(Node::PtrList && nodes); @@ -128,7 +128,7 @@ private: }; // Intermediate view for hierarchy node. -struct HierarchyLine +struct HierarchyEntry { CompositeId m_id; boost::optional m_parentId; @@ -139,7 +139,7 @@ struct HierarchyLine uint32_t m_type = ftype::GetEmptyValue(); }; -std::string DebugPrint(HierarchyLine const & line); +std::string DebugPrint(HierarchyEntry const & line); class HierarchyLinesBuilder { @@ -151,11 +151,11 @@ public: void SetCountryName(std::string const & name); void SetHierarchyLineEnricher(std::shared_ptr const & enricher); - std::vector GetHierarchyLines(); + std::vector GetHierarchyLines(); private: m2::PointD GetCenter(HierarchyBuilder::Node::Ptr const & node); - HierarchyLine Transform(HierarchyBuilder::Node::Ptr const & node); + HierarchyEntry Transform(HierarchyBuilder::Node::Ptr const & node); HierarchyBuilder::Node::PtrList m_nodes; GetMainType m_getMainType = GetTypeDefault; @@ -168,7 +168,7 @@ namespace popularity { uint32_t GetMainType(FeatureParams::Types const & types); std::string GetName(StringUtf8Multilang const & str); -std::string Print(HierarchyLine const & line); +std::string Print(HierarchyEntry const & line); } // namespace popularity } // namespace hierarchy } // namespace generator diff --git a/generator/place_node.hpp b/generator/place_node.hpp deleted file mode 100644 index 902bc5e506..0000000000 --- a/generator/place_node.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace generator -{ -template -class PlaceNode; - -namespace place_node_types -{ -template -using Ptr = std::shared_ptr>; - -template -using WeakPtr = std::weak_ptr>; - -template -using PtrList = std::vector>; -} // place_node_types - -// This is a tree node, where each node can have many children. Now it is used to build a hierarchy -// of places. -template -class PlaceNode -{ -public: - using Ptr = place_node_types::Ptr; - using WeakPtr = place_node_types::WeakPtr; - using PtrList = place_node_types::PtrList; - - explicit PlaceNode(Data && data) : m_data(std::move(data)) {} - - void AddChild(Ptr child) { m_children.push_back(child); } - void SetParent(Ptr parent) { m_parent = parent; } - void SetChildren(PtrList && children) { m_children = std::move(children); } - void RemoveChildren() { m_children.clear(); } - - bool HasChildren() const { return !m_children.empty(); } - bool HasParent() const { return m_parent.lock() != nullptr; } - - PtrList const & GetChildren() const { return m_children; } - PtrList & GetChildren() { return m_children; } - Ptr GetParent() const { return m_parent.lock(); } - Data & GetData() { return m_data; } - Data const & GetData() const { return m_data; } - -private: - Data m_data; - PtrList m_children; - WeakPtr m_parent; -}; - -template -size_t GetDepth(place_node_types::Ptr node) -{ - size_t depth = 0; - while (node) - { - node = node->GetParent(); - ++depth; - } - return depth; -} - -template -void Visit(place_node_types::Ptr const & tree, Visitor && visitor) -{ - visitor(tree); - for (auto const & subtree : tree->GetChildren()) - Visit(subtree, visitor); -} -} // namespace generator diff --git a/generator/tree_node.hpp b/generator/tree_node.hpp new file mode 100644 index 0000000000..c04bd6731c --- /dev/null +++ b/generator/tree_node.hpp @@ -0,0 +1,79 @@ +#pragma once + +#include +#include +#include +#include + +#include "base/stl_helpers.hpp" + +namespace tree_node +{ +template +class TreeNode; + +namespace types +{ +template +using Ptr = std::shared_ptr>; + +template +using WeakPtr = std::weak_ptr>; + +template +using PtrList = std::vector>; +} // namespace types + +template +class TreeNode +{ +public: + using Ptr = types::Ptr; + using WeakPtr = types::WeakPtr; + using PtrList = types::PtrList; + + explicit TreeNode(Data && data) : m_data(std::move(data)) {} + + bool HasChildren() const { return !m_children.empty(); } + PtrList const & GetChildren() const { return m_children; } + void AddChild(Ptr const & child) { m_children.push_back(child); } + void AddChildren(PtrList && children) + { + std::move(std::begin(children), std::end(children), std::end(m_children)); + } + + void SetChildren(PtrList && children) { m_children = std::move(children); } + void RemoveChildren() { m_children.clear(); } + + bool HasParent() const { return m_parent.lock() != nullptr; } + Ptr GetParent() const { return m_parent.lock(); } + void SetParent(Ptr const & parent) { m_parent = parent; } + + Data & GetData() { return m_data; } + Data const & GetData() const { return m_data; } + +private: + Data m_data; + PtrList m_children; + WeakPtr m_parent; +}; + +template +void Link(types::Ptr const & node, types::Ptr const & parent) +{ + parent->AddChild(node); + node->SetParent(parent); +} + +template +size_t GetDepth(types::Ptr node) +{ + size_t depth = 0; + while (node) + { + node = node->GetParent(); + ++depth; + } + return depth; +} +} // namespace tree_node