diff --git a/BGL/examples/BGL_polyhedron_3/copy_polyhedron.cpp b/BGL/examples/BGL_polyhedron_3/copy_polyhedron.cpp index 64c2b8650d9..9a4f25b5548 100644 --- a/BGL/examples/BGL_polyhedron_3/copy_polyhedron.cpp +++ b/BGL/examples/BGL_polyhedron_3/copy_polyhedron.cpp @@ -35,17 +35,17 @@ int main(int argc, char* argv[]) std::ifstream in((argc>1)?argv[1]:"cube.off"); in >> S; + assert( CGAL::is_valid_polygon_mesh(S) ); // Note that the vertex_point property of the Source and Target1 // come from different kernels. typedef CGAL::Surface_mesh Target1; Target1 T1; - { - CGAL::copy_face_graph(S, T1); - std::ofstream out("sm.off"); - out.precision(17); - out << T1; - } + CGAL::copy_face_graph(S, T1); + assert( CGAL::is_valid_polygon_mesh(T1) ); + assert( vertices(S).size()==vertices(T1).size() ); + assert( halfedges(S).size()==halfedges(T1).size() ); + assert( faces(S).size()==faces(T1).size() ); #if defined(CGAL_USE_OPENMESH) typedef OpenMesh::PolyMesh_ArrayKernelT Target2; @@ -63,7 +63,13 @@ int main(int argc, char* argv[]) CGAL::copy_face_graph(S, T2, CGAL::parameters::vertex_to_vertex_output_iterator(std::inserter(v2v, v2v.end())) .halfedge_to_halfedge_output_iterator(std::inserter(h2h, h2h.end())) .face_to_face_output_iterator(std::inserter(f2f, f2f.end()))); - OpenMesh::IO::write_mesh(T2, "om.off"); + assert( CGAL::is_valid_polygon_mesh(T2) ); + assert( v2v.size()==vertices(T2).size() ); + assert( h2h.size()==halfedges(T2).size() ); + assert( f2f.size()==faces(T2).size() ); + assert( vertices(S).size()==vertices(T2).size() ); + assert( halfedges(S).size()==halfedges(T2).size() ); + assert( faces(S).size()==faces(T2).size() ); } #endif S.clear(); @@ -80,13 +86,14 @@ int main(int argc, char* argv[]) boost::unordered_map v2v; boost::unordered_map h2h; boost::unordered_map f2f; - CGAL::copy_face_graph(T1, S, std::inserter(v2v, v2v.end()), std::inserter(h2h, h2h.end())); - std::ofstream out("reverse.off"); - out.precision(17); - out << S; CGAL::copy_face_graph(T1, S, CGAL::parameters::vertex_to_vertex_map(boost::make_assoc_property_map(v2v)) .halfedge_to_halfedge_output_iterator(std::inserter(h2h, h2h.end())) .face_to_face_map(boost::make_assoc_property_map(f2f))); + + assert( CGAL::is_valid_polygon_mesh(S) ); + assert( vertices(S).size()==vertices(T1).size() ); + assert( halfedges(S).size()==halfedges(T1).size() ); + assert( faces(S).size()==faces(T1).size() ); } return 0; } diff --git a/BGL/include/CGAL/boost/graph/Dual.h b/BGL/include/CGAL/boost/graph/Dual.h index 101548e4ba7..0238fb143e8 100644 --- a/BGL/include/CGAL/boost/graph/Dual.h +++ b/BGL/include/CGAL/boost/graph/Dual.h @@ -158,19 +158,15 @@ struct Dual_face_index_pmap{ } }; -template::type>::value> -struct Dual_property_maps : boost::property_map {}; - -template< typename P, typename Property> -struct Dual_property_maps {}; - } //end of namespace internal -template -struct property_map, Property> - : internal::Dual_property_maps {}; +template +struct property_map, halfedge_index_t> + : boost::property_map {}; + +template +struct property_map, edge_index_t> + : boost::property_map {}; template struct property_map, boost::vertex_index_t> @@ -190,53 +186,49 @@ struct property_map, boost::face_index_t> namespace CGAL { -template -typename boost::property_map::type -get(Property p, Dual

