From 51e5c86a2c905d0f4775fa1407be75efdd85418d Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Mon, 31 Jul 2000 10:26:17 +0000 Subject: [PATCH] Simplified things a little by removing an unused template parameter from iterator_comparisons<>. Conditionalized the use of iterator_comparisons<> on BOOST_RELOPS_AMBIGUITY_BUG. [SVN r7666] --- include/boost/iterator_adaptors.hpp | 66 +++++++++++++++++------------ 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp index d194e1b..02cb09f 100644 --- a/include/boost/iterator_adaptors.hpp +++ b/include/boost/iterator_adaptors.hpp @@ -18,6 +18,14 @@ #include #include +// I was having some problems with VC6. I couldn't tell whether our hack for +// stock GCC was causing problems so I needed an easy way to turn it on and +// off. Now we can test the hack with various compilers and still have an "out" +// if it doesn't work. -dwa 7/31/00 +#if __GNUC__ == 2 && __GNUC_MINOR__ <= 95 && !defined(__STL_USE_NAMESPACES) +# define BOOST_RELOPS_AMBIGUITY_BUG 1 +#endif + namespace boost { // Just a "type envelope"; works around some MSVC deficiencies. @@ -61,62 +69,64 @@ struct default_iterator_policies // putting the comparisons in a base class avoids the g++ // ambiguous overload bug due to the relops operators -template -struct iterator_comparisons : public Base { }; +#ifdef BOOST_RELOPS_AMBIGUITY_BUG +template +struct iterator_comparisons : Base { }; -template -inline bool operator==(const iterator_comparisons& xb, - const iterator_comparisons& yb) +template +inline bool operator==(const iterator_comparisons& xb, + const iterator_comparisons& yb) { const D1& x = static_cast(xb); const D2& y = static_cast(yb); return x.policies().equal(x.iter(), y.iter()); } -template -inline bool operator!=(const iterator_comparisons& xb, - const iterator_comparisons& yb) +template +inline bool operator!=(const iterator_comparisons& xb, + const iterator_comparisons& yb) { const D1& x = static_cast(xb); const D2& y = static_cast(yb); return !x.policies().equal(x.iter(), y.iter()); } -template -inline bool operator<(const iterator_comparisons& xb, - const iterator_comparisons& yb) +template +inline bool operator<(const iterator_comparisons& xb, + const iterator_comparisons& yb) { const D1& x = static_cast(xb); const D2& y = static_cast(yb); return x.policies().less(x.iter(), y.iter()); } -template -inline bool operator>(const iterator_comparisons& xb, - const iterator_comparisons& yb) +template +inline bool operator>(const iterator_comparisons& xb, + const iterator_comparisons& yb) { const D1& x = static_cast(xb); const D2& y = static_cast(yb); return x.policies().less(y.iter(), x.iter()); } -template -inline bool operator>=(const iterator_comparisons& xb, - const iterator_comparisons& yb) +template +inline bool operator>=(const iterator_comparisons& xb, + const iterator_comparisons& yb) { const D1& x = static_cast(xb); const D2& y = static_cast(yb); return !x.policies().less(x.iter(), y.iter()); } -template -inline bool operator<=(const iterator_comparisons& xb, - const iterator_comparisons& yb) +template +inline bool operator<=(const iterator_comparisons& xb, + const iterator_comparisons& yb) { const D1& x = static_cast(xb); const D2& y = static_cast(yb); return !x.policies().less(y.iter(), x.iter()); } +#endif //============================================================================= // iterator_adaptor - A generalized adaptor around an existing @@ -142,13 +152,17 @@ template -struct iterator_adaptor - : iterator_comparisons< +struct iterator_adaptor : +#ifdef BOOST_RELOPS_AMBIGUITY_BUG + iterator_comparisons< iterator_adaptor, - NonconstIterator, +#endif boost::iterator > + typename Traits::pointer, typename Traits::reference> +#ifdef BOOST_RELOPS_AMBIGUITY_BUG +> +#endif { typedef iterator_adaptor Self; public: @@ -166,7 +180,7 @@ public: template iterator_adaptor(const iterator_adaptor& rhs) : m_iter_p(rhs.iter(), rhs.policies()) {} - + template Self& operator=(const iterator_adaptor& rhs) { @@ -258,7 +272,7 @@ typename Traits1::difference_type operator-( return x.policies().distance(type(), y.iter(), x.iter()); } -#if 0 +#ifndef BOOST_RELOPS_AMBIGUITY_BUG template inline bool operator==(const iterator_adaptor& x, const iterator_adaptor& y) {