1ffeaf689SAlexander Kabaev // Backward-compat support -*- C++ -*- 2ffeaf689SAlexander Kabaev 3ffeaf689SAlexander Kabaev // Copyright (C) 2001, 2004 Free Software Foundation, Inc. 4ffeaf689SAlexander Kabaev // 5ffeaf689SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free 6ffeaf689SAlexander Kabaev // software; you can redistribute it and/or modify it under the 7ffeaf689SAlexander Kabaev // terms of the GNU General Public License as published by the 8ffeaf689SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option) 9ffeaf689SAlexander Kabaev // any later version. 10ffeaf689SAlexander Kabaev 11ffeaf689SAlexander Kabaev // This library is distributed in the hope that it will be useful, 12ffeaf689SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of 13ffeaf689SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14ffeaf689SAlexander Kabaev // GNU General Public License for more details. 15ffeaf689SAlexander Kabaev 16ffeaf689SAlexander Kabaev // You should have received a copy of the GNU General Public License along 17ffeaf689SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19ffeaf689SAlexander Kabaev // USA. 20ffeaf689SAlexander Kabaev 21ffeaf689SAlexander Kabaev // As a special exception, you may use this file as part of a free software 22ffeaf689SAlexander Kabaev // library without restriction. Specifically, if other files instantiate 23ffeaf689SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile 24ffeaf689SAlexander Kabaev // this file and link it with other files to produce an executable, this 25ffeaf689SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by 26ffeaf689SAlexander Kabaev // the GNU General Public License. This exception does not however 27ffeaf689SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by 28ffeaf689SAlexander Kabaev // the GNU General Public License. 29ffeaf689SAlexander Kabaev 3000db7afdSDavid E. O'Brien /* 3100db7afdSDavid E. O'Brien * 3200db7afdSDavid E. O'Brien * Copyright (c) 1994 3300db7afdSDavid E. O'Brien * Hewlett-Packard Company 3400db7afdSDavid E. O'Brien * 3500db7afdSDavid E. O'Brien * Permission to use, copy, modify, distribute and sell this software 3600db7afdSDavid E. O'Brien * and its documentation for any purpose is hereby granted without fee, 3700db7afdSDavid E. O'Brien * provided that the above copyright notice appear in all copies and 3800db7afdSDavid E. O'Brien * that both that copyright notice and this permission notice appear 3900db7afdSDavid E. O'Brien * in supporting documentation. Hewlett-Packard Company makes no 4000db7afdSDavid E. O'Brien * representations about the suitability of this software for any 4100db7afdSDavid E. O'Brien * purpose. It is provided "as is" without express or implied warranty. 4200db7afdSDavid E. O'Brien * 4300db7afdSDavid E. O'Brien * 4400db7afdSDavid E. O'Brien * Copyright (c) 1996 4500db7afdSDavid E. O'Brien * Silicon Graphics Computer Systems, Inc. 4600db7afdSDavid E. O'Brien * 4700db7afdSDavid E. O'Brien * Permission to use, copy, modify, distribute and sell this software 4800db7afdSDavid E. O'Brien * and its documentation for any purpose is hereby granted without fee, 4900db7afdSDavid E. O'Brien * provided that the above copyright notice appear in all copies and 5000db7afdSDavid E. O'Brien * that both that copyright notice and this permission notice appear 5100db7afdSDavid E. O'Brien * in supporting documentation. Silicon Graphics makes no 5200db7afdSDavid E. O'Brien * representations about the suitability of this software for any 5300db7afdSDavid E. O'Brien * purpose. It is provided "as is" without express or implied warranty. 5400db7afdSDavid E. O'Brien */ 5500db7afdSDavid E. O'Brien 56ffeaf689SAlexander Kabaev #ifndef _BACKWARD_ITERATOR_H 57ffeaf689SAlexander Kabaev #define _BACKWARD_ITERATOR_H 1 5800db7afdSDavid E. O'Brien 5900db7afdSDavid E. O'Brien #include "backward_warning.h" 6000db7afdSDavid E. O'Brien #include "function.h" 6100db7afdSDavid E. O'Brien #include <stddef.h> 6200db7afdSDavid E. O'Brien #include "iostream.h" 6300db7afdSDavid E. O'Brien #include <iterator> 6400db7afdSDavid E. O'Brien 6500db7afdSDavid E. O'Brien #include <bits/stl_construct.h> 6600db7afdSDavid E. O'Brien #include <bits/stl_raw_storage_iter.h> 6700db7afdSDavid E. O'Brien 6800db7afdSDavid E. O'Brien #include <ext/iterator> // For 3-parameter distance extension 6900db7afdSDavid E. O'Brien 7000db7afdSDavid E. O'Brien // Names from stl_iterator.h 7100db7afdSDavid E. O'Brien using std::input_iterator_tag; 7200db7afdSDavid E. O'Brien using std::output_iterator_tag; 7300db7afdSDavid E. O'Brien using std::forward_iterator_tag; 7400db7afdSDavid E. O'Brien using std::bidirectional_iterator_tag; 7500db7afdSDavid E. O'Brien using std::random_access_iterator_tag; 7600db7afdSDavid E. O'Brien 7700db7afdSDavid E. O'Brien #if 0 7800db7afdSDavid E. O'Brien using std::iterator; 7900db7afdSDavid E. O'Brien #endif 8000db7afdSDavid E. O'Brien 8100db7afdSDavid E. O'Brien // The base classes input_iterator, output_iterator, forward_iterator, 8200db7afdSDavid E. O'Brien // bidirectional_iterator, and random_access_iterator are not part of 8300db7afdSDavid E. O'Brien // the C++ standard. (They have been replaced by struct iterator.) 8400db7afdSDavid E. O'Brien // They are included for backward compatibility with the HP STL. 8500db7afdSDavid E. O'Brien template<typename _Tp, typename _Distance> 8600db7afdSDavid E. O'Brien struct input_iterator { 8700db7afdSDavid E. O'Brien typedef input_iterator_tag iterator_category; 8800db7afdSDavid E. O'Brien typedef _Tp value_type; 8900db7afdSDavid E. O'Brien typedef _Distance difference_type; 9000db7afdSDavid E. O'Brien typedef _Tp* pointer; 9100db7afdSDavid E. O'Brien typedef _Tp& reference; 9200db7afdSDavid E. O'Brien }; 9300db7afdSDavid E. O'Brien 9400db7afdSDavid E. O'Brien struct output_iterator { 9500db7afdSDavid E. O'Brien typedef output_iterator_tag iterator_category; 9600db7afdSDavid E. O'Brien typedef void value_type; 9700db7afdSDavid E. O'Brien typedef void difference_type; 9800db7afdSDavid E. O'Brien typedef void pointer; 9900db7afdSDavid E. O'Brien typedef void reference; 10000db7afdSDavid E. O'Brien }; 10100db7afdSDavid E. O'Brien 10200db7afdSDavid E. O'Brien template<typename _Tp, typename _Distance> 10300db7afdSDavid E. O'Brien struct forward_iterator { 10400db7afdSDavid E. O'Brien typedef forward_iterator_tag iterator_category; 10500db7afdSDavid E. O'Brien typedef _Tp value_type; 10600db7afdSDavid E. O'Brien typedef _Distance difference_type; 10700db7afdSDavid E. O'Brien typedef _Tp* pointer; 10800db7afdSDavid E. O'Brien typedef _Tp& reference; 10900db7afdSDavid E. O'Brien }; 11000db7afdSDavid E. O'Brien 11100db7afdSDavid E. O'Brien template<typename _Tp, typename _Distance> 11200db7afdSDavid E. O'Brien struct bidirectional_iterator { 11300db7afdSDavid E. O'Brien typedef bidirectional_iterator_tag iterator_category; 11400db7afdSDavid E. O'Brien typedef _Tp value_type; 11500db7afdSDavid E. O'Brien typedef _Distance difference_type; 11600db7afdSDavid E. O'Brien typedef _Tp* pointer; 11700db7afdSDavid E. O'Brien typedef _Tp& reference; 11800db7afdSDavid E. O'Brien }; 11900db7afdSDavid E. O'Brien 12000db7afdSDavid E. O'Brien template<typename _Tp, typename _Distance> 12100db7afdSDavid E. O'Brien struct random_access_iterator { 12200db7afdSDavid E. O'Brien typedef random_access_iterator_tag iterator_category; 12300db7afdSDavid E. O'Brien typedef _Tp value_type; 12400db7afdSDavid E. O'Brien typedef _Distance difference_type; 12500db7afdSDavid E. O'Brien typedef _Tp* pointer; 12600db7afdSDavid E. O'Brien typedef _Tp& reference; 12700db7afdSDavid E. O'Brien }; 12800db7afdSDavid E. O'Brien 12900db7afdSDavid E. O'Brien using std::iterator_traits; 13000db7afdSDavid E. O'Brien 13100db7afdSDavid E. O'Brien template <class _Iter> 13200db7afdSDavid E. O'Brien inline typename iterator_traits<_Iter>::iterator_category iterator_category(const _Iter & __i)13300db7afdSDavid E. O'Brien iterator_category(const _Iter& __i) 13400db7afdSDavid E. O'Brien { return __iterator_category(__i); } 13500db7afdSDavid E. O'Brien 13600db7afdSDavid E. O'Brien template <class _Iter> 13700db7afdSDavid E. O'Brien inline typename iterator_traits<_Iter>::difference_type* distance_type(const _Iter &)13800db7afdSDavid E. O'Brien distance_type(const _Iter&) 13900db7afdSDavid E. O'Brien { return static_cast<typename iterator_traits<_Iter>::difference_type*>(0); } 14000db7afdSDavid E. O'Brien 14100db7afdSDavid E. O'Brien template<class _Iter> 14200db7afdSDavid E. O'Brien inline typename iterator_traits<_Iter>::value_type* value_type(const _Iter & __i)14300db7afdSDavid E. O'Brien value_type(const _Iter& __i) 14400db7afdSDavid E. O'Brien { return static_cast<typename iterator_traits<_Iter>::value_type*>(0); } 14500db7afdSDavid E. O'Brien 14600db7afdSDavid E. O'Brien using std::distance; 14700db7afdSDavid E. O'Brien using __gnu_cxx::distance; // 3-parameter extension 14800db7afdSDavid E. O'Brien using std::advance; 14900db7afdSDavid E. O'Brien 15000db7afdSDavid E. O'Brien using std::insert_iterator; 15100db7afdSDavid E. O'Brien using std::front_insert_iterator; 15200db7afdSDavid E. O'Brien using std::back_insert_iterator; 15300db7afdSDavid E. O'Brien using std::inserter; 15400db7afdSDavid E. O'Brien using std::front_inserter; 15500db7afdSDavid E. O'Brien using std::back_inserter; 15600db7afdSDavid E. O'Brien 15700db7afdSDavid E. O'Brien using std::reverse_iterator; 15800db7afdSDavid E. O'Brien 15900db7afdSDavid E. O'Brien using std::istream_iterator; 16000db7afdSDavid E. O'Brien using std::ostream_iterator; 16100db7afdSDavid E. O'Brien 16200db7afdSDavid E. O'Brien // Names from stl_construct.h 16300db7afdSDavid E. O'Brien template<class _T1, class _T2> 16400db7afdSDavid E. O'Brien inline void construct(_T1 * __p,const _T2 & __value)16500db7afdSDavid E. O'Brien construct(_T1* __p, const _T2& __value) 16600db7afdSDavid E. O'Brien { std::_Construct(__p, __value); } 16700db7afdSDavid E. O'Brien 16800db7afdSDavid E. O'Brien template<class _T1> 16900db7afdSDavid E. O'Brien inline void construct(_T1 * __p)17000db7afdSDavid E. O'Brien construct(_T1* __p) 17100db7afdSDavid E. O'Brien { std::_Construct(__p); } 17200db7afdSDavid E. O'Brien 17300db7afdSDavid E. O'Brien template <class _Tp> 17400db7afdSDavid E. O'Brien inline void destroy(_Tp * __pointer)17500db7afdSDavid E. O'Brien destroy(_Tp* __pointer) 17600db7afdSDavid E. O'Brien { std::_Destroy(__pointer); } 17700db7afdSDavid E. O'Brien 17800db7afdSDavid E. O'Brien template <class _ForwardIterator> 17900db7afdSDavid E. O'Brien inline void destroy(_ForwardIterator __first,_ForwardIterator __last)18000db7afdSDavid E. O'Brien destroy(_ForwardIterator __first, _ForwardIterator __last) 18100db7afdSDavid E. O'Brien { std::_Destroy(__first, __last); } 18200db7afdSDavid E. O'Brien 18300db7afdSDavid E. O'Brien 18400db7afdSDavid E. O'Brien // Names from stl_raw_storage_iter.h 18500db7afdSDavid E. O'Brien using std::raw_storage_iterator; 18600db7afdSDavid E. O'Brien 187ffeaf689SAlexander Kabaev #endif /* _BACKWARD_ITERATOR_H */ 188