[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]
