From 99e0205996e9b0b5cdd9933540e5d5a9f081c921 Mon Sep 17 00:00:00 2001 From: Maksim Andrianov Date: Thu, 21 Nov 2019 17:34:19 +0300 Subject: [PATCH] [generator] Fixed GetFeatureId(CompositeId const & id). --- generator/gen_mwm_info.cpp | 14 +++++----- generator/gen_mwm_info.hpp | 2 +- .../generator_tests/gen_mwm_info_tests.cpp | 26 +++++++++++++++--- generator/hierarchy.cpp | 27 ++++++++++++++++--- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/generator/gen_mwm_info.cpp b/generator/gen_mwm_info.cpp index 9dbfe004e1..53cf465f44 100644 --- a/generator/gen_mwm_info.cpp +++ b/generator/gen_mwm_info.cpp @@ -41,15 +41,15 @@ void OsmID2FeatureID::AddIds(CompositeId const & osmId, uint32_t featureId) m_data.emplace_back(osmId, featureId); } -boost::optional OsmID2FeatureID::GetFeatureId(CompositeId const & id) const +std::vector OsmID2FeatureID::GetFeatureIds(CompositeId const & id) const { - auto const it = std::lower_bound(std::cbegin(m_data), std::cend(m_data), id, - [](auto const & l, auto const & r) { return l.first < r; }); - if (it == std::cend(m_data) || it->first != id) - return {}; + std::vector ids; + auto it = std::lower_bound(std::cbegin(m_data), std::cend(m_data), id, + [](auto const & l, auto const & r) { return l.first < r; }); + while (it != std::cend(m_data) && it->first == id) + ids.emplace_back((it++)->second); - CHECK_NOT_EQUAL(std::next(it)->first, id, (id)); - return it->second; + return ids; } std::vector OsmID2FeatureID::GetFeatureIds(base::GeoObjectId mainId) const diff --git a/generator/gen_mwm_info.hpp b/generator/gen_mwm_info.hpp index 49c94a8f65..adcd8d1538 100644 --- a/generator/gen_mwm_info.hpp +++ b/generator/gen_mwm_info.hpp @@ -37,7 +37,7 @@ public: bool ReadFromFile(std::string const & filename); void AddIds(CompositeId const & osmId, uint32_t featureId); - boost::optional GetFeatureId(CompositeId const & id) const; + std::vector GetFeatureIds(CompositeId const & id) const; std::vector GetFeatureIds(base::GeoObjectId mainId) const; Version GetVersion() const; diff --git a/generator/generator_tests/gen_mwm_info_tests.cpp b/generator/generator_tests/gen_mwm_info_tests.cpp index 8f5ed0c44f..d6212a90e2 100644 --- a/generator/generator_tests/gen_mwm_info_tests.cpp +++ b/generator/generator_tests/gen_mwm_info_tests.cpp @@ -57,10 +57,28 @@ UNIT_TEST(OsmID2FeatureID_GetFeatureId) }; TEST_EQUAL(mapping.GetFeatureIds(kCid1.m_additionalId), answer, ()); } - TEST_EQUAL(*mapping.GetFeatureId(kCid1), kId1, ()); - TEST_EQUAL(*mapping.GetFeatureId(kCid2), kId2, ()); - TEST_EQUAL(*mapping.GetFeatureId(kCid3), kId3, ()); - TEST(!mapping.GetFeatureId(generator::CompositeId(base::GeoObjectId())), ()); + { + std::vector const answer{ + kId1, + }; + TEST_EQUAL(mapping.GetFeatureIds(kCid1), answer, ()); + } + { + std::vector const answer{ + kId2 + }; + TEST_EQUAL(mapping.GetFeatureIds(kCid3), answer, ()); + } + { + std::vector const answer{ + kId3, + }; + TEST_EQUAL(mapping.GetFeatureIds(kCid3), answer, ()); + } + { + std::vector const answer; + TEST_EQUAL(mapping.GetFeatureIds(generator::CompositeId(base::GeoObjectId())), answer, ()); + } } UNIT_TEST(OsmID2FeatureID_ReadWrite) diff --git a/generator/hierarchy.cpp b/generator/hierarchy.cpp index 94d5182fff..de1e96210c 100644 --- a/generator/hierarchy.cpp +++ b/generator/hierarchy.cpp @@ -6,6 +6,7 @@ #include "geometry/rect2d.hpp" #include "base/assert.hpp" + #include #include #include @@ -192,12 +193,30 @@ HierarchyLineEnricher::HierarchyLineEnricher(std::string const & osm2FtIdsPath, boost::optional HierarchyLineEnricher::GetFeatureCenter(CompositeId const & id) const { - auto const optId = m_osm2FtIds.GetFeatureId(id); - if (!optId) + auto const optIds = m_osm2FtIds.GetFeatureIds(id); + if (optIds.empty()) return {}; - auto const ftPtr = m_featureGetter.GetFeatureByIndex(*optId); - return ftPtr ? feature::GetCenter(*ftPtr) : boost::optional(); + std::unordered_map, m2::PointD> m; + for (auto optId : optIds) + { + auto const ftPtr = m_featureGetter.GetFeatureByIndex(optId); + if (!ftPtr) + continue; + + m.emplace(base::Underlying(ftPtr->GetGeomType()), feature::GetCenter(*ftPtr)); + } + + for (auto type : { + base::Underlying(feature::GeomType::Point), + base::Underlying(feature::GeomType::Area), + base::Underlying(feature::GeomType::Line)}) + { + if (m.count(type) != 0) + return m[type]; + } + + return {}; } HierarchyLinesBuilder::HierarchyLinesBuilder(HierarchyBuilder::Node::Ptrs && nodes)