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

Safe iterator wrapper. More...

#include <safe_local_iterator.h>

Inheritance diagram for __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >:
Collaboration diagram for __gnu_debug::_Safe_local_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_local_iterator () noexcept
 
 _Safe_local_iterator (const _Iterator &__i, const _Safe_sequence_base *__cont)
 Safe iterator construction from an unsafe iterator and its sequence. More...
 
 _Safe_local_iterator (const _Safe_local_iterator &__x) noexcept
 Copy construction. More...
 
 _Safe_local_iterator (_Safe_local_iterator &&__x) noexcept
 Move construction. More...
 
template<typename _MutableIterator >
 _Safe_local_iterator (const _Safe_local_iterator< _MutableIterator, typename __gnu_cxx::__enable_if< std::__are_same< _MutableIterator, typename _Sequence::local_iterator::iterator_type >::__value, _Sequence >::__type > &__x)
 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 container, detaching it from whatever container 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...
 
_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_dereferenceable () const
 Is the iterator dereferenceable? More...
 
void _M_detach ()
 Detach the iterator for whatever container 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_local_iterator, _Safe_local_iterator >::__value, const _Sequence *, _Sequence * >::__type _M_get_sequence () const
 
template<typename _Other >
bool _M_in_same_bucket (const _Safe_local_iterator< _Other, _Sequence > &__other) const
 Is this iterator part of the same bucket as the other one? More...
 
bool _M_incrementable () const
 Is the iterator incrementable? More...
 
void _M_invalidate ()
 Invalidate the iterator, making it singular. More...
 
bool _M_is_begin () const
 Is this iterator equal to the sequence's begin(bucket) iterator? More...
 
bool _M_is_end () const
 Is this iterator equal to the sequence's end(bucket) 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_local_iterator &__rhs) const
 
_Iterator & base () noexcept
 Return the underlying iterator. More...
 
const _Iterator & base () const noexcept
 
size_type bucket () const
 Return the bucket. More...
 
 operator _Iterator () const
 Conversion to underlying non-debug iterator to allow better interaction with non-debug containers. More...
 
reference operator* () const
 Iterator dereference. More...
 
_Safe_local_iteratoroperator++ ()
 Iterator preincrement. More...
 
_Safe_local_iterator operator++ (int)
 Iterator postincrement. More...
 
pointer operator-> () const
 Iterator dereference. More...
 
_Safe_local_iteratoroperator= (const _Safe_local_iterator &__x)
 Copy assignment. More...
 
_Safe_local_iteratoroperator= (_Safe_local_iterator &&__x) noexcept
 Move assignment. More...
 

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

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

Private Types

typedef _Sequence::const_local_iterator _Const_local_iterator
 
typedef _Iterator _Iter_base
 
typedef _Safe_local_iterator_base _Safe_base
 
typedef std::iterator_traits< _Iterator > _Traits
 
typedef _Sequence::size_type size_type
 

Private Member Functions

 _Safe_local_iterator (const _Iterator &__i, _Safe_sequence_base *__cont, _Attach_single) noexcept
 
bool _M_constant () const
 Determine if this is a constant iterator. More...
 

Detailed Description

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

Safe iterator wrapper.

The class template _Safe_local_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_local_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 _Sequence::const_local_iterator __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Const_local_iterator
private
template<typename _Iterator, typename _Sequence>
typedef _Iterator __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Iter_base
private
template<typename _Iterator, typename _Sequence>
typedef _Safe_local_iterator_base __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_base
private
template<typename _Iterator, typename _Sequence>
typedef std::iterator_traits<_Iterator> __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Traits
private
template<typename _Iterator, typename _Sequence>
typedef _Traits::difference_type __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::difference_type
template<typename _Iterator, typename _Sequence>
typedef _Traits::iterator_category __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::iterator_category
template<typename _Iterator, typename _Sequence>
typedef _Iterator __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::iterator_type
template<typename _Iterator, typename _Sequence>
typedef _Traits::pointer __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::pointer
template<typename _Iterator, typename _Sequence>
typedef _Traits::reference __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::reference
template<typename _Iterator, typename _Sequence>
typedef _Sequence::size_type __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::size_type
private
template<typename _Iterator, typename _Sequence>
typedef _Traits::value_type __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::value_type