& dual) -{ - return get(p, dual.primal()); +#define CGAL_GET_OVERLOADS(Property) \ +\ +template \ +typename boost::property_map::type \ +get(Property p, Dual

& dual) \ +{ \ + return get(p, dual.primal()); \ +} \ +\ +template \ +typename boost::property_map::const_type \ +get(Property p, const Dual

& dual) \ +{ \ + return get(p, dual.primal()); \ +} \ +\ +template \ +typename boost::property_map_value::type \ +get(Property p, const Dual

& dual, const Key& k) \ +{ \ + return get(p, dual.primal(), k); \ } -template -typename boost::property_map::const_type -get(Property p, const Dual

& dual) -{ - return get(p, dual.primal()); -} +CGAL_GET_OVERLOADS(boost::edge_index_t) +CGAL_GET_OVERLOADS(boost::halfedge_index_t) +CGAL_GET_OVERLOADS(boost::vertex_point_t) -template -typename boost::property_map_value::type -get(Property p, const Dual

& dual, const Key& k) -{ - return get(p, dual.primal(), k); -} - -template -struct Property_map_value_dummy { - typedef typename boost::property_map_value::type type; -}; +#undef CGAL_GET_OVERLOADS template -typename Property_map_value_dummy, boost::vertex_index_t, Key>::type +typename boost::property_map_value, boost::vertex_index_t>::type get(boost::vertex_index_t, const Dual

& dual, const Key& k) { return get(typename boost::internal::Dual_vertex_index_pmap

(dual.primal()), k); } template -typename Property_map_value_dummy, boost::face_index_t, Key>::type +typename boost::property_map_value, boost::face_index_t>::type get(boost::face_index_t, const Dual

& dual, const Key& k) { return get(typename boost::internal::Dual_face_index_pmap

(dual.primal()), k); } -template -void -put(Property p, const Dual

& dual, const Key& k, const Value& val) -{ - put(p, dual.primal(), k, val); -} - template typename boost::internal::Dual_vertex_index_pmap

get(boost::vertex_index_t, const Dual

& dual) diff --git a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h index 875eb7f3e73..ad49cf44394 100644 --- a/BGL/include/CGAL/boost/graph/Face_filtered_graph.h +++ b/BGL/include/CGAL/boost/graph/Face_filtered_graph.h @@ -1048,6 +1048,36 @@ get(PropertyTag ptag, Face_filtered_graph& w) return get(ptag, w.graph()); } +#define CGAL_FFG_DYNAMIC_PMAP_SPEC(TAG) \ +template \ +typename boost::property_map >::const_type \ +get(TAG ptag, const Face_filtered_graph& w) \ +{ \ + return get(ptag, w.graph()); \ +} \ +\ +template \ +typename boost::property_map >::type \ +get(TAG ptag, Face_filtered_graph& w) \ +{ \ + return get(ptag, w.graph()); \ +} + +CGAL_FFG_DYNAMIC_PMAP_SPEC(dynamic_vertex_property_t) +CGAL_FFG_DYNAMIC_PMAP_SPEC(dynamic_halfedge_property_t) +CGAL_FFG_DYNAMIC_PMAP_SPEC(dynamic_edge_property_t) +CGAL_FFG_DYNAMIC_PMAP_SPEC(dynamic_face_property_t) + +#undef CGAL_FFG_DYNAMIC_PMAP_SPEC + //specializations for indices template void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, - Hmap hmap, V2V v2v, H2H h2h, F2F f2f, Src_vpm sm_vpm, Tgt_vpm tm_vpm ) { typedef typename boost::graph_traits::vertex_descriptor sm_vertex_descriptor; typedef typename boost::graph_traits::vertex_descriptor tm_vertex_descriptor; - typedef typename boost::graph_traits::vertex_iterator tm_vertex_iterator; + typedef typename boost::graph_traits::halfedge_iterator tm_halfedge_iterator; typedef typename boost::graph_traits::face_descriptor sm_face_descriptor; typedef typename boost::graph_traits::face_descriptor tm_face_descriptor; @@ -57,10 +55,14 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, typename Kernel_traits::value_type>::type > conv; + typedef CGAL::dynamic_halfedge_property_t Dyn_h_tag; + typename boost::property_map::const_type hs_to_ht = get(Dyn_h_tag(), sm); + std::vector tm_border_halfedges; std::vector sm_border_halfedges; - tm_face_descriptor tm_null_face = boost::graph_traits::null_face(); + const tm_face_descriptor tm_null_face = boost::graph_traits::null_face(); + const tm_vertex_descriptor tm_null_vertex = boost::graph_traits::null_vertex(); reserve(tm, static_cast::vertices_size_type>(vertices(sm).size()), static_cast::edges_size_type>(edges(sm).size()), @@ -77,8 +79,8 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, set_next( tm_h, tm_h, tm ); set_next( tm_h_opp, tm_h_opp, tm ); - put(hmap, sm_h, tm_h); - put(hmap, sm_h_opp, tm_h_opp); + put(hs_to_ht, sm_h, tm_h); + put(hs_to_ht, sm_h_opp, tm_h_opp); *h2h++=std::make_pair(sm_h, tm_h); *h2h++=std::make_pair(sm_h_opp, tm_h_opp); @@ -106,6 +108,8 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, set_target(tm_h, tm_h_tgt, tm); put(tm_vpm, tm_h_tgt, conv(get(sm_vpm, sm_h_tgt))); } + else + set_target(tm_h, tm_null_vertex, tm); if ( halfedge(sm_h_src,sm)==sm_h_opp ) { tm_vertex_descriptor tm_h_src = add_vertex(tm); @@ -114,6 +118,8 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, set_target(tm_h_opp, tm_h_src, tm); put(tm_vpm, tm_h_src, conv(get(sm_vpm, sm_h_src))); } + else + set_target(tm_h_opp, tm_null_vertex, tm); } //create faces and connect halfedges for(sm_face_descriptor sm_f : faces(sm)) @@ -122,13 +128,13 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, *f2f++=std::make_pair(sm_f, tm_f); sm_halfedge_descriptor sm_h_i=halfedge(sm_f, sm); - tm_halfedge_descriptor tm_h_prev = get(hmap, prev(sm_h_i, sm)); + tm_halfedge_descriptor tm_h_prev = get(hs_to_ht, prev(sm_h_i, sm)); set_halfedge(tm_f, tm_h_prev, tm); CGAL_precondition(*halfedges_around_face(sm_h_i, sm).first == sm_h_i); for(sm_halfedge_descriptor sm_h : halfedges_around_face(sm_h_i, sm)) { - tm_halfedge_descriptor tm_h = get(hmap, sm_h); + tm_halfedge_descriptor tm_h = get(hs_to_ht, sm_h); set_next(tm_h_prev, tm_h, tm); set_face(tm_h, tm_f, tm); tm_h_prev=tm_h; @@ -150,16 +156,14 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, halfedges_around_face(next(sm_border_halfedges[i], sm), sm)) { CGAL_assertion(next(tm_h_prev, tm) == tm_h_prev); - tm_h = get(hmap, sm_h); + tm_h = get(hs_to_ht, sm_h); set_next(tm_h_prev, tm_h, tm); tm_h_prev=tm_h; } } // update halfedge vertex of all but the vertex halfedge - for(tm_vertex_iterator vit = vertices(tm).first; - vit != vertices(tm).second; ++vit) + for(tm_vertex_descriptor v : vertices(tm)) { - tm_vertex_descriptor v = *vit; tm_halfedge_descriptor h = halfedge(v, tm); tm_halfedge_descriptor next_around_vertex=h; do{ @@ -167,47 +171,36 @@ void copy_face_graph_impl(const SourceMesh& sm, TargetMesh& tm, set_target(next_around_vertex, v, tm); }while(h != next_around_vertex); } + + // detect if there are some non-manifold umbrellas and fix missing halfedge target pointers + for (tm_halfedge_iterator it=halfedges(tm).first; it!=halfedges(tm).second; ++it) + { + if (target(*it, tm) == tm_null_vertex) + { + // create and fill a map from target halfedge to source halfedge + typedef CGAL::dynamic_halfedge_property_t Dyn_th_tag; + typename boost::property_map::type ht_to_hs = get(Dyn_th_tag(), tm); + for (sm_halfedge_descriptor hs : halfedges(sm)) + put(ht_to_hs, get(hs_to_ht, hs), hs); + + for(; it!=halfedges(tm).second; ++it) + { + if (target(*it, tm) == tm_null_vertex) + { + // we recover tm_v using the halfedge associated to the target vertex of + // the halfedge in sm corresponding to *it. This is working because we + // set the vertex halfedge pointer to the "same" halfedges. + tm_vertex_descriptor tm_v = + target( get(hs_to_ht, halfedge(target(get(ht_to_hs, *it), sm), sm)), tm); + for(tm_halfedge_descriptor ht : halfedges_around_target(*it, tm)) + set_target(ht, tm_v, tm); + } + } + break; + } + } } -template -void copy_face_graph(const SourceMesh& sm, TargetMesh& tm, - Tag_false, - V2V v2v, H2H h2h, F2F f2f, - Src_vpm sm_vpm, Tgt_vpm tm_vpm ) -{ - typedef typename boost::graph_traits::halfedge_descriptor sm_halfedge_descriptor; - typedef typename boost::graph_traits::halfedge_descriptor tm_halfedge_descriptor; - - boost::unordered_map hash_map(num_halfedges(sm)); - copy_face_graph_impl(sm, tm, - boost::make_assoc_property_map(hash_map), - v2v, h2h, f2f, - sm_vpm, tm_vpm); -} - -template -void copy_face_graph(const SourceMesh& sm, TargetMesh& tm, - Tag_true, - V2V v2v, H2H h2h, F2F f2f, - Src_vpm sm_vpm, Tgt_vpm tm_vpm ) -{ - typedef typename boost::graph_traits::halfedge_descriptor tm_halfedge_descriptor; - std::vector hedges(num_halfedges(sm)); - - copy_face_graph_impl(sm, tm, - bind_property_maps(get_initialized_halfedge_index_map(sm), - make_property_map(hedges)), - v2v, h2h, f2f, - sm_vpm, tm_vpm); -} - - - } // end of namespace internal namespace impl { @@ -329,8 +322,7 @@ void copy_face_graph(const SourceMesh& sm, TargetMesh& tm, using parameters::choose_parameter; using parameters::get_parameter; - internal::copy_face_graph(sm, tm, - CGAL::graph_has_property(), + internal::copy_face_graph_impl(sm, tm, choose_parameter(get_parameter(np1, internal_np::vertex_to_vertex_output_iterator), impl::make_functor(get_parameter(np1, internal_np::vertex_to_vertex_map))), choose_parameter(get_parameter(np1, internal_np::halfedge_to_halfedge_output_iterator), @@ -357,7 +349,7 @@ void copy_face_graph(const SourceMesh& sm, TargetMesh& tm, copy_face_graph(sm, tm, np, parameters::all_default()); } -#if !defined(DOXYGEN_RUNNING) +#if !defined(DOXYGEN_RUNNING) && !defined(CGAL_NO_DEPRECATED_CODE) template @@ -365,10 +357,9 @@ void copy_face_graph(const SourceMesh& sm, TargetMesh& tm, V2V v2v, H2H h2h, F2F f2f, Src_vpm sm_vpm, Tgt_vpm tm_vpm ) { - internal::copy_face_graph(sm, tm, - CGAL::graph_has_property(), - v2v, h2h, f2f, - sm_vpm, tm_vpm); + internal::copy_face_graph_impl(sm, tm, + v2v, h2h, f2f, + sm_vpm, tm_vpm); } diff --git a/BGL/test/BGL/graph_concept_Dual.cpp b/BGL/test/BGL/graph_concept_Dual.cpp index 5998741e3a3..cc88b547231 100644 --- a/BGL/test/BGL/graph_concept_Dual.cpp +++ b/BGL/test/BGL/graph_concept_Dual.cpp @@ -37,8 +37,8 @@ void concept_check_dual() { Graph, face_descriptor, boost::face_index_t> >(); // edge properties should be forwarded - boost::function_requires< boost::concepts::ReadablePropertyGraph< - Graph, edge_descriptor, boost::edge_weight_t> >(); + //boost::function_requires< boost::concepts::ReadablePropertyGraph< + // Graph, edge_descriptor, boost::edge_weight_t> >(); // boost::function_requires< boost::concepts::PropertyGraph< // Graph, halfedge_descriptor, CGAL::halfedge_index_t> >(); diff --git a/BGL/test/BGL/test_Euler_operations.cpp b/BGL/test/BGL/test_Euler_operations.cpp index f1b7b2fe3be..0711cf379ed 100644 --- a/BGL/test/BGL/test_Euler_operations.cpp +++ b/BGL/test/BGL/test_Euler_operations.cpp @@ -2,8 +2,38 @@ #include "test_Prefix.h" #include #include + #include #include +#include + +template +void +test_copy_face_graph_nm_umbrella() +{ + CGAL_GRAPH_TRAITS_MEMBERS(T); + + T g; + Kernel::Point_3 p; + + CGAL::make_tetrahedron(p, p, p, p, g); + CGAL::make_tetrahedron(p, p, p, p, g); + + std::vector verts(vertices(g).begin(), vertices(g).end()); + + //merge verts[0] and verts[4] + for (halfedge_descriptor h : CGAL::halfedges_around_target(verts[4], g)) + set_target(h, verts[0], g); + remove_vertex(verts[4], g); + + T g_copy; + CGAL::copy_face_graph(g, g_copy); + + for (halfedge_descriptor h : halfedges(g_copy)) + { + assert( target(h, g_copy) != Traits::null_vertex() ); + } +} template void @@ -588,6 +618,7 @@ template void test_Euler_operations() { + test_copy_face_graph_nm_umbrella(); join_face_test(); add_vertex_and_face_to_border_test(); add_face_to_border_test(); diff --git a/Documentation/doc/Documentation/License.txt b/Documentation/doc/Documentation/License.txt index fddf4a1bd8f..231dea4f6c2 100644 --- a/Documentation/doc/Documentation/License.txt +++ b/Documentation/doc/Documentation/License.txt @@ -14,34 +14,34 @@ to do whatever they want with the software. Using the software means to accept the license, which has the status of a contract between the user and the owner of the \cgal software. -\section licensesGPL GPL +\section licensesGPL GNU GPL -The \sc{Gpl} is an Open Source license that, if you distribute your software -based on \sc{Gpl}ed \cgal data structures, obliges you to distribute the -source code of your software under the \sc{Gpl}. +The GNU GPL is an Open Source license that, if you distribute your software +based on GPLed \cgal data structures, obliges you to distribute the +source code of your software under the GPL. The exact license terms can be found at the Free Software Foundation web site: http://www.gnu.org/copyleft/gpl.html. -\section licensesLGPL LGPL +\section licensesLGPL GNU LGPL -The \sc{Lgpl} is an Open Source license that obliges you to distribute +The GNU LGPL is an Open Source license that obliges you to distribute modifications you make on \cgal software accessible to the users. -In contrast to the \sc{Gpl}, there is no obligation to make the source -code of software you build on top of \sc{Lgpl}ed \cgal data structures. +In contrast to the GPL, there is no obligation to make the source +code of software you build on top of LGPLed \cgal data structures. The exact license terms can be found at the Free Software Foundation web site: http://www.gnu.org/copyleft/lesser.html. \section licensesRationale Rationale of the License Choice -We have chosen the \sc{Gpl} and the \sc{Lgpl} as they are well-known +We have chosen the GPL and the LGPL as they are well-known and well-understood open source licenses. The former restricts commercial use, and the latter allows to promote software as de facto standard so that people can build new higher level data structures on top. Therefore, the packages forming a foundation layer are distributed under -the \sc{Lgpl}, and the higher level packages under the \sc{Gpl}. +the LGPL, and the higher level packages under the GPL. The package overview states for each package under which license it is distributed. \section licensesCommercial Commercial Licenses @@ -57,7 +57,7 @@ as well as in evolutive maintenance. Users who have a commercial license for specific packages can check that they do not accidentally use packages for which they do not have a commercial license. The same holds for users who want to be sure that they only -use packages of \cgal released under the \sc{Lgpl}. +use packages of \cgal released under the LGPL. To enable checking, users have to define one of the following macros: diff --git a/Documentation/doc/scripts/html_output_post_processing.py b/Documentation/doc/scripts/html_output_post_processing.py index 30d59dbc772..f07bd3d2ced 100755 --- a/Documentation/doc/scripts/html_output_post_processing.py +++ b/Documentation/doc/scripts/html_output_post_processing.py @@ -355,7 +355,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') class_and_struct_files=list(package_glob('./*/class*.html')) class_and_struct_files.extend(package_glob('./*/struct*.html')) for fn in class_and_struct_files: - re_replace_first_in_file(r'

