From 1981fdd4f0e4c86118f72fdf98410eaecbe3bfea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Mon, 10 Jan 2022 14:51:47 +0100 Subject: [PATCH] Factorize implementation of traversal functors for multiple datum trees --- .../internal/triangle_datum_covering.h | 182 +++++------------- 1 file changed, 43 insertions(+), 139 deletions(-) diff --git a/AABB_tree/include/CGAL/AABB_tree/internal/triangle_datum_covering.h b/AABB_tree/include/CGAL/AABB_tree/internal/triangle_datum_covering.h index 6a17af20a47..6138b0825a4 100644 --- a/AABB_tree/include/CGAL/AABB_tree/internal/triangle_datum_covering.h +++ b/AABB_tree/include/CGAL/AABB_tree/internal/triangle_datum_covering.h @@ -72,157 +72,61 @@ private: // Same as the standard traversal traits, but for multiple primitives per datum, // such that the final operation on the datum is only performed once. +template +struct Covered_traversal_traits + : BaseTraversalTraits +{ + using Base = BaseTraversalTraits; + using Primitive = typename AABBTraits::Primitive; + + std::unordered_set visited_data; + +public: + template + Covered_traversal_traits(Args&&... args) : Base(std::forward(args)...) { } + + template + void intersection(const Query& query, const Primitive& primitive) + { + // check a datum only once + auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); + if(!is_insert_successful.second) + return; + + return Base::intersection(query, primitive); + } +}; + template struct Covered_tree_traversal_traits { - // ----------------------------------------------------------------------------------------------- - class Projection_traits - : public CGAL::internal::AABB_tree::Projection_traits - { - using Base = CGAL::internal::AABB_tree::Projection_traits; - using Point = typename AABBTraits::Point_3; - using Primitive = typename AABBTraits::Primitive; + using Base_projection_traits = CGAL::internal::AABB_tree::Projection_traits; + using Projection_traits = Covered_traversal_traits; - std::unordered_set visited_data; - -public: - Projection_traits(const Point& hint, - const typename Primitive::Id& hint_primitive, - const AABBTraits& traits) - : Base(hint, hint_primitive, traits) - { } - - void intersection(const Point& query, const Primitive& primitive) - { - // check a datum only once - auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); - if(!is_insert_successful.second) - return; - - return Base::intersection(query, primitive); - } - }; - - // ----------------------------------------------------------------------------------------------- template - class Do_intersect_traits - : public CGAL::internal::AABB_tree::Do_intersect_traits - { - using Base = CGAL::internal::AABB_tree::Do_intersect_traits; - using Primitive = typename AABBTraits::Primitive; - - std::unordered_set visited_data; - -public: - Do_intersect_traits(const AABBTraits& traits) : Base(traits) { } - - void intersection(const Query& query, const Primitive& primitive) - { - // check a datum only once - auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); - if(!is_insert_successful.second) - return; - - return Base::intersection(query, primitive); - } - }; - - // ----------------------------------------------------------------------------------------------- + using Do_intersect_traits_base = CGAL::internal::AABB_tree::Do_intersect_traits; template - class First_intersection_traits - : public CGAL::internal::AABB_tree::First_intersection_traits - { - using Base = CGAL::internal::AABB_tree::First_intersection_traits; - using Primitive = typename AABBTraits::Primitive; + using Do_intersect_traits = Covered_traversal_traits >; - std::unordered_set visited_data; - -public: - First_intersection_traits(const AABBTraits& traits) : Base(traits) { } - - void intersection(const Query& query, const Primitive& primitive) - { - // check a datum only once - auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); - if(!is_insert_successful.second) - return; - - return Base::intersection(query, primitive); - } - }; - - // ----------------------------------------------------------------------------------------------- template - class First_primitive_traits - : public CGAL::internal::AABB_tree::First_primitive_traits - { - using Base = CGAL::internal::AABB_tree::First_primitive_traits; - using Primitive = typename AABBTraits::Primitive; + using First_intersection_traits_base = CGAL::internal::AABB_tree::First_intersection_traits; + template + using First_intersection_traits = Covered_traversal_traits >; - std::unordered_set visited_data; - -public: - First_primitive_traits(const AABBTraits& traits) : Base(traits) { } - - void intersection(const Query& query, const Primitive& primitive) - { - // check a datum only once - auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); - if(!is_insert_successful.second) - return; - - return Base::intersection(query, primitive); - } - }; - - // ----------------------------------------------------------------------------------------------- - template - class Listing_primitive_traits - : public CGAL::internal::AABB_tree::Listing_primitive_traits - { - using Base = CGAL::internal::AABB_tree::Listing_primitive_traits; - using Primitive = typename AABBTraits::Primitive; - - std::unordered_set visited_data; - - public: - template - Listing_primitive_traits(OutputIterator out, const AABBTraits& traits) : Base(out, traits) { } - - void intersection(const Query& query, const Primitive& primitive) - { - // check a datum only once - auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); - if(!is_insert_successful.second) - return; - - return Base::intersection(query, primitive); - } - }; + template + using First_primitive_traits_base = CGAL::internal::AABB_tree::First_primitive_traits; + template + using First_primitive_traits = Covered_traversal_traits >; template - class Listing_intersection_traits - : public CGAL::internal::AABB_tree::Listing_intersection_traits - { - using Base = CGAL::internal::AABB_tree::Listing_intersection_traits; - using Primitive = typename AABBTraits::Primitive; + using Listing_primitive_traits_base = CGAL::internal::AABB_tree::Listing_primitive_traits; + template + using Listing_primitive_traits = Covered_traversal_traits >; - std::unordered_set visited_data; - - public: - template - Listing_intersection_traits(OutputIterator out, const AABBTraits& traits) : Base(out, traits) { } - - void intersection(const Query& query, const Primitive& primitive) - { - // check a datum only once - auto is_insert_successful = visited_data.insert(primitive.id().second/*unique input face ID*/); - if(!is_insert_successful.second) - return; - - return Base::intersection(query, primitive); - } - }; + template + using Listing_intersection_traits_base = CGAL::internal::AABB_tree::Listing_intersection_traits; + template + using Listing_intersection_traits = Covered_traversal_traits >; }; // Dissociated from the class `AABB_covered_triangle_tree` for clarity