From c0fc8532e7edaaa808cba21d08af6c38dbd4a154 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 16 Apr 2006 18:02:23 +0000 Subject: [PATCH 01/29] Warning suppression for GCC (warning: declaration of 'end' shadows a member of 'this'). [SVN r33712] --- include/boost/iterator/filter_iterator.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/boost/iterator/filter_iterator.hpp b/include/boost/iterator/filter_iterator.hpp index 9e34eb2..14d640b 100644 --- a/include/boost/iterator/filter_iterator.hpp +++ b/include/boost/iterator/filter_iterator.hpp @@ -53,14 +53,14 @@ namespace boost public: filter_iterator() { } - filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()) - : super_t(x), m_predicate(f), m_end(end) + filter_iterator(Predicate f, Iterator x, Iterator end_ = Iterator()) + : super_t(x), m_predicate(f), m_end(end_) { satisfy_predicate(); } - filter_iterator(Iterator x, Iterator end = Iterator()) - : super_t(x), m_predicate(), m_end(end) + filter_iterator(Iterator x, Iterator end_ = Iterator()) + : super_t(x), m_predicate(), m_end(end_) { // Pro8 is a little too aggressive about instantiating the // body of this function. From 0dbe767eec847a30aa0e366fc370154234367957 Mon Sep 17 00:00:00 2001 From: Nicola Musatti Date: Mon, 17 Apr 2006 14:23:24 +0000 Subject: [PATCH 02/29] Borland workaround updated [SVN r33719] --- test/iterator_traits_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/iterator_traits_test.cpp b/test/iterator_traits_test.cpp index 6a72e8f..3131d44 100644 --- a/test/iterator_traits_test.cpp +++ b/test/iterator_traits_test.cpp @@ -153,7 +153,7 @@ struct maybe_pointer_test input_iterator_test, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag> istream_iterator_test; -#if defined(__BORLANDC__) && !defined(__SGI_STL_PORT) +#if BOOST_WORKAROUND(__BORLANDC__, <= 0x564) && !defined(__SGI_STL_PORT) typedef ::std::char_traits::off_type distance; non_pointer_test,int, distance,int*,int&,std::output_iterator_tag> ostream_iterator_test; From 28dd4580880ca21f41dbaf0e3b3de311148958c3 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Tue, 25 Apr 2006 20:34:32 +0000 Subject: [PATCH 03/29] Add missing "inline". Fixes boost-Bugs-1476219. [SVN r33819] --- include/boost/iterator/zip_iterator.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/iterator/zip_iterator.hpp b/include/boost/iterator/zip_iterator.hpp index b0eef96..6758dad 100755 --- a/include/boost/iterator/zip_iterator.hpp +++ b/include/boost/iterator/zip_iterator.hpp @@ -316,7 +316,7 @@ namespace boost { // No point in bringing in a bunch of #ifdefs here. This is // going to go away with the next tuple implementation anyway. // - bool tuple_equal(tuples::null_type, tuples::null_type) + inline bool tuple_equal(tuples::null_type, tuples::null_type) { return true; } template From f5b644e765c3563c8fbded3b6eec48b6b8460064 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sat, 29 Apr 2006 20:27:14 +0000 Subject: [PATCH 04/29] Fixes for concept checking; use destructors for checking classes, misc cleanup. [SVN r33862] --- .../detail/facade_iterator_category.hpp | 19 +- include/boost/iterator/iterator_concepts.hpp | 334 +++++++++--------- 2 files changed, 171 insertions(+), 182 deletions(-) diff --git a/include/boost/iterator/detail/facade_iterator_category.hpp b/include/boost/iterator/detail/facade_iterator_category.hpp index 6728700..f50aef0 100755 --- a/include/boost/iterator/detail/facade_iterator_category.hpp +++ b/include/boost/iterator/detail/facade_iterator_category.hpp @@ -6,13 +6,12 @@ # include -# include - # include // used in iterator_tag inheritance logic # include # include # include # include +# include # include # include @@ -151,17 +150,17 @@ struct iterator_category_with_traversal // Make sure this isn't used to build any categories where // convertibility to Traversal is redundant. Should just use the // Category element in that case. - BOOST_STATIC_ASSERT( - !(is_convertible< + BOOST_MPL_ASSERT_NOT(( + is_convertible< typename iterator_category_to_traversal::type , Traversal - >::value)); + >)); - BOOST_STATIC_ASSERT(is_iterator_category::value); - BOOST_STATIC_ASSERT(!is_iterator_category::value); - BOOST_STATIC_ASSERT(!is_iterator_traversal::value); + BOOST_MPL_ASSERT((is_iterator_category)); + BOOST_MPL_ASSERT_NOT((is_iterator_category)); + BOOST_MPL_ASSERT_NOT((is_iterator_traversal)); # if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310)) - BOOST_STATIC_ASSERT(is_iterator_traversal::value); + BOOST_MPL_ASSERT((is_iterator_traversal)); # endif # endif }; @@ -172,7 +171,7 @@ template struct facade_iterator_category_impl { # if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - BOOST_STATIC_ASSERT(!is_iterator_category::value); + BOOST_MPL_ASSERT_NOT((is_iterator_category)); # endif typedef typename iterator_facade_default_category< diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 4c27964..810e2c2 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -35,79 +35,74 @@ #include -namespace boost_concepts { +namespace boost_concepts +{ // Used a different namespace here (instead of "boost") so that the // concept descriptions do not take for granted the names in // namespace boost. - // We use this in place of STATIC_ASSERT((is_convertible<...>)) - // because some compilers (CWPro7.x) can't detect convertibility. - // - // Of course, that just gets us a different error at the moment with - // some tests, since new iterator category deduction still depends - // on convertibility detection. We might need some specializations - // to support this compiler. - template - struct static_assert_base_and_derived - { - static_assert_base_and_derived(Target* = (Source*)0) {} - }; - //=========================================================================== // Iterator Access Concepts template - class ReadableIteratorConcept { - public: - typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type value_type; + struct ReadableIteratorConcept + : boost::AssignableConcept + , boost::CopyConstructibleConcept - void constraints() { - boost::function_requires< boost::AssignableConcept >(); - boost::function_requires< boost::CopyConstructibleConcept >(); + { + typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type value_type; + typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::reference reference; - value_type v = *i; - boost::ignore_unused_variable_warning(v); - } - Iterator i; + ~ReadableIteratorConcept() + { + + value_type v = *i; + boost::ignore_unused_variable_warning(v); + } + private: + Iterator i; }; template < typename Iterator , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type > - class WritableIteratorConcept { - public: - - void constraints() { - boost::function_requires< boost::CopyConstructibleConcept >(); - *i = v; - } - ValueType v; - Iterator i; + struct WritableIteratorConcept + : boost::CopyConstructibleConcept + { + ~WritableIteratorConcept() + { + *i = v; + } + private: + ValueType v; + Iterator i; }; template - class SwappableIteratorConcept { - public: - - void constraints() { - std::iter_swap(i1, i2); - } - Iterator i1; - Iterator i2; + struct SwappableIteratorConcept + { + ~SwappableIteratorConcept() + { + std::iter_swap(i1, i2); + } + private: + Iterator i1; + Iterator i2; }; template - class LvalueIteratorConcept + struct LvalueIteratorConcept { - public: typedef typename boost::detail::iterator_traits::value_type value_type; - void constraints() + + ~LvalueIteratorConcept() { value_type& r = const_cast(*i); boost::ignore_unused_variable_warning(r); } - Iterator i; + private: + Iterator i; }; @@ -115,119 +110,106 @@ namespace boost_concepts { // Iterator Traversal Concepts template - class IncrementableIteratorConcept { - public: - typedef typename boost::iterator_traversal::type traversal_category; + struct IncrementableIteratorConcept + : boost::AssignableConcept + , boost::CopyConstructibleConcept + { + typedef typename boost::iterator_traversal::type traversal_category; - void constraints() { - boost::function_requires< boost::AssignableConcept >(); - boost::function_requires< boost::CopyConstructibleConcept >(); + ~IncrementableIteratorConcept() + { + BOOST_MPL_ASSERT(( + boost::is_convertible< + traversal_category + , boost::incrementable_traversal_tag + > )); - BOOST_STATIC_ASSERT( - (boost::is_convertible< - traversal_category - , boost::incrementable_traversal_tag - >::value - )); - - ++i; - (void)i++; - } - Iterator i; + ++i; + (void)i++; + } + private: + Iterator i; }; template - class SinglePassIteratorConcept { - public: - typedef typename boost::iterator_traversal::type traversal_category; - typedef typename boost::detail::iterator_traits::difference_type difference_type; + struct SinglePassIteratorConcept + : IncrementableIteratorConcept + , boost::EqualityComparableConcept - void constraints() { - boost::function_requires< IncrementableIteratorConcept >(); - boost::function_requires< boost::EqualityComparableConcept >(); - - BOOST_STATIC_ASSERT( - (boost::is_convertible< - traversal_category - , boost::single_pass_traversal_tag - >::value - )); - } + { + ~SinglePassIteratorConcept() + { + BOOST_MPL_ASSERT(( + boost::is_convertible< + BOOST_DEDUCED_TYPENAME SinglePassIteratorConcept::traversal_category + , boost::single_pass_traversal_tag + > )); + } }; template - class ForwardTraversalConcept { - public: - typedef typename boost::iterator_traversal::type traversal_category; - typedef typename boost::detail::iterator_traits::difference_type difference_type; - - void constraints() { - boost::function_requires< SinglePassIteratorConcept >(); - boost::function_requires< - boost::DefaultConstructibleConcept >(); - - 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::is_convertible< - traversal_category - , boost::forward_traversal_tag - >::value - )); + struct ForwardTraversalConcept + : SinglePassIteratorConcept + , boost::DefaultConstructibleConcept + { + typedef typename boost::detail::iterator_traits::difference_type difference_type; + + ~ForwardTraversalConcept() + { + BOOST_MPL_ASSERT((boost::is_integral)); + BOOST_MPL_ASSERT_RELATION(std::numeric_limits::is_signed, ==, true); + + BOOST_MPL_ASSERT(( + boost::is_convertible< + BOOST_DEDUCED_TYPENAME ForwardTraversalConcept::traversal_category + , boost::forward_traversal_tag + > )); } }; template - class BidirectionalTraversalConcept { - public: - typedef typename boost::iterator_traversal::type traversal_category; - - void constraints() { - boost::function_requires< ForwardTraversalConcept >(); - - BOOST_STATIC_ASSERT( - (boost::is_convertible< - traversal_category - , boost::bidirectional_traversal_tag - >::value - )); - - --i; - (void)i--; - } - Iterator i; + struct BidirectionalTraversalConcept + : ForwardTraversalConcept + { + ~BidirectionalTraversalConcept() + { + BOOST_MPL_ASSERT(( + boost::is_convertible< + BOOST_DEDUCED_TYPENAME BidirectionalTraversalConcept::traversal_category + , boost::bidirectional_traversal_tag + > )); + + --i; + (void)i--; + } + private: + Iterator i; }; template - class RandomAccessTraversalConcept { - public: - typedef typename boost::iterator_traversal::type traversal_category; - typedef typename boost::detail::iterator_traits::difference_type - difference_type; - - void constraints() { - boost::function_requires< BidirectionalTraversalConcept >(); - - BOOST_STATIC_ASSERT( - (boost::is_convertible< - traversal_category - , boost::random_access_traversal_tag - >::value - )); + struct RandomAccessTraversalConcept + : BidirectionalTraversalConcept + { + public: + ~RandomAccessTraversalConcept() + { + BOOST_MPL_ASSERT(( + boost::is_convertible< + BOOST_DEDUCED_TYPENAME RandomAccessTraversalConcept::traversal_category + , boost::random_access_traversal_tag + > )); + + i += n; + i = i + n; + i = n + i; + i -= n; + i = i - n; + n = i - j; + } - i += n; - i = i + n; - i = n + i; - i -= n; - i = i - n; - n = i - j; - } - difference_type n; - Iterator i, j; + private: + typename BidirectionalTraversalConcept::difference_type n; + Iterator i, j; }; //=========================================================================== @@ -235,47 +217,52 @@ namespace boost_concepts { namespace detail { - template void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2) { - bool b; - b = i1 == i2; - b = i1 != i2; - - b = i2 == i1; - b = i2 != i1; + bool b; + b = i1 == i2; + b = i1 != i2; + + b = i2 == i1; + b = i2 != i1; + boost::ignore_unused_variable_warning(b); } - + template - void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2, - boost::random_access_traversal_tag, boost::random_access_traversal_tag) + 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; + 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; + boost::ignore_unused_variable_warning(b); + boost::ignore_unused_variable_warning(n); } + template - void interop_rand_access_constraints(Iterator1 const& i1, Iterator2 const& i2, - boost::single_pass_traversal_tag, boost::single_pass_traversal_tag) + void interop_rand_access_constraints( + Iterator1 const&, Iterator2 const&, + boost::single_pass_traversal_tag, boost::single_pass_traversal_tag) { } } // namespace detail template - class InteroperableIteratorConcept + struct InteroperableIteratorConcept { - public: + private: typedef typename boost::detail::pure_traversal_tag< typename boost::iterator_traversal< Iterator @@ -287,17 +274,20 @@ namespace boost_concepts { ConstIterator >::type >::type const_traversal_category; - - void constraints() + + public: + ~InteroperableIteratorConcept() { - boost::function_requires< SinglePassIteratorConcept >(); - boost::function_requires< SinglePassIteratorConcept >(); + BOOST_CONCEPT_ASSERT((SinglePassIteratorConcept)); + BOOST_CONCEPT_ASSERT((SinglePassIteratorConcept)); detail::interop_single_pass_constraints(i, ci); detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category()); ci = i; } + + private: Iterator i; ConstIterator ci; }; From e2957cfb0c2da1dd94c4e9d81ae7eed61f3ec783 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 30 Apr 2006 03:33:33 +0000 Subject: [PATCH 05/29] use idiomatic convertibility assertions. [SVN r33869] --- include/boost/iterator/iterator_concepts.hpp | 27 ++++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 810e2c2..bb20aed 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -118,11 +117,11 @@ namespace boost_concepts ~IncrementableIteratorConcept() { - BOOST_MPL_ASSERT(( - boost::is_convertible< - traversal_category - , boost::incrementable_traversal_tag - > )); + BOOST_CONCEPT_ASSERT(( + boost::ConvertibleConcept< + traversal_category + , boost::incrementable_traversal_tag + >)); ++i; (void)i++; @@ -139,8 +138,8 @@ namespace boost_concepts { ~SinglePassIteratorConcept() { - BOOST_MPL_ASSERT(( - boost::is_convertible< + BOOST_CONCEPT_ASSERT(( + boost::ConvertibleConcept< BOOST_DEDUCED_TYPENAME SinglePassIteratorConcept::traversal_category , boost::single_pass_traversal_tag > )); @@ -159,8 +158,8 @@ namespace boost_concepts BOOST_MPL_ASSERT((boost::is_integral)); BOOST_MPL_ASSERT_RELATION(std::numeric_limits::is_signed, ==, true); - BOOST_MPL_ASSERT(( - boost::is_convertible< + BOOST_CONCEPT_ASSERT(( + boost::ConvertibleConcept< BOOST_DEDUCED_TYPENAME ForwardTraversalConcept::traversal_category , boost::forward_traversal_tag > )); @@ -173,8 +172,8 @@ namespace boost_concepts { ~BidirectionalTraversalConcept() { - BOOST_MPL_ASSERT(( - boost::is_convertible< + BOOST_CONCEPT_ASSERT(( + boost::ConvertibleConcept< BOOST_DEDUCED_TYPENAME BidirectionalTraversalConcept::traversal_category , boost::bidirectional_traversal_tag > )); @@ -193,8 +192,8 @@ namespace boost_concepts public: ~RandomAccessTraversalConcept() { - BOOST_MPL_ASSERT(( - boost::is_convertible< + BOOST_CONCEPT_ASSERT(( + boost::ConvertibleConcept< BOOST_DEDUCED_TYPENAME RandomAccessTraversalConcept::traversal_category , boost::random_access_traversal_tag > )); From 230d47e93a4197204b0a7f4f0a7c7b4b4ef7e4df Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 30 Apr 2006 03:35:16 +0000 Subject: [PATCH 06/29] Move difference_type from the Forward Traversal Iterator concept to the Single Pass Traversal concept, so that input iterators are still input iterators. It does make sense to measure the distance between Single Pass iterators, provided you're willing to throw away the data. [SVN r33870] --- doc/new-iter-concepts.html | 514 ++++++++++++++---- doc/new-iter-concepts.pdf | Bin 175194 -> 175676 bytes doc/new-iter-concepts.rst | 48 +- .../boost/iterator/iterator_archetypes.hpp | 3 +- 4 files changed, 423 insertions(+), 142 deletions(-) diff --git a/doc/new-iter-concepts.html b/doc/new-iter-concepts.html index f50727a..5901c3c 100755 --- a/doc/new-iter-concepts.html +++ b/doc/new-iter-concepts.html @@ -3,13 +3,291 @@ - + New Iterator Concepts - +
@@ -27,7 +305,7 @@ Lab, Zephyr Associates, Inc. Date: 2004-11-01 -Number:This is a revised version of n1550=03-0133, which was +Number:This is a revised version of n1550=03-0133, which was accepted for Technical Report 1 by the C++ standard committee's library working group. This proposal is a revision of paper n1297, n1477, and n1531. @@ -51,8 +329,8 @@ of iterators that are used in practice. -
-

Table of Contents

+
+

Table of Contents

-
-

Motivation

+
+

Motivation

The standard iterator categories and requirements are flawed because they use a single hierarchy of concepts to address two orthogonal issues: iterator traversal and value access. As a result, many @@ -113,7 +391,7 @@ requirements in the iterator categories.

-Value Access Requirements in Existing Iterator Categories +Value Access Requirements in Existing Iterator Categories @@ -146,7 +424,7 @@ In paragraph 23.2.4/1 it says that a transform_iterator). +value of the some underlying iterator (see transform_iterator). For unary functions such as times, the return type of operator* clearly needs to be the result_type of the function object, which is typically not a reference. Because random access @@ -173,8 +451,8 @@ cannot separate the need for random access or bidirectional traversal from the need for a true reference return type.
-
-

