📄 _iterator_base.h
字号:
// bidirectional_iterator, and random_access_iterator are not part of// the C++ standard. (They have been replaced by struct iterator.)// They are included for backward compatibility with the HP STL.template <class _Tp, class _Distance> struct input_iterator : public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};struct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};template <class _Tp, class _Distance> struct forward_iterator : public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};template <class _Tp, class _Distance> struct bidirectional_iterator : public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};template <class _Tp, class _Distance> struct random_access_iterator : public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};# if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)template <class _Tp, class _Distance> inline input_iterator_tag _STLP_CALL iterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }inline output_iterator_tag _STLP_CALLiterator_category(const output_iterator&) { return output_iterator_tag(); }template <class _Tp, class _Distance> inline forward_iterator_tag _STLP_CALLiterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }template <class _Tp, class _Distance> inline bidirectional_iterator_tag _STLP_CALL iterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }template <class _Tp, class _Distance> inline random_access_iterator_tag _STLP_CALLiterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }template <class _Tp, class _Distance> inline _Tp* _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }template <class _Tp, class _Distance> inline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }template <class _Tp, class _Distance> inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }template <class _Tp, class _Distance> inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }template <class _Tp, class _Distance> inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }template <class _Tp, class _Distance> inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }template <class _Tp, class _Distance> inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Distance*)(0);}template <class _Tp, class _Distance> inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }# endif /* BASE_MATCH */#endif /* _STLP_NO_ANACHRONISMS */template <class _InputIterator, class _Distance>inline void _STLP_CALL __distance(const _InputIterator& __first, const _InputIterator& __last, _Distance& __n, const input_iterator_tag &) { _InputIterator __it(__first); while (__it != __last) { ++__it; ++__n; }}# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) template <class _ForwardIterator, class _Distance>inline void _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last, _Distance& __n, const forward_iterator_tag &) { _ForwardIterator __it(__first); while (__it != __last) { ++__first; ++__n; }}template <class _BidirectionalIterator, class _Distance>_STLP_INLINE_LOOP void _STLP_CALL __distance(const _BidirectionalIterator& __first, const _BidirectionalIterator& __last, _Distance& __n, const bidirectional_iterator_tag &) { _BidirectionalIterator __it(__first); while (__it != __last) { ++__it; ++__n; }}# endiftemplate <class _RandomAccessIterator, class _Distance>inline void _STLP_CALL __distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last, _Distance& __n, const random_access_iterator_tag &) { __n += __last - __first;}#ifndef _STLP_NO_ANACHRONISMS template <class _InputIterator, class _Distance>inline void _STLP_CALL distance(const _InputIterator& __first, const _InputIterator& __last, _Distance& __n) { __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));}#endiftemplate <class _InputIterator>inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL__distance(const _InputIterator& __first, const _InputIterator& __last, const input_iterator_tag &) { _STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0; _InputIterator __it(__first); while (__it != __last) { ++__it; ++__n; } return __n;}# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) template <class _ForwardIterator>inline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last, const forward_iterator_tag &){ _STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0; _ForwardIterator __it(__first); while (__it != __last) { ++__it; ++__n; } return __n;}template <class _BidirectionalIterator>_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL __distance(const _BidirectionalIterator& __first, const _BidirectionalIterator& __last, const bidirectional_iterator_tag &) { _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0; _BidirectionalIterator __it(__first); while (__it != __last) { ++__it; ++__n; } return __n;}# endiftemplate <class _RandomAccessIterator>inline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last, const random_access_iterator_tag &) { return __last - __first;}template <class _InputIterator>inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALLdistance(const _InputIterator& __first, const _InputIterator& __last) { return __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }// fbp: those are being used for iterator/const_iterator definitions everywheretemplate <class _Tp>struct _Nonconst_traits;template <class _Tp>struct _Const_traits { typedef _Tp value_type; typedef const _Tp& reference; typedef const _Tp* pointer; typedef _Nonconst_traits<_Tp> _Non_const_traits;};template <class _Tp>struct _Nonconst_traits { typedef _Tp value_type; typedef _Tp& reference; typedef _Tp* pointer; typedef _Nonconst_traits<_Tp> _Non_const_traits;};# if defined (_STLP_BASE_TYPEDEF_BUG)// this workaround is needed for SunPro 4.0.1template <class _Traits>struct __cnst_traits_aux : private _Traits{ typedef typename _Traits::value_type value_type;};# define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type# else# define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type# endif# if defined (_STLP_MSVC)// MSVC specifictemplate <class _InputIterator, class _Dist>inline void _STLP_CALL _Distance(_InputIterator __first, _InputIterator __last, _Dist& __n) { __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));}# endiftemplate <class _InputIter, class _Distance>_STLP_INLINE_LOOP void _STLP_CALL __advance(_InputIter& __i, _Distance __n, const input_iterator_tag &) { while (__n--) ++__i;}// fbp : added output iterator tag varianttemplate <class _InputIter, class _Distance>_STLP_INLINE_LOOP void _STLP_CALL __advance(_InputIter& __i, _Distance __n, const output_iterator_tag &) { while (__n--) ++__i;}# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)template <class _ForwardIterator, class _Distance>_STLP_INLINE_LOOP void _STLP_CALL __advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &) { while (n--) ++i;}# endiftemplate <class _BidirectionalIterator, class _Distance>_STLP_INLINE_LOOP void _STLP_CALL __advance(_BidirectionalIterator& __i, _Distance __n, const bidirectional_iterator_tag &) { if (__n > 0) while (__n--) ++__i; else while (__n++) --__i;}template <class _RandomAccessIterator, class _Distance>inline void _STLP_CALL __advance(_RandomAccessIterator& __i, _Distance __n, const random_access_iterator_tag &) { __i += __n;}template <class _InputIterator, class _Distance>inline void _STLP_CALL advance(_InputIterator& __i, _Distance __n) { __advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator));}_STLP_END_NAMESPACE# if defined (_STLP_DEBUG) && ! defined (_STLP_DEBUG_H)# include <stl/debug/_debug.h># endif#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -