diff --git a/generator/intermediate_elements.hpp b/generator/intermediate_elements.hpp index 80ea3e34d9..b05aefee26 100644 --- a/generator/intermediate_elements.hpp +++ b/generator/intermediate_elements.hpp @@ -39,7 +39,7 @@ struct WayElement } template - void ForEachPointOrdered(uint64_t start, ToDo & toDo) + void ForEachPointOrdered(uint64_t start, ToDo && toDo) { ASSERT(!nodes.empty(), ()); if (start == nodes.front()) diff --git a/generator/ways_merger.hpp b/generator/ways_merger.hpp index ade65f07a6..f1080de616 100644 --- a/generator/ways_merger.hpp +++ b/generator/ways_merger.hpp @@ -7,42 +7,15 @@ #include "std/vector.hpp" #include "std/shared_ptr.hpp" - template class AreaWayMerger { + using TPointSeq = vector; + using TWayMap = multimap>; + using TWayMapIterator = TWayMap::iterator; + THolder & m_holder; - - typedef vector pts_vec_t; - - static bool IsValidAreaPath(pts_vec_t const & pts) - { - return (pts.size() > 2 && pts.front() == pts.back()); - } - - bool GetPoint(uint64_t id, m2::PointD & pt) const - { - return m_holder.GetNode(id, pt.y, pt.x); - } - - class process_points - { - AreaWayMerger * m_pMain; - - public: - pts_vec_t m_vec; - - process_points(AreaWayMerger * pMain) : m_pMain(pMain) {} - void operator()(uint64_t id) - { - m2::PointD pt; - if (m_pMain->GetPoint(id, pt)) - m_vec.push_back(pt); - } - }; - - typedef multimap > way_map_t; - way_map_t m_map; + TWayMap m_map; public: AreaWayMerger(THolder & holder) : m_holder(holder) {} @@ -62,14 +35,12 @@ public: { while (!m_map.empty()) { - typedef way_map_t::iterator iter_t; - // start - iter_t i = m_map.begin(); + TWayMapIterator i = m_map.begin(); uint64_t id = i->first; - process_points process(this); vector ids; + TPointSeq points; do { @@ -77,13 +48,19 @@ public: shared_ptr e = i->second; if (collectID) ids.push_back(e->m_wayOsmId); - e->ForEachPointOrdered(id, process); + + e->ForEachPointOrdered(id, [this, &points](uint64_t id) + { + m2::PointD pt; + if (m_holder.GetNode(id, pt.y, pt.x)) + points.push_back(pt); + }); m_map.erase(i); // next 'id' to process id = e->GetOtherEndPoint(id); - pair r = m_map.equal_range(id); + pair r = m_map.equal_range(id); // finally erase element 'e' and find next way in chain i = r.second; @@ -92,17 +69,15 @@ public: if (r.first->second == e) m_map.erase(r.first++); else - { - i = r.first; - ++r.first; - } + i = r.first++; } - if (i == r.second) break; + if (i == r.second) + break; } while (true); - if (IsValidAreaPath(process.m_vec)) - toDo(process.m_vec, ids); + if ((points.size() > 2 && points.front() == points.back())) + toDo(points, ids); } } };