From 3f005bbbc4fff7cd43008c8929d5c11a3a16e634 Mon Sep 17 00:00:00 2001 From: Guillaume Damiand Date: Tue, 4 Sep 2018 16:04:20 +0200 Subject: [PATCH] Add a parameter to the undocumented copy method, that allows to keep an associative array between original and copied darts. --- .../include/CGAL/Combinatorial_map.h | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/Combinatorial_map/include/CGAL/Combinatorial_map.h b/Combinatorial_map/include/CGAL/Combinatorial_map.h index 4c2bb810685..341789472da 100644 --- a/Combinatorial_map/include/CGAL/Combinatorial_map.h +++ b/Combinatorial_map/include/CGAL/Combinatorial_map.h @@ -49,6 +49,7 @@ #include #include #include +#include #include #if defined( __INTEL_COMPILER ) @@ -216,7 +217,8 @@ namespace CGAL { typename PointConverter> void copy(const CMap2& amap, const Converters& converters, const DartInfoConverter& dartinfoconverter, - const PointConverter& pointconverter) + const PointConverter& pointconverter, + boost::unordered_map* dart_mapping=NULL) { this->clear(); @@ -237,27 +239,28 @@ namespace CGAL { init_dart(null_dart_handle, amap.get_marks(amap.null_dart_handle)); // Create an mapping between darts of the two maps (originals->copies). - // TODO: replace the std::map by a boost::unordered_map // (here we cannot use CGAL::Unique_hash_map because it does not provide // iterators... - std::map dartmap; - + boost::unordered_map local_dartmap; + if (dart_mapping==NULL) + { dart_mapping=&local_dartmap; } + for (typename CMap2::Dart_const_range::const_iterator it=amap.darts().begin(), itend=amap.darts().end(); it!=itend; ++it) { - dartmap[it]=mdarts.emplace(); - init_dart(dartmap[it], amap.get_marks(it)); + (*dart_mapping)[it]=mdarts.emplace(); + init_dart((*dart_mapping)[it], amap.get_marks(it)); internal::Copy_dart_info_functor::run - (amap, static_cast(*this), it, dartmap[it], + (amap, static_cast(*this), it, (*dart_mapping)[it], dartinfoconverter); } unsigned int min_dim=(dimension - ::iterator dartmap_iter, dartmap_iter_end=dartmap.end(); - for (dartmap_iter=dartmap.begin(); dartmap_iter!=dartmap_iter_end; + typename boost::unordered_map + ::iterator dartmap_iter, dartmap_iter_end=dart_mapping->end(); + for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end; ++dartmap_iter) { for (unsigned int i=0; i<=min_dim; i++) @@ -266,13 +269,13 @@ namespace CGAL { (dartmap_iter->first)<(amap.beta(dartmap_iter->first,i))) { basic_link_beta(dartmap_iter->second, - dartmap[amap.beta(dartmap_iter->first,i)], i); + (*dart_mapping)[amap.beta(dartmap_iter->first,i)], i); } } } /** Copy attributes */ - for (dartmap_iter=dartmap.begin(); dartmap_iter!=dartmap_iter_end; + for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end; ++dartmap_iter) { Helper::template Foreach_enabled_attributes @@ -287,28 +290,32 @@ namespace CGAL { } template - void copy(const CMap2& amap) + void copy(const CMap2& amap, + boost::unordered_map* dart_mapping=NULL) + { CGAL::cpp11::tuple<> converters; Default_converter_dart_info dartinfoconverter; Default_converter_cmap_0attributes_with_point pointconverter; - copy(amap, converters, dartinfoconverter, pointconverter); + copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); } template - void copy(const CMap2& amap, const Converters& converters) + void copy(const CMap2& amap, const Converters& converters, + boost::unordered_map* dart_mapping=NULL) { Default_converter_cmap_0attributes_with_point pointconverter; Default_converter_dart_info dartinfoconverter; - copy(amap, converters, dartinfoconverter, pointconverter); + copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); } template void copy(const CMap2& amap, const Converters& converters, - const DartInfoConverter& dartinfoconverter) + const DartInfoConverter& dartinfoconverter, + boost::unordered_map* dart_mapping=NULL) { Default_converter_cmap_0attributes_with_point pointconverter; - copy(amap, converters, dartinfoconverter, pointconverter); + copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping); } // Copy constructor from a map having exactly the same type.