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@2: * 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@2: * 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_H williamr@2: #define _STLP_INTERNAL_ITERATOR_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: #if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) williamr@2: // This is the new version of reverse_iterator, as defined in the williamr@2: // draft C++ standard. It relies on the iterator_traits template, williamr@2: // which in turn relies on partial specialization. The class williamr@2: // reverse_bidirectional_iterator is no longer part of the draft williamr@2: // standard, but it is retained for backward compatibility. williamr@2: williamr@2: template williamr@2: class reverse_iterator : williamr@2: public iterator::iterator_category, williamr@2: typename iterator_traits<_Iterator>::value_type, williamr@2: typename iterator_traits<_Iterator>::difference_type, williamr@2: typename iterator_traits<_Iterator>::pointer, williamr@2: typename iterator_traits<_Iterator>::reference> williamr@2: { williamr@2: protected: williamr@2: _Iterator current; williamr@2: typedef reverse_iterator<_Iterator> _Self; williamr@2: public: williamr@2: typedef typename iterator_traits<_Iterator>::iterator_category iterator_category; williamr@2: typedef typename iterator_traits<_Iterator>::value_type value_type; williamr@2: typedef typename iterator_traits<_Iterator>::difference_type difference_type; williamr@2: typedef typename iterator_traits<_Iterator>::pointer pointer; williamr@2: typedef typename iterator_traits<_Iterator>::reference reference; williamr@2: typedef _Iterator iterator_type; williamr@2: public: williamr@2: reverse_iterator() {} williamr@2: explicit reverse_iterator(iterator_type __x) : current(__x) {} williamr@2: reverse_iterator(const _Self& __x) : current(__x.current) {} williamr@2: _Self& operator = (const _Self& __x) { current = __x.base(); return *this; } williamr@2: #ifdef _STLP_MEMBER_TEMPLATES williamr@2: template williamr@2: reverse_iterator(const reverse_iterator<_Iter>& __x) : current(__x.base()) {} williamr@2: template williamr@2: _Self& operator = (const reverse_iterator<_Iter>& __x) { current = __x.base(); return *this; } williamr@2: #endif /* _STLP_MEMBER_TEMPLATES */ williamr@2: williamr@2: iterator_type base() const { return current; } williamr@2: reference operator*() const { williamr@2: _Iterator __tmp = current; williamr@2: return *--__tmp; williamr@2: } williamr@2: _STLP_DEFINE_ARROW_OPERATOR 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: _Self operator+(difference_type __n) const { williamr@2: return _Self(current - __n); williamr@2: } williamr@2: _Self& operator+=(difference_type __n) { williamr@2: current -= __n; williamr@2: return *this; williamr@2: } williamr@2: _Self operator-(difference_type __n) const { williamr@2: return _Self(current + __n); williamr@2: } williamr@2: _Self& operator-=(difference_type __n) { williamr@2: current += __n; williamr@2: return *this; williamr@2: } williamr@2: reference operator[](difference_type __n) const { return *(*this + __n); } williamr@2: }; williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL operator==(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __y) { williamr@2: return __x.base() == __y.base(); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL operator<(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __y) { 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@2: inline bool _STLP_CALL operator!=(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __y) { williamr@2: return !(__x == __y); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL operator>(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __y) { williamr@2: return __y < __x; williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL operator<=(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __y) { williamr@2: return !(__y < __x); williamr@2: } williamr@2: williamr@2: template williamr@2: inline bool _STLP_CALL operator>=(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __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: # ifdef __SUNPRO_CC williamr@2: inline ptrdiff_t _STLP_CALL williamr@2: # else williamr@2: inline typename reverse_iterator<_Iterator>::difference_type _STLP_CALL williamr@2: # endif williamr@2: operator-(const reverse_iterator<_Iterator>& __x, williamr@2: const reverse_iterator<_Iterator>& __y) { williamr@2: return __y.base() - __x.base(); williamr@2: } williamr@2: williamr@2: template williamr@2: inline reverse_iterator<_Iterator> _STLP_CALL williamr@2: operator+(_DifferenceType n,const reverse_iterator<_Iterator>& x) { williamr@2: return x.operator+(n); williamr@2: } williamr@2: williamr@2: # endif williamr@2: williamr@2: template williamr@2: class back_insert_iterator williamr@2: : public iterator williamr@2: { williamr@2: protected: williamr@2: _Container* container; williamr@2: public: williamr@2: typedef _Container container_type; williamr@2: typedef output_iterator_tag iterator_category; williamr@2: williamr@2: explicit back_insert_iterator(_Container& __x) : container(&__x) {} williamr@2: back_insert_iterator<_Container>& williamr@2: operator=(const typename _Container::value_type& __val) { williamr@2: container->push_back(__val); williamr@2: return *this; williamr@2: } williamr@2: back_insert_iterator<_Container>& operator*() { return *this; } williamr@2: back_insert_iterator<_Container>& operator++() { return *this; } williamr@2: back_insert_iterator<_Container> operator++(int) { return *this; } williamr@2: }; williamr@2: williamr@2: template williamr@2: inline back_insert_iterator<_Container> _STLP_CALL back_inserter(_Container& __x) { williamr@2: return back_insert_iterator<_Container>(__x); williamr@2: } williamr@2: williamr@2: template williamr@2: class front_insert_iterator williamr@2: : public iterator williamr@2: { williamr@2: protected: williamr@2: _Container* container; williamr@2: public: williamr@2: typedef _Container container_type; williamr@2: typedef output_iterator_tag iterator_category; williamr@2: explicit front_insert_iterator(_Container& __x) : container(&__x) {} williamr@2: front_insert_iterator<_Container>& williamr@2: operator=(const typename _Container::value_type& __val) { williamr@2: container->push_front(__val); williamr@2: return *this; williamr@2: } williamr@2: front_insert_iterator<_Container>& operator*() { return *this; } williamr@2: front_insert_iterator<_Container>& operator++() { return *this; } williamr@2: front_insert_iterator<_Container>& operator++(int) { return *this; } williamr@2: }; williamr@2: williamr@2: template williamr@2: inline front_insert_iterator<_Container> _STLP_CALL front_inserter(_Container& __x) { williamr@2: return front_insert_iterator<_Container>(__x); williamr@2: } williamr@2: williamr@2: template williamr@2: class insert_iterator williamr@2: : public iterator williamr@2: { williamr@2: protected: williamr@2: _Container* container; williamr@2: typename _Container::iterator iter; williamr@2: public: williamr@2: typedef _Container container_type; williamr@2: typedef output_iterator_tag iterator_category; williamr@2: insert_iterator(_Container& __x, typename _Container::iterator __i) williamr@2: : container(&__x), iter(__i) {} williamr@2: insert_iterator<_Container>& williamr@2: operator=(const typename _Container::value_type& __val) { williamr@2: iter = container->insert(iter, __val); williamr@2: ++iter; williamr@2: return *this; williamr@2: } williamr@2: insert_iterator<_Container>& operator*() { return *this; } williamr@2: insert_iterator<_Container>& operator++() { return *this; } williamr@2: insert_iterator<_Container>& operator++(int) { return *this; } williamr@2: }; williamr@2: williamr@2: template williamr@2: inline insert_iterator<_Container> _STLP_CALL williamr@2: inserter(_Container& __x, _Iterator __i) williamr@2: { williamr@2: typedef typename _Container::iterator __iter; williamr@2: return insert_iterator<_Container>(__x, __iter(__i)); williamr@2: } williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: #if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES) williamr@2: # include williamr@2: #endif /* __NO_PARTIAL_SPEC || ANACHRONISMS */ williamr@2: williamr@2: #endif /* _STLP_INTERNAL_ITERATOR_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: