29 #ifndef _GLIBCXX_DEBUG_SAFE_LOCAL_ITERATOR_H    30 #define _GLIBCXX_DEBUG_SAFE_LOCAL_ITERATOR_H 1    47   template<
typename _Iterator, 
typename _Sequence>
    48     class _Safe_local_iterator
    50     , 
public _Safe_local_iterator_base
    52       typedef _Iterator _Iter_base;
    54       typedef typename _Sequence::const_local_iterator _Const_local_iterator;
    55       typedef typename _Sequence::size_type size_type;
    61         return std::__are_same<_Const_local_iterator,
    65       typedef std::iterator_traits<_Iterator> _Traits;
    71                            _Attach_single) noexcept
    76       typedef _Iterator                                 iterator_type;
    77       typedef typename _Traits::iterator_category       iterator_category;
    78       typedef typename _Traits::value_type              value_type;
    79       typedef typename _Traits::difference_type         difference_type;
    80       typedef typename _Traits::reference               reference;
    81       typedef typename _Traits::pointer                 pointer;
    95       : _Iter_base(__i), _Safe_base(__cont, _M_constant())
    98                               _M_message(__msg_init_singular)
    99                               ._M_iterator(*
this, 
"this"));
   106       : _Iter_base(__x.base())
   110         _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
   111                               || __x.base() == _Iterator(),
   112                               _M_message(__msg_init_copy_singular)
   113                               ._M_iterator(*
this, 
"this")
   114                               ._M_iterator(__x, 
"other"));
   125         _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
   126                               || __x.base() == _Iterator(),
   127                               _M_message(__msg_init_copy_singular)
   128                               ._M_iterator(*
this, 
"this")
   129                               ._M_iterator(__x, 
"other"));
   130         auto __cont = __x._M_sequence;
   132         std::swap(
base(), __x.base());
   140       template<
typename _MutableIterator>
   143           typename __gnu_cxx::__enable_if<std::__are_same<
   145               typename _Sequence::local_iterator::iterator_type>::__value,
   146                                           _Sequence>::__type>& __x)
   147         : _Iter_base(__x.
base())
   151           _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
   152                                 || __x.base() == _Iterator(),
   153                                 _M_message(__msg_init_const_singular)
   154                                 ._M_iterator(*
this, 
"this")
   155                                 ._M_iterator(__x, 
"other"));
   167         _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
   168                               || __x.base() == _Iterator(),
   169                               _M_message(__msg_copy_singular)
   170                               ._M_iterator(*
this, 
"this")
   171                               ._M_iterator(__x, 
"other"));
   196         _GLIBCXX_DEBUG_VERIFY(
this != &__x,
   197                               _M_message(__msg_self_move_assign)
   198                               ._M_iterator(*
this, 
"this"));
   199         _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
   200                               || __x.base() == _Iterator(),
   201                               _M_message(__msg_copy_singular)
   202                               ._M_iterator(*
this, 
"this")
   203                               ._M_iterator(__x, 
"other"));
   219         __x.base() = _Iterator();
   231                               _M_message(__msg_bad_deref)
   232                               ._M_iterator(*
this, 
"this"));
   245                               _M_message(__msg_bad_deref)
   246                               ._M_iterator(*
this, 
"this"));
   259                               _M_message(__msg_bad_inc)
   260                               ._M_iterator(*
this, 
"this"));
   274                               _M_message(__msg_bad_inc)
   275                               ._M_iterator(*
this, 
"this"));
   286       base() noexcept { 
return *
this; }
   289       base() 
const noexcept { 
return *
this; }
   301       operator _Iterator()
 const { 
return *
this; }
   331       __gnu_cxx::__conditional_type<std::__are_same<_Const_local_iterator,
   335       _M_get_sequence()
 const   340       { 
return base() == _M_get_sequence()->_M_base().begin(
bucket()); }
   344       { 
return base() == _M_get_sequence()->_M_base().end(
bucket()); }
   347       template<
typename _Other>
   350                                                      _Sequence>& __other)
 const   351         { 
return bucket() == __other.bucket(); }
   354   template<
typename _IteratorL, 
typename _IteratorR, 
typename _Sequence>
   359       _GLIBCXX_DEBUG_VERIFY(!__lhs._M_singular() && !__rhs._M_singular(),
   360                             _M_message(__msg_iter_compare_bad)
   361                             ._M_iterator(__lhs, 
"lhs")
   362                             ._M_iterator(__rhs, 
"rhs"));
   363       _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
   364                             _M_message(__msg_compare_different)
   365                             ._M_iterator(__lhs, 
"lhs")
   366                             ._M_iterator(__rhs, 
"rhs"));
   367       _GLIBCXX_DEBUG_VERIFY(__lhs._M_in_same_bucket(__rhs),
   368                             _M_message(__msg_local_iter_compare_bad)
   369                             ._M_iterator(__lhs, 
"lhs")
   370                             ._M_iterator(__rhs, 
"rhs"));
   371       return __lhs.base() == __rhs.base();
   374   template<
typename _Iterator, 
typename _Sequence>
   379       _GLIBCXX_DEBUG_VERIFY(!__lhs._M_singular() && !__rhs._M_singular(),
   380                             _M_message(__msg_iter_compare_bad)
   381                             ._M_iterator(__lhs, 
"lhs")
   382                             ._M_iterator(__rhs, 
"rhs"));
   383       _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
   384                             _M_message(__msg_compare_different)
   385                             ._M_iterator(__lhs, 
"lhs")
   386                             ._M_iterator(__rhs, 
"rhs"));
   387       _GLIBCXX_DEBUG_VERIFY(__lhs._M_in_same_bucket(__rhs),
   388                             _M_message(__msg_local_iter_compare_bad)
   389                             ._M_iterator(__lhs, 
"lhs")
   390                             ._M_iterator(__rhs, 
"rhs"));
   391       return __lhs.base() == __rhs.base();
   394   template<
