The adaptor Container_from_circulator<C> is a class that converts any circulator type C to a kind of container class, i.e. a class that provides an iterator and a const_iterator type and two member functions - begin() and end() - that return the appropriate iterators. In analogy to STL container classes these member functions return a const_iterator in the case that the container itself is constant and a mutable iterator otherwise.
#include <CGAL/circulator.h>
| |
the template argument C.
| |
| |
|
| |
the resulting iterators will have a singular value.
| |
| |
the resulting iterators will have a singular value if the circulator
c is singular.
|
The iterator and const_iterator types are of the appropriate iterator category. In addition to the operations required for their category, they have a member function current_circulator() that returns a circulator pointing to the same position as the iterator does.
The generic reverse() algorithm from the STL can be used with an adaptor if at least a bidirectional circulator c is given.
Circulator c; // c is assumed to be a bidirectional circulator. CGAL::Container_from_circulator<Circulator> container(c); reverse( container.begin(), container.end());
The forward and bidirectional iterator adaptors keep track of the number of rounds a circulator has done around the ring-like data structure. This is a kind of winding number. It is used to distinguish between the start position and the end position which will be denoted by the same circulator. This winding number is zero for the begin()-iterator and one for the end()-iterator. It is incremented whenever a circulator passes the begin() position. Two iterators are equal if their internally used circulators and winding numbers are equal. This is more general than necessary since the end()-iterator is not supposed to move any more.
The random access iterator has to be able to compute the size of the data structure. It is needed for the difference of a past-the-end iterator and the begin iterator. Therefore, the constructor for the random access iterator choose the minimal circulator for the internal anchor position. The minimal circulator is part of the random access circulator requirements, see Section 5.