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_RECTANGLE_DATA_HPP 9 #define BOOST_POLYGON_RECTANGLE_DATA_HPP 10 11 #include "isotropy.hpp" 12 //interval 13 #include "interval_data.hpp" 14 15 namespace boost { namespace polygon{ 16 17 template <typename T> 18 class rectangle_data { 19 public: 20 typedef T coordinate_type; 21 typedef interval_data<T> interval_type; rectangle_data()22 inline rectangle_data():ranges_() {} rectangle_data(T xl,T yl,T xh,T yh)23 inline rectangle_data(T xl, T yl, T xh, T yh):ranges_() { 24 if(xl > xh) std::swap(xl, xh); 25 if(yl > yh) std::swap(yl, yh); 26 ranges_[HORIZONTAL] = interval_data<T>(xl, xh); 27 ranges_[VERTICAL] = interval_data<T>(yl, yh); 28 } 29 template <typename interval_type_1, typename interval_type_2> rectangle_data(const interval_type_1 & hrange,const interval_type_2 & vrange)30 inline rectangle_data(const interval_type_1& hrange, 31 const interval_type_2& vrange):ranges_() { 32 set(HORIZONTAL, hrange); set(VERTICAL, vrange); } 33 rectangle_data(const rectangle_data & that)34 inline rectangle_data(const rectangle_data& that):ranges_() { (*this) = that; } operator =(const rectangle_data & that)35 inline rectangle_data& operator=(const rectangle_data& that) { 36 ranges_[0] = that.ranges_[0]; ranges_[1] = that.ranges_[1]; return *this; 37 } 38 template <typename T2> 39 inline rectangle_data& operator=(const T2& rvalue); 40 41 template <typename T2> 42 inline bool operator==(const T2& rvalue) const; 43 template <typename T2> operator !=(const T2 & rvalue) const44 inline bool operator!=(const T2& rvalue) const { return !((*this) == rvalue); } 45 get(orientation_2d orient) const46 inline interval_data<coordinate_type> get(orientation_2d orient) const { 47 return ranges_[orient.to_int()]; } get(direction_2d dir) const48 inline coordinate_type get(direction_2d dir) const { 49 return ranges_[orientation_2d(dir).to_int()].get(direction_1d(dir)); 50 } set(direction_2d dir,coordinate_type value)51 inline void set(direction_2d dir, coordinate_type value) { 52 return ranges_[orientation_2d(dir).to_int()].set(direction_1d(dir), value); 53 } 54 template <typename interval_type_1> 55 inline void set(orientation_2d orient, const interval_type_1& interval); 56 private: 57 interval_data<coordinate_type> ranges_[2]; 58 }; 59 60 61 } 62 } 63 #endif 64