4 * Hewlett-Packard Company
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation. Hewlett-Packard Company makes no
11 * representations about the suitability of this software for any
12 * purpose. It is provided "as is" without express or implied warranty.
15 * Copyright (c) 1996-1998
16 * Silicon Graphics Computer Systems, Inc.
18 * Permission to use, copy, modify, distribute and sell this software
19 * and its documentation for any purpose is hereby granted without fee,
20 * provided that the above copyright notice appear in all copies and
21 * that both that copyright notice and this permission notice appear
22 * in supporting documentation. Silicon Graphics makes no
23 * representations about the suitability of this software for any
24 * purpose. It is provided "as is" without express or implied warranty.
27 /* NOTE: This is an internal header file, included by other STL headers.
28 * You should not attempt to use it directly.
31 #ifndef __SGI_STL_INTERNAL_ITERATOR_H
32 #define __SGI_STL_INTERNAL_ITERATOR_H
36 struct input_iterator_tag
{};
37 struct output_iterator_tag
{};
38 struct forward_iterator_tag
: public input_iterator_tag
{};
39 struct bidirectional_iterator_tag
: public forward_iterator_tag
{};
40 struct random_access_iterator_tag
: public bidirectional_iterator_tag
{};
42 // The base classes input_iterator, output_iterator, forward_iterator,
43 // bidirectional_iterator, and random_access_iterator are not part of
44 // the C++ standard. (they have been replaced by struct iterator.)
45 // They are included for backward compatibility with the HP STL.
47 template <class _Tp
, class _Distance
> struct input_iterator
{
48 typedef input_iterator_tag iterator_category
;
49 typedef _Tp value_type
;
50 typedef _Distance difference_type
;
52 typedef _Tp
& reference
;
55 struct output_iterator
{
56 typedef output_iterator_tag iterator_category
;
57 typedef void value_type
;
58 typedef void difference_type
;
60 typedef void reference
;
63 template <class _Tp
, class _Distance
> struct forward_iterator
{
64 typedef forward_iterator_tag iterator_category
;
65 typedef _Tp value_type
;
66 typedef _Distance difference_type
;
68 typedef _Tp
& reference
;
72 template <class _Tp
, class _Distance
> struct bidirectional_iterator
{
73 typedef bidirectional_iterator_tag iterator_category
;
74 typedef _Tp value_type
;
75 typedef _Distance difference_type
;
77 typedef _Tp
& reference
;
80 template <class _Tp
, class _Distance
> struct random_access_iterator
{
81 typedef random_access_iterator_tag iterator_category
;
82 typedef _Tp value_type
;
83 typedef _Distance difference_type
;
85 typedef _Tp
& reference
;
88 #ifdef __STL_USE_NAMESPACES
89 template <class _Category
, class _Tp
, class _Distance
= ptrdiff_t,
90 class _Pointer
= _Tp
*, class _Reference
= _Tp
&>
92 typedef _Category iterator_category
;
93 typedef _Tp value_type
;
94 typedef _Distance difference_type
;
95 typedef _Pointer pointer
;
96 typedef _Reference reference
;
98 #endif /* __STL_USE_NAMESPACES */
100 #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
102 template <class _Iterator
>
103 struct iterator_traits
{
104 typedef typename
_Iterator::iterator_category iterator_category
;
105 typedef typename
_Iterator::value_type value_type
;
106 typedef typename
_Iterator::difference_type difference_type
;
107 typedef typename
_Iterator::pointer pointer
;
108 typedef typename
_Iterator::reference reference
;
112 struct iterator_traits
<_Tp
*> {
113 typedef random_access_iterator_tag iterator_category
;
114 typedef _Tp value_type
;
115 typedef ptrdiff_t difference_type
;
116 typedef _Tp
* pointer
;
117 typedef _Tp
& reference
;
121 struct iterator_traits
<const _Tp
*> {
122 typedef random_access_iterator_tag iterator_category
;
123 typedef _Tp value_type
;
124 typedef ptrdiff_t difference_type
;
125 typedef const _Tp
* pointer
;
126 typedef const _Tp
& reference
;
129 // The overloaded functions iterator_category, distance_type, and
130 // value_type are not part of the C++ standard. (They have been
131 // replaced by struct iterator_traits.) They are included for
132 // backward compatibility with the HP STL.
134 // We introduce internal names for these functions.
136 template <class _Iter
>
137 inline typename iterator_traits
<_Iter
>::iterator_category
138 __iterator_category(const _Iter
&)
140 typedef typename iterator_traits
<_Iter
>::iterator_category _Category
;
144 template <class _Iter
>
145 inline typename iterator_traits
<_Iter
>::difference_type
*
146 __distance_type(const _Iter
&)
148 return static_cast<typename iterator_traits
<_Iter
>::difference_type
*>(0);
151 template <class _Iter
>
152 inline typename iterator_traits
<_Iter
>::value_type
*
153 __value_type(const _Iter
&)
155 return static_cast<typename iterator_traits
<_Iter
>::value_type
*>(0);
158 template <class _Iter
>
159 inline typename iterator_traits
<_Iter
>::iterator_category
160 iterator_category(const _Iter
& __i
) { return __iterator_category(__i
); }
163 template <class _Iter
>
164 inline typename iterator_traits
<_Iter
>::difference_type
*
165 distance_type(const _Iter
& __i
) { return __distance_type(__i
); }
167 template <class _Iter
>
168 inline typename iterator_traits
<_Iter
>::value_type
*
169 value_type(const _Iter
& __i
) { return __value_type(__i
); }
171 #define __ITERATOR_CATEGORY(__i) __iterator_category(__i)
172 #define __DISTANCE_TYPE(__i) __distance_type(__i)
173 #define __VALUE_TYPE(__i) __value_type(__i)
175 #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
177 template <class _Tp
, class _Distance
>
178 inline input_iterator_tag
179 iterator_category(const input_iterator
<_Tp
, _Distance
>&)
180 { return input_iterator_tag(); }
182 inline output_iterator_tag
iterator_category(const output_iterator
&)
183 { return output_iterator_tag(); }
185 template <class _Tp
, class _Distance
>
186 inline forward_iterator_tag
187 iterator_category(const forward_iterator
<_Tp
, _Distance
>&)
188 { return forward_iterator_tag(); }
190 template <class _Tp
, class _Distance
>
191 inline bidirectional_iterator_tag
192 iterator_category(const bidirectional_iterator
<_Tp
, _Distance
>&)
193 { return bidirectional_iterator_tag(); }
195 template <class _Tp
, class _Distance
>
196 inline random_access_iterator_tag
197 iterator_category(const random_access_iterator
<_Tp
, _Distance
>&)
198 { return random_access_iterator_tag(); }
201 inline random_access_iterator_tag
iterator_category(const _Tp
*)
202 { return random_access_iterator_tag(); }
204 template <class _Tp
, class _Distance
>
205 inline _Tp
* value_type(const input_iterator
<_Tp
, _Distance
>&)
206 { return (_Tp
*)(0); }
208 template <class _Tp
, class _Distance
>
209 inline _Tp
* value_type(const forward_iterator
<_Tp
, _Distance
>&)
210 { return (_Tp
*)(0); }
212 template <class _Tp
, class _Distance
>
213 inline _Tp
* value_type(const bidirectional_iterator
<_Tp
, _Distance
>&)
214 { return (_Tp
*)(0); }
216 template <class _Tp
, class _Distance
>
217 inline _Tp
* value_type(const random_access_iterator
<_Tp
, _Distance
>&)
218 { return (_Tp
*)(0); }
221 inline _Tp
* value_type(const _Tp
*) { return (_Tp
*)(0); }
223 template <class _Tp
, class _Distance
>
224 inline _Distance
* distance_type(const input_iterator
<_Tp
, _Distance
>&)
226 return (_Distance
*)(0);
229 template <class _Tp
, class _Distance
>
230 inline _Distance
* distance_type(const forward_iterator
<_Tp
, _Distance
>&)
232 return (_Distance
*)(0);
235 template <class _Tp
, class _Distance
>
237 distance_type(const bidirectional_iterator
<_Tp
, _Distance
>&)
239 return (_Distance
*)(0);
242 template <class _Tp
, class _Distance
>
244 distance_type(const random_access_iterator
<_Tp
, _Distance
>&)
246 return (_Distance
*)(0);
250 inline ptrdiff_t* distance_type(const _Tp
*) { return (ptrdiff_t*)(0); }
252 // Without partial specialization we can't use iterator_traits, so
253 // we must keep the old iterator query functions around.
255 #define __ITERATOR_CATEGORY(__i) iterator_category(__i)
256 #define __DISTANCE_TYPE(__i) distance_type(__i)
257 #define __VALUE_TYPE(__i) value_type(__i)
259 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
261 template <class _InputIterator
, class _Distance
>
262 inline void __distance(_InputIterator __first
, _InputIterator __last
,
263 _Distance
& __n
, input_iterator_tag
)
265 while (__first
!= __last
) { ++__first
; ++__n
; }
268 template <class _RandomAccessIterator
, class _Distance
>
269 inline void __distance(_RandomAccessIterator __first
,
270 _RandomAccessIterator __last
,
271 _Distance
& __n
, random_access_iterator_tag
)
273 __n
+= __last
- __first
;
276 template <class _InputIterator
, class _Distance
>
277 inline void distance(_InputIterator __first
,
278 _InputIterator __last
, _Distance
& __n
)
280 __distance(__first
, __last
, __n
, iterator_category(__first
));
283 #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
285 template <class _InputIterator
>
286 inline typename iterator_traits
<_InputIterator
>::difference_type
287 __distance(_InputIterator __first
, _InputIterator __last
, input_iterator_tag
)
289 typename iterator_traits
<_InputIterator
>::difference_type __n
= 0;
290 while (__first
!= __last
) {
296 template <class _RandomAccessIterator
>
297 inline typename iterator_traits
<_RandomAccessIterator
>::difference_type
298 __distance(_RandomAccessIterator __first
, _RandomAccessIterator __last
,
299 random_access_iterator_tag
) {
300 return __last
- __first
;
303 template <class _InputIterator
>
304 inline typename iterator_traits
<_InputIterator
>::difference_type
305 distance(_InputIterator __first
, _InputIterator __last
) {
306 typedef typename iterator_traits
<_InputIterator
>::iterator_category
308 return __distance(__first
, __last
, _Category());
311 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
313 template <class _InputIter
, class _Distance
>
314 inline void __advance(_InputIter
& __i
, _Distance __n
, input_iterator_tag
) {
318 #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
319 #pragma set woff 1183
322 template <class _BidirectionalIterator
, class _Distance
>
323 inline void __advance(_BidirectionalIterator
& __i
, _Distance __n
,
324 bidirectional_iterator_tag
) {
331 #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
332 #pragma reset woff 1183
335 template <class _RandomAccessIterator
, class _Distance
>
336 inline void __advance(_RandomAccessIterator
& __i
, _Distance __n
,
337 random_access_iterator_tag
) {
341 template <class _InputIterator
, class _Distance
>
342 inline void advance(_InputIterator
& __i
, _Distance __n
) {
343 __advance(__i
, __n
, iterator_category(__i
));
346 template <class _Container
>
347 class back_insert_iterator
{
349 _Container
* container
;
351 typedef _Container container_type
;
352 typedef output_iterator_tag iterator_category
;
353 typedef void value_type
;
354 typedef void difference_type
;
355 typedef void pointer
;
356 typedef void reference
;
358 explicit back_insert_iterator(_Container
& __x
) : container(&__x
) {}
359 back_insert_iterator
<_Container
>&
360 operator=(const typename
_Container::value_type
& __value
) {
361 container
->push_back(__value
);
364 back_insert_iterator
<_Container
>& operator*() { return *this; }
365 back_insert_iterator
<_Container
>& operator++() { return *this; }
366 back_insert_iterator
<_Container
>& operator++(int) { return *this; }
369 #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
371 template <class _Container
>
372 inline output_iterator_tag
373 iterator_category(const back_insert_iterator
<_Container
>&)
375 return output_iterator_tag();
378 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
380 template <class _Container
>
381 inline back_insert_iterator
<_Container
> back_inserter(_Container
& __x
) {
382 return back_insert_iterator
<_Container
>(__x
);
385 template <class _Container
>
386 class front_insert_iterator
{
388 _Container
* container
;
390 typedef _Container container_type
;
391 typedef output_iterator_tag iterator_category
;
392 typedef void value_type
;
393 typedef void difference_type
;
394 typedef void pointer
;
395 typedef void reference
;
397 explicit front_insert_iterator(_Container
& __x
) : container(&__x
) {}
398 front_insert_iterator
<_Container
>&
399 operator=(const typename
_Container::value_type
& __value
) {
400 container
->push_front(__value
);
403 front_insert_iterator
<_Container
>& operator*() { return *this; }
404 front_insert_iterator
<_Container
>& operator++() { return *this; }
405 front_insert_iterator
<_Container
>& operator++(int) { return *this; }
408 #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
410 template <class _Container
>
411 inline output_iterator_tag
412 iterator_category(const front_insert_iterator
<_Container
>&)
414 return output_iterator_tag();
417 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
419 template <class _Container
>
420 inline front_insert_iterator
<_Container
> front_inserter(_Container
& __x
) {
421 return front_insert_iterator
<_Container
>(__x
);
424 template <class _Container
>
425 class insert_iterator
{
427 _Container
* container
;
428 typename
_Container::iterator iter
;
430 typedef _Container container_type
;
431 typedef output_iterator_tag iterator_category
;
432 typedef void value_type
;
433 typedef void difference_type
;
434 typedef void pointer
;
435 typedef void reference
;
437 insert_iterator(_Container
& __x
, typename
_Container::iterator __i
)
438 : container(&__x
), iter(__i
) {}
439 insert_iterator
<_Container
>&
440 operator=(const typename
_Container::value_type
& __value
) {
441 iter
= container
->insert(iter
, __value
);
445 insert_iterator
<_Container
>& operator*() { return *this; }
446 insert_iterator
<_Container
>& operator++() { return *this; }
447 insert_iterator
<_Container
>& operator++(int) { return *this; }
450 #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
452 template <class _Container
>
453 inline output_iterator_tag
454 iterator_category(const insert_iterator
<_Container
>&)
456 return output_iterator_tag();
459 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
461 template <class _Container
, class _Iterator
>
463 insert_iterator
<_Container
> inserter(_Container
& __x
, _Iterator __i
)
465 typedef typename
_Container::iterator __iter
;
466 return insert_iterator
<_Container
>(__x
, __iter(__i
));
469 #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
470 template <class _BidirectionalIterator
, class _Tp
, class _Reference
= _Tp
&,
471 class _Distance
= ptrdiff_t>
473 template <class _BidirectionalIterator
, class _Tp
, class _Reference
,
476 class reverse_bidirectional_iterator
{
477 typedef reverse_bidirectional_iterator
<_BidirectionalIterator
, _Tp
,
478 _Reference
, _Distance
> _Self
;
480 _BidirectionalIterator current
;
482 typedef bidirectional_iterator_tag iterator_category
;
483 typedef _Tp value_type
;
484 typedef _Distance difference_type
;
485 typedef _Tp
* pointer
;
486 typedef _Reference reference
;
488 reverse_bidirectional_iterator() {}
489 explicit reverse_bidirectional_iterator(_BidirectionalIterator __x
)
491 _BidirectionalIterator
base() const { return current
; }
492 _Reference
operator*() const {
493 _BidirectionalIterator __tmp
= current
;
496 #ifndef __SGI_STL_NO_ARROW_OPERATOR
497 pointer
operator->() const { return &(operator*()); }
498 #endif /* __SGI_STL_NO_ARROW_OPERATOR */
499 _Self
& operator++() {
503 _Self
operator++(int) {
508 _Self
& operator--() {
512 _Self
operator--(int) {
519 #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
521 template <class _BidirectionalIterator
, class _Tp
, class _Reference
,
523 inline bidirectional_iterator_tag
524 iterator_category(const reverse_bidirectional_iterator
<_BidirectionalIterator
,
528 return bidirectional_iterator_tag();
531 template <class _BidirectionalIterator
, class _Tp
, class _Reference
,
534 value_type(const reverse_bidirectional_iterator
<_BidirectionalIterator
, _Tp
,
535 _Reference
, _Distance
>&)
540 template <class _BidirectionalIterator
, class _Tp
, class _Reference
,
543 distance_type(const reverse_bidirectional_iterator
<_BidirectionalIterator
,
545 _Reference
, _Distance
>&)
547 return (_Distance
*) 0;
550 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
552 template <class _BiIter
, class _Tp
, class _Ref
,
554 inline bool operator==(
555 const reverse_bidirectional_iterator
<_BiIter
, _Tp
, _Ref
, _Distance
>& __x
,
556 const reverse_bidirectional_iterator
<_BiIter
, _Tp
, _Ref
, _Distance
>& __y
)
558 return __x
.base() == __y
.base();
561 #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
563 // This is the new version of reverse_iterator, as defined in the
564 // draft C++ standard. It relies on the iterator_traits template,
565 // which in turn relies on partial specialization. The class
566 // reverse_bidirectional_iterator is no longer part of the draft
567 // standard, but it is retained for backward compatibility.
569 template <class _Iterator
>
570 class reverse_iterator
575 typedef typename iterator_traits
<_Iterator
>::iterator_category
577 typedef typename iterator_traits
<_Iterator
>::value_type
579 typedef typename iterator_traits
<_Iterator
>::difference_type
581 typedef typename iterator_traits
<_Iterator
>::pointer
583 typedef typename iterator_traits
<_Iterator
>::reference
586 typedef _Iterator iterator_type
;
587 typedef reverse_iterator
<_Iterator
> _Self
;
590 reverse_iterator() {}
591 explicit reverse_iterator(iterator_type __x
) : current(__x
) {}
593 reverse_iterator(const _Self
& __x
) : current(__x
.current
) {}
594 #ifdef __STL_MEMBER_TEMPLATES
595 template <class _Iter
>
596 reverse_iterator(const reverse_iterator
<_Iter
>& __x
)
597 : current(__x
.base()) {}
598 #endif /* __STL_MEMBER_TEMPLATES */
600 iterator_type
base() const { return current
; }
601 reference
operator*() const {
602 _Iterator __tmp
= current
;
605 #ifndef __SGI_STL_NO_ARROW_OPERATOR
606 pointer
operator->() const { return &(operator*()); }
607 #endif /* __SGI_STL_NO_ARROW_OPERATOR */
609 _Self
& operator++() {
613 _Self
operator++(int) {
618 _Self
& operator--() {
622 _Self
operator--(int) {
628 _Self
operator+(difference_type __n
) const {
629 return _Self(current
- __n
);
631 _Self
& operator+=(difference_type __n
) {
635 _Self
operator-(difference_type __n
) const {
636 return _Self(current
+ __n
);
638 _Self
& operator-=(difference_type __n
) {
642 reference
operator[](difference_type __n
) const { return *(*this + __n
); }
645 template <class _Iterator
>
646 inline bool operator==(const reverse_iterator
<_Iterator
>& __x
,
647 const reverse_iterator
<_Iterator
>& __y
) {
648 return __x
.base() == __y
.base();
651 template <class _Iterator
>
652 inline bool operator<(const reverse_iterator
<_Iterator
>& __x
,
653 const reverse_iterator
<_Iterator
>& __y
) {
654 return __y
.base() < __x
.base();
657 template <class _Iterator
>
658 inline typename reverse_iterator
<_Iterator
>::difference_type
659 operator-(const reverse_iterator
<_Iterator
>& __x
,
660 const reverse_iterator
<_Iterator
>& __y
) {
661 return __y
.base() - __x
.base();
664 template <class _Iterator
>
665 inline reverse_iterator
<_Iterator
>
666 operator+(typename reverse_iterator
<_Iterator
>::difference_type __n
,
667 const reverse_iterator
<_Iterator
>& __x
) {
668 return reverse_iterator
<_Iterator
>(__x
.base() - __n
);
671 #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
673 // This is the old version of reverse_iterator, as found in the original
674 // HP STL. It does not use partial specialization.
676 #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
677 template <class _RandomAccessIterator
, class _Tp
, class _Reference
= _Tp
&,
678 class _Distance
= ptrdiff_t>
680 template <class _RandomAccessIterator
, class _Tp
, class _Reference
,
683 class reverse_iterator
{
684 typedef reverse_iterator
<_RandomAccessIterator
, _Tp
, _Reference
, _Distance
>
687 _RandomAccessIterator current
;
689 typedef random_access_iterator_tag iterator_category
;
690 typedef _Tp value_type
;
691 typedef _Distance difference_type
;
692 typedef _Tp
* pointer
;
693 typedef _Reference reference
;
695 reverse_iterator() {}
696 explicit reverse_iterator(_RandomAccessIterator __x
) : current(__x
) {}
697 _RandomAccessIterator
base() const { return current
; }
698 _Reference
operator*() const { return *(current
- 1); }
699 #ifndef __SGI_STL_NO_ARROW_OPERATOR
700 pointer
operator->() const { return &(operator*()); }
701 #endif /* __SGI_STL_NO_ARROW_OPERATOR */
702 _Self
& operator++() {
706 _Self
operator++(int) {
711 _Self
& operator--() {
715 _Self
operator--(int) {
720 _Self
operator+(_Distance __n
) const {
721 return _Self(current
- __n
);
723 _Self
& operator+=(_Distance __n
) {
727 _Self
operator-(_Distance __n
) const {
728 return _Self(current
+ __n
);
730 _Self
& operator-=(_Distance __n
) {
734 _Reference
operator[](_Distance __n
) const { return *(*this + __n
); }
737 template <class _RandomAccessIterator
, class _Tp
,
738 class _Reference
, class _Distance
>
739 inline random_access_iterator_tag
740 iterator_category(const reverse_iterator
<_RandomAccessIterator
, _Tp
,
741 _Reference
, _Distance
>&)
743 return random_access_iterator_tag();
746 template <class _RandomAccessIterator
, class _Tp
,
747 class _Reference
, class _Distance
>
748 inline _Tp
* value_type(const reverse_iterator
<_RandomAccessIterator
, _Tp
,
749 _Reference
, _Distance
>&)
754 template <class _RandomAccessIterator
, class _Tp
,
755 class _Reference
, class _Distance
>
757 distance_type(const reverse_iterator
<_RandomAccessIterator
,
758 _Tp
, _Reference
, _Distance
>&)
760 return (_Distance
*) 0;
764 template <class _RandomAccessIterator
, class _Tp
,
765 class _Reference
, class _Distance
>
767 operator==(const reverse_iterator
<_RandomAccessIterator
, _Tp
,
768 _Reference
, _Distance
>& __x
,
769 const reverse_iterator
<_RandomAccessIterator
, _Tp
,
770 _Reference
, _Distance
>& __y
)
772 return __x
.base() == __y
.base();
775 template <class _RandomAccessIterator
, class _Tp
,
776 class _Reference
, class _Distance
>
778 operator<(const reverse_iterator
<_RandomAccessIterator
, _Tp
,
779 _Reference
, _Distance
>& __x
,
780 const reverse_iterator
<_RandomAccessIterator
, _Tp
,
781 _Reference
, _Distance
>& __y
)
783 return __y
.base() < __x
.base();
786 template <class _RandomAccessIterator
, class _Tp
,
787 class _Reference
, class _Distance
>
789 operator-(const reverse_iterator
<_RandomAccessIterator
, _Tp
,
790 _Reference
, _Distance
>& __x
,
791 const reverse_iterator
<_RandomAccessIterator
, _Tp
,
792 _Reference
, _Distance
>& __y
)
794 return __y
.base() - __x
.base();
797 template <class _RandAccIter
, class _Tp
, class _Ref
, class _Dist
>
798 inline reverse_iterator
<_RandAccIter
, _Tp
, _Ref
, _Dist
>
800 const reverse_iterator
<_RandAccIter
, _Tp
, _Ref
, _Dist
>& __x
)
802 return reverse_iterator
<_RandAccIter
, _Tp
, _Ref
, _Dist
>(__x
.base() - __n
);
805 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
807 // When we have templatized iostreams, istream_iterator and ostream_iterator
808 // must be rewritten.
810 template <class _Tp
, class _Dist
= ptrdiff_t>
811 class istream_iterator
{
812 friend bool operator== __STL_NULL_TMPL_ARGS (const istream_iterator
&,
813 const istream_iterator
&);
819 _M_end_marker
= (*_M_stream
) ? true : false;
820 if (_M_end_marker
) *_M_stream
>> _M_value
;
821 _M_end_marker
= (*_M_stream
) ? true : false;
824 typedef input_iterator_tag iterator_category
;
825 typedef _Tp value_type
;
826 typedef _Dist difference_type
;
827 typedef const _Tp
* pointer
;
828 typedef const _Tp
& reference
;
830 istream_iterator() : _M_stream(&cin
), _M_end_marker(false) {}
831 istream_iterator(istream
& __s
) : _M_stream(&__s
) { _M_read(); }
832 reference
operator*() const { return _M_value
; }
833 #ifndef __SGI_STL_NO_ARROW_OPERATOR
834 pointer
operator->() const { return &(operator*()); }
835 #endif /* __SGI_STL_NO_ARROW_OPERATOR */
836 istream_iterator
<_Tp
, _Dist
>& operator++() {
840 istream_iterator
<_Tp
, _Dist
> operator++(int) {
841 istream_iterator
<_Tp
, _Dist
> __tmp
= *this;
847 #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
849 template <class _Tp
, class _Dist
>
850 inline input_iterator_tag
851 iterator_category(const istream_iterator
<_Tp
, _Dist
>&)
853 return input_iterator_tag();
856 template <class _Tp
, class _Dist
>
858 value_type(const istream_iterator
<_Tp
, _Dist
>&) { return (_Tp
*) 0; }
860 template <class _Tp
, class _Dist
>
862 distance_type(const istream_iterator
<_Tp
, _Dist
>&) { return (_Dist
*)0; }
864 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
866 template <class _Tp
, class _Distance
>
867 inline bool operator==(const istream_iterator
<_Tp
, _Distance
>& __x
,
868 const istream_iterator
<_Tp
, _Distance
>& __y
) {
869 return (__x
._M_stream
== __y
._M_stream
&&
870 __x
._M_end_marker
== __y
._M_end_marker
) ||
871 __x
._M_end_marker
== false && __y
._M_end_marker
== false;
875 class ostream_iterator
{
878 const char* _M_string
;
880 typedef output_iterator_tag iterator_category
;
881 typedef void value_type
;
882 typedef void difference_type
;
883 typedef void pointer
;
884 typedef void reference
;
886 ostream_iterator(ostream
& __s
) : _M_stream(&__s
), _M_string(0) {}
887 ostream_iterator(ostream
& __s
, const char* __c
)
888 : _M_stream(&__s
), _M_string(__c
) {}
889 ostream_iterator
<_Tp
>& operator=(const _Tp
& __value
) {
890 *_M_stream
<< __value
;
891 if (_M_string
) *_M_stream
<< _M_string
;
894 ostream_iterator
<_Tp
>& operator*() { return *this; }
895 ostream_iterator
<_Tp
>& operator++() { return *this; }
896 ostream_iterator
<_Tp
>& operator++(int) { return *this; }
899 #ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
902 inline output_iterator_tag
903 iterator_category(const ostream_iterator
<_Tp
>&) {
904 return output_iterator_tag();
907 #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
911 #endif /* __SGI_STL_INTERNAL_ITERATOR_H */