diff --git a/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h b/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h index c036dd75bc9..84d662f8e16 100644 --- a/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h +++ b/Constrained_triangulation_3/include/CGAL/Conforming_constrained_Delaunay_triangulation_3.h @@ -1571,6 +1571,36 @@ public: private: + void set_mark(Vertex_handle v, Vertex_marker m) { + v->ccdt_3_data().set_mark(m); + } + + template + void set_marks(Range_of_vertices&& vertices, Vertex_marker m) { + for(auto v : vertices) { + set_mark(v, m); + } + } + + void clear_mark(Vertex_handle v, Vertex_marker m) { + v->ccdt_3_data().clear_mark(m); + } + + template + void clear_marks(Range_of_vertices&& vertices, Vertex_marker m) { + for(auto v : vertices) { + clear_mark(v, m); + } + } + + bool is_marked(Vertex_handle v, Vertex_marker m) const { + return v->ccdt_3_data().is_marked(m); + } + + bool is_marked(Vertex_handle v) const { + return v->ccdt_3_data().is_marked(); + } + class Non_planar_plc_facet_exception : public std::exception { const char* what() const throw() @@ -1938,8 +1968,8 @@ private: const auto index_vd = this->next_around_edge(index_vb, index_va); //write_segment(dump_edges_around, cell_circ->vertex(index_vc), cell_circ->vertex(index_vd)); - if(cell_circ->vertex(index_vc)->ccdt_3_data().is_marked(Vertex_marker::REGION_BORDER)) continue; - if(cell_circ->vertex(index_vd)->ccdt_3_data().is_marked(Vertex_marker::REGION_BORDER)) continue; + if(is_marked(cell_circ->vertex(index_vc), Vertex_marker::REGION_BORDER)) continue; + if(is_marked(cell_circ->vertex(index_vd), Vertex_marker::REGION_BORDER)) continue; int cd_intersects_region = does_edge_intersect_region(cell_circ, index_vc, index_vd, cdt_2, fh_region); if(cd_intersects_region == 1) { return Search_first_intersection_result_type{ Edge{cell_circ, index_vc, index_vd}, border_edge }; @@ -2044,8 +2074,8 @@ private: } auto [cached_value_it, not_visited] = new_edge(v0, v1, false); if(!not_visited) return value_returned(cached_value_it->second); - int v0v1_intersects_region = (v0->ccdt_3_data().is_marked(Vertex_marker::REGION_INSIDE) || - v1->ccdt_3_data().is_marked(Vertex_marker::REGION_INSIDE)) + int v0v1_intersects_region = (is_marked(v0, Vertex_marker::REGION_INSIDE) || + is_marked(v1, Vertex_marker::REGION_INSIDE)) ? expected : does_edge_intersect_region(cell, index_v0, index_v1, cdt_2, fh_region); if(v0v1_intersects_region != 0) { @@ -2174,8 +2204,8 @@ private: Unique_hash_map::handle> vertices_of_cavity_handles; for(auto c: intersecting_cells) { for(auto v : tr().vertices(c)) { - if(!v->ccdt_3_data().is_marked()) { - v->ccdt_3_data().set_mark(Vertex_marker::CAVITY); + if(!is_marked(v)) { + set_mark(v, Vertex_marker::CAVITY); vertices_of_cavity_handles[v] = vertices_of_cavity_union_find.make_set(v); } } @@ -2185,7 +2215,7 @@ private: for(int i = 0; i < 3; ++i) { auto v1 = vertices[i]; auto v2 = vertices[(i + 1) % 3]; - if(v1->ccdt_3_data().is_marked(Vertex_marker::CAVITY) && v2->ccdt_3_data().is_marked(Vertex_marker::CAVITY)) { + if(is_marked(v1, Vertex_marker::CAVITY) && is_marked(v2, Vertex_marker::CAVITY)) { vertices_of_cavity_union_find.unify_sets(vertices_of_cavity_handles[v1], vertices_of_cavity_handles[v2]); } @@ -2198,8 +2228,7 @@ private: for(int j = i + 1; j < 4; ++j) { const auto v1 = c->vertex(i); const auto v2 = c->vertex(j); - if(v1->ccdt_3_data().is_marked(Vertex_marker::CAVITY) && - v2->ccdt_3_data().is_marked(Vertex_marker::CAVITY) && + if(is_marked(v1, Vertex_marker::CAVITY) && is_marked(v2, Vertex_marker::CAVITY) && non_intersecting_edges_set.count(make_sorted_pair(v1, v2)) > 0) { vertices_of_cavity_union_find.unify_sets(vertices_of_cavity_handles[v1], @@ -2252,13 +2281,13 @@ private: handle != end; ++handle) { auto v = *handle; - v->ccdt_3_data().clear_mark(Vertex_marker::CAVITY); + clear_mark(v, Vertex_marker::CAVITY); if(vertices_of_cavity_union_find.same_set(handle, vertex_above_handle)) { vertices_of_upper_cavity.push_back(v); - v->ccdt_3_data().set_mark(Vertex_marker::CAVITY_ABOVE); + set_mark(v, Vertex_marker::CAVITY_ABOVE); } else if(vertices_of_cavity_union_find.same_set(handle, vertex_below_handle)) { vertices_of_lower_cavity.push_back(v); - v->ccdt_3_data().set_mark(Vertex_marker::CAVITY_BELOW); + set_mark(v, Vertex_marker::CAVITY_BELOW); } else { CGAL_error(); } @@ -2266,7 +2295,7 @@ private: while(std::any_of(intersecting_cells.begin(), intersecting_cells.end(), [&](Cell_handle c) { const auto vs = tr().vertices(c); return std::any_of(vs.begin(), vs.end(), [&](auto v) { - if(!v->ccdt_3_data().is_marked()) { + if(!is_marked(v)) { std::cerr << "INFO: Vertex " << IO::oformat(v, with_point_and_info) << " is not marked\n"; return true; } @@ -2279,16 +2308,16 @@ private: for(int j = i + 1; j < 4; ++j) { auto v1 = c->vertex(i); auto v2 = c->vertex(j); - if(v1->ccdt_3_data().is_marked() != v2->ccdt_3_data().is_marked()) { - if(v2->ccdt_3_data().is_marked()) { + if(is_marked(v1) != is_marked(v2)) { + if(is_marked(v2)) { std::swap(v1, v2); } // here v1 is marked and v2 is not - if(v1->ccdt_3_data().is_marked(Vertex_marker::CAVITY_ABOVE)) { + if(is_marked(v1, Vertex_marker::CAVITY_ABOVE)) { vertices_of_upper_cavity_.push_back(v2); - v2->ccdt_3_data().set_mark(Vertex_marker::CAVITY_ABOVE); - } else if(v1->ccdt_3_data().is_marked(Vertex_marker::CAVITY_BELOW)) { + set_mark(v2, Vertex_marker::CAVITY_ABOVE); + } else if(is_marked(v1, Vertex_marker::CAVITY_BELOW)) { vertices_of_lower_cavity_.push_back(v2); - v2->ccdt_3_data().set_mark(Vertex_marker::CAVITY_BELOW); + set_mark(v2, Vertex_marker::CAVITY_BELOW); } } } @@ -2300,22 +2329,18 @@ private: debug_output_facet_vertices({facet}); } for(auto v: tr().vertices(facet)) { - if(v->ccdt_3_data().is_marked(Vertex_marker::CAVITY_ABOVE)) { + if(is_marked(v, Vertex_marker::CAVITY_ABOVE)) { facets_of_upper_cavity.push_back(facet); break; } - if(v->ccdt_3_data().is_marked(Vertex_marker::CAVITY_BELOW)) { + if(is_marked(v, Vertex_marker::CAVITY_BELOW)) { facets_of_lower_cavity.push_back(facet); break; } } } - for(auto v: vertices_of_upper_cavity) { - v->ccdt_3_data().clear_mark(Vertex_marker::CAVITY_ABOVE); - } - for(auto v: vertices_of_lower_cavity) { - v->ccdt_3_data().clear_mark(Vertex_marker::CAVITY_BELOW); - } + clear_marks(vertices_of_upper_cavity, Vertex_marker::CAVITY_ABOVE); + clear_marks(vertices_of_lower_cavity, Vertex_marker::CAVITY_BELOW); } // new algorithm if(this->debug_regions()) { @@ -2390,13 +2415,9 @@ private: write_segment(out, edge); } } - for(auto v: region_border_vertices) { - v->ccdt_3_data().set_mark(Vertex_marker::REGION_BORDER); - } + set_marks(region_border_vertices, Vertex_marker::REGION_BORDER); const auto found_edge_opt = search_first_intersection(face_index, cdt_2, fh_region, border_edges); - for(auto v: region_border_vertices) { - v->ccdt_3_data().clear_mark(Vertex_marker::REGION_BORDER); - } + clear_marks(region_border_vertices, Vertex_marker::REGION_BORDER); [[maybe_unused]] auto try_flip_region_size_4 = [&] { if(region_border_vertices.size() == 4) { @@ -2534,20 +2555,16 @@ private: } CGAL_assertion(found_edge_opt != std::nullopt); - for(auto v : region_border_vertices) { - v->ccdt_3_data().set_mark(Vertex_marker::REGION_BORDER); - } + set_marks(region_border_vertices, Vertex_marker::REGION_BORDER); for(auto v : region_vertices) { - if(v->ccdt_3_data().is_marked(Vertex_marker::REGION_BORDER)) + if(is_marked(v, Vertex_marker::REGION_BORDER)) continue; - v->ccdt_3_data().set_mark(Vertex_marker::REGION_INSIDE); + set_mark(v, Vertex_marker::REGION_INSIDE); } Scope_exit guard{[&] { - for(auto v : region_vertices) { - v->ccdt_3_data().clear_mark(Vertex_marker::REGION_BORDER); - v->ccdt_3_data().clear_mark(Vertex_marker::REGION_INSIDE); - } + clear_marks(region_vertices, Vertex_marker::REGION_BORDER); + clear_marks(region_vertices, Vertex_marker::REGION_INSIDE); }}; const auto [first_intersecting_edge, _] = *found_edge_opt;