From e2d11a0fc5b384fd65bdaec27b4ed9d5c0212a59 Mon Sep 17 00:00:00 2001 From: Laurent Rineau Date: Wed, 18 Dec 2024 13:44:54 +0100 Subject: [PATCH] allow a range as parameter The preview implementation enforced the use of a full container. --- Mesh_3/include/CGAL/make_mesh_3.h | 6 +++--- .../Mesh_3/test_meshing_unit_tetrahedron.cpp | 12 ++++++++++++ .../STL_Extension/internal/mesh_option_classes.h | 16 ++++++++++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Mesh_3/include/CGAL/make_mesh_3.h b/Mesh_3/include/CGAL/make_mesh_3.h index 04de44c7d73..8563c016e41 100644 --- a/Mesh_3/include/CGAL/make_mesh_3.h +++ b/Mesh_3/include/CGAL/make_mesh_3.h @@ -88,11 +88,11 @@ add_points_from_generator(C3T3& c3t3, } }; + auto output_it = boost::make_function_output_iterator(push_initial_point); if (nb_initial_points > 0) - generator(boost::make_function_output_iterator(push_initial_point), nb_initial_points); + generator(output_it, nb_initial_points); else - generator(boost::make_function_output_iterator(push_initial_point)); - + generator(output_it); // Insert points and set their index and dimension for (const auto& [wpoint, dimension, index] : initial_points) diff --git a/Mesh_3/test/Mesh_3/test_meshing_unit_tetrahedron.cpp b/Mesh_3/test/Mesh_3/test_meshing_unit_tetrahedron.cpp index e8e9268e323..6276758bfcc 100644 --- a/Mesh_3/test/Mesh_3/test_meshing_unit_tetrahedron.cpp +++ b/Mesh_3/test/Mesh_3/test_meshing_unit_tetrahedron.cpp @@ -10,6 +10,14 @@ #include +template class Non_copyable_range_view { + Range& r; +public: + Non_copyable_range_view(Range& r) : r(r) {} + auto begin() const { return r.begin(); } + auto end() const { return r.end(); } +}; + template struct Polyhedron_tester : public Tester { @@ -78,6 +86,10 @@ struct Polyhedron_tester : public Tester std::vector initial_points = { Initial_point{ Weighted_point(.5, .5, .5), 3, Index{}} }; c3t3 = CGAL::make_mesh_3(domain, criteria, CGAL::parameters::initial_points(initial_points)); + // test initial_points with a non-copyable range + Non_copyable_range_view initial_points_view{ initial_points }; + c3t3 = CGAL::make_mesh_3(domain, criteria, CGAL::parameters::initial_points(initial_points_view)); + // test initial_points_generator with a generator generating tuple-like object auto initial_points_generator = [](auto oit, const int) { *oit++ = Initial_point{ Weighted_point(.5, .5, .5), 3, Index{} }; diff --git a/STL_Extension/include/CGAL/STL_Extension/internal/mesh_option_classes.h b/STL_Extension/include/CGAL/STL_Extension/internal/mesh_option_classes.h index b017dac3111..6061a523675 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/mesh_option_classes.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/mesh_option_classes.h @@ -196,8 +196,16 @@ struct Initialization_options using Initial_points_range = typename CGAL::Default::Get>::type; - using Initial_points_const_iterator = typename Initial_points_range::const_iterator; - using Initial_point = typename std::iterator_traits::value_type; + template + static auto cbegin(Range&& range) { + return std::cbegin(std::forward(range)); + } + + template + static auto cend(Range&& range) { + return std::cend(std::forward(range)); + } + using Initial_points_const_iterator = decltype(cbegin(std::declval())); Initialization_options() {} @@ -205,8 +213,8 @@ struct Initialization_options Initialization_options(const Initial_points_generator& generator, const Initial_points_range& initial_points) : initial_points_generator_(generator) - , begin_it(initial_points.begin()) - , end_it(initial_points.end()) + , begin_it(cbegin(initial_points)) + , end_it(cend(initial_points)) {} template