Impact on the Standard

+
+

Impact on the Standard

This proposal for TR1 is a pure extension. Further, the new iterator concepts are backward-compatible with the old iterator requirements, and old iterators are forward-compatible with the new iterator @@ -189,13 +467,13 @@ made it). -DWA --> standards conforming input iterator is allowed to have a tag that is not input_iterator_tag but that is convertible to input_iterator_tag? -JGS --> -

-

Possible (but not proposed) Changes to the Working Paper

+
+

Possible (but not proposed) Changes to the Working Paper

The extensions in this paper suggest several changes we might make to the working paper for the next standard. These changes are not a formal part of this proposal for TR1.

-
-

Changes to Algorithm Requirements

+
+

Changes to Algorithm Requirements

The algorithms in the standard library could benefit from the new iterator concepts because the new concepts provide a more accurate way to express their type requirements. The result is algorithms that are @@ -239,7 +517,7 @@ Forward Iterator (2) -> Swappable Iterator and Incrementable Iterator

Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable and Swappable Iterator
partition
-

Bidirectional Iterator (1) -> Bidirectional Traversal Iterator and Readable Iterator, +

Bidirectional Iterator (1) -> Bidirectional Traversal Iterator and Readable Iterator, Bidirectional Iterator (2) -> Bidirectional Traversal Iterator and Writable Iterator

copy_backwards
@@ -259,15 +537,15 @@ Bidirectional Iterator (2) -> Bidirectional Traversal Iterator and Writable I
transform
-
-

Deprecations

+
+

Deprecations

For the next working paper (but not for TR1), the committee should consider deprecating the old iterator tags, and std::iterator_traits, since it will be superceded by individual traits metafunctions.

-
-

vector<bool>

+
+

vector<bool>

For the next working paper (but not for TR1), the committee should consider reclassifying vector<bool>::iterator as a Random Access Traversal Iterator and Readable Iterator and Writable @@ -275,8 +553,8 @@ Iterator.

-
-

Design

+
+

Design

The iterator requirements are to be separated into two groups. One set of concepts handles the syntax and semantics of value access:

    @@ -298,7 +576,7 @@ of concepts handles the syntax and semantics of value access:

The refinement relationships for the traversal concepts are in the following diagram.

-
traversal.png
+traversal.png

In addition to the iterator movement operators, such as operator++, the traversal concepts also include requirements on position comparison such as operator== and operator<. The @@ -313,7 +591,7 @@ interoperable with int

The relationship between the new iterator concepts and the old are given in the following diagram.

-
oldeqnew.png
+oldeqnew.png

Like the old iterator requirements, we provide tags for purposes of dispatching based on the traversal concepts. The tags are related via inheritance so that a tag is convertible to another tag if the concept @@ -346,19 +624,19 @@ only required to return something convertible to the i[n] = t (for a Writable Iterator).

-
-

Proposed Text

-
-

Addition to [lib.iterator.requirements]

-
-

Iterator Value Access Concepts [lib.iterator.value.access]

+
+

Proposed Text

+
+

Addition to [lib.iterator.requirements]

+
+

Iterator Value Access Concepts [lib.iterator.value.access]

In the tables below, X is an iterator type, a is a constant object of type X, R is std::iterator_traits<X>::reference, T is std::iterator_traits<X>::value_type, and v is a constant object of type T.

-
-

Readable Iterators [lib.readable.iterators]

+
+

Readable Iterators [lib.readable.iterators]

A class or built-in type X models the Readable Iterator concept for value type T if, in addition to X being Assignable and Copy Constructible, the following expressions are valid and respect @@ -371,11 +649,11 @@ type T.

-Readable Iterator Requirements (in addition to Assignable and Copy Constructible) +Readable Iterator Requirements (in addition to Assignable and Copy Constructible) -Expression -Return Type -Note/Precondition +Expression +Return Type +Note/Precondition @@ -399,9 +677,9 @@ non-cv-qualified type -
- +
+

Writable Iterators [lib.writable.iterators]

A class or built-in type X models the Writable Iterator concept if, in addition to X being Copy Constructible, the following expressions are valid and respect the stated semantics. Writable @@ -413,11 +691,11 @@ Iterators have an associated set of value types.

-Writable Iterator Requirements (in addition to Copy Constructible) +Writable Iterator Requirements (in addition to Copy Constructible) -Expression -Return Type -Precondition +Expression +Return Type +Precondition @@ -430,8 +708,8 @@ value types of X
-
-

Swappable Iterators [lib.swappable.iterators]

+
+

Swappable Iterators [lib.swappable.iterators]

A class or built-in type X models the Swappable Iterator concept if, in addition to X being Copy Constructible, the following expressions are valid and respect the stated semantics.

@@ -442,11 +720,11 @@ expressions are valid and respect the stated semantics.

-Swappable Iterator Requirements (in addition to Copy Constructible) +Swappable Iterator Requirements (in addition to Copy Constructible) -Expression -Return Type -Postcondition +Expression +Return Type +Postcondition @@ -461,8 +739,8 @@ exchanged Writable Iterator concepts is also a model of Swappable Iterator. --end note]

-
-

Lvalue Iterators [lib.lvalue.iterators]

+
+

Lvalue Iterators [lib.lvalue.iterators]

The Lvalue Iterator concept adds the requirement that the return type of operator* type be a reference to the value type of the iterator.

@@ -473,11 +751,11 @@ iterator.

-Lvalue Iterator Requirements +Lvalue Iterator Requirements -Expression -Return Type -Note/Assertion +Expression +Return Type +Note/Assertion @@ -497,14 +775,14 @@ Iterator then a *b.

-
-

Iterator Traversal Concepts [lib.iterator.traversal]

+
+

Iterator Traversal Concepts [lib.iterator.traversal]

In the tables below, X is an iterator type, a and b are constant objects of type X, r and s are mutable objects of type X, T is std::iterator_traits<X>::value_type, and v is a constant object of type T.

-
-

Incrementable Iterators [lib.incrementable.iterators]

+
+

Incrementable Iterators [lib.incrementable.iterators]

A class or built-in type X models the Incrementable Iterator concept if, in addition to X being Assignable and Copy Constructible, the following expressions are valid and respect the @@ -516,11 +794,11 @@ stated semantics.

-Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) +Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) -Expression -Return Type -Assertion +Expression +Return Type +Assertion @@ -551,27 +829,26 @@ to T z(*
-
-

Single Pass Iterators [lib.single.pass.iterators]

+
+

Single Pass Iterators [lib.single.pass.iterators]

A class or built-in type X models the Single Pass Iterator concept if the following expressions are valid and respect the stated semantics.

---+++ - + - - - + + - @@ -595,6 +872,13 @@ relation over its domain + + + + + @@ -606,8 +890,8 @@ relation over its domain -
-

Forward Traversal Iterators [lib.forward.traversal.iterators]

+
+

Forward Traversal Iterators [lib.forward.traversal.iterators]

A class or built-in type X models the Forward Traversal Iterator concept if, in addition to X meeting the requirements of Default Constructible and Single Pass Iterator, the following expressions are @@ -619,11 +903,11 @@ valid and respect the stated semantics.

- + - - - + + + @@ -638,11 +922,6 @@ singular value. dereferenceable implies ++r == ++s. - - - - @@ -653,8 +932,8 @@ the distance between iterators -
-

Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators]

