Chris@16
|
1 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 //
|
Chris@101
|
3 // (C) Copyright Ion Gaztanaga 2005-2013.
|
Chris@16
|
4 // (C) Copyright Gennaro Prota 2003 - 2004.
|
Chris@16
|
5 //
|
Chris@16
|
6 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
7 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
8 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9 //
|
Chris@16
|
10 // See http://www.boost.org/libs/container for documentation.
|
Chris@16
|
11 //
|
Chris@16
|
12 //////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
13
|
Chris@16
|
14 #ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|
Chris@16
|
15 #define BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|
Chris@16
|
16
|
Chris@101
|
17 #ifndef BOOST_CONFIG_HPP
|
Chris@101
|
18 # include <boost/config.hpp>
|
Chris@101
|
19 #endif
|
Chris@101
|
20
|
Chris@101
|
21 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@16
|
22 # pragma once
|
Chris@16
|
23 #endif
|
Chris@16
|
24
|
Chris@101
|
25 #include <boost/container/detail/config_begin.hpp>
|
Chris@16
|
26 #include <boost/container/detail/workaround.hpp>
|
Chris@16
|
27 #include <boost/container/allocator_traits.hpp>
|
Chris@16
|
28 #include <boost/container/detail/type_traits.hpp>
|
Chris@16
|
29 #include <boost/static_assert.hpp>
|
Chris@101
|
30 #include <boost/move/utility_core.hpp>
|
Chris@101
|
31 #include <boost/intrusive/detail/reverse_iterator.hpp>
|
Chris@16
|
32
|
Chris@101
|
33 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@101
|
34 #include <boost/move/detail/fwd_macros.hpp>
|
Chris@101
|
35 #else
|
Chris@16
|
36 #include <boost/container/detail/variadic_templates_tools.hpp>
|
Chris@16
|
37 #endif
|
Chris@101
|
38 #include <boost/container/detail/iterator.hpp>
|
Chris@16
|
39
|
Chris@16
|
40 namespace boost {
|
Chris@16
|
41 namespace container {
|
Chris@16
|
42
|
Chris@16
|
43 template <class T, class Difference = std::ptrdiff_t>
|
Chris@16
|
44 class constant_iterator
|
Chris@101
|
45 : public ::boost::container::iterator
|
Chris@16
|
46 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
|
Chris@16
|
47 {
|
Chris@16
|
48 typedef constant_iterator<T, Difference> this_type;
|
Chris@16
|
49
|
Chris@16
|
50 public:
|
Chris@16
|
51 explicit constant_iterator(const T &ref, Difference range_size)
|
Chris@16
|
52 : m_ptr(&ref), m_num(range_size){}
|
Chris@16
|
53
|
Chris@16
|
54 //Constructors
|
Chris@16
|
55 constant_iterator()
|
Chris@16
|
56 : m_ptr(0), m_num(0){}
|
Chris@16
|
57
|
Chris@16
|
58 constant_iterator& operator++()
|
Chris@16
|
59 { increment(); return *this; }
|
Chris@101
|
60
|
Chris@16
|
61 constant_iterator operator++(int)
|
Chris@16
|
62 {
|
Chris@16
|
63 constant_iterator result (*this);
|
Chris@16
|
64 increment();
|
Chris@16
|
65 return result;
|
Chris@16
|
66 }
|
Chris@16
|
67
|
Chris@16
|
68 constant_iterator& operator--()
|
Chris@16
|
69 { decrement(); return *this; }
|
Chris@101
|
70
|
Chris@16
|
71 constant_iterator operator--(int)
|
Chris@16
|
72 {
|
Chris@16
|
73 constant_iterator result (*this);
|
Chris@16
|
74 decrement();
|
Chris@16
|
75 return result;
|
Chris@16
|
76 }
|
Chris@16
|
77
|
Chris@16
|
78 friend bool operator== (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
79 { return i.equal(i2); }
|
Chris@16
|
80
|
Chris@16
|
81 friend bool operator!= (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
82 { return !(i == i2); }
|
Chris@16
|
83
|
Chris@16
|
84 friend bool operator< (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
85 { return i.less(i2); }
|
Chris@16
|
86
|
Chris@16
|
87 friend bool operator> (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
88 { return i2 < i; }
|
Chris@16
|
89
|
Chris@16
|
90 friend bool operator<= (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
91 { return !(i > i2); }
|
Chris@16
|
92
|
Chris@16
|
93 friend bool operator>= (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
94 { return !(i < i2); }
|
Chris@16
|
95
|
Chris@16
|
96 friend Difference operator- (const constant_iterator& i, const constant_iterator& i2)
|
Chris@16
|
97 { return i2.distance_to(i); }
|
Chris@16
|
98
|
Chris@16
|
99 //Arithmetic
|
Chris@16
|
100 constant_iterator& operator+=(Difference off)
|
Chris@16
|
101 { this->advance(off); return *this; }
|
Chris@16
|
102
|
Chris@16
|
103 constant_iterator operator+(Difference off) const
|
Chris@16
|
104 {
|
Chris@16
|
105 constant_iterator other(*this);
|
Chris@16
|
106 other.advance(off);
|
Chris@16
|
107 return other;
|
Chris@16
|
108 }
|
Chris@16
|
109
|
Chris@16
|
110 friend constant_iterator operator+(Difference off, const constant_iterator& right)
|
Chris@16
|
111 { return right + off; }
|
Chris@16
|
112
|
Chris@16
|
113 constant_iterator& operator-=(Difference off)
|
Chris@16
|
114 { this->advance(-off); return *this; }
|
Chris@16
|
115
|
Chris@16
|
116 constant_iterator operator-(Difference off) const
|
Chris@16
|
117 { return *this + (-off); }
|
Chris@16
|
118
|
Chris@16
|
119 const T& operator*() const
|
Chris@16
|
120 { return dereference(); }
|
Chris@16
|
121
|
Chris@16
|
122 const T& operator[] (Difference ) const
|
Chris@16
|
123 { return dereference(); }
|
Chris@16
|
124
|
Chris@16
|
125 const T* operator->() const
|
Chris@16
|
126 { return &(dereference()); }
|
Chris@16
|
127
|
Chris@16
|
128 private:
|
Chris@16
|
129 const T * m_ptr;
|
Chris@16
|
130 Difference m_num;
|
Chris@16
|
131
|
Chris@16
|
132 void increment()
|
Chris@16
|
133 { --m_num; }
|
Chris@16
|
134
|
Chris@16
|
135 void decrement()
|
Chris@16
|
136 { ++m_num; }
|
Chris@16
|
137
|
Chris@16
|
138 bool equal(const this_type &other) const
|
Chris@16
|
139 { return m_num == other.m_num; }
|
Chris@16
|
140
|
Chris@16
|
141 bool less(const this_type &other) const
|
Chris@16
|
142 { return other.m_num < m_num; }
|
Chris@16
|
143
|
Chris@16
|
144 const T & dereference() const
|
Chris@16
|
145 { return *m_ptr; }
|
Chris@16
|
146
|
Chris@16
|
147 void advance(Difference n)
|
Chris@16
|
148 { m_num -= n; }
|
Chris@16
|
149
|
Chris@16
|
150 Difference distance_to(const this_type &other)const
|
Chris@16
|
151 { return m_num - other.m_num; }
|
Chris@16
|
152 };
|
Chris@16
|
153
|
Chris@101
|
154 template <class T, class Difference>
|
Chris@16
|
155 class value_init_construct_iterator
|
Chris@101
|
156 : public ::boost::container::iterator
|
Chris@16
|
157 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
|
Chris@16
|
158 {
|
Chris@16
|
159 typedef value_init_construct_iterator<T, Difference> this_type;
|
Chris@16
|
160
|
Chris@16
|
161 public:
|
Chris@16
|
162 explicit value_init_construct_iterator(Difference range_size)
|
Chris@16
|
163 : m_num(range_size){}
|
Chris@16
|
164
|
Chris@16
|
165 //Constructors
|
Chris@16
|
166 value_init_construct_iterator()
|
Chris@16
|
167 : m_num(0){}
|
Chris@16
|
168
|
Chris@16
|
169 value_init_construct_iterator& operator++()
|
Chris@16
|
170 { increment(); return *this; }
|
Chris@101
|
171
|
Chris@16
|
172 value_init_construct_iterator operator++(int)
|
Chris@16
|
173 {
|
Chris@16
|
174 value_init_construct_iterator result (*this);
|
Chris@16
|
175 increment();
|
Chris@16
|
176 return result;
|
Chris@16
|
177 }
|
Chris@16
|
178
|
Chris@16
|
179 value_init_construct_iterator& operator--()
|
Chris@16
|
180 { decrement(); return *this; }
|
Chris@101
|
181
|
Chris@16
|
182 value_init_construct_iterator operator--(int)
|
Chris@16
|
183 {
|
Chris@16
|
184 value_init_construct_iterator result (*this);
|
Chris@16
|
185 decrement();
|
Chris@16
|
186 return result;
|
Chris@16
|
187 }
|
Chris@16
|
188
|
Chris@16
|
189 friend bool operator== (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
190 { return i.equal(i2); }
|
Chris@16
|
191
|
Chris@16
|
192 friend bool operator!= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
193 { return !(i == i2); }
|
Chris@16
|
194
|
Chris@16
|
195 friend bool operator< (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
196 { return i.less(i2); }
|
Chris@16
|
197
|
Chris@16
|
198 friend bool operator> (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
199 { return i2 < i; }
|
Chris@16
|
200
|
Chris@16
|
201 friend bool operator<= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
202 { return !(i > i2); }
|
Chris@16
|
203
|
Chris@16
|
204 friend bool operator>= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
205 { return !(i < i2); }
|
Chris@16
|
206
|
Chris@16
|
207 friend Difference operator- (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
|
Chris@16
|
208 { return i2.distance_to(i); }
|
Chris@16
|
209
|
Chris@16
|
210 //Arithmetic
|
Chris@16
|
211 value_init_construct_iterator& operator+=(Difference off)
|
Chris@16
|
212 { this->advance(off); return *this; }
|
Chris@16
|
213
|
Chris@16
|
214 value_init_construct_iterator operator+(Difference off) const
|
Chris@16
|
215 {
|
Chris@16
|
216 value_init_construct_iterator other(*this);
|
Chris@16
|
217 other.advance(off);
|
Chris@16
|
218 return other;
|
Chris@16
|
219 }
|
Chris@16
|
220
|
Chris@16
|
221 friend value_init_construct_iterator operator+(Difference off, const value_init_construct_iterator& right)
|
Chris@16
|
222 { return right + off; }
|
Chris@16
|
223
|
Chris@16
|
224 value_init_construct_iterator& operator-=(Difference off)
|
Chris@16
|
225 { this->advance(-off); return *this; }
|
Chris@16
|
226
|
Chris@16
|
227 value_init_construct_iterator operator-(Difference off) const
|
Chris@16
|
228 { return *this + (-off); }
|
Chris@16
|
229
|
Chris@16
|
230 //This pseudo-iterator's dereference operations have no sense since value is not
|
Chris@16
|
231 //constructed until ::boost::container::construct_in_place is called.
|
Chris@16
|
232 //So comment them to catch bad uses
|
Chris@16
|
233 //const T& operator*() const;
|
Chris@16
|
234 //const T& operator[](difference_type) const;
|
Chris@16
|
235 //const T* operator->() const;
|
Chris@16
|
236
|
Chris@16
|
237 private:
|
Chris@16
|
238 Difference m_num;
|
Chris@16
|
239
|
Chris@16
|
240 void increment()
|
Chris@16
|
241 { --m_num; }
|
Chris@16
|
242
|
Chris@16
|
243 void decrement()
|
Chris@16
|
244 { ++m_num; }
|
Chris@16
|
245
|
Chris@16
|
246 bool equal(const this_type &other) const
|
Chris@16
|
247 { return m_num == other.m_num; }
|
Chris@16
|
248
|
Chris@16
|
249 bool less(const this_type &other) const
|
Chris@16
|
250 { return other.m_num < m_num; }
|
Chris@16
|
251
|
Chris@16
|
252 const T & dereference() const
|
Chris@16
|
253 {
|
Chris@16
|
254 static T dummy;
|
Chris@16
|
255 return dummy;
|
Chris@16
|
256 }
|
Chris@16
|
257
|
Chris@16
|
258 void advance(Difference n)
|
Chris@16
|
259 { m_num -= n; }
|
Chris@16
|
260
|
Chris@16
|
261 Difference distance_to(const this_type &other)const
|
Chris@16
|
262 { return m_num - other.m_num; }
|
Chris@16
|
263 };
|
Chris@16
|
264
|
Chris@101
|
265 template <class T, class Difference>
|
Chris@16
|
266 class default_init_construct_iterator
|
Chris@101
|
267 : public ::boost::container::iterator
|
Chris@16
|
268 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
|
Chris@16
|
269 {
|
Chris@16
|
270 typedef default_init_construct_iterator<T, Difference> this_type;
|
Chris@16
|
271
|
Chris@16
|
272 public:
|
Chris@16
|
273 explicit default_init_construct_iterator(Difference range_size)
|
Chris@16
|
274 : m_num(range_size){}
|
Chris@16
|
275
|
Chris@16
|
276 //Constructors
|
Chris@16
|
277 default_init_construct_iterator()
|
Chris@16
|
278 : m_num(0){}
|
Chris@16
|
279
|
Chris@16
|
280 default_init_construct_iterator& operator++()
|
Chris@16
|
281 { increment(); return *this; }
|
Chris@101
|
282
|
Chris@16
|
283 default_init_construct_iterator operator++(int)
|
Chris@16
|
284 {
|
Chris@16
|
285 default_init_construct_iterator result (*this);
|
Chris@16
|
286 increment();
|
Chris@16
|
287 return result;
|
Chris@16
|
288 }
|
Chris@16
|
289
|
Chris@16
|
290 default_init_construct_iterator& operator--()
|
Chris@16
|
291 { decrement(); return *this; }
|
Chris@101
|
292
|
Chris@16
|
293 default_init_construct_iterator operator--(int)
|
Chris@16
|
294 {
|
Chris@16
|
295 default_init_construct_iterator result (*this);
|
Chris@16
|
296 decrement();
|
Chris@16
|
297 return result;
|
Chris@16
|
298 }
|
Chris@16
|
299
|
Chris@16
|
300 friend bool operator== (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
301 { return i.equal(i2); }
|
Chris@16
|
302
|
Chris@16
|
303 friend bool operator!= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
304 { return !(i == i2); }
|
Chris@16
|
305
|
Chris@16
|
306 friend bool operator< (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
307 { return i.less(i2); }
|
Chris@16
|
308
|
Chris@16
|
309 friend bool operator> (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
310 { return i2 < i; }
|
Chris@16
|
311
|
Chris@16
|
312 friend bool operator<= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
313 { return !(i > i2); }
|
Chris@16
|
314
|
Chris@16
|
315 friend bool operator>= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
316 { return !(i < i2); }
|
Chris@16
|
317
|
Chris@16
|
318 friend Difference operator- (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
|
Chris@16
|
319 { return i2.distance_to(i); }
|
Chris@16
|
320
|
Chris@16
|
321 //Arithmetic
|
Chris@16
|
322 default_init_construct_iterator& operator+=(Difference off)
|
Chris@16
|
323 { this->advance(off); return *this; }
|
Chris@16
|
324
|
Chris@16
|
325 default_init_construct_iterator operator+(Difference off) const
|
Chris@16
|
326 {
|
Chris@16
|
327 default_init_construct_iterator other(*this);
|
Chris@16
|
328 other.advance(off);
|
Chris@16
|
329 return other;
|
Chris@16
|
330 }
|
Chris@16
|
331
|
Chris@16
|
332 friend default_init_construct_iterator operator+(Difference off, const default_init_construct_iterator& right)
|
Chris@16
|
333 { return right + off; }
|
Chris@16
|
334
|
Chris@16
|
335 default_init_construct_iterator& operator-=(Difference off)
|
Chris@16
|
336 { this->advance(-off); return *this; }
|
Chris@16
|
337
|
Chris@16
|
338 default_init_construct_iterator operator-(Difference off) const
|
Chris@16
|
339 { return *this + (-off); }
|
Chris@16
|
340
|
Chris@16
|
341 //This pseudo-iterator's dereference operations have no sense since value is not
|
Chris@16
|
342 //constructed until ::boost::container::construct_in_place is called.
|
Chris@16
|
343 //So comment them to catch bad uses
|
Chris@16
|
344 //const T& operator*() const;
|
Chris@16
|
345 //const T& operator[](difference_type) const;
|
Chris@16
|
346 //const T* operator->() const;
|
Chris@16
|
347
|
Chris@16
|
348 private:
|
Chris@16
|
349 Difference m_num;
|
Chris@16
|
350
|
Chris@16
|
351 void increment()
|
Chris@16
|
352 { --m_num; }
|
Chris@16
|
353
|
Chris@16
|
354 void decrement()
|
Chris@16
|
355 { ++m_num; }
|
Chris@16
|
356
|
Chris@16
|
357 bool equal(const this_type &other) const
|
Chris@16
|
358 { return m_num == other.m_num; }
|
Chris@16
|
359
|
Chris@16
|
360 bool less(const this_type &other) const
|
Chris@16
|
361 { return other.m_num < m_num; }
|
Chris@16
|
362
|
Chris@16
|
363 const T & dereference() const
|
Chris@16
|
364 {
|
Chris@16
|
365 static T dummy;
|
Chris@16
|
366 return dummy;
|
Chris@16
|
367 }
|
Chris@16
|
368
|
Chris@16
|
369 void advance(Difference n)
|
Chris@16
|
370 { m_num -= n; }
|
Chris@16
|
371
|
Chris@16
|
372 Difference distance_to(const this_type &other)const
|
Chris@16
|
373 { return m_num - other.m_num; }
|
Chris@16
|
374 };
|
Chris@16
|
375
|
Chris@16
|
376
|
Chris@16
|
377 template <class T, class Difference = std::ptrdiff_t>
|
Chris@16
|
378 class repeat_iterator
|
Chris@101
|
379 : public ::boost::container::iterator
|
Chris@16
|
380 <std::random_access_iterator_tag, T, Difference>
|
Chris@16
|
381 {
|
Chris@16
|
382 typedef repeat_iterator<T, Difference> this_type;
|
Chris@16
|
383 public:
|
Chris@16
|
384 explicit repeat_iterator(T &ref, Difference range_size)
|
Chris@16
|
385 : m_ptr(&ref), m_num(range_size){}
|
Chris@16
|
386
|
Chris@16
|
387 //Constructors
|
Chris@16
|
388 repeat_iterator()
|
Chris@16
|
389 : m_ptr(0), m_num(0){}
|
Chris@16
|
390
|
Chris@16
|
391 this_type& operator++()
|
Chris@16
|
392 { increment(); return *this; }
|
Chris@101
|
393
|
Chris@16
|
394 this_type operator++(int)
|
Chris@16
|
395 {
|
Chris@16
|
396 this_type result (*this);
|
Chris@16
|
397 increment();
|
Chris@16
|
398 return result;
|
Chris@16
|
399 }
|
Chris@16
|
400
|
Chris@16
|
401 this_type& operator--()
|
Chris@16
|
402 { increment(); return *this; }
|
Chris@101
|
403
|
Chris@16
|
404 this_type operator--(int)
|
Chris@16
|
405 {
|
Chris@16
|
406 this_type result (*this);
|
Chris@16
|
407 increment();
|
Chris@16
|
408 return result;
|
Chris@16
|
409 }
|
Chris@16
|
410
|
Chris@16
|
411 friend bool operator== (const this_type& i, const this_type& i2)
|
Chris@16
|
412 { return i.equal(i2); }
|
Chris@16
|
413
|
Chris@16
|
414 friend bool operator!= (const this_type& i, const this_type& i2)
|
Chris@16
|
415 { return !(i == i2); }
|
Chris@16
|
416
|
Chris@16
|
417 friend bool operator< (const this_type& i, const this_type& i2)
|
Chris@16
|
418 { return i.less(i2); }
|
Chris@16
|
419
|
Chris@16
|
420 friend bool operator> (const this_type& i, const this_type& i2)
|
Chris@16
|
421 { return i2 < i; }
|
Chris@16
|
422
|
Chris@16
|
423 friend bool operator<= (const this_type& i, const this_type& i2)
|
Chris@16
|
424 { return !(i > i2); }
|
Chris@16
|
425
|
Chris@16
|
426 friend bool operator>= (const this_type& i, const this_type& i2)
|
Chris@16
|
427 { return !(i < i2); }
|
Chris@16
|
428
|
Chris@16
|
429 friend Difference operator- (const this_type& i, const this_type& i2)
|
Chris@16
|
430 { return i2.distance_to(i); }
|
Chris@16
|
431
|
Chris@16
|
432 //Arithmetic
|
Chris@16
|
433 this_type& operator+=(Difference off)
|
Chris@16
|
434 { this->advance(off); return *this; }
|
Chris@16
|
435
|
Chris@16
|
436 this_type operator+(Difference off) const
|
Chris@16
|
437 {
|
Chris@16
|
438 this_type other(*this);
|
Chris@16
|
439 other.advance(off);
|
Chris@16
|
440 return other;
|
Chris@16
|
441 }
|
Chris@16
|
442
|
Chris@16
|
443 friend this_type operator+(Difference off, const this_type& right)
|
Chris@16
|
444 { return right + off; }
|
Chris@16
|
445
|
Chris@16
|
446 this_type& operator-=(Difference off)
|
Chris@16
|
447 { this->advance(-off); return *this; }
|
Chris@16
|
448
|
Chris@16
|
449 this_type operator-(Difference off) const
|
Chris@16
|
450 { return *this + (-off); }
|
Chris@16
|
451
|
Chris@16
|
452 T& operator*() const
|
Chris@16
|
453 { return dereference(); }
|
Chris@16
|
454
|
Chris@16
|
455 T& operator[] (Difference ) const
|
Chris@16
|
456 { return dereference(); }
|
Chris@16
|
457
|
Chris@16
|
458 T *operator->() const
|
Chris@16
|
459 { return &(dereference()); }
|
Chris@16
|
460
|
Chris@16
|
461 private:
|
Chris@16
|
462 T * m_ptr;
|
Chris@16
|
463 Difference m_num;
|
Chris@16
|
464
|
Chris@16
|
465 void increment()
|
Chris@16
|
466 { --m_num; }
|
Chris@16
|
467
|
Chris@16
|
468 void decrement()
|
Chris@16
|
469 { ++m_num; }
|
Chris@16
|
470
|
Chris@16
|
471 bool equal(const this_type &other) const
|
Chris@16
|
472 { return m_num == other.m_num; }
|
Chris@16
|
473
|
Chris@16
|
474 bool less(const this_type &other) const
|
Chris@16
|
475 { return other.m_num < m_num; }
|
Chris@16
|
476
|
Chris@16
|
477 T & dereference() const
|
Chris@16
|
478 { return *m_ptr; }
|
Chris@16
|
479
|
Chris@16
|
480 void advance(Difference n)
|
Chris@16
|
481 { m_num -= n; }
|
Chris@16
|
482
|
Chris@16
|
483 Difference distance_to(const this_type &other)const
|
Chris@16
|
484 { return m_num - other.m_num; }
|
Chris@16
|
485 };
|
Chris@16
|
486
|
Chris@16
|
487 template <class T, class EmplaceFunctor, class Difference /*= std::ptrdiff_t*/>
|
Chris@16
|
488 class emplace_iterator
|
Chris@101
|
489 : public ::boost::container::iterator
|
Chris@16
|
490 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
|
Chris@16
|
491 {
|
Chris@16
|
492 typedef emplace_iterator this_type;
|
Chris@16
|
493
|
Chris@16
|
494 public:
|
Chris@16
|
495 typedef Difference difference_type;
|
Chris@16
|
496 explicit emplace_iterator(EmplaceFunctor&e)
|
Chris@16
|
497 : m_num(1), m_pe(&e){}
|
Chris@16
|
498
|
Chris@16
|
499 emplace_iterator()
|
Chris@16
|
500 : m_num(0), m_pe(0){}
|
Chris@16
|
501
|
Chris@16
|
502 this_type& operator++()
|
Chris@16
|
503 { increment(); return *this; }
|
Chris@101
|
504
|
Chris@16
|
505 this_type operator++(int)
|
Chris@16
|
506 {
|
Chris@16
|
507 this_type result (*this);
|
Chris@16
|
508 increment();
|
Chris@16
|
509 return result;
|
Chris@16
|
510 }
|
Chris@16
|
511
|
Chris@16
|
512 this_type& operator--()
|
Chris@16
|
513 { decrement(); return *this; }
|
Chris@101
|
514
|
Chris@16
|
515 this_type operator--(int)
|
Chris@16
|
516 {
|
Chris@16
|
517 this_type result (*this);
|
Chris@16
|
518 decrement();
|
Chris@16
|
519 return result;
|
Chris@16
|
520 }
|
Chris@16
|
521
|
Chris@16
|
522 friend bool operator== (const this_type& i, const this_type& i2)
|
Chris@16
|
523 { return i.equal(i2); }
|
Chris@16
|
524
|
Chris@16
|
525 friend bool operator!= (const this_type& i, const this_type& i2)
|
Chris@16
|
526 { return !(i == i2); }
|
Chris@16
|
527
|
Chris@16
|
528 friend bool operator< (const this_type& i, const this_type& i2)
|
Chris@16
|
529 { return i.less(i2); }
|
Chris@16
|
530
|
Chris@16
|
531 friend bool operator> (const this_type& i, const this_type& i2)
|
Chris@16
|
532 { return i2 < i; }
|
Chris@16
|
533
|
Chris@16
|
534 friend bool operator<= (const this_type& i, const this_type& i2)
|
Chris@16
|
535 { return !(i > i2); }
|
Chris@16
|
536
|
Chris@16
|
537 friend bool operator>= (const this_type& i, const this_type& i2)
|
Chris@16
|
538 { return !(i < i2); }
|
Chris@16
|
539
|
Chris@16
|
540 friend difference_type operator- (const this_type& i, const this_type& i2)
|
Chris@16
|
541 { return i2.distance_to(i); }
|
Chris@16
|
542
|
Chris@16
|
543 //Arithmetic
|
Chris@16
|
544 this_type& operator+=(difference_type off)
|
Chris@16
|
545 { this->advance(off); return *this; }
|
Chris@16
|
546
|
Chris@16
|
547 this_type operator+(difference_type off) const
|
Chris@16
|
548 {
|
Chris@16
|
549 this_type other(*this);
|
Chris@16
|
550 other.advance(off);
|
Chris@16
|
551 return other;
|
Chris@16
|
552 }
|
Chris@16
|
553
|
Chris@16
|
554 friend this_type operator+(difference_type off, const this_type& right)
|
Chris@16
|
555 { return right + off; }
|
Chris@16
|
556
|
Chris@16
|
557 this_type& operator-=(difference_type off)
|
Chris@16
|
558 { this->advance(-off); return *this; }
|
Chris@16
|
559
|
Chris@16
|
560 this_type operator-(difference_type off) const
|
Chris@16
|
561 { return *this + (-off); }
|
Chris@16
|
562
|
Chris@16
|
563 //This pseudo-iterator's dereference operations have no sense since value is not
|
Chris@16
|
564 //constructed until ::boost::container::construct_in_place is called.
|
Chris@16
|
565 //So comment them to catch bad uses
|
Chris@16
|
566 //const T& operator*() const;
|
Chris@16
|
567 //const T& operator[](difference_type) const;
|
Chris@16
|
568 //const T* operator->() const;
|
Chris@16
|
569
|
Chris@101
|
570 template<class Allocator>
|
Chris@101
|
571 void construct_in_place(Allocator &a, T* ptr)
|
Chris@16
|
572 { (*m_pe)(a, ptr); }
|
Chris@16
|
573
|
Chris@16
|
574 private:
|
Chris@16
|
575 difference_type m_num;
|
Chris@16
|
576 EmplaceFunctor * m_pe;
|
Chris@16
|
577
|
Chris@16
|
578 void increment()
|
Chris@16
|
579 { --m_num; }
|
Chris@16
|
580
|
Chris@16
|
581 void decrement()
|
Chris@16
|
582 { ++m_num; }
|
Chris@16
|
583
|
Chris@16
|
584 bool equal(const this_type &other) const
|
Chris@16
|
585 { return m_num == other.m_num; }
|
Chris@16
|
586
|
Chris@16
|
587 bool less(const this_type &other) const
|
Chris@16
|
588 { return other.m_num < m_num; }
|
Chris@16
|
589
|
Chris@16
|
590 const T & dereference() const
|
Chris@16
|
591 {
|
Chris@16
|
592 static T dummy;
|
Chris@16
|
593 return dummy;
|
Chris@16
|
594 }
|
Chris@16
|
595
|
Chris@16
|
596 void advance(difference_type n)
|
Chris@16
|
597 { m_num -= n; }
|
Chris@16
|
598
|
Chris@16
|
599 difference_type distance_to(const this_type &other)const
|
Chris@16
|
600 { return difference_type(m_num - other.m_num); }
|
Chris@16
|
601 };
|
Chris@16
|
602
|
Chris@101
|
603 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@16
|
604
|
Chris@16
|
605 template<class ...Args>
|
Chris@16
|
606 struct emplace_functor
|
Chris@16
|
607 {
|
Chris@16
|
608 typedef typename container_detail::build_number_seq<sizeof...(Args)>::type index_tuple_t;
|
Chris@16
|
609
|
Chris@101
|
610 emplace_functor(BOOST_FWD_REF(Args)... args)
|
Chris@16
|
611 : args_(args...)
|
Chris@16
|
612 {}
|
Chris@16
|
613
|
Chris@101
|
614 template<class Allocator, class T>
|
Chris@101
|
615 void operator()(Allocator &a, T *ptr)
|
Chris@16
|
616 { emplace_functor::inplace_impl(a, ptr, index_tuple_t()); }
|
Chris@16
|
617
|
Chris@101
|
618 template<class Allocator, class T, int ...IdxPack>
|
Chris@101
|
619 void inplace_impl(Allocator &a, T* ptr, const container_detail::index_tuple<IdxPack...>&)
|
Chris@16
|
620 {
|
Chris@101
|
621 allocator_traits<Allocator>::construct
|
Chris@16
|
622 (a, ptr, ::boost::forward<Args>(container_detail::get<IdxPack>(args_))...);
|
Chris@16
|
623 }
|
Chris@16
|
624
|
Chris@16
|
625 container_detail::tuple<Args&...> args_;
|
Chris@16
|
626 };
|
Chris@16
|
627
|
Chris@101
|
628 #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@16
|
629
|
Chris@101
|
630 #define BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE(N) \
|
Chris@101
|
631 BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
|
Chris@101
|
632 struct emplace_functor##N\
|
Chris@101
|
633 {\
|
Chris@101
|
634 explicit emplace_functor##N( BOOST_MOVE_UREF##N )\
|
Chris@101
|
635 BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\
|
Chris@101
|
636 \
|
Chris@101
|
637 template<class Allocator, class T>\
|
Chris@101
|
638 void operator()(Allocator &a, T *ptr)\
|
Chris@101
|
639 { allocator_traits<Allocator>::construct(a, ptr BOOST_MOVE_I##N BOOST_MOVE_MFWD##N); }\
|
Chris@101
|
640 \
|
Chris@101
|
641 BOOST_MOVE_MREF##N\
|
Chris@101
|
642 };\
|
Chris@101
|
643 //
|
Chris@101
|
644 BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE)
|
Chris@101
|
645 #undef BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE
|
Chris@16
|
646
|
Chris@16
|
647 #endif
|
Chris@16
|
648
|
Chris@16
|
649 namespace container_detail {
|
Chris@16
|
650
|
Chris@16
|
651 template<class T>
|
Chris@16
|
652 struct has_iterator_category
|
Chris@16
|
653 {
|
Chris@16
|
654 template <typename X>
|
Chris@16
|
655 static char test(int, typename X::iterator_category*);
|
Chris@16
|
656
|
Chris@16
|
657 template <typename X>
|
Chris@16
|
658 static int test(int, ...);
|
Chris@16
|
659
|
Chris@16
|
660 static const bool value = (1 == sizeof(test<T>(0, 0)));
|
Chris@16
|
661 };
|
Chris@16
|
662
|
Chris@16
|
663
|
Chris@16
|
664 template<class T, bool = has_iterator_category<T>::value >
|
Chris@16
|
665 struct is_input_iterator
|
Chris@16
|
666 {
|
Chris@16
|
667 static const bool value = is_same<typename T::iterator_category, std::input_iterator_tag>::value;
|
Chris@16
|
668 };
|
Chris@16
|
669
|
Chris@16
|
670 template<class T>
|
Chris@16
|
671 struct is_input_iterator<T, false>
|
Chris@16
|
672 {
|
Chris@16
|
673 static const bool value = false;
|
Chris@16
|
674 };
|
Chris@16
|
675
|
Chris@16
|
676 template<class T, bool = has_iterator_category<T>::value >
|
Chris@16
|
677 struct is_forward_iterator
|
Chris@16
|
678 {
|
Chris@16
|
679 static const bool value = is_same<typename T::iterator_category, std::forward_iterator_tag>::value;
|
Chris@16
|
680 };
|
Chris@16
|
681
|
Chris@16
|
682 template<class T>
|
Chris@16
|
683 struct is_forward_iterator<T, false>
|
Chris@16
|
684 {
|
Chris@16
|
685 static const bool value = false;
|
Chris@16
|
686 };
|
Chris@16
|
687
|
Chris@16
|
688 template<class T, bool = has_iterator_category<T>::value >
|
Chris@16
|
689 struct is_bidirectional_iterator
|
Chris@16
|
690 {
|
Chris@16
|
691 static const bool value = is_same<typename T::iterator_category, std::bidirectional_iterator_tag>::value;
|
Chris@16
|
692 };
|
Chris@16
|
693
|
Chris@16
|
694 template<class T>
|
Chris@16
|
695 struct is_bidirectional_iterator<T, false>
|
Chris@16
|
696 {
|
Chris@16
|
697 static const bool value = false;
|
Chris@16
|
698 };
|
Chris@16
|
699
|
Chris@101
|
700 template<class IINodeType>
|
Chris@101
|
701 struct iiterator_node_value_type {
|
Chris@101
|
702 typedef typename IINodeType::value_type type;
|
Chris@101
|
703 };
|
Chris@101
|
704
|
Chris@16
|
705 template<class IIterator>
|
Chris@16
|
706 struct iiterator_types
|
Chris@16
|
707 {
|
Chris@16
|
708 typedef typename IIterator::value_type it_value_type;
|
Chris@101
|
709 typedef typename iiterator_node_value_type<it_value_type>::type value_type;
|
Chris@101
|
710 typedef typename boost::container::iterator_traits<IIterator>::pointer it_pointer;
|
Chris@101
|
711 typedef typename boost::container::iterator_traits<IIterator>::difference_type difference_type;
|
Chris@16
|
712 typedef typename ::boost::intrusive::pointer_traits<it_pointer>::
|
Chris@16
|
713 template rebind_pointer<value_type>::type pointer;
|
Chris@16
|
714 typedef typename ::boost::intrusive::pointer_traits<it_pointer>::
|
Chris@16
|
715 template rebind_pointer<const value_type>::type const_pointer;
|
Chris@16
|
716 typedef typename ::boost::intrusive::
|
Chris@16
|
717 pointer_traits<pointer>::reference reference;
|
Chris@16
|
718 typedef typename ::boost::intrusive::
|
Chris@16
|
719 pointer_traits<const_pointer>::reference const_reference;
|
Chris@16
|
720 typedef typename IIterator::iterator_category iterator_category;
|
Chris@16
|
721 };
|
Chris@16
|
722
|
Chris@16
|
723 template<class IIterator, bool IsConst>
|
Chris@101
|
724 struct iterator_types
|
Chris@16
|
725 {
|
Chris@101
|
726 typedef typename ::boost::container::iterator
|
Chris@16
|
727 < typename iiterator_types<IIterator>::iterator_category
|
Chris@16
|
728 , typename iiterator_types<IIterator>::value_type
|
Chris@16
|
729 , typename iiterator_types<IIterator>::difference_type
|
Chris@16
|
730 , typename iiterator_types<IIterator>::const_pointer
|
Chris@16
|
731 , typename iiterator_types<IIterator>::const_reference> type;
|
Chris@16
|
732 };
|
Chris@16
|
733
|
Chris@16
|
734 template<class IIterator>
|
Chris@101
|
735 struct iterator_types<IIterator, false>
|
Chris@16
|
736 {
|
Chris@101
|
737 typedef typename ::boost::container::iterator
|
Chris@16
|
738 < typename iiterator_types<IIterator>::iterator_category
|
Chris@16
|
739 , typename iiterator_types<IIterator>::value_type
|
Chris@16
|
740 , typename iiterator_types<IIterator>::difference_type
|
Chris@16
|
741 , typename iiterator_types<IIterator>::pointer
|
Chris@16
|
742 , typename iiterator_types<IIterator>::reference> type;
|
Chris@16
|
743 };
|
Chris@16
|
744
|
Chris@16
|
745 template<class IIterator, bool IsConst>
|
Chris@101
|
746 class iterator_from_iiterator
|
Chris@16
|
747 {
|
Chris@101
|
748 typedef typename iterator_types<IIterator, IsConst>::type types_t;
|
Chris@16
|
749
|
Chris@16
|
750 public:
|
Chris@101
|
751 typedef typename types_t::pointer pointer;
|
Chris@101
|
752 typedef typename types_t::reference reference;
|
Chris@101
|
753 typedef typename types_t::difference_type difference_type;
|
Chris@101
|
754 typedef typename types_t::iterator_category iterator_category;
|
Chris@101
|
755 typedef typename types_t::value_type value_type;
|
Chris@16
|
756
|
Chris@101
|
757 iterator_from_iiterator()
|
Chris@16
|
758 {}
|
Chris@16
|
759
|
Chris@101
|
760 explicit iterator_from_iiterator(IIterator iit) BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
761 : m_iit(iit)
|
Chris@16
|
762 {}
|
Chris@16
|
763
|
Chris@101
|
764 iterator_from_iiterator(iterator_from_iiterator<IIterator, false> const& other) BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
765 : m_iit(other.get())
|
Chris@16
|
766 {}
|
Chris@16
|
767
|
Chris@101
|
768 iterator_from_iiterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
769 { ++this->m_iit; return *this; }
|
Chris@16
|
770
|
Chris@101
|
771 iterator_from_iiterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
772 {
|
Chris@101
|
773 iterator_from_iiterator result (*this);
|
Chris@16
|
774 ++this->m_iit;
|
Chris@16
|
775 return result;
|
Chris@16
|
776 }
|
Chris@16
|
777
|
Chris@101
|
778 iterator_from_iiterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
779 {
|
Chris@101
|
780 //If the iterator_from_iiterator is not a bidirectional iterator, operator-- should not exist
|
Chris@101
|
781 BOOST_STATIC_ASSERT((is_bidirectional_iterator<iterator_from_iiterator>::value));
|
Chris@16
|
782 --this->m_iit; return *this;
|
Chris@16
|
783 }
|
Chris@16
|
784
|
Chris@101
|
785 iterator_from_iiterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
786 {
|
Chris@101
|
787 iterator_from_iiterator result (*this);
|
Chris@16
|
788 --this->m_iit;
|
Chris@16
|
789 return result;
|
Chris@16
|
790 }
|
Chris@16
|
791
|
Chris@101
|
792 friend bool operator== (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
793 { return l.m_iit == r.m_iit; }
|
Chris@16
|
794
|
Chris@101
|
795 friend bool operator!= (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
796 { return !(l == r); }
|
Chris@16
|
797
|
Chris@101
|
798 reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
799 { return (*this->m_iit).get_data(); }
|
Chris@16
|
800
|
Chris@101
|
801 pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
802 { return ::boost::intrusive::pointer_traits<pointer>::pointer_to(this->operator*()); }
|
Chris@16
|
803
|
Chris@101
|
804 const IIterator &get() const BOOST_NOEXCEPT_OR_NOTHROW
|
Chris@16
|
805 { return this->m_iit; }
|
Chris@16
|
806
|
Chris@16
|
807 private:
|
Chris@16
|
808 IIterator m_iit;
|
Chris@16
|
809 };
|
Chris@16
|
810
|
Chris@16
|
811 } //namespace container_detail {
|
Chris@101
|
812
|
Chris@101
|
813 using ::boost::intrusive::reverse_iterator;
|
Chris@101
|
814
|
Chris@16
|
815 } //namespace container {
|
Chris@16
|
816 } //namespace boost {
|
Chris@16
|
817
|
Chris@16
|
818 #include <boost/container/detail/config_end.hpp>
|
Chris@16
|
819
|
Chris@16
|
820 #endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP
|