📄 xutility
字号:
}
_Myiter operator--(int)
{ // postdecrement
_Myiter _Tmp = *this;
--*this;
return (_Tmp);
}
_Myiter& operator+=(difference_type _Off)
{ // increment by integer
*(_Mybase *)this += _Off;
return (*this);
}
_Myiter operator+(difference_type _Off) const
{ // return this + integer
_Myiter _Tmp = *this;
return (_Tmp += _Off);
}
_Myiter& operator-=(difference_type _Off)
{ // decrement by integer
return (*this += -_Off);
}
_Myiter operator-(difference_type _Off) const
{ // return this - integer
_Myiter _Tmp = *this;
return (_Tmp -= _Off);
}
difference_type operator-(const _Mybase& _Right) const
{ // return difference of iterators
return (*(_Mybase *)this - _Right);
}
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
};
template<class _Ty,
size_t _Size> inline
typename _Array_iterator<_Ty, _Size>::_Unchecked_type
_Unchecked(_Array_iterator<_Ty, _Size> _Iter)
{ // convert to unchecked
return (_Iter._Unchecked());
}
template<class _Ty,
size_t _Size> inline
_Array_iterator<_Ty, _Size>&
_Rechecked(_Array_iterator<_Ty, _Size>& _Iter,
typename _Array_iterator<_Ty, _Size>
::_Unchecked_type _Right)
{ // convert to checked
return (_Iter._Rechecked(_Right));
}
template<class _Ty,
size_t _Size> inline
_Array_iterator<_Ty, _Size> operator+(
typename _Array_iterator<_Ty, _Size>::difference_type _Off,
_Array_iterator<_Ty, _Size> _Next)
{ // add offset to iterator
return (_Next += _Off);
}
// ALGORITHM STUFF (from <algorithm>)
// TEMPLATE FUNCTION max
template<class _Ty> inline
const _Ty& (max)(const _Ty& _Left, const _Ty& _Right)
{ // return larger of _Left and _Right
return (_DEBUG_LT(_Left, _Right) ? _Right : _Left);
}
// TEMPLATE FUNCTION max WITH PRED
template<class _Ty,
class _Pr> inline
const _Ty& (max)(const _Ty& _Left, const _Ty& _Right, _Pr _Pred)
{ // return larger of _Left and _Right using _Pred
return (_DEBUG_LT_PRED(_Pred, _Left, _Right) ? _Right : _Left);
}
// TEMPLATE FUNCTION min
template<class _Ty> inline
const _Ty& (min)(const _Ty& _Left, const _Ty& _Right)
{ // return smaller of _Left and _Right
return (_DEBUG_LT(_Right, _Left) ? _Right : _Left);
}
// TEMPLATE FUNCTION min WITH PRED
template<class _Ty,
class _Pr> inline
const _Ty& (min)(const _Ty& _Left, const _Ty& _Right, _Pr _Pred)
{ // return smaller of _Left and _Right using _Pred
return (_DEBUG_LT_PRED(_Pred, _Right, _Left) ? _Right : _Left);
}
// TEMPLATE FUNCTION minmax
#define _MINMAX_PAIR(ty) pair<const ty, const ty>
template<class _Ty> inline
_MINMAX_PAIR(_Ty)
minmax(const _Ty& _Left, const _Ty& _Right)
{ // return pair(leftmost/smaller, rightmost/larger) of _Left and _Right
return (_Right < _Left
? _MINMAX_PAIR(_Ty)(_Right, _Left)
: _MINMAX_PAIR(_Ty)(_Left, _Right));
}
// TEMPLATE FUNCTION minmax WITH PRED
template<class _Ty,
class _Pr> inline
_MINMAX_PAIR(_Ty)
minmax(const _Ty& _Left, const _Ty& _Right, _Pr _Pred)
{ // return pair(leftmost/smaller, rightmost/larger) of _Left and _Right
return (_Pred(_Right, _Left)
? _MINMAX_PAIR(_Ty)(_Right, _Left)
: _MINMAX_PAIR(_Ty)(_Left, _Right));
}
// TEMPLATE FUNCTION iter_swap
template<class _FwdIt1,
class _FwdIt2> inline
void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
{ // swap *_Left and *_Right
swap(*_Left, *_Right);
}
// TEMPLATE FUNCTION copy
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, _Nonscalar_ptr_iterator_tag)
{ // copy [_First, _Last) to [_Dest, ...), arbitrary iterators
for (; _First != _Last; ++_Dest, ++_First)
*_Dest = *_First;
return (_Dest);
}
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) to [_Dest, ...), pointers to scalars
ptrdiff_t _Count = _Last - _First;
_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First));
return (_Dest + _Count);
}
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest)
{ // copy [_First, _Last) to [_Dest, ...)
return (_Copy_impl(_First, _Last,
_Dest, _Ptr_cat(_First, _Dest)));
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt,
class _OutIt> inline
_OutIt copy(_InIt _First, _InIt _Last,
_OutIt _Dest)
{ // copy [_First, _Last) to [_Dest, ...)
return (_Rechecked(_Dest,
_Copy_impl(_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest))));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, input_iterator_tag, output_iterator_tag)
{ // copy [_First, _Last) to [_Dest, ...), arbitrary iterators
return (_Copy_impl(_First, _Last,
_Dest));
}
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, random_access_iterator_tag, random_access_iterator_tag)
{ // copy [_First, _Last) to [_Dest, ...), random-access iterators
_OutIt _Ans = _Dest + (_Last - _First); // also checks range
_Copy_impl(_First, _Last,
_Unchecked(_Dest));
return (_Ans);
}
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, _STD tr1::true_type)
{ // copy [_First, _Last) to [_Dest, ...), checked dest
return (_Copy_impl(_First, _Last,
_Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
}
template<class _InIt,
class _OutIt> inline
_SCL_INSECURE_DEPRECATE
_OutIt _Copy_impl(_InIt _First, _InIt _Last,
_OutIt _Dest, _STD tr1::false_type)
{ // copy [_First, _Last) to [_Dest, ...), unchecked dest
return (_Copy_impl(_First, _Last,
_Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
}
template<class _InIt,
class _OutIt> inline
_OutIt copy(_InIt _First, _InIt _Last,
_OutIt _Dest)
{ // copy [_First, _Last) to [_Dest, ...)
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
return (_Copy_impl(_Unchecked(_First), _Unchecked(_Last),
_Dest, _Is_checked(_Dest)));
}
template<class _InIt,
class _OutTy,
size_t _OutSize> inline
_OutTy *copy(_InIt _First, _InIt _Last,
_OutTy (&_Dest)[_OutSize])
{ // copy [_First, _Last) to [_Dest, ...)
return (_Unchecked(
_STD copy(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest))));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
#if _HAS_CPP0X
// TEMPLATE FUNCTION copy_n
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, input_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary input
*_Dest = *_First; // 0 < _Count has been guaranteed
while (0 < --_Count)
*++_Dest = *++_First;
return (++_Dest);
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, forward_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), forward input
for (; 0 < _Count; --_Count, ++_Dest, ++_First)
*_Dest = *_First;
return (_Dest);
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, _Nonscalar_ptr_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary iterators
return (_Copy_n(_First, _Count,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), pointers to scalars
_CSTD memmove(&*_Dest, &*_First,
_Count * sizeof (*_First));
return (_Dest + _Count);
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...), unchecked
return (_Copy_n(_First, _Count,
_Dest, _Ptr_cat(_First, _Dest)));
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...)
if (_Count <= 0)
return (_Dest);
else
return (_Rechecked(_Dest,
_Copy_n(_Unchecked(_First), _Count,
_Unchecked(_Dest))));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n2(_InIt _First, _Diff _Count,
_OutIt _Dest, output_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary dest
return (_Copy_n(_First, _Count,
_Dest));
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n2(_InIt _First, _Diff _Count,
_OutIt _Dest, random_access_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), random-access dest
_OutIt _Ans = _Dest + _Count; // also checks range
_Copy_n(_First, _Count,
_Unchecked(_Dest));
return (_Ans);
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n1(_InIt _First, _Diff _Count,
_OutIt _Dest, input_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), arbitrary input
return (_Copy_n2(_First, _Count,
_Dest, _Iter_cat(_Dest)));
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n1(_InIt _First, _Diff _Count,
_OutIt _Dest, random_access_iterator_tag)
{ // copy [_First, _First + _Count) to [_Dest, ...), random-access input
_InIt _Last = _First + _Count; // also checks range
_Last = _Last; // to quiet diagnostics
return (_Copy_n2(_Unchecked(_First), _Count,
_Dest, _Iter_cat(_Dest)));
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, _STD tr1::true_type)
{ // copy [_First, _First + _Count) to [_Dest, ...), checked dest
return (_Copy_n1(_First, _Count,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_SCL_INSECURE_DEPRECATE
_OutIt _Copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest, _STD tr1::false_type)
{ // copy [_First, _First + _Count) to [_Dest, ...), unchecked dest
return (_Copy_n1(_First, _Count,
_Dest, _Iter_cat(_First)));
}
template<class _InIt,
class _Diff,
class _OutIt> inline
_OutIt copy_n(_InIt _First, _Diff _Count,
_OutIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...)
_DEBUG_POINTER(_First);
_DEBUG_POINTER(_Dest);
if (_Count <= 0)
return (_Dest);
else
return (_Copy_n(_First, _Count,
_Dest, _Is_checked(_Dest)));
}
template<class _InTy,
size_t _InSize,
class _Diff,
class _OutIt> inline
_OutIt copy_n(_InTy (&_First)[_InSize], _Diff _Count,
_OutIt _Dest)
{ // copy [_First, _First + _Count) to [_Dest, ...), array input
return (_STD copy_n(_Array_iterator<_InTy, _InSize>(_First), _Count,
_Dest));
}
template<class _InIt,
class _Diff,
class _OutTy,
size_t _OutSize> inline
_OutTy *copy_n(_InIt _First, _Diff _Count,
_OutTy (&_Dest)[_OutSize])
{ // copy [_First, _First + _Count) to [_Dest, ...), array dest
return (_Unchecked(
_STD copy_n(_First, _Count,
_Array_iterator<_OutTy, _OutSize>(_Dest))));
}
template<class _InTy,
size_t _InSize,
class _Diff,
class _OutTy,
size_t _OutSize> inline
_OutTy *copy_n(_InTy (&_First)[_InSize], _Diff _Count,
_OutTy (&_Dest)[_OutSize])
{ // copy [_First, _First + _Count) to [_Dest, ...), array input/dest
return (_Unchecked(
_STD copy_n(_Array_iterator<_InTy, _InSize>(_First), _Count,
_Array_iterator<_OutTy, _OutSize>(_Dest))));
}
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
#endif /* _HAS_CPP0X */
// TEMPLATE FUNCTION copy_backward
template<class _BidIt1,
class _BidIt2> inline
_BidIt2 _Copy_backward(_BidIt1 _First, _BidIt1 _Last,
_BidIt2 _Dest, _Nonscalar_ptr_iterator_tag)
{ // copy [_First, _Last) backwards to [..., _Dest), arbitrary iterators
while (_First != _Last)
*--_Dest = *--_Last;
return (_Dest);
}
template<class _InIt,
class _OutIt> inline
_OutIt _Copy_backward(_InIt _First, _InIt _Last,
_OutIt _Dest, _Scalar_ptr_iterator_tag)
{ // copy [_First, _Last) backwards to [..., _Dest), pointers to scalars
ptrdiff_t _Count = _Last - _First;
_CSTD memmove(&*_Dest - _Count, &*_First,
_Count * sizeof (*_First));
return (_Dest - _Count);
}
template<class _BidIt1,
class _BidIt2> inline
_BidIt2 _Copy_backward(_BidIt1 _First, _BidIt1 _Last,
_BidIt2 _Dest)
{ // copy [_First, _Last) backwards to [..., _Dest), unchecked
return (_Copy_backward(_First, _Last,
_Dest, _Ptr_cat(_First, _Dest)));
}
#if _ITERATOR_DEBUG_LEVEL == 0
template<class _BidIt1,
class _BidIt2> inline
_BidIt2 copy_backward(_BidIt1 _First, _BidIt1 _Last,
_BidIt2 _Dest)
{ // copy [_First, _Last) backwards to [..., _Dest)
return (_Rechecked(_Dest,
_Copy_backward(_Unchecked(_First), _Unchecked(_Last),
_Unchecked(_Dest))));
}
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
template<class _BidIt1,
class _BidIt2> inline
_BidIt2 _Copy_backward(_BidIt1 _First, _BidIt1 _Last,
_BidIt2 _Dest, _STD tr1::true_type)
{ // copy [_First, _Last) backwards to [..., _Dest), checked dest
return (_Copy_backward(_Unchecked(_First), _Unchecked(_Last),
_Dest));
}
template<class _BidIt1,
class _BidIt2> inline
_SCL_INSECURE_DEPRECATE
_BidIt2 _Copy_backward(_BidIt1 _First, _BidIt1 _Last,
_BidIt2 _Dest, _STD tr1::false_type)
{ // copy [_First, _Last) backwards to [..., _Dest), unchecked dest
return (_Copy_backward(_Unchecked(_First), _Unchecked(_Last),
_Dest));
}
template<class _BidIt1,
class _BidIt2> inline
_BidIt2 copy_backward(_BidIt1 _First, _BidIt1 _Last,
_BidIt2 _Dest)
{ // copy [_First, _Last) backwards to [..., _Dest)
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Dest);
return (_Copy_backward(_Unchecked(_First), _Uncheck
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -