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