/** * Find duplicate segments (ie same start and end point) in the * list and remove them. This will always remove pairs of the * same segment. So if there are three, for instance, two will * be removed and one will be left. */ uint32_t erase_duplicate_segments(osmium::area::ProblemReporter* problem_reporter) { uint32_t duplicate_segments = 0; while (true) { auto it = std::adjacent_find(m_segments.begin(), m_segments.end()); if (it == m_segments.end()) { break; } if (m_debug) { std::cerr << " erase duplicate segment: " << *it << "\n"; } // Only count and report duplicate segments if they // belong to the same way or if they don't both have // the role "inner". Those cases are definitely wrong. // If the duplicate segments belong to different // "inner" ways, they could be touching inner rings // which are perfectly okay. Note that for this check // the role has to be correct in the member data. if (it->way() == std::next(it)->way() || !it->role_inner() || !std::next(it)->role_inner()) { ++duplicate_segments; if (problem_reporter) { problem_reporter->report_duplicate_segment(it->first(), it->second()); } } m_segments.erase(it, it+2); } return duplicate_segments; }
/** * Find duplicate segments (ie same start and end point) in the * list and remove them. This will always remove pairs of the same * segment. So if there are three, for instance, two will be * removed and one will be left. */ void erase_duplicate_segments() { while (true) { auto it = std::adjacent_find(m_segments.begin(), m_segments.end()); if (it == m_segments.end()) { return; } if (m_debug) { std::cerr << " erase duplicate segment: " << *it << "\n"; } m_segments.erase(it, it+2); } }