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