30 #ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_TCC
31 #define _GLIBCXX_DEBUG_SAFE_ITERATOR_TCC 1
35 template<
typename _Iterator,
typename _Sequence>
37 _Safe_iterator<_Iterator, _Sequence>::
38 _M_can_advance(
const difference_type& __n)
const
40 typedef typename _Sequence::const_iterator const_iterator;
42 if (this->_M_singular())
48 const_iterator __begin =
49 static_cast<const _Sequence*
>(_M_sequence)->begin();
51 this->_M_get_distance(__begin, *
this);
52 bool __ok = ((__dist.
second == __dp_exact && __dist.
first >= -__n)
53 || (__dist.
second != __dp_exact && __dist.
first > 0));
58 const_iterator __end =
59 static_cast<const _Sequence*
>(_M_sequence)->end();
61 this->_M_get_distance(*
this, __end);
62 bool __ok = ((__dist.
second == __dp_exact && __dist.
first >= __n)
63 || (__dist.
second != __dp_exact && __dist.
first > 0));
68 template<
typename _Iterator,
typename _Sequence>
69 template<
typename _Other>
71 _Safe_iterator<_Iterator, _Sequence>::
72 _M_valid_range(
const _Safe_iterator<_Other, _Sequence>& __rhs)
const
74 if (!_M_can_compare(__rhs))
80 this->_M_get_distance(*
this, __rhs);
83 if (__dist.
first == 0)
89 return __dist.
first >= 0;
94 if (_M_is_begin() || __rhs._M_is_end())
96 else if (_M_is_end() || __rhs._M_is_begin())
103 template<
typename _Iterator,
typename _Sequence>
109 _M_invalidate_single();
112 template<
typename _Iterator,
typename _Sequence>
117 typedef typename _Sequence::iterator iterator;
118 typedef typename _Sequence::const_iterator const_iterator;
120 if (!this->_M_singular())
123 __iter; __iter = __iter->
_M_next)
125 iterator* __victim =
static_cast<iterator*
>(__iter);
126 if (this->base() == __victim->base())
127 __victim->_M_version = 0;
131 __iter2; __iter2 = __iter2->
_M_next)
133 const_iterator* __victim =
static_cast<const_iterator*
>(__iter2);
134 if (__victim->base() == this->base())
135 __victim->_M_version = 0;