STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Types | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
__gnu_debug::_Safe_iterator< _Iterator, _Sequence > Class Template Reference

Safe iterator wrapper. More...

#include <debug/formatter.h>

Inheritance diagram for __gnu_debug::_Safe_iterator< _Iterator, _Sequence >:
__gnu_debug::_Safe_iterator_base

Public Types

typedef _Iterator iterator_type
 
typedef _Traits::iterator_category iterator_category
 
typedef _Traits::value_type value_type
 
typedef _Traits::difference_type difference_type
 
typedef _Traits::reference reference
 
typedef _Traits::pointer pointer
 

Public Member Functions

 _Safe_iterator ()
 
 _Safe_iterator (const _Iterator &__i, const _Sequence *__seq)
 Safe iterator construction from an unsafe iterator and its sequence. More...
 
 _Safe_iterator (const _Safe_iterator &__x)
 Copy construction. More...
 
template<typename _MutableIterator >
 _Safe_iterator (const _Safe_iterator< _MutableIterator, typename __gnu_cxx::__enable_if<(std::__are_same< _MutableIterator, typename _Sequence::iterator::iterator_type >::__value), _Sequence >::__type > &__x)
 Converting constructor from a mutable iterator to a constant iterator. More...
 
_Safe_iteratoroperator= (const _Safe_iterator &__x)
 Copy assignment. More...
 
reference operator* () const
 Iterator dereference. More...
 
pointer operator-> () const
 Iterator dereference. More...
 
_Safe_iteratoroperator++ ()
 Iterator preincrement. More...
 
_Safe_iterator operator++ (int)
 Iterator postincrement. More...
 
_Safe_iteratoroperator-- ()
 Iterator predecrement. More...
 
_Safe_iterator operator-- (int)
 Iterator postdecrement. More...
 
reference operator[] (const difference_type &__n) const
 
_Safe_iteratoroperator+= (const difference_type &__n)
 
_Safe_iterator operator+ (const difference_type &__n) const
 
_Safe_iteratoroperator-= (const difference_type &__n)
 
_Safe_iterator operator- (const difference_type &__n) const
 
_Iterator base () const
 Return the underlying iterator. More...
 
 operator _Iterator () const
 Conversion to underlying non-debug iterator to allow better interaction with non-debug containers. More...
 
void _M_attach (_Safe_sequence_base *__seq)
 
void _M_attach_single (_Safe_sequence_base *__seq)
 
bool _M_dereferenceable () const
 Is the iterator dereferenceable? More...
 
bool _M_before_dereferenceable () const
 Is the iterator before a dereferenceable one? More...
 
bool _M_incrementable () const
 Is the iterator incrementable? More...
 
bool _M_decrementable () const
 
bool _M_can_advance (const difference_type &__n) const
 
template<typename _Other >
bool _M_valid_range (const _Safe_iterator< _Other, _Sequence > &__rhs) const
 
const _Sequence * _M_get_sequence () const
 
bool _M_is_begin () const
 Is this iterator equal to the sequence's begin() iterator? More...
 
bool _M_is_end () const
 Is this iterator equal to the sequence's end() iterator? More...
 
bool _M_is_before_begin () const
 
bool _M_is_beginnest () const
 
- Public Member Functions inherited from __gnu_debug::_Safe_iterator_base
void _M_attach (_Safe_sequence_base *__seq, bool __constant)
 
void _M_attach_single (_Safe_sequence_base *__seq, bool __constant) throw ()
 
void _M_detach ()
 
void _M_detach_single () throw ()
 
bool _M_attached_to (const _Safe_sequence_base *__seq) const
 
_GLIBCXX_PURE bool _M_singular () const throw ()
 
_GLIBCXX_PURE bool _M_can_compare (const _Safe_iterator_base &__x) const throw ()
 
void _M_invalidate ()
 
void _M_reset () throw ()
 
void _M_unlink () throw ()
 

Private Types

typedef _Safe_iterator _Self
 
typedef std::iterator_traits
< _Iterator > 
_Traits
 

Private Member Functions

bool _M_constant () const
 Determine if this is a constant iterator. More...
 

Private Attributes

_Iterator _M_current
 The underlying iterator. More...
 

Additional Inherited Members

