Go to the documentation of this file.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 #ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_TCC
00031 #define _GLIBCXX_DEBUG_SAFE_ITERATOR_TCC 1
00032
00033 namespace __gnu_debug
00034 {
00035 template<typename _Iterator, typename _Sequence>
00036 bool
00037 _Safe_iterator<_Iterator, _Sequence>::
00038 _M_can_advance(const difference_type& __n) const
00039 {
00040 typedef typename _Sequence::const_iterator const_debug_iterator;
00041 typedef typename const_debug_iterator::iterator_type const_iterator;
00042
00043 if (this->_M_singular())
00044 return false;
00045 if (__n == 0)
00046 return true;
00047 if (__n < 0)
00048 {
00049 const_iterator __begin = _M_get_sequence()->_M_base().begin();
00050 std::pair<difference_type, _Distance_precision> __dist =
00051 this->_M_get_distance(__begin, base());
00052 bool __ok = ((__dist.second == __dp_exact && __dist.first >= -__n)
00053 || (__dist.second != __dp_exact && __dist.first > 0));
00054 return __ok;
00055 }
00056 else
00057 {
00058 const_iterator __end = _M_get_sequence()->_M_base().end();
00059 std::pair<difference_type, _Distance_precision> __dist =
00060 this->_M_get_distance(base(), __end);
00061 bool __ok = ((__dist.second == __dp_exact && __dist.first >= __n)
00062 || (__dist.second != __dp_exact && __dist.first > 0));
00063 return __ok;
00064 }
00065 }
00066
00067 template<typename _Iterator, typename _Sequence>
00068 template<typename _Other>
00069 bool
00070 _Safe_iterator<_Iterator, _Sequence>::
00071 _M_valid_range(const _Safe_iterator<_Other, _Sequence>& __rhs) const
00072 {
00073 if (!_M_can_compare(__rhs))
00074 return false;
00075
00076
00077
00078 std::pair<difference_type, _Distance_precision> __dist =
00079 this->_M_get_distance(base(), __rhs.base());
00080 switch (__dist.second) {
00081 case __dp_equality:
00082 if (__dist.first == 0)
00083 return true;
00084 break;
00085
00086 case __dp_sign:
00087 case __dp_exact:
00088 return __dist.first >= 0;
00089 }
00090
00091
00092
00093
00094
00095 if (_M_is_begin() || __rhs._M_is_end())
00096 return true;
00097 if (_M_is_end() || __rhs._M_is_begin())
00098 return false;
00099
00100
00101 return true;
00102 }
00103 }
00104
00105 #endif
00106