00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #ifndef __SGI_STL_INTERNAL_ITERATOR_BASE_FUNCS_H
00061 #define __SGI_STL_INTERNAL_ITERATOR_BASE_FUNCS_H
00062
00063
00064
00065
00066
00067
00068 #pragma GCC system_header
00069 #include <bits/concept_check.h>
00070
00071 namespace std
00072 {
00073
00074
00075
00076
00077
00078 template <class _InputIterator, class _Distance>
00079 inline void __distance(_InputIterator __first, _InputIterator __last,
00080 _Distance& __n, input_iterator_tag)
00081 {
00082
00083 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>);
00084 while (__first != __last) { ++__first; ++__n; }
00085 }
00086
00087 template <class _RandomAccessIterator, class _Distance>
00088 inline void __distance(_RandomAccessIterator __first,
00089 _RandomAccessIterator __last,
00090 _Distance& __n, random_access_iterator_tag)
00091 {
00092
00093 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>);
00094 __n += __last - __first;
00095 }
00096
00097 template <class _InputIterator, class _Distance>
00098 inline void distance(_InputIterator __first,
00099 _InputIterator __last, _Distance& __n)
00100 {
00101
00102 __distance(__first, __last, __n, iterator_category(__first));
00103 }
00104
00105 template <class _InputIterator>
00106 inline typename iterator_traits<_InputIterator>::difference_type
00107 __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)
00108 {
00109
00110 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>);
00111 typename iterator_traits<_InputIterator>::difference_type __n = 0;
00112 while (__first != __last) {
00113 ++__first; ++__n;
00114 }
00115 return __n;
00116 }
00117
00118 template <class _RandomAccessIterator>
00119 inline typename iterator_traits<_RandomAccessIterator>::difference_type
00120 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
00121 random_access_iterator_tag)
00122 {
00123
00124 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>);
00125 return __last - __first;
00126 }
00127
00128 template <class _InputIterator>
00129 inline typename iterator_traits<_InputIterator>::difference_type
00130 distance(_InputIterator __first, _InputIterator __last)
00131 {
00132
00133 typedef typename iterator_traits<_InputIterator>::iterator_category
00134 _Category;
00135 return __distance(__first, __last, _Category());
00136 }
00137
00138 template <class _InputIter, class _Distance>
00139 inline void __advance(_InputIter& __i, _Distance __n, input_iterator_tag)
00140 {
00141
00142 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
00143 while (__n--) ++__i;
00144 }
00145
00146 template <class _BidirectionalIterator, class _Distance>
00147 inline void __advance(_BidirectionalIterator& __i, _Distance __n,
00148 bidirectional_iterator_tag)
00149 {
00150
00151 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIterator>);
00152 if (__n > 0)
00153 while (__n--) ++__i;
00154 else
00155 while (__n++) --__i;
00156 }
00157
00158 template <class _RandomAccessIterator, class _Distance>
00159 inline void __advance(_RandomAccessIterator& __i, _Distance __n,
00160 random_access_iterator_tag)
00161 {
00162
00163 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>);
00164 __i += __n;
00165 }
00166
00167 template <class _InputIterator, class _Distance>
00168 inline void advance(_InputIterator& __i, _Distance __n)
00169 {
00170
00171 __advance(__i, __n, iterator_category(__i));
00172 }
00173
00174 }
00175
00176 #endif
00177
00178
00179
00180
00181