adding cw and ccw circulators

closes #2406

git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@1227 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
Matthias Möller
2015-02-23 16:02:40 +00:00
parent 0f9b4c2358
commit eb877fe9da
13 changed files with 1960 additions and 44 deletions

View File

@@ -61,7 +61,7 @@
namespace OpenMesh {
namespace Iterators {
template<class Mesh, class CenterEntityHandle>
template<class Mesh, class CenterEntityHandle, bool CW>
class GenericCirculator_CenterEntityFnsT {
public:
static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter);
@@ -69,31 +69,61 @@ class GenericCirculator_CenterEntityFnsT {
};
template<class Mesh>
class GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::VertexHandle> {
class GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::VertexHandle, true> {
public:
inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
heh = mesh->cw_rotated_halfedge_handle(heh);
if (heh == start) lap_counter++;
if (heh == start) ++lap_counter;
}
inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
if (heh == start) lap_counter--;
if (heh == start) --lap_counter;
heh = mesh->ccw_rotated_halfedge_handle(heh);
}
};
template<class Mesh>
class GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::FaceHandle> {
class GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::FaceHandle, true> {
public:
inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
heh = mesh->next_halfedge_handle(heh);
if (heh == start) lap_counter++;
if (heh == start) ++lap_counter;
}
inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
if (heh == start) lap_counter--;
if (heh == start) --lap_counter;
heh = mesh->prev_halfedge_handle(heh);
}
};
/////////////////////////////////////////////////////////////
// CCW
template<class Mesh>
class GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::VertexHandle, false> {
public:
inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
heh = mesh->ccw_rotated_halfedge_handle(heh);
if (heh == start) ++lap_counter;
}
inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
if (heh == start) --lap_counter;
heh = mesh->cw_rotated_halfedge_handle(heh);
}
};
template<class Mesh>
class GenericCirculator_CenterEntityFnsT<Mesh, typename Mesh::FaceHandle, false> {
public:
inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
heh = mesh->prev_halfedge_handle(heh);
if (heh == start) ++lap_counter;
}
inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
if (heh == start) --lap_counter;
heh = mesh->next_halfedge_handle(heh);
}
};
/////////////////////////////////////////////////////////////
template<class Mesh, class CenterEntityHandle, class ValueHandle>
class GenericCirculator_DereferenciabilityCheckT {
public:
@@ -116,7 +146,7 @@ class GenericCirculator_DereferenciabilityCheckT<Mesh, typename Mesh::VertexHand
}
};
template<class Mesh, class CenterEntityHandle, class ValueHandle>
template<class Mesh, class CenterEntityHandle, class ValueHandle, bool CW = true>
class GenericCirculator_ValueHandleFnsT {
public:
inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) {
@@ -124,15 +154,15 @@ class GenericCirculator_ValueHandleFnsT {
}
inline static void init(const Mesh*, typename Mesh::HalfedgeHandle&, typename Mesh::HalfedgeHandle&, int&) {};
inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::increment(mesh, heh, start, lap_counter);
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle, CW>::increment(mesh, heh, start, lap_counter);
}
inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::decrement(mesh, heh, start, lap_counter);
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle, CW>::decrement(mesh, heh, start, lap_counter);
}
};
template<class Mesh, class CenterEntityHandle>
class GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle> {
template<class Mesh, class CenterEntityHandle, bool CW>
class GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle, CW> {
public:
typedef GenericCirculator_DereferenciabilityCheckT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle> GenericCirculator_DereferenciabilityCheck;
@@ -145,12 +175,12 @@ class GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, typename Mesh:
};
inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
do {
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::increment(mesh, heh, start, lap_counter);
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle, CW>::increment(mesh, heh, start, lap_counter);
} while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
}
inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
do {
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle>::decrement(mesh, heh, start, lap_counter);
GenericCirculator_CenterEntityFnsT<Mesh, CenterEntityHandle, CW>::decrement(mesh, heh, start, lap_counter);
} while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
}
};
@@ -217,7 +247,7 @@ class GenericCirculatorBaseT {
};
template<class Mesh, class CenterEntityHandle, class ValueHandle,
ValueHandle (GenericCirculatorBaseT<Mesh>::*Handle2Value)() const>
ValueHandle (GenericCirculatorBaseT<Mesh>::*Handle2Value)() const, bool CW = true >
class GenericCirculatorT : protected GenericCirculatorBaseT<Mesh> {
public:
typedef std::ptrdiff_t difference_type;
@@ -228,7 +258,7 @@ class GenericCirculatorT : protected GenericCirculatorBaseT<Mesh> {
typedef typename GenericCirculatorBaseT<Mesh>::mesh_ptr mesh_ptr;
typedef typename GenericCirculatorBaseT<Mesh>::mesh_ref mesh_ref;
typedef GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, ValueHandle> GenericCirculator_ValueHandleFns;
typedef GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, ValueHandle, CW> GenericCirculator_ValueHandleFns;
public:
GenericCirculatorT() {}
@@ -244,6 +274,10 @@ class GenericCirculatorT : protected GenericCirculatorBaseT<Mesh> {
}
GenericCirculatorT(const GenericCirculatorT &rhs) : GenericCirculatorBaseT<Mesh>(rhs) {}
friend class GenericCirculatorT<Mesh,CenterEntityHandle,ValueHandle,Handle2Value,!CW>;
explicit GenericCirculatorT( const GenericCirculatorT<Mesh,CenterEntityHandle,ValueHandle,Handle2Value,!CW>& rhs )
:GenericCirculatorBaseT<Mesh>(rhs){}
GenericCirculatorT& operator++() {
assert(this->mesh_);
GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_);

View File

@@ -105,6 +105,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::VertexHandle,
&Iterators::GenericCirculatorBaseT<This>::toVertexHandle>
VertexVertexIter;
typedef VertexVertexIter VertexVertexCWIter;
/**
* Enumerates 1-ring vertices in a counter clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::VertexHandle,
&Iterators::GenericCirculatorBaseT<This>::toVertexHandle, false>
VertexVertexCCWIter;
/**
* Enumerates outgoing half edges in a clockwise fashion.
@@ -112,6 +120,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle>
VertexOHalfedgeIter;
typedef VertexOHalfedgeIter VertexOHalfedgeCWIter;
/**
* Enumerates outgoing half edges in a counter clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle, false>
VertexOHalfedgeCCWIter;
/**
* Enumerates incoming half edges in a clockwise fashion.
@@ -119,6 +135,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toOppositeHalfedgeHandle>
VertexIHalfedgeIter;
typedef VertexIHalfedgeIter VertexIHalfedgeCWIter;
/**
* Enumerates incoming half edges in a counter clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toOppositeHalfedgeHandle, false>
VertexIHalfedgeCCWIter;
/**
* Enumerates incident faces in a clockwise fashion.
@@ -126,6 +150,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::FaceHandle,
&Iterators::GenericCirculatorBaseT<This>::toFaceHandle>
VertexFaceIter;
typedef VertexFaceIter VertexFaceCWIter;
/**
* Enumerates incident faces in a counter clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::FaceHandle,
&Iterators::GenericCirculatorBaseT<This>::toFaceHandle, false>
VertexFaceCCWIter;
/**
* Enumerates incident edges in a clockwise fashion.
@@ -133,6 +165,13 @@ public:
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::EdgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toEdgeHandle>
VertexEdgeIter;
typedef VertexEdgeIter VertexEdgeCWIter;
/**
* Enumerates incident edges in a counter clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::VertexHandle, This::EdgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toEdgeHandle, false>
VertexEdgeCCWIter;
/**
* Identical to #FaceHalfedgeIter. God knows why this typedef exists.
@@ -140,12 +179,29 @@ public:
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle>
HalfedgeLoopIter;
typedef HalfedgeLoopIter HalfedgeLoopCWIter;
/**
* Identical to #FaceHalfedgeIter. God knows why this typedef exists.
*/
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle, false>
HalfedgeLoopCCWIter;
typedef VertexVertexIter ConstVertexVertexIter;
typedef VertexOHalfedgeIter ConstVertexOHalfedgeIter;
typedef VertexIHalfedgeIter ConstVertexIHalfedgeIter;
typedef VertexFaceIter ConstVertexFaceIter;
typedef VertexEdgeIter ConstVertexEdgeIter;
typedef VertexVertexIter ConstVertexVertexIter;
typedef VertexVertexCWIter ConstVertexVertexCWIter;
typedef VertexVertexCCWIter ConstVertexVertexCCWIter;
typedef VertexOHalfedgeIter ConstVertexOHalfedgeIter;
typedef VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter;
typedef VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter;
typedef VertexIHalfedgeIter ConstVertexIHalfedgeIter;
typedef VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter;
typedef VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter;
typedef VertexFaceIter ConstVertexFaceIter;
typedef VertexFaceCWIter ConstVertexFaceCWIter;
typedef VertexFaceCCWIter ConstVertexFaceCCWIter;
typedef VertexEdgeIter ConstVertexEdgeIter;
typedef VertexEdgeCWIter ConstVertexEdgeCWIter;
typedef VertexEdgeCCWIter ConstVertexEdgeCCWIter;
/*
* Face-centered circulators
@@ -157,6 +213,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::VertexHandle,
&Iterators::GenericCirculatorBaseT<This>::toVertexHandle>
FaceVertexIter;
typedef FaceVertexIter FaceVertexCCWIter;
/**
* Enumerate incident vertices in a clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::VertexHandle,
&Iterators::GenericCirculatorBaseT<This>::toVertexHandle, false>
FaceVertexCWIter;
/**
* Enumerate incident half edges in a counter clockwise fashion.
@@ -164,6 +228,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle>
FaceHalfedgeIter;
typedef FaceHalfedgeIter FaceHalfedgeCCWIter;
/**
* Enumerate incident half edges in a clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::HalfedgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toHalfedgeHandle, false>
FaceHalfedgeCWIter;
/**
* Enumerate incident edges in a counter clockwise fashion.
@@ -171,6 +243,14 @@ public:
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::EdgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toEdgeHandle>
FaceEdgeIter;
typedef FaceEdgeIter FaceEdgeCCWIter;
/**
* Enumerate incident edges in a clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::EdgeHandle,
&Iterators::GenericCirculatorBaseT<This>::toEdgeHandle, false>
FaceEdgeCWIter;
/**
* Enumerate adjacent faces in a counter clockwise fashion.
@@ -178,16 +258,34 @@ public:
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::FaceHandle,
&Iterators::GenericCirculatorBaseT<This>::toOppositeFaceHandle>
FaceFaceIter;
typedef FaceFaceIter FaceFaceCCWIter;
typedef FaceVertexIter ConstFaceVertexIter;
typedef FaceHalfedgeIter ConstFaceHalfedgeIter;
typedef FaceEdgeIter ConstFaceEdgeIter;
typedef FaceFaceIter ConstFaceFaceIter;
/**
* Enumerate adjacent faces in a clockwise fashion.
*/
typedef Iterators::GenericCirculatorT<This, This::FaceHandle, This::FaceHandle,
&Iterators::GenericCirculatorBaseT<This>::toOppositeFaceHandle, false>
FaceFaceCWIter;
typedef FaceVertexIter ConstFaceVertexIter;
typedef FaceVertexCWIter ConstFaceVertexCWIter;
typedef FaceVertexCCWIter ConstFaceVertexCCWIter;
typedef FaceHalfedgeIter ConstFaceHalfedgeIter;
typedef FaceHalfedgeCWIter ConstFaceHalfedgeCWIter;
typedef FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter;
typedef FaceEdgeIter ConstFaceEdgeIter;
typedef FaceEdgeCWIter ConstFaceEdgeCWIter;
typedef FaceEdgeCCWIter ConstFaceEdgeCCWIter;
typedef FaceFaceIter ConstFaceFaceIter;
typedef FaceFaceCWIter ConstFaceFaceCWIter;
typedef FaceFaceCCWIter ConstFaceFaceCCWIter;
/*
* Halfedge circulator
*/
typedef HalfedgeLoopIter ConstHalfedgeLoopIter;
typedef HalfedgeLoopIter ConstHalfedgeLoopIter;
typedef HalfedgeLoopCWIter ConstHalfedgeLoopCWIter;
typedef HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter;
//@}
@@ -213,25 +311,59 @@ public:
typedef ConstEdgeIter CEIter;
typedef ConstFaceIter CFIter;
typedef VertexVertexIter VVIter;
typedef VertexOHalfedgeIter VOHIter;
typedef VertexIHalfedgeIter VIHIter;
typedef VertexEdgeIter VEIter;
typedef VertexFaceIter VFIter;
typedef FaceVertexIter FVIter;
typedef FaceHalfedgeIter FHIter;
typedef FaceEdgeIter FEIter;
typedef FaceFaceIter FFIter;
typedef VertexVertexIter VVIter;
typedef VertexVertexCWIter VVCWIter;
typedef VertexVertexCCWIter VVCCWIter;
typedef VertexOHalfedgeIter VOHIter;
typedef VertexOHalfedgeCWIter VOHCWIter;
typedef VertexOHalfedgeCCWIter VOHCCWIter;
typedef VertexIHalfedgeIter VIHIter;
typedef VertexIHalfedgeCWIter VIHICWter;
typedef VertexIHalfedgeCCWIter VIHICCWter;
typedef VertexEdgeIter VEIter;
typedef VertexEdgeCWIter VECWIter;
typedef VertexEdgeCCWIter VECCWIter;
typedef VertexFaceIter VFIter;
typedef VertexFaceCWIter VFCWIter;
typedef VertexFaceCCWIter VFCCWIter;
typedef FaceVertexIter FVIter;
typedef FaceVertexCWIter FVCWIter;
typedef FaceVertexCCWIter FVCCWIter;
typedef FaceHalfedgeIter FHIter;
typedef FaceHalfedgeCWIter FHCWIter;
typedef FaceHalfedgeCCWIter FHCWWIter;
typedef FaceEdgeIter FEIter;
typedef FaceEdgeCWIter FECWIter;
typedef FaceEdgeCCWIter FECWWIter;
typedef FaceFaceIter FFIter;
typedef ConstVertexVertexIter CVVIter;
typedef ConstVertexOHalfedgeIter CVOHIter;
typedef ConstVertexIHalfedgeIter CVIHIter;
typedef ConstVertexEdgeIter CVEIter;
typedef ConstVertexFaceIter CVFIter;
typedef ConstFaceVertexIter CFVIter;
typedef ConstFaceHalfedgeIter CFHIter;
typedef ConstFaceEdgeIter CFEIter;
typedef ConstFaceFaceIter CFFIter;
typedef ConstVertexVertexIter CVVIter;
typedef ConstVertexVertexCWIter CVVCWIter;
typedef ConstVertexVertexCCWIter CVVCCWIter;
typedef ConstVertexOHalfedgeIter CVOHIter;
typedef ConstVertexOHalfedgeCWIter CVOHCWIter;
typedef ConstVertexOHalfedgeCCWIter CVOHCCWIter;
typedef ConstVertexIHalfedgeIter CVIHIter;
typedef ConstVertexIHalfedgeCWIter CVIHCWIter;
typedef ConstVertexIHalfedgeCCWIter CVIHCCWIter;
typedef ConstVertexEdgeIter CVEIter;
typedef ConstVertexEdgeCWIter CVECWIter;
typedef ConstVertexEdgeCCWIter CVECCWIter;
typedef ConstVertexFaceIter CVFIter;
typedef ConstVertexFaceCWIter CVFCWIter;
typedef ConstVertexFaceCCWIter CVFCCWIter;
typedef ConstFaceVertexIter CFVIter;
typedef ConstFaceVertexCWIter CFVCWIter;
typedef ConstFaceVertexCCWIter CFVCCWIter;
typedef ConstFaceHalfedgeIter CFHIter;
typedef ConstFaceHalfedgeCWIter CFHCWIter;
typedef ConstFaceHalfedgeCCWIter CFHCCWIter;
typedef ConstFaceEdgeIter CFEIter;
typedef ConstFaceEdgeCWIter CFECWIter;
typedef ConstFaceEdgeCCWIter CFECCWIter;
typedef ConstFaceFaceIter CFFIter;
typedef ConstFaceFaceCWIter CFFCWIter;
typedef ConstFaceFaceCCWIter CFFCCWIter;
//@}
public:
@@ -426,192 +558,541 @@ public:
/// vertex - vertex circulator
VertexVertexIter vv_iter(VertexHandle _vh)
{ return VertexVertexIter(*this, _vh); }
/// vertex - vertex circulator cw
VertexVertexCWIter vv_cwiter(VertexHandle _vh)
{ return VertexVertexCWIter(*this, _vh); }
/// vertex - vertex circulator ccw
VertexVertexCCWIter vv_ccwiter(VertexHandle _vh)
{ return VertexVertexCCWIter(*this, _vh); }
/// vertex - incoming halfedge circulator
VertexIHalfedgeIter vih_iter(VertexHandle _vh)
{ return VertexIHalfedgeIter(*this, _vh); }
/// vertex - incoming halfedge circulator cw
VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh)
{ return VertexIHalfedgeCWIter(*this, _vh); }
/// vertex - incoming halfedge circulator ccw
VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh)
{ return VertexIHalfedgeCCWIter(*this, _vh); }
/// vertex - outgoing halfedge circulator
VertexOHalfedgeIter voh_iter(VertexHandle _vh)
{ return VertexOHalfedgeIter(*this, _vh); }
/// vertex - outgoing halfedge circulator cw
VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh)
{ return VertexOHalfedgeCWIter(*this, _vh); }
/// vertex - outgoing halfedge circulator ccw
VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh)
{ return VertexOHalfedgeCCWIter(*this, _vh); }
/// vertex - edge circulator
VertexEdgeIter ve_iter(VertexHandle _vh)
{ return VertexEdgeIter(*this, _vh); }
/// vertex - edge circulator cw
VertexEdgeCWIter ve_cwiter(VertexHandle _vh)
{ return VertexEdgeCWIter(*this, _vh); }
/// vertex - edge circulator ccw
VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh)
{ return VertexEdgeCCWIter(*this, _vh); }
/// vertex - face circulator
VertexFaceIter vf_iter(VertexHandle _vh)
{ return VertexFaceIter(*this, _vh); }
/// vertex - face circulator cw
VertexFaceCWIter vf_cwiter(VertexHandle _vh)
{ return VertexFaceCWIter(*this, _vh); }
/// vertex - face circulator ccw
VertexFaceCCWIter vf_ccwiter(VertexHandle _vh)
{ return VertexFaceCCWIter(*this, _vh); }
/// const vertex circulator
ConstVertexVertexIter cvv_iter(VertexHandle _vh) const
{ return ConstVertexVertexIter(*this, _vh); }
/// const vertex circulator cw
ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const
{ return ConstVertexVertexCWIter(*this, _vh); }
/// const vertex circulator ccw
ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const
{ return ConstVertexVertexCCWIter(*this, _vh); }
/// const vertex - incoming halfedge circulator
ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const
{ return ConstVertexIHalfedgeIter(*this, _vh); }
/// const vertex - incoming halfedge circulator cw
ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const
{ return ConstVertexIHalfedgeCWIter(*this, _vh); }
/// const vertex - incoming halfedge circulator ccw
ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const
{ return ConstVertexIHalfedgeCCWIter(*this, _vh); }
/// const vertex - outgoing halfedge circulator
ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const
{ return ConstVertexOHalfedgeIter(*this, _vh); }
/// const vertex - outgoing halfedge circulator cw
ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const
{ return ConstVertexOHalfedgeCWIter(*this, _vh); }
/// const vertex - outgoing halfedge circulator ccw
ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const
{ return ConstVertexOHalfedgeCCWIter(*this, _vh); }
/// const vertex - edge circulator
ConstVertexEdgeIter cve_iter(VertexHandle _vh) const
{ return ConstVertexEdgeIter(*this, _vh); }
/// const vertex - edge circulator cw
ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const
{ return ConstVertexEdgeCWIter(*this, _vh); }
/// const vertex - edge circulator ccw
ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const
{ return ConstVertexEdgeCCWIter(*this, _vh); }
/// const vertex - face circulator
ConstVertexFaceIter cvf_iter(VertexHandle _vh) const
{ return ConstVertexFaceIter(*this, _vh); }
/// const vertex - face circulator cw
ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const
{ return ConstVertexFaceCWIter(*this, _vh); }
/// const vertex - face circulator ccw
ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const
{ return ConstVertexFaceCCWIter(*this, _vh); }
/// face - vertex circulator
FaceVertexIter fv_iter(FaceHandle _fh)
{ return FaceVertexIter(*this, _fh); }
/// face - vertex circulator cw
FaceVertexCWIter fv_cwiter(FaceHandle _fh)
{ return FaceVertexCWIter(*this, _fh); }
/// face - vertex circulator ccw
FaceVertexCCWIter fv_ccwiter(FaceHandle _fh)
{ return FaceVertexCCWIter(*this, _fh); }
/// face - halfedge circulator
FaceHalfedgeIter fh_iter(FaceHandle _fh)
{ return FaceHalfedgeIter(*this, _fh); }
/// face - halfedge circulator cw
FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh)
{ return FaceHalfedgeCWIter(*this, _fh); }
/// face - halfedge circulator ccw
FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh)
{ return FaceHalfedgeCCWIter(*this, _fh); }
/// face - edge circulator
FaceEdgeIter fe_iter(FaceHandle _fh)
{ return FaceEdgeIter(*this, _fh); }
/// face - edge circulator cw
FaceEdgeCWIter fe_cwiter(FaceHandle _fh)
{ return FaceEdgeCWIter(*this, _fh); }
/// face - edge circulator ccw
FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh)
{ return FaceEdgeCCWIter(*this, _fh); }
/// face - face circulator
FaceFaceIter ff_iter(FaceHandle _fh)
{ return FaceFaceIter(*this, _fh); }
/// face - face circulator cw
FaceFaceCWIter ff_cwiter(FaceHandle _fh)
{ return FaceFaceCWIter(*this, _fh); }
/// face - face circulator ccw
FaceFaceCCWIter ff_ccwiter(FaceHandle _fh)
{ return FaceFaceCCWIter(*this, _fh); }
/// const face - vertex circulator
ConstFaceVertexIter cfv_iter(FaceHandle _fh) const
{ return ConstFaceVertexIter(*this, _fh); }
/// const face - vertex circulator cw
ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const
{ return ConstFaceVertexCWIter(*this, _fh); }
/// const face - vertex circulator ccw
ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const
{ return ConstFaceVertexCCWIter(*this, _fh); }
/// const face - halfedge circulator
ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const
{ return ConstFaceHalfedgeIter(*this, _fh); }
/// const face - halfedge circulator cw
ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const
{ return ConstFaceHalfedgeCWIter(*this, _fh); }
/// const face - halfedge circulator ccw
ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const
{ return ConstFaceHalfedgeCCWIter(*this, _fh); }
/// const face - edge circulator
ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const
{ return ConstFaceEdgeIter(*this, _fh); }
/// const face - edge circulator cw
ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const
{ return ConstFaceEdgeCWIter(*this, _fh); }
/// const face - edge circulator ccw
ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const
{ return ConstFaceEdgeCCWIter(*this, _fh); }
/// const face - face circulator
ConstFaceFaceIter cff_iter(FaceHandle _fh) const
{ return ConstFaceFaceIter(*this, _fh); }
/// const face - face circulator cw
ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const
{ return ConstFaceFaceCWIter(*this, _fh); }
/// const face - face circulator
ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const
{ return ConstFaceFaceCCWIter(*this, _fh); }
// 'begin' circulators
/// vertex - vertex circulator
VertexVertexIter vv_begin(VertexHandle _vh)
{ return VertexVertexIter(*this, _vh); }
/// vertex - vertex circulator cw
VertexVertexCWIter vv_cwbegin(VertexHandle _vh)
{ return VertexVertexCWIter(*this, _vh); }
/// vertex - vertex circulator ccw
VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh)
{ return VertexVertexCCWIter(*this, _vh); }
/// vertex - incoming halfedge circulator
VertexIHalfedgeIter vih_begin(VertexHandle _vh)
{ return VertexIHalfedgeIter(*this, _vh); }
/// vertex - incoming halfedge circulator cw
VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh)
{ return VertexIHalfedgeCWIter(*this, _vh); }
/// vertex - incoming halfedge circulator ccw
VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh)
{ return VertexIHalfedgeCCWIter(*this, _vh); }
/// vertex - outgoing halfedge circulator
VertexOHalfedgeIter voh_begin(VertexHandle _vh)
{ return VertexOHalfedgeIter(*this, _vh); }
/// vertex - outgoing halfedge circulator cw
VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh)
{ return VertexOHalfedgeCWIter(*this, _vh); }
/// vertex - outgoing halfedge circulator ccw
VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh)
{ return VertexOHalfedgeCCWIter(*this, _vh); }
/// vertex - edge circulator
VertexEdgeIter ve_begin(VertexHandle _vh)
{ return VertexEdgeIter(*this, _vh); }
/// vertex - edge circulator cw
VertexEdgeCWIter ve_cwbegin(VertexHandle _vh)
{ return VertexEdgeCWIter(*this, _vh); }
/// vertex - edge circulator ccw
VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh)
{ return VertexEdgeCCWIter(*this, _vh); }
/// vertex - face circulator
VertexFaceIter vf_begin(VertexHandle _vh)
{ return VertexFaceIter(*this, _vh); }
/// vertex - face circulator cw
VertexFaceCWIter vf_cwbegin(VertexHandle _vh)
{ return VertexFaceCWIter(*this, _vh); }
/// vertex - face circulator ccw
VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh)
{ return VertexFaceCCWIter(*this, _vh); }
/// const vertex circulator
ConstVertexVertexIter cvv_begin(VertexHandle _vh) const
{ return ConstVertexVertexIter(*this, _vh); }
/// const vertex circulator cw
ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const
{ return ConstVertexVertexCWIter(*this, _vh); }
/// const vertex circulator ccw
ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const
{ return ConstVertexVertexCCWIter(*this, _vh); }
/// const vertex - incoming halfedge circulator
ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const
{ return ConstVertexIHalfedgeIter(*this, _vh); }
/// const vertex - incoming halfedge circulator cw
ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const
{ return ConstVertexIHalfedgeCWIter(*this, _vh); }
/// const vertex - incoming halfedge circulator ccw
ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const
{ return ConstVertexIHalfedgeCCWIter(*this, _vh); }
/// const vertex - outgoing halfedge circulator
ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const
{ return ConstVertexOHalfedgeIter(*this, _vh); }
/// const vertex - outgoing halfedge circulator cw
ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const
{ return ConstVertexOHalfedgeCWIter(*this, _vh); }
/// const vertex - outgoing halfedge circulator ccw
ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const
{ return ConstVertexOHalfedgeCCWIter(*this, _vh); }
/// const vertex - edge circulator
ConstVertexEdgeIter cve_begin(VertexHandle _vh) const
{ return ConstVertexEdgeIter(*this, _vh); }
/// const vertex - edge circulator cw
ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const
{ return ConstVertexEdgeCWIter(*this, _vh); }
/// const vertex - edge circulator ccw
ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const
{ return ConstVertexEdgeCCWIter(*this, _vh); }
/// const vertex - face circulator
ConstVertexFaceIter cvf_begin(VertexHandle _vh) const
{ return ConstVertexFaceIter(*this, _vh); }
/// const vertex - face circulator cw
ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const
{ return ConstVertexFaceCWIter(*this, _vh); }
/// const vertex - face circulator ccw
ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const
{ return ConstVertexFaceCCWIter(*this, _vh); }
/// face - vertex circulator
FaceVertexIter fv_begin(FaceHandle _fh)
{ return FaceVertexIter(*this, _fh); }
/// face - vertex circulator cw
FaceVertexCWIter fv_cwbegin(FaceHandle _fh)
{ return FaceVertexCWIter(*this, _fh); }
/// face - vertex circulator ccw
FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh)
{ return FaceVertexCCWIter(*this, _fh); }
/// face - halfedge circulator
FaceHalfedgeIter fh_begin(FaceHandle _fh)
{ return FaceHalfedgeIter(*this, _fh); }
/// face - halfedge circulator cw
FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh)
{ return FaceHalfedgeCWIter(*this, _fh); }
/// face - halfedge circulator ccw
FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh)
{ return FaceHalfedgeCCWIter(*this, _fh); }
/// face - edge circulator
FaceEdgeIter fe_begin(FaceHandle _fh)
{ return FaceEdgeIter(*this, _fh); }
/// face - edge circulator cw
FaceEdgeCWIter fe_cwbegin(FaceHandle _fh)
{ return FaceEdgeCWIter(*this, _fh); }
/// face - edge circulator ccw
FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh)
{ return FaceEdgeCCWIter(*this, _fh); }
/// face - face circulator
FaceFaceIter ff_begin(FaceHandle _fh)
{ return FaceFaceIter(*this, _fh); }
/// face - face circulator cw
FaceFaceCWIter ff_cwbegin(FaceHandle _fh)
{ return FaceFaceCWIter(*this, _fh); }
/// face - face circulator ccw
FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh)
{ return FaceFaceCCWIter(*this, _fh); }
/// halfedge circulator
HalfedgeLoopIter hl_begin(HalfedgeHandle _heh)
{ return HalfedgeLoopIter(*this, _heh); }
/// halfedge circulator
HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh)
{ return HalfedgeLoopCWIter(*this, _heh); }
/// halfedge circulator ccw
HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh)
{ return HalfedgeLoopCCWIter(*this, _heh); }
/// const face - vertex circulator
ConstFaceVertexIter cfv_begin(FaceHandle _fh) const
{ return ConstFaceVertexIter(*this, _fh); }
/// const face - vertex circulator cw
ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const
{ return ConstFaceVertexCWIter(*this, _fh); }
/// const face - vertex circulator ccw
ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const
{ return ConstFaceVertexCCWIter(*this, _fh); }
/// const face - halfedge circulator
ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const
{ return ConstFaceHalfedgeIter(*this, _fh); }
/// const face - halfedge circulator cw
ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const
{ return ConstFaceHalfedgeCWIter(*this, _fh); }
/// const face - halfedge circulator ccw
ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const
{ return ConstFaceHalfedgeCCWIter(*this, _fh); }
/// const face - edge circulator
ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const
{ return ConstFaceEdgeIter(*this, _fh); }
/// const face - edge circulator cw
ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const
{ return ConstFaceEdgeCWIter(*this, _fh); }
/// const face - edge circulator ccw
ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const
{ return ConstFaceEdgeCCWIter(*this, _fh); }
/// const face - face circulator
ConstFaceFaceIter cff_begin(FaceHandle _fh) const
{ return ConstFaceFaceIter(*this, _fh); }
/// const face - face circulator cw
ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const
{ return ConstFaceFaceCWIter(*this, _fh); }
/// const face - face circulator ccw
ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const
{ return ConstFaceFaceCCWIter(*this, _fh); }
/// const halfedge circulator
ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const
{ return ConstHalfedgeLoopIter(*this, _heh); }
/// const halfedge circulator cw
ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const
{ return ConstHalfedgeLoopCWIter(*this, _heh); }
/// const halfedge circulator ccw
ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const
{ return ConstHalfedgeLoopCCWIter(*this, _heh); }
// 'end' circulators
/// vertex - vertex circulator
VertexVertexIter vv_end(VertexHandle _vh)
{ return VertexVertexIter(*this, _vh, true); }
/// vertex - vertex circulator cw
VertexVertexCWIter vv_cwend(VertexHandle _vh)
{ return VertexVertexCWIter(*this, _vh, true); }
/// vertex - vertex circulator ccw
VertexVertexCCWIter vv_ccwend(VertexHandle _vh)
{ return VertexVertexCCWIter(*this, _vh, true); }
/// vertex - incoming halfedge circulator
VertexIHalfedgeIter vih_end(VertexHandle _vh)
{ return VertexIHalfedgeIter(*this, _vh, true); }
/// vertex - incoming halfedge circulator cw
VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh)
{ return VertexIHalfedgeCWIter(*this, _vh, true); }
/// vertex - incoming halfedge circulator ccw
VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh)
{ return VertexIHalfedgeCCWIter(*this, _vh, true); }
/// vertex - outgoing halfedge circulator
VertexOHalfedgeIter voh_end(VertexHandle _vh)
{ return VertexOHalfedgeIter(*this, _vh, true); }
/// vertex - outgoing halfedge circulator cw
VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh)
{ return VertexOHalfedgeCWIter(*this, _vh, true); }
/// vertex - outgoing halfedge circulator ccw
VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh)
{ return VertexOHalfedgeCCWIter(*this, _vh, true); }
/// vertex - edge circulator
VertexEdgeIter ve_end(VertexHandle _vh)
{ return VertexEdgeIter(*this, _vh, true); }
/// vertex - edge circulator cw
VertexEdgeCWIter ve_cwend(VertexHandle _vh)
{ return VertexEdgeCWIter(*this, _vh, true); }
/// vertex - edge circulator ccw
VertexEdgeCCWIter ve_ccwend(VertexHandle _vh)
{ return VertexEdgeCCWIter(*this, _vh, true); }
/// vertex - face circulator
VertexFaceIter vf_end(VertexHandle _vh)
{ return VertexFaceIter(*this, _vh, true); }
/// vertex - face circulator cw
VertexFaceCWIter vf_cwend(VertexHandle _vh)
{ return VertexFaceCWIter(*this, _vh, true); }
/// vertex - face circulator ccw
VertexFaceCCWIter vf_ccwend(VertexHandle _vh)
{ return VertexFaceCCWIter(*this, _vh, true); }
/// const vertex circulator
ConstVertexVertexIter cvv_end(VertexHandle _vh) const
{ return ConstVertexVertexIter(*this, _vh, true); }
/// const vertex circulator cw
ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const
{ return ConstVertexVertexCWIter(*this, _vh, true); }
/// const vertex circulator ccw
ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const
{ return ConstVertexVertexCCWIter(*this, _vh, true); }
/// const vertex - incoming halfedge circulator
ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const
{ return ConstVertexIHalfedgeIter(*this, _vh, true); }
/// const vertex - incoming halfedge circulator cw
ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const
{ return ConstVertexIHalfedgeCWIter(*this, _vh, true); }
/// const vertex - incoming halfedge circulator ccw
ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const
{ return ConstVertexIHalfedgeCCWIter(*this, _vh, true); }
/// const vertex - outgoing halfedge circulator
ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const
{ return ConstVertexOHalfedgeIter(*this, _vh, true); }
/// const vertex - outgoing halfedge circulator cw
ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const
{ return ConstVertexOHalfedgeCWIter(*this, _vh, true); }
/// const vertex - outgoing halfedge circulator ccw
ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const
{ return ConstVertexOHalfedgeCCWIter(*this, _vh, true); }
/// const vertex - edge circulator
ConstVertexEdgeIter cve_end(VertexHandle _vh) const
{ return ConstVertexEdgeIter(*this, _vh, true); }
/// const vertex - edge circulator cw
ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const
{ return ConstVertexEdgeCWIter(*this, _vh, true); }
/// const vertex - edge circulator ccw
ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const
{ return ConstVertexEdgeCCWIter(*this, _vh, true); }
/// const vertex - face circulator
ConstVertexFaceIter cvf_end(VertexHandle _vh) const
{ return ConstVertexFaceIter(*this, _vh, true); }
/// const vertex - face circulator cw
ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const
{ return ConstVertexFaceCWIter(*this, _vh, true); }
/// const vertex - face circulator ccw
ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const
{ return ConstVertexFaceCCWIter(*this, _vh, true); }
/// face - vertex circulator
FaceVertexIter fv_end(FaceHandle _fh)
{ return FaceVertexIter(*this, _fh, true); }
/// face - vertex circulator cw
FaceVertexCWIter fv_cwend(FaceHandle _fh)
{ return FaceVertexCWIter(*this, _fh, true); }
/// face - vertex circulator ccw
FaceVertexCCWIter fv_ccwend(FaceHandle _fh)
{ return FaceVertexCCWIter(*this, _fh, true); }
/// face - halfedge circulator
FaceHalfedgeIter fh_end(FaceHandle _fh)
{ return FaceHalfedgeIter(*this, _fh, true); }
/// face - halfedge circulator cw
FaceHalfedgeCWIter fh_cwend(FaceHandle _fh)
{ return FaceHalfedgeCWIter(*this, _fh, true); }
/// face - halfedge circulator ccw
FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh)
{ return FaceHalfedgeCCWIter(*this, _fh, true); }
/// face - edge circulator
FaceEdgeIter fe_end(FaceHandle _fh)
{ return FaceEdgeIter(*this, _fh, true); }
/// face - edge circulator cw
FaceEdgeCWIter fe_cwend(FaceHandle _fh)
{ return FaceEdgeCWIter(*this, _fh, true); }
/// face - edge circulator ccw
FaceEdgeCCWIter fe_ccwend(FaceHandle _fh)
{ return FaceEdgeCCWIter(*this, _fh, true); }
/// face - face circulator
FaceFaceIter ff_end(FaceHandle _fh)
{ return FaceFaceIter(*this, _fh, true); }
/// face - face circulator cw
FaceFaceCWIter ff_cwend(FaceHandle _fh)
{ return FaceFaceCWIter(*this, _fh, true); }
/// face - face circulator ccw
FaceFaceCCWIter ff_ccwend(FaceHandle _fh)
{ return FaceFaceCCWIter(*this, _fh, true); }
/// face - face circulator
HalfedgeLoopIter hl_end(HalfedgeHandle _heh)
{ return HalfedgeLoopIter(*this, _heh, true); }
/// face - face circulator cw
HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh)
{ return HalfedgeLoopCWIter(*this, _heh, true); }
/// face - face circulator ccw
HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh)
{ return HalfedgeLoopCCWIter(*this, _heh, true); }
/// const face - vertex circulator
ConstFaceVertexIter cfv_end(FaceHandle _fh) const
{ return ConstFaceVertexIter(*this, _fh, true); }
/// const face - vertex circulator cw
ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const
{ return ConstFaceVertexCWIter(*this, _fh, true); }
/// const face - vertex circulator ccw
ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const
{ return ConstFaceVertexCCWIter(*this, _fh, true); }
/// const face - halfedge circulator
ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const
{ return ConstFaceHalfedgeIter(*this, _fh, true); }
/// const face - halfedge circulator cw
ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const
{ return ConstFaceHalfedgeCWIter(*this, _fh, true); }
/// const face - halfedge circulator ccw
ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const
{ return ConstFaceHalfedgeCCWIter(*this, _fh, true); }
/// const face - edge circulator
ConstFaceEdgeIter cfe_end(FaceHandle _fh) const
{ return ConstFaceEdgeIter(*this, _fh, true); }
/// const face - edge circulator cw
ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const
{ return ConstFaceEdgeCWIter(*this, _fh, true); }
/// const face - edge circulator ccw
ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const
{ return ConstFaceEdgeCCWIter(*this, _fh, true); }
/// const face - face circulator
ConstFaceFaceIter cff_end(FaceHandle _fh) const
{ return ConstFaceFaceIter(*this, _fh, true); }
/// const face - face circulator
ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const
{ return ConstFaceFaceCWIter(*this, _fh, true); }
/// const face - face circulator
ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const
{ return ConstFaceFaceCCWIter(*this, _fh, true); }
/// const face - face circulator
ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const
{ return ConstHalfedgeLoopIter(*this, _heh, true); }
/// const face - face circulator cw
ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const
{ return ConstHalfedgeLoopCWIter(*this, _heh, true); }
/// const face - face circulator ccw
ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const
{ return ConstHalfedgeLoopCCWIter(*this, _heh, true); }
//@}
/** @name Range based iterators and circulators */