From 9adf4385ff879626652323eab82fb91cab59db5a Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Wed, 9 Jun 2021 18:21:19 +0200 Subject: [PATCH 1/3] fast dynamic_cast in Lazy_kernel::Construct_point_3 --- Filtered_kernel/include/CGAL/Lazy_kernel.h | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 0e9bb380f6a..5c34f27c67f 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -413,12 +413,13 @@ public: int > LRint; - LR * lr = dynamic_cast(p.ptr()); - if(lr && (! lr->et)){ + auto&& t = typeid(*p.ptr()); + if(t.name() == typeid(LR).name()){ + LR * lr = static_cast(p.ptr()); return std::get<1>(lr->l); - } else { - LRint* lrint = dynamic_cast(p.ptr()); - if(lrint && (! lrint->et)){ + }else{ + if(t.name() == typeid(LRint).name()){ + LRint* lrint = static_cast(p.ptr()); return std::get<1>(lrint->l); } } @@ -465,16 +466,17 @@ public: int > LRint; - - LR * lr = dynamic_cast(p.ptr()); - if(lr && (! lr->et)){ + auto&& t = typeid(*p.ptr()); + if(t.name() == typeid(LR).name()){ + LR * lr = static_cast(p.ptr()); return std::get<1>(lr->l); }else{ - LRint* lrint = dynamic_cast(p.ptr()); - if(lrint && (! lrint->et)){ + if(t.name() == typeid(LRint).name()){ + LRint* lrint = static_cast(p.ptr()); return std::get<1>(lrint->l); } } + return BaseClass().construct_point_3_object()(p); } From 0f5bc1a8efef04fc9b27a9eda1dd4033e6b89c9b Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Fri, 11 Jun 2021 10:57:43 +0200 Subject: [PATCH 2/3] Fix and also replace dynamic cast in Compute_weight functors --- Filtered_kernel/include/CGAL/Lazy_kernel.h | 71 +++++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 5c34f27c67f..79b11054f6d 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -336,11 +336,32 @@ public: FT > LR; + typedef Lazy_rep_n LRint; - LR * lr = dynamic_cast(p.ptr()); - if(lr && (! lr->et)){ - return std::get<2>(lr->l); + + auto&& t = typeid(*p.ptr()); + if(t.name() == typeid(LR).name()){ + LR * lr = static_cast(p.ptr()); + if(lr->is_lazy()){ + return std::get<2>(lr->l); + } + }else{ + if(t.name() == typeid(LRint).name()){ + LRint* lrint = static_cast(p.ptr()); + if(lrint->is_lazy()){ + return std::get<2>(lrint->l); + } + } } + return BaseClass().compute_weight_2_object()(p); } @@ -366,11 +387,32 @@ public: FT > LR; + typedef Lazy_rep_n LRint; - LR * lr = dynamic_cast(p.ptr()); - if(lr && (! lr->et)){ - return std::get<2>(lr->l); + + auto&& t = typeid(*p.ptr()); + if(t.name() == typeid(LR).name()){ + LR * lr = static_cast(p.ptr()); + if(lr->is_lazy()){ + return std::get<2>(lr->l); + } + }else{ + if(t.name() == typeid(LRint).name()){ + LRint* lrint = static_cast(p.ptr()); + if(lrint->is_lazy()){ + return std::get<2>(lrint->l); + } + } } + return BaseClass().compute_weight_3_object()(p); } @@ -416,11 +458,15 @@ public: auto&& t = typeid(*p.ptr()); if(t.name() == typeid(LR).name()){ LR * lr = static_cast(p.ptr()); - return std::get<1>(lr->l); + if(lr->is_lazy()){ + return std::get<1>(lr->l); + } }else{ if(t.name() == typeid(LRint).name()){ LRint* lrint = static_cast(p.ptr()); - return std::get<1>(lrint->l); + if(lrint->is_lazy()){ + return std::get<1>(lrint->l); + } } } @@ -469,11 +515,15 @@ public: auto&& t = typeid(*p.ptr()); if(t.name() == typeid(LR).name()){ LR * lr = static_cast(p.ptr()); - return std::get<1>(lr->l); + if(lr->is_lazy()){ + return std::get<1>(lr->l); + } }else{ if(t.name() == typeid(LRint).name()){ LRint* lrint = static_cast(p.ptr()); - return std::get<1>(lrint->l); + if(lrint->is_lazy()){ + return std::get<1>(lrint->l); + } } } @@ -482,6 +532,7 @@ public: }; + struct Less_xyz_3 : public BaseClass::Less_xyz_3 { typedef typename Kernel_::Point_3 Point_3; From 32f5bf941833bd982f41ce9b83f4d0a5a609d8f2 Mon Sep 17 00:00:00 2001 From: Andreas Fabri Date: Mon, 14 Jun 2021 18:11:46 +0200 Subject: [PATCH 3/3] After Marc's review --- Filtered_kernel/include/CGAL/Lazy_kernel.h | 30 +++++++++++++--------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/Filtered_kernel/include/CGAL/Lazy_kernel.h b/Filtered_kernel/include/CGAL/Lazy_kernel.h index 79b11054f6d..b8e5c3562ca 100644 --- a/Filtered_kernel/include/CGAL/Lazy_kernel.h +++ b/Filtered_kernel/include/CGAL/Lazy_kernel.h @@ -346,15 +346,16 @@ public: int > LRint; + auto& obj = *p.ptr(); + const char* tn = typeid(obj).name(); - auto&& t = typeid(*p.ptr()); - if(t.name() == typeid(LR).name()){ + if(tn == typeid(LR).name()){ LR * lr = static_cast(p.ptr()); if(lr->is_lazy()){ return std::get<2>(lr->l); } }else{ - if(t.name() == typeid(LRint).name()){ + if(tn == typeid(LRint).name()){ LRint* lrint = static_cast(p.ptr()); if(lrint->is_lazy()){ return std::get<2>(lrint->l); @@ -397,15 +398,16 @@ public: int > LRint; + auto& obj = *p.ptr(); + const char* tn = typeid(obj).name(); - auto&& t = typeid(*p.ptr()); - if(t.name() == typeid(LR).name()){ + if(tn == typeid(LR).name()){ LR * lr = static_cast(p.ptr()); if(lr->is_lazy()){ return std::get<2>(lr->l); } }else{ - if(t.name() == typeid(LRint).name()){ + if(tn == typeid(LRint).name()){ LRint* lrint = static_cast(p.ptr()); if(lrint->is_lazy()){ return std::get<2>(lrint->l); @@ -455,14 +457,16 @@ public: int > LRint; - auto&& t = typeid(*p.ptr()); - if(t.name() == typeid(LR).name()){ + auto& obj = *p.ptr(); + const char* tn = typeid(obj).name(); + + if(tn == typeid(LR).name()){ LR * lr = static_cast(p.ptr()); if(lr->is_lazy()){ return std::get<1>(lr->l); } }else{ - if(t.name() == typeid(LRint).name()){ + if(tn == typeid(LRint).name()){ LRint* lrint = static_cast(p.ptr()); if(lrint->is_lazy()){ return std::get<1>(lrint->l); @@ -512,14 +516,16 @@ public: int > LRint; - auto&& t = typeid(*p.ptr()); - if(t.name() == typeid(LR).name()){ + auto& obj = *p.ptr(); + const char* tn = typeid(obj).name(); + + if(tn == typeid(LR).name()){ LR * lr = static_cast(p.ptr()); if(lr->is_lazy()){ return std::get<1>(lr->l); } }else{ - if(t.name() == typeid(LRint).name()){ + if(tn == typeid(LRint).name()){ LRint* lrint = static_cast(p.ptr()); if(lrint->is_lazy()){ return std::get<1>(lrint->l);