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