1 // Copyright (c) 2019  GeometryFactory (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/Convex_hull_2/include/CGAL/Convex_hull_traits_adapter_2.h $
7 // $Id: Convex_hull_traits_adapter_2.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
8 // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
9 //
10 // Author(s)     : Sebastien Loriot
11 
12 
13 #ifndef CGAL_CONVEX_HULL_TRAITS_ADAPTER_2_H
14 #define CGAL_CONVEX_HULL_TRAITS_ADAPTER_2_H
15 
16 #include <CGAL/disable_warnings.h>
17 
18 #include <boost/call_traits.hpp>
19 
20 #include <CGAL/property_map.h>
21 
22 
23 namespace CGAL{
24 
25 
26 template<class Base_traits,class PointPropertyMap>
27 class Convex_hull_traits_adapter_2:public Base_traits{
28   PointPropertyMap ppmap_;
29 public:
Base_traits(base)30   Convex_hull_traits_adapter_2(Base_traits base=Base_traits()):Base_traits(base){}
31 
32   Convex_hull_traits_adapter_2(const PointPropertyMap& ppmap,Base_traits base=Base_traits())
Base_traits(base)33   :Base_traits(base),ppmap_(ppmap){}
34 
35   typedef Base_traits Gt;
36   typedef typename boost::property_traits<PointPropertyMap>::key_type Point_2;
37   typedef typename boost::call_traits<Point_2>::param_type Arg_type;
38 
39   struct Less_xy_2 : public Base_traits::Less_xy_2{
Less_xy_2Less_xy_240     Less_xy_2(const PointPropertyMap& ppmap,const typename Base_traits::Less_xy_2& base):
41       Base_traits::Less_xy_2(base),ppmap_(ppmap){}
42     const PointPropertyMap& ppmap_;
operatorLess_xy_243     bool operator()(Arg_type p,Arg_type q) const {
44       return static_cast<const typename Base_traits::Less_xy_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q));
45     }
46   };
47 
48   struct Equal_2 : public Base_traits::Equal_2{
Equal_2Equal_249     Equal_2(const PointPropertyMap& ppmap,const typename Base_traits::Equal_2& base):
50       Base_traits::Equal_2(base),ppmap_(ppmap){}
51     const PointPropertyMap& ppmap_;
operatorEqual_252     bool operator()(Arg_type p,Arg_type q) const {
53       return static_cast<const typename Base_traits::Equal_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q));
54     }
55   };
56 
57   struct Less_yx_2 : public Base_traits::Less_yx_2{
Less_yx_2Less_yx_258     Less_yx_2(const PointPropertyMap& ppmap,const typename Base_traits::Less_yx_2& base):
59       Base_traits::Less_yx_2(base),ppmap_(ppmap){}
60     const PointPropertyMap& ppmap_;
operatorLess_yx_261     bool operator()(Arg_type p,Arg_type q) const {
62       return static_cast<const typename Base_traits::Less_yx_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q));
63     }
64   };
65 
66   struct Left_turn_2 : public Base_traits::Left_turn_2{
Left_turn_2Left_turn_267     Left_turn_2(const PointPropertyMap& ppmap,const typename Base_traits::Left_turn_2& base):
68       Base_traits::Left_turn_2(base),ppmap_(ppmap){}
69     const PointPropertyMap& ppmap_;
operatorLeft_turn_270     bool operator()(Arg_type p,Arg_type q, Arg_type r) const {
71       return static_cast<const typename Base_traits::Left_turn_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q),get(ppmap_,r));
72     }
73   };
74 
75   struct Orientation_2 : public Base_traits::Orientation_2{
Orientation_2Orientation_276     Orientation_2(const PointPropertyMap& ppmap,const typename Base_traits::Orientation_2& base):
77       Base_traits::Orientation_2(base),ppmap_(ppmap){}
78     const PointPropertyMap& ppmap_;
operatorOrientation_279     CGAL::Orientation operator()(Arg_type p,Arg_type q, Arg_type r) const {
80       return static_cast<const typename Base_traits::Orientation_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q),get(ppmap_,r));
81     }
82   };
83 
84   struct Less_rotate_ccw_2 : public Base_traits::Less_rotate_ccw_2{
Less_rotate_ccw_2Less_rotate_ccw_285     Less_rotate_ccw_2(const PointPropertyMap& ppmap,const typename Base_traits::Less_rotate_ccw_2& base):
86       Base_traits::Less_rotate_ccw_2(base),ppmap_(ppmap){}
87     const PointPropertyMap& ppmap_;
operatorLess_rotate_ccw_288     bool operator()(Arg_type p,Arg_type q, Arg_type r) const {
89       return static_cast<const typename Base_traits::Less_rotate_ccw_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q),get(ppmap_,r));
90     }
91   };
92 
93   struct Less_signed_distance_to_line_2 : public Base_traits::Less_signed_distance_to_line_2{
Less_signed_distance_to_line_2Less_signed_distance_to_line_294     Less_signed_distance_to_line_2(const PointPropertyMap& ppmap,const typename Base_traits::Less_signed_distance_to_line_2& base):
95       Base_traits::Less_signed_distance_to_line_2(base),ppmap_(ppmap){}
96     const PointPropertyMap& ppmap_;
operatorLess_signed_distance_to_line_297     bool operator()(Arg_type p,Arg_type q, Arg_type r, Arg_type s) const {
98       return static_cast<const typename Base_traits::Less_signed_distance_to_line_2*>(this)->operator()(get(ppmap_,p),get(ppmap_,q),get(ppmap_,r),get(ppmap_,s));
99     }
100   };
101 
equal_2_object()102   Equal_2 equal_2_object () const {return Equal_2(ppmap_,static_cast<const Gt*>(this)->equal_2_object() );}
left_turn_2_object()103   Left_turn_2 left_turn_2_object () const {return Left_turn_2(ppmap_,static_cast<const Gt*>(this)->left_turn_2_object() );}
orientation_2_object()104   Orientation_2 orientation_2_object () const {return Orientation_2(ppmap_,static_cast<const Gt*>(this)->orientation_2_object() );}
less_rotate_ccw_2_object()105   Less_rotate_ccw_2   less_rotate_ccw_2_object () const {return Less_rotate_ccw_2(ppmap_,static_cast<const Gt*>(this)->less_rotate_ccw_2_object() );}
less_signed_distance_to_line_2_object()106   Less_signed_distance_to_line_2   less_signed_distance_to_line_2_object () const {return Less_signed_distance_to_line_2(ppmap_,static_cast<const Gt*>(this)->less_signed_distance_to_line_2_object() );}
less_xy_2_object()107   Less_xy_2 less_xy_2_object () const {return Less_xy_2(ppmap_,static_cast<const Gt*>(this)->less_xy_2_object() );}
less_yx_2_object()108   Less_yx_2 less_yx_2_object () const {return Less_yx_2(ppmap_,static_cast<const Gt*>(this)->less_yx_2_object() );}
109 
point_property_map()110   const PointPropertyMap& point_property_map() const {return ppmap_;}
111 
112 };
113 
114 } //namespace CGAL
115 
116 #include <CGAL/enable_warnings.h>
117 
118 #endif //CGAL_CONVEX_HULL_TRAITS_ADAPTER_2_H
119