diff --git a/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h b/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h index 6b26176615e..9ae118452be 100644 --- a/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h +++ b/Subdivision_method_3/include/CGAL/Subdivision_method_3/internal/subdivision_hosts_impl_3.h @@ -280,19 +280,23 @@ void DQQ_1step_impl(Poly& p, VertexPointMap vpm, Mask mask, CGAL::Tag_false) { 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; - typedef typename boost::graph_traits::vertex_iterator vertex_iterator; - typedef typename boost::graph_traits::edge_iterator edge_iterator; typedef typename boost::property_traits::value_type Point; - typename boost::graph_traits::vertices_size_type num_v = num_vertices(p); - typename boost::graph_traits::halfedges_size_type num_e = num_halfedges(p)/2; - typename boost::graph_traits::faces_size_type num_f = num_faces(p); + //First back up initial vertices/faces/edges + std::vector p_vertices(vertices(p).first, vertices(p).second); + std::vector p_faces(faces(p).first, faces(p).second); + std::vector p_edges(edges(p).first, edges(p).second); + + std::size_t num_v = p_vertices.size(); + std::size_t num_e = p_edges.size(); + std::size_t num_f = p_faces.size(); std::vector border_halfedges; size_t num_be = 0 ; - BOOST_FOREACH(edge_descriptor ed, edges(p)){ + BOOST_FOREACH(edge_descriptor ed, p_edges){ if(is_border(ed,p)){ ++num_be; border_halfedges.push_back(halfedge(ed,p)); @@ -301,10 +305,8 @@ void DQQ_1step_impl(Poly& p, VertexPointMap vpm, Mask mask, CGAL::Tag_false) { Point* point_buffer = new Point[num_e*2]; // Build the point_buffer - vertex_iterator vitr, vitr_end; - boost::tie(vitr,vitr_end) = vertices(p); int pi = 0; - BOOST_FOREACH(vertex_descriptor vd, vertices(p)){ + BOOST_FOREACH(vertex_descriptor vd, p_vertices){ BOOST_FOREACH(halfedge_descriptor hd, halfedges_around_target(vd,p)){ if (! is_border(hd,p)){ mask.corner_node(hd, point_buffer[pi++]); @@ -317,7 +319,8 @@ void DQQ_1step_impl(Poly& p, VertexPointMap vpm, Mask mask, CGAL::Tag_false) { // Build the connectivity using insert_vertex() and insert_edge() pi = 0; - for (typename boost::graph_traits::vertices_size_type i = 0; i < num_v; ++i) { + typename std::vector::iterator vitr=p_vertices.begin(); + for (std::size_t i = 0; i < num_v; ++i) { vertex_descriptor vh = *vitr; ++vitr; @@ -347,7 +350,7 @@ void DQQ_1step_impl(Poly& p, VertexPointMap vpm, Mask mask, CGAL::Tag_false) { } } - edge_iterator eitr = edges(p).first; + typename std::vector::iterator eitr = p_edges.begin(); for (typename boost::graph_traits::edges_size_type i = 0; i < num_e; ++i) { halfedge_descriptor eh = halfedge(*eitr,p); ++eitr; @@ -382,7 +385,7 @@ void DQQ_1step_impl(Poly& p, VertexPointMap vpm, Mask mask, CGAL::Tag_false) { Euler::remove_face(ehe,p); } - vitr = vertices(p).first; + vitr = p_vertices.begin(); for (typename boost::graph_traits::vertices_size_type i = 0; i < num_v-num_be; ++i) { vertex_descriptor vh = *vitr; ++vitr;