diff --git a/include/interval-tree/interval_types.hpp b/include/interval-tree/interval_types.hpp index 10bbefa..7e1238b 100644 --- a/include/interval-tree/interval_types.hpp +++ b/include/interval-tree/interval_types.hpp @@ -414,13 +414,15 @@ namespace lib_interval_tree closed::overlaps(closedEquiv1.low(), closedEquiv1.high(), closedEquiv2.low(), closedEquiv2.high()); if (!closedOverlap) { - if (closedEquiv1.high() + 1 == closedEquiv2.low() && + if (/*closedEquiv1.high() != std::numeric_limits::max() && */ + closedEquiv1.high() + 1 == closedEquiv2.low() && (ival1.right_border() == interval_border::closed_adjacent || ival2.left_border() == interval_border::closed_adjacent)) { return true; } - if (closedEquiv2.high() + 1 == closedEquiv1.low() && + if (/*closedEquiv2.high() != std::numeric_limits::max() && */ + closedEquiv2.high() + 1 == closedEquiv1.low() && (ival2.right_border() == interval_border::closed_adjacent || ival1.left_border() == interval_border::closed_adjacent)) { diff --git a/tests/interval_tests.hpp b/tests/interval_tests.hpp index f0c94aa..b3b5829 100644 --- a/tests/interval_tests.hpp +++ b/tests/interval_tests.hpp @@ -291,6 +291,62 @@ TEST_F(OverlapTests, LeftOverlapTests) EXPECT_FALSE(i(0, 5).overlaps({-6, -2})); } +TEST_F(OverlapTests, LimitOverlapTests) +{ + using lib_interval_tree::open; + const MIN = std::numeric_limits::min(); + const MAX = std::numeric_limits::max(); + + // one min + EXPECT_TRUE(i(MIN, 5).overlaps({3, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({3, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({3, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({3, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({3, 16})); + + // one max + EXPECT_TRUE(i(0, 5).overlaps({3, MAX})); + EXPECT_TRUE(i(0, 5).overlaps({3, MAX})); + EXPECT_TRUE(i(0, 5).overlaps({3, MAX})); + EXPECT_TRUE(i(0, 5).overlaps({3, MAX})); + EXPECT_TRUE(i(0, 5).overlaps({3, MAX})); + + // both min + EXPECT_TRUE(i(MIN, 5).overlaps({MIN, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({MIN, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({MIN, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({MIN, 16})); + EXPECT_TRUE(i(MIN, 5).overlaps({MIN, 16})); + + // both max + EXPECT_TRUE(i(0, MAX).overlaps({3, MAX})); + EXPECT_TRUE(i(0, MAX).overlaps({3, MAX})); + EXPECT_TRUE(i(0, MAX).overlaps({3, MAX})); + EXPECT_TRUE(i(0, MAX).overlaps({3, MAX})); + EXPECT_TRUE(i(0, MAX).overlaps({3, MAX})); + + // min-max overlap + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 3})); + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 3})); + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 3})); + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 3})); + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 3})); + + // min-max closed overlap + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 0})); + EXPECT_FALSE(i(0, MAX).overlaps({MIN, 0})); + EXPECT_FALSE(i(0, MAX).overlaps({MIN, 0})); + EXPECT_FALSE(i(0, MAX).overlaps({MIN, 0})); + EXPECT_TRUE(i(0, MAX).overlaps({MIN, 0})); + + // min-max touching + EXPECT_FALSE(i(1, MAX).overlaps({MIN, 0})); + EXPECT_FALSE(i(1, MAX).overlaps({MIN, 0})); + EXPECT_FALSE(i(1, MAX).overlaps({MIN, 0})); + EXPECT_FALSE(i(1, MAX).overlaps({MIN, 0})); + EXPECT_TRUE(i(1, MAX).overlaps({MIN, 0})); +} + TEST_F(OverlapTests, ShallEncompassCompletely) { using lib_interval_tree::open;