Cursor objects can be used to point to specific entries in a view. A cursor acts very much like a pointer to a row in a view, and is returned when taking the address of a c4_RowRef. Dereferencing a cursor leads to the original row reference again. You can construct a cursor for a c4_Row, but since such rows are not part of a collection, incrementing or decrementing these cursors is meaningless (and wrong).

The usual range of pointer operations can be applied to these objects: pre/post-increment and decrement, adding or subtracting integer offsets, as well as the full range of comparison operators. If two cursors point to entries in the same view, their difference can be calculated.

As with regular pointers, care must be taken to avoid running off of either end of a view (the debug build includes assertions to check this).

<if !private>
int _index;

  <if !private>

c4_Sequence* _seq;

  <if !private>

c4_Cursor (c4_Sequence& implementation_, int index_);
  Construct a new cursor

  <if !private>

c4_RowRef operator* () const;
  Dereference this cursor to "almost" a row

  <if !private>

c4_Cursor& operator++ ();
  Pre-increment the cursor

  <if !private>

c4_Cursor operator++ (int);
  Post-increment the cursor

  <if !private>

c4_Cursor& operator+= (int offset_);
  Advance by a given offset

  <if !private>

int operator- (c4_Cursor cursor_) const;
  Return the distance between two cursors

  <if !private>

c4_Cursor operator- (int) const;
  Subtract a specified offset

  <if !private>

c4_Cursor& operator-- ();
  Pre-decrement the cursor

  <if !private>

c4_Cursor operator-- (int);
  Post-decrement the cursor

  <if !private>

c4_Cursor& operator-= (int offset_);
  Back up by a given offset

  <if !private>

c4_RowRef operator[] (int index_) const;
  This is the same as *(cursor + offset)

class c4_Cursor