Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 10:04:50

0001 /*
0002   Copyright 2008 Intel Corporation
0003 
0004   Use, modification and distribution are subject to the Boost Software License,
0005   Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0006   http://www.boost.org/LICENSE_1_0.txt).
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     // get iterator to begin vertex data
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(); } //result of a boolean is clean
0116     bool sorted() const { return value().sorted(); } //result of a boolean is sorted
0117 
0118     //     template <typename input_iterator_type>
0119     //     void set(input_iterator_type input_begin, input_iterator_type input_end,
0120     //              orientation_2d orient) const {
0121     //       orient_ = orient;
0122     //       output_.clear();
0123     //       output_.insert(output_.end(), input_begin, input_end);
0124     //       polygon_sort(output_.begin(), output_.end());
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