From fd736d0def671b11530db6a402d6f62bbd70023c Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Mon, 26 Jan 2004 04:12:43 +0000 Subject: [PATCH] merging updates [SVN r21940] --- include/boost/iterator/iterator_concepts.hpp | 205 ++++++------------- 1 file changed, 68 insertions(+), 137 deletions(-) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 93e0972..663917e 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -60,19 +60,13 @@ namespace boost_concepts { class ReadableIteratorConcept { public: typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type value_type; - typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::reference reference; void constraints() { - boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); + boost::function_requires< boost::AssignableConcept >(); + boost::function_requires< boost::CopyConstructibleConcept >(); - reference r = *i; // or perhaps read(x) - value_type v = r; - value_type v2 = *i; + value_type v = *i; boost::ignore_unused_variable_warning(v); - boost::ignore_unused_variable_warning(v2); } Iterator i; }; @@ -85,12 +79,8 @@ namespace boost_concepts { public: void constraints() { - boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); - - *i = v; // a good alternative could be something like write(x, v) + boost::function_requires< boost::CopyConstructibleConcept >(); + *i = v; } ValueType v; Iterator i; @@ -112,20 +102,11 @@ namespace boost_concepts { { public: typedef typename boost::detail::iterator_traits::value_type value_type; - typedef typename boost::detail::iterator_traits::reference reference; void constraints() { boost::function_requires< ReadableIteratorConcept >(); - - typedef boost::mpl::or_< - boost::is_same - , boost::is_same - > correct_reference; - - BOOST_STATIC_ASSERT(correct_reference::value); - - reference v = *i; + const value_type& v = *i; boost::ignore_unused_variable_warning(v); } Iterator i; @@ -159,9 +140,8 @@ namespace boost_concepts { typedef typename boost::iterator_traversal::type traversal_category; void constraints() { - boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); + boost::function_requires< boost::AssignableConcept >(); + boost::function_requires< boost::CopyConstructibleConcept >(); BOOST_STATIC_ASSERT( (boost::is_convertible< @@ -203,6 +183,8 @@ namespace boost_concepts { void constraints() { boost::function_requires< SinglePassIteratorConcept >(); + boost::function_requires< + boost::DefaultConstructibleConcept >(); typedef boost::mpl::and_< boost::is_integral, @@ -271,125 +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 InteroperableConcept - { - 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_STATIC_ASSERT( - (boost::is_same< difference_type, const_difference_type>::value) - ); - - BOOST_STATIC_ASSERT( - (boost::is_same< traversal_category, const_traversal_category>::value) - ); + void constraints() + { + boost::function_requires< SinglePassIteratorConcept >(); + boost::function_requires< SinglePassIteratorConcept >(); - // ToDo check what the std really requires + 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