diff --git a/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp b/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp index 29797ef3..aafe18d8 100644 --- a/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp +++ b/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp @@ -18,16 +18,20 @@ namespace boost { namespace fusion { namespace detail { + template + struct is_native_fusion_sequence : is_base_of {}; + template struct enable_equality - : mpl::or_, fusion::traits::is_sequence > + : mpl::or_, is_native_fusion_sequence > {}; template struct enable_comparison : mpl::and_< - mpl::or_, fusion::traits::is_sequence >, - mpl::equal_to, result_of::size > > + mpl::or_, is_native_fusion_sequence > + , mpl::equal_to, result_of::size > + > {}; }}} diff --git a/include/boost/fusion/sequence/comparison/equal_to.hpp b/include/boost/fusion/sequence/comparison/equal_to.hpp index ee04a24f..83d52dee 100644 --- a/include/boost/fusion/sequence/comparison/equal_to.hpp +++ b/include/boost/fusion/sequence/comparison/equal_to.hpp @@ -14,28 +14,34 @@ #include #include #include -#include namespace boost { namespace fusion { - namespace sequence_operators + template + inline bool + equal_to(Seq1 const& a, Seq2 const& b) + { + return result_of::size::value == result_of::size::value + && detail::sequence_equal_to< + Seq1 const, Seq2 const + , result_of::size::value == result_of::size::value>:: + call(fusion::begin(a), fusion::begin(b)); + } + + namespace operators { template - inline typename - enable_if< - detail::enable_equality - , bool + inline typename + enable_if< + detail::enable_equality + , bool >::type operator==(Seq1 const& a, Seq2 const& b) { - return result_of::size::value == result_of::size::value - && detail::sequence_equal_to< - Seq1 const, Seq2 const - , result_of::size::value == result_of::size::value>:: - call(fusion::begin(a), fusion::begin(b)); + return fusion::equal_to(a, b); } } - using sequence_operators::operator==; + using operators::operator==; }} #endif diff --git a/include/boost/fusion/sequence/comparison/greater.hpp b/include/boost/fusion/sequence/comparison/greater.hpp index becd6767..dd57ebef 100644 --- a/include/boost/fusion/sequence/comparison/greater.hpp +++ b/include/boost/fusion/sequence/comparison/greater.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #if defined(FUSION_DIRECT_OPERATOR_USAGE) #include @@ -19,18 +20,11 @@ #include #endif -#include -#include - namespace boost { namespace fusion { template - inline typename - enable_if< - detail::enable_comparison - , bool - >::type - operator>(Seq1 const& a, Seq2 const& b) + inline bool + greater(Seq1 const& a, Seq2 const& b) { #if defined(FUSION_DIRECT_OPERATOR_USAGE) return detail::sequence_greater:: @@ -39,6 +33,21 @@ namespace boost { namespace fusion return (b < a); #endif } + + namespace operators + { + template + inline typename + enable_if< + detail::enable_comparison + , bool + >::type + operator>(Seq1 const& a, Seq2 const& b) + { + return fusion::greater(a, b); + } + } + using operators::operator>; }} #endif diff --git a/include/boost/fusion/sequence/comparison/greater_equal.hpp b/include/boost/fusion/sequence/comparison/greater_equal.hpp index f73ee64f..a0b9baef 100644 --- a/include/boost/fusion/sequence/comparison/greater_equal.hpp +++ b/include/boost/fusion/sequence/comparison/greater_equal.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #if defined(FUSION_DIRECT_OPERATOR_USAGE) #include @@ -19,18 +20,11 @@ #include #endif -#include -#include - namespace boost { namespace fusion { template - inline typename - enable_if< - detail::enable_comparison - , bool - >::type - operator>=(Seq1 const& a, Seq2 const& b) + inline bool + greater_equal(Seq1 const& a, Seq2 const& b) { #if defined(FUSION_DIRECT_OPERATOR_USAGE) return detail::sequence_greater_equal:: @@ -39,6 +33,21 @@ namespace boost { namespace fusion return !(a < b); #endif } + + namespace operators + { + template + inline typename + enable_if< + detail::enable_comparison + , bool + >::type + operator>=(Seq1 const& a, Seq2 const& b) + { + return fusion::greater_equal(a, b); + } + } + using operators::operator>=; }} #endif diff --git a/include/boost/fusion/sequence/comparison/less.hpp b/include/boost/fusion/sequence/comparison/less.hpp index 96d13d41..b5abddeb 100644 --- a/include/boost/fusion/sequence/comparison/less.hpp +++ b/include/boost/fusion/sequence/comparison/less.hpp @@ -14,21 +14,31 @@ #include #include #include -#include namespace boost { namespace fusion { template - inline typename - enable_if< - detail::enable_comparison - , bool - >::type - operator<(Seq1 const& a, Seq2 const& b) + inline bool + less(Seq1 const& a, Seq2 const& b) { return detail::sequence_less:: call(fusion::begin(a), fusion::begin(b)); } + + namespace operators + { + template + inline typename + enable_if< + detail::enable_comparison + , bool + >::type + operator<(Seq1 const& a, Seq2 const& b) + { + return fusion::less(a, b); + } + } + using operators::operator<; }} #endif diff --git a/include/boost/fusion/sequence/comparison/less_equal.hpp b/include/boost/fusion/sequence/comparison/less_equal.hpp index d4b45b2d..71d25328 100644 --- a/include/boost/fusion/sequence/comparison/less_equal.hpp +++ b/include/boost/fusion/sequence/comparison/less_equal.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #if defined(FUSION_DIRECT_OPERATOR_USAGE) #include @@ -19,18 +20,11 @@ #include #endif -#include -#include - namespace boost { namespace fusion { template - inline typename - enable_if< - detail::enable_comparison - , bool - >::type - operator<=(Seq1 const& a, Seq2 const& b) + inline bool + less_equal(Seq1 const& a, Seq2 const& b) { #if defined(FUSION_DIRECT_OPERATOR_USAGE) return detail::sequence_less_equal:: @@ -39,6 +33,49 @@ namespace boost { namespace fusion return !(b < a); #endif } + + namespace operators + { +#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1400) +// Workaround for VC8.0 and VC7.1 + template + inline bool + operator<=(sequence_base const& a, sequence_base const& b) + { + return less_equal(a.derived(), b.derived()); + } + + template + inline typename disable_if, bool>::type + operator<=(sequence_base const& a, Seq2 const& b) + { + return less_equal(a.derived(), b); + } + + template + inline typename disable_if, bool>::type + operator<=(Seq1 const& a, sequence_base const& b) + { + return less_equal(a, b.derived()); + } + +#else +// Somehow VC8.0 and VC7.1 does not like this code +// but barfs somewhere else. + + template + inline typename + enable_if< + detail::enable_comparison + , bool + >::type + operator<=(Seq1 const& a, Seq2 const& b) + { + return fusion::less_equal(a, b); + } +#endif + } + using operators::operator<=; }} #endif diff --git a/include/boost/fusion/sequence/comparison/not_equal_to.hpp b/include/boost/fusion/sequence/comparison/not_equal_to.hpp index 1464d023..4fd87301 100644 --- a/include/boost/fusion/sequence/comparison/not_equal_to.hpp +++ b/include/boost/fusion/sequence/comparison/not_equal_to.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #if defined(FUSION_DIRECT_OPERATOR_USAGE) #include @@ -19,34 +20,37 @@ #include #endif -#include -#include - namespace boost { namespace fusion { - namespace sequence_operators + template + inline bool + not_equal_to(Seq1 const& a, Seq2 const& b) + { +#if defined(FUSION_DIRECT_OPERATOR_USAGE) + return result_of::size::value != result_of::size::value + || detail::sequence_not_equal_to< + Seq1 const, Seq2 const + , result_of::size::value == result_of::size::value>:: + call(fusion::begin(a), fusion::begin(b)); +#else + return !(a == b); +#endif + } + + namespace operators { template - inline typename - enable_if< - detail::enable_equality - , bool + inline typename + enable_if< + detail::enable_equality + , bool >::type operator!=(Seq1 const& a, Seq2 const& b) { -#if defined(FUSION_DIRECT_OPERATOR_USAGE) - return result_of::size::value != result_of::size::value - || detail::sequence_not_equal_to< - Seq1 const, Seq2 const - , result_of::size::value == result_of::size::value>:: - call(fusion::begin(a), fusion::begin(b)); -#else - return !(a == b); -#endif + return fusion::not_equal_to(a, b); } } - - using sequence_operators::operator!=; + using operators::operator!=; }} #endif diff --git a/include/boost/fusion/sequence/io/in.hpp b/include/boost/fusion/sequence/io/in.hpp index c3e5a1c5..2a946e3d 100644 --- a/include/boost/fusion/sequence/io/in.hpp +++ b/include/boost/fusion/sequence/io/in.hpp @@ -12,23 +12,32 @@ #include #include -#include -#include -#include +#include namespace boost { namespace fusion { template - inline typename - enable_if< - fusion::traits::is_sequence - , std::istream& - >::type - operator>>(std::istream& is, Sequence& seq) + inline std::istream& + in(std::istream& is, Sequence& seq) { detail::read_sequence(is, seq); return is; } + + namespace operators + { + template + inline typename + enable_if< + fusion::traits::is_sequence + , std::istream& + >::type + operator>>(std::istream& is, Sequence& seq) + { + return fusion::in(is, seq); + } + } + using operators::operator>>; }} #endif diff --git a/include/boost/fusion/sequence/io/out.hpp b/include/boost/fusion/sequence/io/out.hpp index 00491b8b..2c8cea2d 100644 --- a/include/boost/fusion/sequence/io/out.hpp +++ b/include/boost/fusion/sequence/io/out.hpp @@ -19,16 +19,27 @@ namespace boost { namespace fusion { template - inline typename - enable_if< - fusion::traits::is_sequence - , std::ostream& - >::type - operator<<(std::ostream& os, Sequence const& seq) + inline std::ostream& + out(std::ostream& os, Sequence& seq) { detail::print_sequence(os, seq); return os; } + + namespace operators + { + template + inline typename + enable_if< + fusion::traits::is_sequence + , std::ostream& + >::type + operator<<(std::ostream& os, Sequence const& seq) + { + return fusion::out(os, seq); + } + } + using operators::operator<<; }} #endif