📄 _iterbase.h
字号:
// with return value.
template <class _ForwardIterator, class _Distance>
inline _Distance
__rw_distance (const _ForwardIterator &__first,
const _ForwardIterator &__last,
_Distance __n)
{
_STD::__distance (__first, __last, __n,
_RWSTD_ITERATOR_CATEGORY (_ForwardIterator, __first));
return __n;
}
_RWSTD_NAMESPACE_END // __rw
#ifndef _RWSTD_NO_DEBUG_ITER
_RWSTD_NAMESPACE_BEGIN (__rw)
// __rw_debug_iter - iterator adapter with debugging support
// _Iterator is either iterator or const_iterator; if the latter,
// _MutableIterator should be iterator to allow for implicit
// conversions from non-const (mutable) to const_iterator objects
template <class _Container, class _Iterator, class _MutableIterator>
class __rw_debug_iter
{
typedef _Container container_type;
typedef _Iterator iterator_type;
typedef _STD::iterator_traits<iterator_type> traits_type;
public:
typedef _TYPENAME traits_type::value_type value_type;
typedef _TYPENAME traits_type::difference_type difference_type;
typedef _TYPENAME traits_type::reference reference;
typedef _TYPENAME traits_type::pointer pointer;
typedef _TYPENAME traits_type::iterator_category iterator_category;
typedef __rw_debug_iter <container_type, _MutableIterator,
_MutableIterator> _C_mutable_iterator;
__rw_debug_iter (): _C_cont (0) { }
__rw_debug_iter (const container_type &__cont, const iterator_type &__it)
: _C_iter (__it), _C_cont (&__cont) { }
// no copy ctor other than the one below is defined
// will use a compiler generated one if _Iterator != _MutableIterator
__rw_debug_iter (const _C_mutable_iterator &__rhs)
: _C_iter (__rhs._C_iter), _C_cont (__rhs._C_cont) { }
__rw_debug_iter& operator= (const __rw_debug_iter &__rhs) {
if (this != &__rhs) {
_C_iter = __rhs._C_iter;
_C_cont = __rhs._C_cont;
}
return *this;
}
reference operator* () const {
_RWSTD_ASSERT (_C_is_dereferenceable ());
return *_C_iter;
}
reference operator[] (difference_type __n) const {
_RWSTD_ASSERT ((*this + __n)._C_is_dereferenceable ());
return _C_iter [__n];
}
_RWSTD_OPERATOR_ARROW (pointer operator-> () const);
__rw_debug_iter& operator++ () {
_RWSTD_ASSERT (!_C_is_end ());
return ++_C_iter, *this;
}
__rw_debug_iter& operator-- () {
_RWSTD_ASSERT (!_C_is_begin ());
return --_C_iter, *this;
}
__rw_debug_iter operator++ (int) {
__rw_debug_iter __tmp = *this;
return ++*this, __tmp;
}
__rw_debug_iter operator-- (int) {
__rw_debug_iter __tmp = *this;
return --*this, __tmp;
}
__rw_debug_iter& operator+= (difference_type __n) {
_C_iter += __n;
_RWSTD_ASSERT ( _C_iter >= _C_cont->begin ()._C_iter
&& _C_iter <= _C_cont->end ()._C_iter);
return *this;
}
__rw_debug_iter& operator-= (difference_type __n) {
_C_iter -= __n;
_RWSTD_ASSERT ( _C_iter >= _C_cont->begin ()._C_iter
&& _C_iter <= _C_cont->end ()._C_iter);
return *this;
}
__rw_debug_iter operator+ (difference_type __n) const {
return __rw_debug_iter (*this) += __n;
}
__rw_debug_iter operator- (difference_type __n) const {
return __rw_debug_iter (*this) -= __n;
}
bool _C_is_begin () const {
return _C_cont && _C_cont->begin () == *this;
}
bool _C_is_end () const {
return _C_cont && _C_cont->end () == *this;
}
bool _C_is_dereferenceable () const {
return !_C_is_end ();
}
bool _C_valid_range (const __rw_debug_iter &__it) const {
return _C_cont && _C_cont == __it._C_cont;
}
const iterator_type& base () const {
return _C_iter;
}
iterator_type& base () {
return _C_iter;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
// operators are templatized to assure const/non-const symmetry
template <class _Iter>
difference_type
operator- (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
_RWSTD_ASSERT (_C_cont && _C_cont == __rhs._C_cont);
return _C_iter - __rhs._C_iter;
}
template <class _Iter>
bool
operator== (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
return _C_iter == __rhs._C_iter;
}
template <class _Iter>
bool
operator< (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
return _C_iter < __rhs._C_iter;
}
template <class _Iter>
bool
operator!= (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
return _C_iter != __rhs._C_iter;
}
template <class _Iter>
bool
operator<= (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
return _C_iter <= __rhs._C_iter;
}
template <class _Iter>
bool
operator> (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
return _C_iter > __rhs._C_iter;
}
template <class _Iter>
bool
operator>= (const __rw_debug_iter<container_type, _Iter,
_MutableIterator> &__rhs) const {
return _C_iter >= __rhs._C_iter;
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
iterator_type _C_iter; // wrapped iterator
const container_type *_C_cont; // associated container
};
_RWSTD_NAMESPACE_END // __rw
_RWSTD_NAMESPACE_BEGIN (std)
#ifndef _RWSTD_NO_NONDEDUCED_CONTEXT
# define _RWSTD_CONT_DIFF_TYPE _TYPENAME _Cont::difference_type
#else
# define _RWSTD_CONT_DIFF_TYPE ptrdiff_t
#endif
template <class _Cont, class _Iter, class _MutIter>
inline _RW::__rw_debug_iter<_Cont, _Iter, _MutIter>
operator+ (_RWSTD_CONT_DIFF_TYPE __n,
const _RW::__rw_debug_iter<_Cont, _Iter, _MutIter> &__x)
{
return __x + __n;
}
#undef _RWSTD_CONT_DIFF_TYPE
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
// with no support for member templates namespace-scope (non-member)
// operators must be used - these will cause ambiguities with those
// in std::rel_ops if the latter are found during lookup
// _Iter1 may differ from _Iter2 if the function operands are const
// and non-const iterators, respectively (allows symmetry)
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline _TYPENAME _Cont::difference_type
operator- (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
_RWSTD_ASSERT (__x._C_cont && __x._C_cont == __y._C_cont);
return __x._C_iter - __y._C_iter;
}
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline bool
operator== (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
return __x._C_iter == __y._C_iter;
}
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline bool
operator< (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
_RWSTD_ASSERT (__x._C_cont && __x._C_cont == __y._C_cont);
return __x._C_iter < __y._C_iter;
}
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline bool
operator!= (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
return !(__x == __y);
}
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline bool
operator<= (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
return !(__y < __x);
}
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline bool
operator>= (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
return !(__x < __y);
}
template <class _Cont, class _Iter1, class _Iter2, class _MutIter>
inline bool
operator> (const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
{
return __y < __x;
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
_RWSTD_NAMESPACE_END // std
_RWSTD_NAMESPACE_BEGIN (__rw)
#define _RWSTD_DEBUG_ITER(cont, it, mutit) __rw_debug_iter< cont, it, mutit >
template <class _Cont, class _Iter, class _MutIter>
inline bool
__rw_valid_range (const _RWSTD_DEBUG_ITER(_Cont, _Iter, _MutIter) &__first,
const _RWSTD_DEBUG_ITER(_Cont, _Iter, _MutIter) &__last)
{
return __first._C_cont && __first._C_cont == __last._C_cont;
}
template <class _Iterator>
inline bool
__rw_valid_range (const _Iterator &, const _Iterator &)
{
return true;
}
template <class _Cont, class _Iter, class _MutIter>
inline bool
__rw_in_range (const _RWSTD_DEBUG_ITER(_Cont, _Iter, _MutIter) &__it,
const _RWSTD_DEBUG_ITER(_Cont, _Iter, _MutIter) &__first,
const _RWSTD_DEBUG_ITER(_Cont, _Iter, _MutIter) &__last)
{
return __rw_valid_range (__first, __it)
&& __rw_valid_range (__it, __last);
}
template <class _Iterator>
inline bool
__rw_in_range (const _Iterator&, const _Iterator&, const _Iterator&)
{
return true;
}
template <class _Cont, class _Iter, class _MutIter>
inline bool
__rw_dereferenceable (const _RWSTD_DEBUG_ITER(_Cont, _Iter, _MutIter) &__it)
{
return __it._C_is_dereferenceable ();
}
template <class _Iterator>
inline bool
__rw_dereferenceable (const _Iterator&)
{
return true;
}
template <class _TypeT>
inline bool
__rw_dereferenceable (const _TypeT *__ptr)
{
return 0 != __ptr;
}
_RWSTD_NAMESPACE_END // __rw
#undef _RWSTD_DEBUG_ITER
#endif // _RWSTD_NO_DEBUG_ITER
#endif // _RWSTD_ITERBASE_H_INCLUDED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -