1 // Copyright (c) 2000  Max-Planck-Institute Saarbruecken (Germany).
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/Partition_2/include/CGAL/Partition_2/Triangulation_indirect_traits_2.h $
7 // $Id: Triangulation_indirect_traits_2.h 2e8a59d 2020-07-21T15:25:54+02:00 Laurent Rineau
8 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
9 //
10 //
11 // Author(s)     : Susan Hert <hert@mpi-sb.mpg.de>
12 
13 #ifndef CGAL_TRIANGULATION_INDIRECT_TRAITS_2_H
14 #define CGAL_TRIANGULATION_INDIRECT_TRAITS_2_H
15 
16 #include <CGAL/license/Partition_2.h>
17 
18 
19 #include <CGAL/Kernel/function_objects.h>
20 
21 namespace CGAL {
22 
23 template <class Circulator>
24 class Indirect_segment
25 {
26 public:
Indirect_segment()27    Indirect_segment() {}
Indirect_segment(Circulator s,Circulator t)28    Indirect_segment(Circulator s, Circulator t) : _source_ref(s),
29                                                   _target_ref(t)
30    {}
source()31    Circulator source() {return _source_ref;}
target()32    Circulator target() {return _target_ref;}
33 
34 private:
35    Circulator _source_ref;
36    Circulator _target_ref;
37 };
38 
39 template <class Circulator>
40 class Indirect_triangle
41 {
42 public:
Indirect_triangle()43    Indirect_triangle() {}
Indirect_triangle(Circulator p0,Circulator p1,Circulator p2)44    Indirect_triangle(Circulator p0, Circulator p1, Circulator p2):
45        _p0(p0), _p1(p1), _p2(p2)
46    {}
47 
48 private:
49    Circulator _p0, _p1, _p2;
50 };
51 
52 template <class Traits>
53 class Indirect_compare_x_2
54 {
55    typedef typename Traits::Compare_x_2 Compare_x_2;
56    typedef typename Traits::Point_2     Point;
57 public:
Indirect_compare_x_2(const Compare_x_2 & compare_x_2)58    Indirect_compare_x_2(const Compare_x_2& compare_x_2)
59      : _compare_x_2(compare_x_2)
60    {}
61 
62    template <class Point_2_ptr>
operator()63    Comparison_result operator()(Point_2_ptr p1, Point_2_ptr p2)
64    {
65       return _compare_x_2(Point(*p1), Point(*p2));
66    }
67 
68 private:
69    Compare_x_2 _compare_x_2;
70 };
71 
72 template <class Traits>
73 class Indirect_compare_y_2
74 {
75    typedef typename Traits::Compare_y_2 Compare_y_2;
76    typedef typename Traits::Point_2     Point;
77 public:
Indirect_compare_y_2(const Compare_y_2 & compare_y_2)78    Indirect_compare_y_2(const Compare_y_2& compare_y_2)
79      : _compare_y_2(compare_y_2)
80    {}
81 
82    template <class Point_2_ptr>
operator()83    Comparison_result operator()(Point_2_ptr p1, Point_2_ptr p2)
84    {
85       return _compare_y_2(Point(*p1), Point(*p2));
86    }
87 
88 private:
89    Compare_y_2 _compare_y_2;
90 };
91 
92 template <class Traits>
93 class Indirect_orientation_2
94 {
95    typedef typename Traits::Orientation_2 Orientation_2;
96    typedef typename Traits::Point_2 Point;
97 public:
Indirect_orientation_2(const Orientation_2 & orientation_2)98    Indirect_orientation_2(const Orientation_2& orientation_2)
99      : _orientation_2(orientation_2)
100    {}
101 
102    template <class Point_2_ptr>
operator()103    Orientation operator()(Point_2_ptr p1, Point_2_ptr p2, Point_2_ptr p3)
104    {
105       return _orientation_2(Point(*p1), Point(*p2), Point(*p3));
106    }
107 
108 private:
109    Orientation_2 _orientation_2;
110 };
111 
112 template <class Circulator>
113 class Construct_circulator_2
114 {
115 public:
116    typedef Circulator result_type;
operator()117    Circulator operator()(Circulator p1) const { return p1; }
118 };
119 
120 template <class Circulator>
121 class Construct_indirect_segment_2
122 {
123 public:
124    typedef Indirect_segment<Circulator>   I_segment;
125 
operator()126    I_segment operator()(Circulator p1, Circulator p2)
127    {
128       return I_segment(p1, p2);
129    }
130 };
131 
132 template <class Circulator, class Traits>
133 class Triangulation_indirect_traits_2
134 {
135 public:
136 
137   typedef Circulator                      Point_2;
138   typedef Indirect_segment<Circulator>    Segment_2;
139   typedef Indirect_triangle<Circulator>   Triangle_2;
140 
141   typedef Indirect_orientation_2<Traits>  Orientation_2;
142   typedef Indirect_compare_x_2<Traits>    Compare_x_2;
143   typedef Indirect_compare_y_2<Traits>    Compare_y_2;
144   typedef Construct_indirect_segment_2<Circulator>      Construct_segment_2;
145   typedef Construct_circulator_2<Circulator>            Construct_point_2;
146 
147   // constructor
Triangulation_indirect_traits_2(const Traits & traits)148   Triangulation_indirect_traits_2 (const Traits& traits)
149     : _traits(traits)
150   { }
151 
compare_x_2_object()152    Compare_x_2 compare_x_2_object() const
153    {
154      return Compare_x_2(_traits.compare_x_2_object());
155    }
156 
compare_y_2_object()157    Compare_y_2 compare_y_2_object() const
158    {
159      return Compare_y_2(_traits.compare_y_2_object());
160    }
161 
orientation_2_object()162    Orientation_2 orientation_2_object() const
163    {
164      return Orientation_2(_traits.orientation_2_object());
165    }
166 
167    Construct_segment_2
construct_segment_2_object()168    construct_segment_2_object() const
169    { return Construct_segment_2(); }
170 
construct_point_2_object()171    Construct_point_2 construct_point_2_object() const
172    {
173      return Construct_point_2();
174    }
175 
176 private:
177    const Traits& _traits;
178 };
179 
180 }
181 
182 #endif // CGAL_TRIANGULATION_INDIRECT_TRAITS_2_H
183 
184 // For the Emacs editor
185 // Local Variables:
186 // c-basic-offset: 3
187 // End:
188