From 4778c4c180e5d5e5c311942ce779cb3f6a882297 Mon Sep 17 00:00:00 2001 From: Nikita Kniazev Date: Wed, 4 Dec 2019 02:42:26 +0300 Subject: [PATCH] Fix comparison operators enabler Overloads must not be presented until both arguments are Fusion sequences. --- .../sequence/comparison/enable_comparison.hpp | 4 ++-- test/sequence/comparison.hpp | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/boost/fusion/sequence/comparison/enable_comparison.hpp b/include/boost/fusion/sequence/comparison/enable_comparison.hpp index 12794177..b65c7552 100644 --- a/include/boost/fusion/sequence/comparison/enable_comparison.hpp +++ b/include/boost/fusion/sequence/comparison/enable_comparison.hpp @@ -20,13 +20,13 @@ namespace boost { namespace fusion { namespace traits { template struct enable_equality - : mpl::or_, traits::is_sequence > + : mpl::and_, traits::is_sequence > {}; template struct enable_comparison : mpl::and_< - mpl::or_, traits::is_sequence > + traits::is_sequence, traits::is_sequence , mpl::equal_to, result_of::size > > {}; diff --git a/test/sequence/comparison.hpp b/test/sequence/comparison.hpp index 2dfe6550..2c954d0a 100644 --- a/test/sequence/comparison.hpp +++ b/test/sequence/comparison.hpp @@ -8,6 +8,20 @@ #include #include +struct not_a_fusion_container {}; +template +inline bool operator==(not_a_fusion_container, T const&) { return true; } +template +inline bool operator!=(not_a_fusion_container, T const&) { return true; } +template +inline bool operator<(not_a_fusion_container, T const&) { return true; } +template +inline bool operator<=(not_a_fusion_container, T const&) { return true; } +template +inline bool operator>(not_a_fusion_container, T const&) { return true; } +template +inline bool operator>=(not_a_fusion_container, T const&) { return true; } + void equality_test() { @@ -28,6 +42,9 @@ equality_test() BOOST_TEST(!(v1 == v5)); BOOST_TEST(v5 != v1); BOOST_TEST(!(v5 == v1)); + + BOOST_TEST(not_a_fusion_container() == v1); + BOOST_TEST(not_a_fusion_container() != v1); } void @@ -51,6 +68,11 @@ ordering_test() FUSION_SEQUENCE v5(5, 'a', true); v1 >= v5; #endif + + BOOST_TEST(not_a_fusion_container() > v1); + BOOST_TEST(not_a_fusion_container() >= v1); + BOOST_TEST(not_a_fusion_container() < v1); + BOOST_TEST(not_a_fusion_container() <= v1); }