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 #ifndef __SGI_STL_INTERNAL_ITERATOR_BASE_FUNCS_H
00032 #define __SGI_STL_INTERNAL_ITERATOR_BASE_FUNCS_H
00033
00034
00035
00036
00037
00038
00039 #pragma GCC system_header
00040 #include <bits/concept_check.h>
00041
00042 namespace std
00043 {
00044
00045
00046
00047
00048
00049 template <class _InputIterator, class _Distance>
00050 inline void __distance(_InputIterator __first, _InputIterator __last,
00051 _Distance& __n, input_iterator_tag)
00052 {
00053
00054 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>);
00055 while (__first != __last) { ++__first; ++__n; }
00056 }
00057
00058 template <class _RandomAccessIterator, class _Distance>
00059 inline void __distance(_RandomAccessIterator __first,
00060 _RandomAccessIterator __last,
00061 _Distance& __n, random_access_iterator_tag)
00062 {
00063
00064 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>);
00065 __n += __last - __first;
00066 }
00067
00068 template <class _InputIterator, class _Distance>
00069 inline void distance(_InputIterator __first,
00070 _InputIterator __last, _Distance& __n)
00071 {
00072
00073 __distance(__first, __last, __n, iterator_category(__first));
00074 }
00075
00076 template <class _InputIterator>
00077 inline typename iterator_traits<_InputIterator>::difference_type
00078 __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)
00079 {
00080
00081 __glibcpp_function_requires(_InputIteratorConcept<_InputIterator>);
00082 typename iterator_traits<_InputIterator>::difference_type __n = 0;
00083 while (__first != __last) {
00084 ++__first; ++__n;
00085 }
00086 return __n;
00087 }
00088
00089 template <class _RandomAccessIterator>
00090 inline typename iterator_traits<_RandomAccessIterator>::difference_type
00091 __distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
00092 random_access_iterator_tag)
00093 {
00094
00095 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>);
00096 return __last - __first;
00097 }
00098
00099 template <class _InputIterator>
00100 inline typename iterator_traits<_InputIterator>::difference_type
00101 distance(_InputIterator __first, _InputIterator __last)
00102 {
00103
00104 typedef typename iterator_traits<_InputIterator>::iterator_category
00105 _Category;
00106 return __distance(__first, __last, _Category());
00107 }
00108
00109 template <class _InputIter, class _Distance>
00110 inline void __advance(_InputIter& __i, _Distance __n, input_iterator_tag)
00111 {
00112
00113 __glibcpp_function_requires(_InputIteratorConcept<_InputIter>);
00114 while (__n--) ++__i;
00115 }
00116
00117 template <class _BidirectionalIterator, class _Distance>
00118 inline void __advance(_BidirectionalIterator& __i, _Distance __n,
00119 bidirectional_iterator_tag)
00120 {
00121
00122 __glibcpp_function_requires(_BidirectionalIteratorConcept<_BidirectionalIterator>);
00123 if (__n > 0)
00124 while (__n--) ++__i;
00125 else
00126 while (__n++) --__i;
00127 }
00128
00129 template <class _RandomAccessIterator, class _Distance>
00130 inline void __advance(_RandomAccessIterator& __i, _Distance __n,
00131 random_access_iterator_tag)
00132 {
00133
00134 __glibcpp_function_requires(_RandomAccessIteratorConcept<_RandomAccessIterator>);
00135 __i += __n;
00136 }
00137
00138 template <class _InputIterator, class _Distance>
00139 inline void advance(_InputIterator& __i, _Distance __n)
00140 {
00141
00142 __advance(__i, __n, iterator_category(__i));
00143 }
00144
00145 }
00146
00147 #endif
00148
00149
00150
00151
00152