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