Constructor & Destructor Documentation

template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_local_iterator ( const _Iterator &  __i,
_Safe_sequence_base __cont,
_Attach_single   
)
inlineprivatenoexcept

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

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_local_iterator ( )
inlinenoexcept
Postcondition
the iterator is singular and unattached

Referenced by __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::operator++().

Here is the caller graph for this function:

template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_local_iterator ( const _Iterator &  __i,
const _Safe_sequence_base __cont 
)
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_local_iterator< _Iterator, _Sequence >::_Safe_local_iterator ( const _Safe_local_iterator< _Iterator, _Sequence > &  __x)
inlinenoexcept
template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_local_iterator ( _Safe_local_iterator< _Iterator, _Sequence > &&  __x)
inlinenoexcept
template<typename _Iterator, typename _Sequence>
template<typename _MutableIterator >
__gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_local_iterator ( const _Safe_local_iterator< _MutableIterator, typename __gnu_cxx::__enable_if< std::__are_same< _MutableIterator, typename _Sequence::local_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_local_iterator< _Iterator, _Sequence >::_M_attach().

Here is the call graph for this function:

Member Function Documentation

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

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

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

Referenced by __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_attach(), and __gnu_debug::_Safe_local_iterator_base::_Safe_local_iterator_base().

Here is the caller graph for this function:

template<typename _Iterator, typename _Sequence>
void __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_attach ( _Safe_sequence_base __seq)
inline
void __gnu_debug::_Safe_local_iterator_base::_M_attach_single ( _Safe_sequence_base __seq,
bool  __constant 
)
throw (
)
inherited

Likewise, but not thread-safe.

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

Here is the caller graph for this function:

template<typename _Iterator, typename _Sequence>
void __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_attach_single ( _Safe_sequence_base __seq)
inline

Likewise, but not thread-safe.

References __gnu_debug::_Safe_local_iterator_base::_M_attach_single(), and __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_constant().

Referenced by __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_Safe_local_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.

_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_local_iterator< _Iterator, _Sequence >::_M_constant ( ) const
inlineprivate

Determine if this is a constant iterator.

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

Here is the caller graph for this function:

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

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

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

Here is the caller graph for this function:

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

Likewise, but not thread-safe.

_Safe_unordered_container_base* __gnu_debug::_Safe_local_iterator_base::_M_get_container ( ) const
protectednoexceptinherited
template<typename _Iterator, typename _Sequence>
__gnu_cxx::__conditional_type<std::__are_same<_Const_local_iterator, _Safe_local_iterator>::__value, const _Sequence*, _Sequence*>::__type __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_get_sequence ( ) const
inline
template<typename _Iterator, typename _Sequence>
template<typename _Other >
bool __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_in_same_bucket ( const _Safe_local_iterator< _Other, _Sequence > &  __other) const
inline

Is this iterator part of the same bucket as the other one?

References __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::bucket().

Here is the call graph for this function:

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_incrementable ( ) const
inline

Is the iterator incrementable?

References __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_is_end(), and __gnu_debug::_Safe_iterator_base::_M_singular().

Referenced by __gnu_debug::_Safe_local_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_invalidate ( )
inlineinherited

Invalidate the iterator, making it singular.

template<typename _Iterator, typename _Sequence>
bool __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::_M_is_begin ( ) const
inline

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

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

Referenced by __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_local_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_local_iterator< _Iterator, _Sequence >::_M_valid_range ( const _Safe_local_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_local_iterator< _Iterator, _Sequence >::base ( ) const
inlinenoexcept
template<typename _Iterator, typename _Sequence>
size_type __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::bucket ( ) const
inline
template<typename _Iterator, typename _Sequence>
__gnu_debug::_Safe_local_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_local_iterator< _Iterator, _Sequence >::operator* ( ) const
inline
template<typename _Iterator, typename _Sequence>
_Safe_local_iterator& __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::operator++ ( )
inline
template<typename _Iterator, typename _Sequence>
pointer __gnu_debug::_Safe_local_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_local_iterator< _Iterator, _Sequence >::_M_dereferenceable(), and __gnu_debug::_Safe_local_iterator< _Iterator, _Sequence >::base().

Here is the call graph for this function:

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: