29 #ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_H
30 #define _GLIBCXX_DEBUG_SAFE_ITERATOR_H 1
44 template <
typename _Sequence>
47 typedef typename _Sequence::const_iterator
_It;
48 typedef typename _It::iterator_type
_BaseIt;
56 {
return __it == __seq->_M_base().begin(); }
80 template<
typename _Iterator1,
typename _Iterator2>
81 inline std::pair<typename std::iterator_traits<_Iterator1>::difference_type,
84 std::random_access_iterator_tag)
85 {
return std::make_pair(__rhs - __lhs,
__dp_exact); }
87 template<
typename _Iterator1,
typename _Iterator2>
88 inline std::pair<typename std::iterator_traits<_Iterator1>::difference_type,
91 std::forward_iterator_tag)
92 {
return std::make_pair(__lhs == __rhs? 0 : 1,
__dp_equality); }
94 template<
typename _Iterator1,
typename _Iterator2>
95 inline std::pair<typename std::iterator_traits<_Iterator1>::difference_type,
99 typedef typename std::iterator_traits<_Iterator1>::iterator_category
115 template<
typename _Iterator,
typename _Sequence>
116 class _Safe_iterator :
public _Safe_iterator_base
127 typedef typename _Sequence::const_iterator const_iterator;
128 return std::__are_same<const_iterator, _Safe_iterator>::__value;
131 typedef std::iterator_traits<_Iterator>
_Traits;
156 ._M_iterator(*
this,
"this"));
168 || __x._M_current == _Iterator(),
170 ._M_iterator(*
this,
"this")
171 ._M_iterator(__x,
"other"));
174 #if __cplusplus >= 201103L
182 || __x._M_current == _Iterator(),
184 ._M_iterator(*
this,
"this")
185 ._M_iterator(__x,
"other"));
196 template<
typename _MutableIterator>
199 typename __gnu_cxx::__enable_if<(std::__are_same<_MutableIterator,
200 typename _Sequence::iterator::iterator_type>::__value),
201 _Sequence>::__type>& __x)
207 || __x.base() == _Iterator(),
209 ._M_iterator(*
this,
"this")
210 ._M_iterator(__x,
"other"));
222 || __x._M_current == _Iterator(),
224 ._M_iterator(*
this,
"this")
225 ._M_iterator(__x,
"other"));
231 #if __cplusplus >= 201103L
241 ._M_iterator(*
this,
"this"));
243 || __x._M_current == _Iterator(),
245 ._M_iterator(*
this,
"this")
246 ._M_iterator(__x,
"other"));
250 __x._M_current = _Iterator();
264 ._M_iterator(*
this,
"this"));
279 ._M_iterator(*
this,
"this"));
293 ._M_iterator(*
this,
"this"));
307 ._M_iterator(*
this,
"this"));
323 ._M_iterator(*
this,
"this"));
337 ._M_iterator(*
this,
"this"));
350 ._M_iterator(*this)._M_integer(__n));
352 return _M_current[__n];
360 ._M_iterator(*this)._M_integer(__n));
378 ._M_iterator(*this)._M_integer(__n));
449 template<
typename _Other>
456 {
return static_cast<const _Sequence*
>(
_M_sequence); }
482 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
489 ._M_iterator(__lhs,
"lhs")
490 ._M_iterator(__rhs,
"rhs"));
493 ._M_iterator(__lhs,
"lhs")
494 ._M_iterator(__rhs,
"rhs"));
495 return __lhs.base() == __rhs.base();
498 template<
typename _Iterator,
typename _Sequence>
505 ._M_iterator(__lhs,
"lhs")
506 ._M_iterator(__rhs,
"rhs"));
509 ._M_iterator(__lhs,
"lhs")
510 ._M_iterator(__rhs,
"rhs"));
511 return __lhs.base() == __rhs.base();
514 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
521 ._M_iterator(__lhs,
"lhs")
522 ._M_iterator(__rhs,
"rhs"));
525 ._M_iterator(__lhs,
"lhs")
526 ._M_iterator(__rhs,
"rhs"));
527 return __lhs.base() != __rhs.base();
530 template<
typename _Iterator,
typename _Sequence>
537 ._M_iterator(__lhs,
"lhs")
538 ._M_iterator(__rhs,
"rhs"));
541 ._M_iterator(__lhs,
"lhs")
542 ._M_iterator(__rhs,
"rhs"));
543 return __lhs.base() != __rhs.base();
546 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
548 operator<(const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
553 ._M_iterator(__lhs,
"lhs")
554 ._M_iterator(__rhs,
"rhs"));
557 ._M_iterator(__lhs,
"lhs")
558 ._M_iterator(__rhs,
"rhs"));
559 return __lhs.base() < __rhs.base();
562 template<
typename _Iterator,
typename _Sequence>
564 operator<(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
569 ._M_iterator(__lhs,
"lhs")
570 ._M_iterator(__rhs,
"rhs"));
573 ._M_iterator(__lhs,
"lhs")
574 ._M_iterator(__rhs,
"rhs"));
575 return __lhs.base() < __rhs.base();
578 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
580 operator<=(const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
585 ._M_iterator(__lhs,
"lhs")
586 ._M_iterator(__rhs,
"rhs"));
589 ._M_iterator(__lhs,
"lhs")
590 ._M_iterator(__rhs,
"rhs"));
591 return __lhs.base() <= __rhs.base();
594 template<
typename _Iterator,
typename _Sequence>
596 operator<=(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
601 ._M_iterator(__lhs,
"lhs")
602 ._M_iterator(__rhs,
"rhs"));
605 ._M_iterator(__lhs,
"lhs")
606 ._M_iterator(__rhs,
"rhs"));
607 return __lhs.base() <= __rhs.base();
610 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
617 ._M_iterator(__lhs,
"lhs")
618 ._M_iterator(__rhs,
"rhs"));
621 ._M_iterator(__lhs,
"lhs")
622 ._M_iterator(__rhs,
"rhs"));
623 return __lhs.base() > __rhs.base();
626 template<
typename _Iterator,
typename _Sequence>
633 ._M_iterator(__lhs,
"lhs")
634 ._M_iterator(__rhs,
"rhs"));
637 ._M_iterator(__lhs,
"lhs")
638 ._M_iterator(__rhs,
"rhs"));
639 return __lhs.base() > __rhs.base();
642 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
649 ._M_iterator(__lhs,
"lhs")
650 ._M_iterator(__rhs,
"rhs"));
653 ._M_iterator(__lhs,
"lhs")
654 ._M_iterator(__rhs,
"rhs"));
655 return __lhs.base() >= __rhs.base();
658 template<
typename _Iterator,
typename _Sequence>
665 ._M_iterator(__lhs,
"lhs")
666 ._M_iterator(__rhs,
"rhs"));
669 ._M_iterator(__lhs,
"lhs")
670 ._M_iterator(__rhs,
"rhs"));
671 return __lhs.base() >= __rhs.base();
678 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
679 inline typename _Safe_iterator<_IteratorL, _Sequence>::difference_type
685 ._M_iterator(__lhs,
"lhs")
686 ._M_iterator(__rhs,
"rhs"));
689 ._M_iterator(__lhs,
"lhs")
690 ._M_iterator(__rhs,
"rhs"));
691 return __lhs.base() - __rhs.base();
694 template<
typename _Iterator,
typename _Sequence>
695 inline typename _Safe_iterator<_Iterator, _Sequence>::difference_type
701 ._M_iterator(__lhs,
"lhs")
702 ._M_iterator(__rhs,
"rhs"));
705 ._M_iterator(__lhs,
"lhs")
706 ._M_iterator(__rhs,
"rhs"));
707 return __lhs.base() - __rhs.base();
710 template<
typename _Iterator,
typename _Sequence>
711 inline _Safe_iterator<_Iterator, _Sequence>
714 {
return __i + __n; }
_Traits::value_type value_type
Definition: safe_iterator.h:136
bool _M_before_dereferenceable() const
Is the iterator before a dereferenceable one?
Definition: safe_iterator.h:425
Definition: formatter.h:86
std::iterator_traits< _Iterator > _Traits
Definition: safe_iterator.h:131
Definition: formatter.h:90
bool _M_is_before_begin() const
Definition: safe_iterator.h:468
Definition: formatter.h:94
Definition: formatter.h:91
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
bool operator>=(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:644
_Traits::reference reference
Definition: safe_iterator.h:138
_Siter_base< _Iterator >::iterator_type __base(_Iterator __it)
Definition: functions.h:446
Definition: formatter.h:84
_Safe_sequence_base * _M_sequence
Definition: safe_base.h:55
Definition: safe_iterator.h:73
_Safe_iterator(const _Safe_iterator &__x)
Copy construction.
Definition: safe_iterator.h:162
Definition: formatter.h:93
Definition: formatter.h:92
pointer operator->() const
Iterator dereference.
Definition: safe_iterator.h:275
bool _M_is_beginnest() const
Definition: safe_iterator.h:475
Definition: formatter.h:85
_Safe_iterator operator--(int)
Iterator postdecrement.
Definition: safe_iterator.h:333
_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.
Definition: safe_iterator.h:197
void _M_attach(_Safe_sequence_base *__seq, bool __constant)
_Traits::difference_type difference_type
Definition: safe_iterator.h:137
_Safe_iterator & operator++()
Iterator preincrement.
Definition: safe_iterator.h:289
Definition: formatter.h:96
static bool _S_Is_Beginnest(_BaseIt __it, const _Sequence *__seq)
Definition: safe_iterator.h:55
_Safe_iterator _Self
Definition: safe_iterator.h:118
bool _M_dereferenceable() const
Is the iterator dereferenceable?
Definition: safe_iterator.h:420
_Safe_iterator & operator=(const _Safe_iterator &__x)
Copy assignment.
Definition: safe_iterator.h:217
_Iterator _M_current
The underlying iterator.
Definition: safe_iterator.h:121
Definition: formatter.h:95
bool _M_is_begin() const
Is this iterator equal to the sequence's begin() iterator?
Definition: safe_iterator.h:459
Definition: formatter.h:83
Definition: formatter.h:88
_Safe_iterator< _Iterator, _Sequence > operator+(typename _Safe_iterator< _Iterator, _Sequence >::difference_type __n, const _Safe_iterator< _Iterator, _Sequence > &__i)
Definition: safe_iterator.h:712
void _M_attach_single(_Safe_sequence_base *__seq, bool __constant)
bool operator>(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:612
bool _M_incrementable() const
Is the iterator incrementable?
Definition: safe_iterator.h:437
Definition: safe_iterator.h:45
_Safe_iterator(const _Iterator &__i, const _Sequence *__seq)
Safe iterator construction from an unsafe iterator and its sequence.
Definition: safe_iterator.h:151
reference operator*() const
Iterator dereference.
Definition: safe_iterator.h:260
_Sequence::const_iterator _It
Definition: safe_iterator.h:47
_Safe_iterator & operator-=(const difference_type &__n)
Definition: safe_iterator.h:374
reference operator[](const difference_type &__n) const
Definition: safe_iterator.h:345
_Safe_iterator< _IteratorL, _Sequence >::difference_type operator-(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:680
Definition: formatter.h:87
_Safe_iterator operator-(const difference_type &__n) const
Definition: safe_iterator.h:384
Definition: formatter.h:81
_GLIBCXX_PURE bool _M_singular() const
_Safe_iterator operator+(const difference_type &__n) const
Definition: safe_iterator.h:366
_Safe_iterator operator++(int)
Iterator postincrement.
Definition: safe_iterator.h:303
Basic functionality for a safe iterator.
Definition: safe_base.h:50
Base class that supports tracking of iterators that reference a sequence.
Definition: safe_base.h:177
void _M_attach(_Safe_sequence_base *__seq)
Definition: safe_iterator.h:406
void _M_attach_single(_Safe_sequence_base *__seq)
Definition: safe_iterator.h:413
bool operator==(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:484
static bool _S_Is(_BaseIt, const _Sequence *)
Definition: safe_iterator.h:51
#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
_Traits::pointer pointer
Definition: safe_iterator.h:139
bool _M_valid_range(const _Safe_iterator< _Other, _Sequence > &__rhs) const
Definition: safe_iterator.tcc:70
bool __check_singular_aux(const void *)
Definition: functions.h:45
const _Sequence * _M_get_sequence() const
Definition: safe_iterator.h:455
bool _M_decrementable() const
Definition: safe_iterator.h:442
Safe iterator wrapper.
Definition: formatter.h:46
bool _M_is_end() const
Is this iterator equal to the sequence's end() iterator?
Definition: safe_iterator.h:463
bool _M_can_advance(const difference_type &__n) const
Definition: safe_iterator.tcc:37
_Safe_iterator & operator--()
Iterator predecrement.
Definition: safe_iterator.h:319
_Distance_precision
Definition: safe_iterator.h:70
_Safe_iterator()
Definition: safe_iterator.h:142
Definition: formatter.h:82
_It::iterator_type _BaseIt
Definition: safe_iterator.h:48
Definition: safe_iterator.h:74
_Iterator iterator_type
Definition: safe_iterator.h:134
void swap(exception_ptr &__lhs, exception_ptr &__rhs)
Definition: exception_ptr.h:160
Definition: formatter.h:89
bool operator!=(const _Safe_iterator< _IteratorL, _Sequence > &__lhs, const _Safe_iterator< _IteratorR, _Sequence > &__rhs)
Definition: safe_iterator.h:516
Definition: safe_iterator.h:72
_Traits::iterator_category iterator_category
Definition: safe_iterator.h:135
_Safe_iterator & operator+=(const difference_type &__n)
Definition: safe_iterator.h:356
Definition: formatter.h:113
_Iterator base() const
Return the underlying iterator.
Definition: safe_iterator.h:396