📄 xutility
字号:
_Scalar_ptr_iterator_tag,
_Nonscalar_ptr_iterator_tag>::type _Type;
};
template<class _Anything>
struct _Ptr_cat_helper<_Anything *, const _Anything *>
{ // determines pointer category
typedef _Scalar_ptr_iterator_tag _Type;
};
template<class _Elem1,
class _Elem2> inline
typename _Ptr_cat_helper<_Elem1, _Elem2>::_Type
_Ptr_cat(_Elem1 *, _Elem2 *)
{ // return pointer category from pointers
typename _Ptr_cat_helper<_Elem1, _Elem2>::_Type _Cat;
return (_Cat);
}
template<class _Elem1,
class _Elem2> inline
typename _Ptr_cat_helper<_Elem1, _Elem2>::_Type
_Ptr_cat(const _Elem1 *, _Elem2 *)
{ // return pointer category from pointers
typename _Ptr_cat_helper<_Elem1, _Elem2>::_Type _Cat;
return (_Cat);
}
// DEBUG TESTING MACROS
#if _ITERATOR_DEBUG_LEVEL < 2
#define _DEBUG_LT(x, y) ((x) < (y))
#define _DEBUG_LT_PRED(pred, x, y) pred(x, y)
#define _DEBUG_ORDER(first, last)
#define _DEBUG_ORDER_PRED(first, last, pred)
#define _DEBUG_POINTER(first)
#define _DEBUG_POINTER2(first, file, line)
#define _DEBUG_RANGE(first, last)
#define _DEBUG_RANGE2(first, last, file, line)
#else /* _ITERATOR_DEBUG_LEVEL < 2 */
#define _FILENAME __FILEW__
#ifndef _DEBUG_LT_IMPL
#define _DEBUG_LT_IMPL _Debug_lt
#endif /* _DEBUG_LT_IMPL */
#define _DEBUG_LT(x, y) \
_DEBUG_LT_IMPL(x, y, _FILENAME, __LINE__)
#ifndef _DEBUG_LT_PRED_IMPL
#define _DEBUG_LT_PRED_IMPL _Debug_lt_pred
#endif /* _DEBUG_LT_PRED_IMPL */
#define _DEBUG_LT_PRED(pred, x, y) \
_DEBUG_LT_PRED_IMPL(pred, x, y, _FILENAME, __LINE__)
#ifndef _DEBUG_ORDER_IMPL
#define _DEBUG_ORDER_IMPL _Debug_order
#endif /* _DEBUG_ORDER_IMPL */
#define _DEBUG_ORDER(first, last) \
_DEBUG_ORDER_IMPL(first, last, _FILENAME, __LINE__)
#define _DEBUG_ORDER_PRED(first, last, pred) \
_DEBUG_ORDER_IMPL(first, last, pred, _FILENAME, __LINE__)
#ifndef _DEBUG_POINTER_IMPL
#define _DEBUG_POINTER_IMPL _Debug_pointer
#endif /* _DEBUG_POINTER_IMPL */
#define _DEBUG_POINTER(first) \
_DEBUG_POINTER_IMPL(first, _FILENAME, __LINE__)
#define _DEBUG_POINTER2(first, file, line) \
_DEBUG_POINTER_IMPL(first, file, line)
#ifndef _DEBUG_RANGE_IMPL
#define _DEBUG_RANGE_IMPL _Debug_range
#endif /* _DEBUG_RANGE_IMPL */
#define _DEBUG_RANGE(first, last) \
_DEBUG_RANGE_IMPL(first, last, _FILENAME, __LINE__)
#define _DEBUG_RANGE2(first, last, file, line) \
_DEBUG_RANGE_IMPL(first, last, file, line)
// TEMPLATE FUNCTION _Debug_lt
template<class _Ty1, class _Ty2> inline
bool _Debug_lt(const _Ty1& _Left, const _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Left < _Right and operator< is strict weak ordering
if (!(_Left < _Right))
return (false);
else if (_Right < _Left)
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
template<class _Ty1, class _Ty2> inline
bool _Debug_lt(const _Ty1& _Left, _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Left < _Right and operator< is strict weak ordering
if (!(_Left < _Right))
return (false);
else if (_Right < _Left)
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
template<class _Ty1, class _Ty2> inline
bool _Debug_lt(_Ty1& _Left, const _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Left < _Right and operator< is strict weak ordering
if (!(_Left < _Right))
return (false);
else if (_Right < _Left)
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
template<class _Ty1, class _Ty2> inline
bool _Debug_lt(_Ty1& _Left, _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Left < _Right and operator< is strict weak ordering
if (!(_Left < _Right))
return (false);
else if (_Right < _Left)
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
// TEMPLATE FUNCTION _Debug_lt_pred
template<class _Pr, class _Ty1, class _Ty2> inline
bool _Debug_lt_pred(_Pr _Pred,
const _Ty1& _Left, const _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
template<class _Pr, class _Ty1, class _Ty2> inline
bool _Debug_lt_pred(_Pr _Pred,
const _Ty1& _Left, _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
template<class _Pr, class _Ty1, class _Ty2> inline
bool _Debug_lt_pred(_Pr _Pred,
_Ty1& _Left, const _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
template<class _Pr, class _Ty1, class _Ty2> inline
bool _Debug_lt_pred(_Pr _Pred,
_Ty1& _Left, _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
// TEMPLATE FUNCTION _Debug_pointer
template<class _InIt> inline
void _Debug_pointer(_InIt&, _Dbfile_t, _Dbline_t)
{ // test pointer for non-singularity, arbitrary type
}
template<class _Ty> inline
void _Debug_pointer(const _Ty *_First, _Dbfile_t _File, _Dbline_t _Line)
{ // test iterator for non-singularity, const pointers
if (_First == 0)
_DEBUG_ERROR2("invalid null pointer", _File, _Line);
}
template<class _Ty> inline
void _Debug_pointer(_Ty *_First, _Dbfile_t _File, _Dbline_t _Line)
{ // test iterator for non-singularity, pointers
if (_First == 0)
_DEBUG_ERROR2("invalid null pointer", _File, _Line);
}
// TEMPLATE FUNCTION _Debug_range
template<class _InIt> inline
void _Debug_range2(_InIt _First, _InIt _Last, _Dbfile_t, _Dbline_t,
input_iterator_tag)
{ // test iterator pair for valid range, arbitrary iterators
bool _Ans = _First == _Last; // make sure they're comparable
_Ans = _Ans; // to quiet diagnostics
}
template<class _RanIt> inline
void _Debug_range2(_RanIt _First, _RanIt _Last,
_Dbfile_t _File, _Dbline_t _Line,
random_access_iterator_tag)
{ // test iterator pair for valid range, random-access iterators
if (_First != _Last)
{ // check for non-null pointers, valid range
_DEBUG_POINTER2(_First, _File, _Line);
_DEBUG_POINTER2(_Last, _File, _Line);
if (_Last < _First)
_DEBUG_ERROR2("invalid iterator range", _File, _Line);
}
}
template<class _InIt> inline
void _Debug_range(_InIt _First, _InIt _Last,
_Dbfile_t _File, _Dbline_t _Line)
{ // test iterator pair for valid range
_Debug_range2(_First, _Last, _File, _Line, _Iter_cat(_First));
}
// TEMPLATE FUNCTION _Debug_order
template<class _InIt> inline
void _Debug_order2(_InIt, _InIt,
_Dbfile_t, _Dbline_t, input_iterator_tag)
{ // test if range is ordered by operator<, input iterators
}
template<class _FwdIt> inline
void _Debug_order2(_FwdIt _First, _FwdIt _Last,
_Dbfile_t _File, _Dbline_t _Line, forward_iterator_tag)
{ // test if range is ordered by operator<, forward iterators
for (_FwdIt _Next = _First; _First != _Last && ++_Next != _Last; ++_First)
if (_DEBUG_LT(*_Next, *_First))
_DEBUG_ERROR2("sequence not ordered", _File, _Line);
}
template<class _InIt> inline
void _Debug_order(_InIt _First, _InIt _Last,
_Dbfile_t _File, _Dbline_t _Line)
{ // test is range is ordered by operator<
_DEBUG_RANGE2(_First, _Last, _File, _Line);
_Debug_order2(_First, _Last, _File, _Line, _Iter_cat(_First));
}
// TEMPLATE FUNCTION _Debug_order_pred
template<class _InIt,
class _Pr> inline
void _Debug_order2(_InIt, _InIt, _Pr,
_Dbfile_t, _Dbline_t, input_iterator_tag)
{ // test if range is ordered by predicate, input iterators
}
template<class _FwdIt,
class _Pr> inline
void _Debug_order2(_FwdIt _First, _FwdIt _Last, _Pr _Pred,
_Dbfile_t _File, _Dbline_t _Line, forward_iterator_tag)
{ // test if range is ordered by predicate, forward iterators
for (_FwdIt _Next = _First; _First != _Last && ++_Next != _Last; ++_First)
if (_DEBUG_LT_PRED(_Pred, *_Next, *_First))
_DEBUG_ERROR2("sequence not ordered", _File, _Line);
}
template<class _InIt,
class _Pr> inline
void _Debug_order(_InIt _First, _InIt _Last, _Pr _Pred,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if range is ordered by predicate
_DEBUG_RANGE2(_First, _Last, _File, _Line);
_DEBUG_POINTER2(_Pred, _File, _Line);
_Debug_order2(_First, _Last, _Pred, _File, _Line, _Iter_cat(_First));
}
#endif /* _ITERATOR_DEBUG_LEVEL < 2 */
// MORE ITERATOR STUFF (from <iterator>
// TEMPLATE FUNCTION _Val_type
template<class _Iter> inline
typename iterator_traits<_Iter>::value_type *_Val_type(_Iter)
{ // return value type from arbitrary argument
return (0);
}
// TEMPLATE FUNCTION advance
template<class _InIt,
class _Diff> inline
void advance(_InIt& _Where, _Diff _Off)
{ // increment iterator by offset, arbitrary iterators
_Advance(_Where, _Off, _Iter_cat(_Where));
}
template<class _InIt,
class _Diff> inline
void _Advance(_InIt& _Where, _Diff _Off, input_iterator_tag)
{ // increment iterator by offset, input iterators
#if _ITERATOR_DEBUG_LEVEL == 2
// if (_Off < 0)
// _DEBUG_ERROR("negative offset in advance");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
for (; 0 < _Off; --_Off)
++_Where;
}
template<class _FI,
class _Diff> inline
void _Advance(_FI& _Where, _Diff _Off, forward_iterator_tag)
{ // increment iterator by offset, forward iterators
#if _ITERATOR_DEBUG_LEVEL == 2
// if (_Off < 0)
// _DEBUG_ERROR("negative offset in advance");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
for (; 0 < _Off; --_Off)
++_Where;
}
template<class _BI,
class _Diff> inline
void _Advance(_BI& _Where, _Diff _Off, bidirectional_iterator_tag)
{ // increment iterator by offset, bidirectional iterators
for (; 0 < _Off; --_Off)
++_Where;
for (; _Off < 0; ++_Off)
--_Where;
}
template<class _RI,
class _Diff> inline
void _Advance(_RI& _Where, _Diff _Off, random_access_iterator_tag)
{ // increment iterator by offset, random-access iterators
_Where += _Off;
}
// TEMPLATE FUNCTION _Dist_type
template<class _Iter> inline
typename iterator_traits<_Iter>::difference_type
*_Dist_type(_Iter)
{ // return distance type from arbitrary argument
return (0);
}
// TEMPLATE FUNCTIONS distance and _Distance
template<class _InIt,
class _Diff> inline
void _Distance2(_InIt _First, _InIt _Last, _Diff& _Off,
input_iterator_tag)
{ // add to _Off distance between input iterators
for (; _First != _Last; ++_First)
++_Off;
}
template<class _FwdIt,
class _Diff> inline
void _Distance2(_FwdIt _First, _FwdIt _Last, _Diff& _Off,
forward_iterator_tag)
{ // add to _Off distance between forward iterators (redundant)
for (; _First != _Last; ++_First)
++_Off;
}
template<class _BidIt,
class _Diff> inline
void _Distance2(_BidIt _First, _BidIt _Last, _Diff& _Off,
bidirectional_iterator_tag)
{ // add to _Off distance between bidirectional iterators (redundant)
for (; _First != _Last; ++_First)
++_Off;
}
template<class _RanIt,
class _Diff> inline
void _Distance2(_RanIt _First, _RanIt _Last, _Diff& _Off,
random_access_iterator_tag)
{ // add to _Off distance between random-access iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_First != _Last)
{ // check for null pointers
_DEBUG_POINTER(_First);
_DEBUG_POINTER(_Last);
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
_Off += _Last - _First;
}
template<class _InIt> inline
typename iterator_traits<_InIt>::difference_type
distance(_InIt _First, _InIt _Last)
{ // return distance between iterators
typename iterator_traits<_InIt>::difference_type _Off = 0;
_Distance2(_First, _Last, _Off, _Iter_cat(_First));
return (_Off);
}
template<class _InIt,
class _Diff> inline
void _Distance(_InIt _First, _InIt _Last, _Diff& _Off)
{ // add to _Off distance between iterators
_Distance2(_First, _Last, _Off, _Iter_cat(_First));
}
#if _HAS_CPP0X
// TEMPLATE FUNCTIONS next and prev
template<class _InIt,
class _Diff> inline
_InIt _Increment(_InIt _First, _Diff _Off,
input_iterator_tag)
{ // add _Off to input iterator
for (; 0 < _Off; --_Off)
++_First;
return (_First);
}
template<class _FwdIt,
class _Diff> inline
_FwdIt _Increment(_FwdIt _First, _Diff _Off,
forward_iterator_tag)
{ // add _Off to forward iterator
for (; 0 < _Off; --_Off)
++_First;
return (_First);
}
template<class _BidIt,
class _Diff> inline
_BidIt _Increment(_BidIt _First, _Diff _Off,
bidirectional_iterator_tag)
{ // add _Off to bidirectional iterator
for (; _Off < 0; ++_Off)
--_First;
for (; 0 < _Off; --_Off)
++_First;
return (_First);
}
template<class _RanIt,
class _Diff> inline
_RanIt _Increment(_RanIt _First, _Diff _Off,
random_access_iterator_tag)
{ // add _Off to random-access iterator
return (_First + _Off);
}
template<class _InIt> inline
_InIt next(_InIt _First,
typename iterator_traits<_InIt>::difference_type _Off = 1)
{ // increment iterator
return (_Increment(_First, _Off, _Iter_cat(_First)));
}
template<class _InIt> inline
_InIt prev(_InIt _First,
typename iterator_traits<_InIt>::difference_type _Off = 1)
{ // decrement iterator
return (_Increment(_First, -_Off, _Iter_cat(_First)));
}
template<class _Container> inline
typename _Container::iterator begin(_Container& _Cont)
{ // get beginning of sequence
return (_Cont.begin());
}
template<class _Container> inline
typename _Container::const_iterator begin(const _Container& _Cont)
{ // get beginning of sequence
return (_Cont.begin());
}
template<class _Container> inline
typename _Container::iterator end(_Container& _Cont)
{ // get end of sequence
return (_Cont.end());
}
template<class _Container> inline
typename _Container::const_iterator end(const _Container& _Cont)
{ // get end of sequence
return (_Cont.end());
}
template<class _Ty,
size_t _Size> inline
_Ty *begin(_Ty (&_Array)[_Size])
{ // get beginning of array
return (&_Array[0]);
}
template<class _Ty,
size_t _Size> inline
_Ty *end(_Ty (&_Array)[_Size])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -