Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
_iterator.h
Go to the documentation of this file.
1
45#ifndef _RWSTD_RW_ITERATOR_H_INCLUDED
46#define _RWSTD_RW_ITERATOR_H_INCLUDED
47
48#ifndef _RWSTD_RW_ITERBASE_H_INCLUDED
49# include <rw/_iterbase.h>
50#endif // _RWSTD_RW_ITERBASE_H_INCLUDED
51
52
54
55
56// Reverse iterator.
57
58//
59// Macros for reverse iterators to accomodate non-standard compilers
60//
61#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
62# define _RWSTD_ITER_TEMPLATE template <class _Iterator>
63# define _RWSTD_ITER_ID(i) i <_Iterator>
64# define _RWSTD_ITER_DIFF_TYPE(i, ignore) \
65 typename iterator_traits<_Iterator>::difference_type
66#else
67# define _RWSTD_ITER_TEMPLATE \
68 template <class _Iterator, class _Category, class _TypeT, \
69 class _Reference, class _Pointer, class _Distance>
70# define _RWSTD_ITER_ID(i) \
71 i <_Iterator, _Category, _TypeT, _Reference, _Pointer, _Distance>
72# define _RWSTD_ITER_DIFF_TYPE(ignore, distance) distance
73#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
74
75
76#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
77
78template <class _Iterator>
79class reverse_iterator
80 : public iterator<typename iterator_traits<_Iterator>::iterator_category,
81 typename iterator_traits<_Iterator>::value_type,
82 typename iterator_traits<_Iterator>::difference_type,
83 typename iterator_traits<_Iterator>::pointer,
84 typename iterator_traits<_Iterator>::reference>
85{
86 typedef iterator_traits<_Iterator> traits_type;
87public:
88 typedef typename traits_type::difference_type difference_type;
89 typedef typename traits_type::value_type value_type;
90 typedef typename traits_type::pointer pointer;
91 typedef typename traits_type::reference reference;
92
93#else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
94
95template <class _Iterator, class _Category, class _TypeT,
96 class _Reference = _TypeT&,
97 class _Pointer = _TypeT*,
98 class _Distance = _RWSTD_PTRDIFF_T>
99class reverse_iterator
100 : public iterator<_Category, _TypeT, _Distance, _Pointer, _Reference>
101
102{
103public:
104 typedef _Distance difference_type;
105 typedef _TypeT value_type;
106 typedef _Reference reference;
107 typedef _Pointer pointer;
108
109#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
110
111 typedef _Iterator iterator_type;
112
113 reverse_iterator () { }
114
115 // 24.4.1.3.1, p1
116 explicit reverse_iterator (iterator_type __rhs) : current (__rhs) { }
117
118
119#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
120
121 // 24.4.1.3.1, p2
122 template <class _TypeU>
123 reverse_iterator (const reverse_iterator<_TypeU>& __rhs)
124 : current (__rhs.base ()) { }
125
126#else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
127
128 // 24.4.1.3.1, p2
129 template <class _Iterator2, class _Category2, class _TypeU,
130 class _Reference2, class _Pointer2, class _Distance2>
131 reverse_iterator (const reverse_iterator<_Iterator2, _Category2, _TypeU,
132 _Reference2, _Pointer2, _Distance2>& __rhs)
133 : current (__rhs.base ()) { }
134
135#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
136
137
138 // 24.4.1.3.2, p1
139 iterator_type base () const {
140 return current;
141 }
142
143 // 24.4.1.3.3, p1
144 reference operator* () const {
145 iterator_type __tmp (base ());
146 return *--__tmp;
147 }
148
149 // 24.4.1.3.4, p1
150 _RWSTD_OPERATOR_ARROW (pointer operator->() const);
151
152 // 24.4.1.3.5, p1
153 reverse_iterator& operator++ () {
154 return --current, *this;
155 }
156
157 // 24.4.1.3.5, p3
158 reverse_iterator operator++ (int) {
159 reverse_iterator __tmp (*this);
160 return ++*this, __tmp;
161 }
162
163 // 24.4.1.3.6, p1
164 reverse_iterator& operator-- () {
165 return ++current, *this;
166 }
167
168 // 24.4.1.3.6, p3
169 reverse_iterator operator-- (int) {
170 reverse_iterator __tmp (*this);
171 return --*this, __tmp;
172 }
173
174 // 24.4.1.3.8, p1
175 reverse_iterator& operator+= (difference_type __n) {
176 return current -= __n, *this;
177 }
178
179 // 24.4.1.3.10, p1
180 reverse_iterator& operator-= (difference_type __n) {
181 return *this += -__n;
182 }
183
184 // 24.4.1.3.7, p1
185 reverse_iterator operator+ (difference_type __n) const {
186 return reverse_iterator (*this) += __n;
187 }
188
189 // 24.4.1.3.9, p1
190 reverse_iterator operator- (difference_type __n) const {
191 return reverse_iterator (*this) -= __n;
192 }
193
194 // 24.4.1.3.11, p1
195 reference operator[] (difference_type __n) const {
196 return *(*this + __n);
197 }
198
199protected:
200
201 iterator_type current;
202};
203
204
205// 24.4.1.3.12
207inline bool operator== (const _RWSTD_ITER_ID (reverse_iterator)& __x,
208 const _RWSTD_ITER_ID (reverse_iterator)& __y)
209{
210 return __x.base () == __y.base ();
211}
212
213
214// 24.4.1.3.13
216inline bool operator< (const _RWSTD_ITER_ID (reverse_iterator)& __x,
217 const _RWSTD_ITER_ID (reverse_iterator)& __y)
218{
219 return __y.base() < __x.base();
220}
221
222
223// 24.4.1.3.14
225inline bool operator!= (const _RWSTD_ITER_ID (reverse_iterator)& __x,
226 const _RWSTD_ITER_ID (reverse_iterator)& __y)
227{
228 return !(__x == __y);
229}
230
231
232// 24.4.1.3.15
234inline bool operator> (const _RWSTD_ITER_ID (reverse_iterator)& __x,
235 const _RWSTD_ITER_ID (reverse_iterator)& __y)
236{
237 return __y < __x;
238}
239
240
241// 24.4.1.3.16
243inline bool operator>= (const _RWSTD_ITER_ID (reverse_iterator)& __x,
244 const _RWSTD_ITER_ID (reverse_iterator)& __y)
245{
246 return !(__x < __y);
247}
248
249
250// 24.4.1.3.17
252inline bool operator<= (const _RWSTD_ITER_ID (reverse_iterator)& __x,
253 const _RWSTD_ITER_ID (reverse_iterator)& __y)
254{
255 return !(__y < __x);
256}
257
258
259// 24.4.1.3.18
261inline _RWSTD_ITER_DIFF_TYPE (_Iterator, _Distance)
262operator- (const _RWSTD_ITER_ID (reverse_iterator)& __x,
263 const _RWSTD_ITER_ID (reverse_iterator)& __y)
264{
265 return __y.base () - __x.base ();
266}
267
268
269// 24.4.1.3.19
271inline _RWSTD_ITER_ID (reverse_iterator)
272operator+ (_RWSTD_ITER_DIFF_TYPE (_Iterator, _Distance) __n,
273 const _RWSTD_ITER_ID (reverse_iterator)& __x)
274{
275 return __x + __n;
276}
277
278#undef _RWSTD_ITER_DIFF_TYPE
279
280#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
281
282} // namespace std
283
285
286// Reverse bidirectional iterator.
287// This is needed to get around non-standard compilers that insist
288// on instantiating all members of a class whether they're used
289// or not.
290
291template <class _Iterator, class _Category, class _TypeT,
292 class _Reference = _TypeT&,
293 class _Pointer = _TypeT*,
294 class _Distance = _RWSTD_PTRDIFF_T>
295class __reverse_bi_iterator
296 : public _STD::iterator<_Category, _TypeT, _Distance, _Pointer, _Reference>
297{
298public:
299 typedef _Distance difference_type;
300 typedef _TypeT value_type;
301 typedef _Reference reference;
302 typedef _Pointer pointer;
303 typedef _Iterator iterator_type;
304
305 __reverse_bi_iterator () { }
306
307 explicit __reverse_bi_iterator (const iterator_type &__rhs)
308 : current (__rhs) { }
309
310
311#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
312
313 template <class _TypeU>
314 __reverse_bi_iterator (const __reverse_bi_iterator<_TypeU>& __rhs)
315 : current (__rhs.base ()) { }
316
317#else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC )
318
319 template <class _Iterator2, class _Category2, class _TypeU,
320 class _Reference2, class _Pointer2, class _Distance2>
321 __reverse_bi_iterator (const __reverse_bi_iterator<_Iterator2,
322 _Category2,
323 _TypeU,
324 _Reference2,
325 _Pointer2,
326 _Distance2>& __rhs)
327 : current (__rhs.base ()) { }
328#endif
329
330
331 iterator_type base () const {
332 return current;
333 }
334
335 reference operator* () const {
336 iterator_type __tmp = base ();
337 return *--__tmp;
338 }
339
340 _RWSTD_OPERATOR_ARROW (pointer operator->() const);
341
342 __reverse_bi_iterator& operator++ () {
343 return --current, *this;
344 }
345
346 __reverse_bi_iterator operator++ (int) {
347 __reverse_bi_iterator __tmp (*this);
348 ++*this;
349 return __tmp;
350 }
351
352 __reverse_bi_iterator& operator-- () {
353 return ++current, *this;
354 }
355
356 __reverse_bi_iterator operator-- (int) {
357 __reverse_bi_iterator __tmp (*this);
358 --*this;
359 return __tmp;
360 }
361
362protected:
363
364 iterator_type current;
365};
366
367
369inline bool operator== (const _RWSTD_ITER_ID (__reverse_bi_iterator)& __x,
370 const _RWSTD_ITER_ID (__reverse_bi_iterator)& __y)
371{
372 return __x.base () == __y.base ();
373}
374
375
377inline bool operator!= (const _RWSTD_ITER_ID (__reverse_bi_iterator)& __x,
378 const _RWSTD_ITER_ID (__reverse_bi_iterator)& __y)
379{
380 return !(__x == __y);
381}
382
383#undef _RWSTD_ITER_TEMPLATE
384#undef _RWSTD_ITER_ID
385
386} // namespace __rw
387
389
390#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
391
392
393#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
394# define _RWSTD_INSERT_ITERATOR_BASE(ignore) \
395 iterator<output_iterator_tag, void, void, void, void>
396#else
397 // necessary to allow __iterator_category, __value_type, etc. to work
398# define _RWSTD_INSERT_ITERATOR_BASE(cont) \
399 iterator<output_iterator_tag, \
400 typename cont::value_type, \
401 typename cont::difference_type, \
402 typename cont::pointer, \
403 typename cont::reference>
404#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
405
406
407template <class _Container>
408class back_insert_iterator: public _RWSTD_INSERT_ITERATOR_BASE (_Container)
409{
410public:
411 typedef _Container container_type;
412
413 explicit back_insert_iterator (container_type& __rhs)
414 : container (&__rhs) { }
415
416 back_insert_iterator&
417 operator= (typename container_type::const_reference __x) {
418 return container->push_back (__x), *this;
419 }
420
421 back_insert_iterator& operator* () {
422 return *this;
423 }
424
425 back_insert_iterator& operator++ () {
426 return *this;
427 }
428
429 back_insert_iterator operator++ (int) {
430 return *this;
431 }
432
433protected:
434
435 container_type* container;
436};
437
438
439template <class _Container>
440inline back_insert_iterator<_Container> back_inserter (_Container& __x)
441{
442 return back_insert_iterator<_Container>(__x);
443}
444
445
446template <class _Container>
447class front_insert_iterator: public _RWSTD_INSERT_ITERATOR_BASE (_Container)
448{
449public:
450 typedef _Container container_type;
451
452 explicit front_insert_iterator (container_type& __rhs)
453 : container (&__rhs) { }
454
455 front_insert_iterator&
456 operator= (typename container_type::const_reference __x) {
457 return container->push_front (__x), *this;
458 }
459
460 front_insert_iterator& operator* () {
461 return *this;
462 }
463
464 front_insert_iterator& operator++ () {
465 return *this;
466 }
467
468 front_insert_iterator operator++ (int) {
469 return *this;
470 }
471
472protected:
473
474 container_type* container;
475};
476
477
478template <class _Container>
479inline front_insert_iterator<_Container> front_inserter (_Container& __x)
480{
481 return front_insert_iterator<_Container>(__x);
482}
483
484
485template <class _Container>
486class insert_iterator: public _RWSTD_INSERT_ITERATOR_BASE (_Container)
487{
488public:
489 typedef _Container container_type;
490
491 insert_iterator (container_type &__x,
492 typename container_type::iterator __it)
493 : iter (__it), container (&__x) { }
494
495 insert_iterator&
496 operator= (typename container_type::const_reference __x) {
497 iter = container->insert (iter, __x);
498 return ++iter, *this;
499 }
500
501 insert_iterator& operator* () {
502 return *this;
503 }
504
505 insert_iterator& operator++ () {
506 return *this;
507 }
508
509 insert_iterator& operator++ (int) {
510 return *this;
511 }
512
513protected:
514
515 typename container_type::iterator iter;
516 container_type* container;
517};
518
519
520template <class _Container, class _Iterator>
521inline insert_iterator<_Container> inserter (_Container& __x, _Iterator __it)
522{
523 typedef typename _Container::iterator _Iter;
524
525 return insert_iterator<_Container> (__x, _Iter (__it));
526}
527
528
529} // namespace std
530
531#endif // _RWSTD_RW_ITERATOR_H_INCLUDED
const minus< T > & operator-(const minus< T > &lhs, const minus< T > &rhs)
const plus_asgn< T > & operator*(const plus_asgn< T > &lhs, const plus_asgn< T > &rhs)
void operator+(typename A< T >::I, const A< T > &)
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define _RWSTD_OPERATOR_ARROW(signature)
Definition _defs.h:965
#define _RWSTD_ITER_ID(i)
#define _RWSTD_ITER_TEMPLATE
#define _RWSTD_INSERT_ITERATOR_BASE(ignore)
#define _RWSTD_ITER_DIFF_TYPE(i, ignore)
bool operator>(const DistancePair &lhs, const DistancePair &rhs)
Definition graph.cpp:47
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14737
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14762
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
Definition json.h:14787
Definition json.h:5363
Helper class for suppressing move-construction in single-argument array constructors.