From beae763e57f9531be258c61fea080f24dda5b713 Mon Sep 17 00:00:00 2001 From: Joachim Faulhaber Date: Fri, 19 May 2023 19:42:27 +0200 Subject: [PATCH] Fixed issues 20 and 25. The empty interval is unordered wrt. non emtpy ones and does not intersect --- include/boost/icl/concept/interval.hpp | 29 +++++++++++++++---- .../boost/icl/concept/interval_associator.hpp | 2 +- test/fix_tickets_/fix_tickets.cpp | 15 ++++++++++ test/test_icl_interval_shared.hpp | 5 ++-- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/include/boost/icl/concept/interval.hpp b/include/boost/icl/concept/interval.hpp index 91afe4f..7831908 100644 --- a/include/boost/icl/concept/interval.hpp +++ b/include/boost/icl/concept/interval.hpp @@ -909,11 +909,9 @@ template typename boost::enable_if, bool>::type operator < (const Type& left, const Type& right) { - if(icl::is_empty(left)) - return !icl::is_empty(right); - else - return lower_less(left,right) - || (lower_equal(left,right) && upper_less(left,right)); + return (!icl::is_empty(left) && !icl::is_empty(right)) + && ( lower_less(left,right) + || (lower_equal(left,right) && upper_less(left,right)) ); } template @@ -923,6 +921,27 @@ operator > (const Type& left, const Type& right) return right < left; } +//- operator <= ---------------------------------------------------------------- +template +inline typename boost::enable_if, bool>::type +operator <= (const Type& left, const Type& right) +{ + if(icl::is_empty(left) || icl::is_empty(right)) + return false; + + return !(left > right); +} + +template +inline typename boost::enable_if, bool>::type +operator >= (const Type& left, const Type& right) +{ + if(icl::is_empty(left) || icl::is_empty(right)) + return false; + + return !(left < right); +} + //------------------------------------------------------------------------------ diff --git a/include/boost/icl/concept/interval_associator.hpp b/include/boost/icl/concept/interval_associator.hpp index 12377bb..37c92b1 100644 --- a/include/boost/icl/concept/interval_associator.hpp +++ b/include/boost/icl/concept/interval_associator.hpp @@ -902,7 +902,7 @@ typename enable_if bool>::type intersects(const Type& left, const CoType& right) { - return icl::find(left, right) != left.end(); + return !is_empty(right) && icl::find(left, right) != left.end(); } diff --git a/test/fix_tickets_/fix_tickets.cpp b/test/fix_tickets_/fix_tickets.cpp index 0232c31..ff67046 100644 --- a/test/fix_tickets_/fix_tickets.cpp +++ b/test/fix_tickets_/fix_tickets.cpp @@ -234,3 +234,18 @@ BOOST_AUTO_TEST_CASE(test_ticket_12926) BOOST_CHECK_EQUAL(a.size(), 200); } +BOOST_AUTO_TEST_CASE(github_25_intersects_for_empty_interval_throws) +{ + typedef boost::icl::interval_set ItvSet; + typedef ItvSet::interval_type Itv; + ItvSet itv_set(Itv::right_open(2,7)); + BOOST_CHECK_EQUAL(false, intersects(itv_set, Itv::right_open(3,3))); + ItvSet mt_set; + BOOST_CHECK_EQUAL(false, intersects(mt_set, Itv::right_open(3,3))); + BOOST_CHECK_EQUAL(false, intersects(mt_set, Itv::right_open(3,5))); + mt_set.insert(Itv::right_open(0,0)); + ItvSet mt_set2; // + BOOST_CHECK_EQUAL(mt_set, mt_set2); + BOOST_CHECK_EQUAL(false, intersects(mt_set, Itv::right_open(-1,-1))); +} + diff --git a/test/test_icl_interval_shared.hpp b/test/test_icl_interval_shared.hpp index bef5faa..239c23d 100644 --- a/test/test_icl_interval_shared.hpp +++ b/test/test_icl_interval_shared.hpp @@ -126,8 +126,9 @@ void interval_less_4_integral_types() BOOST_CHECK_EQUAL(icl::interval::open(v2,v3) < icl::interval::right_open(v7,v7), false); BOOST_CHECK_EQUAL(icl::interval::left_open(v3,v3) < icl::interval::closed(v7,v3), false); - BOOST_CHECK_EQUAL(IntervalT() < IntervalT(v3,v4), true); - BOOST_CHECK_EQUAL(icl::interval::open(v2,v3) < icl::interval::right_open(v7,v8), true); + BOOST_CHECK_EQUAL(IntervalT() < IntervalT(v3,v4), false); + BOOST_CHECK_EQUAL(icl::interval::open(v2,v3) < icl::interval::right_open(v7,v8), false); + BOOST_CHECK_NE (icl::interval::open(v2,v3), icl::interval::right_open(v7,v8)); //I: (I)nside = closed bound //C: left open bound