mirror of https://github.com/CGAL/cgal
added range based loops to HDS
This commit is contained in:
parent
559a4db42e
commit
0d0c5d211f
|
|
@ -177,6 +177,24 @@ iterator over all faces.
|
|||
*/
|
||||
typedef unspecified_type Face_iterator;
|
||||
|
||||
/*!
|
||||
range type for iterating over the vertices, with a nested
|
||||
type `iterator` that has as value type `Vertex_handle`
|
||||
*/
|
||||
typedef Iterator_range<unspecified_type> Vertex_handles;
|
||||
|
||||
/*!
|
||||
range type for iterating over the halfedges, with a nested
|
||||
type `iterator` that has as value type `Halfedge_handle`
|
||||
*/
|
||||
typedef Iterator_range<unspecified_type> Halfedge_handles;
|
||||
|
||||
/*!
|
||||
range type for iterating over the faces, with a nested
|
||||
type `iterator` that has as value type `Face_handle`
|
||||
*/
|
||||
typedef Iterator_range<unspecified_type> Face_handles;
|
||||
|
||||
/// @}
|
||||
|
||||
/* \name Types for Tagging Optional Features
|
||||
|
|
@ -397,6 +415,12 @@ Vertex_iterator vertices_begin();
|
|||
*/
|
||||
Vertex_iterator vertices_end();
|
||||
|
||||
/*!
|
||||
returns a range of handles over the vertices.
|
||||
\note The value type of `Vertex_handles::iterator` is `Vertex_handle`.
|
||||
*/
|
||||
Vertex_handles vertex_handles();
|
||||
|
||||
/*!
|
||||
iterator over all halfedges
|
||||
*/
|
||||
|
|
@ -407,6 +431,12 @@ Halfedge_iterator halfedges_begin();
|
|||
*/
|
||||
Halfedge_iterator halfedges_end();
|
||||
|
||||
/*!
|
||||
returns a range of handles over the halfedges.
|
||||
\note The value type of `Halfedge_handles::iterator` is `Halfedge_handle`.
|
||||
*/
|
||||
Halfedge_handles halfedge_handles();
|
||||
|
||||
/*!
|
||||
iterator over all faces.
|
||||
*/
|
||||
|
|
@ -417,6 +447,12 @@ Face_iterator faces_begin();
|
|||
*/
|
||||
Face_iterator faces_end();
|
||||
|
||||
/*!
|
||||
returns a range of handles over the faces.
|
||||
\note The value type of `Face_handles::iterator` is `Face_handle`.
|
||||
*/
|
||||
Face_handles face_handles();
|
||||
|
||||
/// @}
|
||||
|
||||
/*! \name Insertion
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include <CGAL/memory.h>
|
||||
#include <CGAL/Unique_hash_map.h>
|
||||
#include <CGAL/N_step_adaptor_derived.h>
|
||||
#include <CGAL/iterator.h>
|
||||
#include <cstddef>
|
||||
|
||||
namespace CGAL {
|
||||
|
|
@ -209,6 +210,9 @@ public:
|
|||
typedef typename Types::Vertex_iterator Vertex_iterator;
|
||||
typedef typename Types::Vertex_const_iterator Vertex_const_iterator;
|
||||
|
||||
typedef Iterator_range< Prevent_deref<Vertex_iterator> > Vertex_handles;
|
||||
typedef Iterator_range< Prevent_deref<Vertex_const_iterator> > Vertex_const_handles;
|
||||
|
||||
typedef typename Types::Halfedge_allocator Halfedge_allocator;
|
||||
typedef typename Types::Halfedge_list Halfedge_list;
|
||||
typedef typename Types::Halfedge_handle Halfedge_handle;
|
||||
|
|
@ -216,6 +220,9 @@ public:
|
|||
typedef typename Types::Halfedge_iterator Halfedge_iterator;
|
||||
typedef typename Types::Halfedge_const_iterator Halfedge_const_iterator;
|
||||
|
||||
typedef Iterator_range< Prevent_deref<Halfedge_iterator> > Halfedge_handles;
|
||||
typedef Iterator_range< Prevent_deref<Halfedge_const_iterator> > Halfedge_const_handles;
|
||||
|
||||
typedef typename Types::Face_allocator Face_allocator;
|
||||
typedef typename Types::Face_list Face_list;
|
||||
typedef typename Types::Face_handle Face_handle;
|
||||
|
|
@ -223,6 +230,9 @@ public:
|
|||
typedef typename Types::Face_iterator Face_iterator;
|
||||
typedef typename Types::Face_const_iterator Face_const_iterator;
|
||||
|
||||
typedef Iterator_range< Prevent_deref<Face_iterator> > Face_handles;
|
||||
typedef Iterator_range< Prevent_deref<Face_const_iterator> > Face_const_handles;
|
||||
|
||||
typedef typename Types::size_type size_type;
|
||||
typedef typename Types::difference_type difference_type;
|
||||
typedef typename Types::iterator_category iterator_category;
|
||||
|
|
@ -453,19 +463,25 @@ public:
|
|||
|
||||
Vertex_iterator vertices_begin() { return vertices.begin();}
|
||||
Vertex_iterator vertices_end() { return vertices.end();}
|
||||
Vertex_handles vertex_handles() { return make_prevent_deref_range(vertices_begin(), vertices_end());}
|
||||
Halfedge_iterator halfedges_begin() { return halfedges.begin();}
|
||||
Halfedge_iterator halfedges_end() { return halfedges.end();}
|
||||
Halfedge_handles halfedge_handles() { return make_prevent_deref_range(halfedges_begin(), halfedges_end());}
|
||||
Face_iterator faces_begin() { return faces.begin();}
|
||||
Face_iterator faces_end() { return faces.end();}
|
||||
Face_handles face_handles() { return make_prevent_deref_range(faces_begin(), faces_end());}
|
||||
|
||||
// The constant iterators and circulators.
|
||||
|
||||
Vertex_const_iterator vertices_begin() const{ return vertices.begin();}
|
||||
Vertex_const_iterator vertices_end() const{ return vertices.end();}
|
||||
Halfedge_const_iterator halfedges_begin() const{ return halfedges.begin();}
|
||||
Halfedge_const_iterator halfedges_end() const{ return halfedges.end();}
|
||||
Face_const_iterator faces_begin() const{ return faces.begin();}
|
||||
Face_const_iterator faces_end() const{ return faces.end();}
|
||||
Vertex_const_iterator vertices_begin() const{ return vertices.begin();}
|
||||
Vertex_const_iterator vertices_end() const{ return vertices.end();}
|
||||
Vertex_const_handles vertex_handles() const{ return make_prevent_deref_range(vertices_begin(), vertices_end());}
|
||||
Halfedge_const_iterator halfedges_begin() const{ return halfedges.begin();}
|
||||
Halfedge_const_iterator halfedges_end() const{ return halfedges.end();}
|
||||
Halfedge_const_handles halfedge_handles() const{ return make_prevent_deref_range(halfedges_begin(), halfedges_end());}
|
||||
Face_const_iterator faces_begin() const{ return faces.begin();}
|
||||
Face_const_iterator faces_end() const{ return faces.end();}
|
||||
Face_const_handles face_handles() const{ return make_prevent_deref_range(faces_begin(), faces_end());}
|
||||
|
||||
// Insertion
|
||||
//
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include <CGAL/memory.h>
|
||||
#include <CGAL/HalfedgeDS_items_decorator.h>
|
||||
#include <CGAL/N_step_adaptor_derived.h>
|
||||
#include <CGAL/iterator.h>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
|
@ -161,6 +162,9 @@ public:
|
|||
typedef typename Types::Vertex_I Vertex_I;
|
||||
typedef typename Types::Vertex_CI Vertex_CI;
|
||||
|
||||
typedef Iterator_range< Prevent_deref<Vertex_iterator> > Vertex_handles;
|
||||
typedef Iterator_range< Prevent_deref<Vertex_const_iterator> > Vertex_const_handles;
|
||||
|
||||
typedef typename Types::Halfedge_vector Halfedge_vector;
|
||||
typedef typename Types::Halfedge_handle Halfedge_handle;
|
||||
typedef typename Types::Halfedge_const_handle Halfedge_const_handle;
|
||||
|
|
@ -169,6 +173,9 @@ public:
|
|||
typedef typename Types::Halfedge_I Halfedge_I;
|
||||
typedef typename Types::Halfedge_CI Halfedge_CI;
|
||||
|
||||
typedef Iterator_range< Prevent_deref<Halfedge_iterator> > Halfedge_handles;
|
||||
typedef Iterator_range< Prevent_deref<Halfedge_const_iterator> > Halfedge_const_handles;
|
||||
|
||||
typedef typename Types::Face_vector Face_vector;
|
||||
typedef typename Types::Face_handle Face_handle;
|
||||
typedef typename Types::Face_const_handle Face_const_handle;
|
||||
|
|
@ -177,6 +184,9 @@ public:
|
|||
typedef typename Types::Face_I Face_I;
|
||||
typedef typename Types::Face_CI Face_CI;
|
||||
|
||||
typedef Iterator_range< Prevent_deref<Face_iterator> > Face_handles;
|
||||
typedef Iterator_range< Prevent_deref<Face_const_iterator> > Face_const_handles;
|
||||
|
||||
typedef typename Types::size_type size_type;
|
||||
typedef typename Types::difference_type difference_type;
|
||||
typedef typename Types::iterator_category iterator_category;
|
||||
|
|
@ -371,19 +381,25 @@ public:
|
|||
|
||||
Vertex_iterator vertices_begin() { return vertices.begin();}
|
||||
Vertex_iterator vertices_end() { return vertices.end();}
|
||||
Vertex_handles vertex_handles() { return make_prevent_deref_range(vertices_begin(), vertices_end());}
|
||||
Halfedge_iterator halfedges_begin() { return halfedges.begin();}
|
||||
Halfedge_iterator halfedges_end() { return halfedges.end();}
|
||||
Halfedge_handles halfedge_handles() { return make_prevent_deref_range(halfedges_begin(), halfedges_end());}
|
||||
Face_iterator faces_begin() { return faces.begin();}
|
||||
Face_iterator faces_end() { return faces.end();}
|
||||
Face_handles face_handles() { return make_prevent_deref_range(faces_begin(), faces_end());}
|
||||
|
||||
// The constant iterators and circulators.
|
||||
|
||||
Vertex_const_iterator vertices_begin() const{ return vertices.begin();}
|
||||
Vertex_const_iterator vertices_end() const{ return vertices.end();}
|
||||
Halfedge_const_iterator halfedges_begin() const{ return halfedges.begin();}
|
||||
Halfedge_const_iterator halfedges_end() const{ return halfedges.end();}
|
||||
Face_const_iterator faces_begin() const{ return faces.begin();}
|
||||
Face_const_iterator faces_end() const{ return faces.end();}
|
||||
Vertex_const_iterator vertices_begin() const{ return vertices.begin();}
|
||||
Vertex_const_iterator vertices_end() const{ return vertices.end();}
|
||||
Vertex_const_handles vertex_handles() const{ return make_prevent_deref_range(vertices_begin(), vertices_end());}
|
||||
Halfedge_const_iterator halfedges_begin() const{ return halfedges.begin();}
|
||||
Halfedge_const_iterator halfedges_end() const{ return halfedges.end();}
|
||||
Halfedge_const_handles halfedge_handles() const{ return make_prevent_deref_range(halfedges_begin(), halfedges_end());}
|
||||
Face_const_iterator faces_begin() const{ return faces.begin();}
|
||||
Face_const_iterator faces_end() const{ return faces.end();}
|
||||
Face_const_handles face_handles() const{ return make_prevent_deref_range(faces_begin(), faces_end());}
|
||||
|
||||
// Insertion
|
||||
//
|
||||
|
|
|
|||
|
|
@ -0,0 +1,167 @@
|
|||
#include <cassert>
|
||||
#include <CGAL/Simple_cartesian.h>
|
||||
#include <CGAL/HalfedgeDS_list.h>
|
||||
#include <CGAL/HalfedgeDS_vector.h>
|
||||
#include <CGAL/Polyhedron_items_3.h>
|
||||
|
||||
using Kernel = CGAL::Simple_cartesian<double>;
|
||||
using HDS_list = CGAL::HalfedgeDS_list<Kernel, CGAL::Polyhedron_items_3>;
|
||||
using HDS_vector = CGAL::HalfedgeDS_vector<Kernel, CGAL::Polyhedron_items_3>;
|
||||
|
||||
// void test_vertex_handles_and_points(
|
||||
// Polyhedron& polyhedron) {
|
||||
|
||||
// auto pit = polyhedron.points_begin();
|
||||
// auto vit = polyhedron.vertices_begin();
|
||||
// for (auto vh : polyhedron.vertex_handles()) {
|
||||
// assert(vh == vit);
|
||||
// assert(vh->point() == vit->point());
|
||||
// assert(vh->point() == *pit);
|
||||
// ++vit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.points_end());
|
||||
// assert(vit == polyhedron.vertices_end());
|
||||
|
||||
// pit = polyhedron.points_begin();
|
||||
// vit = polyhedron.vertices_begin();
|
||||
// for (auto& point : polyhedron.points()) {
|
||||
// assert(*pit == point);
|
||||
// assert(vit->point() == point);
|
||||
// ++vit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.points_end());
|
||||
// assert(vit == polyhedron.vertices_end());
|
||||
// }
|
||||
|
||||
// void test_const_vertex_handles_and_points(
|
||||
// const Polyhedron& polyhedron) {
|
||||
|
||||
// auto pit = polyhedron.points_begin();
|
||||
// auto vit = polyhedron.vertices_begin();
|
||||
// for (const auto vh : polyhedron.vertex_handles()) {
|
||||
// assert(vh == vit);
|
||||
// assert(vh->point() == vit->point());
|
||||
// assert(vh->point() == *pit);
|
||||
// ++vit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.points_end());
|
||||
// assert(vit == polyhedron.vertices_end());
|
||||
|
||||
// pit = polyhedron.points_begin();
|
||||
// vit = polyhedron.vertices_begin();
|
||||
// for (const auto& point : polyhedron.points()) {
|
||||
// assert(*pit == point);
|
||||
// assert(vit->point() == point);
|
||||
// ++vit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.points_end());
|
||||
// assert(vit == polyhedron.vertices_end());
|
||||
// }
|
||||
|
||||
// void test_facet_handles_and_planes(
|
||||
// Polyhedron& polyhedron) {
|
||||
|
||||
// auto pit = polyhedron.planes_begin();
|
||||
// auto fit = polyhedron.facets_begin();
|
||||
// for (auto fh : polyhedron.facet_handles()) {
|
||||
// assert(fh == fit);
|
||||
// assert(fh->plane() == fit->plane());
|
||||
// assert(fh->plane() == *pit);
|
||||
// ++fit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.planes_end());
|
||||
// assert(fit == polyhedron.facets_end());
|
||||
|
||||
// pit = polyhedron.planes_begin();
|
||||
// fit = polyhedron.facets_begin();
|
||||
// for (auto& plane : polyhedron.planes()) {
|
||||
// assert(*pit == plane);
|
||||
// assert(fit->plane() == plane);
|
||||
// ++fit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.planes_end());
|
||||
// assert(fit == polyhedron.facets_end());
|
||||
// }
|
||||
|
||||
// void test_const_facet_handles_and_planes(
|
||||
// const Polyhedron& polyhedron) {
|
||||
|
||||
// auto pit = polyhedron.planes_begin();
|
||||
// auto fit = polyhedron.facets_begin();
|
||||
// for (const auto fh : polyhedron.facet_handles()) {
|
||||
// assert(fh == fit);
|
||||
// assert(fh->plane() == fit->plane());
|
||||
// assert(fh->plane() == *pit);
|
||||
// ++fit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.planes_end());
|
||||
// assert(fit == polyhedron.facets_end());
|
||||
|
||||
// pit = polyhedron.planes_begin();
|
||||
// fit = polyhedron.facets_begin();
|
||||
// for (const auto& plane : polyhedron.planes()) {
|
||||
// assert(*pit == plane);
|
||||
// assert(fit->plane() == plane);
|
||||
// ++fit; ++pit;
|
||||
// }
|
||||
// assert(pit == polyhedron.planes_end());
|
||||
// assert(fit == polyhedron.facets_end());
|
||||
// }
|
||||
|
||||
// void test_halfedge_handles_and_edges(
|
||||
// Polyhedron& polyhedron) {
|
||||
|
||||
// auto hit = polyhedron.halfedges_begin();
|
||||
// for (auto hh : polyhedron.halfedge_handles()) {
|
||||
// assert(hh == hit);
|
||||
// assert(hh->facet() == hit->facet());
|
||||
// assert(hh->vertex() == hit->vertex());
|
||||
// ++hit;
|
||||
// }
|
||||
// assert(hit == polyhedron.halfedges_end());
|
||||
|
||||
// auto eit = polyhedron.edges_begin();
|
||||
// for (auto& edge : polyhedron.edges()) {
|
||||
// assert((*eit).facet() == edge.facet());
|
||||
// assert((*eit).vertex() == edge.vertex());
|
||||
// ++eit;
|
||||
// }
|
||||
// assert(eit == polyhedron.edges_end());
|
||||
// }
|
||||
|
||||
// void test_const_halfedge_handles_and_edges(
|
||||
// const Polyhedron& polyhedron) {
|
||||
|
||||
// auto hit = polyhedron.halfedges_begin();
|
||||
// for (const auto hh : polyhedron.halfedge_handles()) {
|
||||
// assert(hh == hit);
|
||||
// assert(hh->facet() == hit->facet());
|
||||
// assert(hh->vertex() == hit->vertex());
|
||||
// ++hit;
|
||||
// }
|
||||
// assert(hit == polyhedron.halfedges_end());
|
||||
|
||||
// auto eit = polyhedron.edges_begin();
|
||||
// for (const auto& edge : polyhedron.edges()) {
|
||||
// assert((*eit).facet() == edge.facet());
|
||||
// assert((*eit).vertex() == edge.vertex());
|
||||
// ++eit;
|
||||
// }
|
||||
// assert(eit == polyhedron.edges_end());
|
||||
// }
|
||||
|
||||
int main() {
|
||||
|
||||
HDS_list hds_list(1, 2, 2);
|
||||
HDS_vector hds_vector(1, 2, 2);
|
||||
|
||||
// test_vertex_handles_and_points(polyhedron);
|
||||
// test_const_vertex_handles_and_points(polyhedron);
|
||||
// test_facet_handles_and_planes(polyhedron);
|
||||
// test_const_facet_handles_and_planes(polyhedron);
|
||||
// test_halfedge_handles_and_edges(polyhedron);
|
||||
// test_const_halfedge_handles_and_edges(polyhedron);
|
||||
|
||||
std::cout << "test_hds_range_based_loops: SUCCESS" << std::endl;
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Loading…
Reference in New Issue