| /* |
| Copyright 2008 Intel Corporation |
| |
| Use, modification and distribution are subject to the Boost Software License, |
| Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt). |
| */ |
| #ifndef BOOST_POLYGON_POLYGON_45_SET_VIEW_HPP |
| #define BOOST_POLYGON_POLYGON_45_SET_VIEW_HPP |
| namespace boost { namespace polygon{ |
| |
| template <typename ltype, typename rtype, int op_type> |
| class polygon_45_set_view; |
| |
| template <typename ltype, typename rtype, int op_type> |
| struct polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> > { |
| typedef typename polygon_45_set_view<ltype, rtype, op_type>::coordinate_type coordinate_type; |
| typedef typename polygon_45_set_view<ltype, rtype, op_type>::iterator_type iterator_type; |
| typedef typename polygon_45_set_view<ltype, rtype, op_type>::operator_arg_type operator_arg_type; |
| |
| static inline iterator_type begin(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set); |
| static inline iterator_type end(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set); |
| |
| template <typename input_iterator_type> |
| static inline void set(polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set, |
| input_iterator_type input_begin, input_iterator_type input_end); |
| |
| static inline bool clean(const polygon_45_set_view<ltype, rtype, op_type>& polygon_45_set); |
| |
| }; |
| |
| template <typename value_type, typename ltype, typename rtype, int op_type> |
| struct compute_45_set_value { |
| static |
| void value(value_type& output_, const ltype& lvalue_, const rtype& rvalue_) { |
| output_.set(polygon_45_set_traits<ltype>::begin(lvalue_), |
| polygon_45_set_traits<ltype>::end(lvalue_)); |
| value_type rinput_; |
| rinput_.set(polygon_45_set_traits<rtype>::begin(rvalue_), |
| polygon_45_set_traits<rtype>::end(rvalue_)); |
| #ifdef BOOST_POLYGON_MSVC |
| #pragma warning (disable: 4127) |
| #endif |
| if(op_type == 0) |
| output_ |= rinput_; |
| else if(op_type == 1) |
| output_ &= rinput_; |
| else if(op_type == 2) |
| output_ ^= rinput_; |
| else |
| output_ -= rinput_; |
| #ifdef BOOST_POLYGON_MSVC |
| #pragma warning (default: 4127) |
| #endif |
| } |
| }; |
| |
| template <typename value_type, typename ltype, typename rcoord, int op_type> |
| struct compute_45_set_value<value_type, ltype, polygon_45_set_data<rcoord>, op_type> { |
| static |
| void value(value_type& output_, const ltype& lvalue_, const polygon_45_set_data<rcoord>& rvalue_) { |
| output_.set(polygon_45_set_traits<ltype>::begin(lvalue_), |
| polygon_45_set_traits<ltype>::end(lvalue_)); |
| #ifdef BOOST_POLYGON_MSVC |
| #pragma warning (disable: 4127) |
| #endif |
| if(op_type == 0) |
| output_ |= rvalue_; |
| else if(op_type == 1) |
| output_ &= rvalue_; |
| else if(op_type == 2) |
| output_ ^= rvalue_; |
| else |
| output_ -= rvalue_; |
| #ifdef BOOST_POLYGON_MSVC |
| #pragma warning (default: 4127) |
| #endif |
| } |
| }; |
| |
| template <typename ltype, typename rtype, int op_type> |
| class polygon_45_set_view { |
| public: |
| typedef typename polygon_45_set_traits<ltype>::coordinate_type coordinate_type; |
| typedef polygon_45_set_data<coordinate_type> value_type; |
| typedef typename value_type::iterator_type iterator_type; |
| typedef polygon_45_set_view operator_arg_type; |
| private: |
| const ltype& lvalue_; |
| const rtype& rvalue_; |
| mutable value_type output_; |
| mutable bool evaluated_; |
| |
| polygon_45_set_view& operator=(const polygon_45_set_view&); |
| public: |
| polygon_45_set_view(const ltype& lvalue, |
| const rtype& rvalue ) : |
| lvalue_(lvalue), rvalue_(rvalue), output_(), evaluated_(false) {} |
| |
| // get iterator to begin vertex data |
| public: |
| const value_type& value() const { |
| if(!evaluated_) { |
| evaluated_ = true; |
| compute_45_set_value<value_type, ltype, rtype, op_type>::value(output_, lvalue_, rvalue_); |
| } |
| return output_; |
| } |
| public: |
| iterator_type begin() const { return value().begin(); } |
| iterator_type end() const { return value().end(); } |
| |
| bool dirty() const { return value().dirty(); } //result of a boolean is clean |
| bool sorted() const { return value().sorted(); } //result of a boolean is sorted |
| |
| // template <typename input_iterator_type> |
| // void set(input_iterator_type input_begin, input_iterator_type input_end, |
| // orientation_2d orient) const { |
| // orient_ = orient; |
| // output_.clear(); |
| // output_.insert(output_.end(), input_begin, input_end); |
| // gtlsort(output_.begin(), output_.end()); |
| // } |
| }; |
| |
| template <typename ltype, typename rtype, int op_type> |
| typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type |
| 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) { |
| return polygon_45_set.begin(); |
| } |
| template <typename ltype, typename rtype, int op_type> |
| typename polygon_45_set_traits<polygon_45_set_view<ltype, rtype, op_type> >::iterator_type |
| 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) { |
| return polygon_45_set.end(); |
| } |
| template <typename ltype, typename rtype, int op_type> |
| 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) { |
| return polygon_45_set.value().clean(); } |
| |
| template <typename geometry_type_1, typename geometry_type_2, int op_type> |
| geometry_type_1& self_assignment_boolean_op_45(geometry_type_1& lvalue_, const geometry_type_2& rvalue_) { |
| typedef geometry_type_1 ltype; |
| typedef geometry_type_2 rtype; |
| typedef typename polygon_45_set_traits<ltype>::coordinate_type coordinate_type; |
| typedef polygon_45_set_data<coordinate_type> value_type; |
| value_type output_; |
| value_type rinput_; |
| output_.set(polygon_45_set_traits<ltype>::begin(lvalue_), |
| polygon_45_set_traits<ltype>::end(lvalue_)); |
| rinput_.set(polygon_45_set_traits<rtype>::begin(rvalue_), |
| polygon_45_set_traits<rtype>::end(rvalue_)); |
| #ifdef BOOST_POLYGON_MSVC |
| #pragma warning (disable: 4127) |
| #endif |
| if(op_type == 0) |
| output_ |= rinput_; |
| else if(op_type == 1) |
| output_ &= rinput_; |
| else if(op_type == 2) |
| output_ ^= rinput_; |
| else |
| output_ -= rinput_; |
| #ifdef BOOST_POLYGON_MSVC |
| #pragma warning (default: 4127) |
| #endif |
| polygon_45_set_mutable_traits<geometry_type_1>::set(lvalue_, output_.begin(), output_.end()); |
| return lvalue_; |
| } |
| |
| template <typename concept_type> |
| struct fracture_holes_option_by_type { |
| static const bool value = true; |
| }; |
| template <> |
| struct fracture_holes_option_by_type<polygon_45_with_holes_concept> { |
| static const bool value = false; |
| }; |
| template <> |
| struct fracture_holes_option_by_type<polygon_with_holes_concept> { |
| static const bool value = false; |
| }; |
| |
| template <typename ltype, typename rtype, int op_type> |
| struct geometry_concept<polygon_45_set_view<ltype, rtype, op_type> > { typedef polygon_45_set_concept type; }; |
| |
| namespace operators { |
| struct y_ps45_b : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4< y_ps45_b, |
| typename is_polygon_45_or_90_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type, |
| typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type, |
| polygon_45_set_view<geometry_type_1, geometry_type_2, 0> >::type |
| operator|(const geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return polygon_45_set_view<geometry_type_1, geometry_type_2, 0> |
| (lvalue, rvalue); |
| } |
| |
| struct y_ps45_p : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4< y_ps45_p, |
| typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_1>::type>::type, |
| typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| typename gtl_if<typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type>::type, |
| polygon_45_set_view<geometry_type_1, geometry_type_2, 0> >::type |
| operator+(const geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return polygon_45_set_view<geometry_type_1, geometry_type_2, 0> |
| (lvalue, rvalue); |
| } |
| |
| struct y_ps45_s : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4< y_ps45_s, typename is_polygon_45_or_90_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type, |
| typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type, |
| polygon_45_set_view<geometry_type_1, geometry_type_2, 1> >::type |
| operator*(const geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return polygon_45_set_view<geometry_type_1, geometry_type_2, 1> |
| (lvalue, rvalue); |
| } |
| |
| struct y_ps45_a : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4< y_ps45_a, typename is_polygon_45_or_90_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type, |
| typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type, |
| polygon_45_set_view<geometry_type_1, geometry_type_2, 1> >::type |
| operator&(const geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return polygon_45_set_view<geometry_type_1, geometry_type_2, 1> |
| (lvalue, rvalue); |
| } |
| |
| struct y_ps45_x : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4< y_ps45_x, typename is_polygon_45_or_90_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type, |
| typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type, |
| polygon_45_set_view<geometry_type_1, geometry_type_2, 2> >::type |
| operator^(const geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return polygon_45_set_view<geometry_type_1, geometry_type_2, 2> |
| (lvalue, rvalue); |
| } |
| |
| struct y_ps45_m : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4< y_ps45_m, |
| typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_1>::type>::type, |
| typename gtl_if<typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| typename gtl_if<typename is_either_polygon_45_set_type<geometry_type_1, geometry_type_2>::type>::type>::type, |
| polygon_45_set_view<geometry_type_1, geometry_type_2, 3> >::type |
| operator-(const geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return polygon_45_set_view<geometry_type_1, geometry_type_2, 3> |
| (lvalue, rvalue); |
| } |
| |
| struct y_ps45_pe : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_4<y_ps45_pe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, gtl_yes, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| geometry_type_1>::type & |
| operator+=(geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 0>(lvalue, rvalue); |
| } |
| |
| struct y_ps45_be : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_3<y_ps45_be, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| geometry_type_1>::type & |
| operator|=(geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 0>(lvalue, rvalue); |
| } |
| |
| struct y_ps45_se : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_3< y_ps45_se, |
| typename is_mutable_polygon_45_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| geometry_type_1>::type & |
| operator*=(geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 1>(lvalue, rvalue); |
| } |
| |
| struct y_ps45_ae : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_3<y_ps45_ae, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| geometry_type_1>::type & |
| operator&=(geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 1>(lvalue, rvalue); |
| } |
| |
| struct y_ps45_xe : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< |
| typename gtl_and_3<y_ps45_xe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| geometry_type_1>::type & |
| operator^=(geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 2>(lvalue, rvalue); |
| } |
| |
| struct y_ps45_me : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename geometry_type_2> |
| typename enable_if< typename gtl_and_3<y_ps45_me, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, |
| typename is_polygon_45_or_90_set_type<geometry_type_2>::type>::type, |
| geometry_type_1>::type & |
| operator-=(geometry_type_1& lvalue, const geometry_type_2& rvalue) { |
| return self_assignment_boolean_op_45<geometry_type_1, geometry_type_2, 3>(lvalue, rvalue); |
| } |
| |
| struct y_ps45_rpe : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename coordinate_type_1> |
| typename enable_if< typename gtl_and_3< y_ps45_rpe, typename is_mutable_polygon_45_set_type<geometry_type_1>::type, |
| typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type, |
| coordinate_concept>::type>::type, |
| geometry_type_1>::type & |
| operator+=(geometry_type_1& lvalue, coordinate_type_1 rvalue) { |
| return resize(lvalue, rvalue); |
| } |
| |
| struct y_ps45_rme : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename coordinate_type_1> |
| 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, |
| typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type, |
| coordinate_concept>::type>::type, |
| geometry_type_1>::type & |
| operator-=(geometry_type_1& lvalue, coordinate_type_1 rvalue) { |
| return resize(lvalue, -rvalue); |
| } |
| |
| struct y_ps45_rp : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename coordinate_type_1> |
| 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, |
| typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type, |
| coordinate_concept>::type> |
| ::type, geometry_type_1>::type |
| operator+(const geometry_type_1& lvalue, coordinate_type_1 rvalue) { |
| geometry_type_1 retval(lvalue); |
| retval += rvalue; |
| return retval; |
| } |
| |
| struct y_ps45_rm : gtl_yes {}; |
| |
| template <typename geometry_type_1, typename coordinate_type_1> |
| 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, |
| typename gtl_same_type<typename geometry_concept<coordinate_type_1>::type, |
| coordinate_concept>::type> |
| ::type, geometry_type_1>::type |
| operator-(const geometry_type_1& lvalue, coordinate_type_1 rvalue) { |
| geometry_type_1 retval(lvalue); |
| retval -= rvalue; |
| return retval; |
| } |
| } |
| } |
| } |
| #endif |
| |