williamr@2: /* williamr@2: * williamr@2: * Copyright (c) 1994 williamr@2: * Hewlett-Packard Company williamr@2: * williamr@2: * Copyright (c) 1996-1998 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1997 williamr@2: * Moscow Center for SPARC Technology williamr@2: * williamr@4: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@4: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: /* NOTE: This is an internal header file, included by other STL headers. williamr@2: * You should not attempt to use it directly. williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ITERATOR_OLD_H williamr@2: #define _STLP_INTERNAL_ITERATOR_OLD_H williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ITERATOR_BASE_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: # ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES williamr@2: williamr@2: template williamr@2: inline output_iterator_tag _STLP_CALL williamr@2: iterator_category(const back_insert_iterator<_Container>&) { return output_iterator_tag(); } williamr@2: template williamr@2: inline output_iterator_tag _STLP_CALL williamr@2: iterator_category(const front_insert_iterator<_Container>&) { return output_iterator_tag(); } williamr@2: template williamr@2: inline output_iterator_tag _STLP_CALL williamr@2: iterator_category(const insert_iterator<_Container>&) { return output_iterator_tag(); } williamr@2: williamr@2: # endif williamr@2: williamr@2: # if defined (_STLP_MSVC50_COMPATIBILITY) williamr@2: # define __Reference _Reference, class _Pointer williamr@2: # define Reference__ _Reference, _Pointer williamr@4: template williamr@2: # else williamr@2: # define __Reference _Reference williamr@2: # define Reference__ _Reference williamr@4: template williamr@2: # endif williamr@2: class reverse_bidirectional_iterator { williamr@4: typedef reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, williamr@2: Reference__, _Distance> _Self; williamr@2: // friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& x, const _Self& y); williamr@2: protected: williamr@2: _BidirectionalIterator current; williamr@2: public: williamr@2: typedef bidirectional_iterator_tag iterator_category; williamr@2: typedef _Tp value_type; williamr@2: typedef _Distance difference_type; williamr@2: # if defined (_STLP_MSVC50_COMPATIBILITY) williamr@2: typedef _Pointer pointer; williamr@2: # else williamr@2: typedef _Tp* pointer; williamr@2: # endif williamr@2: typedef _Reference reference; williamr@2: williamr@2: reverse_bidirectional_iterator() {} williamr@2: explicit reverse_bidirectional_iterator(_BidirectionalIterator __x) williamr@2: : current(__x) {} williamr@2: _BidirectionalIterator base() const { return current; } williamr@2: _Reference operator*() const { williamr@2: _BidirectionalIterator __tmp = current; williamr@4: return *(--__tmp); williamr@2: } williamr@2: # if !(defined _STLP_NO_ARROW_OPERATOR) williamr@2: _STLP_DEFINE_ARROW_OPERATOR williamr@2: # endif williamr@2: _Self& operator++() { williamr@2: --current; williamr@2: return *this; williamr@2: } williamr@2: _Self operator++(int) { williamr@2: _Self __tmp = *this; williamr@2: --current; williamr@2: return __tmp; williamr@2: } williamr@2: _Self& operator--() { williamr@2: ++current; williamr@2: return *this; williamr@2: } williamr@2: _Self operator--(int) { williamr@2: _Self __tmp = *this; williamr@2: ++current; williamr@2: return __tmp; williamr@2: } williamr@2: }; williamr@2: williamr@2: # ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES williamr@4: template williamr@2: inline bidirectional_iterator_tag _STLP_CALL williamr@4: iterator_category(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&) williamr@2: { return bidirectional_iterator_tag(); } williamr@4: template williamr@2: inline _Tp* _STLP_CALL williamr@2: value_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&) williamr@2: { return (_Tp*) 0; } williamr@4: template williamr@2: inline _Distance* _STLP_CALL williamr@2: distance_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&) williamr@2: { return (_Distance*) 0; } williamr@2: #endif williamr@2: williamr@4: template williamr@2: inline bool _STLP_CALL operator==( williamr@2: const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, williamr@2: Reference__, _Distance>& __x, williamr@2: const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, williamr@2: Reference__, _Distance>& __y) williamr@2: { williamr@2: return __x.base() == __y.base(); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL operator!=( williamr@4: const reverse_bidirectional_iterator<_BiIter, _Tp, Reference__, _Distance>& __x, williamr@2: const reverse_bidirectional_iterator<_BiIter, _Tp, Reference__, _Distance>& __y) williamr@2: { williamr@2: return !(__x == __y); williamr@2: } williamr@2: williamr@2: #endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ williamr@2: williamr@2: #if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) williamr@2: williamr@2: // This is the old version of reverse_iterator, as found in the original williamr@2: // HP STL. It does not use partial specialization. williamr@2: williamr@4: template = 0x2405) \ williamr@4: || defined(__MRC__) || (defined(__SC__) && !defined(__DMC__)) //*ty 03/22/2001 - give the default to the secont param under MPW. williamr@4: // I believe giving the default will cause any harm even though the 2nd type parameter williamr@4: // still have to be provided for T* type iterators. williamr@4: _STLP_DFL_TMPL_PARAM(_Tp,iterator_traits<_RandomAccessIterator>::value_type), williamr@2: # else williamr@4: class _Tp, williamr@2: #endif williamr@4: _STLP_DFL_TMPL_PARAM(_Reference,_Tp&), williamr@2: # if defined (_STLP_MSVC50_COMPATIBILITY) williamr@4: _STLP_DFL_TMPL_PARAM(_Pointer, _Tp*), williamr@2: # endif williamr@4: _STLP_DFL_TYPE_PARAM(_Distance,ptrdiff_t)> williamr@2: class reverse_iterator { williamr@2: typedef reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance> williamr@2: _Self; williamr@2: protected: williamr@2: _RandomAccessIterator __current; williamr@2: public: williamr@2: typedef random_access_iterator_tag iterator_category; williamr@2: typedef _Tp value_type; williamr@2: typedef _Distance difference_type; williamr@2: # if defined (_STLP_MSVC50_COMPATIBILITY) williamr@2: typedef _Pointer pointer; williamr@2: # else williamr@2: typedef _Tp* pointer; williamr@2: # endif williamr@2: typedef _Reference reference; williamr@2: williamr@2: reverse_iterator() {} williamr@2: reverse_iterator(const _Self& __x) : __current(__x.base()) {} williamr@2: explicit reverse_iterator(_RandomAccessIterator __x) : __current(__x) {} williamr@4: _Self& operator=(const _Self& __x) {__current = __x.base(); return *this; } williamr@4: williamr@2: _RandomAccessIterator base() const { return __current; } williamr@2: _Reference operator*() const { return *(__current - (difference_type)1); } williamr@2: williamr@2: # if !(defined _STLP_NO_ARROW_OPERATOR) williamr@2: _STLP_DEFINE_ARROW_OPERATOR williamr@2: # endif williamr@2: williamr@2: _Self& operator++() { williamr@2: --__current; williamr@2: return *this; williamr@2: } williamr@2: _Self operator++(int) { williamr@2: _Self __tmp = *this; williamr@2: --__current; williamr@2: return __tmp; williamr@2: } williamr@2: _Self& operator--() { williamr@2: ++__current; williamr@2: return *this; williamr@2: } williamr@2: _Self operator--(int) { williamr@2: _Self __tmp = *this; williamr@2: ++__current; williamr@2: return __tmp; williamr@2: } williamr@2: _Self operator+(_Distance __n) const { williamr@2: return _Self(__current - __n); williamr@2: } williamr@2: _Self& operator+=(_Distance __n) { williamr@2: __current -= __n; williamr@2: return *this; williamr@2: } williamr@2: _Self operator-(_Distance __n) const { williamr@2: return _Self(__current + __n); williamr@2: } williamr@2: _Self& operator-=(_Distance __n) { williamr@2: __current += __n; williamr@2: return *this; williamr@2: } williamr@2: _Reference operator[](_Distance __n) const { return *(*this + __n); } williamr@2: }; williamr@2: williamr@2: # ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES williamr@4: template williamr@2: inline random_access_iterator_tag _STLP_CALL williamr@2: iterator_category(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&) williamr@2: { return random_access_iterator_tag(); } williamr@2: template williamr@2: inline _Tp* _STLP_CALL value_type(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&) williamr@2: { return (_Tp*) 0; } williamr@2: template williamr@2: inline _Distance* _STLP_CALL williamr@2: distance_type(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&) williamr@2: { return (_Distance*) 0; } williamr@2: #endif williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL williamr@2: operator==(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) williamr@2: { williamr@2: return __x.base() == __y.base(); williamr@2: } williamr@2: williamr@2: template williamr@4: inline bool _STLP_CALL williamr@2: operator<(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) williamr@2: { williamr@2: return __y.base() < __x.base(); williamr@2: } williamr@2: williamr@2: #ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE williamr@2: williamr@2: template williamr@4: inline bool _STLP_CALL williamr@2: operator!=(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) { williamr@2: return !(__x == __y); williamr@2: } williamr@2: williamr@2: template williamr@4: inline bool _STLP_CALL williamr@2: operator>(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) { williamr@2: return __y < __x; williamr@2: } williamr@2: williamr@2: template williamr@4: inline bool _STLP_CALL williamr@2: operator<=(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) { williamr@2: return !(__y < __x); williamr@2: } williamr@2: williamr@2: template williamr@4: inline bool _STLP_CALL williamr@2: operator>=(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) { williamr@2: return !(__x < __y); williamr@2: } williamr@2: williamr@2: #endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ williamr@2: williamr@2: template williamr@2: inline _Distance _STLP_CALL williamr@2: operator-(const reverse_iterator<_RandomAccessIterator, _Tp, williamr@4: Reference__, _Distance>& __x, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __y) williamr@2: { williamr@2: return __y.base() - __x.base(); williamr@2: } williamr@2: williamr@2: template williamr@2: inline reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance> _STLP_CALL williamr@2: operator+(_Distance __n, williamr@2: const reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>& __x) williamr@2: { williamr@2: return reverse_iterator<_RandomAccessIterator, _Tp, williamr@2: Reference__, _Distance>(__x.base() - __n); williamr@2: } williamr@2: williamr@2: #endif /* ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) */ williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #endif /* _STLP_INTERNAL_ITERATOR_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: