00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
#ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_TCC
00037
#define _GLIBCXX_DEBUG_SAFE_ITERATOR_TCC 1
00038
00039
namespace __gnu_debug
00040 {
00041
template<
typename _Iterator,
typename _Sequence>
00042
bool
00043 _Safe_iterator<_Iterator, _Sequence>::
00044 _M_can_advance(
const difference_type& __n)
const
00045
{
00046
typedef typename _Sequence::const_iterator const_iterator;
00047
00048
if (this->_M_singular())
00049
return false;
00050
if (__n == 0)
00051
return true;
00052
if (__n < 0)
00053 {
00054 const_iterator __begin =
00055 static_cast<const _Sequence*>(_M_sequence)->begin();
00056 pair<difference_type, _Distance_precision> __dist =
00057 this->_M_get_distance(__begin, *
this);
00058
bool __ok = (__dist.second == __dp_exact && __dist.first >= -__n
00059 || __dist.second != __dp_exact && __dist.first > 0);
00060
return __ok;
00061 }
00062
else
00063 {
00064 const_iterator __end =
00065 static_cast<const _Sequence*>(_M_sequence)->end();
00066 pair<difference_type, _Distance_precision> __dist =
00067 this->_M_get_distance(*
this, __end);
00068
bool __ok = (__dist.second == __dp_exact && __dist.first >= __n
00069 || __dist.second != __dp_exact && __dist.first > 0);
00070
return __ok;
00071 }
00072 }
00073
00074
template<
typename _Iterator,
typename _Sequence>
00075
template<
typename _Other>
00076
bool
00077 _Safe_iterator<_Iterator, _Sequence>::
00078 _M_valid_range(
const _Safe_iterator<_Other, _Sequence>& __rhs)
const
00079
{
00080
if (!_M_can_compare(__rhs))
00081
return false;
00082
00083
00084
00085 pair<difference_type, _Distance_precision> __dist =
00086 this->_M_get_distance(*
this, __rhs);
00087
switch (__dist.second) {
00088
case __dp_equality:
00089
if (__dist.first == 0)
00090
return true;
00091
break;
00092
00093
case __dp_sign:
00094
case __dp_exact:
00095
return __dist.first >= 0;
00096 }
00097
00098
00099
00100
if (_M_is_begin() || __rhs._M_is_end())
00101
return true;
00102
else if (_M_is_end() || __rhs._M_is_begin())
00103
return false;
00104
00105
00106
return true;
00107 }
00108
00109
template<
typename _Iterator,
typename _Sequence>
00110
void
00111 _Safe_iterator<_Iterator, _Sequence>::
00112 _M_invalidate()
00113 {
00114
typedef typename _Sequence::iterator iterator;
00115
typedef typename _Sequence::const_iterator const_iterator;
00116
00117
if (!this->_M_singular())
00118 {
00119
for (_Safe_iterator_base* iter = _M_sequence->_M_iterators; iter; )
00120 {
00121 iterator* __victim = static_cast<iterator*>(iter);
00122 iter = iter->_M_next;
00123
if (this->
base() == __victim->base())
00124 __victim->_M_version = 0;
00125 }
00126
for (_Safe_iterator_base* iter2 = _M_sequence->_M_const_iterators;
00127 iter2; )
00128 {
00129 const_iterator* __victim = static_cast<const_iterator*>(iter2);
00130 iter2 = iter2->_M_next;
00131
if (this->
base() == __victim->base())
00132 __victim->_M_version = 0;
00133 }
00134 _M_version = 0;
00135 }
00136 }
00137 }
00138
00139
#endif
00140