typename _IteratorL, 
typename _IteratorR, 
typename _Sequence>
   399       _GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs._M_singular(),
   400                             _M_message(__msg_iter_compare_bad)
   401                             ._M_iterator(__lhs, 
"lhs")
   402                             ._M_iterator(__rhs, 
"rhs"));
   403       _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
   404                             _M_message(__msg_compare_different)
   405                             ._M_iterator(__lhs, 
"lhs")
   406                             ._M_iterator(__rhs, 
"rhs"));
   407       _GLIBCXX_DEBUG_VERIFY(__lhs._M_in_same_bucket(__rhs),
   408                             _M_message(__msg_local_iter_compare_bad)
   409                             ._M_iterator(__lhs, 
"lhs")
   410                             ._M_iterator(__rhs, 
"rhs"));
   411       return __lhs.base() != __rhs.base();
   414   template<
typename _Iterator, 
typename _Sequence>
   419       _GLIBCXX_DEBUG_VERIFY(!__lhs._M_singular() && !__rhs._M_singular(),
   420                             _M_message(__msg_iter_compare_bad)
   421                             ._M_iterator(__lhs, 
"lhs")
   422                             ._M_iterator(__rhs, 
"rhs"));
   423       _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
   424                             _M_message(__msg_compare_different)
   425                             ._M_iterator(__lhs, 
"lhs")
   426                             ._M_iterator(__rhs, 
"rhs"));
   427       _GLIBCXX_DEBUG_VERIFY(__lhs._M_in_same_bucket(__rhs),
   428                             _M_message(__msg_local_iter_compare_bad)
   429                             ._M_iterator(__lhs, 
"lhs")
   430                             ._M_iterator(__rhs, 
"rhs"));
   431       return __lhs.base() != __rhs.base();
   435   template<
typename _Iterator, 
typename _Sequence>
   439     { 
return __x._M_dereferenceable(); }
   442   template<
typename _Iterator, 
typename _Sequence>
   447     { 
return __first._M_valid_range(__last, __dist_info); }
   451   template<
typename _Iterator, 
typename _Sequence>
   458       if (__first.base() == __last.base())
   459         return { 0, __dp_exact };
   461       if (__first._M_is_begin())
   463           if (__last._M_is_end())
   466                 __first._M_get_sequence()->bucket_size(__first.bucket()),
   470           return { 1, __dp_sign };
   473       if (__first._M_is_end())
   475           if (__last._M_is_begin())
   478                 -__first._M_get_sequence()->bucket_size(__first.bucket()),
   482           return { -1, __dp_sign };
   485       if (__last._M_is_begin())
   486         return { -1, __dp_sign };
   488       if (__last._M_is_end())
   489         return { 1, __dp_sign };
   491       return { 1, __dp_equality };
   494 #if __cplusplus < 201103L   495   template<
typename _Iterator, 
typename _Sequence>
   496     struct _Unsafe_type<_Safe_local_iterator<_Iterator, _Sequence> >
   497     { 
typedef _Iterator _Type; };
   500   template<
typename _Iterator, 
typename _Sequence>
   503     { 
return __it.base(); }
 _Safe_local_iterator & operator=(_Safe_local_iterator &&__x) noexcept
Move assignment. 
bool _M_incrementable() const 
Is the iterator incrementable? 
GNU debug classes for public use. 
bool _M_dereferenceable() const 
Is the iterator dereferenceable? 
_Safe_local_iterator operator++(int)
Iterator postincrement. 
_Safe_local_iterator & operator++()
Iterator preincrement. 
Base class that supports tracking of iterators that reference a sequence. 
bool _M_is_begin() const 
Is this iterator equal to the sequence's begin(bucket) iterator? 
reference operator*() const 
Iterator dereference. 
bool _M_is_end() const 
Is this iterator equal to the sequence's end(bucket) iterator? 
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof. 
bool __valid_range(const _InputIterator &__first, const _InputIterator &__last, typename _Distance_traits< _InputIterator >::__type &__dist)
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? 
_Safe_local_iterator(_Safe_local_iterator &&__x) noexcept
Move construction. 
_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. 
_Safe_local_iterator(const _Safe_local_iterator &__x) noexcept
Copy construction. 
__gnu_cxx::__mutex & _M_get_mutex()
void _M_attach_single(_Safe_sequence_base *__seq, bool __constant)
Struct holding two objects of arbitrary type. 
_Safe_local_iterator(const _Iterator &__i, const _Safe_sequence_base *__cont)
Safe iterator construction from an unsafe iterator and its sequence. 
size_type bucket() const 
Return the bucket. 
_Distance_traits< _Iterator >::__type __get_distance(const _Iterator &__lhs, const _Iterator &__rhs, std::random_access_iterator_tag)
pointer operator->() const 
Iterator dereference. 
bool __check_dereferenceable(const _Iterator &)
_Safe_local_iterator_base()
_Safe_local_iterator() noexcept
void _M_attach(_Safe_sequence_base *__seq, bool __constant)
_Iterator & base() noexcept
Return the underlying iterator. 
_Safe_sequence_base * _M_sequence
void _M_attach(_Safe_sequence_base *__seq)
_Safe_local_iterator & operator=(const _Safe_local_iterator &__x)
Copy assignment. 
void _M_attach_single(_Safe_sequence_base *__seq)