From 1683da3225d0cbed3bb6238fd292fa288f6a32d6 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 11 Jul 2018 22:32:51 +0300 Subject: [core] coveredByChildren is false if at least one child is uncovered --- src/mbgl/algorithm/covered_by_children.hpp | 16 ++++++++--- test/algorithm/covered_by_children.test.cpp | 44 ++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/mbgl/algorithm/covered_by_children.hpp b/src/mbgl/algorithm/covered_by_children.hpp index ad2f1dd5dd..fe5af3f3db 100644 --- a/src/mbgl/algorithm/covered_by_children.hpp +++ b/src/mbgl/algorithm/covered_by_children.hpp @@ -8,15 +8,23 @@ namespace algorithm { template bool coveredByChildren(const UnwrappedTileID& id, Iterator it, const Iterator& end) { for (const auto& child : id.children()) { - it = std::lower_bound(it, end, child, [](auto& a, auto& b) { return std::get<0>(a) < b; }); + it = std::lower_bound(it, end, child, [](const auto& a, const auto& b) { return std::get<0>(a) < b; }); + + // Child is not present, neither its grandchildren. if (it == end) { return false; - } else if (std::get<0>(*it) != child) { - return coveredByChildren(child, it, end); + } + + // Child is not present, but its grandchildren are. + if (std::get<0>(*it) != child) { + // This child is not covered by its grandchildren. + if (!coveredByChildren(child, it, end)) { + return false; + } } } - // We looked at all four immediate children and verified that they're covered. + // We looked at all four children (recursively) and verified that they're covered. return true; } diff --git a/test/algorithm/covered_by_children.test.cpp b/test/algorithm/covered_by_children.test.cpp index b2a219bf29..84f5aa6a21 100644 --- a/test/algorithm/covered_by_children.test.cpp +++ b/test/algorithm/covered_by_children.test.cpp @@ -8,6 +8,48 @@ using namespace mbgl; using List = std::map; +TEST(CoveredByChildren, GrandChildren) { + const List list { + { UnwrappedTileID{ 0, 0, 0 }, true }, + // These grandchildren covers 1/0/0, but 1/0/0 only covers a quarter of + // 0/0/0. + { UnwrappedTileID{ 2, 0, 0 }, true }, + { UnwrappedTileID{ 2, 0, 1 }, true }, + { UnwrappedTileID{ 2, 1, 0 }, true }, + { UnwrappedTileID{ 2, 1, 1 }, true }, + }; + EXPECT_FALSE(algorithm::coveredByChildren(UnwrappedTileID{ 0, 0, 0 }, list)); + + const List list2 { + { UnwrappedTileID{ 0, 0, 0 }, true }, + + // Children of 1/0/0 + { UnwrappedTileID{ 2, 0, 0 }, true }, + { UnwrappedTileID{ 2, 0, 1 }, true }, + { UnwrappedTileID{ 2, 1, 0 }, true }, + { UnwrappedTileID{ 2, 1, 1 }, true }, + + // Children of 1/0/1 + { UnwrappedTileID{ 2, 0, 2 }, true }, + { UnwrappedTileID{ 2, 0, 3 }, true }, + { UnwrappedTileID{ 2, 1, 2 }, true }, + { UnwrappedTileID{ 2, 1, 3 }, true }, + + // Children of 1/1/0 + { UnwrappedTileID{ 2, 2, 0 }, true }, + { UnwrappedTileID{ 2, 2, 1 }, true }, + { UnwrappedTileID{ 2, 3, 0 }, true }, + { UnwrappedTileID{ 2, 3, 1 }, true }, + + // Children of 1/0/1 + { UnwrappedTileID{ 2, 2, 2 }, true }, + { UnwrappedTileID{ 2, 2, 3 }, true }, + { UnwrappedTileID{ 2, 3, 2 }, true }, + { UnwrappedTileID{ 2, 3, 3 }, true }, + }; + EXPECT_TRUE(algorithm::coveredByChildren(UnwrappedTileID{ 0, 0, 0 }, list2)); +} + TEST(CoveredByChildren, NotCovered) { const List list1; EXPECT_FALSE(algorithm::coveredByChildren(UnwrappedTileID{ 0, 0, 0 }, list1)); @@ -24,7 +66,7 @@ TEST(CoveredByChildren, NotCovered) { const List list3{ { UnwrappedTileID{ 0, 0, 0 }, true }, - // all four child tiles, with with a different wrap index + // all four child tiles, with a different wrap index { UnwrappedTileID{ 1, { 1, 0, 0 } }, true }, { UnwrappedTileID{ 1, { 1, 0, 1 } }, true }, { UnwrappedTileID{ 1, { 1, 1, 0 } }, true }, -- cgit v1.2.1