From 2d1e40bd201ea5e97c1633350fc36710d96db271 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Wed, 14 Jan 2004 03:44:45 +0000 Subject: [PATCH] made some changes to InteroperableIteratorConcept to match the current docs, as per suggestions from Dave and Thomas [SVN r21718] --- .../boost/iterator/iterator_categories.hpp | 3 +- include/boost/iterator/iterator_concepts.hpp | 168 ++++++------------ 2 files changed, 60 insertions(+), 111 deletions(-) diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp index 0af3714..6153c6f 100644 --- a/include/boost/iterator/iterator_categories.hpp +++ b/include/boost/iterator/iterator_categories.hpp @@ -30,7 +30,8 @@ namespace boost { struct no_traversal_tag {}; -struct incrementable_traversal_tag {}; +struct incrementable_traversal_tag + : no_traversal_tag {}; struct single_pass_traversal_tag : incrementable_traversal_tag {}; diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index aadb43b..663917e 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -253,126 +253,74 @@ namespace boost_concepts { //=========================================================================== // Iterator Interoperability Concept -namespace detail -{ - - template - struct Operations; - - template <> - struct Operations + namespace detail { - template - static void constraints(Iterator1 const& i1, Iterator2 const& i2) - { - // no interoperability constraints - } - }; - template <> - struct Operations - { - template - static void constraints(Iterator1 const& i1, Iterator2 const& i2) - { - Operations::constraints(i1, i2); - i1 == i2; - i1 != i2; - - i2 == i1; - i2 != i1; - } - }; - - template <> - struct Operations - { - template - static void constraints(Iterator1 const& i1, Iterator2 const& i2) - { - Operations::constraints(i1, i2); - } - }; - - template <> - struct Operations - { - template - static void constraints(Iterator1 const& i1, Iterator2 const& i2) - { - Operations::constraints(i1, i2); - } - }; - - template <> - struct Operations + template + void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2) { - template - static void constraints(Iterator1 const& i1, Iterator2 const& i2) - { - Operations::constraints(i1, i2); - - i1 < i2; - i1 <= i2; - i1 > i2; - i1 >= i2; - i1 - i2; - - i2 < i1; - i2 <= i1; - i2 > i1; - i2 >= i1; - i2 - i1; - } - }; + bool b; + b = i1 == i2; + b = i1 != i2; + + b = i2 == i1; + b = i2 != i1; + } + + template + void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2, + boost::random_access_traversal_tag, boost::random_access_traversal_tag) + { + bool b; + typename boost::detail::iterator_traits::difference_type n; + b = i1 < i2; + b = i1 <= i2; + b = i1 > i2; + b = i1 >= i2; + n = i1 - i2; + + b = i2 < i1; + b = i2 <= i1; + b = i2 > i1; + b = i2 >= i1; + n = i2 - i1; + } + template + void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2, + boost::single_pass_traversal_tag, boost::single_pass_traversal_tag) + { } } // namespace detail - template - class InteroperableIteratorConcept - { - public: - typedef typename boost::detail::pure_traversal_tag< - typename boost::iterator_traversal< - Iterator - >::type - >::type traversal_category; - - typedef typename - boost::detail::iterator_traits::difference_type - difference_type; + template + class InteroperableIteratorConcept + { + public: + typedef typename boost::detail::pure_traversal_tag< + typename boost::iterator_traversal< + Iterator + >::type + >::type traversal_category; - typedef typename boost::detail::pure_traversal_tag< - typename boost::iterator_traversal< - ConstIterator - >::type - >::type const_traversal_category; - - typedef typename - boost::detail::iterator_traits::difference_type - const_difference_type; + typedef typename boost::detail::pure_traversal_tag< + typename boost::iterator_traversal< + ConstIterator + >::type + >::type const_traversal_category; - void constraints() - { - boost::function_requires< SinglePassIteratorConcept >(); - boost::function_requires< SinglePassIteratorConcept >(); + void constraints() + { + boost::function_requires< SinglePassIteratorConcept >(); + boost::function_requires< SinglePassIteratorConcept >(); - BOOST_STATIC_ASSERT( - (boost::is_same< difference_type, const_difference_type>::value) - ); - - BOOST_STATIC_ASSERT( - (boost::is_same< traversal_category, const_traversal_category>::value) - ); + detail::interop_single_pass_constraints(i, ci); + detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category()); - detail::Operations::constraints(i, ci); - - ci = i; - - } - Iterator i; - ConstIterator ci; - }; + ci = i; + } + Iterator i; + ConstIterator ci; + }; } // namespace boost_concepts