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