1 /*
2   Copyright 2008 Intel Corporation
3 
4   Use, modification and distribution are subject to the Boost Software License,
5   Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6   http://www.boost.org/LICENSE_1_0.txt).
7 */
8 #ifndef BOOST_POLYGON_POLYGON_45_SET_VIEW_HPP
9 #define BOOST_POLYGON_POLYGON_45_SET_VIEW_HPP
10 namespace boost { namespace polygon{
11 
12   template <typename ltype, typename rtype, int op_type>
13   class polygon_45_set_view;
14 
15   template <typename ltype, typename rtype, int op_type>
16   struct polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> > {
17     typedef typename polygon_45_set_view<ltype, rtype, op_type>::coordinate_type coordinate_type;
18     typedef typename polygon_45_set_view<ltype, rtype, op_type>::iterator_type iterator_type;
19     typedef typename polygon_45_set_view<ltype, rtype, op_type>::operator_arg_type operator_arg_type;
20 
21     static inline iterator_type begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set);
22     static inline iterator_type end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set);
23 
24     template <typename input_iterator_type>
25     static inline void set(polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set,
26                            input_iterator_type input_begin, input_iterator_type input_end);
27 
28     static inline bool clean(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set);
29 
30   };
31 
32   template <typename value_type, typename ltype, typename rtype, int op_type>
33   struct compute_45_set_value {
34     static
valueboost::polygon::compute_45_set_value35     void value(value_type& output_, const ltype& lvalue_, const rtype& rvalue_) {
36       output_.set(polygon_45_set_traits<ltype>::begin(lvalue_),
37                   polygon_45_set_traits<ltype>::end(lvalue_));
38       value_type rinput_;
39       rinput_.set(polygon_45_set_traits<rtype>::begin(rvalue_),
40                   polygon_45_set_traits<rtype>::end(rvalue_));
41 #ifdef BOOST_POLYGON_MSVC
42 #pragma warning (disable: 4127)
43 #endif
44       if(op_type == 0)
45         output_ |= rinput_;
46       else if(op_type == 1)
47         output_ &= rinput_;
48       else if(op_type == 2)
49         output_ ^= rinput_;
50       else
51         output_ -= rinput_;
52 #ifdef BOOST_POLYGON_MSVC
53 #pragma warning (default: 4127)
54 #endif
55     }
56   };
57 
58   template <typename value_type, typename ltype, typename rcoord, int op_type>
59   struct compute_45_set_value<value_type, ltype, polygon_45_set_data<rcoord>, op_type> {
60     static
valueboost::polygon::compute_45_set_value61     void value(value_type& output_, const ltype& lvalue_, const polygon_45_set_data<rcoord>& rvalue_) {
62       output_.set(polygon_45_set_traits<ltype>::begin(lvalue_),
63                   polygon_45_set_traits<ltype>::end(lvalue_));
64 #ifdef BOOST_POLYGON_MSVC
65 #pragma warning (disable: 4127)
66 #endif
67       if(op_type == 0)
68         output_ |= rvalue_;
69       else if(op_type == 1)
70         output_ &= rvalue_;
71       else if(op_type == 2)
72         output_ ^= rvalue_;
73       else
74         output_ -= rvalue_;
75 #ifdef BOOST_POLYGON_MSVC
76 #pragma warning (default: 4127)
77 #endif
78     }
79   };
80 
81   template <typename ltype, typename rtype, int op_type>
82   class polygon_45_set_view {
83   public:
84     typedef typename polygon_45_set_traits<ltype>::coordinate_type coordinate_type;
85     typedef polygon_45_set_data<coordinate_type> value_type;
86     typedef typename value_type::iterator_type iterator_type;
87     typedef polygon_45_set_view operator_arg_type;
88   private:
89     const ltype& lvalue_;
90     const rtype& rvalue_;
91     mutable value_type output_;
92     mutable bool evaluated_;
93 
94     polygon_45_set_view& operator=(const polygon_45_set_view&);
95   public:
polygon_45_set_view(const ltype & lvalue,const rtype & rvalue)96     polygon_45_set_view(const ltype& lvalue,
97                         const rtype& rvalue ) :
98       lvalue_(lvalue), rvalue_(rvalue), output_(), evaluated_(false) {}
99 
100     // get iterator to begin vertex data
101   public:
value() const102     const value_type& value() const {
103       if(!evaluated_) {
104         evaluated_ = true;
105         compute_45_set_value<value_type, ltype, rtype, op_type>::value(output_, lvalue_, rvalue_);
106       }
107       return output_;
108     }
109   public:
begin() const110     iterator_type begin() const { return value().begin(); }
end() const111     iterator_type end() const { return value().end(); }
112 
dirty() const113     bool dirty() const { return value().dirty(); } //result of a boolean is clean
sorted() const114     bool sorted() const { return value().sorted(); } //result of a boolean is sorted
115 
116     //     template <typename input_iterator_type>
117     //     void set(input_iterator_type input_begin, input_iterator_type input_end,
118     //              orientation_2d orient) const {
119     //       orient_ = orient;
120     //       output_.clear();
121     //       output_.insert(output_.end(), input_begin, input_end);
122     //       gtlsort(output_.begin(), output_.end());
123     //     }
124   };
125 
126   template <typename ltype, typename rtype, int op_type>
127   typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type
128   polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
begin(const polygon_45_set_view<ltype,rtype,op_type> & polygon_45_set)129   begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
130     return polygon_45_set.begin();
131   }
132   template <typename ltype, typename rtype, int op_type>
133   typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type
134   polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
end(const polygon_45_set_view<ltype,rtype,op_type> & polygon_45_set)135   end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
136     return polygon_45_set.end();
137   }
138   template <typename ltype, typename rtype, int op_type>
139   bool polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
clean(const polygon_45_set_view<ltype,rtype,op_type> & polygon_45_set)140   clean(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
141     return polygon_45_set.value().clean(); }
142 
143   template <typename geometry_type_1, typename geometry_type_2, int op_type>
144   geometry_type_1& self_assignment_boolean_op_45(geometry_type_1& lvalue_, const geometry_type_2& rvalue_) {
145     typedef geometry_type_1 ltype;
146     typedef geometry_type_2 rtype;
147     typedef typename polygon_45_set_traits<ltype>::coordinate_type coordinate_type;
148     typedef polygon_45_set_data<coordinate_type> value_type;
149     value_type output_;
150     value_type rinput_;
151     output_.set(polygon_45_set_traits<ltype>::begin(lvalue_),
152                 polygon_45_set_traits<ltype>::end(lvalue_));
153     rinput_.set(polygon_45_set_traits<rtype>::begin(rvalue_),
154                 polygon_45_set_traits<rtype>::end(rvalue_));
155 #ifdef BOOST_POLYGON_MSVC
156 #pragma warning (disable: 4127)
157 #endif
158     if(op_type == 0)
159       output_ |= rinput_;
160     else if(op_type == 1)
161       output_ &= rinput_;
162     else if(op_type == 2)
163       output_ ^= rinput_;
164     else
165       output_ -= rinput_;
166 #ifdef BOOST_POLYGON_MSVC
167 #pragma warning (default: 4127)
168 #endif
169     polygon_45_set_mutable_traits<geometry_type_1>::set(lvalue_, output_.begin(), output_.end());
170     return lvalue_;
171   }
172 
173   template <typename concept_type>
174   struct fracture_holes_option_by_type {
175     static const bool value = true;
176   };
177   template <>
178   struct fracture_holes_option_by_type<polygon_45_with_holes_concept> {
179     static const bool value = false;
180   };
181   template <>
182   struct fracture_holes_option_by_type<polygon_with_holes_concept> {
183     static const bool value = false;
184   };
185 
186   template <typename ltype, typename rtype, int op_type>
187   struct geometry_concept<polygon_45_set_view<ltype, rtype, op_type> > { typedef polygon_45_set_concept type; };
188 
189   namespace operators {
190   struct y_ps45_b : gtl_yes {};
191 
192   template <typename geometry_type_1, typename geometry_type_2>
193   typename enable_if< typename gtl_and_4< y_ps45_b,
194     typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
195     typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
196     typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
197                        polygon_45_set_view<geometry_type_1, geometry_type_2, 0> >::type
operator |(const geometry_type_1 & lvalue,const geometry_type_2 & rvalue)198   operator|(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
199     return polygon_45_set_view<geometry_type_1, geometry_type_2, 0>
200       (lvalue, rvalue);
201   }
202 
203   struct y_ps45_p : gtl_yes {};
204 
205   template <typename geometry_type_1, typename geometry_type_2>
206   typename enable_if< typename gtl_and_4< y_ps45_p,
207     typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_1>::type>::type,
208     typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
209     typename gtl_if<typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type>::type,
210   polygon_45_set_view<geometry_type_1, geometry_type_2, 0> >::type
operator +(const geometry_type_1 & lvalue,const geometry_type_2 & rvalue)211   operator+(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
212     return polygon_45_set_view<geometry_type_1, geometry_type_2, 0>
213       (lvalue, rvalue);
214   }
215 
216   struct y_ps45_s : gtl_yes {};
217 
218   template <typename geometry_type_1, typename geometry_type_2>
219   typename enable_if< typename gtl_and_4< y_ps45_s, typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
220                                            typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
221                                            typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
222                        polygon_45_set_view<geometry_type_1, geometry_type_2, 1> >::type
operator *(const geometry_type_1 & lvalue,const geometry_type_2 & rvalue)223   operator*(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
224     return polygon_45_set_view<geometry_type_1, geometry_type_2, 1>
225       (lvalue, rvalue);
226   }
227 
228   struct y_ps45_a : gtl_yes {};
229 
230   template <typename geometry_type_1, typename geometry_type_2>
231   typename enable_if< typename gtl_and_4< y_ps45_a, typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
232                                            typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
233                                            typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
234                        polygon_45_set_view<geometry_type_1, geometry_type_2, 1> >::type
operator &(const geometry_type_1 & lvalue,const geometry_type_2 & rvalue)235   operator&(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
236     return polygon_45_set_view<geometry_type_1, geometry_type_2, 1>
237       (lvalue, rvalue);
238   }
239 
240   struct y_ps45_x : gtl_yes {};
241 
242   template <typename geometry_type_1, typename geometry_type_2>
243   typename enable_if< typename gtl_and_4< y_ps45_x, typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
244                                            typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
245                                            typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
246                        polygon_45_set_view<geometry_type_1, geometry_type_2, 2> >::type
operator ^(const geometry_type_1 & lvalue,const geometry_type_2 & rvalue)247   operator^(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
248     return polygon_45_set_view<geometry_type_1, geometry_type_2, 2>
249       (lvalue, rvalue);
250   }
251 
252   struct y_ps45_m : gtl_yes {};
253 
254   template <typename geometry_type_1, typename geometry_type_2>
255   typename enable_if< typename gtl_and_4< y_ps45_m,
256     typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_1>::type>::type,
257     typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
258     typename gtl_if<typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type>::type,
259   polygon_45_set_view<geometry_type_1, geometry_type_2, 3> >::type
operator -(const geometry_type_1 & lvalue,const geometry_type_2 & rvalue)260   operator-(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
261     return polygon_45_set_view<geometry_type_1, geometry_type_2, 3>
262       (lvalue, rvalue);
263   }
264 
265   struct y_ps45_pe : gtl_yes {};
266 
267   template <typename geometry_type_1, typename geometry_type_2>
268   typename enable_if< typename gtl_and_4<y_ps45_pe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, gtl_yes,
269                                          typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
270                        geometry_type_1>::type &
operator +=(geometry_type_1 & lvalue,const geometry_type_2 & rvalue)271   operator+=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
272     return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 0>(lvalue, rvalue);
273   }
274 
275   struct y_ps45_be : gtl_yes {};
276 
277   template <typename geometry_type_1, typename geometry_type_2>
278   typename enable_if< typename gtl_and_3<y_ps45_be, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
279                                          typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
280                        geometry_type_1>::type &
operator |=(geometry_type_1 & lvalue,const geometry_type_2 & rvalue)281   operator|=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
282     return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 0>(lvalue, rvalue);
283   }
284 
285   struct y_ps45_se : gtl_yes {};
286 
287   template <typename geometry_type_1, typename geometry_type_2>
288   typename enable_if< typename gtl_and_3< y_ps45_se,
289     typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
290     typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
291                        geometry_type_1>::type &
operator *=(geometry_type_1 & lvalue,const geometry_type_2 & rvalue)292   operator*=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
293     return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 1>(lvalue, rvalue);
294   }
295 
296   struct y_ps45_ae : gtl_yes {};
297 
298   template <typename geometry_type_1, typename geometry_type_2>
299   typename enable_if< typename gtl_and_3<y_ps45_ae, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
300                                          typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
301                        geometry_type_1>::type &
operator &=(geometry_type_1 & lvalue,const geometry_type_2 & rvalue)302   operator&=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
303     return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 1>(lvalue, rvalue);
304   }
305 
306   struct y_ps45_xe : gtl_yes {};
307 
308   template <typename geometry_type_1, typename geometry_type_2>
309   typename enable_if<
310     typename gtl_and_3<y_ps45_xe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
311                       typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
312     geometry_type_1>::type &
operator ^=(geometry_type_1 & lvalue,const geometry_type_2 & rvalue)313   operator^=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
314     return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 2>(lvalue, rvalue);
315   }
316 
317   struct y_ps45_me : gtl_yes {};
318 
319   template <typename geometry_type_1, typename geometry_type_2>
320   typename enable_if< typename gtl_and_3<y_ps45_me, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
321                                          typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
322                        geometry_type_1>::type &
operator -=(geometry_type_1 & lvalue,const geometry_type_2 & rvalue)323   operator-=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
324     return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 3>(lvalue, rvalue);
325   }
326 
327   struct y_ps45_rpe : gtl_yes {};
328 
329   template <typename geometry_type_1, typename coordinate_type_1>
330   typename enable_if< typename gtl_and_3< y_ps45_rpe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
331                                          typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
332                                                                 coordinate_concept>::type>::type,
333                        geometry_type_1>::type &
operator +=(geometry_type_1 & lvalue,coordinate_type_1 rvalue)334   operator+=(geometry_type_1& lvalue, coordinate_type_1 rvalue) {
335     return resize(lvalue, rvalue);
336   }
337 
338   struct y_ps45_rme : gtl_yes {};
339 
340   template <typename geometry_type_1, typename coordinate_type_1>
341   typename enable_if< typename gtl_and_3<y_ps45_rme, typename gtl_if<typename is_mutable_polygon_45_set_type<geometry_type_1>::type>::type,
342                                          typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
343                                                                 coordinate_concept>::type>::type,
344                        geometry_type_1>::type &
operator -=(geometry_type_1 & lvalue,coordinate_type_1 rvalue)345   operator-=(geometry_type_1& lvalue, coordinate_type_1 rvalue) {
346     return resize(lvalue, -rvalue);
347   }
348 
349   struct y_ps45_rp : gtl_yes {};
350 
351   template <typename geometry_type_1, typename coordinate_type_1>
352   typename enable_if< typename gtl_and_3<y_ps45_rp, typename gtl_if<typename is_mutable_polygon_45_set_type<geometry_type_1>::type>::type,
353                                         typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
354                                                                coordinate_concept>::type>
355   ::type, geometry_type_1>::type
operator +(const geometry_type_1 & lvalue,coordinate_type_1 rvalue)356   operator+(const geometry_type_1& lvalue, coordinate_type_1 rvalue) {
357     geometry_type_1 retval(lvalue);
358     retval += rvalue;
359     return retval;
360   }
361 
362   struct y_ps45_rm : gtl_yes {};
363 
364   template <typename geometry_type_1, typename coordinate_type_1>
365   typename enable_if< typename gtl_and_3<y_ps45_rm, typename gtl_if<typename is_mutable_polygon_45_set_type<geometry_type_1>::type>::type,
366                                         typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
367                                                                coordinate_concept>::type>
368   ::type, geometry_type_1>::type
operator -(const geometry_type_1 & lvalue,coordinate_type_1 rvalue)369   operator-(const geometry_type_1& lvalue, coordinate_type_1 rvalue) {
370     geometry_type_1 retval(lvalue);
371     retval -= rvalue;
372     return retval;
373   }
374   }
375 }
376 }
377 #endif
378 
379