1 | //
|
---|
2 | // Boost.Pointer Container
|
---|
3 | //
|
---|
4 | // Copyright Thorsten Ottosen 2003-2005. Use, modification and
|
---|
5 | // distribution is subject to the Boost Software License, Version
|
---|
6 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
---|
7 | // http://www.boost.org/LICENSE_1_0.txt)
|
---|
8 | //
|
---|
9 | // For more information, see http://www.boost.org/libs/ptr_container/
|
---|
10 | //
|
---|
11 |
|
---|
12 | #ifndef BOOST_PTR_CONTAINER_DETAIL_VOID_PTR_ITERATOR_HPP
|
---|
13 | #define BOOST_PTR_CONTAINER_DETAIL_VOID_PTR_ITERATOR_HPP
|
---|
14 |
|
---|
15 | #if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
---|
16 | # pragma once
|
---|
17 | #endif
|
---|
18 |
|
---|
19 | #include <boost/config.hpp>
|
---|
20 | #include <boost/iterator/iterator_traits.hpp>
|
---|
21 |
|
---|
22 | namespace boost
|
---|
23 | {
|
---|
24 | //namespace ptr_container_detail
|
---|
25 | //{
|
---|
26 | template
|
---|
27 | <
|
---|
28 | class VoidIter,
|
---|
29 | class T
|
---|
30 | >
|
---|
31 | class void_ptr_iterator
|
---|
32 | {
|
---|
33 | public:
|
---|
34 | typedef T value_type;
|
---|
35 | typedef T& reference;
|
---|
36 | typedef T* pointer;
|
---|
37 |
|
---|
38 | typedef BOOST_DEDUCED_TYPENAME iterator_difference<VoidIter>::type
|
---|
39 | difference_type;
|
---|
40 | typedef BOOST_DEDUCED_TYPENAME iterator_category<VoidIter>::type
|
---|
41 | iterator_category;
|
---|
42 | private:
|
---|
43 |
|
---|
44 | VoidIter iter_;
|
---|
45 |
|
---|
46 | public:
|
---|
47 | void_ptr_iterator() : iter_()
|
---|
48 | { }
|
---|
49 |
|
---|
50 | void_ptr_iterator( VoidIter r ) : iter_(r)
|
---|
51 | { }
|
---|
52 |
|
---|
53 | //
|
---|
54 | // Remark: passing by value breaks vc7.1
|
---|
55 | //
|
---|
56 | template< class MutableIterator, class MutableT >
|
---|
57 | void_ptr_iterator( const void_ptr_iterator<MutableIterator,MutableT>& r )
|
---|
58 | #ifdef BOOST_NO_SFINAE
|
---|
59 | : iter_( VoidIter(const_cast<void**>(&*r.base())) )
|
---|
60 | #else
|
---|
61 |
|
---|
62 | : iter_(r.base())
|
---|
63 | #endif
|
---|
64 | { }
|
---|
65 |
|
---|
66 | T& operator*() const
|
---|
67 | {
|
---|
68 | return *static_cast<T*>( *iter_ );
|
---|
69 | }
|
---|
70 |
|
---|
71 | T* operator->() const
|
---|
72 | {
|
---|
73 | return static_cast<T*>( *iter_ );
|
---|
74 | }
|
---|
75 |
|
---|
76 | void_ptr_iterator& operator++()
|
---|
77 | {
|
---|
78 | ++iter_;
|
---|
79 | return *this;
|
---|
80 | }
|
---|
81 |
|
---|
82 | void_ptr_iterator operator++(int)
|
---|
83 | {
|
---|
84 | void_ptr_iterator res = *this;
|
---|
85 | ++iter_;
|
---|
86 | return res;
|
---|
87 | }
|
---|
88 |
|
---|
89 | void_ptr_iterator& operator--()
|
---|
90 | {
|
---|
91 | --iter_;
|
---|
92 | return *this;
|
---|
93 | }
|
---|
94 |
|
---|
95 | void_ptr_iterator operator--(int)
|
---|
96 | {
|
---|
97 | void_ptr_iterator res = *this;
|
---|
98 | --iter_;
|
---|
99 | return res;
|
---|
100 | }
|
---|
101 |
|
---|
102 | void_ptr_iterator& operator+=( difference_type n )
|
---|
103 | {
|
---|
104 | iter_ += n;
|
---|
105 | return *this;
|
---|
106 | }
|
---|
107 |
|
---|
108 | void_ptr_iterator& operator-=( difference_type n )
|
---|
109 | {
|
---|
110 | iter_ -= n;
|
---|
111 | return *this;
|
---|
112 | }
|
---|
113 |
|
---|
114 | T& operator[]( difference_type n ) const
|
---|
115 | {
|
---|
116 | return *static_cast<T*>( *(iter_ + n) );
|
---|
117 | }
|
---|
118 |
|
---|
119 | VoidIter base() const
|
---|
120 | {
|
---|
121 | return iter_;
|
---|
122 | }
|
---|
123 |
|
---|
124 | }; // class 'void_ptr_iterator'
|
---|
125 |
|
---|
126 | template< class VoidIter, class T >
|
---|
127 | inline void_ptr_iterator<VoidIter,T>
|
---|
128 | operator+( void_ptr_iterator<VoidIter,T> l,
|
---|
129 | BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n )
|
---|
130 | {
|
---|
131 | l += n;
|
---|
132 | return l;
|
---|
133 | }
|
---|
134 |
|
---|
135 | template< class VoidIter, class T >
|
---|
136 | inline void_ptr_iterator<VoidIter,T>
|
---|
137 | operator+( BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n,
|
---|
138 | void_ptr_iterator<VoidIter,T> r )
|
---|
139 |
|
---|
140 | {
|
---|
141 | r += n;
|
---|
142 | return r;
|
---|
143 | }
|
---|
144 |
|
---|
145 | template< class VoidIter, class T >
|
---|
146 | inline void_ptr_iterator<VoidIter,T>
|
---|
147 | operator-( void_ptr_iterator<VoidIter,T> l,
|
---|
148 | BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n )
|
---|
149 | {
|
---|
150 | l -= n;
|
---|
151 | return l;
|
---|
152 | }
|
---|
153 |
|
---|
154 | template< class VoidIter, class T >
|
---|
155 | inline void_ptr_iterator<VoidIter,T>
|
---|
156 | operator-( BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type n,
|
---|
157 | void_ptr_iterator<VoidIter,T> r )
|
---|
158 |
|
---|
159 | {
|
---|
160 | r -= n;
|
---|
161 | return r;
|
---|
162 | }
|
---|
163 |
|
---|
164 | template< class VoidIter, class T, class VoidIterU, class U >
|
---|
165 | inline BOOST_DEDUCED_TYPENAME void_ptr_iterator<VoidIter,T>::difference_type
|
---|
166 | operator-( void_ptr_iterator<VoidIter,T> l,
|
---|
167 | void_ptr_iterator<VoidIterU,U> r )
|
---|
168 |
|
---|
169 | {
|
---|
170 | return l.base() - r.base();
|
---|
171 | }
|
---|
172 |
|
---|
173 |
|
---|
174 |
|
---|
175 | template< class VoidIterT, class T, class VoidIterU, class U >
|
---|
176 | inline bool operator==( const void_ptr_iterator<VoidIterT,T>& l,
|
---|
177 | const void_ptr_iterator<VoidIterU,U>& r )
|
---|
178 | {
|
---|
179 | return l.base() == r.base();
|
---|
180 | }
|
---|
181 |
|
---|
182 |
|
---|
183 |
|
---|
184 | template< class VoidIterT, class T, class VoidIterU, class U >
|
---|
185 | inline bool operator!=( const void_ptr_iterator<VoidIterT,T>& l,
|
---|
186 | const void_ptr_iterator<VoidIterU,U>& r )
|
---|
187 | {
|
---|
188 | return l.base() != r.base();
|
---|
189 | }
|
---|
190 |
|
---|
191 |
|
---|
192 |
|
---|
193 | template< class VoidIterT, class T, class VoidIterU, class U >
|
---|
194 | inline bool operator<( const void_ptr_iterator<VoidIterT,T>& l,
|
---|
195 | const void_ptr_iterator<VoidIterU,U>& r )
|
---|
196 | {
|
---|
197 | return l.base() < r.base();
|
---|
198 | }
|
---|
199 |
|
---|
200 |
|
---|
201 |
|
---|
202 | template< class VoidIterT, class T, class VoidIterU, class U >
|
---|
203 | inline bool operator<=( const void_ptr_iterator<VoidIterT,T>& l,
|
---|
204 | const void_ptr_iterator<VoidIterU,U>& r )
|
---|
205 | {
|
---|
206 | return l.base() <= r.base();
|
---|
207 | }
|
---|
208 |
|
---|
209 |
|
---|
210 |
|
---|
211 | template< class VoidIterT, class T, class VoidIterU, class U >
|
---|
212 | inline bool operator>( const void_ptr_iterator<VoidIterT,T>& l,
|
---|
213 | const void_ptr_iterator<VoidIterU,U>& r )
|
---|
214 | {
|
---|
215 | return l.base() > r.base();
|
---|
216 | }
|
---|
217 |
|
---|
218 |
|
---|
219 |
|
---|
220 | template< class VoidIterT, class T, class VoidIterU, class U >
|
---|
221 | inline bool operator>=( const void_ptr_iterator<VoidIterT,T>& l,
|
---|
222 | const void_ptr_iterator<VoidIterU,U>& r )
|
---|
223 | {
|
---|
224 | return l.base() >= r.base();
|
---|
225 | }
|
---|
226 |
|
---|
227 | }
|
---|
228 |
|
---|
229 | #endif
|
---|