📄 xutility
字号:
_Reference operator*() const
{ // return designated value
_BidIt _Tmp = current;
return (*--_Tmp);
}
_Pointer operator->() const
{ // return pointer to class object
_Reference _Tmp = **this;
return (&_Tmp);
}
_Myt& operator++()
{ // preincrement
--current;
return (*this);
}
_Myt operator++(int)
{ // postincrement
_Myt _Tmp = *this;
--current;
return (_Tmp);
}
_Myt& operator--()
{ // predecrement
++current;
return (*this);
}
_Myt operator--(int)
{ // postdecrement
_Myt _Tmp = *this;
++current;
return (_Tmp);
}
bool operator==(const _Myt& _Right) const
{ // test for iterator equality
return (current == _Right.current);
}
bool operator!=(const _Myt& _Right) const
{ // test for iterator inequality
return (!(*this == _Right));
}
protected:
_BidIt current;
};
// TEMPLATE CLASS _Array_const_iterator
template<class _Ty,
size_t _Size>
class _Array_const_iterator
: public _Iterator012<random_access_iterator_tag,
_Ty,
ptrdiff_t,
const _Ty *,
const _Ty&,
_Iterator_base>
{ // iterator for nonmutable array
public:
typedef _Array_const_iterator<_Ty, _Size> _Myiter;
typedef random_access_iterator_tag iterator_category;
typedef _Ty value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef const _Ty *pointer;
typedef const _Ty& reference;
enum {_EEN_SIZE = _Size}; // helper for expression evaluator
enum {_EEN_IDL =
_ITERATOR_DEBUG_LEVEL}; // helper for expression evaluator
#if _ITERATOR_DEBUG_LEVEL == 0
_Array_const_iterator()
{ // construct with null pointer
_Ptr = 0;
}
explicit _Array_const_iterator(pointer _Parg, size_t _Off = 0)
{ // construct with pointer and offset
_Ptr = _Parg + _Off;
}
typedef pointer _Unchecked_type;
_Myiter& _Rechecked(_Unchecked_type _Right)
{ // reset from unchecked iterator
_Ptr = _Right;
return (*this);
}
_Unchecked_type _Unchecked() const
{ // make an unchecked iterator
return (_Ptr);
}
reference operator*() const
{ // return designated object
return (*_Ptr);
}
pointer operator->() const
{ // return pointer to class object
return (&**this);
}
_Myiter& operator++()
{ // preincrement
++_Ptr;
return (*this);
}
_Myiter operator++(int)
{ // postincrement
_Myiter _Tmp = *this;
++*this;
return (_Tmp);
}
_Myiter& operator--()
{ // predecrement
--_Ptr;
return (*this);
}
_Myiter operator--(int)
{ // postdecrement
_Myiter _Tmp = *this;
--*this;
return (_Tmp);
}
_Myiter& operator+=(difference_type _Off)
{ // increment by integer
_Ptr += _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 _Myiter& _Right) const
{ // return difference of iterators
return (_Ptr - _Right._Ptr);
}
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
bool operator==(const _Myiter& _Right) const
{ // test for iterator equality
return (_Ptr == _Right._Ptr);
}
bool operator!=(const _Myiter& _Right) const
{ // test for iterator inequality
return (!(*this == _Right));
}
bool operator<(const _Myiter& _Right) const
{ // test if this < _Right
return (_Ptr < _Right._Ptr);
}
bool operator>(const _Myiter& _Right) const
{ // test if this > _Right
return (_Right < *this);
}
bool operator<=(const _Myiter& _Right) const
{ // test if this <= _Right
return (!(_Right < *this));
}
bool operator>=(const _Myiter& _Right) const
{ // test if this >= _Right
return (!(*this < _Right));
}
pointer _Ptr; // beginning of array
#else /* _ITERATOR_DEBUG_LEVEL == 0 */
_Array_const_iterator()
{ // construct with null pointer
_Ptr = 0;
_Idx = 0;
}
explicit _Array_const_iterator(pointer _Parg, size_t _Off = 0)
{ // construct with pointer and offset
_Ptr = _Parg;
_Idx = _Off;
}
typedef pointer _Unchecked_type;
_Myiter& _Rechecked(_Unchecked_type _Right)
{ // reset from unchecked iterator
_Idx = _Right - _Ptr;
return (*this);
}
_Unchecked_type _Unchecked() const
{ // make an unchecked iterator
return (_Ptr + _Idx);
}
reference operator*() const
{ // return designated object
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Ptr == 0
|| _Size <= _Idx)
{ // report error
_DEBUG_ERROR("array iterator not dereferencable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(_Idx < _Size);
#endif /* _ITERATOR_DEBUG_LEVEL */
__analysis_assume(_Ptr != 0);
return (_Ptr[_Idx]);
}
pointer operator->() const
{ // return pointer to class object
return (&**this);
}
_Myiter& operator++()
{ // preincrement
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Ptr == 0
|| _Size <= _Idx)
{ // report error
_DEBUG_ERROR("array iterator not incrementable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(_Idx < _Size);
#endif /* _ITERATOR_DEBUG_LEVEL */
++_Idx;
return (*this);
}
_Myiter operator++(int)
{ // postincrement
_Myiter _Tmp = *this;
++*this;
return (_Tmp);
}
_Myiter& operator--()
{ // predecrement
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Ptr == 0
|| _Idx <= 0)
{ // report error
_DEBUG_ERROR("array iterator not decrementable");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE(_Ptr != 0);
_SCL_SECURE_VALIDATE_RANGE(0 < _Idx);
#endif /* _ITERATOR_DEBUG_LEVEL */
--_Idx;
return (*this);
}
_Myiter operator--(int)
{ // postdecrement
_Myiter _Tmp = *this;
--*this;
return (_Tmp);
}
_Myiter& operator+=(difference_type _Off)
{ // increment by integer
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Size < _Idx + _Off)
{ // report error
_DEBUG_ERROR("array iterator + offset out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE_RANGE(_Idx + _Off <= _Size);
#endif /* _ITERATOR_DEBUG_LEVEL */
_Idx += _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 _Myiter& _Right) const
{ // return difference of iterators
_Compat(_Right);
return (_Idx < _Right._Idx
? -(difference_type)(_Right._Idx - _Idx)
: (difference_type)_Idx - _Right._Idx);
}
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
bool operator==(const _Myiter& _Right) const
{ // test for iterator equality
_Compat(_Right);
return (_Idx == _Right._Idx);
}
bool operator!=(const _Myiter& _Right) const
{ // test for iterator inequality
return (!(*this == _Right));
}
bool operator<(const _Myiter& _Right) const
{ // test if this < _Right
_Compat(_Right);
return (_Idx < _Right._Idx);
}
bool operator>(const _Myiter& _Right) const
{ // test if this > _Right
return (_Right < *this);
}
bool operator<=(const _Myiter& _Right) const
{ // test if this <= _Right
return (!(_Right < *this));
}
bool operator>=(const _Myiter& _Right) const
{ // test if this >= _Right
return (!(*this < _Right));
}
#if _ITERATOR_DEBUG_LEVEL == 2
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pair
if (_Ptr != _Right._Ptr)
{ // report error
_DEBUG_ERROR("array iterators incompatible");
_SCL_SECURE_INVALID_ARGUMENT;
}
}
#elif _ITERATOR_DEBUG_LEVEL == 1
void _Compat(const _Myiter& _Right) const
{ // test for compatible iterator pair
_SCL_SECURE_VALIDATE_RANGE(_Ptr == _Right._Ptr);
}
#endif /* _ITERATOR_DEBUG_LEVEL */
pointer _Ptr; // beginning of array
size_t _Idx; // offset into array
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */
};
template<class _Ty,
size_t _Size> inline
typename _Array_const_iterator<_Ty, _Size>::_Unchecked_type
_Unchecked(_Array_const_iterator<_Ty, _Size> _Iter)
{ // convert to unchecked
return (_Iter._Unchecked());
}
template<class _Ty,
size_t _Size> inline
_Array_const_iterator<_Ty, _Size>&
_Rechecked(_Array_const_iterator<_Ty, _Size>& _Iter,
typename _Array_const_iterator<_Ty, _Size>
::_Unchecked_type _Right)
{ // convert to checked
return (_Iter._Rechecked(_Right));
}
template<class _Ty,
size_t _Size> inline
_Array_const_iterator<_Ty, _Size> operator+(
typename _Array_const_iterator<_Ty, _Size>::difference_type _Off,
_Array_const_iterator<_Ty, _Size> _Next)
{ // add offset to iterator
return (_Next += _Off);
}
// TEMPLATE CLASS _Array_iterator
template<class _Ty,
size_t _Size>
class _Array_iterator
: public _Array_const_iterator<_Ty, _Size>
{ // iterator for mutable array
public:
typedef _Array_iterator<_Ty, _Size> _Myiter;
typedef _Array_const_iterator<_Ty, _Size> _Mybase;
typedef random_access_iterator_tag iterator_category;
typedef _Ty value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Ty *pointer;
typedef _Ty& reference;
_Array_iterator()
{ // construct with null pointer
}
explicit _Array_iterator(pointer _Parg, size_t _Off = 0)
: _Mybase(_Parg, _Off)
{ // construct with pointer and offset
}
enum {_EEN_SIZE = _Size}; // helper for expression evaluator
enum {_EEN_IDL =
_ITERATOR_DEBUG_LEVEL}; // helper for expression evaluator
typedef pointer _Unchecked_type;
_Myiter& _Rechecked(_Unchecked_type _Right)
{ // reset from unchecked iterator
((_Mybase *)this)->_Rechecked(_Right);
return (*this);
}
_Unchecked_type _Unchecked() const
{ // make an unchecked iterator
return ((pointer)((_Mybase *)this)->_Unchecked());
}
reference operator*() const
{ // return designated object
return ((reference)**(_Mybase *)this);
}
pointer operator->() const
{ // return pointer to class object
return (&**this);
}
_Myiter& operator++()
{ // preincrement
++*(_Mybase *)this;
return (*this);
}
_Myiter operator++(int)
{ // postincrement
_Myiter _Tmp = *this;
++*this;
return (_Tmp);
}
_Myiter& operator--()
{ // predecrement
--*(_Mybase *)this;
return (*this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -