diff --git a/include/interval-tree/interval_tree.hpp b/include/interval-tree/interval_tree.hpp index abdbdd0..28860bd 100644 --- a/include/interval-tree/interval_tree.hpp +++ b/include/interval-tree/interval_tree.hpp @@ -347,7 +347,7 @@ namespace lib_interval_tree */ value_type operator-(interval const& other) const { - interval_kind::distance(*this, other); + return interval_kind::distance(*this, other); } /** diff --git a/tests/interval_tests.hpp b/tests/interval_tests.hpp index fa71526..4bb21ad 100644 --- a/tests/interval_tests.hpp +++ b/tests/interval_tests.hpp @@ -549,6 +549,27 @@ TEST_F(DistanceTests, DistanceAdjacent2) EXPECT_EQ(base5 - other5, 0); } +TEST_F(DistanceTests, DynamicDistance) +{ + constexpr auto c = interval_border::closed; + constexpr auto ca = interval_border::closed_adjacent; + + // Regression: interval::operator- used to drop its return statement. + EXPECT_EQ(i(1, 5, c, c) - i(7, 9, c, c), 2); + + // right side: + EXPECT_EQ(i(5, 10, c, c) - i(15, 18, c, c), 5); + + // left side: + EXPECT_EQ(i(5, 10, c, c) - i(0, 1, c, c), 4); + + // overlapping and adjacent intervals have no distance: + EXPECT_EQ(i(-35, 96, c, c) - i(-20, 600, c, c), 0); + EXPECT_EQ(i(5, 10, c, c) - i(10, 18, c, c), 0); + EXPECT_EQ(i(5, 10, c, c) - i(0, 5, c, c), 0); + EXPECT_EQ(i(0, 5, c, ca) - i(6, 10, ca, c), 0); +} + TEST_F(OverlapTests, DynamicOverlapContainedCompletely) { auto containment = i(-100, 100, interval_border::closed, interval_border::closed);