+
+

Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators]

A class or built-in type X models the Bidirectional Traversal Iterator concept if, in addition to X meeting the requirements of Forward Traversal Iterator, the following expressions are valid and @@ -667,14 +946,14 @@ respect the stated semantics.

- - - - + + - @@ -716,8 +995,8 @@ implies r -

Random Access Traversal Iterators [lib.random.access.traversal.iterators]

+
+

Random Access Traversal Iterators [lib.random.access.traversal.iterators]

A class or built-in type X models the Random Access Traversal Iterator concept if the following expressions are valid and respect the stated semantics. In the table below, Distance is @@ -731,12 +1010,12 @@ constant object of type Distance<

- + - - - - + + + @@ -830,8 +1109,8 @@ ordering relation -
-

Interoperable Iterators [lib.interoperable.iterators]

+
+

Interoperable Iterators [lib.interoperable.iterators]

A class or built-in type X that models Single Pass Iterator is interoperable with a class or built-in type Y that also models Single Pass Iterator if the following expressions are valid and @@ -846,9 +1125,9 @@ constant object of type Distance<

- - - + + + @@ -888,10 +1167,10 @@ the following additional requirements must be met.

- - - - + + + + @@ -954,8 +1233,8 @@ the following additional requirements must be met.

-
-

Addition to [lib.iterator.synopsis]

+
+

Addition to [lib.iterator.synopsis]

 // lib.iterator.traits, traits and tags
 template <class Iterator> struct is_readable_iterator;
@@ -968,8 +1247,8 @@ struct bidirectional_traversal_tag : forward_traversal_tag { };
 struct random_access_traversal_tag : bidirectional_traversal_tag { };
 
-
-

Addition to [lib.iterator.traits]

+
+

Addition to [lib.iterator.traits]

The is_readable_iterator class template satisfies the UnaryTypeTrait requirements.

Given an iterator type X, is_readable_iterator<X>::value @@ -978,10 +1257,10 @@ convertible to iterator_traits< otherwise.

iterator_traversal<X>::type is

-category-to-traversal(iterator_traits<X>::iterator_category) 
+category-to-traversal(iterator_traits<X>::iterator_category)
 

where category-to-traversal is defined as follows

-
+
 category-to-traversal(C) =
     if (C is convertible to incrementable_traversal_tag)
         return C;
@@ -1000,8 +1279,8 @@ otherwise.

-
-

Footnotes

+
+

Footnotes

The UnaryTypeTrait concept is defined in n1519; the LWG is considering adding the requirement that specializations are derived from their nested ::type.

