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