1 : // Iterators -*- C++ -*-
2 :
3 : // Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 2, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // You should have received a copy of the GNU General Public License along
17 : // with this library; see the file COPYING. If not, write to the Free
18 : // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19 : // USA.
20 :
21 : // As a special exception, you may use this file as part of a free software
22 : // library without restriction. Specifically, if other files instantiate
23 : // templates or use macros or inline functions from this file, or you compile
24 : // this file and link it with other files to produce an executable, this
25 : // file does not by itself cause the resulting executable to be covered by
26 : // the GNU General Public License. This exception does not however
27 : // invalidate any other reasons why the executable file might be covered by
28 : // the GNU General Public License.
29 :
30 : /*
31 : *
32 : * Copyright (c) 1994
33 : * Hewlett-Packard Company
34 : *
35 : * Permission to use, copy, modify, distribute and sell this software
36 : * and its documentation for any purpose is hereby granted without fee,
37 : * provided that the above copyright notice appear in all copies and
38 : * that both that copyright notice and this permission notice appear
39 : * in supporting documentation. Hewlett-Packard Company makes no
40 : * representations about the suitability of this software for any
41 : * purpose. It is provided "as is" without express or implied warranty.
42 : *
43 : *
44 : * Copyright (c) 1996-1998
45 : * Silicon Graphics Computer Systems, Inc.
46 : *
47 : * Permission to use, copy, modify, distribute and sell this software
48 : * and its documentation for any purpose is hereby granted without fee,
49 : * provided that the above copyright notice appear in all copies and
50 : * that both that copyright notice and this permission notice appear
51 : * in supporting documentation. Silicon Graphics makes no
52 : * representations about the suitability of this software for any
53 : * purpose. It is provided "as is" without express or implied warranty.
54 : */
55 :
56 : /** @file stl_iterator.h
57 : * This is an internal header file, included by other library headers.
58 : * You should not attempt to use it directly.
59 : *
60 : * This file implements reverse_iterator, back_insert_iterator,
61 : * front_insert_iterator, insert_iterator, __normal_iterator, and their
62 : * supporting functions and overloaded operators.
63 : */
64 :
65 : #ifndef _ITERATOR_H
66 : #define _ITERATOR_H 1
67 :
68 : #include <bits/cpp_type_traits.h>
69 :
70 : namespace std
71 : {
72 : // 24.4.1 Reverse iterators
73 : /**
74 : * "Bidirectional and random access iterators have corresponding reverse
75 : * %iterator adaptors that iterate through the data structure in the
76 : * opposite direction. They have the same signatures as the corresponding
77 : * iterators. The fundamental relation between a reverse %iterator and its
78 : * corresponding %iterator @c i is established by the identity:
79 : * @code
80 : * &*(reverse_iterator(i)) == &*(i - 1)
81 : * @endcode
82 : *
83 : * This mapping is dictated by the fact that while there is always a
84 : * pointer past the end of an array, there might not be a valid pointer
85 : * before the beginning of an array." [24.4.1]/1,2
86 : *
87 : * Reverse iterators can be tricky and surprising at first. Their
88 : * semantics make sense, however, and the trickiness is a side effect of
89 : * the requirement that the iterators must be safe.
90 : */
91 : template<typename _Iterator>
92 : class reverse_iterator
93 : : public iterator<typename iterator_traits<_Iterator>::iterator_category,
94 : typename iterator_traits<_Iterator>::value_type,
95 : typename iterator_traits<_Iterator>::difference_type,
96 : typename iterator_traits<_Iterator>::pointer,
97 : typename iterator_traits<_Iterator>::reference>
98 : {
99 : protected:
100 : _Iterator current;
101 :
102 : public:
103 : typedef _Iterator iterator_type;
104 : typedef typename iterator_traits<_Iterator>::difference_type
105 : difference_type;
106 : typedef typename iterator_traits<_Iterator>::reference reference;
107 : typedef typename iterator_traits<_Iterator>::pointer pointer;
108 :
109 : public:
110 : /**
111 : * The default constructor default-initializes member @p current.
112 : * If it is a pointer, that means it is zero-initialized.
113 : */
114 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
115 : // 235 No specification of default ctor for reverse_iterator
116 : reverse_iterator() : current() { }
117 :
118 : /**
119 : * This %iterator will move in the opposite direction that @p x does.
120 : */
121 : explicit
122 937 : reverse_iterator(iterator_type __x) : current(__x) { }
123 :
124 : /**
125 : * The copy constructor is normal.
126 : */
127 375 : reverse_iterator(const reverse_iterator& __x)
128 375 : : current(__x.current) { }
129 :
130 : /**
131 : * A reverse_iterator across other types can be copied in the normal
132 : * fashion.
133 : */
134 : template<typename _Iter>
135 : reverse_iterator(const reverse_iterator<_Iter>& __x)
136 : : current(__x.base()) { }
137 :
138 : /**
139 : * @return @c current, the %iterator used for underlying work.
140 : */
141 : iterator_type
142 1312 : base() const
143 1312 : { return current; }
144 :
145 : /**
146 : * @return TODO
147 : *
148 : * @doctodo
149 : */
150 : reference
151 375 : operator*() const
152 : {
153 375 : _Iterator __tmp = current;
154 375 : return *--__tmp;
155 : }
156 :
157 : /**
158 : * @return TODO
159 : *
160 : * @doctodo
161 : */
162 : pointer
163 : operator->() const
164 : { return &(operator*()); }
165 :
166 : /**
167 : * @return TODO
168 : *
169 : * @doctodo
170 : */
171 : reverse_iterator&
172 : operator++()
173 : {
174 : --current;
175 : return *this;
176 : }
177 :
178 : /**
179 : * @return TODO
180 : *
181 : * @doctodo
182 : */
183 : reverse_iterator
184 375 : operator++(int)
185 : {
186 375 : reverse_iterator __tmp = *this;
187 375 : --current;
188 : return __tmp;
189 : }
190 :
191 : /**
192 : * @return TODO
193 : *
194 : * @doctodo
195 : */
196 : reverse_iterator&
197 : operator--()
198 : {
199 : ++current;
200 : return *this;
201 : }
202 :
203 : /**
204 : * @return TODO
205 : *
206 : * @doctodo
207 : */
208 : reverse_iterator
209 : operator--(int)
210 : {
211 : reverse_iterator __tmp = *this;
212 : ++current;
213 : return __tmp;
214 : }
215 :
216 : /**
217 : * @return TODO
218 : *
219 : * @doctodo
220 : */
221 : reverse_iterator
222 : operator+(difference_type __n) const
223 : { return reverse_iterator(current - __n); }
224 :
225 : /**
226 : * @return TODO
227 : *
228 : * @doctodo
229 : */
230 : reverse_iterator&
231 : operator+=(difference_type __n)
232 : {
233 : current -= __n;
234 : return *this;
235 : }
236 :
237 : /**
238 : * @return TODO
239 : *
240 : * @doctodo
241 : */
242 : reverse_iterator
243 : operator-(difference_type __n) const
244 : { return reverse_iterator(current + __n); }
245 :
246 : /**
247 : * @return TODO
248 : *
249 : * @doctodo
250 : */
251 : reverse_iterator&
252 : operator-=(difference_type __n)
253 : {
254 : current += __n;
255 : return *this;
256 : }
257 :
258 : /**
259 : * @return TODO
260 : *
261 : * @doctodo
262 : */
263 : reference
264 : operator[](difference_type __n) const
265 : { return *(*this + __n); }
266 : };
267 :
268 : //@{
269 : /**
270 : * @param x A %reverse_iterator.
271 : * @param y A %reverse_iterator.
272 : * @return A simple bool.
273 : *
274 : * Reverse iterators forward many operations to their underlying base()
275 : * iterators. Others are implemented in terms of one another.
276 : *
277 : */
278 : template<typename _Iterator>
279 : inline bool
280 : operator==(const reverse_iterator<_Iterator>& __x,
281 656 : const reverse_iterator<_Iterator>& __y)
282 656 : { return __x.base() == __y.base(); }
283 :
284 : template<typename _Iterator>
285 : inline bool
286 : operator<(const reverse_iterator<_Iterator>& __x,
287 : const reverse_iterator<_Iterator>& __y)
288 : { return __y.base() < __x.base(); }
289 :
290 : template<typename _Iterator>
291 : inline bool
292 : operator!=(const reverse_iterator<_Iterator>& __x,
293 656 : const reverse_iterator<_Iterator>& __y)
294 656 : { return !(__x == __y); }
295 :
296 : template<typename _Iterator>
297 : inline bool
298 : operator>(const reverse_iterator<_Iterator>& __x,
299 : const reverse_iterator<_Iterator>& __y)
300 : { return __y < __x; }
301 :
302 : template<typename _Iterator>
303 : inline bool
304 : operator<=(const reverse_iterator<_Iterator>& __x,
305 : const reverse_iterator<_Iterator>& __y)
306 : { return !(__y < __x); }
307 :
308 : template<typename _Iterator>
309 : inline bool
310 : operator>=(const reverse_iterator<_Iterator>& __x,
311 : const reverse_iterator<_Iterator>& __y)
312 : { return !(__x < __y); }
313 :
314 : template<typename _Iterator>
315 : inline typename reverse_iterator<_Iterator>::difference_type
316 : operator-(const reverse_iterator<_Iterator>& __x,
317 : const reverse_iterator<_Iterator>& __y)
318 : { return __y.base() - __x.base(); }
319 :
320 : template<typename _Iterator>
321 : inline reverse_iterator<_Iterator>
322 : operator+(typename reverse_iterator<_Iterator>::difference_type __n,
323 : const reverse_iterator<_Iterator>& __x)
324 : { return reverse_iterator<_Iterator>(__x.base() - __n); }
325 :
326 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
327 : // DR 280. Comparison of reverse_iterator to const reverse_iterator.
328 : template<typename _IteratorL, typename _IteratorR>
329 : inline bool
330 : operator==(const reverse_iterator<_IteratorL>& __x,
331 : const reverse_iterator<_IteratorR>& __y)
332 : { return __x.base() == __y.base(); }
333 :
334 : template<typename _IteratorL, typename _IteratorR>
335 : inline bool
336 : operator<(const reverse_iterator<_IteratorL>& __x,
337 : const reverse_iterator<_IteratorR>& __y)
338 : { return __y.base() < __x.base(); }
339 :
340 : template<typename _IteratorL, typename _IteratorR>
341 : inline bool
342 : operator!=(const reverse_iterator<_IteratorL>& __x,
343 : const reverse_iterator<_IteratorR>& __y)
344 : { return !(__x == __y); }
345 :
346 : template<typename _IteratorL, typename _IteratorR>
347 : inline bool
348 : operator>(const reverse_iterator<_IteratorL>& __x,
349 : const reverse_iterator<_IteratorR>& __y)
350 : { return __y < __x; }
351 :
352 : template<typename _IteratorL, typename _IteratorR>
353 : inline bool
354 : operator<=(const reverse_iterator<_IteratorL>& __x,
355 : const reverse_iterator<_IteratorR>& __y)
356 : { return !(__y < __x); }
357 :
358 : template<typename _IteratorL, typename _IteratorR>
359 : inline bool
360 : operator>=(const reverse_iterator<_IteratorL>& __x,
361 : const reverse_iterator<_IteratorR>& __y)
362 : { return !(__x < __y); }
363 :
364 : template<typename _IteratorL, typename _IteratorR>
365 : inline typename reverse_iterator<_IteratorL>::difference_type
366 : operator-(const reverse_iterator<_IteratorL>& __x,
367 : const reverse_iterator<_IteratorR>& __y)
368 : { return __y.base() - __x.base(); }
369 : //@}
370 :
371 : // 24.4.2.2.1 back_insert_iterator
372 : /**
373 : * @brief Turns assignment into insertion.
374 : *
375 : * These are output iterators, constructed from a container-of-T.
376 : * Assigning a T to the iterator appends it to the container using
377 : * push_back.
378 : *
379 : * Tip: Using the back_inserter function to create these iterators can
380 : * save typing.
381 : */
382 : template<typename _Container>
383 : class back_insert_iterator
384 : : public iterator<output_iterator_tag, void, void, void, void>
385 : {
386 : protected:
387 : _Container* container;
388 :
389 : public:
390 : /// A nested typedef for the type of whatever container you used.
391 : typedef _Container container_type;
392 :
393 : /// The only way to create this %iterator is with a container.
394 : explicit
395 : back_insert_iterator(_Container& __x) : container(&__x) { }
396 :
397 : /**
398 : * @param value An instance of whatever type
399 : * container_type::const_reference is; presumably a
400 : * reference-to-const T for container<T>.
401 : * @return This %iterator, for chained operations.
402 : *
403 : * This kind of %iterator doesn't really have a "position" in the
404 : * container (you can think of the position as being permanently at
405 : * the end, if you like). Assigning a value to the %iterator will
406 : * always append the value to the end of the container.
407 : */
408 : back_insert_iterator&
409 : operator=(typename _Container::const_reference __value)
410 : {
411 : container->push_back(__value);
412 : return *this;
413 : }
414 :
415 : /// Simply returns *this.
416 : back_insert_iterator&
417 : operator*()
418 : { return *this; }
419 :
420 : /// Simply returns *this. (This %iterator does not "move".)
421 : back_insert_iterator&
422 : operator++()
423 : { return *this; }
424 :
425 : /// Simply returns *this. (This %iterator does not "move".)
426 : back_insert_iterator
427 : operator++(int)
428 : { return *this; }
429 : };
430 :
431 : /**
432 : * @param x A container of arbitrary type.
433 : * @return An instance of back_insert_iterator working on @p x.
434 : *
435 : * This wrapper function helps in creating back_insert_iterator instances.
436 : * Typing the name of the %iterator requires knowing the precise full
437 : * type of the container, which can be tedious and impedes generic
438 : * programming. Using this function lets you take advantage of automatic
439 : * template parameter deduction, making the compiler match the correct
440 : * types for you.
441 : */
442 : template<typename _Container>
443 : inline back_insert_iterator<_Container>
444 : back_inserter(_Container& __x)
445 : { return back_insert_iterator<_Container>(__x); }
446 :
447 : /**
448 : * @brief Turns assignment into insertion.
449 : *
450 : * These are output iterators, constructed from a container-of-T.
451 : * Assigning a T to the iterator prepends it to the container using
452 : * push_front.
453 : *
454 : * Tip: Using the front_inserter function to create these iterators can
455 : * save typing.
456 : */
457 : template<typename _Container>
458 : class front_insert_iterator
459 : : public iterator<output_iterator_tag, void, void, void, void>
460 : {
461 : protected:
462 : _Container* container;
463 :
464 : public:
465 : /// A nested typedef for the type of whatever container you used.
466 : typedef _Container container_type;
467 :
468 : /// The only way to create this %iterator is with a container.
469 : explicit front_insert_iterator(_Container& __x) : container(&__x) { }
470 :
471 : /**
472 : * @param value An instance of whatever type
473 : * container_type::const_reference is; presumably a
474 : * reference-to-const T for container<T>.
475 : * @return This %iterator, for chained operations.
476 : *
477 : * This kind of %iterator doesn't really have a "position" in the
478 : * container (you can think of the position as being permanently at
479 : * the front, if you like). Assigning a value to the %iterator will
480 : * always prepend the value to the front of the container.
481 : */
482 : front_insert_iterator&
483 : operator=(typename _Container::const_reference __value)
484 : {
485 : container->push_front(__value);
486 : return *this;
487 : }
488 :
489 : /// Simply returns *this.
490 : front_insert_iterator&
491 : operator*()
492 : { return *this; }
493 :
494 : /// Simply returns *this. (This %iterator does not "move".)
495 : front_insert_iterator&
496 : operator++()
497 : { return *this; }
498 :
499 : /// Simply returns *this. (This %iterator does not "move".)
500 : front_insert_iterator
501 : operator++(int)
502 : { return *this; }
503 : };
504 :
505 : /**
506 : * @param x A container of arbitrary type.
507 : * @return An instance of front_insert_iterator working on @p x.
508 : *
509 : * This wrapper function helps in creating front_insert_iterator instances.
510 : * Typing the name of the %iterator requires knowing the precise full
511 : * type of the container, which can be tedious and impedes generic
512 : * programming. Using this function lets you take advantage of automatic
513 : * template parameter deduction, making the compiler match the correct
514 : * types for you.
515 : */
516 : template<typename _Container>
517 : inline front_insert_iterator<_Container>
518 : front_inserter(_Container& __x)
519 : { return front_insert_iterator<_Container>(__x); }
520 :
521 : /**
522 : * @brief Turns assignment into insertion.
523 : *
524 : * These are output iterators, constructed from a container-of-T.
525 : * Assigning a T to the iterator inserts it in the container at the
526 : * %iterator's position, rather than overwriting the value at that
527 : * position.
528 : *
529 : * (Sequences will actually insert a @e copy of the value before the
530 : * %iterator's position.)
531 : *
532 : * Tip: Using the inserter function to create these iterators can
533 : * save typing.
534 : */
535 : template<typename _Container>
536 : class insert_iterator
537 : : public iterator<output_iterator_tag, void, void, void, void>
538 : {
539 : protected:
540 : _Container* container;
541 : typename _Container::iterator iter;
542 :
543 : public:
544 : /// A nested typedef for the type of whatever container you used.
545 : typedef _Container container_type;
546 :
547 : /**
548 : * The only way to create this %iterator is with a container and an
549 : * initial position (a normal %iterator into the container).
550 : */
551 891457 : insert_iterator(_Container& __x, typename _Container::iterator __i)
552 891457 : : container(&__x), iter(__i) {}
553 :
554 : /**
555 : * @param value An instance of whatever type
556 : * container_type::const_reference is; presumably a
557 : * reference-to-const T for container<T>.
558 : * @return This %iterator, for chained operations.
559 : *
560 : * This kind of %iterator maintains its own position in the
561 : * container. Assigning a value to the %iterator will insert the
562 : * value into the container at the place before the %iterator.
563 : *
564 : * The position is maintained such that subsequent assignments will
565 : * insert values immediately after one another. For example,
566 : * @code
567 : * // vector v contains A and Z
568 : *
569 : * insert_iterator i (v, ++v.begin());
570 : * i = 1;
571 : * i = 2;
572 : * i = 3;
573 : *
574 : * // vector v contains A, 1, 2, 3, and Z
575 : * @endcode
576 : */
577 : insert_iterator&
578 536881 : operator=(const typename _Container::const_reference __value)
579 : {
580 536881 : iter = container->insert(iter, __value);
581 536881 : ++iter;
582 536881 : return *this;
583 : }
584 :
585 : /// Simply returns *this.
586 : insert_iterator&
587 536881 : operator*()
588 536881 : { return *this; }
589 :
590 : /// Simply returns *this. (This %iterator does not "move".)
591 : insert_iterator&
592 536881 : operator++()
593 536881 : { return *this; }
594 :
595 : /// Simply returns *this. (This %iterator does not "move".)
596 : insert_iterator&
597 : operator++(int)
598 : { return *this; }
599 : };
600 :
601 : /**
602 : * @param x A container of arbitrary type.
603 : * @return An instance of insert_iterator working on @p x.
604 : *
605 : * This wrapper function helps in creating insert_iterator instances.
606 : * Typing the name of the %iterator requires knowing the precise full
607 : * type of the container, which can be tedious and impedes generic
608 : * programming. Using this function lets you take advantage of automatic
609 : * template parameter deduction, making the compiler match the correct
610 : * types for you.
611 : */
612 : template<typename _Container, typename _Iterator>
613 : inline insert_iterator<_Container>
614 : inserter(_Container& __x, _Iterator __i)
615 : {
616 : return insert_iterator<_Container>(__x,
617 : typename _Container::iterator(__i));
618 : }
619 : } // namespace std
620 :
621 : namespace __gnu_cxx
622 : {
623 : // This iterator adapter is 'normal' in the sense that it does not
624 : // change the semantics of any of the operators of its iterator
625 : // parameter. Its primary purpose is to convert an iterator that is
626 : // not a class, e.g. a pointer, into an iterator that is a class.
627 : // The _Container parameter exists solely so that different containers
628 : // using this template can instantiate different types, even if the
629 : // _Iterator parameter is the same.
630 : using std::iterator_traits;
631 : using std::iterator;
632 : template<typename _Iterator, typename _Container>
633 : class __normal_iterator
634 : {
635 : protected:
636 : _Iterator _M_current;
637 :
638 : public:
639 : typedef typename iterator_traits<_Iterator>::iterator_category
640 : iterator_category;
641 : typedef typename iterator_traits<_Iterator>::value_type value_type;
642 : typedef typename iterator_traits<_Iterator>::difference_type
643 : difference_type;
644 : typedef typename iterator_traits<_Iterator>::reference reference;
645 : typedef typename iterator_traits<_Iterator>::pointer pointer;
646 :
647 : __normal_iterator() : _M_current(_Iterator()) { }
648 :
649 : explicit
650 18738410686 : __normal_iterator(const _Iterator& __i) : _M_current(__i) { }
651 :
652 : // Allow iterator to const_iterator conversion
653 : template<typename _Iter>
654 : __normal_iterator(const __normal_iterator<_Iter,
655 : typename std::__enable_if<_Container,
656 : (std::__are_same<_Iter,
657 : typename _Container::pointer>::__value)
658 109188 : >::__type>& __i)
659 109188 : : _M_current(__i.base()) { }
660 :
661 : // Forward iterator requirements
662 : reference
663 3083238685 : operator*() const
664 3083238685 : { return *_M_current; }
665 :
666 : pointer
667 183860 : operator->() const
668 183860 : { return _M_current; }
669 :
670 : __normal_iterator&
671 85233407 : operator++()
672 : {
673 85233407 : ++_M_current;
674 85233407 : return *this;
675 : }
676 :
677 : __normal_iterator
678 755738 : operator++(int)
679 755738 : { return __normal_iterator(_M_current++); }
680 :
681 : // Bidirectional iterator requirements
682 : __normal_iterator&
683 3230 : operator--()
684 : {
685 3230 : --_M_current;
686 3230 : return *this;
687 : }
688 :
689 : __normal_iterator
690 0 : operator--(int)
691 0 : { return __normal_iterator(_M_current--); }
692 :
693 : // Random access iterator requirements
694 : reference
695 : operator[](const difference_type& __n) const
696 : { return _M_current[__n]; }
697 :
698 : __normal_iterator&
699 54509 : operator+=(const difference_type& __n)
700 54509 : { _M_current += __n; return *this; }
701 :
702 : __normal_iterator
703 3603041380 : operator+(const difference_type& __n) const
704 3603041380 : { return __normal_iterator(_M_current + __n); }
705 :
706 : __normal_iterator&
707 : operator-=(const difference_type& __n)
708 : { _M_current -= __n; return *this; }
709 :
710 : __normal_iterator
711 63 : operator-(const difference_type& __n) const
712 63 : { return __normal_iterator(_M_current - __n); }
713 :
714 : const _Iterator&
715 12310873039 : base() const
716 12310873039 : { return _M_current; }
717 : };
718 :
719 : // Note: In what follows, the left- and right-hand-side iterators are
720 : // allowed to vary in types (conceptually in cv-qualification) so that
721 : // comparaison between cv-qualified and non-cv-qualified iterators be
722 : // valid. However, the greedy and unfriendly operators in std::rel_ops
723 : // will make overload resolution ambiguous (when in scope) if we don't
724 : // provide overloads whose operands are of the same type. Can someone
725 : // remind me what generic programming is about? -- Gaby
726 :
727 : // Forward iterator requirements
728 : template<typename _IteratorL, typename _IteratorR, typename _Container>
729 : inline bool
730 : operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
731 : const __normal_iterator<_IteratorR, _Container>& __rhs)
732 : { return __lhs.base() == __rhs.base(); }
733 :
734 : template<typename _Iterator, typename _Container>
735 : inline bool
736 : operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
737 13581783 : const __normal_iterator<_Iterator, _Container>& __rhs)
738 13581783 : { return __lhs.base() == __rhs.base(); }
739 :
740 : template<typename _IteratorL, typename _IteratorR, typename _Container>
741 : inline bool
742 : operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
743 : const __normal_iterator<_IteratorR, _Container>& __rhs)
744 : { return __lhs.base() != __rhs.base(); }
745 :
746 : template<typename _Iterator, typename _Container>
747 : inline bool
748 : operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
749 587922559 : const __normal_iterator<_Iterator, _Container>& __rhs)
750 587922559 : { return __lhs.base() != __rhs.base(); }
751 :
752 : // Random access iterator requirements
753 : template<typename _IteratorL, typename _IteratorR, typename _Container>
754 : inline bool
755 : operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
756 : const __normal_iterator<_IteratorR, _Container>& __rhs)
757 : { return __lhs.base() < __rhs.base(); }
758 :
759 : template<typename _Iterator, typename _Container>
760 : inline bool
761 : operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
762 1727 : const __normal_iterator<_Iterator, _Container>& __rhs)
763 1727 : { return __lhs.base() < __rhs.base(); }
764 :
765 : template<typename _IteratorL, typename _IteratorR, typename _Container>
766 : inline bool
767 : operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
768 : const __normal_iterator<_IteratorR, _Container>& __rhs)
769 : { return __lhs.base() > __rhs.base(); }
770 :
771 : template<typename _Iterator, typename _Container>
772 : inline bool
773 : operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
774 : const __normal_iterator<_Iterator, _Container>& __rhs)
775 : { return __lhs.base() > __rhs.base(); }
776 :
777 : template<typename _IteratorL, typename _IteratorR, typename _Container>
778 : inline bool
779 : operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
780 : const __normal_iterator<_IteratorR, _Container>& __rhs)
781 : { return __lhs.base() <= __rhs.base(); }
782 :
783 : template<typename _Iterator, typename _Container>
784 : inline bool
785 : operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
786 : const __normal_iterator<_Iterator, _Container>& __rhs)
787 : { return __lhs.base() <= __rhs.base(); }
788 :
789 : template<typename _IteratorL, typename _IteratorR, typename _Container>
790 : inline bool
791 : operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
792 : const __normal_iterator<_IteratorR, _Container>& __rhs)
793 : { return __lhs.base() >= __rhs.base(); }
794 :
795 : template<typename _Iterator, typename _Container>
796 : inline bool
797 : operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
798 : const __normal_iterator<_Iterator, _Container>& __rhs)
799 : { return __lhs.base() >= __rhs.base(); }
800 :
801 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
802 : // According to the resolution of DR179 not only the various comparison
803 : // operators but also operator- must accept mixed iterator/const_iterator
804 : // parameters.
805 : template<typename _IteratorL, typename _IteratorR, typename _Container>
806 : inline typename __normal_iterator<_IteratorL, _Container>::difference_type
807 : operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
808 5304922703 : const __normal_iterator<_IteratorR, _Container>& __rhs)
809 5304922703 : { return __lhs.base() - __rhs.base(); }
810 :
811 : template<typename _Iterator, typename _Container>
812 : inline __normal_iterator<_Iterator, _Container>
813 : operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
814 : __n, const __normal_iterator<_Iterator, _Container>& __i)
815 : { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
816 : } // namespace __gnu_cxx
817 :
818 : #endif
819 :
820 : // Local Variables:
821 : // mode:C++
822 : // End:
|