- Public Attributes inherited from __gnu_debug::_Safe_iterator_base
_Safe_sequence_base_M_sequence
 
unsigned int _M_version
 
_Safe_iterator_base_M_prior
 
_Safe_iterator_base_M_next
 
- Protected Member Functions inherited from __gnu_debug::_Safe_iterator_base
 _Safe_iterator_base ()
 
 _Safe_iterator_base (const _Safe_sequence_base *__seq, bool __constant)
 
 _Safe_iterator_base (const _Safe_iterator_base &__x, bool __constant)
 
_Safe_iterator_baseoperator= (const _Safe_iterator_base &)
 
 _Safe_iterator_base (const _Safe_iterator_base &)
 
 ~_Safe_iterator_base ()
 
__gnu_cxx::__mutex & _M_get_mutex () throw ()
 

Detailed Description

template<typename _Iterator, typename _Sequence>
class __gnu_debug::_Safe_iterator< _Iterator, _Sequence >

Safe iterator wrapper.

The class template _Safe_iterator is a wrapper around an iterator that tracks the iterator's movement among sequences and checks that operations performed on the "safe" iterator are legal. In additional to the basic iterator operations (which are validated, and then passed to the underlying iterator), _Safe_iterator has member functions for iterator invalidation, attaching/detaching the iterator from sequences, and querying the iterator's state.

Member Typedef Documentation

template<typename _Iterator, typename _Sequence>
typedef _Safe_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Self
private
template<typename _Iterator, typename _Sequence>
typedef std::iterator_traits<_Iterator> __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Traits
private
template<typename _Iterator, typename _Sequence>
typedef _Traits::difference_type __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::difference_type
template<typename _Iterator, typename _Sequence>
typedef _Traits::iterator_category __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::iterator_category
template<typename _Iterator, typename _Sequence>
typedef _Iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::iterator_type
template<typename _Iterator, typename _Sequence>
typedef _Traits::pointer __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::pointer
template<typename _Iterator, typename _Sequence>
typedef _Traits::reference __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::reference
template<typename _Iterator, typename _Sequence>
typedef _Traits::value_type __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::value_type

Constructor & Destructor Documentation

template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( )
inline
Postcondition
the iterator is singular and unattached
142 : _M_current() { }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( const _Iterator &  __i,
const _Sequence *  __seq 
)
inline

Safe iterator construction from an unsafe iterator and its sequence.

Precondition
seq is not NULL
Postcondition
this is not singular
152  : _Safe_iterator_base(__seq, _M_constant()), _M_current(__i)
153  {
155  _M_message(__msg_init_singular)
156  ._M_iterator(*this, "this"));
157  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
Definition: formatter.h:81
_GLIBCXX_PURE bool _M_singular() const
_Safe_iterator_base()
Definition: safe_base.h:76
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_constant() const
Determine if this is a constant iterator.
Definition: safe_iterator.h:125
template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( const _Safe_iterator< _Iterator, _Sequence > &  __x)
inline

Copy construction.

163  : _Safe_iterator_base(__x, _M_constant()), _M_current(__x._M_current)
164  {
165  // _GLIBCXX_RESOLVE_LIB_DEFECTS
166  // DR 408. Is vector<reverse_iterator<char*> > forbidden?
167  _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
168  || __x._M_current == _Iterator(),
169  _M_message(__msg_init_copy_singular)
170  ._M_iterator(*this, "this")
171  ._M_iterator(__x, "other"));
172  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
_Safe_iterator_base()
Definition: safe_base.h:76
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_constant() const
Determine if this is a constant iterator.
Definition: safe_iterator.h:125
Definition: formatter.h:82
template<typename _Iterator, typename _Sequence>
template<typename _MutableIterator >
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( const _Safe_iterator< _MutableIterator, typename __gnu_cxx::__enable_if<(std::__are_same< _MutableIterator, typename _Sequence::iterator::iterator_type >::__value), _Sequence >::__type > &  __x)
inline

Converting constructor from a mutable iterator to a constant iterator.

202  : _Safe_iterator_base(__x, _M_constant()), _M_current(__x.base())
203  {
204  // _GLIBCXX_RESOLVE_LIB_DEFECTS
205  // DR 408. Is vector<reverse_iterator<char*> > forbidden?
206  _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
207  || __x.base() == _Iterator(),
208  _M_message(__msg_init_const_singular)
209  ._M_iterator(*this, "this")
210  ._M_iterator(__x, "other"));
211  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
Definition: formatter.h:83
_Safe_iterator_base()
Definition: safe_base.h:76
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_constant() const
Determine if this is a constant iterator.
Definition: safe_iterator.h:125

