_iterator.h

来自「一个功能上类似STL的库」· C头文件 代码 · 共 485 行 · 第 1/2 页

H
485
字号
  _Self& operator=(const  _Self& __rhs) {
    (_Base&)*this = __rhs;
    return *this;
  }

  reference operator*() const;

  _STLP_DEFINE_ARROW_OPERATOR

  _Self& operator++() {
    this->__increment();
    return *this;
  }
  _Self operator++(int) {
    _Self __tmp = *this;
    this->__increment();
    return __tmp;
  }
  _Self& operator--() {
    this->__decrement();
    return *this;
  }
  _Self operator--(int) {
    _Self __tmp = *this;
    this->__decrement();
    return __tmp;
  }

  _Self& operator+=(difference_type __n) {
    this->__advance(__n);
    return *this;
  }

  _Self& operator-=(difference_type __n) {
    this->__advance(-__n);
    return *this;
  }
  _Self operator+(difference_type __n) const {
    _Self __tmp(*this);
    __tmp.__advance(__n);
    return __tmp;
  }
  _Self operator-(difference_type __n) const {
    _Self __tmp(*this);
    __tmp.__advance(-__n);
    return __tmp;
  }
  reference operator[](difference_type __n) const { return *(*this + __n); }
};

template <class _Container, class _Traits>
inline
#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
_STLP_TYPENAME_ON_RETURN_TYPE _Traits::reference
#else
_STLP_TYPENAME_ON_RETURN_TYPE _DBG_iter<_Container, _Traits>::reference
#endif
_DBG_iter<_Container, _Traits>::operator*() const {
  _STLP_DEBUG_CHECK(_Dereferenceable(*this))
  _STLP_DEBUG_CHECK(_Traits::_Check(*this))
  return *this->_M_iterator;
}

template <class _Container>
inline bool
operator==(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
  _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
  return __x._M_iterator == __y._M_iterator;
}

template <class _Container>
inline bool
operator<(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
  _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
  return _CompareIt(__x._M_iterator , __y._M_iterator, _Category());
}

template <class _Container>
inline bool
operator>(const _DBG_iter_base<_Container>& __x,
       const _DBG_iter_base<_Container>& __y) {
  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
  return _CompareIt(__y._M_iterator , __x._M_iterator, _Category());
}

template <class _Container>
inline bool
operator>=(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
  _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
  return !_CompareIt(__x._M_iterator , __y._M_iterator, _Category());
}

template <class _Container>
inline bool
operator<=(const _DBG_iter_base<_Container>& __x,
       const _DBG_iter_base<_Container>& __y) {
  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
  return !_CompareIt(__y._M_iterator , __x._M_iterator, _Category());
}

template <class _Container>
inline bool
operator!=(const _DBG_iter_base<_Container>& __x,
        const _DBG_iter_base<_Container>& __y) {
  _STLP_DEBUG_CHECK(__check_same_or_null_owner(__x, __y))
  return __x._M_iterator != __y._M_iterator;
}

//------------------------------------------

template <class _Container, class _Traits>
inline _DBG_iter<_Container, _Traits>
operator+(ptrdiff_t __n, const _DBG_iter<_Container, _Traits>& __it) {
  _DBG_iter<_Container, _Traits> __tmp(__it);
  return __tmp += __n;
}


template <class _Iterator>
inline _Iterator _Non_Dbg_iter(_Iterator __it)
{ return __it; }

#if defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
template <class _Container, class _Traits>
inline typename _DBG_iter<_Container, _Traits>::_Nonconst_iterator
_Non_Dbg_iter(_DBG_iter<_Container, _Traits> __it)
{ return __it._M_iterator; }
#endif

/*
 * Helper classes to check iterator range or pointer validity
 * at construction time.
 */
template <class _Container>
class __construct_checker {
  typedef typename _Container::value_type value_type;
protected:
  __construct_checker() {}

  __construct_checker(const value_type* __p) {
    _STLP_VERBOSE_ASSERT((__p != 0), _StlMsg_INVALID_ARGUMENT)
  }

#if defined (_STLP_MEMBER_TEMPLATES)
  template <class _InputIter>
  __construct_checker(const _InputIter& __f, const _InputIter& __l) {
    typedef typename _IsIntegral<_InputIter>::_Ret _Integral;
    _M_check_dispatch(__f, __l, _Integral());
  }

  template <class _Integer>
  void _M_check_dispatch(_Integer , _Integer, const __true_type& /*IsIntegral*/) {}

  template <class _InputIter>
  void _M_check_dispatch(const _InputIter& __f, const _InputIter& __l, const __false_type& /*IsIntegral*/) {
    _STLP_DEBUG_CHECK(__check_range(__f,__l))
  }
#endif

#if !defined (_STLP_MEMBER_TEMPLATES) || !defined (_STLP_NO_METHOD_SPECIALIZATION)
  __construct_checker(const value_type* __f, const value_type* __l) {
    _STLP_DEBUG_CHECK(__check_ptr_range(__f,__l))
  }

  typedef _DBG_iter_base<_Container> _IteType;
  __construct_checker(const _IteType& __f, const _IteType& __l) {
    _STLP_DEBUG_CHECK(__check_range(__f,__l))
  }
#endif
};

#if defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
//Construct checker used by all exported containers.
template <class _Container>
class __msvc6_construct_checker {
  typedef typename _Container::value_type value_type;
protected:
  __msvc6_construct_checker() {}

  __msvc6_construct_checker(const value_type* __p) {
    _STLP_VERBOSE_ASSERT((__p != 0), _StlMsg_INVALID_ARGUMENT)
  }

  __msvc6_construct_checker(const value_type* __f, const value_type* __l) {
    _STLP_DEBUG_CHECK(__check_ptr_range(__f,__l))
  }

  typedef _DBG_iter_base<_Container> _IteType;
  __msvc6_construct_checker(const _IteType& __f, const _IteType& __l) {
    _STLP_DEBUG_CHECK(__check_range(__f,__l))
  }
};
#  define _STLP_CONSTRUCT_CHECKER __msvc6_construct_checker
#else
#  define _STLP_CONSTRUCT_CHECKER __construct_checker
#endif

#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
#  if defined (_STLP_NESTED_TYPE_PARAM_BUG) ||\
     (defined (__SUNPRO_CC) && __SUNPRO_CC < 0x600) ||\
     (defined (_STLP_MSVC) && (_STLP_MSVC < 1100))
#    define _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS 1
#  endif

_STLP_MOVE_TO_STD_NAMESPACE

template <class _Container>
inline ptrdiff_t*
distance_type(const _STLP_PRIV _DBG_iter_base<_Container>&) { return (ptrdiff_t*) 0; }

#  if !defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
template <class _Container>
inline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_PRIV _DBG_iter_base<_Container>::value_type*
value_type(const _STLP_PRIV _DBG_iter_base<_Container>&) {
  typedef typename _STLP_PRIV _DBG_iter_base<_Container>::value_type _Val;
  return (_Val*)0;
}

template <class _Container>
inline _STLP_TYPENAME_ON_RETURN_TYPE _STLP_PRIV _DBG_iter_base<_Container>::_Iterator_category
iterator_category(const _STLP_PRIV _DBG_iter_base<_Container>&) {
  typedef typename _STLP_PRIV _DBG_iter_base<_Container>::_Iterator_category _Category;
  return _Category();
}
#  endif

_STLP_MOVE_TO_PRIV_NAMESPACE

#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */

_STLP_MOVE_TO_STD_NAMESPACE

_STLP_END_NAMESPACE

#endif /* INTERNAL_H */

// Local Variables:
// mode:C++
// End:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?