diff --git a/generator/osm_element.hpp b/generator/osm_element.hpp index 4a213946f7..70e34e7e69 100644 --- a/generator/osm_element.hpp +++ b/generator/osm_element.hpp @@ -105,7 +105,7 @@ protected: { // process way points shared_ptr e = i->second; - e->ForEachPoint(process); + e->ForEachPointOrdered(id, process); m.erase(i); diff --git a/indexer/feature.cpp b/indexer/feature.cpp index ab05566c40..1f4484f7e7 100644 --- a/indexer/feature.cpp +++ b/indexer/feature.cpp @@ -9,6 +9,7 @@ #include "../defines.hpp" // just for file extensions #include "../geometry/rect2d.hpp" +#include "../geometry/region2d.hpp" #include "../coding/byte_stream.hpp" @@ -47,20 +48,22 @@ void FeatureBuilder1::AddPoint(m2::PointD const & p) m_LimitRect.Add(p); } -void FeatureBuilder1::SetAreaAddHoles(list > & holes) +void FeatureBuilder1::SetAreaAddHoles(list const & holes) { m_bArea = true; + m_Holes.clear(); - m_Holes.swap(holes); + if (holes.empty()) return; - // This is filtering during osm parsing. - //for (list::iterator i = m_Holes.begin(); i != m_Holes.end();) - //{ - // if (i->size() < 3) - // i = m_Holes.erase(i); - // else - // ++i; - //} + m2::Region rgn(m_Geometry.begin(), m_Geometry.end()); + + for (list::const_iterator i = holes.begin(); i != holes.end(); ++i) + { + ASSERT ( !i->empty(), () ); + + if (rgn.Contains(i->front())) + m_Holes.push_back(*i); + } } void FeatureBuilder1::AddName(string const & name) diff --git a/indexer/feature.hpp b/indexer/feature.hpp index bf9f1bd418..a616b4a3da 100644 --- a/indexer/feature.hpp +++ b/indexer/feature.hpp @@ -36,7 +36,7 @@ public: void SetLinear() { m_bLinear = true; } /// Set that featue is area and get ownership of holes. - void SetAreaAddHoles(list > & holes); + void SetAreaAddHoles(list > const & holes); //@} void AddName(string const & name); diff --git a/indexer/osm_decl.hpp b/indexer/osm_decl.hpp index 4e39a16273..295595b61e 100644 --- a/indexer/osm_decl.hpp +++ b/indexer/osm_decl.hpp @@ -6,6 +6,8 @@ #include "../std/utility.hpp" #include "../std/vector.hpp" #include "../std/string.hpp" +#include "../std/algorithm.hpp" +#include "../std/bind.hpp" /// Used to store all world nodes inside temporary index file. @@ -77,8 +79,15 @@ struct WayElement template void ForEachPoint(ToDo & toDo) const { - for (size_t i = 0; i < nodes.size(); ++i) - toDo(nodes[i]); + for_each(nodes.begin(), nodes.end(), bind(ref(toDo), _1)); + } + + template void ForEachPointOrdered(uint64_t start, ToDo & toDo) + { + if (start == nodes.front()) + for_each(nodes.begin(), nodes.end(), bind(ref(toDo), _1)); + else + for_each(nodes.rbegin(), nodes.rend(), bind(ref(toDo), _1)); } };