1 // Copyright (c) 1997-2013 INRIA Sophia-Antipolis (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/Periodic_2_triangulation_2/include/CGAL/Periodic_2_triangulation_traits_2.h $
7 // $Id: Periodic_2_triangulation_traits_2.h 254d60f 2019-10-19T15:23:19+02:00 Sébastien Loriot
8 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
9 //
10 // Author(s)     : Nico Kruithof <Nico@nghk.nl>,
11 //                 Mael Rouxel-Labbé
12 
13 #ifndef CGAL_PERIODIC_2_TRIANGULATION_TRAITS_2_H
14 #define CGAL_PERIODIC_2_TRIANGULATION_TRAITS_2_H
15 
16 #include <CGAL/license/Periodic_2_triangulation_2.h>
17 
18 #include <CGAL/internal/Periodic_2_construct_point_2.h>
19 #include <CGAL/internal/Functor_with_offset_points_adaptor_2.h>
20 #include <CGAL/Periodic_2_offset_2.h>
21 
22 #include <CGAL/internal/Has_boolean_tags.h>
23 #include <CGAL/triangulation_assertions.h>
24 
25 namespace CGAL {
26 
27 template <class K_,
28           class Off_ = typename CGAL::Periodic_2_offset_2 >
29 class Periodic_2_triangulation_traits_base_2
30   : public K_
31 {
32   typedef Periodic_2_triangulation_traits_base_2<K_, Off_>         Self;
33   typedef K_                                                       Base;
34 
35 public:
36   typedef K_                                    Kernel;
37   typedef Off_                                  Offset;
38 
39   typedef typename Kernel::FT                   FT;
40   typedef typename Kernel::RT                   RT;
41   typedef typename Kernel::Point_2              Point_2;
42   typedef typename Kernel::Segment_2            Segment_2;
43   typedef typename Kernel::Triangle_2           Triangle_2;
44   typedef typename Kernel::Iso_rectangle_2      Iso_rectangle_2;
45 
46   typedef Offset                                Periodic_2_offset_2;
47 
48   typedef Periodic_2_construct_point_2<Self, typename Kernel::Construct_point_2>
49       Construct_point_2;
50 
51   // Triangulation predicates
52   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Less_x_2>
53       Less_x_2;
54   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Less_y_2>
55       Less_y_2;
56   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Compare_x_2>
57       Compare_x_2;
58   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Compare_y_2>
59       Compare_y_2;
60   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Orientation_2>
61       Orientation_2;
62 
63   // Triangulation constructions
64   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Construct_segment_2>
65       Construct_segment_2;
66   typedef Functor_with_offset_points_adaptor_2<Self, typename Kernel::Construct_triangle_2>
67       Construct_triangle_2;
68 
69   // Constructor
~Periodic_2_triangulation_traits_base_2()70   virtual ~Periodic_2_triangulation_traits_base_2() { }
71 
Periodic_2_triangulation_traits_base_2(const Iso_rectangle_2 & domain,const Kernel & k)72   Periodic_2_triangulation_traits_base_2(const Iso_rectangle_2& domain,
73                                          const Kernel& k)
74     : Base(k), _domain(domain)
75   { }
76 
77   // Access
set_domain(const Iso_rectangle_2 & domain)78   virtual void set_domain(const Iso_rectangle_2& domain) { _domain = domain; }
get_domain()79   Iso_rectangle_2 get_domain() const { return _domain; }
80 
81   // Operations
construct_point_2_object()82   Construct_point_2 construct_point_2_object() const {
83     return Construct_point_2(&_domain, this->Kernel::construct_point_2_object());
84   }
85 
86     // Predicates
less_x_2_object()87   Less_x_2 less_x_2_object() const {
88     return Less_x_2(this->Kernel::less_x_2_object(), construct_point_2_object());
89   }
less_y_2_object()90   Less_y_2 less_y_2_object() const {
91     return Less_y_2(this->Kernel::less_y_2_object(), construct_point_2_object());
92   }
compare_x_2_object()93   Compare_x_2 compare_x_2_object() const {
94     return Compare_x_2(this->Kernel::compare_x_2_object(), construct_point_2_object());
95   }
compare_y_2_object()96   Compare_y_2 compare_y_2_object() const {
97     return Compare_y_2(this->Kernel::compare_y_2_object(), construct_point_2_object());
98   }
orientation_2_object()99   Orientation_2 orientation_2_object() const {
100     return Orientation_2(this->Kernel::orientation_2_object(), construct_point_2_object());
101   }
102 
103     // Constructions
construct_segment_2_object()104   Construct_segment_2 construct_segment_2_object() const {
105     return Construct_segment_2(this->Kernel::construct_segment_2_object(), construct_point_2_object());
106   }
construct_triangle_2_object()107   Construct_triangle_2 construct_triangle_2_object() const {
108     return Construct_triangle_2(this->Kernel::construct_triangle_2_object(), construct_point_2_object());
109   }
110 
111 protected:
112   Iso_rectangle_2 _domain;
113 };
114 
115 
116 // Forward declaration for the filtered traits
117 template <class K_,
118           class Off_ = CGAL::Periodic_2_offset_2,
119           bool Has_filtered_predicates = internal::Has_filtered_predicates<K_>::value >
120 class Periodic_2_triangulation_traits_2;
121 
122 } // namespace CGAL
123 
124 // Partial specialization for Filtered_kernel<CK>.
125 #include <CGAL/internal/Periodic_2_triangulation_filtered_traits_2.h>
126 
127 namespace CGAL
128 {
129 
130 template <class K_, class Off_>
131 class Periodic_2_triangulation_traits_2<K_, Off_, false>
132   : public Periodic_2_triangulation_traits_base_2<K_, Off_>
133 {
134   typedef Periodic_2_triangulation_traits_base_2<K_, Off_>        Base;
135 
136 public:
137   typedef K_                                                      Kernel;
138   typedef typename Kernel::Iso_rectangle_2                        Iso_rectangle_2;
139 
140   Periodic_2_triangulation_traits_2(const Iso_rectangle_2& domain = Iso_rectangle_2(0,0,1,1),
141                                     const Kernel& k = Kernel())
Base(domain,k)142     : Base(domain, k)
143   { }
144 };
145 
146 template <class K_, class Off_>
147 class Periodic_2_triangulation_traits_2<K_, Off_, true>
148   : public Periodic_2_triangulation_filtered_traits_2<
149              K_, Off_, internal::Has_static_filters<K_>::value>
150 {
151   typedef Periodic_2_triangulation_filtered_traits_2<
152             K_, Off_, internal::Has_static_filters<K_>::value>  Base;
153 
154 public:
155   typedef K_                                                   Kernel;
156   typedef typename Kernel::Iso_rectangle_2                     Iso_rectangle_2;
157 
158   Periodic_2_triangulation_traits_2(const Iso_rectangle_2& domain = Iso_rectangle_2(0,0,1,1),
159                                     const Kernel& k = Kernel())
Base(domain,k)160     : Base(domain, k)
161   { }
162 };
163 
164 } //namespace CGAL
165 
166 #endif // CGAL_PERIODIC_2_TRIANGULATION_TRAITS_2_H
167