CGAL 5.5 - Handles and Circulators

Iterators and circulators as well as different categories of circulators can be distinguished with the use of discriminating functions and the following circulator tags.

A couple of base classes simplify the task of writing own circulators. They declare the appropriate tags and the local types needed for circulators. To use the tags or base classes only it is sufficient to include:

See also


The above declarations can be used to distinguish between iterators and circulators and between different circulator categories. The assertions can be used to protect a templatized algorithm against instantiations that do not fulfill the requirements. The following example program illustrates both.

File Circulator/circulator_prog3.cpp

#include <cassert>
#include <list>
#include <CGAL/circulator.h>
template <class C> inline int foo( C c, std::forward_iterator_tag) {
return 1;
template <class C> inline int foo( C c, std::random_access_iterator_tag) {
return 2;
template <class I> inline int foo( I i, CGAL::Iterator_tag) {
return 3;
template <class C> inline int foo( C c, CGAL::Circulator_tag) {
typedef std::iterator_traits<C> Traits;
typedef typename Traits::iterator_category iterator_category;
return foo( c, iterator_category());
template <class IC> inline int foo( IC ic) {
typedef typename Traits::category category;
return foo( ic, category());
int main() {
F f = F();
R r = R();
std::list<int> l;
assert( foo( f) == 1);
assert( foo( r) == 2);
assert( foo( l.begin()) == 3);
return 0;


struct  CGAL::Circulator_tag
 A tag for any circulator type. More...
struct  CGAL::Iterator_tag
 A tag for any iterator type. More...
struct  CGAL::Forward_circulator_tag
struct  CGAL::Bidirectional_circulator_tag
struct  CGAL::Random_access_circulator_tag