| |
| [section:concepts Iterator Concepts] |
| |
| [section:access Access] |
| |
| [section:readable 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`. |
| |
| [table Readable Iterator Requirements (in addition to Assignable and Copy Constructible) |
| [ |
| [Expression] |
| [Return Type] |
| [Note/Precondition] |
| ] |
| [ |
| [`iterator_traits<X>::value_type`] |
| [`T`] |
| [Any non-reference, non cv-qualified type] |
| ] |
| [ |
| [`*a`] |
| [ Convertible to `T`] |
| [pre: `a` is dereferenceable. If `a == b` then `*a` is equivalent to `*b`.] |
| ] |
| [ |
| [`a->m`] |
| [`U&`] |
| [pre: `(*a).m` is well-defined. Equivalent to `(*a).m`.] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section:writable 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*. |
| |
| [table Writable Iterator Requirements (in addition to Copy Constructible) |
| [ |
| [Expression] |
| [Return Type] |
| [Precondition] |
| ] |
| [ |
| [`*a = o` ] |
| [] |
| [pre: The type of `o` is in the set of value types of `X`] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section:swappable 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. |
| |
| [table Swappable Iterator Requirements (in addition to Copy Constructible) |
| [ |
| [Expression] |
| [Return Type] |
| [Postcondition] |
| ] |
| [ |
| [`iter_swap(a, b)`] |
| [`void`] |
| [the pointed to values are exchanged] |
| ] |
| ] |
| |
| [blurb *Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts |
| is also a model of *Swappable Iterator*. *--end note*] |
| |
| [endsect] |
| |
| [section:lvalue 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 |
| iterator. |
| |
| [table Lvalue Iterator Requirements |
| [ |
| [Expression] |
| [Return Type] |
| [Note/Assertion] |
| ] |
| [ |
| [`*a` ] |
| [`T&` ] |
| [ |
| `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`. |
| ] |
| ] |
| ] |
| |
| [endsect] |
| |
| [endsect] |
| |
| [section:traversal Traversal] |
| |
| [section:incrementable 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. |
| |
| [table Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) |
| [ |
| [Expression ] |
| [Return Type] |
| [Assertion/Semantics ] |
| ] |
| [ |
| [`++r` ] |
| [`X&` ] |
| [`&r == &++r`] |
| ] |
| [ |
| [`r++` ] |
| [`X` ] |
| [`` |
| { |
| X tmp = r; |
| ++r; |
| return tmp; |
| } |
| ``] |
| ] |
| [ |
| [`iterator_traversal<X>::type`] |
| [Convertible to `incrementable_traversal_tag`] |
| [] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section:single_pass 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. |
| |
| [table Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality Comparable) |
| [ |
| [Expression] |
| [Return Type] |
| [Assertion/Semantics / Pre-/Post-condition] |
| ] |
| [ |
| [`++r`] |
| [`X&`] |
| [pre:[br]`r` is dereferenceable;[br]post:[br]`r` is dereferenceable or[br]`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<X>::difference_type`] |
| [A signed integral type representing the distance between iterators] |
| [] |
| ] |
| [ |
| [`iterator_traversal<X>::type`] |
| [Convertible to`single_pass_traversal_tag`] |
| [] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section:forward 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. |
| |
| [table Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) |
| [ |
| [Expression] |
| [Return Type] |
| [Assertion/Note] |
| ] |
| [ |
| [`X u;`] |
| [`X&`] |
| [note: `u` may have a singular value.] |
| ] |
| [ |
| [`++r`] |
| [`X&`] |
| [`r == s` and `r` is dereferenceable implies `++r == ++s.`] |
| ] |
| [ |
| [`iterator_traversal<X>::type`] |
| [Convertible to `forward_traversal_tag`] |
| [] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section:bidirectional 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. |
| |
| [table Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal Iterator) |
| [ |
| [Expression] |
| [Return Type] |
| [Assertion/Semantics/Pre-/Post-condition] |
| ] |
| [ |
| [`--r`] |
| [`X&`] |
| [pre: there exists `s` such that `r == ++s`.[br] post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.] |
| ] |
| [ |
| [`r--`] |
| [convertible to `const X&`] |
| [`` |
| { |
| X tmp = r; |
| --r; |
| return tmp; |
| } |
| ``] |
| ] |
| [ |
| [`iterator_traversal<X>::type`] |
| [Convertible to `bidirectional_traversal_tag`] |
| [] |
| ] |
| ] |
| |
| [endsect] |
| |
| [section:random_access 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`. |
| |
| [table Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal) |
| [ |
| [Expression] |
| [Return Type] |
| [Operational Semantics] |
| [Assertion/Precondition] |
| ] |
| [ |
| [`r += n`] |
| [ `X&`] |
| [`` |
| { |
| Distance m = n; |
| if (m >= 0) |
| while (m--) |
| ++r; |
| else |
| while (m++) |
| --r; |
| return r; |
| } |
| ``] |
| [ ] |
| ] |
| [ |
| [`a + n`, `n + a`] |
| [`X`] |
| [`` |
| { |
| X tmp = a; |
| return tmp+= n; |
| } |
| ``] |
| [] |
| ] |
| [ |
| [`r -= n`] |
| [`X&`] |
| [`return r += -n`] |
| [] |
| ] |
| [ |
| [`a - n`] |
| [`X`] |
| [`` |
| { |
| X tmp = a; |
| return tmp-= n; |
| } |
| ``] |
| [] |
| ] |
| [ |
| [`b - a`] |
| [`Distance`] |
| [`a < b ? distance(a,b) : -distance(b,a)`] |
| [pre: there exists a value `n` of `Distance` such that `a + n == b`. `b == a + (b - a)`.] |
| ] |
| [ |
| [`a\[n\]`] |
| [convertible to T] |
| [`*(a + n)`] |
| [pre: a is a *Readable Iterator*] |
| ] |
| [ |
| [`a\[n\] = v`] |
| [convertible to T] |
| [`*(a + n) = v`] |
| [pre: a is a *Writable iterator*] |
| ] |
| [ |
| [`a < b`] |
| [convertible to `bool`] |
| [`b - a > 0`] |
| [`<` is a total ordering relation] |
| ] |
| [ |
| [`a > b`] |
| [convertible to `bool`] |
| [`b < a`] |
| [`>` is a total ordering relation] |
| ] |
| [ |
| [`a >= b`] |
| [convertible to `bool`] |
| [`!(a < b)`] |
| [] |
| ] |
| [ |
| [`a <= b`] |
| [convertible to `bool`] |
| [`!(a > b)`] |
| [] |
| ] |
| [ |
| [`iterator_traversal<X>::type`] |
| [convertible to `random_access_traversal_tag`] |
| [] |
| [] |
| ] |
| ] |
| |
| [endsect] |
| |
| [endsect] |
| |
| [endsect] |