Member Function Documentation

template<typename _Iterator, typename _Sequence>
void __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach ( _Safe_sequence_base __seq)
inline

Attach iterator to the given sequence.

407  {
409  }
void _M_attach(_Safe_sequence_base *__seq, bool __constant)
bool _M_constant() const
Determine if this is a constant iterator.
Definition: safe_iterator.h:125
template<typename _Iterator, typename _Sequence>
void __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach_single ( _Safe_sequence_base __seq)
inline

Likewise, but not thread-safe.

414  {
416  }
void _M_attach_single(_Safe_sequence_base *__seq, bool __constant)
bool _M_constant() const
Determine if this is a constant iterator.
Definition: safe_iterator.h:125
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_before_dereferenceable ( ) const
inline

Is the iterator before a dereferenceable one?

426  {
427  if (this->_M_incrementable())
428  {
429  _Iterator __base = base();
430  return ++__base != _M_get_sequence()->_M_base().end();
431  }
432  return false;
433  }
_Siter_base< _Iterator >::iterator_type __base(_Iterator __it)
Definition: functions.h:446
bool _M_incrementable() const
Is the iterator incrementable?
Definition: safe_iterator.h:437
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator , typename _Sequence >
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_can_advance ( const difference_type __n) const
38  {
39  typedef typename _Sequence::const_iterator const_debug_iterator;
40  typedef typename const_debug_iterator::iterator_type const_iterator;
41 
42  if (this->_M_singular())
43  return false;
44  if (__n == 0)
45  return true;
46  if (__n < 0)
47  {
48  const_iterator __begin = _M_get_sequence()->_M_base().begin();
49  std::pair<difference_type, _Distance_precision> __dist =
50  __get_distance(__begin, base());
51  bool __ok = ((__dist.second == __dp_exact && __dist.first >= -__n)
52  || (__dist.second != __dp_exact && __dist.first > 0));
53  return __ok;
54  }
55  else
56  {
57  const_iterator __end = _M_get_sequence()->_M_base().end();
58  std::pair<difference_type, _Distance_precision> __dist =
59  __get_distance(base(), __end);
60  bool __ok = ((__dist.second == __dp_exact && __dist.first >= __n)
61  || (__dist.second != __dp_exact && __dist.first > 0));
62  return __ok;
63  }
64  }
std::pair< typename std::iterator_traits< _Iterator1 >::difference_type, _Distance_precision > __get_distance(const _Iterator1 &__lhs, const _Iterator2 &__rhs, std::random_access_iterator_tag)
Definition: safe_iterator.h:83
_GLIBCXX_PURE bool _M_singular() const
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
Definition: safe_iterator.h:74
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_constant ( ) const
inlineprivate

Determine if this is a constant iterator.

126  {
127  typedef typename _Sequence::const_iterator const_iterator;
128  return std::__are_same<const_iterator, _Safe_iterator>::__value;
129  }
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_decrementable ( ) const
inline
442 { return !_M_singular() && !_M_is_begin(); }
bool _M_is_begin() const
Is this iterator equal to the sequence's begin() iterator?
Definition: safe_iterator.h:459
_GLIBCXX_PURE bool _M_singular() const
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_dereferenceable ( ) const
inline

Is the iterator dereferenceable?

421  { return !this->_M_singular() && !_M_is_end() && !_M_is_before_begin(); }
bool _M_is_before_begin() const
Definition: safe_iterator.h:468
_GLIBCXX_PURE bool _M_singular() const
bool _M_is_end() const
Is this iterator equal to the sequence's end() iterator?
Definition: safe_iterator.h:463
template<typename _Iterator, typename _Sequence>
const _Sequence* __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_get_sequence ( ) const
inline
456  { return static_cast<const _Sequence*>(_M_sequence); }
_Safe_sequence_base * _M_sequence
Definition: safe_base.h:55
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_incrementable ( ) const
inline

Is the iterator incrementable?

438  { return !this->_M_singular() && !_M_is_end(); }
_GLIBCXX_PURE bool _M_singular() const
bool _M_is_end() const
Is this iterator equal to the sequence's end() iterator?
Definition: safe_iterator.h:463
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_is_before_begin ( ) const
inline

Is this iterator equal to the sequence's before_begin() iterator if any?

469  {
471  }
static bool _S_Is(_BaseIt, const _Sequence *)
Definition: safe_iterator.h:51
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_is_begin ( ) const
inline

Is this iterator equal to the sequence's begin() iterator?

460  { return base() == _M_get_sequence()->_M_base().begin(); }
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_is_beginnest ( ) const
inline

Is this iterator equal to the sequence's before_begin() iterator if any or begin() otherwise?

476  {
478  _M_get_sequence());
479  }
static bool _S_Is_Beginnest(_BaseIt __it, const _Sequence *__seq)
Definition: safe_iterator.h:55
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_is_end ( ) const
inline

Is this iterator equal to the sequence's end() iterator?

464  { return base() == _M_get_sequence()->_M_base().end(); }
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator , typename _Sequence >
template<typename _Other >
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_valid_range ( const _Safe_iterator< _Other, _Sequence > &  __rhs) const
71  {
72  if (!_M_can_compare(__rhs))
73  return false;
74 
75  /* Determine if we can order the iterators without the help of
76  the container */
77  std::pair<difference_type, _Distance_precision> __dist =
78  __get_distance(base(), __rhs.base());
79  switch (__dist.second) {
80  case __dp_equality:
81  if (__dist.first == 0)
82  return true;
83  break;
84 
85  case __dp_sign:
86  case __dp_exact:
87  return __dist.first >= 0;
88  }
89 
90  /* We can only test for equality, but check if one of the
91  iterators is at an extreme. */
92  /* Optim for classic [begin, it) or [it, end) ranges, limit checks
93  * when code is valid. Note, for the special case of forward_list,
94  * before_begin replaces the role of begin. */
95  if (_M_is_beginnest() || __rhs._M_is_end())
96  return true;
97  if (_M_is_end() || __rhs._M_is_beginnest())
98  return false;
99 
100  // Assume that this is a valid range; we can't check anything else
101  return true;
102  }
std::pair< typename std::iterator_traits< _Iterator1 >::difference_type, _Distance_precision > __get_distance(const _Iterator1 &__lhs, const _Iterator2 &__rhs, std::random_access_iterator_tag)
Definition: safe_iterator.h:83
Definition: safe_iterator.h:73
_GLIBCXX_PURE bool _M_can_compare(const _Safe_iterator_base &__x) const
bool _M_is_beginnest() const
Definition: safe_iterator.h:475
bool _M_is_end() const
Is this iterator equal to the sequence's end() iterator?
Definition: safe_iterator.h:463
Definition: safe_iterator.h:74
Definition: safe_iterator.h:72
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396
template<typename _Iterator, typename _Sequence>
_Iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::base ( ) const
inline

Return the underlying iterator.

396 { return _M_current; }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator _Iterator ( ) const
inline

Conversion to underlying non-debug iterator to allow better interaction with non-debug containers.

402 { return _M_current; }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
template<typename _Iterator, typename _Sequence>
reference __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator* ( ) const
inline

Iterator dereference.

Precondition
iterator is dereferenceable
261  {
263  _M_message(__msg_bad_deref)
264  ._M_iterator(*this, "this"));
265  return *_M_current;
266  }
Definition: formatter.h:85
bool _M_dereferenceable() const
Is the iterator dereferenceable?
Definition: safe_iterator.h:420
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
template<typename _Iterator, typename _Sequence>
_Safe_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator+ ( const difference_type __n) const
inline
367  {
368  _Safe_iterator __tmp(*this);
369  __tmp += __n;
370  return __tmp;
371  }
_Safe_iterator()
Definition: safe_iterator.h:142
template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator++ ( )
inline

Iterator preincrement.

Precondition
iterator is incrementable
290  {
292  _M_message(__msg_bad_inc)
293  ._M_iterator(*this, "this"));
294  ++_M_current;
295  return *this;
296  }
Definition: formatter.h:86
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
bool _M_incrementable() const
Is the iterator incrementable?
Definition: safe_iterator.h:437
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
template<typename _Iterator, typename _Sequence>
_Safe_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator++ ( int  )
inline

