📄 _iterator_base.h
字号:
template <class _Tp, class _Distance>inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }template <class _Tp, class _Distance>inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Tp*, 0); }template <class _Tp, class _Distance>inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }template <class _Tp, class _Distance>inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0); }template <class _Tp, class _Distance>inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_Distance*, 0);}template <class _Tp, class _Distance>inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return __STATIC_CAST(_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_ANACHRONISMStemplate <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(_InputIterator __first, _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 _Const_traits<_Tp> _ConstTraits; typedef _Nonconst_traits<_Tp> _NonConstTraits;};template <class _Tp>struct _Nonconst_traits { typedef _Tp value_type; typedef _Tp& reference; typedef _Tp* pointer; typedef _Const_traits<_Tp> _ConstTraits; typedef _Nonconst_traits<_Tp> _NonConstTraits;};/* * dums: A special iterator/const_iterator traits for set and multiset for which even * the iterator is not mutable */template <class _Tp>struct _Nonconst_Const_traits;template <class _Tp>struct _Const_Const_traits { typedef _Tp value_type; typedef const _Tp& reference; typedef const _Tp* pointer; typedef _Const_Const_traits<_Tp> _ConstTraits; typedef _Nonconst_Const_traits<_Tp> _NonConstTraits;};template <class _Tp>struct _Nonconst_Const_traits { typedef _Tp value_type; typedef const _Tp& reference; typedef const _Tp* pointer; typedef _Const_Const_traits<_Tp> _ConstTraits; typedef _Nonconst_Const_traits<_Tp> _NonConstTraits;};/* * A macro to generate a new iterator traits from one of the * previous one. Changing the iterator traits type make iterators * from different containers not comparable. */#define _STLP_CREATE_ITERATOR_TRAITS_BASE(Motif, Traits) \template <class _Tp> \struct _##Motif; \template <class _Tp> \struct _Const##Motif : public _STLP_STD::_Const_##Traits<_Tp> { \ typedef _Const##Motif<_Tp> _ConstTraits; \ typedef _##Motif<_Tp> _NonConstTraits; \}; \template <class _Tp> \struct _##Motif : public _STLP_STD::_Nonconst_##Traits<_Tp> { \ typedef _Const##Motif<_Tp> _ConstTraits; \ typedef _##Motif<_Tp> _NonConstTraits; \};#define _STLP_CREATE_ITERATOR_TRAITS(Motif, Traits) \_STLP_MOVE_TO_PRIV_NAMESPACE \_STLP_CREATE_ITERATOR_TRAITS_BASE(Motif, Traits) \_STLP_MOVE_TO_STD_NAMESPACE#define _STLP_CREATE_HASH_ITERATOR_TRAITS(Motif, Traits) \_STLP_MOVE_TO_PRIV_NAMESPACE \_STLP_CREATE_ITERATOR_TRAITS_BASE(NonLocal##Motif, Traits) \_STLP_CREATE_ITERATOR_TRAITS_BASE(Local##Motif, Traits) \template <class _Tp> \struct _##Motif { \ typedef _ConstNonLocal##Motif<_Tp> _ConstTraits; \ typedef _NonLocal##Motif<_Tp> _NonConstTraits; \ typedef _ConstLocal##Motif<_Tp> _ConstLocalTraits; \ typedef _Local##Motif<_Tp> _NonConstLocalTraits; \}; \_STLP_MOVE_TO_STD_NAMESPACE/*# 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 + -