diff --git a/BGL/include/CGAL/boost/graph/Euler_operations.h b/BGL/include/CGAL/boost/graph/Euler_operations.h index 8bea4e264c4..6272bf861c5 100644 --- a/BGL/include/CGAL/boost/graph/Euler_operations.h +++ b/BGL/include/CGAL/boost/graph/Euler_operations.h @@ -43,6 +43,7 @@ join_face(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::face_descriptor face_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); halfedge_descriptor hop = opposite(h,g); halfedge_descriptor hprev = prev(h, g), gprev = prev(hop, g); @@ -117,6 +118,8 @@ join_vertex(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::vertex_descriptor vertex_descriptor; typedef Halfedge_around_target_iterator halfedge_around_vertex_iterator; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + halfedge_descriptor hop = opposite(h, g) , hprev = prev(hop, g) , gprev = prev(h, g) @@ -191,8 +194,9 @@ split_vertex(typename boost::graph_traits::halfedge_descriptor h1, typename boost::graph_traits::halfedge_descriptor h2, Graph& g) { - CGAL_assertion(h1 != h2); - CGAL_assertion(target(h1, g) == target(h2, g)); + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && is_valid_halfedge_descriptor(h2, g)); + CGAL_precondition(h1 != h2); + CGAL_precondition(target(h1, g) == target(h2, g)); typename boost::graph_traits::halfedge_descriptor hnew = halfedge(add_edge(g), g), @@ -226,8 +230,11 @@ split_vertex(typename boost::graph_traits::halfedge_descriptor h1, template typename boost::graph_traits::halfedge_descriptor split_edge(typename boost::graph_traits::halfedge_descriptor h, Graph& g) -{ return opposite(split_vertex(prev(h,g), opposite(h,g),g), g); } +{ + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + return opposite(split_vertex(prev(h,g), opposite(h,g),g), g); +} /** * joins the two faces incident to `h` and `opposite(h,g)`. @@ -288,6 +295,12 @@ split_face(typename boost::graph_traits::halfedge_descriptor h1, typedef typename boost::graph_traits Traits; typedef typename Traits::halfedge_descriptor halfedge_descriptor; typedef typename Traits::face_descriptor face_descriptor; + + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && is_valid_halfedge_descriptor(h2, g)); + CGAL_precondition(h1 != h2); + CGAL_precondition(face(h1, g) == face(h2, g)); + CGAL_precondition(next(h1, g) != h2 && next(h2, g) != h1); + halfedge_descriptor hnew = halfedge(add_edge(g), g); face_descriptor fnew = add_face(g); internal::insert_tip( hnew, h2, g); @@ -326,7 +339,9 @@ join_loop(typename boost::graph_traits::halfedge_descriptor h1, typedef typename boost::graph_traits Traits; typedef typename Traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && is_valid_halfedge_descriptor(h2, g)); CGAL_precondition( is_border(h1,g) || face(h1, g) != face(h2, g)); + if (! is_border(h1,g)) remove_face(face(h1, g), g); if (! is_border(h2,g)) @@ -400,13 +415,18 @@ split_loop(typename boost::graph_traits::halfedge_descriptor h1, typedef typename Traits::halfedge_descriptor halfedge_descriptor; typedef typename Traits::face_descriptor face_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && + is_valid_halfedge_descriptor(h2, g) && + is_valid_halfedge_descriptor(h3, g)); + halfedge_descriptor h = h1, i = h2, j = h3; - CGAL_precondition( h != i); - CGAL_precondition( h != j); - CGAL_precondition( i != j); - CGAL_precondition( target(h,g) == target(opposite(i,g),g)); - CGAL_precondition( target(i,g) == target(opposite(j,g),g)); - CGAL_precondition( target(j,g) == target(opposite(h,g),g)); + CGAL_precondition(h != i); + CGAL_precondition(h != j); + CGAL_precondition(i != j); + CGAL_precondition(target(h,g) == target(opposite(i,g),g)); + CGAL_precondition(target(i,g) == target(opposite(j,g),g)); + CGAL_precondition(target(j,g) == target(opposite(h,g),g)); + // Create a copy of the triangle. halfedge_descriptor hnew = internal::copy(h,g); halfedge_descriptor inew = internal::copy(i,g); @@ -504,6 +524,7 @@ void remove_face(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::halfedge_descriptor halfedge_descriptor; typedef typename Traits::face_descriptor face_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); CGAL_precondition(! is_border(h,g)); face_descriptor f = face(h, g); @@ -551,6 +572,8 @@ add_edge(typename boost::graph_traits::vertex_descriptor s, typename boost::graph_traits::vertex_descriptor t, Graph& g) { + CGAL_precondition(is_valid_vertex_descriptor(s, g) && is_valid_vertex_descriptor(t, g)); + typename boost::graph_traits::edge_descriptor e = add_edge(g); set_target(halfedge(e, g), t, g); set_target(opposite(halfedge(e, g), g), s, g); @@ -568,6 +591,9 @@ bool can_add_face(const VertexRange& vrange, const PMesh& sm) typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition_code(for(vertex_descriptor v : vrange)) + CGAL_precondition(is_valid_vertex_descriptor(v, sm)); + std::vector::vertex_descriptor> face(vrange.begin(), vrange.end()); std::size_t N = face.size(); @@ -697,6 +723,9 @@ add_face(const VertexRange& vr, Graph& g) typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + CGAL_precondition_code(for(vertex_descriptor v : vr)) + CGAL_precondition(is_valid_vertex_descriptor(v, g)); + std::vector vertices(vr.begin(), vr.end()); // quick and dirty copy unsigned int n = (unsigned int)vertices.size(); //check that every vertex is unique @@ -1115,7 +1144,9 @@ void make_hole(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::face_descriptor face_descriptor; typedef Halfedge_around_face_iterator halfedge_around_face_iterator; - CGAL_precondition(! is_border(h,g)); + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + CGAL_precondition(!is_border(h, g)); + face_descriptor fd = face(h, g); halfedge_around_face_iterator hafib, hafie; for(boost::tie(hafib, hafie) = halfedges_around_face(h, g); @@ -1139,6 +1170,9 @@ void fill_hole(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::face_descriptor face_descriptor; typedef typename Traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + CGAL_precondition(!is_border(h, g)); + face_descriptor f = add_face(g); for(halfedge_descriptor hd : halfedges_around_face(h,g)){ set_face(hd, f,g); @@ -1179,6 +1213,9 @@ add_center_vertex(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::halfedge_descriptor halfedge_descriptor; typedef typename Traits::face_descriptor face_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + CGAL_precondition(!is_border(h, g)); + halfedge_descriptor hnew = halfedge(add_edge(g),g); vertex_descriptor vnew = add_vertex(g); internal::close_tip(hnew, vnew, g); @@ -1236,6 +1273,8 @@ remove_center_vertex(typename boost::graph_traits::halfedge_descriptor h, typedef typename boost::graph_traits Traits; typedef typename Traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + // h points to the vertex that gets removed halfedge_descriptor h2 = opposite(next(h, g), g); halfedge_descriptor hret = prev(h, g); @@ -1283,14 +1322,28 @@ add_vertex_and_face_to_border(typename boost::graph_traits::halfedge_desc typename boost::graph_traits::halfedge_descriptor h2, Graph& g) { - typename boost::graph_traits::vertex_descriptor v = add_vertex(g); - typename boost::graph_traits::face_descriptor f = add_face(g); - typename boost::graph_traits::edge_descriptor e1 = add_edge(g); - typename boost::graph_traits::edge_descriptor e2 = add_edge(g); - typename boost::graph_traits::halfedge_descriptor he1= halfedge(e1, g); - typename boost::graph_traits::halfedge_descriptor he2= halfedge(e2, g); - typename boost::graph_traits::halfedge_descriptor ohe1= opposite(he1, g); - typename boost::graph_traits::halfedge_descriptor ohe2= opposite(he2, g); + typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + typedef typename boost::graph_traits::edge_descriptor edge_descriptor; + typedef typename boost::graph_traits::face_descriptor face_descriptor; + + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && is_valid_halfedge_descriptor(h2, g)); + CGAL_precondition(is_border(h1, g) && is_border(h2, g)); + CGAL_precondition(h1 != h2); + + CGAL_precondition_code(halfedge_descriptor h = h1;) + CGAL_precondition_code(const halfedge_descriptor done = h1;) + CGAL_precondition_code(do { if(h == h2) break; h = next(h, g); } while(h != done);) + CGAL_precondition(h != done); + + vertex_descriptor v = add_vertex(g); + face_descriptor f = add_face(g); + edge_descriptor e1 = add_edge(g); + edge_descriptor e2 = add_edge(g); + halfedge_descriptor he1 = halfedge(e1, g); + halfedge_descriptor he2 = halfedge(e2, g); + halfedge_descriptor ohe1= opposite(he1, g); + halfedge_descriptor ohe2= opposite(he2, g); set_next(ohe1, next(h1,g),g); set_next(h1,he1,g); @@ -1340,6 +1393,7 @@ add_face_to_border(typename boost::graph_traits::halfedge_descriptor h1, typename boost::graph_traits::halfedge_descriptor h2, Graph& g) { + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && is_valid_halfedge_descriptor(h2, g)); CGAL_precondition(is_border(h1,g) == true); CGAL_precondition(is_border(h2,g) == true); CGAL_precondition(h1 != h2); @@ -1409,6 +1463,8 @@ collapse_edge(typename boost::graph_traits::edge_descriptor e, typedef typename Traits::vertex_descriptor vertex_descriptor; typedef typename Traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_edge_descriptor(e, g)); + halfedge_descriptor pq = halfedge(e,g); halfedge_descriptor qp = opposite(pq, g); halfedge_descriptor pt = opposite(prev(pq, g), g); @@ -1527,8 +1583,10 @@ collapse_edge(typename boost::graph_traits::edge_descriptor v0v1, typedef typename Traits::vertex_descriptor vertex_descriptor; typedef typename Traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_edge_descriptor(v0v1, g)); + CGAL_precondition(!get(Edge_is_constrained_map, v0v1)); + halfedge_descriptor pq = halfedge(v0v1,g); - CGAL_assertion( !get(Edge_is_constrained_map,v0v1) ); halfedge_descriptor qp = opposite(pq,g); halfedge_descriptor pt = opposite(prev(pq,g),g); @@ -1666,6 +1724,8 @@ flip_edge(typename boost::graph_traits::halfedge_descriptor h, typedef typename Traits::halfedge_descriptor halfedge_descriptor; typedef typename Traits::face_descriptor face_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, g)); + vertex_descriptor s = source(h,g); vertex_descriptor t = target(h,g); halfedge_descriptor nh = next(h,g), nnh = next(nh,g), oh = opposite(h,g), noh = next(oh,g), nnoh = next(noh,g); @@ -1706,6 +1766,8 @@ does_satisfy_link_condition(typename boost::graph_traits::edge_descriptor typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef CGAL::Halfedge_around_source_iterator out_edge_iterator; + CGAL_precondition(is_valid_edge_descriptor(e, g)); + halfedge_descriptor v0_v1 = halfedge(e,g); halfedge_descriptor v1_v0 = opposite(v0_v1,g); diff --git a/BGL/include/CGAL/boost/graph/generators.h b/BGL/include/CGAL/boost/graph/generators.h index d49a53fd814..a4e91f177fb 100644 --- a/BGL/include/CGAL/boost/graph/generators.h +++ b/BGL/include/CGAL/boost/graph/generators.h @@ -195,6 +195,11 @@ make_quad(typename boost::graph_traits::vertex_descriptor v0, typename boost::graph_traits::vertex_descriptor v3, Graph& g) { + CGAL_precondition(is_valid_vertex_descriptor(v0, g) && + is_valid_vertex_descriptor(v1, g) && + is_valid_vertex_descriptor(v2, g) && + is_valid_vertex_descriptor(v3, g)); + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; halfedge_descriptor h0 = halfedge(add_edge(g), g); diff --git a/BGL/include/CGAL/boost/graph/helpers.h b/BGL/include/CGAL/boost/graph/helpers.h index 25ec6153c5b..961a27ae168 100644 --- a/BGL/include/CGAL/boost/graph/helpers.h +++ b/BGL/include/CGAL/boost/graph/helpers.h @@ -803,6 +803,8 @@ bool is_hexahedron(typename boost::graph_traits::halfedge_descriptor { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(hd, g)); + halfedge_descriptor h1 = hd; if(is_border(h1,g)) return false; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; @@ -863,6 +865,8 @@ void swap_vertices(typename boost::graph_traits::vertex_descriptor& p { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_vertex_descriptor(p, g) && is_valid_vertex_descriptor(q, g)); + halfedge_descriptor hq=halfedge(q, g); halfedge_descriptor hp=halfedge(p, g); for(halfedge_descriptor h : halfedges_around_target(hq, g)) @@ -881,6 +885,9 @@ void swap_edges(const typename boost::graph_traits::halfedge_descript typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; + + CGAL_precondition(is_valid_halfedge_descriptor(h1, g) && is_valid_halfedge_descriptor(h2, g)); + const halfedge_descriptor oh1 = opposite(h1, g), oh2 = opposite(h2, g); // backup vertex pointers @@ -1010,6 +1017,8 @@ int vertex_index_in_face(const typename boost::graph_traits::vertex_descr { typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_vertex_descriptor(vd, g) && is_valid_face_descriptor(fd, g)); + halfedge_descriptor start = halfedge(fd, g); halfedge_descriptor current = start; int counter = 0; @@ -1050,7 +1059,7 @@ int halfedge_index_in_face(typename boost::graph_traits::halfedge_descrip typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; - CGAL_precondition(he != boost::graph_traits::null_halfedge()); + CGAL_precondition(is_valid_halfedge_descriptor(he, g)); CGAL_precondition(!is_border(he, g)); face_descriptor f = face(he, g); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/bbox.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/bbox.h index 580dccecb52..3c321c7bc18 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/bbox.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/bbox.h @@ -179,6 +179,8 @@ namespace CGAL { using parameters::choose_parameter; using parameters::get_parameter; + CGAL_precondition(is_valid_edge_descriptor(ed, pmesh)); + typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); @@ -234,6 +236,8 @@ namespace CGAL { using parameters::choose_parameter; using parameters::get_parameter; + CGAL_precondition(is_valid_face_descriptor(fd, pmesh)); + typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h index 2cd837e7bf8..0fd62621a84 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/compute_normal.h @@ -89,6 +89,8 @@ void sum_normals(const PM& pmesh, typedef typename boost::property_traits::reference Point_ref; + CGAL_precondition(is_valid_face_descriptor(f, pmesh)); + halfedge_descriptor he = halfedge(f, pmesh); vertex_descriptor v = source(he, pmesh); vertex_descriptor the = target(he,pmesh); @@ -172,6 +174,8 @@ compute_face_normal(typename boost::graph_traits::face_descriptor f using parameters::choose_parameter; using parameters::get_parameter; + CGAL_precondition(is_valid_face_descriptor(f, pmesh)); + typedef typename GetGeomTraits::type GT; GT traits = choose_parameter(get_parameter(np, internal_np::geom_traits)); @@ -665,6 +669,8 @@ compute_vertex_normal(typename boost::graph_traits::vertex_descript using parameters::is_default_parameter; using parameters::get_parameter; + CGAL_precondition(is_valid_vertex_descriptor(v, pmesh)); + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_descriptor face_descriptor; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h index a2d1b368140..b8b80d5d437 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/detect_features.h @@ -57,6 +57,8 @@ is_sharp(const typename boost::graph_traits::halfedge_descriptor h, typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_halfedge_descriptor(h, pmesh)); + if(is_border_edge(h, pmesh)) return false; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h index 727c5f50109..54369aee910 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/refine_impl.h @@ -103,7 +103,7 @@ private: { for(face_descriptor fd : faces) { - CGAL_assertion(fd != boost::graph_traits::null_face()); + CGAL_assertion(is_valid_face_descriptor(fd, pmesh)); vertex_descriptor vi = target(halfedge(fd,pmesh),pmesh); vertex_descriptor vj = target(next(halfedge(fd,pmesh),pmesh),pmesh); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h index 08cc3551973..2613b163d6e 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/locate.h @@ -442,8 +442,8 @@ random_location_on_face(typename boost::graph_traits::face_descrip CGAL::Random& rnd = get_default_random()) { CGAL_USE(tm); - CGAL_precondition(CGAL::is_triangle_mesh(tm)); - CGAL_precondition(fd != boost::graph_traits::null_face()); + CGAL_precondition(is_valid_face_descriptor(fd, tm)); + CGAL_precondition(is_triangle(halfedge(fd, tm), tm)); // calling 'rnd.uniform real' with double in case FT comes from an EPECK kernel (which doesn't seem to work too well) FT u(rnd.uniform_real(0., 1.)); @@ -523,8 +523,8 @@ get_descriptor_from_location(const std::pair::null_face()); + CGAL_precondition(is_valid_face_descriptor(fd, tm)); + CGAL_precondition(is_triangle(halfedge(fd, tm), tm)); CGAL_precondition(is_in_face(loc, tm)); // the first barycentric coordinate corresponds to source(halfedge(fd, tm), tm) @@ -942,11 +942,10 @@ locate_vertex(typename boost::graph_traits::vertex_descriptor vd, } } - CGAL_postcondition(!CGAL::is_border(hd, tm)); // must find a 'real' face incident to 'vd' + CGAL_postcondition(!is_border(hd, tm)); // must find a 'real' face incident to 'vd' + CGAL_assertion(target(hd, tm) == vd); face_descriptor fd = face(hd, tm); - - CGAL_assertion(target(hd, tm) == vd); CGAL_assertion(fd != boost::graph_traits::null_face()); // isolated vertex @@ -989,7 +988,7 @@ locate_vertex(const typename boost::graph_traits::vertex_descripto const typename boost::graph_traits::face_descriptor fd, const TriangleMesh& tm) { - CGAL_precondition(fd != boost::graph_traits::null_face()); + CGAL_precondition(is_valid_vertex_descriptor(vd, tm) && is_valid_face_descriptor(fd, tm)); FT coords[3] = { FT(0), FT(0), FT(0) }; std::size_t vertex_local_index = vertex_index_in_face(vd, fd, tm); @@ -1121,14 +1120,14 @@ locate_in_face(const typename internal::Location_traits(get_parameter(np, internal_np::geom_traits)); FT snap_tolerance = choose_parameter(get_parameter(np, internal_np::snapping_tolerance), 0); - CGAL_precondition(fd != boost::graph_traits::null_face()); - vertex_descriptor vd0 = source(halfedge(fd, tm), tm); vertex_descriptor vd1 = target(halfedge(fd, tm), tm); vertex_descriptor vd2 = target(next(halfedge(fd, tm), tm), tm); @@ -1288,10 +1287,9 @@ locate_in_common_face(std::pair::face else if(const halfedge_descriptor* hd_ptr = boost::get(&dv)) { const halfedge_descriptor hd = *hd_ptr; - face_descriptor fd = face(hd, tm); - - if(fd != boost::graph_traits::null_face()) + if(!is_border(hd, tm)) { + face_descriptor fd = face(hd, tm); query_location = locate_in_face(query, fd, tm, np); internal::snap_location_to_border(query_location, tm, tolerance); // @tmp keep or not ? is_query_location_in_face = is_in_face(query_location, tm); @@ -1299,7 +1297,7 @@ locate_in_common_face(std::pair::face if(!is_query_location_in_face) { - fd = face(opposite(hd, tm), tm); + face_descriptor fd = face(opposite(hd, tm), tm); query_location = locate_in_face(query, fd, tm, np); is_query_location_in_face = is_in_face(query_location, tm); } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h index 85b8dea7f29..c1b391a339a 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/measure.h @@ -112,7 +112,7 @@ edge_length(typename boost::graph_traits::halfedge_descriptor h, using parameters::choose_parameter; using parameters::get_parameter; - CGAL_precondition(boost::graph_traits::null_halfedge() != h); + CGAL_precondition(is_valid_halfedge_descriptor(h, pmesh)); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -132,6 +132,8 @@ edge_length(typename boost::graph_traits::edge_descriptor e, const PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { + CGAL_precondition(is_valid_edge_descriptor(e, pmesh)); + return edge_length(halfedge(e, pmesh), pmesh, np); } @@ -187,7 +189,7 @@ squared_edge_length(typename boost::graph_traits::halfedge_descript using parameters::choose_parameter; using parameters::get_parameter; - CGAL_precondition(boost::graph_traits::null_halfedge() != h); + CGAL_precondition(is_valid_halfedge_descriptor(h, pmesh)); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -208,6 +210,8 @@ squared_edge_length(typename boost::graph_traits::edge_descriptor e const PolygonMesh& pmesh, const NamedParameters& np = parameters::default_values()) { + CGAL_precondition(is_valid_edge_descriptor(e, pmesh)); + return squared_edge_length(halfedge(e, pmesh), pmesh, np); } @@ -415,7 +419,7 @@ face_area(typename boost::graph_traits::face_descriptor f, typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - CGAL_precondition(boost::graph_traits::null_face() != f); + CGAL_precondition(is_valid_face_descriptor(f, tmesh)); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -486,7 +490,7 @@ squared_face_area(typename boost::graph_traits::face_descriptor f, typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; - CGAL_precondition(boost::graph_traits::null_face() != f); + CGAL_precondition(is_valid_face_descriptor(f, tmesh)); typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -741,7 +745,7 @@ face_aspect_ratio(typename boost::graph_traits::face_descriptor f, const TriangleMesh& tmesh, const CGAL_NP_CLASS& np = parameters::default_values()) { - CGAL_precondition(f != boost::graph_traits::null_face()); + CGAL_precondition(is_valid_face_descriptor(f, tmesh)); CGAL_precondition(is_triangle(halfedge(f, tmesh), tmesh)); typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h index b0a97548d83..5e15af9a1c4 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/merge_border_vertices.h @@ -292,6 +292,8 @@ void merge_duplicated_vertices_in_boundary_cycle(typename boost::graph_traits::face_descriptor fd = - CGAL::Euler::add_face(vr, pmesh); - CGAL_assertion(fd != boost::graph_traits::null_face()); + typename boost::graph_traits::face_descriptor fd = CGAL::Euler::add_face(vr, pmesh); + CGAL_postcondition(is_valid_face_descriptor(fd, pmesh)); *i2f++ = std::make_pair(i, fd); } } diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h index 63813d2186a..1bc1c90e677 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/shape_predicates.h @@ -80,6 +80,8 @@ bool is_degenerate_edge(typename boost::graph_traits::edge_descript using parameters::get_parameter; using parameters::choose_parameter; + CGAL_precondition(is_valid_edge_descriptor(e, pm)); + typedef typename GetVertexPointMap::const_type VertexPointMap; VertexPointMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, pm)); @@ -190,11 +192,12 @@ bool is_degenerate_triangle_face(typename boost::graph_traits::fac const TriangleMesh& tm, const NamedParameters& np = parameters::default_values()) { - CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); - using parameters::get_parameter; using parameters::choose_parameter; + CGAL_precondition(is_valid_face_descriptor(f, tm)); + CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); + typedef typename GetVertexPointMap::const_type VertexPointMap; VertexPointMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(vertex_point, tm)); @@ -396,14 +399,14 @@ is_needle_triangle_face(typename boost::graph_traits::face_descrip const double threshold, const NamedParameters& np = parameters::default_values()) { - CGAL_precondition(threshold >= 1.); - CGAL_precondition(f != boost::graph_traits::null_face()); - CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; using parameters::get_parameter; using parameters::choose_parameter; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_face_descriptor(f, tm)); + CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); + CGAL_precondition(threshold >= 1.); typedef typename GetVertexPointMap::const_type VertexPointMap; VertexPointMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), @@ -545,15 +548,15 @@ is_cap_triangle_face(typename boost::graph_traits::face_descriptor const double threshold, const NamedParameters& np = parameters::default_values()) { - CGAL_precondition(f != boost::graph_traits::null_face()); - CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); - CGAL_precondition(threshold >= -1.); - CGAL_precondition(threshold <= 0.); + typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; using parameters::get_parameter; using parameters::choose_parameter; - typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; + CGAL_precondition(is_valid_face_descriptor(f, tm)); + CGAL_precondition(CGAL::is_triangle(halfedge(f, tm), tm)); + CGAL_precondition(threshold >= -1.); + CGAL_precondition(threshold <= 0.); typedef typename GetVertexPointMap::const_type VertexPointMap; VertexPointMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h index abe9160944c..b55fa22e6e3 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/stitch_borders.h @@ -1063,7 +1063,7 @@ std::size_t stitch_boundary_cycle(const typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename std::pair halfedges_pair; - CGAL_precondition(h != boost::graph_traits::null_halfedge()); + CGAL_precondition(is_valid_halfedge_descriptor(h, pmesh)); CGAL_precondition(is_border(h, pmesh)); CGAL_precondition(is_valid(pmesh)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangle.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangle.h index 7a131523f37..e174d04e10b 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangle.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangle.h @@ -66,6 +66,8 @@ triangle(typename boost::graph_traits::face_descriptor fd, using CGAL::parameters::choose_parameter; using CGAL::parameters::get_parameter; + CGAL_precondition(is_valid_face_descriptor(fd, tmesh)); + typename GetVertexPointMap::const_type vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, tmesh)); diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h index 0b48967f273..e90755b8344 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_faces.h @@ -474,6 +474,8 @@ bool triangulate_face(typename boost::graph_traits::face_descriptor using parameters::choose_parameter; using parameters::get_parameter; + CGAL_precondition(is_valid_face_descriptor(f, pmesh)); + //VertexPointMap typedef typename GetVertexPointMap::type VPMap; VPMap vpmap = choose_parameter(get_parameter(np, internal_np::vertex_point), diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h index 71351e37125..8b64b403f73 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/triangulate_hole.h @@ -468,6 +468,8 @@ namespace Polygon_mesh_processing { using parameters::choose_parameter; using parameters::get_parameter_reference; + CGAL_precondition(is_valid_halfedge_descriptor(border_halfedge, pmesh)); + std::vector::vertex_descriptor> patch; face_out = triangulate_and_refine_hole (pmesh, border_halfedge, face_out, std::back_inserter(patch), np).first;