Iterator postincrement.

Precondition
iterator is incrementable
304  {
306  _M_message(__msg_bad_inc)
307  ._M_iterator(*this, "this"));
308  _Safe_iterator __tmp(*this);
309  ++_M_current;
310  return __tmp;
311  }
Definition: formatter.h:86
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
bool _M_incrementable() const
Is the iterator incrementable?
Definition: safe_iterator.h:437
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
_Safe_iterator()
Definition: safe_iterator.h:142
template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator+= ( const difference_type __n)
inline
357  {
359  _M_message(__msg_advance_oob)
360  ._M_iterator(*this)._M_integer(__n));
361  _M_current += __n;
362  return *this;
363  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_can_advance(const difference_type &__n) const
Definition: safe_iterator.tcc:37
Definition: formatter.h:89
template<typename _Iterator, typename _Sequence>
_Safe_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator- ( const difference_type __n) const
inline
385  {
386  _Safe_iterator __tmp(*this);
387  __tmp -= __n;
388  return __tmp;
389  }
_Safe_iterator()
Definition: safe_iterator.h:142
template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator-- ( )
inline

Iterator predecrement.

Precondition
iterator is decrementable
320  {
322  _M_message(__msg_bad_dec)
323  ._M_iterator(*this, "this"));
324  --_M_current;
325  return *this;
326  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
Definition: formatter.h:87
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_decrementable() const
Definition: safe_iterator.h:442
template<typename _Iterator, typename _Sequence>
_Safe_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator-- ( int  )
inline

Iterator postdecrement.

Precondition
iterator is decrementable
334  {
336  _M_message(__msg_bad_dec)
337  ._M_iterator(*this, "this"));
338  _Safe_iterator __tmp(*this);
339  --_M_current;
340  return __tmp;
341  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
Definition: formatter.h:87
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_decrementable() const
Definition: safe_iterator.h:442
_Safe_iterator()
Definition: safe_iterator.h:142
template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator-= ( const difference_type __n)
inline
375  {
377  _M_message(__msg_retreat_oob)
378  ._M_iterator(*this)._M_integer(__n));
379  _M_current += -__n;
380  return *this;
381  }
Definition: formatter.h:90
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_can_advance(const difference_type &__n) const
Definition: safe_iterator.tcc:37
template<typename _Iterator, typename _Sequence>
pointer __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator-> ( ) const
inline

Iterator dereference.

Precondition
iterator is dereferenceable
Todo:

Make this correct w.r.t. iterators that return proxies

Use addressof() instead of & operator

276  {
278  _M_message(__msg_bad_deref)
279  ._M_iterator(*this, "this"));
280  return &*_M_current;
281  }
Definition: formatter.h:85
bool _M_dereferenceable() const
Is the iterator dereferenceable?
Definition: safe_iterator.h:420
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator= ( const _Safe_iterator< _Iterator, _Sequence > &  __x)
inline

Copy assignment.

218  {
219  // _GLIBCXX_RESOLVE_LIB_DEFECTS
220  // DR 408. Is vector<reverse_iterator<char*> > forbidden?
221  _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
222  || __x._M_current == _Iterator(),
223  _M_message(__msg_copy_singular)
224  ._M_iterator(*this, "this")
225  ._M_iterator(__x, "other"));
226  _M_current = __x._M_current;
227  this->_M_attach(__x._M_sequence);
228  return *this;
229  }
Definition: formatter.h:84
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
void _M_attach(_Safe_sequence_base *__seq)
Definition: safe_iterator.h:406
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
template<typename _Iterator, typename _Sequence>
reference __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator[] ( const difference_type __n) const
inline
346  {
348  && this->_M_can_advance(__n+1),
349  _M_message(__msg_iter_subscript_oob)
350  ._M_iterator(*this)._M_integer(__n));
351 
352  return _M_current[__n];
353  }
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
Definition: formatter.h:88
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
Definition: macros.h:49
bool _M_can_advance(const difference_type &__n) const
Definition: safe_iterator.tcc:37

Member Data Documentation

template<typename _Iterator, typename _Sequence>
_Iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_current
private

The underlying iterator.


The documentation for this class was generated from the following files: