/* Copyright (C) 2004 Garrett A. Kajmowicz This file is part of the uClibc++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __STD_HEADER_ITERATOR_BASE #define __STD_HEADER_ITERATOR_BASE 1 namespace std{ template struct iterator_traits; template struct iterator_traits; template struct iterator; struct _UCXXEXPORT input_iterator_tag {}; struct _UCXXEXPORT output_iterator_tag {}; struct _UCXXEXPORT forward_iterator_tag: public input_iterator_tag {}; struct _UCXXEXPORT bidirectional_iterator_tag: public forward_iterator_tag {}; struct _UCXXEXPORT random_access_iterator_tag: public bidirectional_iterator_tag {}; template _UCXXEXPORT void advance(InputIterator& i, Distance n){ while(n > 0){ --n; ++i; } } template _UCXXEXPORT typename iterator_traits::difference_type distance(InputIterator first, InputIterator last) { typename iterator_traits::difference_type d = 0; while(first++ !=last){ d++; } return d; } // subclause _lib.predef.iterators_, predefined iterators: template class reverse_iterator; template bool operator==(const reverse_iterator& x, const reverse_iterator& y); template bool operator<(const reverse_iterator& x, const reverse_iterator& y); template bool operator!=(const reverse_iterator& x, const reverse_iterator& y); template bool operator>(const reverse_iterator& x, const reverse_iterator& y); template bool operator>=(const reverse_iterator& x, const reverse_iterator& y); template bool operator<=(const reverse_iterator& x, const reverse_iterator& y); template typename reverse_iterator::difference_type operator-( const reverse_iterator& x, const reverse_iterator& y); template reverse_iterator operator+( typename reverse_iterator::difference_type n, const reverse_iterator& x); template class back_insert_iterator; template back_insert_iterator back_inserter(Container& x); template class front_insert_iterator; template front_insert_iterator front_inserter(Container& x); template class insert_iterator; template insert_iterator inserter(Container& x, Iterator i); //Actual Template definitions template struct _UCXXEXPORT iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; }; //Pointer specialization - required by standard template struct _UCXXEXPORT iterator_traits { typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef random_access_iterator_tag iterator_category; }; //Specialization recomended by standard /* template struct _UCXXEXPORT iterator_traits { typedef long difference_type; typedef T value_type; typedef T __far* pointer; typedef T __far& reference; typedef random_access_iterator_tag iterator_category; };*/ /* template _UCXXEXPORT void reverse(BidirectionalIterator first, BidirectionalIterator last) { typename iterator_traits::difference_type n = distance(first, last); --n; while(n > 0){ typename iterator_traits::value_type tmp = *first; *first++ = * --last; *last = tmp; n -= 2; } };*/ template struct _UCXXEXPORT iterator { typedef T value_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; typedef Category iterator_category; }; template class _UCXXEXPORT reverse_iterator : public iterator::iterator_category, typename iterator_traits::value_type, typename iterator_traits::difference_type, typename iterator_traits::pointer, typename iterator_traits::reference> { protected: Iterator current; friend bool operator== (const reverse_iterator& x, const reverse_iterator& y); friend bool operator< (const reverse_iterator& x, const reverse_iterator& y); public: typedef Iterator iterator_type; reverse_iterator() : current(){}; explicit reverse_iterator(Iterator x) : current(x) { } template reverse_iterator(const reverse_iterator &x) : current(x.base()){} Iterator base() const { return current; } // explicit typename iterator_traits::reference operator*() const { Iterator tmp = current; return *--tmp; } typename iterator_traits::pointer operator->() const { return &(operator*()); } typename iterator_traits::reference operator[](typename iterator_traits::difference_type n) const{ return current[-n-1]; } reverse_iterator& operator++(){ --current; return *this; } reverse_iterator operator++(int) {reverse_iterator tmp = *this; --current; return tmp; } reverse_iterator& operator--() { ++ current; return *this; } reverse_iterator operator--(int) {reverse_iterator tmp = *this; ++current; return tmp; } reverse_iterator operator+ (typename iterator_traits::difference_type n) const{ reverse_iterator retval( *this ); retval+=n; return retval; } reverse_iterator& operator+=(typename iterator_traits::difference_type n){ current -= n; return *this; } reverse_iterator operator- (typename iterator_traits::difference_type n) const{ reverse_iterator retval( *this ); retval-=n; return retval; } reverse_iterator& operator-=(typename iterator_traits::difference_type n){ current += n; return *this; } }; template _UCXXEXPORT bool operator==(const reverse_iterator& x, const reverse_iterator& y) { return x.base() == y.base(); } template _UCXXEXPORT bool operator<(const reverse_iterator& x, const reverse_iterator& y) { return x.base() < y.base(); } template _UCXXEXPORT bool operator!=(const reverse_iterator& x, const reverse_iterator& y) { return x.base() != y.base(); } template _UCXXEXPORT bool operator>(const reverse_iterator& x, const reverse_iterator& y) { return x.base() > y.base(); } template _UCXXEXPORT bool operator>=(const reverse_iterator& x, const reverse_iterator& y) { return x.base() >= y.base(); } template _UCXXEXPORT bool operator<=(const reverse_iterator& x, const reverse_iterator& y) { return x.base() <= y.base(); } template _UCXXEXPORT typename reverse_iterator::difference_type operator-( const reverse_iterator& x, const reverse_iterator& y) { return y.base() - x.base(); } template _UCXXEXPORT reverse_iterator operator+(typename reverse_iterator::difference_type n, const reverse_iterator& x) { return reverse_iterator (x.base() - n); } template class _UCXXEXPORT back_insert_iterator : public iterator { protected: Container& container; public: typedef Container container_type; explicit back_insert_iterator(Container& x):container(x) {}; back_insert_iterator& operator=(const typename Container::value_type& value){ container.push_back(value); return *this; } back_insert_iterator& operator*(){ return *this; } back_insert_iterator& operator++(){ return *this; } back_insert_iterator operator++(int){ return *this; } }; template _UCXXEXPORT back_insert_iterator back_inserter(Container& x) { return back_insert_iterator(x); } template class _UCXXEXPORT front_insert_iterator : public iterator { protected: Container& container; public: typedef Container container_type; explicit front_insert_iterator(Container& x): container(x) {} front_insert_iterator& operator=(const typename Container::value_type& value){ container.push_front(value); return *this; } front_insert_iterator& operator*() { return *this; } front_insert_iterator& operator++() { return *this; } front_insert_iterator operator++(int) { return *this; } }; template _UCXXEXPORT front_insert_iterator front_inserter(Container& x) { return front_insert_iterator(x); } template class _UCXXEXPORT insert_iterator : public iterator { protected: Container& container; typename Container::iterator iter; public: typedef Container container_type; insert_iterator(Container& x, typename Container::iterator i) : container(x), iter(i) {} insert_iterator& operator=(const typename Container::value_type& value){ iter = container.insert(iter, value); ++iter; return *this; } insert_iterator& operator*() { return *this; } insert_iterator& operator++() { return *this; } insert_iterator operator++(int) { return *this; } }; template _UCXXEXPORT insert_iterator inserter(Container& x, Iterator i) { return insert_iterator(x,typename Container::iterator(i)); } } #endif