\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)

CGAL 4.3 - Handles and Circulators

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
Classes
Compile Time Tags
Handles and Circulators Reference

##

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
  `query_circulator_or_iterator`
  `Circulator_traits`
  `Assert_circulator`
  `CGAL_For_all`
  `is_empty_range`
  `Circulator`

Example

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) {
CGAL::Assert_circulator( c);
CGAL::Assert_forward_category( c);
return 1;
}
template <class C> inline int foo( C c, std::random_access_iterator_tag) {
CGAL::Assert_circulator( c);
CGAL::Assert_random_access_category( c);
return 2;
}
template <class I> inline int foo( I i, CGAL::Iterator_tag) {
CGAL::Assert_iterator( i);
return 3;
}
template <class C> inline int foo( C c, CGAL::Circulator_tag) {
CGAL::Assert_circulator( c);
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 CGAL::Circulator_traits<IC> Traits;
typedef typename Traits::category category;
return foo( ic, category());
}
int main() {
typedef CGAL::Forward_circulator_base<int> F;
typedef CGAL::Random_access_circulator_base<int> R;
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;
}

## Classes
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