Chris@102
|
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
|
Chris@102
|
2
|
Chris@102
|
3 // Copyright (c) 2014, Oracle and/or its affiliates.
|
Chris@102
|
4
|
Chris@102
|
5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
|
Chris@102
|
6
|
Chris@102
|
7 // Licensed under the Boost Software License version 1.0.
|
Chris@102
|
8 // http://www.boost.org/users/license.html
|
Chris@102
|
9
|
Chris@102
|
10 #ifndef BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
|
Chris@102
|
11 #define BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
|
Chris@102
|
12
|
Chris@102
|
13 #include <boost/assert.hpp>
|
Chris@102
|
14 #include <boost/mpl/assert.hpp>
|
Chris@102
|
15 #include <boost/type_traits/is_convertible.hpp>
|
Chris@102
|
16 #include <boost/iterator.hpp>
|
Chris@102
|
17 #include <boost/iterator/iterator_facade.hpp>
|
Chris@102
|
18 #include <boost/iterator/iterator_categories.hpp>
|
Chris@102
|
19
|
Chris@102
|
20
|
Chris@102
|
21 namespace boost { namespace geometry
|
Chris@102
|
22 {
|
Chris@102
|
23
|
Chris@102
|
24
|
Chris@102
|
25
|
Chris@102
|
26 template
|
Chris@102
|
27 <
|
Chris@102
|
28 typename Iterator1,
|
Chris@102
|
29 typename Iterator2,
|
Chris@102
|
30 typename Value,
|
Chris@102
|
31 typename Reference = Value&
|
Chris@102
|
32 >
|
Chris@102
|
33 class concatenate_iterator
|
Chris@102
|
34 : public boost::iterator_facade
|
Chris@102
|
35 <
|
Chris@102
|
36 concatenate_iterator<Iterator1, Iterator2, Value, Reference>,
|
Chris@102
|
37 Value,
|
Chris@102
|
38 boost::bidirectional_traversal_tag,
|
Chris@102
|
39 Reference
|
Chris@102
|
40 >
|
Chris@102
|
41 {
|
Chris@102
|
42 private:
|
Chris@102
|
43 Iterator1 m_it1, m_end1;
|
Chris@102
|
44 Iterator2 m_begin2, m_it2;
|
Chris@102
|
45
|
Chris@102
|
46 public:
|
Chris@102
|
47 typedef Iterator1 first_iterator_type;
|
Chris@102
|
48 typedef Iterator2 second_iterator_type;
|
Chris@102
|
49
|
Chris@102
|
50 // default constructor
|
Chris@102
|
51 concatenate_iterator() {}
|
Chris@102
|
52
|
Chris@102
|
53 // for begin
|
Chris@102
|
54 concatenate_iterator(Iterator1 it1, Iterator1 end1,
|
Chris@102
|
55 Iterator2 begin2, Iterator2 it2)
|
Chris@102
|
56 : m_it1(it1), m_end1(end1), m_begin2(begin2), m_it2(it2)
|
Chris@102
|
57 {}
|
Chris@102
|
58
|
Chris@102
|
59 // for end
|
Chris@102
|
60 concatenate_iterator(Iterator1 end1, Iterator2 begin2, Iterator2 end2)
|
Chris@102
|
61 : m_it1(end1), m_end1(end1), m_begin2(begin2), m_it2(end2)
|
Chris@102
|
62 {}
|
Chris@102
|
63
|
Chris@102
|
64 template
|
Chris@102
|
65 <
|
Chris@102
|
66 typename OtherIt1,
|
Chris@102
|
67 typename OtherIt2,
|
Chris@102
|
68 typename OtherValue,
|
Chris@102
|
69 typename OtherReference
|
Chris@102
|
70 >
|
Chris@102
|
71 concatenate_iterator(concatenate_iterator
|
Chris@102
|
72 <
|
Chris@102
|
73 OtherIt1,
|
Chris@102
|
74 OtherIt2,
|
Chris@102
|
75 OtherValue,
|
Chris@102
|
76 OtherReference
|
Chris@102
|
77 > const& other)
|
Chris@102
|
78 : m_it1(other.m_it1)
|
Chris@102
|
79 , m_end1(other.m_end1)
|
Chris@102
|
80 , m_begin2(other.m_begin2)
|
Chris@102
|
81 , m_it2(other.m_it2)
|
Chris@102
|
82 {
|
Chris@102
|
83 static const bool are_conv
|
Chris@102
|
84 = boost::is_convertible<OtherIt1, Iterator1>::value
|
Chris@102
|
85 && boost::is_convertible<OtherIt2, Iterator2>::value;
|
Chris@102
|
86
|
Chris@102
|
87 BOOST_MPL_ASSERT_MSG((are_conv),
|
Chris@102
|
88 NOT_CONVERTIBLE,
|
Chris@102
|
89 (types<OtherIt1, OtherIt2>));
|
Chris@102
|
90 }
|
Chris@102
|
91
|
Chris@102
|
92 private:
|
Chris@102
|
93 friend class boost::iterator_core_access;
|
Chris@102
|
94
|
Chris@102
|
95 template <typename It1, typename It2, typename V, typename R>
|
Chris@102
|
96 friend class concatenate_iterator;
|
Chris@102
|
97
|
Chris@102
|
98 inline Reference dereference() const
|
Chris@102
|
99 {
|
Chris@102
|
100 if ( m_it1 == m_end1 )
|
Chris@102
|
101 {
|
Chris@102
|
102 return *m_it2;
|
Chris@102
|
103 }
|
Chris@102
|
104 return *m_it1;
|
Chris@102
|
105 }
|
Chris@102
|
106
|
Chris@102
|
107 template
|
Chris@102
|
108 <
|
Chris@102
|
109 typename OtherIt1,
|
Chris@102
|
110 typename OtherIt2,
|
Chris@102
|
111 typename OtherValue,
|
Chris@102
|
112 typename OtherReference
|
Chris@102
|
113 >
|
Chris@102
|
114 inline bool equal(concatenate_iterator
|
Chris@102
|
115 <
|
Chris@102
|
116 OtherIt1,
|
Chris@102
|
117 OtherIt2,
|
Chris@102
|
118 OtherValue,
|
Chris@102
|
119 OtherReference
|
Chris@102
|
120 > const& other) const
|
Chris@102
|
121 {
|
Chris@102
|
122 return m_it1 == other.m_it1 && m_it2 == other.m_it2;
|
Chris@102
|
123 }
|
Chris@102
|
124
|
Chris@102
|
125 inline void increment()
|
Chris@102
|
126 {
|
Chris@102
|
127 if ( m_it1 == m_end1 )
|
Chris@102
|
128 {
|
Chris@102
|
129 ++m_it2;
|
Chris@102
|
130 }
|
Chris@102
|
131 else
|
Chris@102
|
132 {
|
Chris@102
|
133 ++m_it1;
|
Chris@102
|
134 }
|
Chris@102
|
135 }
|
Chris@102
|
136
|
Chris@102
|
137 inline void decrement()
|
Chris@102
|
138 {
|
Chris@102
|
139 if ( m_it2 == m_begin2 )
|
Chris@102
|
140 {
|
Chris@102
|
141 --m_it1;
|
Chris@102
|
142 }
|
Chris@102
|
143 else
|
Chris@102
|
144 {
|
Chris@102
|
145 --m_it2;
|
Chris@102
|
146 }
|
Chris@102
|
147 }
|
Chris@102
|
148 };
|
Chris@102
|
149
|
Chris@102
|
150
|
Chris@102
|
151
|
Chris@102
|
152 }} // namespace boost::geometry
|
Chris@102
|
153
|
Chris@102
|
154 #endif // BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
|