From 4ebfc5b0a21c74aca2e794bc504b8be3c5cff7f0 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Fri, 28 Feb 2003 05:44:22 +0000 Subject: [PATCH] cleanups [SVN r1061] --- include/boost/iterator/filter_iterator.hpp | 18 +- include/boost/iterator/indirect_iterator.hpp | 25 ++- include/boost/iterator/interoperable.hpp | 2 +- include/boost/iterator/iterator_adaptor.hpp | 123 ++++++----- include/boost/iterator/iterator_facade.hpp | 218 ++++++------------- 5 files changed, 161 insertions(+), 225 deletions(-) diff --git a/include/boost/iterator/filter_iterator.hpp b/include/boost/iterator/filter_iterator.hpp index 4a219e2..67a636b 100644 --- a/include/boost/iterator/filter_iterator.hpp +++ b/include/boost/iterator/filter_iterator.hpp @@ -23,10 +23,12 @@ namespace boost : iterator_traits { typedef iterator_tag< - typename return_category::type - , minimum_category< forward_traversal_tag - ,typename traversal_category::type >::type - > iterator_category; + typename return_category::type + , typename minimum_category< + forward_traversal_tag + , typename traversal_category::type + >::type + > iterator_category; }; } // namespace detail @@ -34,13 +36,13 @@ namespace boost template class filter_iterator : public iterator_adaptor< - filter_iterator, Iterator - , detail::filter_iterator_traits + filter_iterator, Iterator + , detail::filter_iterator_traits > { typedef iterator_adaptor< - filter_iterator, Iterator - , detail::filter_iterator_traits + filter_iterator, Iterator + , detail::filter_iterator_traits > super_t; friend class iterator_core_access; diff --git a/include/boost/iterator/indirect_iterator.hpp b/include/boost/iterator/indirect_iterator.hpp index fa8e805..6c039fa 100644 --- a/include/boost/iterator/indirect_iterator.hpp +++ b/include/boost/iterator/indirect_iterator.hpp @@ -44,29 +44,31 @@ namespace boost template struct has_element_type + : mpl::bool_< + mpl::if_< + is_class + , ::boost::detail::aux::has_element_type + , mpl::false_ + >::type::value + > { - typedef typename mpl::if_< - is_class - , aux::has_element_type - , mpl::false_ - >::type type; }; # else template struct has_element_type - : mpl::false_c {}; + : mpl::false_ {}; template struct has_element_type > - : mpl::true_c {}; + : mpl::true_ {}; template struct has_element_type > - : mpl::true_c {}; + : mpl::true_ {}; template struct has_element_type > - : mpl::true_c {}; + : mpl::true_ {}; # endif // Metafunction returning the nested element_type typedef @@ -86,7 +88,10 @@ namespace boost template struct indirect_defaults : mpl::if_< - has_element_type::value_type> + mpl::and_< + is_class::value_type> + , has_element_type::value_type> + > , smart_pointer_traits::value_type> , iterator_traits::value_type> >::type diff --git a/include/boost/iterator/interoperable.hpp b/include/boost/iterator/interoperable.hpp index 7f3422b..2e9ae06 100644 --- a/include/boost/iterator/interoperable.hpp +++ b/include/boost/iterator/interoperable.hpp @@ -39,7 +39,7 @@ namespace boost : mpl::true_ #else : mpl::or_< - is_convertible< A, B > + is_convertible< A, B > , is_convertible< B, A > > #endif { diff --git a/include/boost/iterator/iterator_adaptor.hpp b/include/boost/iterator/iterator_adaptor.hpp index bb11238..8a592ab 100644 --- a/include/boost/iterator/iterator_adaptor.hpp +++ b/include/boost/iterator/iterator_adaptor.hpp @@ -32,14 +32,14 @@ namespace boost template struct same_category_and_difference : mpl::and_< - is_same< - typename Traits::iterator_category - , typename Other::iterator_category - > + is_same< + typename Traits::iterator_category + , typename Other::iterator_category + > , is_same< - typename Traits::iterator_category - , typename Other::iterator_category - > + typename Traits::iterator_category + , typename Other::iterator_category + > > {}; @@ -110,7 +110,8 @@ namespace boost # else ::boost::is_convertible # endif - ,detail::enable_type >::type type; + , detail::enable_type + >::type type; # endif }; @@ -121,18 +122,22 @@ namespace boost // argument ordering is different from the std::iterator template, so that default // arguments can be used effectivly. // - template ::value_type, - class Reference = ValueType&, - class Pointer = ValueType*, - class IteratorCategory = typename detail::iterator_traits::iterator_category, - class DifferenceType = typename detail::iterator_traits::difference_type > + template < + class Iterator + , class ValueType = typename detail::iterator_traits::value_type + , class Reference = ValueType& + , class Pointer = ValueType* + , class IteratorCategory = typename detail::iterator_traits::iterator_category + , class DifferenceType = typename detail::iterator_traits::difference_type + > struct iterator_traits_adaptor - : iterator + : iterator< + IteratorCategory + , ValueType + , DifferenceType + , Pointer + , Reference + > { }; @@ -141,58 +146,60 @@ namespace boost // template < class Derived - , class Iterator - , class Traits = detail::iterator_traits + , class Iterator + , class Traits = detail::iterator_traits > class iterator_adaptor : public iterator_facade { - friend class iterator_core_access; + friend class iterator_core_access; - public: - iterator_adaptor() {} + public: + iterator_adaptor() {} - explicit iterator_adaptor(Iterator iter) - : m_iterator(iter) - { - } + explicit iterator_adaptor(Iterator iter) + : m_iterator(iter) + { + } - Iterator base() const { return m_iterator; } + Iterator base() const + { return m_iterator; } - protected: - // Core iterator interface for iterator_facade - // + protected: + // Core iterator interface for iterator_facade + // - typename Traits::reference dereference() const { return *m_iterator; } + typename Traits::reference dereference() const + { return *m_iterator; } - template < - class OtherDerived, class OtherIterator, class OtherTraits - > - bool equal(iterator_adaptor const& x) const - { - BOOST_STATIC_ASSERT( - (detail::same_category_and_difference::value) - ); - return m_iterator == x.base(); - } + template < + class OtherDerived, class OtherIterator, class OtherTraits + > + bool equal(iterator_adaptor const& x) const + { + BOOST_STATIC_ASSERT( + (detail::same_category_and_difference::value) + ); + return m_iterator == x.base(); + } - void advance(typename Traits::difference_type n) - { - m_iterator += n; - } + void advance(typename Traits::difference_type n) + { + m_iterator += n; + } - void increment() { ++m_iterator; } - void decrement() { --m_iterator; } + void increment() { ++m_iterator; } + void decrement() { --m_iterator; } - template - typename Traits::difference_type distance_to( - iterator_adaptor const& y) const - { - BOOST_STATIC_ASSERT( - (detail::same_category_and_difference::value) - ); - return y.base() - m_iterator; - } + template + typename Traits::difference_type distance_to( + iterator_adaptor const& y) const + { + BOOST_STATIC_ASSERT( + (detail::same_category_and_difference::value) + ); + return y.base() - m_iterator; + } private: // data members Iterator m_iterator; diff --git a/include/boost/iterator/iterator_facade.hpp b/include/boost/iterator/iterator_facade.hpp index d4fbfd2..bc665b2 100644 --- a/include/boost/iterator/iterator_facade.hpp +++ b/include/boost/iterator/iterator_facade.hpp @@ -31,12 +31,16 @@ namespace boost // enable_if_interoperable falls back to always enabled for compilers // that don't support enable_if or is_convertible. // - template - struct enable_if_interoperable : - ::boost::detail::enable_if< is_convertible< Facade1, Facade2 > - , Return > + template < + class Facade1 + , class Facade2 + , class Return + > + struct enable_if_interoperable + : ::boost::detail::enable_if< + is_convertible + , Return + > { # if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) typedef Return type; @@ -285,155 +289,73 @@ namespace boost // a == b; // ---------------- // - template - inline - typename detail::enable_if_interoperable::type - operator==(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); - return iterator_core_access::equal(lhs.derived(), - rhs.derived()); +# define BOOST_ITERATOR_FACADE_INTEROP(op, result_type, condition, return_prefix, base_op) \ + template \ + inline typename detail::enable_if_interoperable< \ + Derived1, Derived2, result_type \ + >::type \ + operator op( \ + iterator_facade const& lhs \ + , iterator_facade const& rhs) \ + { \ + /* For those compilers that do not support enable_if */ \ + BOOST_STATIC_ASSERT(( \ + is_interoperable< Derived1, Derived2 >::value \ + && condition \ + )); \ + return_prefix iterator_core_access::base_op( \ + rhs.derived(), lhs.derived()); \ } - template - inline - typename detail::enable_if_interoperable::type - operator!=(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); +# define BOOST_ITERATOR_FACADE_RELATION(op, test, base_op) \ + BOOST_ITERATOR_FACADE_INTEROP( \ + op \ + , bool \ + , true \ + , return test \ + , base_op \ + ) - return !iterator_core_access::equal(lhs.derived(), - rhs.derived()); + BOOST_ITERATOR_FACADE_RELATION(==, (bool), equal) + BOOST_ITERATOR_FACADE_RELATION(!=, !, equal) + + BOOST_ITERATOR_FACADE_RELATION(<, 0>, distance_to) + BOOST_ITERATOR_FACADE_RELATION(>, 0<, distance_to) + BOOST_ITERATOR_FACADE_RELATION(<=, 0>=, distance_to) + BOOST_ITERATOR_FACADE_RELATION(>=, 0<=, distance_to) +# undef BOOST_ITERATOR_FACADE_RELATION + + BOOST_ITERATOR_FACADE_INTEROP( + - + , typename Traits1::difference_type + , (is_same< + BOOST_ARG_DEP_TYPENAME Traits1::difference_type + , BOOST_ARG_DEP_TYPENAME Traits2::difference_type + >::value) + , return + , distance_to ) +# undef BOOST_ITERATOR_FACADE_INTEROP + +# define BOOST_ITERATOR_FACADE_PLUS(args) \ + template \ + inline Derived operator+ args \ + { \ + Derived tmp(i.derived()); \ + return tmp += n; \ } - template - inline - typename detail::enable_if_interoperable::type - operator<(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); - - return iterator_core_access::distance_to(lhs.derived(), - rhs.derived()) > 0; - } - - template - inline - typename detail::enable_if_interoperable::type - operator>(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); - - return iterator_core_access::distance_to(lhs.derived(), - rhs.derived()) < 0; - } - - template - inline - typename detail::enable_if_interoperable::type - operator<=(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); - - return iterator_core_access::distance_to(lhs.derived(), - rhs.derived()) >= 0; - } - - template - inline - typename detail::enable_if_interoperable::type - operator>=(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); - - return iterator_core_access::distance_to(lhs.derived(), - rhs.derived()) <= 0; - } - - template - inline - Derived operator+(iterator_facade const& i, - typename Traits::difference_type n) - { - Derived tmp(i.derived()); - return tmp += n; - } - - template - inline - Derived operator+(typename Traits::difference_type n, - iterator_facade const& i) - { - Derived tmp(i.derived()); - return tmp += n; - } - - template - inline - typename detail::enable_if_interoperable::type - operator-(iterator_facade const& lhs, - iterator_facade const& rhs) - { - // For those compilers that do not support enable_if - BOOST_STATIC_ASSERT((is_interoperable< Derived1, Derived2 >::value)); - - BOOST_STATIC_ASSERT((is_same::value)); - - return iterator_core_access::distance_to(rhs.derived(), - lhs.derived()); - } +BOOST_ITERATOR_FACADE_PLUS(( + iterator_facade const& i + , typename Traits::difference_type n +)) +BOOST_ITERATOR_FACADE_PLUS(( + typename Traits::difference_type n + , iterator_facade const& i +)) +# undef BOOST_ITERATOR_FACADE_PLUS + } // namespace boost #include