GNU g++  v5.2.1
GNU Standard C++
__gnu_debug::_Safe_iterator< _Iterator, _Sequence > Class Template Reference

Safe iterator wrapper. More...

#include <safe_sequence.h>

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

Classes

struct  _Attach_single
 

Public Types

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

Public Member Functions

 _Safe_iterator () _GLIBCXX_NOEXCEPT
 
 _Safe_iterator (const _Iterator &__i, const _Safe_sequence_base *__seq) _GLIBCXX_NOEXCEPT
 Safe iterator construction from an unsafe iterator and its sequence. More...
 
 _Safe_iterator (const _Safe_iterator &__x) _GLIBCXX_NOEXCEPT
 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) _GLIBCXX_NOEXCEPT
 Converting constructor from a mutable iterator to a constant iterator. More...
 
void _M_attach (_Safe_sequence_base *__seq, bool __constant)
 Attaches this iterator to the given sequence, detaching it from whatever sequence it was attached to originally. More...
 
void _M_attach (_Safe_sequence_base *__seq)
 Attach iterator to the given sequence. More...
 
void _M_attach_single (_Safe_sequence_base *__seq, bool __constant) throw ()
 Likewise, but not thread-safe. More...
 
void _M_attach_single (_Safe_sequence_base *__seq)
 Likewise, but not thread-safe. More...
 
bool _M_attached_to (const _Safe_sequence_base *__seq) const
 Determines if we are attached to the given sequence. More...
 
bool _M_before_dereferenceable () const
 Is the iterator before a dereferenceable one? More...
 
bool _M_can_advance (const difference_type &__n) const
 
_GLIBCXX_PURE bool _M_can_compare (const _Safe_iterator_base &__x) const throw ()
 Can we compare this iterator to the given iterator __x? Returns true if both iterators are nonsingular and reference the same sequence. More...
 
bool _M_decrementable () const
 
bool _M_dereferenceable () const
 Is the iterator dereferenceable? More...
 
void _M_detach ()
 Detach the iterator for whatever sequence it is attached to, if any. More...
 
void _M_detach_single () throw ()
 Likewise, but not thread-safe. More...
 
__gnu_cxx::__conditional_type< std::__are_same< _Const_iterator, _Safe_iterator >::__value, const _Sequence *, _Sequence * >::__type _M_get_sequence () const
 
bool _M_incrementable () const
 Is the iterator incrementable? More...
 
void _M_invalidate ()
 Invalidate the iterator, making it singular. More...
 
bool _M_is_before_begin () const
 Is this iterator equal to the sequence's before_begin() iterator if any? More...
 
bool _M_is_begin () const
 Is this iterator equal to the sequence's begin() iterator? More...
 
bool _M_is_beginnest () const
 Is this iterator equal to the sequence's before_begin() iterator if any or begin() otherwise? More...
 
bool _M_is_end () const
 Is this iterator equal to the sequence's end() iterator? More...
 
void _M_reset () throw ()
 Reset all member variables. More...
 
_GLIBCXX_PURE bool _M_singular () const throw ()
 Is this iterator singular? More...
 
void _M_unlink () throw ()
 Unlink itself. More...
 
bool _M_valid_range (const _Safe_iterator &__rhs) const
 
_Iterator & base () _GLIBCXX_NOEXCEPT
 Return the underlying iterator. More...
 
const _Iterator & base () const _GLIBCXX_NOEXCEPT
 
 operator _Iterator () const _GLIBCXX_NOEXCEPT
 Conversion to underlying non-debug iterator to allow better interaction with non-debug containers. More...
 
reference operator* () const _GLIBCXX_NOEXCEPT
 Iterator dereference. More...
 
_Safe_iterator operator+ (const difference_type &__n) const _GLIBCXX_NOEXCEPT
 
_Safe_iteratoroperator++ () _GLIBCXX_NOEXCEPT
 Iterator preincrement. More...
 
_Safe_iterator operator++ (int) _GLIBCXX_NOEXCEPT
 Iterator postincrement. More...
 
_Safe_iteratoroperator+= (const difference_type &__n) _GLIBCXX_NOEXCEPT
 
_Safe_iterator operator- (const difference_type &__n) const _GLIBCXX_NOEXCEPT
 
