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