[networking.ts] Buffer sequence iterator equivalency

Submitter: Vinnie Falco

Discussion:

Buffer sequence iterators in [networking.ts] differ from the current standard iterator requirements in that the value returned upon dereferencing is not required to be a reference type. This change is vital for allowing authors to create useful, lazily-evaluated views which meet the requirements of buffer sequences. Unfortunately the updated language is incompatible with the standard iterator requirements for equality testing, because the addresses of value types returned by buffer sequence iterators may not be stable. The change proposed in this defect report defines a new metric for buffer sequence iterator equality.

Proposed resolution:

This wording is relative to N4734.

Modify 16.2.1 [buffer.reqmts.mutablebuffersequence] as indicated:

An iterator type whose reference type is convertible to mutable_buffer and which satisfies all the requirements for bidirectional iterators (C++ 2014 [bidirectional.iterators]) except that:

  1. there is no requirement that operator-> is provided, and
  2. there is no requirement that reference be a reference type., and
  3. for iterators a and b there is no requirement that a == b if and only if *a and *b are bound to the same object, and
  4. a == b if and only if distance(buffer_sequence_begin(x), a) == distance(buffer_sequence_begin(x), b)

Modify 16.2.2 [buffer.reqmts.constbuffersequence] as indicated:

An iterator type whose reference type is convertible to const_buffer and which satisfies all the requirements for bidirectional iterators (C++ 2014 [bidirectional.iterators]) except that:

  1. there is no requirement that operator-> is provided, and
  2. there is no requirement that reference be a reference type., and
  3. for iterators a and b there is no requirement that a == b if and only if *a and *b are bound to the same object, and
  4. a == b if and only if distance(buffer_sequence_begin(x), a) == distance(buffer_sequence_begin(x), b)