1 // Boost.Polygon library segment_data.hpp header file
2 
3 // Copyright (c) Intel Corporation 2008.
4 // Copyright (c) 2008-2012 Simonson Lucanus.
5 // Copyright (c) 2012-2012 Andrii Sydorchuk.
6 
7 // See http://www.boost.org for updates, documentation, and revision history.
8 // Use, modification and distribution is subject to the Boost Software License,
9 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11 
12 #ifndef BOOST_POLYGON_SEGMENT_DATA_HPP
13 #define BOOST_POLYGON_SEGMENT_DATA_HPP
14 
15 #include "isotropy.hpp"
16 #include "segment_concept.hpp"
17 
18 namespace boost {
19 namespace polygon {
20 
21 template <typename T>
22 class segment_data {
23  public:
24   typedef T coordinate_type;
25   typedef point_data<T> point_type;
26 
segment_data()27   segment_data()
28 #ifndef BOOST_POLYGON_MSVC
29     : points_()
30 #endif
31   {}
32 
segment_data(const point_type & low,const point_type & high)33   segment_data(const point_type& low, const point_type& high) {
34     points_[LOW] = low;
35     points_[HIGH] = high;
36   }
37 
segment_data(const segment_data & that)38   segment_data(const segment_data& that) {
39     points_[0] = that.points_[0];
40     points_[1] = that.points_[1];
41   }
42 
operator =(const segment_data & that)43   segment_data& operator=(const segment_data& that) {
44     points_[0] = that.points_[0];
45     points_[1] = that.points_[1];
46     return *this;
47   }
48 
49   template <typename SegmentType>
operator =(const SegmentType & that)50   segment_data& operator=(const SegmentType& that) {
51     assign(*this, that);
52     return *this;
53   }
54 
get(direction_1d dir) const55   point_type get(direction_1d dir) const {
56     return points_[dir.to_int()];
57   }
58 
set(direction_1d dir,const point_type & point)59   void set(direction_1d dir, const point_type& point) {
60     points_[dir.to_int()] = point;
61   }
62 
low() const63   point_type low() const {
64     return points_[LOW];
65   }
66 
low(const point_type & point)67   segment_data& low(const point_type& point) {
68     points_[LOW] = point;
69     return *this;
70   }
71 
high() const72   point_type high() const {
73     return points_[HIGH];
74   }
75 
high(const point_type & point)76   segment_data& high(const point_type& point) {
77     points_[HIGH] = point;
78     return *this;
79   }
80 
operator ==(const segment_data & that) const81   bool operator==(const segment_data& that) const {
82     return (points_[0] == that.points_[0]) &&
83            (points_[1] == that.points_[1]);
84   }
85 
operator !=(const segment_data & that) const86   bool operator!=(const segment_data& that) const {
87     return (points_[0] != that.points_[0]) ||
88            (points_[1] != that.points_[1]);
89   }
90 
operator <(const segment_data & that) const91   bool operator<(const segment_data& that) const {
92     if (points_[0] != that.points_[0]) {
93       return points_[0] < that.points_[0];
94     }
95     return points_[1] < that.points_[1];
96   }
97 
operator <=(const segment_data & that) const98   bool operator<=(const segment_data& that) const {
99     return !(that < *this);
100   }
101 
operator >(const segment_data & that) const102   bool operator>(const segment_data& that) const {
103     return that < *this;
104   }
105 
operator >=(const segment_data & that) const106   bool operator>=(const segment_data& that) const {
107     return !((*this) < that);
108   }
109 
110  private:
111   point_type points_[2];
112 };
113 
114 template <typename CType>
115 struct geometry_concept<segment_data<CType> > {
116   typedef segment_concept type;
117 };
118 }  // polygon
119 }  // boost
120 
121 #endif  // BOOST_POLYGON_SEGMENT_DATA_HPP
122