]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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_POLYGON_WITH_HOLES_DATA_HPP | |
9 | #define BOOST_POLYGON_POLYGON_WITH_HOLES_DATA_HPP | |
10 | #include "isotropy.hpp" | |
11 | #include "polygon_data.hpp" | |
12 | namespace boost { namespace polygon{ | |
13 | struct polygon_with_holes_concept; | |
14 | template <typename T> | |
15 | class polygon_with_holes_data { | |
16 | public: | |
17 | typedef polygon_with_holes_concept geometry_type; | |
18 | typedef T coordinate_type; | |
19 | typedef typename polygon_data<T>::iterator_type iterator_type; | |
20 | typedef typename std::list<polygon_data<coordinate_type> >::const_iterator iterator_holes_type; | |
21 | typedef polygon_data<coordinate_type> hole_type; | |
22 | typedef typename coordinate_traits<T>::coordinate_distance area_type; | |
23 | typedef point_data<T> point_type; | |
24 | ||
25 | // default constructor of point does not initialize x and y | |
26 | inline polygon_with_holes_data() : self_(), holes_() {} //do nothing default constructor | |
27 | ||
28 | template<class iT> | |
29 | inline polygon_with_holes_data(iT input_begin, iT input_end) : self_(), holes_() { | |
30 | set(input_begin, input_end); | |
31 | } | |
32 | ||
33 | template<class iT, typename hiT> | |
34 | inline polygon_with_holes_data(iT input_begin, iT input_end, hiT holes_begin, hiT holes_end) : self_(), holes_() { | |
35 | set(input_begin, input_end); | |
36 | set_holes(holes_begin, holes_end); | |
37 | } | |
38 | ||
39 | template<class iT> | |
40 | inline polygon_with_holes_data& set(iT input_begin, iT input_end) { | |
41 | self_.set(input_begin, input_end); | |
42 | return *this; | |
43 | } | |
44 | ||
45 | // initialize a polygon from x,y values, it is assumed that the first is an x | |
46 | // and that the input is a well behaved polygon | |
47 | template<class iT> | |
48 | inline polygon_with_holes_data& set_holes(iT input_begin, iT input_end) { | |
49 | holes_.clear(); //just in case there was some old data there | |
50 | for( ; input_begin != input_end; ++ input_begin) { | |
51 | holes_.push_back(hole_type()); | |
52 | holes_.back().set((*input_begin).begin(), (*input_begin).end()); | |
53 | } | |
54 | return *this; | |
55 | } | |
56 | ||
57 | // copy constructor (since we have dynamic memory) | |
58 | inline polygon_with_holes_data(const polygon_with_holes_data& that) : self_(that.self_), | |
59 | holes_(that.holes_) {} | |
60 | ||
61 | // assignment operator (since we have dynamic memory do a deep copy) | |
62 | inline polygon_with_holes_data& operator=(const polygon_with_holes_data& that) { | |
63 | self_ = that.self_; | |
64 | holes_ = that.holes_; | |
65 | return *this; | |
66 | } | |
67 | ||
68 | template <typename T2> | |
69 | inline polygon_with_holes_data& operator=(const T2& rvalue); | |
70 | ||
71 | // get begin iterator, returns a pointer to a const coordinate_type | |
72 | inline const iterator_type begin() const { | |
73 | return self_.begin(); | |
74 | } | |
75 | ||
76 | // get end iterator, returns a pointer to a const coordinate_type | |
77 | inline const iterator_type end() const { | |
78 | return self_.end(); | |
79 | } | |
80 | ||
81 | inline std::size_t size() const { | |
82 | return self_.size(); | |
83 | } | |
84 | ||
85 | // get begin iterator, returns a pointer to a const polygon | |
86 | inline const iterator_holes_type begin_holes() const { | |
87 | return holes_.begin(); | |
88 | } | |
89 | ||
90 | // get end iterator, returns a pointer to a const polygon | |
91 | inline const iterator_holes_type end_holes() const { | |
92 | return holes_.end(); | |
93 | } | |
94 | ||
95 | inline std::size_t size_holes() const { | |
96 | return holes_.size(); | |
97 | } | |
98 | ||
99 | public: | |
100 | polygon_data<coordinate_type> self_; | |
101 | std::list<hole_type> holes_; | |
102 | }; | |
103 | ||
104 | ||
105 | } | |
106 | } | |
107 | #endif |