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).

int _index;

c4_Sequence* _seq;

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

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

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

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

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

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

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

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

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

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

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

class c4_Cursor