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 
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