#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;
}
    return 3;
}
 
    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;
}
void Assert_iterator(const I &i)
checks at compile time if its argument is an iterator.
void Assert_circulator(const C &c)
checks at compile time if its argument is a circulator.
void Assert_random_access_category(const IC &ic)
void Assert_forward_category(const IC &ic)
A tag for any circulator type.
Definition: circulator_bases.h:53
The circulator traits class distinguishes between circulators and iterators.
Definition: circulator.h:343
Definition: circulator_bases.h:94
A tag for any iterator type.
Definition: circulator_bases.h:59
Definition: circulator_bases.h:106