_Safe_iteratoroperator-- () _GLIBCXX_NOEXCEPT
 Iterator predecrement. More...
 
_Safe_iterator operator-- (int) _GLIBCXX_NOEXCEPT
 Iterator postdecrement. More...
 
_Safe_iteratoroperator-= (const difference_type &__n) _GLIBCXX_NOEXCEPT
 
pointer operator-> () const _GLIBCXX_NOEXCEPT
 Iterator dereference. More...
 
_Safe_iteratoroperator= (const _Safe_iterator &__x) _GLIBCXX_NOEXCEPT
 Copy assignment. More...
 
reference operator[] (const difference_type &__n) const _GLIBCXX_NOEXCEPT
 

Public Attributes

_Safe_iterator_base_M_next
 Pointer to the next iterator in the sequence's list of iterators. More...
 
_Safe_iterator_base_M_prior
 Pointer to the previous iterator in the sequence's list of iterators. More...
 
_Safe_sequence_base_M_sequence
 The sequence this iterator references; may be NULL to indicate a singular iterator. More...
 
unsigned int _M_version
 The version number of this iterator. More...
 

Protected Member Functions

__gnu_cxx::__mutex & _M_get_mutex () throw ()
 For use in _Safe_iterator. More...
 

Private Types

typedef _Sequence::const_iterator _Const_iterator
 
typedef _Iterator _Iter_base
 
typedef _Safe_iterator_base _Safe_base
 
typedef std::iterator_traits< _Iterator > _Traits
 

Private Member Functions

 _Safe_iterator (const _Iterator &__i, _Safe_sequence_base *__seq, _Attach_single) _GLIBCXX_NOEXCEPT
 
bool _M_constant () const
 Determine if this is a constant iterator. More...
 

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.

Note that _Iterator must be the first base class so that it gets initialized before the iterator is being attached to the container's list of iterators and it is being detached before _Iterator get destroyed. Otherwise it would result in a data race.

Member Typedef Documentation

template<typename _Iterator, typename _Sequence>
typedef _Sequence::const_iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Const_iterator
private
template<typename _Iterator, typename _Sequence>
typedef _Iterator __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Iter_base
private
template<typename _Iterator, typename _Sequence>
typedef _Safe_iterator_base __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_base
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 ( const _Iterator &  __i,
_Safe_sequence_base __seq,
_Attach_single   
)
inlineprivate

References __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach_single().

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( )
inline
template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( const _Iterator &  __i,
const _Safe_sequence_base __seq 
)
inline

Safe iterator construction from an unsafe iterator and its sequence.

Precondition
seq is not NULL
Postcondition
this is not singular

References __gnu_debug::__msg_init_singular, _GLIBCXX_DEBUG_VERIFY, and __gnu_debug::_Safe_iterator_base::_M_singular().

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator ( const _Safe_iterator< _Iterator, _Sequence > &  __x)
inline

Copy construction.

References __gnu_debug::__msg_init_copy_singular, _GLIBCXX_DEBUG_VERIFY, and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach().

Here is the call graph for this function:

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.

References __gnu_debug::__msg_init_const_singular, _GLIBCXX_DEBUG_VERIFY, and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach().

Here is the call graph for this function:

Member Function Documentation

void __gnu_debug::_Safe_iterator_base::_M_attach ( _Safe_sequence_base __seq,
bool  __constant 
)
inherited

Attaches this iterator to the given sequence, detaching it from whatever sequence it was attached to originally.

If the new sequence is the NULL pointer, the iterator is left unattached.

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach(), and __gnu_debug::_Safe_iterator_base::_Safe_iterator_base().

Here is the caller graph for this function:

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.

