1 // Copyright (c) 2020 GeometryFactory Sarl (France). 2 // All rights reserved. 3 // 4 // This file is part of CGAL (www.cgal.org). 5 // 6 // $URL: https://github.com/CGAL/cgal/blob/v5.3/Arrangement_on_surface_2/demo/Arrangement_on_surface_2/ArrangementTypesUtils.h $ 7 // $Id: ArrangementTypesUtils.h ae46209 2020-10-06T23:41:30+01:00 Ahmed Essam 8 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial 9 // 10 // Author(s): Ahmed Essam <theartful.ae@gmail.com> 11 12 #ifndef ARRANGEMENT_DEMO_TYPE_UTILS 13 #define ARRANGEMENT_DEMO_TYPE_UTILS 14 15 16 #include "ForwardDeclarations.h" 17 #include <CGAL/assertions.h> 18 19 namespace demo_types 20 { 21 22 // avoid including "ArrangementTypes.h" at all costs for better compilation 23 // speed 24 struct DemoTypes; 25 26 enum class TraitsType : int 27 { 28 SEGMENT_TRAITS, 29 POLYLINE_TRAITS, 30 LINEAR_TRAITS, 31 #ifdef CGAL_USE_CORE 32 CONIC_TRAITS, 33 ALGEBRAIC_TRAITS, 34 BEZIER_TRAITS, 35 RATIONAL_FUNCTION_TRAITS, 36 #endif 37 NONE, 38 }; 39 40 template <class T> 41 struct TypeHolder 42 { 43 using type = T; 44 }; 45 46 namespace details 47 { 48 template <typename T> 49 struct EnumFromTraits 50 { 51 static constexpr TraitsType value = TraitsType::NONE; 52 }; 53 template <typename Kernel_> 54 struct EnumFromTraits<CGAL::Arr_segment_traits_2<Kernel_>> 55 { 56 static constexpr TraitsType value = TraitsType::SEGMENT_TRAITS; 57 }; 58 template <typename SegmentTraits_2_> 59 struct EnumFromTraits<CGAL::Arr_polyline_traits_2<SegmentTraits_2_>> 60 { 61 static constexpr TraitsType value = TraitsType::POLYLINE_TRAITS; 62 }; 63 template <typename Kernel_> 64 struct EnumFromTraits<CGAL::Arr_linear_traits_2<Kernel_>> 65 { 66 static constexpr TraitsType value = TraitsType::LINEAR_TRAITS; 67 }; 68 #ifdef CGAL_USE_CORE 69 template <class Rat_kernel_, class Alg_kernel_, class Nt_traits_> 70 struct EnumFromTraits< 71 CGAL::Arr_conic_traits_2<Rat_kernel_, Alg_kernel_, Nt_traits_>> 72 { 73 static constexpr TraitsType value = TraitsType::CONIC_TRAITS; 74 }; 75 template < 76 typename RatKernel_, typename AlgKernel_, typename NtTraits_, 77 typename BoundingTraits_> 78 struct EnumFromTraits<CGAL::Arr_Bezier_curve_traits_2< 79 RatKernel_, AlgKernel_, NtTraits_, BoundingTraits_>> 80 { 81 static constexpr TraitsType value = TraitsType::BEZIER_TRAITS; 82 }; 83 template <typename Coefficient_> 84 struct EnumFromTraits<CGAL::Arr_algebraic_segment_traits_2<Coefficient_>> 85 { 86 static constexpr TraitsType value = TraitsType::ALGEBRAIC_TRAITS; 87 }; 88 template <typename AlgebraicKernel_d_1_> 89 struct EnumFromTraits< 90 CGAL::Arr_rational_function_traits_2<AlgebraicKernel_d_1_>> 91 { 92 static constexpr TraitsType value = TraitsType::RATIONAL_FUNCTION_TRAITS; 93 }; 94 #endif // CGAL_USE_CORE 95 } 96 97 template <typename T> 98 static constexpr TraitsType enumFromArrType() 99 { 100 return details::EnumFromTraits<typename T::Geometry_traits_2>::value; 101 } 102 103 template <class Lambda, class Types=DemoTypes> 104 static void visitArrangementType(TraitsType tt, Lambda&& lambda) 105 { 106 switch (tt) 107 { 108 case TraitsType::SEGMENT_TRAITS: 109 lambda(TypeHolder<typename Types::Seg_arr>{}); 110 break; 111 case TraitsType::POLYLINE_TRAITS: 112 lambda(TypeHolder<typename Types::Pol_arr>{}); 113 break; 114 case TraitsType::LINEAR_TRAITS: 115 lambda(TypeHolder<typename Types::Lin_arr>{}); 116 break; 117 #ifdef CGAL_USE_CORE 118 case TraitsType::CONIC_TRAITS: 119 lambda(TypeHolder<typename Types::Conic_arr>{}); 120 break; 121 case TraitsType::ALGEBRAIC_TRAITS: 122 lambda(TypeHolder<typename Types::Alg_seg_arr>{}); 123 break; 124 case TraitsType::BEZIER_TRAITS: 125 lambda(TypeHolder<typename Types::Bezier_arr>{}); 126 break; 127 case TraitsType::RATIONAL_FUNCTION_TRAITS: 128 lambda(TypeHolder<typename Types::Rational_arr>{}); 129 break; 130 #endif 131 default: 132 CGAL_error(); 133 } 134 } 135 136 template <class Lambda, class Types=DemoTypes> 137 static void forEachArrangementType(Lambda&& lambda) 138 { 139 lambda(TypeHolder<typename Types::Seg_arr>{}); 140 lambda(TypeHolder<typename Types::Pol_arr>{}); 141 lambda(TypeHolder<typename Types::Lin_arr>{}); 142 #ifdef CGAL_USE_CORE 143 lambda(TypeHolder<typename Types::Conic_arr>{}); 144 lambda(TypeHolder<typename Types::Alg_seg_arr>{}); 145 lambda(TypeHolder<typename Types::Bezier_arr>{}); 146 lambda(TypeHolder<typename Types::Rational_arr>{}); 147 #endif 148 } 149 } 150 151 #endif 152