Inherits\s*(.*)

', r'

Inherits from

\1

', fn) + re_replace_first_in_file(r'

Inherits\s*(.*)

', r'

Inherits from

\1

', fn) # remove class name in Definition section if there is no default template # parameter documented diff --git a/HalfedgeDS/include/CGAL/boost/graph/graph_traits_HalfedgeDS_default.h b/HalfedgeDS/include/CGAL/boost/graph/graph_traits_HalfedgeDS_default.h index ccac7b707f0..ecafa701d1d 100644 --- a/HalfedgeDS/include/CGAL/boost/graph/graph_traits_HalfedgeDS_default.h +++ b/HalfedgeDS/include/CGAL/boost/graph/graph_traits_HalfedgeDS_default.h @@ -475,25 +475,19 @@ void reserve(HalfedgeDS_default& p, }// namespace CGAL namespace boost { -// property_map dispatcher into Polyhedron -template -struct property_map, Tag> -{ - typedef typename CGAL::HDS_property_map:: - template bind_ map_gen; - typedef typename map_gen::type type; - typedef typename map_gen::const_type const_type; +#define CGAL_PM_SPECIALIZATION(TAG) \ +template \ +struct property_map, TAG> \ +{\ + typedef typename CGAL::HDS_property_map:: \ + template bind_ map_gen; \ + typedef typename map_gen::type type; \ + typedef typename map_gen::const_type const_type; \ }; -// property_map dispatcher into const Polyhedron -template -struct property_map, Tag> -{ - typedef typename CGAL::HDS_property_map:: - template bind_ map_gen; - typedef typename map_gen::type type; - typedef typename map_gen::const_type const_type; -}; +CGAL_PM_SPECIALIZATION(vertex_point_t) + +#undef CGAL_PM_SPECIALIZATION } // namespace boost diff --git a/Kernel_23/include/CGAL/Kernel/function_objects.h b/Kernel_23/include/CGAL/Kernel/function_objects.h index 48ea406cd52..cd335df94fc 100644 --- a/Kernel_23/include/CGAL/Kernel/function_objects.h +++ b/Kernel_23/include/CGAL/Kernel/function_objects.h @@ -3333,8 +3333,7 @@ namespace CommonKernelFunctors { CGAL_kernel_assertion_msg(bool(optional) == true, "the segment does not intersect the supporting" " plane"); - using boost::get; - const Point_3* p = get(&*optional); + const Point_3* p = boost::get(&*optional); CGAL_kernel_assertion_msg(p != 0, "the segment intersection with the plane is " "not a point"); diff --git a/Linear_cell_complex/include/CGAL/boost/graph/properties_Linear_cell_complex_for_combinatorial_map.h b/Linear_cell_complex/include/CGAL/boost/graph/properties_Linear_cell_complex_for_combinatorial_map.h index ec796d51725..ff980a8c53e 100644 --- a/Linear_cell_complex/include/CGAL/boost/graph/properties_Linear_cell_complex_for_combinatorial_map.h +++ b/Linear_cell_complex/include/CGAL/boost/graph/properties_Linear_cell_complex_for_combinatorial_map.h @@ -17,6 +17,7 @@ #include #include #include +#include #define CGAL_LCC_ARGS unsigned int d_, unsigned int ambient_dim, \ @@ -402,6 +403,76 @@ struct property_map } // namespace boost +// dynamic property map ambiguity resolution +#define CGAL_LCC_DYNAMIC_PMAP_SPEC(TAG, DESC) \ +namespace boost { \ +template \ + class CMap, \ + class Storage_,\ + class T>\ +struct property_map< \ + CGAL::Linear_cell_complex_for_combinatorial_map,\ + TAG > \ +{\ + typedef CGAL::Linear_cell_complex_for_combinatorial_map\ + LCC;\ + typedef typename boost::graph_traits::DESC DESC;\ + typedef CGAL::internal::Dynamic_property_map type;\ + typedef type const_type;\ +};\ +} \ +\ +namespace CGAL { \ +template \ + class CMap, \ + class Storage_,\ + class T> \ +typename boost::property_map< \ + Linear_cell_complex_for_combinatorial_map, \ + TAG >::const_type \ +get(TAG, const Linear_cell_complex_for_combinatorial_map&) \ +{ \ + typedef Linear_cell_complex_for_combinatorial_map LCC;\ + typedef typename boost::graph_traits::DESC DESC; \ + return internal::Dynamic_property_map();\ +} \ +\ +template \ + class CMap, \ + class Storage_,\ + class T> \ +typename boost::property_map< \ + Linear_cell_complex_for_combinatorial_map, \ + TAG >::type \ +get(TAG, Linear_cell_complex_for_combinatorial_map&) \ +{ \ + typedef Linear_cell_complex_for_combinatorial_map LCC;\ + typedef typename boost::graph_traits::DESC DESC; \ + return internal::Dynamic_property_map();\ +} \ +} + +CGAL_LCC_DYNAMIC_PMAP_SPEC(CGAL::dynamic_vertex_property_t, vertex_descriptor) +CGAL_LCC_DYNAMIC_PMAP_SPEC(CGAL::dynamic_halfedge_property_t, halfedge_descriptor) +CGAL_LCC_DYNAMIC_PMAP_SPEC(CGAL::dynamic_edge_property_t, edge_descriptor) +CGAL_LCC_DYNAMIC_PMAP_SPEC(CGAL::dynamic_face_property_t, face_descriptor) + +#undef CGAL_LCC_DYNAMIC_PMAP_SPEC + + +#undef CGAL_NAME_LCC_ARGS #undef CGAL_LCC_ARGS #undef CGAL_LCC_TYPE diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/extrude.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/extrude.h index 681adab5578..3fb47d680b8 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/extrude.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/extrude.h @@ -184,9 +184,10 @@ void extrude_mesh(const InputMesh& input, std::vector > bottom_v2v; std::vector > bottom_h2h; - copy_face_graph(input, output, std::back_inserter(bottom_v2v), - std::back_inserter(bottom_h2h), Emptyset_iterator(), - input_vpm, output_vpm); + copy_face_graph(input, output, parameters::vertex_point_map(input_vpm) + .vertex_to_vertex_output_iterator(std::back_inserter(bottom_v2v)) + .halfedge_to_halfedge_output_iterator(std::back_inserter(bottom_h2h)), + parameters::vertex_point_map(output_vpm)); // create the offset for the other side for(std::size_t i = 0; i< bottom_v2v.size(); ++i) @@ -198,9 +199,11 @@ void extrude_mesh(const InputMesh& input, // collect border halfedges for the creation of the triangle strip std::vector > top_v2v; std::vector > top_h2h; - copy_face_graph(input, output, std::inserter(top_v2v, top_v2v.end()), - std::inserter(top_h2h, top_h2h.end()), Emptyset_iterator(), - input_vpm, output_vpm); + copy_face_graph(input, output, parameters::vertex_point_map(input_vpm) + .vertex_to_vertex_output_iterator(std::inserter(top_v2v, top_v2v.end())) + .halfedge_to_halfedge_output_iterator(std::inserter(top_h2h, top_h2h.end())), + parameters::vertex_point_map(output_vpm)); + for(std::size_t i = 0; i< top_v2v.size(); ++i) { top(top_v2v[i].first, top_v2v[i].second); diff --git a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_faces_test.cpp b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_faces_test.cpp index 33495e08415..bbc980a25dd 100644 --- a/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_faces_test.cpp +++ b/Polygon_mesh_processing/test/Polygon_mesh_processing/triangulate_faces_test.cpp @@ -230,10 +230,8 @@ test_dual_with_various_faces() // copy dual to a sm Surface_mesh sm_dual; CGAL::copy_face_graph(dual, sm_dual, - CGAL::Emptyset_iterator(), - CGAL::Emptyset_iterator(), - CGAL::Emptyset_iterator(), - Dual_vpm(mesh, vpmap)); + CGAL::parameters::vertex_point_map( + Dual_vpm(mesh, vpmap))); for(typename boost::graph_traits::face_descriptor fit : faces(sm_dual)) { diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 38fa9d16ea2..c1491863fd1 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1574,7 +1574,7 @@ void MainWindow::showSceneContextMenu(const QPoint& p) { } else if(action->text() == QString("Line Width")) { - menu_actions["line width"] = action->menu()->actions().last(); + menu_actions["Line width"] = action->menu()->actions().last(); } } @@ -1719,7 +1719,7 @@ void MainWindow::showSceneContextMenu(const QPoint& p) { slider->setValue( qobject_cast( qobject_cast - (menu_actions["line width"])->defaultWidget() + (menu_actions["Line width"])->defaultWidget() )->value()); slider->setOrientation(Qt::Horizontal); sliderAction->setDefaultWidget(slider); diff --git a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_filtered_traits_2.h b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_filtered_traits_2.h index d7bf6457dc6..831f12a53ac 100644 --- a/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_filtered_traits_2.h +++ b/Segment_Delaunay_graph_2/include/CGAL/Segment_Delaunay_graph_filtered_traits_2.h @@ -27,12 +27,7 @@ #include // includes for the default parameters of the filtered traits -#ifdef CGAL_USE_GMP -#include -#else -#include -#include -#endif +#include #include #include @@ -56,11 +51,7 @@ namespace CGAL { // this traits class does support intersecting segments template, -#else - class EK = Simple_cartesian< Quotient >, -#endif + class EK = Simple_cartesian< internal::Exact_field_selector::Type >, class EK_MTag = Field_tag, class FK = Simple_cartesian< Interval_nt >, class FK_MTag = Field_with_sqrt_tag, diff --git a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h index c61d82f8dea..e1cb16e1e3a 100644 --- a/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h +++ b/Segment_Delaunay_graph_Linf_2/include/CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h @@ -24,12 +24,8 @@ #include // includes for the default parameters of the filtered traits -#ifdef CGAL_USE_GMP -#include -#else -#include -#include -#endif +#include + #include #include @@ -53,11 +49,7 @@ namespace CGAL { // this traits class does support intersecting segments template, -#else - class EK = Simple_cartesian< Quotient >, -#endif + class EK = Simple_cartesian< internal::Exact_field_selector::Type >, class EK_MTag = Field_tag, class FK = Simple_cartesian< Interval_nt >, class FK_MTag = Field_with_sqrt_tag, diff --git a/Triangulation_2/include/CGAL/boost/graph/internal/properties_2D_triangulation.h b/Triangulation_2/include/CGAL/boost/graph/internal/properties_2D_triangulation.h index 16895ba78a8..27b68b9ee38 100644 --- a/Triangulation_2/include/CGAL/boost/graph/internal/properties_2D_triangulation.h +++ b/Triangulation_2/include/CGAL/boost/graph/internal/properties_2D_triangulation.h @@ -235,23 +235,31 @@ struct T2_property_map // overloads and specializations in the boost namespace namespace boost { -// g++ 'enumeral_type' in template unification not implemented workaround -template -struct property_map -{ - typedef typename CGAL::internal::T2_property_map map_gen; - typedef typename map_gen::type type; - typedef typename map_gen::const_type const_type; +#define CGAL_PM_SPECIALIZATION(TAG) \ +template \ +struct property_map \ +{ \ + typedef typename CGAL::internal::T2_property_map map_gen; \ + typedef typename map_gen::type type; \ + typedef typename map_gen::const_type const_type; \ +}; \ +\ +template \ +struct property_map \ +{ \ + typedef typename CGAL::internal::T2_property_map map_gen; \ + typedef typename map_gen::type type; \ + typedef typename map_gen::const_type const_type; \ }; -// see struct property_map in Polyehdron for an explanation -template -struct property_map -{ - typedef typename CGAL::internal::T2_property_map map_gen; - typedef typename map_gen::type type; - typedef typename map_gen::const_type const_type; -}; +CGAL_PM_SPECIALIZATION(vertex_point_t) +CGAL_PM_SPECIALIZATION(edge_weight_t) +CGAL_PM_SPECIALIZATION(vertex_index_t) +CGAL_PM_SPECIALIZATION(halfedge_index_t) +CGAL_PM_SPECIALIZATION(edge_index_t) +CGAL_PM_SPECIALIZATION(face_index_t) + +#undef CGAL_PM_SPECIALIZATION } // end namespace boost diff --git a/Triangulation_2/include/CGAL/boost/graph/properties_Triangulation_data_structure_2.h b/Triangulation_2/include/CGAL/boost/graph/properties_Triangulation_data_structure_2.h index c8d01f3f239..d5583e000b8 100644 --- a/Triangulation_2/include/CGAL/boost/graph/properties_Triangulation_data_structure_2.h +++ b/Triangulation_2/include/CGAL/boost/graph/properties_Triangulation_data_structure_2.h @@ -284,23 +284,31 @@ get(boost::face_index_t, const Triangulation_data_structure_2&) namespace boost { -// g++ 'enumeral_type' in template unification not implemented workaround -template -struct property_map, Tag> -{ - typedef typename CGAL::internal::TDS2_property_map map_gen; - typedef typename map_gen::type type; - typedef typename map_gen::const_type const_type; +#define CGAL_PM_SPECIALIZATION(TAG) \ +template \ +struct property_map, TAG> \ +{ \ + typedef typename CGAL::internal::TDS2_property_map map_gen; \ + typedef typename map_gen::type type; \ + typedef typename map_gen::const_type const_type; \ +}; \ +\ +template \ +struct property_map, TAG> \ +{ \ + typedef typename CGAL::internal::TDS2_property_map map_gen; \ + typedef typename map_gen::type type; \ + typedef typename map_gen::const_type const_type; \ }; -// see struct property_map in Polyehdron for an explanation -template -struct property_map, Tag> -{ - typedef typename CGAL::internal::TDS2_property_map map_gen; - typedef typename map_gen::type type; - typedef typename map_gen::const_type const_type; -}; +CGAL_PM_SPECIALIZATION(vertex_point_t) +CGAL_PM_SPECIALIZATION(edge_weight_t) +CGAL_PM_SPECIALIZATION(vertex_index_t) +CGAL_PM_SPECIALIZATION(halfedge_index_t) +CGAL_PM_SPECIALIZATION(edge_index_t) +CGAL_PM_SPECIALIZATION(face_index_t) + +#undef CGAL_PM_SPECIALIZATION } // namespace boost