File indexing completed on 2025-12-16 10:04:50
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_POLYGON_POLYGON_45_SET_VIEW_HPP
0009 #define BOOST_POLYGON_POLYGON_45_SET_VIEW_HPP
0010 namespace boost { namespace polygon{
0011
0012 template <typename ltype, typename rtype, int op_type>
0013 class polygon_45_set_view;
0014
0015 template <typename ltype, typename rtype, int op_type>
0016 struct polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> > {
0017 typedef typename polygon_45_set_view<ltype, rtype, op_type>::coordinate_type coordinate_type;
0018 typedef typename polygon_45_set_view<ltype, rtype, op_type>::iterator_type iterator_type;
0019 typedef typename polygon_45_set_view<ltype, rtype, op_type>::operator_arg_type operator_arg_type;
0020
0021 static inline iterator_type begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set);
0022 static inline iterator_type end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set);
0023
0024 template <typename input_iterator_type>
0025 static inline void set(polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set,
0026 input_iterator_type input_begin, input_iterator_type input_end);
0027
0028 static inline bool clean(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set);
0029
0030 };
0031
0032 template <typename value_type, typename ltype, typename rtype, int op_type>
0033 struct compute_45_set_value {
0034 static
0035 void value(value_type& output_, const ltype& lvalue_, const rtype& rvalue_) {
0036 output_.set(polygon_45_set_traits<ltype>::begin(lvalue_),
0037 polygon_45_set_traits<ltype>::end(lvalue_));
0038 value_type rinput_;
0039 rinput_.set(polygon_45_set_traits<rtype>::begin(rvalue_),
0040 polygon_45_set_traits<rtype>::end(rvalue_));
0041 #ifdef BOOST_POLYGON_MSVC
0042 #pragma warning (push)
0043 #pragma warning (disable: 4127)
0044 #endif
0045 if(op_type == 0)
0046 output_ |= rinput_;
0047 else if(op_type == 1)
0048 output_ &= rinput_;
0049 else if(op_type == 2)
0050 output_ ^= rinput_;
0051 else
0052 output_ -= rinput_;
0053 #ifdef BOOST_POLYGON_MSVC
0054 #pragma warning (pop)
0055 #endif
0056 }
0057 };
0058
0059 template <typename value_type, typename ltype, typename rcoord, int op_type>
0060 struct compute_45_set_value<value_type, ltype, polygon_45_set_data<rcoord>, op_type> {
0061 static
0062 void value(value_type& output_, const ltype& lvalue_, const polygon_45_set_data<rcoord>& rvalue_) {
0063 output_.set(polygon_45_set_traits<ltype>::begin(lvalue_),
0064 polygon_45_set_traits<ltype>::end(lvalue_));
0065 #ifdef BOOST_POLYGON_MSVC
0066 #pragma warning (push)
0067 #pragma warning (disable: 4127)
0068 #endif
0069 if(op_type == 0)
0070 output_ |= rvalue_;
0071 else if(op_type == 1)
0072 output_ &= rvalue_;
0073 else if(op_type == 2)
0074 output_ ^= rvalue_;
0075 else
0076 output_ -= rvalue_;
0077 #ifdef BOOST_POLYGON_MSVC
0078 #pragma warning (pop)
0079 #endif
0080 }
0081 };
0082
0083 template <typename ltype, typename rtype, int op_type>
0084 class polygon_45_set_view {
0085 public:
0086 typedef typename polygon_45_set_traits<ltype>::coordinate_type coordinate_type;
0087 typedef polygon_45_set_data<coordinate_type> value_type;
0088 typedef typename value_type::iterator_type iterator_type;
0089 typedef polygon_45_set_view operator_arg_type;
0090 private:
0091 const ltype& lvalue_;
0092 const rtype& rvalue_;
0093 mutable value_type output_;
0094 mutable bool evaluated_;
0095
0096 polygon_45_set_view& operator=(const polygon_45_set_view&);
0097 public:
0098 polygon_45_set_view(const ltype& lvalue,
0099 const rtype& rvalue ) :
0100 lvalue_(lvalue), rvalue_(rvalue), output_(), evaluated_(false) {}
0101
0102
0103 public:
0104 const value_type& value() const {
0105 if(!evaluated_) {
0106 evaluated_ = true;
0107 compute_45_set_value<value_type, ltype, rtype, op_type>::value(output_, lvalue_, rvalue_);
0108 }
0109 return output_;
0110 }
0111 public:
0112 iterator_type begin() const { return value().begin(); }
0113 iterator_type end() const { return value().end(); }
0114
0115 bool dirty() const { return value().dirty(); }
0116 bool sorted() const { return value().sorted(); }
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126 };
0127
0128 template <typename ltype, typename rtype, int op_type>
0129 typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type
0130 polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
0131 begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
0132 return polygon_45_set.begin();
0133 }
0134 template <typename ltype, typename rtype, int op_type>
0135 typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type
0136 polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
0137 end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
0138 return polygon_45_set.end();
0139 }
0140 template <typename ltype, typename rtype, int op_type>
0141 bool polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::
0142 clean(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set) {
0143 return polygon_45_set.value().clean(); }
0144
0145 template <typename geometry_type_1, typename geometry_type_2, int op_type>
0146 geometry_type_1& self_assignment_boolean_op_45(geometry_type_1& lvalue_, const geometry_type_2& rvalue_) {
0147 typedef geometry_type_1 ltype;
0148 typedef geometry_type_2 rtype;
0149 typedef typename polygon_45_set_traits<ltype>::coordinate_type coordinate_type;
0150 typedef polygon_45_set_data<coordinate_type> value_type;
0151 value_type output_;
0152 value_type rinput_;
0153 output_.set(polygon_45_set_traits<ltype>::begin(lvalue_),
0154 polygon_45_set_traits<ltype>::end(lvalue_));
0155 rinput_.set(polygon_45_set_traits<rtype>::begin(rvalue_),
0156 polygon_45_set_traits<rtype>::end(rvalue_));
0157 #ifdef BOOST_POLYGON_MSVC
0158 #pragma warning (push)
0159 #pragma warning (disable: 4127)
0160 #endif
0161 if(op_type == 0)
0162 output_ |= rinput_;
0163 else if(op_type == 1)
0164 output_ &= rinput_;
0165 else if(op_type == 2)
0166 output_ ^= rinput_;
0167 else
0168 output_ -= rinput_;
0169 #ifdef BOOST_POLYGON_MSVC
0170 #pragma warning (pop)
0171 #endif
0172 polygon_45_set_mutable_traits<geometry_type_1>::set(lvalue_, output_.begin(), output_.end());
0173 return lvalue_;
0174 }
0175
0176 template <typename concept_type>
0177 struct fracture_holes_option_by_type {
0178 static const bool value = true;
0179 };
0180 template <>
0181 struct fracture_holes_option_by_type<polygon_45_with_holes_concept> {
0182 static const bool value = false;
0183 };
0184 template <>
0185 struct fracture_holes_option_by_type<polygon_with_holes_concept> {
0186 static const bool value = false;
0187 };
0188
0189 template <typename ltype, typename rtype, int op_type>
0190 struct geometry_concept<polygon_45_set_view<ltype, rtype, op_type> > { typedef polygon_45_set_concept type; };
0191
0192 namespace operators {
0193 struct y_ps45_b : gtl_yes {};
0194
0195 template <typename geometry_type_1, typename geometry_type_2>
0196 typename enable_if< typename gtl_and_4< y_ps45_b,
0197 typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
0198 typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
0199 typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
0200 polygon_45_set_view<geometry_type_1, geometry_type_2, 0> >::type
0201 operator|(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0202 return polygon_45_set_view<geometry_type_1, geometry_type_2, 0>
0203 (lvalue, rvalue);
0204 }
0205
0206 struct y_ps45_p : gtl_yes {};
0207
0208 template <typename geometry_type_1, typename geometry_type_2>
0209 typename enable_if< typename gtl_and_4< y_ps45_p,
0210 typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_1>::type>::type,
0211 typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0212 typename gtl_if<typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type>::type,
0213 polygon_45_set_view<geometry_type_1, geometry_type_2, 0> >::type
0214 operator+(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0215 return polygon_45_set_view<geometry_type_1, geometry_type_2, 0>
0216 (lvalue, rvalue);
0217 }
0218
0219 struct y_ps45_s : gtl_yes {};
0220
0221 template <typename geometry_type_1, typename geometry_type_2>
0222 typename enable_if< typename gtl_and_4< y_ps45_s, typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
0223 typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
0224 typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
0225 polygon_45_set_view<geometry_type_1, geometry_type_2, 1> >::type
0226 operator*(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0227 return polygon_45_set_view<geometry_type_1, geometry_type_2, 1>
0228 (lvalue, rvalue);
0229 }
0230
0231 struct y_ps45_a : gtl_yes {};
0232
0233 template <typename geometry_type_1, typename geometry_type_2>
0234 typename enable_if< typename gtl_and_4< y_ps45_a, typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
0235 typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
0236 typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
0237 polygon_45_set_view<geometry_type_1, geometry_type_2, 1> >::type
0238 operator&(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0239 return polygon_45_set_view<geometry_type_1, geometry_type_2, 1>
0240 (lvalue, rvalue);
0241 }
0242
0243 struct y_ps45_x : gtl_yes {};
0244
0245 template <typename geometry_type_1, typename geometry_type_2>
0246 typename enable_if< typename gtl_and_4< y_ps45_x, typename is_polygon_45_or_90_set_type<geometry_type_1>::type,
0247 typename is_polygon_45_or_90_set_type<geometry_type_2>::type,
0248 typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type,
0249 polygon_45_set_view<geometry_type_1, geometry_type_2, 2> >::type
0250 operator^(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0251 return polygon_45_set_view<geometry_type_1, geometry_type_2, 2>
0252 (lvalue, rvalue);
0253 }
0254
0255 struct y_ps45_m : gtl_yes {};
0256
0257 template <typename geometry_type_1, typename geometry_type_2>
0258 typename enable_if< typename gtl_and_4< y_ps45_m,
0259 typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_1>::type>::type,
0260 typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0261 typename gtl_if<typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type>::type,
0262 polygon_45_set_view<geometry_type_1, geometry_type_2, 3> >::type
0263 operator-(const geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0264 return polygon_45_set_view<geometry_type_1, geometry_type_2, 3>
0265 (lvalue, rvalue);
0266 }
0267
0268 struct y_ps45_pe : gtl_yes {};
0269
0270 template <typename geometry_type_1, typename geometry_type_2>
0271 typename enable_if< typename gtl_and_4<y_ps45_pe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, gtl_yes,
0272 typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0273 geometry_type_1>::type &
0274 operator+=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0275 return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 0>(lvalue, rvalue);
0276 }
0277
0278 struct y_ps45_be : gtl_yes {};
0279
0280 template <typename geometry_type_1, typename geometry_type_2>
0281 typename enable_if< typename gtl_and_3<y_ps45_be, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
0282 typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0283 geometry_type_1>::type &
0284 operator|=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0285 return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 0>(lvalue, rvalue);
0286 }
0287
0288 struct y_ps45_se : gtl_yes {};
0289
0290 template <typename geometry_type_1, typename geometry_type_2>
0291 typename enable_if< typename gtl_and_3< y_ps45_se,
0292 typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
0293 typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0294 geometry_type_1>::type &
0295 operator*=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0296 return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 1>(lvalue, rvalue);
0297 }
0298
0299 struct y_ps45_ae : gtl_yes {};
0300
0301 template <typename geometry_type_1, typename geometry_type_2>
0302 typename enable_if< typename gtl_and_3<y_ps45_ae, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
0303 typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0304 geometry_type_1>::type &
0305 operator&=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0306 return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 1>(lvalue, rvalue);
0307 }
0308
0309 struct y_ps45_xe : gtl_yes {};
0310
0311 template <typename geometry_type_1, typename geometry_type_2>
0312 typename enable_if<
0313 typename gtl_and_3<y_ps45_xe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
0314 typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0315 geometry_type_1>::type &
0316 operator^=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0317 return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 2>(lvalue, rvalue);
0318 }
0319
0320 struct y_ps45_me : gtl_yes {};
0321
0322 template <typename geometry_type_1, typename geometry_type_2>
0323 typename enable_if< typename gtl_and_3<y_ps45_me, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
0324 typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type,
0325 geometry_type_1>::type &
0326 operator-=(geometry_type_1& lvalue, const geometry_type_2& rvalue) {
0327 return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 3>(lvalue, rvalue);
0328 }
0329
0330 struct y_ps45_rpe : gtl_yes {};
0331
0332 template <typename geometry_type_1, typename coordinate_type_1>
0333 typename enable_if< typename gtl_and_3< y_ps45_rpe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type,
0334 typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
0335 coordinate_concept>::type>::type,
0336 geometry_type_1>::type &
0337 operator+=(geometry_type_1& lvalue, coordinate_type_1 rvalue) {
0338 return resize(lvalue, rvalue);
0339 }
0340
0341 struct y_ps45_rme : gtl_yes {};
0342
0343 template <typename geometry_type_1, typename coordinate_type_1>
0344 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,
0345 typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
0346 coordinate_concept>::type>::type,
0347 geometry_type_1>::type &
0348 operator-=(geometry_type_1& lvalue, coordinate_type_1 rvalue) {
0349 return resize(lvalue, -rvalue);
0350 }
0351
0352 struct y_ps45_rp : gtl_yes {};
0353
0354 template <typename geometry_type_1, typename coordinate_type_1>
0355 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,
0356 typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
0357 coordinate_concept>::type>
0358 ::type, geometry_type_1>::type
0359 operator+(const geometry_type_1& lvalue, coordinate_type_1 rvalue) {
0360 geometry_type_1 retval(lvalue);
0361 retval += rvalue;
0362 return retval;
0363 }
0364
0365 struct y_ps45_rm : gtl_yes {};
0366
0367 template <typename geometry_type_1, typename coordinate_type_1>
0368 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,
0369 typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type,
0370 coordinate_concept>::type>
0371 ::type, geometry_type_1>::type
0372 operator-(const geometry_type_1& lvalue, coordinate_type_1 rvalue) {
0373 geometry_type_1 retval(lvalue);
0374 retval -= rvalue;
0375 return retval;
0376 }
0377 }
0378 }
0379 }
0380 #endif