@@ -1014,10 +1293,11 @@ LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct LocalWords: TraversalTag typename lvalues DWA Hmm JGS mis enum -->
- diff --git a/doc/new-iter-concepts.pdf b/doc/new-iter-concepts.pdf index 636aaab772b21f5712c09522bc53590ef856258b..aa680ec96e1fffcee99b52be9ac8c528d8d1c72c 100755 GIT binary patch delta 65712 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

}>&*M2V7O=NVliuJC9`hM({;^uEvutf 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 -72}{*KhS##WKZ3 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

54?6BN=bwJ)uz{Jc`K8&s9Q_}-)_;>Z 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 diff --git a/doc/new-iter-concepts.rst b/doc/new-iter-concepts.rst index 389e52c..df4a70f 100644 --- a/doc/new-iter-concepts.rst +++ b/doc/new-iter-concepts.rst @@ -492,26 +492,30 @@ concept if the following expressions are valid and respect the stated semantics. -+--------------------------------------------------------------------------------------------------------+ -|Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality | -|Comparable) | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|Expression |Return Type | Operational |Assertion/ | -| | | Semantics |Pre-/Post-condition | -+================================+=============================+=============+===========================+ -|``++r`` |``X&`` | |pre: ``r`` is | -| | | |dereferenceable; post: | -| | | |``r`` is dereferenceable or| -| | | |``r`` is past-the-end | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|``a == b`` |convertible to ``bool`` | |``==`` is an equivalence | -| | | |relation over its domain | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|``a != b`` |convertible to ``bool`` |``!(a == b)``| | -+--------------------------------+-----------------------------+-------------+---------------------------+ -|``iterator_traversal::type`` |Convertible to | | | -| |``single_pass_traversal_tag``| | | -+--------------------------------+-----------------------------+-------------+---------------------------+ ++----------------------------------------------------------------------------------------------------------------+ +|Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality Comparable) | +| | ++----------------------------------------+-----------------------------+-------------+---------------------------+ +|Expression |Return Type | Operational |Assertion/ | +| | | Semantics |Pre-/Post-condition | ++========================================+=============================+=============+===========================+ +|``++r`` |``X&`` | |pre: ``r`` is | +| | | |dereferenceable; post: | +| | | |``r`` is dereferenceable or| +| | | |``r`` is past-the-end | ++----------------------------------------+-----------------------------+-------------+---------------------------+ +|``a == b`` |convertible to ``bool`` | |``==`` is an equivalence | +| | | |relation over its domain | ++----------------------------------------+-----------------------------+-------------+---------------------------+ +|``a != b`` |convertible to ``bool`` |``!(a == b)``| | ++----------------------------------------+-----------------------------+-------------+---------------------------+ +|``iterator_traits::difference_type`` |A signed integral type | | | +| |representing the distance | | | +| |between iterators | | | ++----------------------------------------+-----------------------------+-------------+---------------------------+ +|``iterator_traversal::type`` |Convertible to | | | +| |``single_pass_traversal_tag``| | | ++----------------------------------------+-----------------------------+-------------+---------------------------+ .. TR1: single_pass_iterator_tag changed to single_pass_traversal_tag for consistency @@ -537,10 +541,6 @@ valid and respect the stated semantics. | | |dereferenceable implies | | | |``++r == ++s.`` | +---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traits::difference_type``|A signed integral type representing| | -| |the distance between iterators | | -| | | | -+---------------------------------------+-----------------------------------+----------------------------+ |``iterator_traversal::type`` |Convertible to | | | |``forward_traversal_tag`` | | +---------------------------------------+-----------------------------------+----------------------------+ diff --git a/include/boost/iterator/iterator_archetypes.hpp b/include/boost/iterator/iterator_archetypes.hpp index 9ffa420..039de1c 100644 --- a/include/boost/iterator/iterator_archetypes.hpp +++ b/include/boost/iterator/iterator_archetypes.hpp @@ -196,6 +196,8 @@ namespace detail explicit archetype(ctor_arg arg) : traversal_archetype_(arg) {} + + typedef std::ptrdiff_t difference_type; }; }; @@ -219,7 +221,6 @@ namespace detail archetype() : traversal_archetype_(ctor_arg()) {} - typedef std::ptrdiff_t difference_type; }; }; From 2cb253ed350df75f249e285ffafbe1da909cd337 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 30 Apr 2006 03:38:28 +0000 Subject: [PATCH 07/29] Throw out bogus commented-out conversion operators. [SVN r33871] --- .../boost/iterator/detail/facade_iterator_category.hpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/include/boost/iterator/detail/facade_iterator_category.hpp b/include/boost/iterator/detail/facade_iterator_category.hpp index f50aef0..2c4771d 100755 --- a/include/boost/iterator/detail/facade_iterator_category.hpp +++ b/include/boost/iterator/detail/facade_iterator_category.hpp @@ -138,14 +138,6 @@ template struct iterator_category_with_traversal : Category, Traversal { -# if 0 - // Because of limitations on multiple user-defined conversions, - // this should be a good test of whether convertibility is enough - // in the spec, or whether we need to specify inheritance. - operator Category() const { return Category(); } - operator Traversal() const { return Traversal(); } -# endif - # if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) // Make sure this isn't used to build any categories where // convertibility to Traversal is redundant. Should just use the From 9f20320f59d606cfe10ec72517e05f03b69c55c8 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Mon, 1 May 2006 20:07:13 +0000 Subject: [PATCH 08/29] Change UnaryFunction -> UnaryFunc to get out of the way of the concept checking class for VC6. [SVN r33898] --- include/boost/iterator/transform_iterator.hpp | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/include/boost/iterator/transform_iterator.hpp b/include/boost/iterator/transform_iterator.hpp index d637527..3c0cc83 100644 --- a/include/boost/iterator/transform_iterator.hpp +++ b/include/boost/iterator/transform_iterator.hpp @@ -37,10 +37,10 @@ namespace boost namespace detail { - template + template struct function_object_result { - typedef typename UnaryFunction::result_type type; + typedef typename UnaryFunc::result_type type; }; #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION @@ -52,7 +52,7 @@ namespace boost #endif // Compute the iterator_adaptor instantiation to be used for transform_iterator - template + template struct transform_iterator_base { private: @@ -62,7 +62,7 @@ namespace boost // proposal (e.g. using Doug's result_of)? typedef typename ia_dflt_help< Reference - , function_object_result + , function_object_result >::type reference; // To get the default for Value: remove any reference on the @@ -77,7 +77,7 @@ namespace boost public: typedef iterator_adaptor< - transform_iterator + transform_iterator , Iterator , cv_value_type , use_default // Leave the traversal category alone @@ -86,12 +86,12 @@ namespace boost }; } - template + template class transform_iterator - : public detail::transform_iterator_base::type + : public detail::transform_iterator_base::type { typedef typename - detail::transform_iterator_base::type + detail::transform_iterator_base::type super_t; friend class iterator_core_access; @@ -99,7 +99,7 @@ namespace boost public: transform_iterator() { } - transform_iterator(Iterator const& x, UnaryFunction f) + transform_iterator(Iterator const& x, UnaryFunc f) : super_t(x), m_f(f) { } explicit transform_iterator(Iterator const& x) @@ -108,9 +108,9 @@ namespace boost // Pro8 is a little too aggressive about instantiating the // body of this function. #if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) - // don't provide this constructor if UnaryFunction is a + // don't provide this constructor if UnaryFunc is a // function pointer type, since it will be 0. Too dangerous. - BOOST_STATIC_ASSERT(is_class::value); + BOOST_STATIC_ASSERT(is_class::value); #endif } @@ -123,13 +123,13 @@ namespace boost transform_iterator const& t , typename enable_if_convertible::type* = 0 #if !BOOST_WORKAROUND(BOOST_MSVC, == 1310) - , typename enable_if_convertible::type* = 0 + , typename enable_if_convertible::type* = 0 #endif ) : super_t(t.base()), m_f(t.functor()) {} - UnaryFunction functor() const + UnaryFunc functor() const { return m_f; } private: @@ -138,38 +138,38 @@ namespace boost // Probably should be the initial base class so it can be // optimized away via EBO if it is an empty class. - UnaryFunction m_f; + UnaryFunc m_f; }; - template - transform_iterator - make_transform_iterator(Iterator it, UnaryFunction fun) + template + transform_iterator + make_transform_iterator(Iterator it, UnaryFunc fun) { - return transform_iterator(it, fun); + return transform_iterator(it, fun); } - // Version which allows explicit specification of the UnaryFunction + // Version which allows explicit specification of the UnaryFunc // type. // - // This generator is not provided if UnaryFunction is a function + // This generator is not provided if UnaryFunc is a function // pointer type, because it's too dangerous: the default-constructed // function pointer in the iterator be 0, leading to a runtime // crash. - template + template #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) typename mpl::if_< #else typename iterators::enable_if< #endif - is_class // We should probably find a cheaper test than is_class<> - , transform_iterator + is_class // We should probably find a cheaper test than is_class<> + , transform_iterator #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) , int[3] #endif >::type make_transform_iterator(Iterator it) { - return transform_iterator(it, UnaryFunction()); + return transform_iterator(it, UnaryFunc()); } #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) From eaf9bf62d19dc2cbf3438986f039090cf78aee1f Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Mon, 1 May 2006 21:42:56 +0000 Subject: [PATCH 09/29] Strip off "Concept" suffix. [SVN r33899] --- include/boost/iterator/iterator_concepts.hpp | 106 +++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index bb20aed..912a542 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -34,6 +34,8 @@ #include +#include + namespace boost_concepts { // Used a different namespace here (instead of "boost") so that the @@ -43,16 +45,15 @@ namespace boost_concepts //=========================================================================== // Iterator Access Concepts - template - struct ReadableIteratorConcept - : boost::AssignableConcept - , boost::CopyConstructibleConcept + BOOST_concept(ReadableIterator,(Iterator)) + : boost::Assignable + , boost::CopyConstructible { typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type value_type; typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::reference reference; - ~ReadableIteratorConcept() + ~ReadableIterator() { value_type v = *i; @@ -66,10 +67,10 @@ namespace boost_concepts typename Iterator , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type > - struct WritableIteratorConcept - : boost::CopyConstructibleConcept + WritableIterator + : boost::CopyConstructible { - ~WritableIteratorConcept() + ~WritableIterator() { *i = v; } @@ -77,11 +78,16 @@ namespace boost_concepts ValueType v; Iterator i; }; + + template < + typename Iterator + , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type + > + struct WritableIteratorConcept : WritableIterator {}; - template - struct SwappableIteratorConcept + BOOST_concept(SwappableIterator,(Iterator)) { - ~SwappableIteratorConcept() + ~SwappableIterator() { std::iter_swap(i1, i2); } @@ -90,12 +96,11 @@ namespace boost_concepts Iterator i2; }; - template - struct LvalueIteratorConcept + BOOST_concept(LvalueIterator,(Iterator)) { typedef typename boost::detail::iterator_traits::value_type value_type; - ~LvalueIteratorConcept() + ~LvalueIterator() { value_type& r = const_cast(*i); boost::ignore_unused_variable_warning(r); @@ -108,17 +113,16 @@ namespace boost_concepts //=========================================================================== // Iterator Traversal Concepts - template - struct IncrementableIteratorConcept - : boost::AssignableConcept - , boost::CopyConstructibleConcept + BOOST_concept(IncrementableIterator,(Iterator)) + : boost::Assignable + , boost::CopyConstructible { typedef typename boost::iterator_traversal::type traversal_category; - ~IncrementableIteratorConcept() + ~IncrementableIterator() { BOOST_CONCEPT_ASSERT(( - boost::ConvertibleConcept< + boost::Convertible< traversal_category , boost::incrementable_traversal_tag >)); @@ -130,51 +134,48 @@ namespace boost_concepts Iterator i; }; - template - struct SinglePassIteratorConcept - : IncrementableIteratorConcept - , boost::EqualityComparableConcept + BOOST_concept(SinglePassIterator,(Iterator)) + : IncrementableIterator + , boost::EqualityComparable { - ~SinglePassIteratorConcept() + ~SinglePassIterator() { BOOST_CONCEPT_ASSERT(( - boost::ConvertibleConcept< - BOOST_DEDUCED_TYPENAME SinglePassIteratorConcept::traversal_category + boost::Convertible< + BOOST_DEDUCED_TYPENAME SinglePassIterator::traversal_category , boost::single_pass_traversal_tag > )); } }; - template - struct ForwardTraversalConcept - : SinglePassIteratorConcept - , boost::DefaultConstructibleConcept + BOOST_concept(ForwardTraversal,(Iterator)) + : SinglePassIterator + , boost::DefaultConstructible { typedef typename boost::detail::iterator_traits::difference_type difference_type; - ~ForwardTraversalConcept() + ~ForwardTraversal() { BOOST_MPL_ASSERT((boost::is_integral)); BOOST_MPL_ASSERT_RELATION(std::numeric_limits::is_signed, ==, true); BOOST_CONCEPT_ASSERT(( - boost::ConvertibleConcept< - BOOST_DEDUCED_TYPENAME ForwardTraversalConcept::traversal_category + boost::Convertible< + BOOST_DEDUCED_TYPENAME ForwardTraversal::traversal_category , boost::forward_traversal_tag > )); } }; - template - struct BidirectionalTraversalConcept - : ForwardTraversalConcept + BOOST_concept(BidirectionalTraversal,(Iterator)) + : ForwardTraversal { - ~BidirectionalTraversalConcept() + ~BidirectionalTraversal() { BOOST_CONCEPT_ASSERT(( - boost::ConvertibleConcept< - BOOST_DEDUCED_TYPENAME BidirectionalTraversalConcept::traversal_category + boost::Convertible< + BOOST_DEDUCED_TYPENAME BidirectionalTraversal::traversal_category , boost::bidirectional_traversal_tag > )); @@ -185,16 +186,15 @@ namespace boost_concepts Iterator i; }; - template - struct RandomAccessTraversalConcept - : BidirectionalTraversalConcept + BOOST_concept(RandomAccessTraversal,(Iterator)) + : BidirectionalTraversal { public: - ~RandomAccessTraversalConcept() + ~RandomAccessTraversal() { BOOST_CONCEPT_ASSERT(( - boost::ConvertibleConcept< - BOOST_DEDUCED_TYPENAME RandomAccessTraversalConcept::traversal_category + boost::Convertible< + BOOST_DEDUCED_TYPENAME RandomAccessTraversal::traversal_category , boost::random_access_traversal_tag > )); @@ -207,12 +207,12 @@ namespace boost_concepts } private: - typename BidirectionalTraversalConcept::difference_type n; + typename BidirectionalTraversal::difference_type n; Iterator i, j; }; //=========================================================================== - // Iterator Interoperability Concept + // Iterator Interoperability namespace detail { @@ -258,8 +258,7 @@ namespace boost_concepts } // namespace detail - template - struct InteroperableIteratorConcept + BOOST_concept(InteroperableIterator,(Iterator)(ConstIterator)) { private: typedef typename boost::detail::pure_traversal_tag< @@ -275,10 +274,10 @@ namespace boost_concepts >::type const_traversal_category; public: - ~InteroperableIteratorConcept() + ~InteroperableIterator() { - BOOST_CONCEPT_ASSERT((SinglePassIteratorConcept)); - BOOST_CONCEPT_ASSERT((SinglePassIteratorConcept)); + BOOST_CONCEPT_ASSERT((SinglePassIterator)); + BOOST_CONCEPT_ASSERT((SinglePassIterator)); detail::interop_single_pass_constraints(i, ci); detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category()); @@ -293,5 +292,6 @@ namespace boost_concepts } // namespace boost_concepts +#include #endif // BOOST_ITERATOR_CONCEPTS_HPP From 3355660636b559bbd4ad1ad9bdc9a777a1822046 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 7 May 2006 21:00:35 +0000 Subject: [PATCH 10/29] Added missing 'struct' [SVN r33960] --- include/boost/iterator/iterator_concepts.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 912a542..71b08e2 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -67,7 +67,7 @@ namespace boost_concepts typename Iterator , typename ValueType = BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits::value_type > - WritableIterator + struct WritableIterator : boost::CopyConstructible { ~WritableIterator() From 1fad13e34f2e79556a4ec944c5ede8df3d450af9 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Mon, 11 Sep 2006 22:08:18 +0000 Subject: [PATCH 11/29] add missing license/copyright info [SVN r35068] --- doc/BidirectionalTraversal.html | 334 +++++++++++- doc/BidirectionalTraversal.rst | 4 + doc/ForwardTraversal.html | 330 +++++++++++- doc/ForwardTraversal.rst | 4 + doc/IncrementableIterator.html | 324 +++++++++++- doc/IncrementableIterator.rst | 4 + doc/InteroperableIterator.rst | 4 + doc/LvalueIterator.html | 324 +++++++++++- doc/LvalueIterator.rst | 4 + doc/RandomAccessTraversal.html | 390 ++++++++++++-- doc/RandomAccessTraversal.rst | 4 + doc/ReadableIterator.html | 334 +++++++++++- doc/ReadableIterator.rst | 3 + doc/SinglePassIterator.html | 334 +++++++++++- doc/SinglePassIterator.rst | 4 + doc/SwappableIterator.html | 316 ++++++++++- doc/SwappableIterator.rst | 4 + doc/WritableIterator.html | 316 ++++++++++- doc/WritableIterator.rst | 4 + doc/counting_iterator.html | 336 +++++++++++- doc/counting_iterator.rst | 4 + doc/counting_iterator_abstract.rst | 4 + doc/counting_iterator_eg.rst | 3 + doc/counting_iterator_ref.rst | 4 + doc/facade-and-adaptor.diff | 228 -------- doc/facade-and-adaptor.html | 785 ++++++++++++++++++++-------- doc/facade-and-adaptor.rst | 4 + doc/filter_iterator.html | 499 ++++++++++++++---- doc/filter_iterator.rst | 4 + doc/filter_iterator_abstract.rst | 4 + doc/filter_iterator_eg.rst | 3 + doc/func_output_iter_abstract.rst | 4 + doc/func_output_iter_ref.rst | 4 + doc/function_output_iterator.html | 333 +++++++++++- doc/function_output_iterator.rst | 4 + doc/function_output_iterator_eg.rst | 4 + doc/index.html | 332 +++++++++++- doc/index.rst | 4 + doc/indirect_iterator.html | 339 +++++++++++- doc/indirect_iterator.rst | 4 + doc/indirect_iterator_abstract.rst | 4 + doc/indirect_iterator_eg.rst | 4 + doc/indirect_iterator_ref.diff | 245 --------- doc/indirect_iterator_ref.html | 420 ++++++++++++--- doc/indirect_iterator_ref.rst | 4 + doc/issues.html | 415 ++++++++++++--- doc/iterator_adaptor.html | 361 +++++++++++-- doc/iterator_adaptor.rst | 4 + doc/iterator_adaptor_abstract.diff | 22 - doc/iterator_adaptor_abstract.rst | 4 + doc/iterator_adaptor_body.diff | 35 -- doc/iterator_adaptor_body.rst | 4 + doc/iterator_adaptor_ref.html | 330 +++++++++++- doc/iterator_adaptor_ref.rst | 4 + doc/iterator_archetypes.html | 332 +++++++++++- doc/iterator_archetypes.rst | 4 + doc/iterator_concepts.html | 310 ++++++++++- doc/iterator_concepts.rst | 4 +- doc/iterator_facade.html | 533 +++++++++++++++---- doc/iterator_facade.rst | 4 + doc/iterator_facade_abstract.rst | 4 + doc/iterator_facade_body.rst | 4 + doc/iterator_facade_ref.rst | 4 + doc/iterator_traits.html | 324 +++++++++++- doc/iterator_traits.rst | 4 + doc/make_counting_iterator.rst | 3 + doc/make_filter_iterator.html | 298 ++++++++++- doc/make_filter_iterator.rst | 3 + doc/make_reverse_iterator.rst | 4 + doc/make_transform_iterator.rst | 4 + doc/make_zip_iterator.rst | 4 + doc/new-iter-concepts.html | 21 +- doc/new-iter-concepts.rst | 4 + doc/permutation_iter_abstract.rst | 4 + doc/permutation_iterator.html | 360 +++++++++++-- doc/permutation_iterator.rst | 4 + doc/permutation_iterator_body.rst | 4 + doc/permutation_iterator_eg.rst | 4 + doc/permutation_iterator_ref.rst | 4 + doc/pointee.html | 318 ++++++++++- doc/pointee.rst | 4 + doc/ref_problem.html | 353 +++++++++++-- doc/reverse_iterator.html | 340 +++++++++++- doc/reverse_iterator.rst | 4 + doc/reverse_iterator_abstract.rst | 3 + doc/reverse_iterator_eg.rst | 3 + doc/reverse_iterator_ref.rst | 4 + doc/rst2html | 5 +- doc/rst2latex | 3 + doc/transform_iterator.html | 342 +++++++++++- doc/transform_iterator.rst | 4 + doc/transform_iterator_abstract.rst | 4 + doc/transform_iterator_eg.rst | 4 + doc/transform_iterator_ref.diff | 202 ------- doc/transform_iterator_ref.rst | 4 + doc/zip_iterator.html | 370 +++++++++++-- doc/zip_iterator.rst | 4 + doc/zip_iterator_abstract.rst | 4 + doc/zip_iterator_eg.rst | 4 + doc/zip_iterator_ref.rst | 3 + 100 files changed, 10068 insertions(+), 1965 deletions(-) delete mode 100755 doc/facade-and-adaptor.diff delete mode 100644 doc/indirect_iterator_ref.diff delete mode 100755 doc/iterator_adaptor_abstract.diff delete mode 100755 doc/iterator_adaptor_body.diff delete mode 100644 doc/transform_iterator_ref.diff diff --git a/doc/BidirectionalTraversal.html b/doc/BidirectionalTraversal.html index 9de555e..5bc8342 100644 --- a/doc/BidirectionalTraversal.html +++ b/doc/BidirectionalTraversal.html @@ -3,48 +3,333 @@ - + Bidirectional Traversal Concept - + -

Bidirectional Traversal Concept

-

A class or built-in type X models the Bidirectional Traversal -concept if, in addition to X meeting the requirements of Forward +

Bidirectional Traversal Concept

+ + + +

A class or built-in type X models the Bidirectional Traversal +concept if, in addition to X meeting the requirements of Forward Traversal Iterator, the following expressions are valid and respect the stated semantics.

-
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality -Comparable)
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality Comparable)
ExpressionReturn TypeOperational +
ExpressionReturn TypeOperational SemanticsAssertion/ +Assertion/ Pre-/Post-condition
!(a == b)  
iterator_traits<X>::difference_typeA signed integral type +representing the distance +between iterators  
iterator_traversal<X>::type Convertible to single_pass_traversal_tag
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
ExpressionReturn TypeAssertion/Note
ExpressionReturn TypeAssertion/Note
iterator_traits<X>::difference_typeA signed integral type representing -the distance between iterators 
iterator_traversal<X>::type Convertible to forward_traversal_tag
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal +
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal Iterator)
ExpressionReturn TypeOperational +
ExpressionReturn TypeOperational SemanticsAssertion/ +Assertion/ Pre-/Post-condition
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal Iterator)
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal Iterator)
ExpressionReturn TypeOperational SemanticsAssertion/ +
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
ExpressionReturn TypeAssertion/Precondition/Postcondition
ExpressionReturn TypeAssertion/Precondition/Postcondition
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
+
- - - - + + - - + + +--(++r) == r. +--r == --s +implies r == +s. &r == &--r. - - + + - + +bidirectional_traversal_tag
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal +
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal Iterator)
ExpressionReturn TypeAssertion/Semantics / +
ExpressionReturn TypeAssertion/Semantics / Pre-/Post-condition
--rX&
--rX& pre: there exists -s such that r +s such that r == ++s. post: -s is +s is dereferenceable. ---(++r) == r. ---r == --s -implies r == -s. &r == &--r.
r--convertible to const X&
r--convertible to const X&
 {
   X tmp = r;
@@ -54,18 +339,13 @@ implies r ==
 
iterator_traversal<X>::type
iterator_traversal<X>::type Convertible to -bidirectional_traversal_tag 
- - diff --git a/doc/BidirectionalTraversal.rst b/doc/BidirectionalTraversal.rst index 8655c63..a62b8bd 100755 --- a/doc/BidirectionalTraversal.rst +++ b/doc/BidirectionalTraversal.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Bidirectional Traversal Concept ............................... diff --git a/doc/ForwardTraversal.html b/doc/ForwardTraversal.html index 80447aa..934aa56 100644 --- a/doc/ForwardTraversal.html +++ b/doc/ForwardTraversal.html @@ -3,60 +3,340 @@ - + Forward Traversal Concept - + -

Forward Traversal Concept

-

A class or built-in type X models the Forward Traversal -concept if, in addition to X meeting the requirements of Default +

Forward Traversal Concept

+ + + +

A class or built-in type X models the Forward Traversal +concept if, in addition to X meeting the requirements of Default Constructible and Single Pass Iterator, the following expressions are valid and respect the stated semantics.

- +
- + - - - + + + - - - + + - - - + + +++r == ++s. - + - + +forward_traversal_tag
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
ExpressionReturn TypeAssertion/Note
ExpressionReturn TypeAssertion/Note
X u;X&note: u may have a +
X u;X&note: u may have a singular value.
++rX&r == s and r is +
++rX&r == s and r is dereferenceable implies -++r == ++s.
iterator_traits<X>::difference_type
iterator_traits<X>::difference_type A signed integral type representing the distance between iterators  
iterator_traversal<X>::type
iterator_traversal<X>::type Convertible to -forward_traversal_tag  
- - diff --git a/doc/ForwardTraversal.rst b/doc/ForwardTraversal.rst index c4156d5..80dd9c7 100755 --- a/doc/ForwardTraversal.rst +++ b/doc/ForwardTraversal.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Forward Traversal Concept ......................... diff --git a/doc/IncrementableIterator.html b/doc/IncrementableIterator.html index 0544d22..c42cfff 100644 --- a/doc/IncrementableIterator.html +++ b/doc/IncrementableIterator.html @@ -3,38 +3,323 @@ - + Incrementable Iterator Concept - + -

Incrementable Iterator Concept

-

A class or built-in type X models the Incrementable Iterator -concept if, in addition to X being Assignable and Copy +

Incrementable Iterator Concept

+ + + +

A class or built-in type X models the Incrementable Iterator +concept if, in addition to X being Assignable and Copy Constructible, the following expressions are valid and respect the stated semantics.

- +
- + - - - + + + - - - + + + - - + + - + +incrementable_traversal_tag
Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
ExpressionReturn TypeAssertion/Semantics
ExpressionReturn TypeAssertion/Semantics
++rX&&r == &++r
++rX&&r == &++r
r++X
r++X
 {
    X tmp = r;
@@ -44,18 +329,13 @@ stated semantics.

iterator_traversal<X>::type
iterator_traversal<X>::type Convertible to -incrementable_traversal_tag  
- - diff --git a/doc/IncrementableIterator.rst b/doc/IncrementableIterator.rst index f14928e..a1f92ec 100755 --- a/doc/IncrementableIterator.rst +++ b/doc/IncrementableIterator.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Incrementable Iterator Concept .............................. diff --git a/doc/InteroperableIterator.rst b/doc/InteroperableIterator.rst index 0cb751e..3632ff2 100644 --- a/doc/InteroperableIterator.rst +++ b/doc/InteroperableIterator.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Interoperable Iterator Concept .............................. diff --git a/doc/LvalueIterator.html b/doc/LvalueIterator.html index 29b3187..6575694 100644 --- a/doc/LvalueIterator.html +++ b/doc/LvalueIterator.html @@ -3,49 +3,329 @@ - + Lvalue Iterator Concept - + -

Lvalue Iterator Concept

+

Lvalue Iterator Concept

+ + +

The Lvalue Iterator concept adds the requirement that the return -type of operator* type be a reference to the value type of the +type of operator* type be a reference to the value type of the iterator.

- +
- + - - - + + + - - - + + +pre: a is +dereferenceable. If a +== b then *a is +equivalent to *b.
Lvalue Iterator Requirements
Lvalue Iterator Requirements
ExpressionReturn TypeNote/Assertion
ExpressionReturn TypeNote/Assertion
*aT&T is cv -iterator_traits<X>::value_type +
*aT&T is cv +iterator_traits<X>::value_type where cv is an optional cv-qualification. -pre: a is -dereferenceable. If a -== b then *a is -equivalent to *b.
- - diff --git a/doc/LvalueIterator.rst b/doc/LvalueIterator.rst index 46c61b1..39c2672 100755 --- a/doc/LvalueIterator.rst +++ b/doc/LvalueIterator.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Lvalue Iterator Concept ....................... diff --git a/doc/RandomAccessTraversal.html b/doc/RandomAccessTraversal.html index 761ab0d..4dd09ca 100644 --- a/doc/RandomAccessTraversal.html +++ b/doc/RandomAccessTraversal.html @@ -3,19 +3,304 @@ - + Random Access Traversal Concept - + -

Random Access Traversal Concept

-

A class or built-in type X models the Random Access Traversal +

Random Access Traversal Concept

+ + + +

A class or built-in type X models the Random Access Traversal concept if the following expressions are valid and respect the stated -semantics. In the table below, Distance is -iterator_traits<X>::difference_type and n represents a -constant object of type Distance.

- +semantics. In the table below, Distance is +iterator_traits<X>::difference_type and n represents a +constant object of type Distance.

+
@@ -23,18 +308,18 @@ constant object of type Distance - + - - - - + + + - - + + - - - + + - - - + + + - - - + + - - - + + - + - + - + - + - - - - + + + - - - - + + + - - - + + + - - - + + + - + +random_access_traversal_tag
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
ExpressionReturn TypeOperational SemanticsAssertion/ +
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
r += nX&
r += nX&
 {
   Distance m = n;
@@ -50,80 +335,75 @@ Precondition
 
 
a + n, n + aX{ X tmp = a; return tmp +
a + n, n + aX{ X tmp = a; return tmp += n; }  
r -= nX&return r += -n
r -= nX&return r += -n  
a - nX{ X tmp = a; return tmp +
a - nX{ X tmp = a; return tmp -= n; }  
b - aDistancea < b ?  distance(a,b) +
b - aDistancea < b ?  distance(a,b) : -distance(b,a) pre: there exists a -value n of -Distance such that -a + n == b. b +value n of +Distance such that +a + n == b. b == a + (b - a).
a[n]
a[n] convertible to T*(a + n)*(a + n) pre: a is a Readable Iterator
a[n] = v
a[n] = v convertible to T*(a + n) = v*(a + n) = v pre: a is a Writable iterator
a < bconvertible to boolb - a > 0< is a total +
a < bconvertible to boolb - a > 0< is a total ordering relation
a > bconvertible to boolb < a> is a total +
a > bconvertible to boolb < a> is a total ordering relation
a >= bconvertible to bool!(a < b)
a >= bconvertible to bool!(a < b)  
a <= bconvertible to bool!(a > b)
a <= bconvertible to bool!(a > b)  
iterator_traversal<X>::type
iterator_traversal<X>::type Convertible to -random_access_traversal_tag   
- - diff --git a/doc/RandomAccessTraversal.rst b/doc/RandomAccessTraversal.rst index 97b0f3d..490faf6 100644 --- a/doc/RandomAccessTraversal.rst +++ b/doc/RandomAccessTraversal.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Random Access Traversal Concept ............................... diff --git a/doc/ReadableIterator.html b/doc/ReadableIterator.html index df231d3..b6873c4 100644 --- a/doc/ReadableIterator.html +++ b/doc/ReadableIterator.html @@ -3,57 +3,337 @@ - + Readable Iterator Concept - + -

Readable Iterator Concept

-

A class or built-in type X models the Readable Iterator concept -for value type T if, in addition to X being Assignable and +

Readable Iterator Concept

+ + + +

A class or built-in type X models the Readable Iterator concept +for value type T if, in addition to X being Assignable and Copy Constructible, the following expressions are valid and respect -the stated semantics. U is the type of any specified member of -type T.

- +the stated semantics. U is the type of any specified member of +type T.

+
- + - - - + + + - - + + - - - + + - - - + + +
Readable Iterator Requirements (in addition to Assignable and Copy Constructible)
Readable Iterator Requirements (in addition to Assignable and Copy Constructible)
ExpressionReturn TypeNote/Precondition
ExpressionReturn TypeNote/Precondition
iterator_traits<X>::value_typeT
iterator_traits<X>::value_typeT Any non-reference, non-cv-qualified type
*aConvertible to T
-
pre: a is dereferenceable. If a == b then *a
-
is equivalent to *b.
+
*aConvertible to T
+
pre: a is dereferenceable. If a == b then *a
+
is equivalent to *b.
a->mU&pre: pre: (*a).m is well-defined. Equivalent to (*a).m.
a->mU&pre: pre: (*a).m is well-defined. Equivalent to (*a).m.
- - diff --git a/doc/ReadableIterator.rst b/doc/ReadableIterator.rst index d38dad5..27f79f8 100755 --- a/doc/ReadableIterator.rst +++ b/doc/ReadableIterator.rst @@ -1,3 +1,6 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Readable Iterator Concept ......................... diff --git a/doc/SinglePassIterator.html b/doc/SinglePassIterator.html index bd176d8..9a725e7 100644 --- a/doc/SinglePassIterator.html +++ b/doc/SinglePassIterator.html @@ -3,61 +3,341 @@ - + Single Pass Iterator Concept - + -

Single Pass Iterator Concept

-

A class or built-in type X models the Single Pass Iterator +

Single Pass Iterator Concept

+ + + +

A class or built-in type X models the Single Pass Iterator concept if the following expressions are valid and respect the stated semantics.

- +
- - - - + + - - - + + +r is dereferenceable or +r is past-the-end - - - + + - - - + + + - + +single_pass_traversal_tag
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality +
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality Comparable)
ExpressionReturn TypeAssertion/Semantics / +
ExpressionReturn TypeAssertion/Semantics / Pre-/Post-condition
++rX&pre: r is +
++rX&pre: r is dereferenceable; post: -r is dereferenceable or -r is past-the-end
a == bconvertible to bool== is an equivalence +
a == bconvertible to bool== is an equivalence relation over its domain
a != bconvertible to bool!(a == b)
a != bconvertible to bool!(a == b)
iterator_traversal<X>::type
iterator_traversal<X>::type Convertible to -single_pass_traversal_tag  
- - diff --git a/doc/SinglePassIterator.rst b/doc/SinglePassIterator.rst index 2754d97..eaa50e0 100755 --- a/doc/SinglePassIterator.rst +++ b/doc/SinglePassIterator.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Single Pass Iterator Concept ............................ diff --git a/doc/SwappableIterator.html b/doc/SwappableIterator.html index 7478e5f..c11b570 100644 --- a/doc/SwappableIterator.html +++ b/doc/SwappableIterator.html @@ -3,47 +3,327 @@ - + Swappable Iterator Concept - + -

Swappable Iterator Concept

-

A class or built-in type X models the Swappable Iterator concept -if, in addition to X being Copy Constructible, the following +

Swappable Iterator Concept

+ + + +

A class or built-in type X models the Swappable Iterator concept +if, in addition to X being Copy Constructible, the following expressions are valid and respect the stated semantics.

- +
- + - - - + + + - - + +
Swappable Iterator Requirements (in addition to Copy Constructible)
Swappable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePostcondition
ExpressionReturn TypePostcondition
iter_swap(a, b)void
iter_swap(a, b)void the pointed to values are exchanged
-
+
[Note: An iterator that is a model of the Readable and Writable Iterator concepts
is also a model of Swappable Iterator. --end note]
- - diff --git a/doc/SwappableIterator.rst b/doc/SwappableIterator.rst index ec94d32..55554e7 100755 --- a/doc/SwappableIterator.rst +++ b/doc/SwappableIterator.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Swappable Iterator Concept .......................... diff --git a/doc/WritableIterator.html b/doc/WritableIterator.html index c3676bf..76d621d 100644 --- a/doc/WritableIterator.html +++ b/doc/WritableIterator.html @@ -3,45 +3,325 @@ - + Writable Iterator Concept - + -

Writable Iterator Concept

-

A class or built-in type X models the Writable Iterator concept -if, in addition to X being Copy Constructible, the following +

Writable Iterator Concept

+ + + +

A class or built-in type X models the Writable Iterator concept +if, in addition to X being Copy Constructible, the following expressions are valid and respect the stated semantics. Writable Iterators have an associated set of value types.

- +
- + - - - + + + - + - +value types of X
Writable Iterator Requirements (in addition to Copy Constructible)
Writable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePrecondition
ExpressionReturn TypePrecondition
*a = o
*a = o  pre: The type of o +pre: The type of o is in the set of -value types of X
- - diff --git a/doc/WritableIterator.rst b/doc/WritableIterator.rst index 7b854cc..49b6e16 100755 --- a/doc/WritableIterator.rst +++ b/doc/WritableIterator.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + Writable Iterator Concept ......................... diff --git a/doc/counting_iterator.html b/doc/counting_iterator.html index 8faa043..63136f0 100644 --- a/doc/counting_iterator.html +++ b/doc/counting_iterator.html @@ -3,13 +3,295 @@ - + Counting Iterator - +
@@ -32,6 +314,9 @@ Railway Operation and Construction Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. + + + @@ -44,6 +329,9 @@ The counting iterator adaptor adds this crucial piece of functionality to whatever type it wraps. One can use the counting iterator adaptor not only with integer types, but with any incrementable type.

+ + +

counting_iterator adapts an object by adding an operator* that returns the current value of the object. All other iterator operations are forwarded to the adapted object.

@@ -51,8 +339,8 @@ are forwarded to the adapted object.

-
-

Table of Contents

+
+

Table of Contents

-
-

counting_iterator synopsis

+
+

counting_iterator synopsis

+ + +
 template <
     class Incrementable
@@ -102,7 +393,7 @@ else if (numeric_limits<Incrementable>::is_specialized)
         random_access_traversal_tag, Incrementable, const Incrementable&)
 else
     return iterator-category(
-         iterator_traversal<Incrementable>::type, 
+         iterator_traversal<Incrementable>::type,
          Incrementable, const Incrementable&)
 
@@ -112,8 +403,8 @@ the cases where std::numeric_limi is true.]
-
-

counting_iterator requirements

+
+

counting_iterator requirements

The Incrementable argument shall be Copy Constructible and Assignable.

If iterator_category is convertible to forward_iterator_tag or forward_traversal_tag, the following must be well-formed:

@@ -138,8 +429,8 @@ n = i - j; i < j;
-
-

counting_iterator models

+
+

counting_iterator models

Specializations of counting_iterator model Readable Lvalue Iterator. In addition, they model the concepts corresponding to the iterator tags to which their iterator_category is convertible. @@ -154,8 +445,8 @@ concepts modeled by Incrementable counting_iterator<Y,C2,D2> if and only if X is interoperable with Y.

-
-

counting_iterator operations

+
+

counting_iterator operations

In addition to the operations required by the concepts modeled by counting_iterator, counting_iterator provides the following operations.

@@ -228,6 +519,9 @@ operations.

+ + +
 template <class Incrementable>
 counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
@@ -241,9 +535,12 @@ with current construc
 
 
 
+
+
+
 
-
-

Example

+
+

Example

This example fills an array with numbers and a second array with pointers into the first array, using counting_iterator for both tasks. Finally indirect_iterator is used to print out the numbers @@ -261,7 +558,7 @@ std::copy(boost::make_counting_iterator(numbers.begin()), boost::make_counting_iterator(numbers.end()), std::back_inserter(pointers)); -std::cout << "indirectly printing out the numbers from 0 to " +std::cout << "indirectly printing out the numbers from 0 to " << N << std::endl; std::copy(boost::make_indirect_iterator(pointers.begin()), boost::make_indirect_iterator(pointers.end()), @@ -271,15 +568,10 @@ std::cout << std::endl;

The output is:

 indirectly printing out the numbers from 0 to 7
-0 1 2 3 4 5 6 
+0 1 2 3 4 5 6
 

The source code for this example can be found here.

- - diff --git a/doc/counting_iterator.rst b/doc/counting_iterator.rst index 191011a..ff7da3c 100644 --- a/doc/counting_iterator.rst +++ b/doc/counting_iterator.rst @@ -1,3 +1,7 @@ +.. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +++++++++++++++++++ Counting Iterator +++++++++++++++++++ diff --git a/doc/counting_iterator_abstract.rst b/doc/counting_iterator_abstract.rst index bdb8491..117b94e 100644 --- a/doc/counting_iterator_abstract.rst +++ b/doc/counting_iterator_abstract.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + ``counting_iterator`` adapts an object by adding an ``operator*`` that returns the current value of the object. All other iterator operations are forwarded to the adapted object. diff --git a/doc/counting_iterator_eg.rst b/doc/counting_iterator_eg.rst index 5f6b3b3..b64562d 100644 --- a/doc/counting_iterator_eg.rst +++ b/doc/counting_iterator_eg.rst @@ -1,3 +1,6 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Example ....... diff --git a/doc/counting_iterator_ref.rst b/doc/counting_iterator_ref.rst index bc94db7..1c5fd1c 100644 --- a/doc/counting_iterator_ref.rst +++ b/doc/counting_iterator_ref.rst @@ -1,3 +1,7 @@ +.. Copyright David Abrahams 2006. Distributed under the Boost +.. Software License, Version 1.0. (See accompanying +.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + :: template < diff --git a/doc/facade-and-adaptor.diff b/doc/facade-and-adaptor.diff deleted file mode 100755 index 07f0e40..0000000 --- a/doc/facade-and-adaptor.diff +++ /dev/null @@ -1,228 +0,0 @@ -Index: facade-and-adaptor.rst -=================================================================== -RCS file: /cvsroot/boost/boost/libs/iterator/doc/facade-and-adaptor.rst,v -retrieving revision 1.9 -retrieving revision 1.14 -diff -b -d -u -r1.9 -r1.14 ---- facade-and-adaptor.rst 22 Sep 2003 19:55:00 -0000 1.9 -+++ facade-and-adaptor.rst 18 Jan 2004 15:51:06 -0000 1.14 -@@ -3,17 +3,25 @@ None - +++++++++++++++++++++++++++++ - - :Author: David Abrahams, Jeremy Siek, Thomas Witt --:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@acm.org -+:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com - :organization: `Boost Consulting`_, Indiana University `Open Systems -- Lab`_, University of Hanover `Institute for Transport -- Railway Operation and Construction`_ --:date: $Date: 2004/01/18 19:56:39 $ --:Number: N1530=03-0113 -+ Lab`_, `Zephyr Associates, Inc.`_ -+:date: $Date: 2004/01/18 19:56:39 $ -+ -+:Number: This is a revised version of N1530_\ =03-0113, which was -+ accepted for Technical Report 1 by the C++ standard -+ committee's library working group. -+ -+.. Version 1.9 of this ReStructuredText document corresponds to -+ n1530_, the paper accepted by the LWG. -+ -+.. _n1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html -+ - :copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved - - .. _`Boost Consulting`: http://www.boost-consulting.com - .. _`Open Systems Lab`: http://www.osl.iu.edu --.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de -+.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - - :abstract: We propose a set of class templates that help programmers - build standard-conforming iterators, both from scratch and -@@ -124,15 +132,15 @@ None - ================= - - This proposal is formulated in terms of the new ``iterator concepts`` --as proposed in `n1477`_, since user-defined and especially adapted -+as proposed in n1550_, since user-defined and especially adapted - iterators suffer from the well known categorization problems that are - inherent to the current iterator categories. - --.. _`n1477`: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1477.html -+.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html - --This proposal does not strictly depend on proposal `n1477`_, as there -+This proposal does not strictly depend on proposal n1550_, as there - is a direct mapping between new and old categories. This proposal --could be reformulated using this mapping if `n1477`_ was not accepted. -+could be reformulated using this mapping if n1550_ was not accepted. - - Interoperability - ================ -@@ -141,24 +149,24 @@ None - current standard. There are currently two defect reports that are - concerned with interoperability issues. - --Issue `179`_ concerns the fact that mutable container iterator types -+Issue 179_ concerns the fact that mutable container iterator types - are only required to be convertible to the corresponding constant - iterator types, but objects of these types are not required to - interoperate in comparison or subtraction expressions. This situation - is tedious in practice and out of line with the way built in types - work. This proposal implements the proposed resolution to issue --`179`_, as most standard library implementations do nowadays. In other -+179_, as most standard library implementations do nowadays. In other - words, if an iterator type A has an implicit or user defined - conversion to an iterator type B, the iterator types are interoperable - and the usual set of operators are available. - --Issue `280`_ concerns the current lack of interoperability between -+Issue 280_ concerns the current lack of interoperability between - reverse iterator types. The proposed new reverse_iterator template - fixes the issues raised in 280. It provides the desired - interoperability without introducing unwanted overloads. - --.. _`179`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179 --.. _`280`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280 -+.. _179: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179 -+.. _280: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280 - - - Iterator Facade -@@ -195,7 +203,7 @@ None - * ``filter_iterator``, which provides a view of an iterator range in - which some elements of the underlying range are skipped. - --.. _counting_iterator: -+.. _counting: - - * ``counting_iterator``, which adapts any incrementable type - (e.g. integers, iterators) so that incrementing/decrementing the -@@ -226,15 +234,13 @@ Issue 9.1 et al - :: - - struct use_default; -- const unsigned use_default_access = -1; - - struct iterator_core_access { /* implementation detail */ }; - - template < - class Derived - , class Value -- , unsigned AccessCategory -- , class TraversalCategory -+ , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > -@@ -244,8 +250,7 @@ Issue 9.1 et al. - class Derived - , class Base - , class Value = use_default -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > -@@ -254,10 +259,9 @@ Issue 9.1 et al. - template < - class Iterator - , class Value = use_default -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator; - -Issue 9.44y - -+ template -+ struct pointee; -+ -+ template -+ struct indirect_reference; -+ - template - class reverse_iterator; - -@@ -277,8 +287,7 @@ Issue 9.1 et al. - - template < - class Incrementable -- , unsigned Access = use_default_access -- , class Traversal = use_default -+ , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator -@@ -312,17 +321,35 @@ Issue 9.8 - Specialized adaptors [lib.iterator.special.adaptors] - ==================================================== - --.. The requirements for all of these need to be written *much* more -- formally -DWA -- - --[*Note:* The ``enable_if_convertible::type`` expression used in -+The ``enable_if_convertible::type`` expression used in - this section is for exposition purposes. The converting constructors - for specialized adaptors should be only be in an overload set provided - that an object of type ``X`` is implicitly convertible to an object of --type ``Y``. The ``enable_if_convertible`` approach uses SFINAE to -+type ``Y``. -+The signatures involving ``enable_if_convertible`` should behave -+*as-if* ``enable_if_convertible`` were defined to be:: -+ -+ template enable_if_convertible_impl -+ {}; -+ -+ template <> enable_if_convertible_impl -+ { struct type; }; -+ -+ template -+ struct enable_if_convertible -+ : enable_if_convertible_impl::value> -+ {}; -+ -+If an expression other than the default argument is used to supply -+the value of a function parameter whose type is written in terms -+of ``enable_if_convertible``, the program is ill-formed, no -+diagnostic required. -+ -+[*Note:* The ``enable_if_convertible`` approach uses SFINAE to - take the constructor out of the overload set when the types are not --implicitly convertible.] -+implicitly convertible. -+] - - - Indirect iterator -@@ -330,6 +357,16 @@ Issue 9.44y - - .. include:: indirect_iterator_abstract.rst - -+Class template ``pointee`` -+.................................... -+ -+.. include:: pointee_ref.rst -+ -+Class template ``indirect_reference`` -+..................................... -+ -+.. include:: indirect_reference_ref.rst -+ - Class template ``indirect_iterator`` - .................................... - -@@ -393,8 +430,7 @@ - - - --.. -- LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate -+.. LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate - LocalWords: CRTP metafunctions inlining lvalue JGS incrementable BGL LEDA cv - LocalWords: GraphBase struct ptrdiff UnaryFunction const int typename bool pp - LocalWords: lhs rhs SFINAE markup iff tmp OtherDerived OtherIterator DWA foo diff --git a/doc/facade-and-adaptor.html b/doc/facade-and-adaptor.html index 10049b7..d2199e6 100755 --- a/doc/facade-and-adaptor.html +++ b/doc/facade-and-adaptor.html @@ -3,12 +3,294 @@ - + Iterator Facade and Adaptor - +
@@ -32,6 +314,9 @@ committee's library working group. + + + @@ -52,8 +337,8 @@ by adapting other iterators.
-
-

Table of Contents

+
+

Table of Contents

-
-

Motivation

+
+

Motivation

Iterators play an important role in modern C++ programming. The iterator is the central abstraction of the algorithms of the Standard Library, allowing algorithms to be re-used in in a wide variety of @@ -225,16 +510,16 @@ of more specialized adaptors, such as the

-
-

Impact on the Standard

+
+

Impact on the Standard

This proposal is purely an addition to the C++ standard library. However, note that this proposal relies on the proposal for New Iterator Concepts.

-
-

Design

-
-

Iterator Concepts

+
+

Design

+
+

Iterator Concepts

This proposal is formulated in terms of the new iterator concepts as proposed in n1550, since user-defined and especially adapted iterators suffer from the well known categorization problems that are @@ -243,8 +528,8 @@ inherent to the current iterator categories.

is a direct mapping between new and old categories. This proposal could be reformulated using this mapping if n1550 was not accepted.

-
-

Interoperability

+
+

Interoperability

The question of iterator interoperability is poorly addressed in the current standard. There are currently two defect reports that are concerned with interoperability issues.

@@ -263,11 +548,14 @@ reverse iterator types. The proposed new reverse_iterator template fixes the issues raised in 280. It provides the desired interoperability without introducing unwanted overloads.

-
-

Iterator Facade

+
+

Iterator Facade

+ + + - +

While the iterator interface is rich, there is a core subset of the interface that is necessary for all the functionality. We have identified the following core behaviors for iterators:

@@ -307,8 +595,8 @@ iterators, and a separate iterato impossible. -
-

Usage

+
+

Usage

The user of iterator_facade derives his iterator class from a specialization of iterator_facade and passes the derived iterator class as iterator_facade's first template parameter. @@ -331,8 +619,8 @@ requirements.

-Expression -Effects +Expression +Effects @@ -371,8 +659,8 @@ constructor. Finally, if the iterator is to model Forward Traversal Iterator or a more-refined iterator concept, a default constructor is required.

-
-

Iterator Core Access

+
+

Iterator Core Access

iterator_facade and the operator implementations need to be able to access the core member functions in the derived class. Making the core member functions public would expose an implementation detail to @@ -395,7 +683,7 @@ provided, a class that acts as a gateway to the core member functions in the derived iterator class. The author of the derived class only needs to grant friendship to iterator_core_access to make his core member functions available to the library.

- +

iterator_core_access will be typically implemented as an empty class containing only private static member functions which invoke the @@ -405,8 +693,8 @@ standardize the gateway protocol. Note that even if open a safety loophole, as every core member function preserves the invariants of the iterator.

-
-

operator[]

+
+

operator[]

The indexing operator for a generalized iterator presents special challenges. A random access iterator's operator[] is only required to return something convertible to its value_type. @@ -428,8 +716,8 @@ the implementation of her iterator is free to implement an class; it will hide the one supplied by iterator_facade from clients of her iterator.

-
-

operator->

+
+

operator->

The reference type of a readable iterator (and today's input iterator) need not in fact be a reference, so long as it is convertible to the iterator's value_type. When the value_type @@ -450,11 +738,14 @@ Patterns, C++ Report, February 1995, pp. 24-27.

-
-

Iterator Adaptor

+
+

Iterator Adaptor

+ + + - +

The iterator_adaptor class template adapts some Base [3] type to create a new iterator. Instantiations of iterator_adaptor are derived from a corresponding instantiation of iterator_facade @@ -491,8 +782,8 @@ template parameter may not always be identical to the iterator's reference type, and will keep users from making mistakes based on that assumption.

-
-

Specialized Adaptors

+
+

Specialized Adaptors

This proposal also contains several examples of specialized adaptors which were easily implemented using iterator_adaptor:

    @@ -507,7 +798,7 @@ to the underlying values when dereferenced.
  • filter_iterator, which provides a view of an iterator range in which some elements of the underlying range are skipped.
-
    +
    • counting_iterator, which adapts any incrementable type (e.g. integers, iterators) so that incrementing/decrementing the adapted iterator and dereferencing it produces successive values of @@ -525,10 +816,10 @@ and Stanford GraphBase [8], to the BGL interface (which requires C++ Standard compliant iterators).

-
-

Proposed Text

-
-

Header <iterator_helper> synopsis [lib.iterator.helper.synopsis]

+
+

Proposed Text

+
+

Header <iterator_helper> synopsis [lib.iterator.helper.synopsis]

 struct use_default;
 
@@ -593,16 +884,22 @@ template <class UnaryFunction>
 class function_output_iterator;
 
-
-

Iterator facade [lib.iterator.facade]

+
+

Iterator facade [lib.iterator.facade]

+ + +

iterator_facade is a base class template that implements the interface of standard iterators in terms of a few core functions and associated types, to be supplied by a derived iterator class.

-
-

Class template iterator_facade

+
+

Class template iterator_facade

+ + + - +
 template <
     class Derived
@@ -686,12 +983,12 @@ template <class Dr, class V, class TC, class R, class D>
 Derived operator+ (typename Derived::difference_type n,
                    iterator_facade<Dr,V,TC,R,D> const&);
 
-

The iterator_category member of iterator_facade is

+

The iterator_category member of iterator_facade is

 iterator-category(CategoryOrTraversal, value_type, reference)
 

where iterator-category is defined as follows:

-
+
 iterator-category(C,R,V) :=
    if (C is convertible to std::input_iterator_tag
        || C is convertible to std::output_iterator_tag
@@ -738,10 +1035,10 @@ traversal tags would add no information]

The enable_if_interoperable template used above is for exposition purposes. The member operators should only be in an overload set -provided the derived types Dr1 and Dr2 are interoperable, +provided the derived types Dr1 and Dr2 are interoperable, meaning that at least one of the types is convertible to the other. The enable_if_interoperable approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. +out of the overload set when the types are not interoperable. The operators should behave as-if enable_if_interoperable were defined to be:

@@ -760,8 +1057,8 @@ struct enable_if_interoperable
 {};
 
-
-

iterator_facade Requirements

+
+

iterator_facade Requirements

The following table describes the typical valid expressions on iterator_facade's Derived parameter, depending on the iterator concept(s) it will model. The operations in the first @@ -774,8 +1071,8 @@ object of type X, X, and z is a constant object of a random access traversal iterator type interoperable with X.

-
-

iterator_facade Core Operations

+
+

iterator_facade Core Operations

@@ -784,10 +1081,10 @@ interoperable with X. - - - - + + + @@ -834,8 +1131,8 @@ Iterator
ExpressionReturn TypeAssertion/NoteUsed to implement Iterator +
ExpressionReturn TypeAssertion/NoteUsed to implement Iterator Concept(s)
-
-

iterator_facade operations

+
+

iterator_facade operations

The operations in this section are described in terms of operations on the core interface of Derived which may be inaccessible (i.e. private). The implementation should access these operations @@ -859,14 +1156,14 @@ of type pointer equal

 &static_cast<Derived const*>(this)->dereference()
 
-

Otherwise returns an object of unspecified type such that, +

Otherwise returns an object of unspecified type such that, (*static_cast<Derived const*>(this))->m is equivalent to (w = **static_cast<Derived const*>(this), w.m) for some temporary object w of type value_type.

-

unspecified operator[](difference_type n) const;

+

unspecified operator[](difference_type n) const;

@@ -1007,10 +1304,12 @@ operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs, @@ -1029,10 +1328,12 @@ operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs, @@ -1051,10 +1352,12 @@ operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs, @@ -1073,10 +1376,12 @@ operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs, @@ -1095,10 +1400,12 @@ operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs, @@ -1117,16 +1424,18 @@ operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
Otherwise,
-
((Dr2 const&)rhs).equal((Dr1 const&)lhs).
+
then
+

((Dr1 const&)lhs).equal((Dr2 const&)rhs).

+
+
Otherwise,
+

((Dr2 const&)rhs).equal((Dr1 const&)lhs).

+
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
!((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
Otherwise,
-
!((Dr2 const&)rhs).equal((Dr1 const&)lhs).
+
then
+

!((Dr1 const&)lhs).equal((Dr2 const&)rhs).

+
+
Otherwise,
+

!((Dr2 const&)rhs).equal((Dr1 const&)lhs).

+
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.
+
then
+

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.

+
+
Otherwise,
+

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.

+
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.
+
then
+

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.

+
+
Otherwise,
+

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.

+
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.
+
then
+

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.

+
+
Otherwise,
+

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.

+
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.
+
then
+

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.

+
+
Otherwise,
+

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.

+
-
+
 template <class Dr1, class V1, class TC1, class R1, class D1,
           class Dr2, class V2, class TC2, class R2, class D2>
 typename enable_if_interoperable<Dr1,Dr2,difference>::type
@@ -1138,23 +1447,27 @@ operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
 
 
 Return Type:

if is_convertible<Dr2,Dr1>::value

-
+
-
then
-
difference shall be -iterator_traits<Dr1>::difference_type.
-
Otherwise
-
difference shall be iterator_traits<Dr2>::difference_type
+
then
+

difference shall be +iterator_traits<Dr1>::difference_type.

+
+
Otherwise
+

difference shall be iterator_traits<Dr2>::difference_type

+
Returns:

if is_convertible<Dr2,Dr1>::value

-
then
-
-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).
-
Otherwise,
-
((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).
+
then
+

-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).

+
+
Otherwise,
+

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).

+
@@ -1162,11 +1475,14 @@ operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-
-

Iterator adaptor [lib.iterator.adaptor]

+
+

Iterator adaptor [lib.iterator.adaptor]

+ + + - +

Each specialization of the iterator_adaptor class template is derived from a specialization of iterator_facade. The core interface functions expected by iterator_facade are implemented in terms of the @@ -1177,11 +1493,14 @@ Whether the derived class models any of the standard iterator concepts depends on the operations supported by the Base type and which core interface functions of iterator_facade are redefined in the Derived class.

-
-

Class template iterator_adaptor

+
+

Class template iterator_adaptor

+ + + - +
 template <
     class Derived
@@ -1191,7 +1510,7 @@ template <
   , class Reference           = use_default
   , class Difference = use_default
 >
-class iterator_adaptor 
+class iterator_adaptor
   : public iterator_facade<Derived, V', C', R', D'> // see details
 {
     friend class iterator_core_access;
@@ -1204,12 +1523,12 @@ class iterator_adaptor
     typedef iterator_adaptor iterator_adaptor_;
     Base const& base_reference() const;
     Base& base_reference();
- private: // Core iterator interface for iterator_facade.  
+ private: // Core iterator interface for iterator_facade.
     typename iterator_adaptor::reference dereference() const;
 
     template <
     class OtherDerived, class OtherIterator, class V, class C, class R, class D
-    >   
+    >
     bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
 
     void advance(typename iterator_adaptor::difference_type n);
@@ -1218,7 +1537,7 @@ class iterator_adaptor
 
     template <
         class OtherDerived, class OtherIterator, class V, class C, class R, class D
-    >   
+    >
     typename iterator_adaptor::difference_type distance_to(
         iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
 
@@ -1227,13 +1546,13 @@ class iterator_adaptor
 };
 
-
-

iterator_adaptor requirements

+
+

iterator_adaptor requirements

static_cast<Derived*>(iterator_adaptor*) shall be well-formed. The Base argument shall be Assignable and Copy Constructible.

-
-

iterator_adaptor base class parameters

+
+

iterator_adaptor base class parameters

The V', C', R', and D' parameters of the iterator_facade used as a base class in the summary of iterator_adaptor above are defined as follows:

@@ -1273,8 +1592,8 @@ expression involving ``Derived`` in those concepts' requirements. -->
-
-

iterator_adaptor public operations

+
+

iterator_adaptor public operations

iterator_adaptor();

@@ -1282,7 +1601,7 @@ expression involving ``Derived`` in those concepts' requirements. --> - @@ -1307,8 +1626,8 @@ expression involving ``Derived`` in those concepts' requirements. -->
Requires:The Base type must be Default Constructible.
Returns:An instance of iterator_adaptor with +
Returns:An instance of iterator_adaptor with m_iterator default constructed.
-
-

iterator_adaptor protected member functions

+
+

iterator_adaptor protected member functions

Base const& base_reference() const;

@@ -1328,8 +1647,8 @@ expression involving ``Derived`` in those concepts' requirements. -->
-
-

iterator_adaptor private member functions

+
+

iterator_adaptor private member functions

typename iterator_adaptor::reference dereference() const;

@@ -1342,7 +1661,7 @@ expression involving ``Derived`` in those concepts' requirements. -->
 template <
 class OtherDerived, class OtherIterator, class V, class C, class R, class D
->   
+>
 bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
 
@@ -1383,7 +1702,7 @@ bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const
 template <
     class OtherDerived, class OtherIterator, class V, class C, class R, class D
->   
+>
 typename iterator_adaptor::difference_type distance_to(
     iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
 
@@ -1397,13 +1716,13 @@ typename iterator_adaptor::difference_type distance_to(
-
-

Specialized adaptors [lib.iterator.special.adaptors]

+
+

Specialized adaptors [lib.iterator.special.adaptors]

The enable_if_convertible<X,Y>::type expression used in this section is for exposition purposes. The converting constructors for specialized adaptors should be only be in an overload set provided that an object of type X is implicitly convertible to an object of -type Y. +type Y. The signatures involving enable_if_convertible should behave as-if enable_if_convertible were defined to be:

@@ -1424,10 +1743,13 @@ of enable_if_convertible
 

[Note: The enable_if_convertible approach uses SFINAE to take the constructor out of the overload set when the types are not -implicitly convertible. +implicitly convertible. ]

-
-

Indirect iterator

+
+

Indirect iterator

+ + +

indirect_iterator adapts an iterator by applying an extra dereference inside of operator*(). For example, this iterator adaptor makes it possible to view a container of pointers @@ -1436,8 +1758,8 @@ iterator adaptor makes it possible to view a container of pointers auxiliary traits, pointee and indirect_reference, to provide support for underlying iterators whose value_type is not an iterator.

-
-

Class template pointee

+
+

Class template pointee

@@ -1480,8 +1802,8 @@ else }
-
-

Class template indirect_reference

+
+

Class template indirect_reference

@@ -1515,8 +1837,11 @@ else std::iterator_traits<Dereferenceable>::reference
-
-

Class template indirect_iterator

+
+

Class template indirect_iterator

+ + +
 template <
     class Iterator
@@ -1573,9 +1898,9 @@ if (Reference is use_default) then
 else
     typedef Reference reference;
 
-if (Value is use_default) then 
+if (Value is use_default) then
     typedef pointee<V>::type* pointer;
-else 
+else
     typedef Value* pointer;
 
 if (Difference is use_default)
@@ -1593,8 +1918,8 @@ else
     ) iterator_category;
 
-
-

indirect_iterator requirements

+
+

indirect_iterator requirements

The expression *v, where v is an object of iterator_traits<Iterator>::value_type, shall be valid expression and convertible to reference. Iterator shall @@ -1607,8 +1932,8 @@ the requirements indicated by ite parameter is not use_default, as implied by the algorithm for deducing the default for the value_type member.]

-
-

indirect_iterator models

+
+

indirect_iterator models

In addition to the concepts indicated by iterator_category and by iterator_traversal<indirect_iterator>::type, a specialization of indirect_iterator models the following @@ -1628,8 +1953,8 @@ expression (where t i indirect_iterator<Y,V2,C2,R2,D2> if and only if X is interoperable with Y.

-
-

indirect_iterator operations

+
+

indirect_iterator operations

In addition to the operations required by the concepts described above, specializations of indirect_iterator provide the following operations.

@@ -1640,7 +1965,7 @@ following operations.

Requires:Iterator must be Default Constructible. -Effects:Constructs an instance of indirect_iterator with +Effects:Constructs an instance of indirect_iterator with a default-constructed m_iterator. @@ -1673,7 +1998,7 @@ indirect_iterator( Requires:Iterator2 is implicitly convertible to Iterator. -Effects:Constructs an instance of indirect_iterator whose +Effects:Constructs an instance of indirect_iterator whose m_iterator subobject is constructed from y.base(). @@ -1720,12 +2045,18 @@ indirect_iterator(
-
-

Reverse iterator

+
+

Reverse iterator

+ + +

The reverse iterator adaptor iterates through the adapted iterator range in the opposite direction.

-
-

Class template reverse_iterator

+
+

Class template reverse_iterator

+ + +
 template <class Iterator>
 class reverse_iterator
@@ -1761,14 +2092,14 @@ Lvalue Iterator, then iterator_ca
 bidirectional_iterator_tag. Otherwise, iterator_category is
 convertible to input_iterator_tag.

-
-

reverse_iterator requirements

+
+

reverse_iterator requirements

Iterator must be a model of Bidirectional Traversal Iterator. The type iterator_traits<Iterator>::reference must be the type of *i, where i is an object of type Iterator.

-
-

reverse_iterator models

+
+

reverse_iterator models

A specialization of reverse_iterator models the same iterator traversal and iterator access concepts modeled by its Iterator argument. In addition, it may model old iterator concepts @@ -1779,8 +2110,8 @@ specified in the following table:

-If I models -then reverse_iterator<I> models +If I models +then reverse_iterator<I> models @@ -1806,8 +2137,8 @@ Random Access Traversal Iterator reverse_iterator<Y> if and only if X is interoperable with Y.

-
-

reverse_iterator operations

+
+

reverse_iterator operations

In addition to the operations required by the concepts modeled by reverse_iterator, reverse_iterator provides the following operations.

@@ -1818,7 +2149,7 @@ operations.

Requires:Iterator must be Default Constructible. -Effects:Constructs an instance of reverse_iterator with m_iterator +Effects:Constructs an instance of reverse_iterator with m_iterator default constructed. @@ -1846,7 +2177,7 @@ reverse_iterator( Requires:OtherIterator is implicitly convertible to Iterator. -Effects:Constructs instance of reverse_iterator whose +Effects:Constructs instance of reverse_iterator whose m_iterator subobject is constructed from y.base(). @@ -1897,18 +2228,24 @@ return *--tmp;
-
-

Transform iterator

+
+

Transform iterator

+ + +

The transform iterator adapts an iterator by modifying the operator* to apply a function object to the result of dereferencing the iterator and returning the result.

-
-

Class template transform_iterator

+
+

Class template transform_iterator

+ + +
 template <class UnaryFunction,
-          class Iterator, 
-          class Reference = use_default, 
+          class Iterator,
+          class Reference = use_default,
           class Value = use_default>
 class transform_iterator
 {
@@ -1955,8 +2292,8 @@ convertible to forward_iterator_t
 model Readable Lvalue Iterator then iterator_category is
 convertible to input_iterator_tag.

-
-

transform_iterator requirements

+
+

transform_iterator requirements

The type UnaryFunction must be Assignable, Copy Constructible, and the expression f(*i) must be valid where f is an object of type UnaryFunction, i is an object of type Iterator, and @@ -1964,8 +2301,8 @@ where the type of f(*i)result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type.

The argument Iterator shall model Readable Iterator.

-
-

transform_iterator models

+
+

transform_iterator models

The resulting transform_iterator models the most refined of the following that is also modeled by Iterator.

@@ -1986,8 +2323,8 @@ the Iterator argument -If Iterator models -then transform_iterator models +If Iterator models +then transform_iterator models @@ -2011,8 +2348,8 @@ mutable iterator (as defined in the old iterator requirements).

transform_iterator<F2, Y, R2, V2> if and only if X is interoperable with Y.

-
-

transform_iterator operations

+
+

transform_iterator operations

In addition to the operations required by the concepts modeled by transform_iterator, transform_iterator provides the following operations.

@@ -2107,8 +2444,11 @@ initialized to t.functor()
-
-

Filter iterator

+
+

Filter iterator

+ + +

The filter iterator adaptor creates a view of an iterator range in which some elements of the range are skipped. A predicate function object controls which elements are skipped. When the predicate is @@ -2119,12 +2459,12 @@ adaptor to know when to stop so as to avoid going past the end of the underlying range. A filter iterator is therefore constructed with pair of iterators indicating the range of elements in the unfiltered sequence to be traversed.

-
-

Class template filter_iterator

+
+

Class template filter_iterator

- +
 template <class Predicate, class Iterator>
 class filter_iterator
@@ -2157,15 +2497,15 @@ private:
 

If Iterator models Readable Lvalue Iterator and Bidirectional Traversal Iterator then iterator_category is convertible to -std::bidirectional_iterator_tag. +std::bidirectional_iterator_tag. Otherwise, if Iterator models Readable Lvalue Iterator and Forward Traversal Iterator then iterator_category is convertible to -std::forward_iterator_tag. +std::forward_iterator_tag. Otherwise iterator_category is convertible to std::input_iterator_tag.

-
-

filter_iterator requirements

+
+

filter_iterator requirements

The Iterator argument shall meet the requirements of Readable Iterator and Single Pass Iterator or it shall meet the requirements of Input Iterator.

@@ -2175,8 +2515,8 @@ the expression p(x) m iterator_traits<Iterator>::value_type, and where the type of p(x) must be convertible to bool.

-
-

filter_iterator models

+
+

filter_iterator models

The concepts that filter_iterator models are dependent on which concepts the Iterator argument models, as specified in the following tables.

@@ -2186,8 +2526,8 @@ following tables.

-If Iterator models -then filter_iterator models +If Iterator models +then filter_iterator models @@ -2208,8 +2548,8 @@ following tables.

-If Iterator models -then filter_iterator models +If Iterator models +then filter_iterator models @@ -2230,8 +2570,8 @@ following tables.

-If Iterator models -then filter_iterator models +If Iterator models +then filter_iterator models @@ -2249,11 +2589,11 @@ following tables.

-

filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> +

filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> if and only if X is interoperable with Y.

-
-

filter_iterator operations

+
+

filter_iterator operations

In addition to those operations required by the concepts that filter_iterator models, filter_iterator provides the following operations.

@@ -2264,7 +2604,7 @@ operations.

Requires:Predicate and Iterator must be Default Constructible. -Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end +Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end members are a default constructed. @@ -2275,7 +2615,7 @@ members are a default constructed. Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true +the first position in the range [x,end) such that f(*m_iter) == true or else``m_iter == end``. The member m_pred is constructed from f and m_end from end. @@ -2290,7 +2630,7 @@ or else``m_iter == end``. The member Predicate is a class type (not a function pointer). Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true +the first position in the range [x,end) such that m_pred(*m_iter) == true or else``m_iter == end``. The member m_pred is default constructed. @@ -2363,13 +2703,19 @@ or m_pred(*m_iter)
-
-

Counting iterator

+
+

Counting iterator

+ + +

counting_iterator adapts an object by adding an operator* that returns the current value of the object. All other iterator operations are forwarded to the adapted object.

-
-

Class template counting_iterator

+
+

Class template counting_iterator

+ + +
 template <
     class Incrementable
@@ -2409,7 +2755,7 @@ else if (numeric_limits<Incrementable>::is_specialized)
         random_access_traversal_tag, Incrementable, const Incrementable&)
 else
     return iterator-category(
-         iterator_traversal<Incrementable>::type, 
+         iterator_traversal<Incrementable>::type,
          Incrementable, const Incrementable&)
 
@@ -2419,8 +2765,8 @@ the cases where std::numeric_limi is true.]
-
-

counting_iterator requirements

+
+

counting_iterator requirements

The Incrementable argument shall be Copy Constructible and Assignable.

If iterator_category is convertible to forward_iterator_tag or forward_traversal_tag, the following must be well-formed:

@@ -2445,8 +2791,8 @@ n = i - j; i < j;
-
-

counting_iterator models

+
+

counting_iterator models

Specializations of counting_iterator model Readable Lvalue Iterator. In addition, they model the concepts corresponding to the iterator tags to which their iterator_category is convertible. @@ -2461,8 +2807,8 @@ concepts modeled by Incrementable counting_iterator<Y,C2,D2> if and only if X is interoperable with Y.

-
-

counting_iterator operations

+
+

counting_iterator operations

In addition to the operations required by the concepts modeled by counting_iterator, counting_iterator provides the following operations.

@@ -2537,8 +2883,11 @@ operations.

-
-

Function output iterator

+
+

Function output iterator

+ + +

The function output iterator adaptor makes it easier to create custom output iterators. The adaptor takes a unary function and creates a model of Output Iterator. Each item assigned to the output iterator is @@ -2546,11 +2895,14 @@ passed as an argument to the unary function. The motivation for this iterator is that creating a conforming output iterator is non-trivial, particularly because the proper implementation usually requires a proxy object.

-
-

Class template function_output_iterator

+ -