📄 xutility
字号:
{ // get end of array
return (&_Array[0] + _Size);
}
#endif /* _HAS_CPP0X */
// TEMPLATE CLASS _Revranit
template<class _RanIt,
class _Base>
class _Revranit
: public _Base
{ // wrap iterator to run it backwards
public:
typedef _Revranit<_RanIt, _Base> _Myt;
typedef typename _Base::difference_type difference_type;
typedef typename _Base::pointer pointer;
typedef typename _Base::reference reference;
typedef _RanIt iterator_type;
_Revranit()
{ // construct with default wrapped iterator
}
explicit _Revranit(_RanIt _Right)
: current(_Right)
{ // construct wrapped iterator from _Right
}
template<class _RanIt2,
class _Base2>
_Revranit(const _Revranit<_RanIt2, _Base2>& _Right)
: current(_Right.base())
{ // initialize with compatible base
}
_RanIt base() const
{ // return wrapped iterator
return (current);
}
reference operator*() const
{ // return designated value
_RanIt _Tmp = current;
return (*--_Tmp);
}
pointer operator->() const
{ // return pointer to class object
return (&**this);
}
_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);
}
template<class _RanIt2,
class _Base2>
bool _Equal(const _Revranit<_RanIt2, _Base2>& _Right) const
{ // test for iterator equality
return (current == _Right.base());
}
// N.B. functions valid for random-access iterators only beyond this point
_Myt& operator+=(difference_type _Off)
{ // increment by integer
current -= _Off;
return (*this);
}
_Myt operator+(difference_type _Off) const
{ // return this + integer
return (_Myt(current - _Off));
}
_Myt& operator-=(difference_type _Off)
{ // decrement by integer
current += _Off;
return (*this);
}
_Myt operator-(difference_type _Off) const
{ // return this - integer
return (_Myt(current + _Off));
}
reference operator[](difference_type _Off) const
{ // subscript
return (*(*this + _Off));
}
template<class _RanIt2,
class _Base2>
bool _Less(const _Revranit<_RanIt2, _Base2>& _Right) const
{ // test if this < _Right
return (_Right.base() < current);
}
difference_type operator-(const _Myt& _Right) const
{ // return difference of iterators
return (_Right.base() - current);
}
protected:
_RanIt current; // the wrapped iterator
};
// _Revranit TEMPLATE OPERATORS
template<class _RanIt,
class _Base,
class _Diff> inline
_Revranit<_RanIt, _Base>
operator+(_Diff _Off,
const _Revranit<_RanIt, _Base>& _Right)
{ // return reverse_iterator + integer
return (_Right + _Off);
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
typename _Base1::difference_type operator-(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // return difference of reverse_iterators
return (_Right.base() - _Left.base());
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
bool operator==(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // test for reverse_iterator equality
return (_Left._Equal(_Right));
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
bool operator!=(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // test for reverse_iterator inequality
return (!(_Left == _Right));
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
bool operator<(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // test for reverse_iterator < reverse_iterator
return (_Left._Less(_Right));
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
bool operator>(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // test for reverse_iterator > reverse_iterator
return (_Right < _Left);
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
bool operator<=(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // test for reverse_iterator <= reverse_iterator
return (!(_Right < _Left));
}
template<class _RanIt1,
class _Base1,
class _RanIt2,
class _Base2> inline
bool operator>=(
const _Revranit<_RanIt1, _Base1>& _Left,
const _Revranit<_RanIt2, _Base2>& _Right)
{ // test for reverse_iterator >= reverse_iterator
return (!(_Left < _Right));
}
// TEMPLATE CLASS reverse_iterator
template<class _RanIt>
class reverse_iterator
: public _Revranit<_RanIt, iterator<
typename iterator_traits<_RanIt>::iterator_category,
typename iterator_traits<_RanIt>::value_type,
typename iterator_traits<_RanIt>::difference_type,
typename iterator_traits<_RanIt>::pointer,
typename iterator_traits<_RanIt>::reference> >
{ // wrap iterator to run it backwards
typedef reverse_iterator<_RanIt> _Myt;
typedef _Revranit<_RanIt, iterator<
typename iterator_traits<_RanIt>::iterator_category,
typename iterator_traits<_RanIt>::value_type,
typename iterator_traits<_RanIt>::difference_type,
typename iterator_traits<_RanIt>::pointer,
typename iterator_traits<_RanIt>::reference> > _Mybase;
public:
typedef typename iterator_traits<_RanIt>::difference_type difference_type;
typedef typename iterator_traits<_RanIt>::pointer pointer;
typedef typename iterator_traits<_RanIt>::reference reference;
typedef _RanIt iterator_type;
reverse_iterator()
{ // construct with default wrapped iterator
}
explicit reverse_iterator(_RanIt _Right)
: _Mybase(_Right)
{ // construct wrapped iterator from _Right
}
template<class _Other>
reverse_iterator(const reverse_iterator<_Other>& _Right)
: _Mybase(_Right.base())
{ // initialize with compatible base
}
reverse_iterator(_Mybase _Right)
: _Mybase(_Right)
{ // construct wrapped iterator from base object
}
_Myt& operator++()
{ // preincrement
++*((_Mybase *)this);
return (*this);
}
_Myt operator++(int)
{ // postincrement
_Myt _Tmp = *this;
++*this;
return (_Tmp);
}
_Myt& operator--()
{ // predecrement
--*((_Mybase *)this);
return (*this);
}
_Myt operator--(int)
{ // postdecrement
_Myt _Tmp = *this;
--*this;
return (_Tmp);
}
_Myt& operator+=(difference_type _Off)
{ // increment by integer
*((_Mybase *)this) += _Off;
return (*this);
}
_Myt operator+(difference_type _Off) const
{ // return this + integer
_Myt _Tmp = *this;
return (_Tmp += _Off);
}
_Myt& operator-=(difference_type _Off)
{ // decrement by integer
*((_Mybase *)this) -= _Off;
return (*this);
}
_Myt operator-(difference_type _Off) const
{ // return this - integer
_Myt _Tmp = *this;
return (_Tmp -= _Off);
}
};
template<class _RanIt>
struct _Is_checked_helper<reverse_iterator<_RanIt> >
: public _Is_checked_helper<_RanIt>
{ // mark reverse_iterator as checked if its underlying iterator is checked
};
// reverse_iterator TEMPLATE OPERATORS
template<class _RanIt,
class _Diff> inline
reverse_iterator<_RanIt> operator+(_Diff _Off,
const reverse_iterator<_RanIt>& _Right)
{ // return reverse_iterator + integer
return (_Right + _Off);
}
template<class _RanIt1,
class _RanIt2> inline
typename reverse_iterator<_RanIt1>::difference_type
operator-(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // return difference of reverse_iterators
return (_Right.base() - _Left.base());
}
template<class _RanIt1,
class _RanIt2> inline
bool operator==(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // test for reverse_iterator equality
return (_Left._Equal(_Right));
}
template<class _RanIt1,
class _RanIt2> inline
bool operator!=(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // test for reverse_iterator inequality
return (!(_Left == _Right));
}
template<class _RanIt1,
class _RanIt2> inline
bool operator<(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // test for reverse_iterator < reverse_iterator
return (_Left._Less(_Right));
}
template<class _RanIt1,
class _RanIt2> inline
bool operator>(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // test for reverse_iterator > reverse_iterator
return (_Right < _Left);
}
template<class _RanIt1,
class _RanIt2> inline
bool operator<=(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // test for reverse_iterator <= reverse_iterator
return (!(_Right < _Left));
}
template<class _RanIt1,
class _RanIt2> inline
bool operator>=(const reverse_iterator<_RanIt1>& _Left,
const reverse_iterator<_RanIt2>& _Right)
{ // test for reverse_iterator >= reverse_iterator
return (!(_Left < _Right));
}
// TEMPLATE CLASS reverse_bidirectional_iterator (retained)
template<class _BidIt,
class _Ty,
class _Reference = _Ty&,
class _Pointer = _Ty *,
class _Diff = ptrdiff_t>
class reverse_bidirectional_iterator
: public iterator<bidirectional_iterator_tag, _Ty, _Diff,
_Pointer, _Reference>
{ // wrap bidirectional iterator to run it backwards
public:
typedef reverse_bidirectional_iterator<_BidIt, _Ty, _Reference,
_Pointer, _Diff> _Myt;
typedef _BidIt iterator_type;
reverse_bidirectional_iterator()
{ // construct with default wrapped iterator
}
explicit reverse_bidirectional_iterator(_BidIt _Right)
: current(_Right)
{ // construct wrapped iterator from _Right
}
_BidIt base() const
{ // return wrapped iterator
return (current);
}
_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; // the wrapped iterator
};
// TEMPLATE CLASS _Revbidit
template<class _BidIt,
class _BidIt2 = _BidIt>
class _Revbidit
: public iterator<
typename iterator_traits<_BidIt>::iterator_category,
typename iterator_traits<_BidIt>::value_type,
typename iterator_traits<_BidIt>::difference_type,
typename iterator_traits<_BidIt>::pointer,
typename iterator_traits<_BidIt>::reference>
{ // wrap bidirectional iterator to run it backwards
public:
typedef _Revbidit<_BidIt, _BidIt2> _Myt;
typedef typename iterator_traits<_BidIt>::difference_type _Diff;
typedef typename iterator_traits<_BidIt>::pointer _Pointer;
typedef typename iterator_traits<_BidIt>::reference _Reference;
typedef _BidIt iterator_type;
_Revbidit()
{ // construct with default wrapped iterator
}
explicit _Revbidit(_BidIt _Right)
: current(_Right)
{ // construct wrapped iterator from _Right
}
_Revbidit(const _Revbidit<_BidIt2>& _Other)
: current (_Other.base())
{ // const converter or copy constructor
}
_BidIt base() const
{ // return wrapped iterator
return (current);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -