williamr@4
|
1 |
/*
|
williamr@4
|
2 |
*
|
williamr@4
|
3 |
* Copyright (c) 1994
|
williamr@4
|
4 |
* Hewlett-Packard Company
|
williamr@4
|
5 |
*
|
williamr@4
|
6 |
* Copyright (c) 1996-1998
|
williamr@4
|
7 |
* Silicon Graphics Computer Systems, Inc.
|
williamr@4
|
8 |
*
|
williamr@4
|
9 |
* Copyright (c) 1997
|
williamr@4
|
10 |
* Moscow Center for SPARC Technology
|
williamr@4
|
11 |
*
|
williamr@4
|
12 |
* Copyright (c) 1999
|
williamr@4
|
13 |
* Boris Fomitchev
|
williamr@4
|
14 |
*
|
williamr@4
|
15 |
* This material is provided "as is", with absolutely no warranty expressed
|
williamr@4
|
16 |
* or implied. Any use is at your own risk.
|
williamr@4
|
17 |
*
|
williamr@4
|
18 |
* Permission to use or copy this software for any purpose is hereby granted
|
williamr@4
|
19 |
* without fee, provided the above notices are retained on all copies.
|
williamr@4
|
20 |
* Permission to modify the code and to distribute modified code is granted,
|
williamr@4
|
21 |
* provided the above notices are retained, and a notice that the code was
|
williamr@4
|
22 |
* modified is included with the above copyright notice.
|
williamr@4
|
23 |
*
|
williamr@4
|
24 |
*/
|
williamr@4
|
25 |
|
williamr@4
|
26 |
/* NOTE: This is an internal header file, included by other STL headers.
|
williamr@4
|
27 |
* You should not attempt to use it directly.
|
williamr@4
|
28 |
*/
|
williamr@4
|
29 |
|
williamr@4
|
30 |
#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
|
williamr@4
|
31 |
#define _STLP_INTERNAL_ITERATOR_BASE_H
|
williamr@4
|
32 |
|
williamr@4
|
33 |
#ifndef _STLP_CSTDDEF
|
williamr@4
|
34 |
# include <cstddef>
|
williamr@4
|
35 |
#endif
|
williamr@4
|
36 |
|
williamr@4
|
37 |
# if defined (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
|
williamr@4
|
38 |
_STLP_BEGIN_NAMESPACE
|
williamr@4
|
39 |
using namespace _STLP_VENDOR_CSTD;
|
williamr@4
|
40 |
_STLP_END_NAMESPACE
|
williamr@4
|
41 |
#endif /* _STLP_IMPORT_VENDOR_CSTD */
|
williamr@4
|
42 |
|
williamr@4
|
43 |
#ifndef __TYPE_TRAITS_H
|
williamr@4
|
44 |
# include <stl/type_traits.h>
|
williamr@4
|
45 |
#endif
|
williamr@4
|
46 |
|
williamr@4
|
47 |
_STLP_BEGIN_NAMESPACE
|
williamr@4
|
48 |
|
williamr@4
|
49 |
struct input_iterator_tag {};
|
williamr@4
|
50 |
struct output_iterator_tag {};
|
williamr@4
|
51 |
struct forward_iterator_tag : public input_iterator_tag {};
|
williamr@4
|
52 |
struct bidirectional_iterator_tag : public forward_iterator_tag {};
|
williamr@4
|
53 |
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
|
williamr@4
|
54 |
|
williamr@4
|
55 |
|
williamr@4
|
56 |
template <class _Category, class _Tp, __DFL_TMPL_PARAM(_Distance,ptrdiff_t),
|
williamr@4
|
57 |
__DFL_TMPL_PARAM(_Pointer,_Tp*), __DFL_TMPL_PARAM(_Reference,_Tp&) >
|
williamr@4
|
58 |
struct iterator {
|
williamr@4
|
59 |
typedef _Category iterator_category;
|
williamr@4
|
60 |
typedef _Tp value_type;
|
williamr@4
|
61 |
typedef _Distance difference_type;
|
williamr@4
|
62 |
typedef _Pointer pointer;
|
williamr@4
|
63 |
typedef _Reference reference;
|
williamr@4
|
64 |
};
|
williamr@4
|
65 |
_STLP_TEMPLATE_NULL
|
williamr@4
|
66 |
struct iterator<output_iterator_tag, void, void, void, void> {
|
williamr@4
|
67 |
typedef output_iterator_tag iterator_category;
|
williamr@4
|
68 |
#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
|
williamr@4
|
69 |
typedef void value_type;
|
williamr@4
|
70 |
typedef void difference_type;
|
williamr@4
|
71 |
typedef void pointer;
|
williamr@4
|
72 |
typedef void reference;
|
williamr@4
|
73 |
#endif
|
williamr@4
|
74 |
};
|
williamr@4
|
75 |
|
williamr@4
|
76 |
# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
|
williamr@4
|
77 |
# define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_category(_It)
|
williamr@4
|
78 |
# define _STLP_DISTANCE_TYPE(_It, _Tp) distance_type(_It)
|
williamr@4
|
79 |
# define _STLP_VALUE_TYPE(_It, _Tp) value_type(_It)
|
williamr@4
|
80 |
# else
|
williamr@4
|
81 |
# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
|
williamr@4
|
82 |
# define _STLP_VALUE_TYPE(_It, _Tp) (typename iterator_traits< _Tp >::value_type*)0
|
williamr@4
|
83 |
# define _STLP_DISTANCE_TYPE(_It, _Tp) (typename iterator_traits< _Tp >::difference_type*)0
|
williamr@4
|
84 |
# if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
|
williamr@4
|
85 |
# define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_traits< _Tp >::iterator_category()
|
williamr@4
|
86 |
# else
|
williamr@4
|
87 |
# define _STLP_ITERATOR_CATEGORY(_It, _Tp) typename iterator_traits< _Tp >::iterator_category()
|
williamr@4
|
88 |
# endif
|
williamr@4
|
89 |
# else
|
williamr@4
|
90 |
# define _STLP_ITERATOR_CATEGORY(_It, _Tp) __iterator_category(_It, _IsPtrType<_Tp>::_Ret())
|
williamr@4
|
91 |
# define _STLP_DISTANCE_TYPE(_It, _Tp) (ptrdiff_t*)0
|
williamr@4
|
92 |
# define _STLP_VALUE_TYPE(_It, _Tp) __value_type(_It, _IsPtrType<_Tp>::_Ret() )
|
williamr@4
|
93 |
# endif
|
williamr@4
|
94 |
# endif
|
williamr@4
|
95 |
|
williamr@4
|
96 |
template <class _Iterator>
|
williamr@4
|
97 |
struct iterator_traits {
|
williamr@4
|
98 |
typedef typename _Iterator::iterator_category iterator_category;
|
williamr@4
|
99 |
typedef typename _Iterator::value_type value_type;
|
williamr@4
|
100 |
typedef typename _Iterator::difference_type difference_type;
|
williamr@4
|
101 |
typedef typename _Iterator::pointer pointer;
|
williamr@4
|
102 |
typedef typename _Iterator::reference reference;
|
williamr@4
|
103 |
};
|
williamr@4
|
104 |
|
williamr@4
|
105 |
|
williamr@4
|
106 |
# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (__SUNPRO_CC)
|
williamr@4
|
107 |
# define _STLP_DIFFERENCE_TYPE(_Iterator) typename iterator_traits<_Iterator>::difference_type
|
williamr@4
|
108 |
# else
|
williamr@4
|
109 |
# define _STLP_DIFFERENCE_TYPE(_Iterator) ptrdiff_t
|
williamr@4
|
110 |
# endif
|
williamr@4
|
111 |
|
williamr@4
|
112 |
# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
|
williamr@4
|
113 |
|
williamr@4
|
114 |
// fbp : this order keeps gcc happy
|
williamr@4
|
115 |
template <class _Tp>
|
williamr@4
|
116 |
struct iterator_traits<const _Tp*> {
|
williamr@4
|
117 |
typedef random_access_iterator_tag iterator_category;
|
williamr@4
|
118 |
typedef _Tp value_type;
|
williamr@4
|
119 |
typedef ptrdiff_t difference_type;
|
williamr@4
|
120 |
typedef const _Tp* pointer;
|
williamr@4
|
121 |
typedef const _Tp& reference;
|
williamr@4
|
122 |
};
|
williamr@4
|
123 |
|
williamr@4
|
124 |
template <class _Tp>
|
williamr@4
|
125 |
struct iterator_traits<_Tp*> {
|
williamr@4
|
126 |
typedef random_access_iterator_tag iterator_category;
|
williamr@4
|
127 |
typedef _Tp value_type;
|
williamr@4
|
128 |
typedef ptrdiff_t difference_type;
|
williamr@4
|
129 |
typedef _Tp* pointer;
|
williamr@4
|
130 |
typedef _Tp& reference;
|
williamr@4
|
131 |
};
|
williamr@4
|
132 |
|
williamr@4
|
133 |
# if defined (__BORLANDC__)
|
williamr@4
|
134 |
template <class _Tp>
|
williamr@4
|
135 |
struct iterator_traits<_Tp* const> {
|
williamr@4
|
136 |
typedef random_access_iterator_tag iterator_category;
|
williamr@4
|
137 |
typedef _Tp value_type;
|
williamr@4
|
138 |
typedef ptrdiff_t difference_type;
|
williamr@4
|
139 |
typedef const _Tp* pointer;
|
williamr@4
|
140 |
typedef const _Tp& reference;
|
williamr@4
|
141 |
};
|
williamr@4
|
142 |
# endif
|
williamr@4
|
143 |
|
williamr@4
|
144 |
# endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
|
williamr@4
|
145 |
|
williamr@4
|
146 |
|
williamr@4
|
147 |
# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) \
|
williamr@4
|
148 |
|| (defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) && ! defined (_STLP_NO_ARROW_OPERATOR))
|
williamr@4
|
149 |
# define _STLP_POINTERS_SPECIALIZE( _TpP )
|
williamr@4
|
150 |
# define _STLP_DEFINE_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }
|
williamr@4
|
151 |
# else
|
williamr@4
|
152 |
# include <stl/_ptrs_specialize.h>
|
williamr@4
|
153 |
# endif
|
williamr@4
|
154 |
|
williamr@4
|
155 |
# ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES
|
williamr@4
|
156 |
// The overloaded functions iterator_category, distance_type, and
|
williamr@4
|
157 |
// value_type are not part of the C++ standard. (They have been
|
williamr@4
|
158 |
// replaced by struct iterator_traits.) They are included for
|
williamr@4
|
159 |
// backward compatibility with the HP STL.
|
williamr@4
|
160 |
// We introduce internal names for these functions.
|
williamr@4
|
161 |
|
williamr@4
|
162 |
# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
|
williamr@4
|
163 |
|
williamr@4
|
164 |
template <class _Iter>
|
williamr@4
|
165 |
inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) {
|
williamr@4
|
166 |
typedef typename iterator_traits<_Iter>::iterator_category _Category;
|
williamr@4
|
167 |
return _Category();
|
williamr@4
|
168 |
}
|
williamr@4
|
169 |
|
williamr@4
|
170 |
template <class _Iter>
|
williamr@4
|
171 |
inline typename iterator_traits<_Iter>::difference_type* __distance_type(const _Iter&) {
|
williamr@4
|
172 |
typedef typename iterator_traits<_Iter>::difference_type _diff_type;
|
williamr@4
|
173 |
return __STATIC_CAST(_diff_type*,0);
|
williamr@4
|
174 |
}
|
williamr@4
|
175 |
|
williamr@4
|
176 |
template <class _Iter>
|
williamr@4
|
177 |
inline typename iterator_traits<_Iter>::value_type* __value_type(const _Iter&) {
|
williamr@4
|
178 |
typedef typename iterator_traits<_Iter>::value_type _value_type;
|
williamr@4
|
179 |
return __STATIC_CAST(_value_type*,0);
|
williamr@4
|
180 |
}
|
williamr@4
|
181 |
|
williamr@4
|
182 |
# else
|
williamr@4
|
183 |
|
williamr@4
|
184 |
template <class _Iter>
|
williamr@4
|
185 |
inline random_access_iterator_tag
|
williamr@4
|
186 |
__iterator_category(const _Iter&, const __true_type&) {
|
williamr@4
|
187 |
return random_access_iterator_tag();
|
williamr@4
|
188 |
}
|
williamr@4
|
189 |
|
williamr@4
|
190 |
template <class _Iter>
|
williamr@4
|
191 |
inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::iterator_category
|
williamr@4
|
192 |
__iterator_category(const _Iter&, const __false_type&) {
|
williamr@4
|
193 |
typedef typename iterator_traits<_Iter>::iterator_category _Category;
|
williamr@4
|
194 |
return _Category();
|
williamr@4
|
195 |
}
|
williamr@4
|
196 |
|
williamr@4
|
197 |
|
williamr@4
|
198 |
template <class _Iter>
|
williamr@4
|
199 |
inline ptrdiff_t* _STLP_CALL __distance_type(const _Iter&) { return (ptrdiff_t*)(0); }
|
williamr@4
|
200 |
|
williamr@4
|
201 |
template <class _Iter>
|
williamr@4
|
202 |
inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::value_type*
|
williamr@4
|
203 |
__value_type(const _Iter&, const __false_type&) {
|
williamr@4
|
204 |
typedef typename iterator_traits<_Iter>::value_type _value_type;
|
williamr@4
|
205 |
return __STATIC_CAST(_value_type*,0);
|
williamr@4
|
206 |
}
|
williamr@4
|
207 |
|
williamr@4
|
208 |
template <class _Tp>
|
williamr@4
|
209 |
inline _Tp*
|
williamr@4
|
210 |
__value_type(const _Tp*, const __true_type&) {
|
williamr@4
|
211 |
return __STATIC_CAST(_Tp*, 0);
|
williamr@4
|
212 |
}
|
williamr@4
|
213 |
|
williamr@4
|
214 |
# endif
|
williamr@4
|
215 |
|
williamr@4
|
216 |
#else /* old queries */
|
williamr@4
|
217 |
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
|
williamr@4
|
218 |
inline _Category _STLP_CALL iterator_category(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return _Category(); }
|
williamr@4
|
219 |
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
|
williamr@4
|
220 |
inline _Tp* _STLP_CALL value_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Tp*)(0); }
|
williamr@4
|
221 |
template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
|
williamr@4
|
222 |
inline _Distance* _STLP_CALL distance_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Distance*)(0); }
|
williamr@4
|
223 |
template <class _Tp>
|
williamr@4
|
224 |
inline random_access_iterator_tag _STLP_CALL iterator_category(const _Tp*) { return random_access_iterator_tag(); }
|
williamr@4
|
225 |
template <class _Tp>
|
williamr@4
|
226 |
inline _Tp* _STLP_CALL value_type(const _Tp*) { return (_Tp*)(0); }
|
williamr@4
|
227 |
template <class _Tp>
|
williamr@4
|
228 |
inline ptrdiff_t* _STLP_CALL distance_type(const _Tp*) { return (ptrdiff_t*)(0); }
|
williamr@4
|
229 |
#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
|
williamr@4
|
230 |
|
williamr@4
|
231 |
# if ! defined (_STLP_NO_ANACHRONISMS)
|
williamr@4
|
232 |
// The base classes input_iterator, output_iterator, forward_iterator,
|
williamr@4
|
233 |
// bidirectional_iterator, and random_access_iterator are not part of
|
williamr@4
|
234 |
// the C++ standard. (They have been replaced by struct iterator.)
|
williamr@4
|
235 |
// They are included for backward compatibility with the HP STL.
|
williamr@4
|
236 |
template <class _Tp, class _Distance> struct input_iterator :
|
williamr@4
|
237 |
public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
|
williamr@4
|
238 |
struct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};
|
williamr@4
|
239 |
template <class _Tp, class _Distance> struct forward_iterator :
|
williamr@4
|
240 |
public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
|
williamr@4
|
241 |
template <class _Tp, class _Distance> struct bidirectional_iterator :
|
williamr@4
|
242 |
public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
|
williamr@4
|
243 |
template <class _Tp, class _Distance> struct random_access_iterator :
|
williamr@4
|
244 |
public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
|
williamr@4
|
245 |
|
williamr@4
|
246 |
# if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
|
williamr@4
|
247 |
template <class _Tp, class _Distance>
|
williamr@4
|
248 |
inline input_iterator_tag _STLP_CALL
|
williamr@4
|
249 |
iterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }
|
williamr@4
|
250 |
inline output_iterator_tag _STLP_CALL
|
williamr@4
|
251 |
iterator_category(const output_iterator&) { return output_iterator_tag(); }
|
williamr@4
|
252 |
template <class _Tp, class _Distance>
|
williamr@4
|
253 |
inline forward_iterator_tag _STLP_CALL
|
williamr@4
|
254 |
iterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }
|
williamr@4
|
255 |
template <class _Tp, class _Distance>
|
williamr@4
|
256 |
inline bidirectional_iterator_tag _STLP_CALL
|
williamr@4
|
257 |
iterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }
|
williamr@4
|
258 |
template <class _Tp, class _Distance>
|
williamr@4
|
259 |
inline random_access_iterator_tag _STLP_CALL
|
williamr@4
|
260 |
iterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }
|
williamr@4
|
261 |
template <class _Tp, class _Distance>
|
williamr@4
|
262 |
inline _Tp* _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
|
williamr@4
|
263 |
template <class _Tp, class _Distance>
|
williamr@4
|
264 |
inline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
|
williamr@4
|
265 |
template <class _Tp, class _Distance>
|
williamr@4
|
266 |
inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
|
williamr@4
|
267 |
template <class _Tp, class _Distance>
|
williamr@4
|
268 |
inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
|
williamr@4
|
269 |
template <class _Tp, class _Distance>
|
williamr@4
|
270 |
inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
|
williamr@4
|
271 |
template <class _Tp, class _Distance>
|
williamr@4
|
272 |
inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
|
williamr@4
|
273 |
template <class _Tp, class _Distance>
|
williamr@4
|
274 |
inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Distance*)(0);}
|
williamr@4
|
275 |
template <class _Tp, class _Distance>
|
williamr@4
|
276 |
inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
|
williamr@4
|
277 |
# endif /* BASE_MATCH */
|
williamr@4
|
278 |
|
williamr@4
|
279 |
#endif /* _STLP_NO_ANACHRONISMS */
|
williamr@4
|
280 |
|
williamr@4
|
281 |
template <class _InputIterator, class _Distance>
|
williamr@4
|
282 |
inline void _STLP_CALL __distance(const _InputIterator& __first, const _InputIterator& __last,
|
williamr@4
|
283 |
_Distance& __n, const input_iterator_tag &) {
|
williamr@4
|
284 |
_InputIterator __it(__first);
|
williamr@4
|
285 |
while (__it != __last) { ++__it; ++__n; }
|
williamr@4
|
286 |
}
|
williamr@4
|
287 |
|
williamr@4
|
288 |
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
|
williamr@4
|
289 |
template <class _ForwardIterator, class _Distance>
|
williamr@4
|
290 |
inline void _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
|
williamr@4
|
291 |
_Distance& __n, const forward_iterator_tag &) {
|
williamr@4
|
292 |
_ForwardIterator __it(__first);
|
williamr@4
|
293 |
while (__it != __last) { ++__first; ++__n; }
|
williamr@4
|
294 |
}
|
williamr@4
|
295 |
|
williamr@4
|
296 |
template <class _BidirectionalIterator, class _Distance>
|
williamr@4
|
297 |
_STLP_INLINE_LOOP void _STLP_CALL __distance(const _BidirectionalIterator& __first,
|
williamr@4
|
298 |
const _BidirectionalIterator& __last,
|
williamr@4
|
299 |
_Distance& __n, const bidirectional_iterator_tag &) {
|
williamr@4
|
300 |
_BidirectionalIterator __it(__first);
|
williamr@4
|
301 |
while (__it != __last) { ++__it; ++__n; }
|
williamr@4
|
302 |
}
|
williamr@4
|
303 |
# endif
|
williamr@4
|
304 |
|
williamr@4
|
305 |
template <class _RandomAccessIterator, class _Distance>
|
williamr@4
|
306 |
inline void _STLP_CALL __distance(const _RandomAccessIterator& __first,
|
williamr@4
|
307 |
const _RandomAccessIterator& __last,
|
williamr@4
|
308 |
_Distance& __n, const random_access_iterator_tag &) {
|
williamr@4
|
309 |
__n += __last - __first;
|
williamr@4
|
310 |
}
|
williamr@4
|
311 |
|
williamr@4
|
312 |
#ifndef _STLP_NO_ANACHRONISMS
|
williamr@4
|
313 |
template <class _InputIterator, class _Distance>
|
williamr@4
|
314 |
inline void _STLP_CALL distance(const _InputIterator& __first,
|
williamr@4
|
315 |
const _InputIterator& __last, _Distance& __n) {
|
williamr@4
|
316 |
__distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
|
williamr@4
|
317 |
}
|
williamr@4
|
318 |
#endif
|
williamr@4
|
319 |
|
williamr@4
|
320 |
template <class _InputIterator>
|
williamr@4
|
321 |
inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
|
williamr@4
|
322 |
__distance(const _InputIterator& __first, const _InputIterator& __last, const input_iterator_tag &) {
|
williamr@4
|
323 |
_STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0;
|
williamr@4
|
324 |
_InputIterator __it(__first);
|
williamr@4
|
325 |
while (__it != __last) {
|
williamr@4
|
326 |
++__it; ++__n;
|
williamr@4
|
327 |
}
|
williamr@4
|
328 |
return __n;
|
williamr@4
|
329 |
}
|
williamr@4
|
330 |
|
williamr@4
|
331 |
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
|
williamr@4
|
332 |
template <class _ForwardIterator>
|
williamr@4
|
333 |
inline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL
|
williamr@4
|
334 |
__distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
|
williamr@4
|
335 |
const forward_iterator_tag &)
|
williamr@4
|
336 |
{
|
williamr@4
|
337 |
_STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0;
|
williamr@4
|
338 |
_ForwardIterator __it(__first);
|
williamr@4
|
339 |
while (__it != __last) {
|
williamr@4
|
340 |
++__it; ++__n;
|
williamr@4
|
341 |
}
|
williamr@4
|
342 |
return __n;
|
williamr@4
|
343 |
}
|
williamr@4
|
344 |
|
williamr@4
|
345 |
template <class _BidirectionalIterator>
|
williamr@4
|
346 |
_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL
|
williamr@4
|
347 |
__distance(const _BidirectionalIterator& __first,
|
williamr@4
|
348 |
const _BidirectionalIterator& __last,
|
williamr@4
|
349 |
const bidirectional_iterator_tag &) {
|
williamr@4
|
350 |
_STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0;
|
williamr@4
|
351 |
_BidirectionalIterator __it(__first);
|
williamr@4
|
352 |
while (__it != __last) {
|
williamr@4
|
353 |
++__it; ++__n;
|
williamr@4
|
354 |
}
|
williamr@4
|
355 |
return __n;
|
williamr@4
|
356 |
}
|
williamr@4
|
357 |
# endif
|
williamr@4
|
358 |
|
williamr@4
|
359 |
template <class _RandomAccessIterator>
|
williamr@4
|
360 |
inline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL
|
williamr@4
|
361 |
__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last,
|
williamr@4
|
362 |
const random_access_iterator_tag &) {
|
williamr@4
|
363 |
return __last - __first;
|
williamr@4
|
364 |
}
|
williamr@4
|
365 |
|
williamr@4
|
366 |
template <class _InputIterator>
|
williamr@4
|
367 |
inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
|
williamr@4
|
368 |
distance(const _InputIterator& __first, const _InputIterator& __last) {
|
williamr@4
|
369 |
return __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
|
williamr@4
|
370 |
}
|
williamr@4
|
371 |
|
williamr@4
|
372 |
|
williamr@4
|
373 |
// fbp: those are being used for iterator/const_iterator definitions everywhere
|
williamr@4
|
374 |
template <class _Tp>
|
williamr@4
|
375 |
struct _Nonconst_traits;
|
williamr@4
|
376 |
|
williamr@4
|
377 |
template <class _Tp>
|
williamr@4
|
378 |
struct _Const_traits {
|
williamr@4
|
379 |
typedef _Tp value_type;
|
williamr@4
|
380 |
typedef const _Tp& reference;
|
williamr@4
|
381 |
typedef const _Tp* pointer;
|
williamr@4
|
382 |
typedef _Nonconst_traits<_Tp> _Non_const_traits;
|
williamr@4
|
383 |
};
|
williamr@4
|
384 |
|
williamr@4
|
385 |
template <class _Tp>
|
williamr@4
|
386 |
struct _Nonconst_traits {
|
williamr@4
|
387 |
typedef _Tp value_type;
|
williamr@4
|
388 |
typedef _Tp& reference;
|
williamr@4
|
389 |
typedef _Tp* pointer;
|
williamr@4
|
390 |
typedef _Nonconst_traits<_Tp> _Non_const_traits;
|
williamr@4
|
391 |
};
|
williamr@4
|
392 |
|
williamr@4
|
393 |
# if defined (_STLP_BASE_TYPEDEF_BUG)
|
williamr@4
|
394 |
// this workaround is needed for SunPro 4.0.1
|
williamr@4
|
395 |
template <class _Traits>
|
williamr@4
|
396 |
struct __cnst_traits_aux : private _Traits
|
williamr@4
|
397 |
{
|
williamr@4
|
398 |
typedef typename _Traits::value_type value_type;
|
williamr@4
|
399 |
};
|
williamr@4
|
400 |
# define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type
|
williamr@4
|
401 |
# else
|
williamr@4
|
402 |
# define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type
|
williamr@4
|
403 |
# endif
|
williamr@4
|
404 |
|
williamr@4
|
405 |
# if defined (_STLP_MSVC)
|
williamr@4
|
406 |
// MSVC specific
|
williamr@4
|
407 |
template <class _InputIterator, class _Dist>
|
williamr@4
|
408 |
inline void _STLP_CALL _Distance(_InputIterator __first,
|
williamr@4
|
409 |
_InputIterator __last, _Dist& __n) {
|
williamr@4
|
410 |
__distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
|
williamr@4
|
411 |
}
|
williamr@4
|
412 |
# endif
|
williamr@4
|
413 |
|
williamr@4
|
414 |
template <class _InputIter, class _Distance>
|
williamr@4
|
415 |
_STLP_INLINE_LOOP void _STLP_CALL __advance(_InputIter& __i, _Distance __n, const input_iterator_tag &) {
|
williamr@4
|
416 |
while (__n--) ++__i;
|
williamr@4
|
417 |
}
|
williamr@4
|
418 |
|
williamr@4
|
419 |
// fbp : added output iterator tag variant
|
williamr@4
|
420 |
template <class _InputIter, class _Distance>
|
williamr@4
|
421 |
_STLP_INLINE_LOOP void _STLP_CALL __advance(_InputIter& __i, _Distance __n, const output_iterator_tag &) {
|
williamr@4
|
422 |
while (__n--) ++__i;
|
williamr@4
|
423 |
}
|
williamr@4
|
424 |
|
williamr@4
|
425 |
# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
|
williamr@4
|
426 |
template <class _ForwardIterator, class _Distance>
|
williamr@4
|
427 |
_STLP_INLINE_LOOP void _STLP_CALL __advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &) {
|
williamr@4
|
428 |
while (n--) ++i;
|
williamr@4
|
429 |
}
|
williamr@4
|
430 |
# endif
|
williamr@4
|
431 |
|
williamr@4
|
432 |
template <class _BidirectionalIterator, class _Distance>
|
williamr@4
|
433 |
_STLP_INLINE_LOOP void _STLP_CALL __advance(_BidirectionalIterator& __i, _Distance __n,
|
williamr@4
|
434 |
const bidirectional_iterator_tag &) {
|
williamr@4
|
435 |
if (__n > 0)
|
williamr@4
|
436 |
while (__n--) ++__i;
|
williamr@4
|
437 |
else
|
williamr@4
|
438 |
while (__n++) --__i;
|
williamr@4
|
439 |
}
|
williamr@4
|
440 |
|
williamr@4
|
441 |
template <class _RandomAccessIterator, class _Distance>
|
williamr@4
|
442 |
inline void _STLP_CALL __advance(_RandomAccessIterator& __i, _Distance __n,
|
williamr@4
|
443 |
const random_access_iterator_tag &) {
|
williamr@4
|
444 |
__i += __n;
|
williamr@4
|
445 |
}
|
williamr@4
|
446 |
|
williamr@4
|
447 |
template <class _InputIterator, class _Distance>
|
williamr@4
|
448 |
inline void _STLP_CALL advance(_InputIterator& __i, _Distance __n) {
|
williamr@4
|
449 |
__advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator));
|
williamr@4
|
450 |
}
|
williamr@4
|
451 |
|
williamr@4
|
452 |
_STLP_END_NAMESPACE
|
williamr@4
|
453 |
|
williamr@4
|
454 |
# if defined (_STLP_DEBUG) && ! defined (_STLP_DEBUG_H)
|
williamr@4
|
455 |
# include <stl/debug/_debug.h>
|
williamr@4
|
456 |
# endif
|
williamr@4
|
457 |
|
williamr@4
|
458 |
#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */
|
williamr@4
|
459 |
|
williamr@4
|
460 |
|
williamr@4
|
461 |
// Local Variables:
|
williamr@4
|
462 |
// mode:C++
|
williamr@4
|
463 |
// End:
|