From 2f75219ca397a286d0ccd607c28e7ee2843c4b01 Mon Sep 17 00:00:00 2001 From: Thomas Witt Date: Sat, 26 Apr 2003 19:02:12 +0000 Subject: [PATCH] Adapted to iterator categories proposal. [SVN r1208] --- include/boost/iterator/iterator_concepts.hpp | 95 ++++++++++++++++---- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index f7c67ce..95e6fcc 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -8,17 +8,26 @@ #define BOOST_ITERATOR_CONCEPTS_HPP // Revision History +// 26 Apr 2003 thw +// Adapted to new iterator concepts // 22 Nov 2002 Thomas Witt // Added interoperable concept. #include #include #include +#include +#include +#include +#include #include // Use boost::detail::iterator_traits to work around some MSVC/Dinkumware problems. #include +#include +#include + namespace boost_concepts { // Used a different namespace here (instead of "boost") so that the // concept descriptions do not take for granted the names in @@ -53,8 +62,8 @@ namespace boost_concepts { boost::function_requires< boost::DefaultConstructibleConcept >(); - static_assert_base_and_derived(); - + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); + reference r = *i; // or perhaps read(x) value_type v(r); boost::ignore_unused_variable_warning(v); @@ -73,7 +82,7 @@ namespace boost_concepts { boost::function_requires< boost::DefaultConstructibleConcept >(); - static_assert_base_and_derived(); + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); *i = v; // a good alternative could be something like write(x, v) } @@ -82,7 +91,21 @@ namespace boost_concepts { }; template - class ConstantLvalueIteratorConcept { + class SwappableIteratorConcept { + public: + typedef typename boost::access_category::type access_category; + + void constraints() { + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); + + std::iter_swap(i1, i2); + } + Iterator i1; + Iterator i2; + }; + + template + class ReadableLvalueIteratorConcept { public: typedef typename boost::detail::iterator_traits::value_type value_type; typedef typename boost::detail::iterator_traits::reference reference; @@ -91,9 +114,13 @@ namespace boost_concepts { void constraints() { boost::function_requires< ReadableIteratorConcept >(); - static_assert_base_and_derived(); + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); + typedef boost::mpl::or_< + boost::is_same, + boost::is_same > correct_reference; + + BOOST_STATIC_ASSERT(correct_reference::value); reference v = *i; boost::ignore_unused_variable_warning(v); @@ -102,48 +129,79 @@ namespace boost_concepts { }; template - class MutableLvalueIteratorConcept { + class WritableLvalueIteratorConcept { public: typedef typename boost::detail::iterator_traits::value_type value_type; typedef typename boost::detail::iterator_traits::reference reference; typedef typename boost::access_category::type access_category; void constraints() { - boost::function_requires< ReadableIteratorConcept >(); + boost::function_requires< + ReadableLvalueIteratorConcept >(); boost::function_requires< WritableIteratorConcept >(); + boost::function_requires< + SwappableIteratorConcept >(); - static_assert_base_and_derived(); + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); BOOST_STATIC_ASSERT((boost::is_same::value)); - - reference v = *i; - boost::ignore_unused_variable_warning(v); } - Iterator i; }; //=========================================================================== // Iterator Traversal Concepts template - class ForwardTraversalConcept { + class IncrementableIteratorConcept { public: typedef typename boost::traversal_category::type traversal_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); boost::function_requires< boost::DefaultConstructibleConcept >(); - static_assert_base_and_derived(); + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); ++i; (void)i++; } Iterator i; }; + + template + class SinglePassIteratorConcept { + public: + typedef typename boost::traversal_category::type traversal_category; + typedef typename boost::detail::iterator_traits::difference_type difference_type; + + void constraints() { + boost::function_requires< IncrementableIteratorConcept >(); + boost::function_requires< boost::EqualityComparableConcept >(); + + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); + } + }; + + template + class ForwardTraversalConcept { + public: + typedef typename boost::traversal_category::type traversal_category; + typedef typename boost::detail::iterator_traits::difference_type difference_type; + + void constraints() { + boost::function_requires< SinglePassIteratorConcept >(); + + typedef boost::mpl::and_< + boost::is_integral, + boost::mpl::bool_< std::numeric_limits::is_signed > + > difference_type_is_signed_integral; + + BOOST_STATIC_ASSERT(difference_type_is_signed_integral::value); + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); + } + }; template class BidirectionalTraversalConcept { @@ -153,7 +211,7 @@ namespace boost_concepts { void constraints() { boost::function_requires< ForwardTraversalConcept >(); - static_assert_base_and_derived(); + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); --i; (void)i--; @@ -171,8 +229,7 @@ namespace boost_concepts { void constraints() { boost::function_requires< BidirectionalTraversalConcept >(); - static_assert_base_and_derived(); - + BOOST_STATIC_ASSERT((boost::detail::is_tag::value)); i += n; i = i + n;