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
00064 #ifndef _ITERATOR_BASE_FUNCS_H
00065 #define _ITERATOR_BASE_FUNCS_H 1
00066
00067 #pragma GCC system_header
00068 #include <bits/concept_check.h>
00069
00070 namespace std
00071 {
00072 template<typename _InputIterator>
00073 inline typename iterator_traits<_InputIterator>::difference_type
00074 __distance(_InputIterator __first, _InputIterator __last,
00075 input_iterator_tag)
00076 {
00077
00078 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00079
00080 typename iterator_traits<_InputIterator>::difference_type __n = 0;
00081 while (__first != __last)
00082 {
00083 ++__first;
00084 ++__n;
00085 }
00086 return __n;
00087 }
00088
00089 template<typename _RandomAccessIterator>
00090 inline typename iterator_traits<_RandomAccessIterator>::difference_type
00091 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
00092 random_access_iterator_tag)
00093 {
00094
00095 __glibcxx_function_requires(_RandomAccessIteratorConcept<
00096 _RandomAccessIterator>)
00097 return __last - __first;
00098 }
00099
00112 template<typename _InputIterator>
00113 inline typename iterator_traits<_InputIterator>::difference_type
00114 distance(_InputIterator __first, _InputIterator __last)
00115 {
00116
00117 return std::__distance(__first, __last,
00118 std::__iterator_category(__first));
00119 }
00120
00121 template<typename _InputIterator, typename _Distance>
00122 inline void
00123 __advance(_InputIterator& __i, _Distance __n, input_iterator_tag)
00124 {
00125
00126 __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
00127 while (__n--)
00128 ++__i;
00129 }
00130
00131 template<typename _BidirectionalIterator, typename _Distance>
00132 inline void
00133 __advance(_BidirectionalIterator& __i, _Distance __n,
00134 bidirectional_iterator_tag)
00135 {
00136
00137 __glibcxx_function_requires(_BidirectionalIteratorConcept<
00138 _BidirectionalIterator>)
00139 if (__n > 0)
00140 while (__n--)
00141 ++__i;
00142 else
00143 while (__n++)
00144 --__i;
00145 }
00146
00147 template<typename _RandomAccessIterator, typename _Distance>
00148 inline void
00149 __advance(_RandomAccessIterator& __i, _Distance __n,
00150 random_access_iterator_tag)
00151 {
00152
00153 __glibcxx_function_requires(_RandomAccessIteratorConcept<
00154 _RandomAccessIterator>)
00155 __i += __n;
00156 }
00157
00170 template<typename _InputIterator, typename _Distance>
00171 inline void
00172 advance(_InputIterator& __i, _Distance __n)
00173 {
00174
00175 std::__advance(__i, __n, std::__iterator_category(__i));
00176 }
00177 }
00178
00179 #endif