29 #ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_H 30 #define _GLIBCXX_DEBUG_SAFE_ITERATOR_H 1 44 template <
typename _Sequence>
47 template<
typename _Iterator>
52 template<
typename _Iterator>
55 {
return __it.
base() == __it._M_get_sequence()->_M_base().begin(); }
78 template<
typename _Iterator>
85 template<
typename _Iterator>
92 template<
typename _Iterator>
97 typedef typename std::iterator_traits<_Iterator>::iterator_category
118 template<
typename _Iterator,
typename _Sequence>
123 typedef _Iterator _Iter_base;
125 typedef typename _Sequence::const_iterator _Const_iterator;
130 {
return std::__are_same<_Const_iterator, _Safe_iterator>::__value; }
132 typedef std::iterator_traits<_Iterator> _Traits;
134 struct _Attach_single
141 { _M_attach_single(__seq); }
144 typedef _Iterator iterator_type;
145 typedef typename _Traits::iterator_category iterator_category;
146 typedef typename _Traits::value_type value_type;
147 typedef typename _Traits::difference_type difference_type;
148 typedef typename _Traits::reference reference;
149 typedef typename _Traits::pointer pointer;
163 : _Iter_base(__i), _Safe_base(__seq, _M_constant())
165 _GLIBCXX_DEBUG_VERIFY(!this->_M_singular(),
166 _M_message(__msg_init_singular)
167 ._M_iterator(*
this,
"this"));
174 : _Iter_base(__x.base())
178 _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
179 || __x.base() == _Iterator(),
180 _M_message(__msg_init_copy_singular)
181 ._M_iterator(*
this,
"this")
182 ._M_iterator(__x,
"other"));
183 _M_attach(__x._M_sequence);
186 #if __cplusplus >= 201103L 194 _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
195 || __x.base() == _Iterator(),
196 _M_message(__msg_init_copy_singular)
197 ._M_iterator(*
this,
"this")
198 ._M_iterator(__x,
"other"));
201 std::swap(base(), __x.base());
210 template<
typename _MutableIterator>
213 typename __gnu_cxx::__enable_if<(std::__are_same<_MutableIterator,
214 typename _Sequence::iterator::iterator_type>::__value),
215 _Sequence>::__type>& __x) _GLIBCXX_NOEXCEPT
216 : _Iter_base(__x.base())
220 _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
221 || __x.base() == _Iterator(),
222 _M_message(__msg_init_const_singular)
223 ._M_iterator(*
this,
"this")
224 ._M_iterator(__x,
"other"));
225 _M_attach(__x._M_sequence);
236 _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
237 || __x.base() == _Iterator(),
238 _M_message(__msg_copy_singular)
239 ._M_iterator(*
this,
"this")
240 ._M_iterator(__x,
"other"));
242 if (this->_M_sequence && this->_M_sequence == __x._M_sequence)
246 _M_version = __x._M_sequence->_M_version;
252 _M_attach(__x._M_sequence);
258 #if __cplusplus >= 201103L 266 _GLIBCXX_DEBUG_VERIFY(
this != &__x,
267 _M_message(__msg_self_move_assign)
268 ._M_iterator(*
this,
"this"));
269 _GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
270 || __x.base() == _Iterator(),
271 _M_message(__msg_copy_singular)
272 ._M_iterator(*
this,
"this")
273 ._M_iterator(__x,
"other"));
275 if (this->_M_sequence && this->_M_sequence == __x._M_sequence)
279 _M_version = __x._M_sequence->_M_version;
285 _M_attach(__x._M_sequence);
289 __x.base() = _Iterator();
301 _GLIBCXX_DEBUG_VERIFY(this->_M_dereferenceable(),
302 _M_message(__msg_bad_deref)
303 ._M_iterator(*
this,
"this"));
315 _GLIBCXX_DEBUG_VERIFY(this->_M_dereferenceable(),
316 _M_message(__msg_bad_deref)
317 ._M_iterator(*
this,
"this"));
329 _GLIBCXX_DEBUG_VERIFY(this->_M_incrementable(),
330 _M_message(__msg_bad_inc)
331 ._M_iterator(*
this,
"this"));
344 _GLIBCXX_DEBUG_VERIFY(this->_M_incrementable(),
345 _M_message(__msg_bad_inc)
346 ._M_iterator(*
this,
"this"));
348 return _Safe_iterator(base()++, this->_M_sequence, _Attach_single());
359 _GLIBCXX_DEBUG_VERIFY(this->_M_decrementable(),
360 _M_message(__msg_bad_dec)
361 ._M_iterator(*
this,
"this"));
374 _GLIBCXX_DEBUG_VERIFY(this->_M_decrementable(),
375 _M_message(__msg_bad_dec)
376 ._M_iterator(*
this,
"this"));
378 return _Safe_iterator(base()--, this->_M_sequence, _Attach_single());
383 operator[](
const difference_type& __n)
const _GLIBCXX_NOEXCEPT
385 _GLIBCXX_DEBUG_VERIFY(this->_M_can_advance(__n)
386 && this->_M_can_advance(__n+1),
387 _M_message(__msg_iter_subscript_oob)
388 ._M_iterator(*this)._M_integer(__n));
393 operator+=(
const difference_type& __n) _GLIBCXX_NOEXCEPT
395 _GLIBCXX_DEBUG_VERIFY(this->_M_can_advance(__n),
396 _M_message(__msg_advance_oob)
397 ._M_iterator(*this)._M_integer(__n));
404 operator+(
const difference_type& __n)
const _GLIBCXX_NOEXCEPT
406 _GLIBCXX_DEBUG_VERIFY(this->_M_can_advance(__n),
407 _M_message(__msg_advance_oob)
408 ._M_iterator(*this)._M_integer(__n));
413 operator-=(
const difference_type& __n) _GLIBCXX_NOEXCEPT
415 _GLIBCXX_DEBUG_VERIFY(this->_M_can_advance(-__n),
416 _M_message(__msg_retreat_oob)
417 ._M_iterator(*this)._M_integer(__n));
424 operator-(
const difference_type& __n)
const _GLIBCXX_NOEXCEPT
426 _GLIBCXX_DEBUG_VERIFY(this->_M_can_advance(-__n),
427 _M_message(__msg_retreat_oob)
428 ._M_iterator(*this)._M_integer(__n));
437 base() _GLIBCXX_NOEXCEPT {
return *
this; }
440 base()
const _GLIBCXX_NOEXCEPT {
return *
this; }
446 operator _Iterator() const _GLIBCXX_NOEXCEPT {
return *
this; }
451 { _Safe_base::_M_attach(__seq, _M_constant()); }
456 { _Safe_base::_M_attach_single(__seq, _M_constant()); }
461 {
return !this->_M_singular() && !_M_is_end() && !_M_is_before_begin(); }
467 if (this->_M_incrementable())
469 _Iterator
__base = base();
470 return ++__base != _M_get_sequence()->_M_base().end();
478 {
return !this->_M_singular() && !_M_is_end(); }
482 _M_decrementable()
const {
return !_M_singular() && !_M_is_begin(); }
486 _M_can_advance(
const difference_type& __n)
const;
494 __gnu_cxx::__conditional_type<std::__are_same<_Const_iterator,
498 _M_get_sequence()
const 499 {
return static_cast<_Sequence*
>(_M_sequence); }
504 {
return base() == _M_get_sequence()->_M_base().begin(); }
509 {
return base() == _M_get_sequence()->_M_base().end(); }
524 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
531 _M_message(__msg_iter_compare_bad)
532 ._M_iterator(__lhs,
"lhs")
533 ._M_iterator(__rhs,
"rhs"));
535 _M_message(__msg_compare_different)
536 ._M_iterator(__lhs,
"lhs")
537 ._M_iterator(__rhs,
"rhs"));
538 return __lhs.
base() == __rhs.
base();
541 template<
typename _Iterator,
typename _Sequence>
548 _M_message(__msg_iter_compare_bad)
549 ._M_iterator(__lhs,
"lhs")
550 ._M_iterator(__rhs,
"rhs"));
552 _M_message(__msg_compare_different)
553 ._M_iterator(__lhs,
"lhs")
554 ._M_iterator(__rhs,
"rhs"));
555 return __lhs.
base() == __rhs.
base();
558 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
565 _M_message(__msg_iter_compare_bad)
566 ._M_iterator(__lhs,
"lhs")
567 ._M_iterator(__rhs,
"rhs"));
569 _M_message(__msg_compare_different)
570 ._M_iterator(__lhs,
"lhs")
571 ._M_iterator(__rhs,
"rhs"));
572 return __lhs.
base() != __rhs.
base();
575 template<
typename _Iterator,
typename _Sequence>
582 _M_message(__msg_iter_compare_bad)
583 ._M_iterator(__lhs,
"lhs")
584 ._M_iterator(__rhs,
"rhs"));
586 _M_message(__msg_compare_different)
587 ._M_iterator(__lhs,
"lhs")
588 ._M_iterator(__rhs,
"rhs"));
589 return __lhs.
base() != __rhs.
base();
592 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
594 operator<(const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
598 _GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs.
_M_singular(),
599 _M_message(__msg_iter_order_bad)
600 ._M_iterator(__lhs,
"lhs")
601 ._M_iterator(__rhs,
"rhs"));
602 _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
603 _M_message(__msg_order_different)
604 ._M_iterator(__lhs,
"lhs")
605 ._M_iterator(__rhs,
"rhs"));
606 return __lhs.base() < __rhs.
base();
609 template<
typename _Iterator,
typename _Sequence>
611 operator<(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
615 _GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs.
_M_singular(),
616 _M_message(__msg_iter_order_bad)
617 ._M_iterator(__lhs,
"lhs")
618 ._M_iterator(__rhs,
"rhs"));
619 _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
620 _M_message(__msg_order_different)
621 ._M_iterator(__lhs,
"lhs")
622 ._M_iterator(__rhs,
"rhs"));
623 return __lhs.base() < __rhs.
base();
626 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
628 operator<=(const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
632 _GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs.
_M_singular(),
633 _M_message(__msg_iter_order_bad)
634 ._M_iterator(__lhs,
"lhs")
635 ._M_iterator(__rhs,
"rhs"));
636 _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
637 _M_message(__msg_order_different)
638 ._M_iterator(__lhs,
"lhs")
639 ._M_iterator(__rhs,
"rhs"));
640 return __lhs.base() <= __rhs.
base();
643 template<
typename _Iterator,
typename _Sequence>
645 operator<=(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
649 _GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs.
_M_singular(),
650 _M_message(__msg_iter_order_bad)
651 ._M_iterator(__lhs,
"lhs")
652 ._M_iterator(__rhs,
"rhs"));
653 _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
654 _M_message(__msg_order_different)
655 ._M_iterator(__lhs,
"lhs")
656 ._M_iterator(__rhs,
"rhs"));
657 return __lhs.base() <= __rhs.
base();
660 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
667 _M_message(__msg_iter_order_bad)
668 ._M_iterator(__lhs,
"lhs")
669 ._M_iterator(__rhs,
"rhs"));
671 _M_message(__msg_order_different)
672 ._M_iterator(__lhs,
"lhs")
673 ._M_iterator(__rhs,
"rhs"));
677 template<
typename _Iterator,
typename _Sequence>
684 _M_message(__msg_iter_order_bad)
685 ._M_iterator(__lhs,
"lhs")
686 ._M_iterator(__rhs,
"rhs"));
688 _M_message(__msg_order_different)
689 ._M_iterator(__lhs,
"lhs")
690 ._M_iterator(__rhs,
"rhs"));
694 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
701 _M_message(__msg_iter_order_bad)
702 ._M_iterator(__lhs,
"lhs")
703 ._M_iterator(__rhs,
"rhs"));
705 _M_message(__msg_order_different)
706 ._M_iterator(__lhs,
"lhs")
707 ._M_iterator(__rhs,
"rhs"));
708 return __lhs.
base() >= __rhs.
base();
711 template<
typename _Iterator,
typename _Sequence>
718 _M_message(__msg_iter_order_bad)
719 ._M_iterator(__lhs,
"lhs")
720 ._M_iterator(__rhs,
"rhs"));
722 _M_message(__msg_order_different)
723 ._M_iterator(__lhs,
"lhs")
724 ._M_iterator(__rhs,
"rhs"));
725 return __lhs.
base() >= __rhs.
base();
732 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
733 inline typename _Safe_iterator<_IteratorL, _Sequence>::difference_type
739 _M_message(__msg_distance_bad)
740 ._M_iterator(__lhs,
"lhs")
741 ._M_iterator(__rhs,
"rhs"));
743 _M_message(__msg_distance_different)
744 ._M_iterator(__lhs,
"lhs")
745 ._M_iterator(__rhs,
"rhs"));
749 template<
typename _Iterator,
typename _Sequence>
750 inline typename _Safe_iterator<_Iterator, _Sequence>::difference_type
756 _M_message(__msg_distance_bad)
757 ._M_iterator(__lhs,
"lhs")
758 ._M_iterator(__rhs,
"rhs"));
760 _M_message(__msg_distance_different)
761 ._M_iterator(__lhs,
"lhs")
762 ._M_iterator(__rhs,
"rhs"));
766 template<
typename _Iterator,
typename _Sequence>
768 operator+(
typename _Safe_iterator<_Iterator,_Sequence>::difference_type __n,
770 {
return __i + __n; }
_Safe_iterator(const _Safe_iterator &__x) noexcept
Copy construction.
_Safe_iterator(_Safe_iterator &&__x) noexcept
Move construction.
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.
void _M_attach_single(_Safe_sequence_base *__seq)
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
_Safe_iterator & operator=(const _Safe_iterator &__x) noexcept
Copy assignment.
bool _M_dereferenceable() const
Is the iterator dereferenceable?
bool _M_can_compare(const _Safe_iterator_base &__x) const
_Safe_iterator operator++(int) noexcept
Iterator postincrement.
_Iterator & base() noexcept
Return the underlying iterator.
void _M_attach(_Safe_sequence_base *__seq)
reference operator*() const noexcept
Iterator dereference.
bool _M_is_begin() const
Is this iterator equal to the sequence's begin() iterator?
_Safe_iterator operator--(int) noexcept
Iterator postdecrement.
Basic functionality for a safe iterator.
_Safe_iterator() noexcept
bool _M_incrementable() const
Is the iterator incrementable?
Base class that supports tracking of iterators that reference a sequence.
GNU debug classes for public use.
Random-access iterators support a superset of bidirectional iterator operations.
std::pair< typename std::iterator_traits< _Iterator >::difference_type, _Distance_precision > __get_distance(const _Iterator &__lhs, const _Iterator &__rhs, std::random_access_iterator_tag)
_Safe_iterator & operator=(_Safe_iterator &&__x) noexcept
Move assignment.
_Safe_iterator(const _Iterator &__i, const _Safe_sequence_base *__seq) noexcept
Safe iterator construction from an unsafe iterator and its sequence.
bool _M_is_before_begin() const
Is this iterator equal to the sequence's before_begin() iterator if any?
bool _M_before_dereferenceable() const
Is the iterator before a dereferenceable one?
_Siter_base< _Iterator >::iterator_type __base(_Iterator __it)
_Safe_iterator(const _Safe_iterator< _MutableIterator, typename __gnu_cxx::__enable_if<(std::__are_same< _MutableIterator, typename _Sequence::iterator::iterator_type >::__value), _Sequence >::__type > &__x) noexcept
Converting constructor from a mutable iterator to a constant iterator.
_Safe_iterator & operator--() noexcept
Iterator predecrement.
Struct holding two objects of arbitrary type.
bool _M_is_end() const
Is this iterator equal to the sequence's end() iterator?
bool _M_is_beginnest() const
Is this iterator equal to the sequence's before_begin() iterator if any or begin() otherwise...
Forward iterators support a superset of input iterator operations.
_Safe_iterator & operator++() noexcept
Iterator preincrement.
pointer operator->() const noexcept
Iterator dereference.
void _M_detach(_Safe_iterator_base *__it)