References __gnu_debug::_Safe_iterator_base::_M_attach(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_constant().

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator=().

Here is the call graph for this function:

Here is the caller graph for this function:

void __gnu_debug::_Safe_iterator_base::_M_attach_single ( _Safe_sequence_base __seq,
bool  __constant 
)
throw (
)
inherited

Likewise, but not thread-safe.

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach_single().

Here is the caller graph for this function:

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.

References __gnu_debug::_Safe_iterator_base::_M_attach_single(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_constant().

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_Safe_iterator().

Here is the call graph for this function:

Here is the caller graph for this function:

bool __gnu_debug::_Safe_iterator_base::_M_attached_to ( const _Safe_sequence_base __seq) const
inlineinherited

Determines if we are attached to the given sequence.

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_before_dereferenceable ( ) const
inline
_GLIBCXX_PURE bool __gnu_debug::_Safe_iterator_base::_M_can_compare ( const _Safe_iterator_base __x) const
throw (
)
inherited

Can we compare this iterator to the given iterator __x? Returns true if both iterators are nonsingular and reference the same sequence.

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_constant ( ) const
inlineprivate

Determine if this is a constant iterator.

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_attach_single().

Here is the caller graph for this function:

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_decrementable ( ) const
inline

References __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_is_begin(), and __gnu_debug::_Safe_iterator_base::_M_singular().

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator--().

Here is the call graph for this function:

Here is the caller graph for this function:

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_dereferenceable ( ) const
inline
void __gnu_debug::_Safe_iterator_base::_M_detach ( )
inherited

Detach the iterator for whatever sequence it is attached to, if any.

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator=(), and __gnu_debug::_Safe_iterator_base::~_Safe_iterator_base().

Here is the caller graph for this function:

void __gnu_debug::_Safe_iterator_base::_M_detach_single ( )
throw (
)
inherited

Likewise, but not thread-safe.

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_incrementable ( ) const
inline
void __gnu_debug::_Safe_iterator_base::_M_invalidate ( )
inlineinherited

Invalidate the iterator, making it singular.

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?

References __gnu_debug::_BeforeBeginHelper< _Sequence >::_S_Is().

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_dereferenceable(), and __gnu_debug::_Error_formatter::_Parameter::_Parameter().

Here is the call graph for this function:

Here is the caller graph for this function:

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?

References __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_get_sequence(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::base().

Referenced by __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_decrementable(), and __gnu_debug::_Error_formatter::_Parameter::_Parameter().

Here is the call graph for this function:

Here is the caller graph for this function:

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?

References __gnu_debug::_BeforeBeginHelper< _Sequence >::_S_Is_Beginnest().

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_is_end ( ) const
inline
void __gnu_debug::_Safe_iterator_base::_M_reset ( )
throw (
)
inherited

Reset all member variables.

void __gnu_debug::_Safe_iterator_base::_M_unlink ( )
throw (
)
inlineinherited
template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_valid_range ( const _Safe_iterator< _Iterator, _Sequence > &  __rhs) const

Referenced by __gnu_debug::__valid_range().

Here is the caller graph for this function:

template<typename _Iterator, typename _Sequence>
const _Iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::base ( ) const
inline
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.

template<typename _Iterator, typename _Sequence>
reference __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator* ( ) const
inline

Iterator dereference.

Precondition
iterator is dereferenceable

References __gnu_debug::__msg_bad_deref, _GLIBCXX_DEBUG_VERIFY, __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_dereferenceable(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::base().

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator++ ( )
inline
template<typename _Iterator, typename _Sequence>
_Safe_iterator& __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator-- ( )
inline
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

References __gnu_debug::__msg_bad_deref, _GLIBCXX_DEBUG_VERIFY, __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::_M_dereferenceable(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::base().

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
reference __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator[] ( const difference_type __n) const
inline

Member Data Documentation

_Safe_iterator_base* __gnu_debug::_Safe_iterator_base::_M_next
inherited

Pointer to the next iterator in the sequence's list of iterators.

Only valid when _M_sequence != NULL.

Referenced by __gnu_debug::_Safe_iterator_base::_M_unlink().

_Safe_iterator_base* __gnu_debug::_Safe_iterator_base::_M_prior
inherited

Pointer to the previous iterator in the sequence's list of iterators.

Only valid when _M_sequence != NULL.

Referenced by __gnu_debug::_Safe_iterator_base::_M_unlink().

unsigned int __gnu_debug::_Safe_iterator_base::_M_version
inherited

The version number of this iterator.

The sentinel value 0 is used to indicate an invalidated iterator (i.e., one that is singular because of an operation on the container). This version number must equal the version number in the sequence referenced by _M_sequence for the iterator to be non-singular.

Referenced by __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::operator=(), and __gnu_debug::_Safe_iterator< _Iterator, _Sequence >::operator=().


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