30 #ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_H
31 #define _GLIBCXX_DEBUG_SAFE_ITERATOR_H 1
62 template<
typename _Iterator,
typename _Sequence>
63 class _Safe_iterator :
public _Safe_iterator_base
70 enum _Distance_precision
84 typedef typename _Sequence::const_iterator const_iterator;
85 return __is_same<const_iterator, _Safe_iterator>::value;
91 typedef _Iterator _Base_iterator;
92 typedef typename _Traits::iterator_category iterator_category;
93 typedef typename _Traits::value_type value_type;
94 typedef typename _Traits::difference_type difference_type;
95 typedef typename _Traits::reference reference;
96 typedef typename _Traits::pointer pointer;
112 _M_message(__msg_init_singular)
113 ._M_iterator(*
this,
"this"));
124 _M_message(__msg_init_copy_singular)
125 ._M_iterator(*
this,
"this")
126 ._M_iterator(__x,
"other"));
135 template<
typename _MutableIterator>
138 typename __gnu_cxx::__enable_if<(std::__are_same<_MutableIterator,
139 typename _Sequence::iterator::_Base_iterator>::__value),
140 _Sequence>::__type>& __x)
144 _M_message(__msg_init_const_singular)
145 ._M_iterator(*
this,
"this")
146 ._M_iterator(__x,
"other"));
157 _M_message(__msg_copy_singular)
158 ._M_iterator(*
this,
"this")
159 ._M_iterator(__x,
"other"));
160 _M_current = __x._M_current;
161 this->
_M_attach(static_cast<_Sequence*>(__x._M_sequence));
174 _M_message(__msg_bad_deref)
175 ._M_iterator(*
this,
"this"));
189 _M_message(__msg_bad_deref)
190 ._M_iterator(*
this,
"this"));
203 _M_message(__msg_bad_inc)
204 ._M_iterator(*
this,
"this"));
217 _M_message(__msg_bad_inc)
218 ._M_iterator(*
this,
"this"));
233 _M_message(__msg_bad_dec)
234 ._M_iterator(*
this,
"this"));
247 _M_message(__msg_bad_dec)
248 ._M_iterator(*
this,
"this"));
256 operator[](
const difference_type& __n)
const
259 && this->_M_can_advance(__n+1),
260 _M_message(__msg_iter_subscript_oob)
261 ._M_iterator(*this)._M_integer(__n));
263 return _M_current[__n];
267 operator+=(
const difference_type& __n)
270 _M_message(__msg_advance_oob)
271 ._M_iterator(*this)._M_integer(__n));
277 operator+(
const difference_type& __n)
const
285 operator-=(
const difference_type& __n)
288 _M_message(__msg_retreat_oob)
289 ._M_iterator(*this)._M_integer(__n));
295 operator-(
const difference_type& __n)
const
307 base()
const {
return _M_current; }
313 operator _Iterator()
const {
return _M_current; }
354 _M_can_advance(
const difference_type& __n)
const;
357 template<
typename _Other>
359 _M_valid_range(
const _Safe_iterator<_Other, _Sequence>& __rhs)
const;
363 _M_get_sequence()
const
364 {
return static_cast<const _Sequence*
>(
_M_sequence); }
369 template<
typename _Iterator1,
typename _Iterator2>
373 typedef typename std::iterator_traits<_Iterator1>::iterator_category
378 template<
typename _Iterator1,
typename _Iterator2>
383 return std::make_pair(__rhs.base() - __lhs.base(), __dp_exact);
386 template<
typename _Iterator1,
typename _Iterator2>
391 return std::make_pair(__lhs.base() == __rhs.base()? 0 : 1,
397 {
return *
this ==
static_cast<const _Sequence*
>(
_M_sequence)->begin(); }
401 {
return *
this ==
static_cast<const _Sequence*
>(
_M_sequence)->end(); }
404 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
406 operator==(
const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
407 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
410 _M_message(__msg_iter_compare_bad)
411 ._M_iterator(__lhs,
"lhs")
412 ._M_iterator(__rhs,
"rhs"));
414 _M_message(__msg_compare_different)
415 ._M_iterator(__lhs,
"lhs")
416 ._M_iterator(__rhs,
"rhs"));
417 return __lhs.base() == __rhs.base();
420 template<
typename _Iterator,
typename _Sequence>
422 operator==(
const _Safe_iterator<_Iterator, _Sequence>& __lhs,
423 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
426 _M_message(__msg_iter_compare_bad)
427 ._M_iterator(__lhs,
"lhs")
428 ._M_iterator(__rhs,
"rhs"));
430 _M_message(__msg_compare_different)
431 ._M_iterator(__lhs,
"lhs")
432 ._M_iterator(__rhs,
"rhs"));
433 return __lhs.base() == __rhs.base();
436 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
438 operator!=(
const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
439 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
442 _M_message(__msg_iter_compare_bad)
443 ._M_iterator(__lhs,
"lhs")
444 ._M_iterator(__rhs,
"rhs"));
446 _M_message(__msg_compare_different)
447 ._M_iterator(__lhs,
"lhs")
448 ._M_iterator(__rhs,
"rhs"));
449 return __lhs.base() != __rhs.base();
452 template<
typename _Iterator,
typename _Sequence>
454 operator!=(
const _Safe_iterator<_Iterator, _Sequence>& __lhs,
455 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
458 _M_message(__msg_iter_compare_bad)
459 ._M_iterator(__lhs,
"lhs")
460 ._M_iterator(__rhs,
"rhs"));
462 _M_message(__msg_compare_different)
463 ._M_iterator(__lhs,
"lhs")
464 ._M_iterator(__rhs,
"rhs"));
465 return __lhs.base() != __rhs.base();
468 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
470 operator<(const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
471 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
474 _M_message(__msg_iter_order_bad)
475 ._M_iterator(__lhs,
"lhs")
476 ._M_iterator(__rhs,
"rhs"));
478 _M_message(__msg_order_different)
479 ._M_iterator(__lhs,
"lhs")
480 ._M_iterator(__rhs,
"rhs"));
481 return __lhs.base() < __rhs.base();
484 template<
typename _Iterator,
typename _Sequence>
486 operator<(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
487 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
490 _M_message(__msg_iter_order_bad)
491 ._M_iterator(__lhs,
"lhs")
492 ._M_iterator(__rhs,
"rhs"));
494 _M_message(__msg_order_different)
495 ._M_iterator(__lhs,
"lhs")
496 ._M_iterator(__rhs,
"rhs"));
497 return __lhs.base() < __rhs.base();
500 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
502 operator<=(const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
503 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
506 _M_message(__msg_iter_order_bad)
507 ._M_iterator(__lhs,
"lhs")
508 ._M_iterator(__rhs,
"rhs"));
510 _M_message(__msg_order_different)
511 ._M_iterator(__lhs,
"lhs")
512 ._M_iterator(__rhs,
"rhs"));
513 return __lhs.base() <= __rhs.base();
516 template<
typename _Iterator,
typename _Sequence>
518 operator<=(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
519 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
522 _M_message(__msg_iter_order_bad)
523 ._M_iterator(__lhs,
"lhs")
524 ._M_iterator(__rhs,
"rhs"));
526 _M_message(__msg_order_different)
527 ._M_iterator(__lhs,
"lhs")
528 ._M_iterator(__rhs,
"rhs"));
529 return __lhs.base() <= __rhs.base();
532 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
534 operator>(
const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
535 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
538 _M_message(__msg_iter_order_bad)
539 ._M_iterator(__lhs,
"lhs")
540 ._M_iterator(__rhs,
"rhs"));
542 _M_message(__msg_order_different)
543 ._M_iterator(__lhs,
"lhs")
544 ._M_iterator(__rhs,
"rhs"));
545 return __lhs.base() > __rhs.base();
548 template<
typename _Iterator,
typename _Sequence>
550 operator>(
const _Safe_iterator<_Iterator, _Sequence>& __lhs,
551 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
554 _M_message(__msg_iter_order_bad)
555 ._M_iterator(__lhs,
"lhs")
556 ._M_iterator(__rhs,
"rhs"));
558 _M_message(__msg_order_different)
559 ._M_iterator(__lhs,
"lhs")
560 ._M_iterator(__rhs,
"rhs"));
561 return __lhs.base() > __rhs.base();
564 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
566 operator>=(
const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
567 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
570 _M_message(__msg_iter_order_bad)
571 ._M_iterator(__lhs,
"lhs")
572 ._M_iterator(__rhs,
"rhs"));
574 _M_message(__msg_order_different)
575 ._M_iterator(__lhs,
"lhs")
576 ._M_iterator(__rhs,
"rhs"));
577 return __lhs.base() >= __rhs.base();
580 template<
typename _Iterator,
typename _Sequence>
582 operator>=(
const _Safe_iterator<_Iterator, _Sequence>& __lhs,
583 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
586 _M_message(__msg_iter_order_bad)
587 ._M_iterator(__lhs,
"lhs")
588 ._M_iterator(__rhs,
"rhs"));
590 _M_message(__msg_order_different)
591 ._M_iterator(__lhs,
"lhs")
592 ._M_iterator(__rhs,
"rhs"));
593 return __lhs.base() >= __rhs.base();
600 template<
typename _IteratorL,
typename _IteratorR,
typename _Sequence>
601 inline typename _Safe_iterator<_IteratorL, _Sequence>::difference_type
602 operator-(
const _Safe_iterator<_IteratorL, _Sequence>& __lhs,
603 const _Safe_iterator<_IteratorR, _Sequence>& __rhs)
606 _M_message(__msg_distance_bad)
607 ._M_iterator(__lhs,
"lhs")
608 ._M_iterator(__rhs,
"rhs"));
610 _M_message(__msg_distance_different)
611 ._M_iterator(__lhs,
"lhs")
612 ._M_iterator(__rhs,
"rhs"));
613 return __lhs.base() - __rhs.base();
616 template<
typename _Iterator,
typename _Sequence>
617 inline typename _Safe_iterator<_Iterator, _Sequence>::difference_type
618 operator-(
const _Safe_iterator<_Iterator, _Sequence>& __lhs,
619 const _Safe_iterator<_Iterator, _Sequence>& __rhs)
622 _M_message(__msg_distance_bad)
623 ._M_iterator(__lhs,
"lhs")
624 ._M_iterator(__rhs,
"rhs"));
626 _M_message(__msg_distance_different)
627 ._M_iterator(__lhs,
"lhs")
628 ._M_iterator(__rhs,
"rhs"));
629 return __lhs.base() - __rhs.base();
632 template<
typename _Iterator,
typename _Sequence>
633 inline _Safe_iterator<_Iterator, _Sequence>
634 operator+(
typename _Safe_iterator<_Iterator,_Sequence>::difference_type __n,
635 const _Safe_iterator<_Iterator, _Sequence>& __i)
636 {
return __i + __n; }
639 #ifndef _GLIBCXX_EXPORT_TEMPLATE
640 # include <debug/safe_iterator.tcc>
Basic functionality for a "safe" iterator.
_Safe_iterator & operator--()
Iterator predecrement.
void _M_attach(const _Sequence *__seq)
bool _M_dereferenceable() const
Is the iterator dereferenceable?
_Safe_sequence_base * _M_sequence
basic_string< _CharT, _Traits, _Alloc > operator+(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Concatenate two strings.
void _M_attach_single(_Safe_sequence_base *__seq, bool __constant)
reference operator*() const
Iterator dereference.
_Safe_iterator & operator++()
Iterator preincrement.
#define _GLIBCXX_DEBUG_VERIFY(_Condition, _ErrorMessage)
_Safe_iterator(const _Safe_iterator< _MutableIterator, typename __gnu_cxx::__enable_if<(std::__are_same< _MutableIterator, typename _Sequence::iterator::_Base_iterator >::__value), _Sequence >::__type > &__x)
Converting constructor from a mutable iterator to a constant iterator.
bool _M_incrementable() const
Is the iterator incrementable?
pair holds two objects of arbitrary type.
bool _M_is_begin() const
Is this iterator equal to the sequence's begin() iterator?
Forward iterators support a superset of input iterator operations.
_Safe_iterator & operator=(const _Safe_iterator &__x)
Copy assignment.
void _M_attach_single(const _Sequence *__seq)
_Safe_iterator operator++(int)
Iterator postincrement.
_Safe_iterator(const _Safe_iterator &__x)
Copy construction.
_Safe_iterator operator--(int)
Iterator postdecrement.
_Iterator base() const
Return the underlying iterator.
void _M_attach(_Safe_sequence_base *__seq, bool __constant)
void _M_invalidate_single()
pointer operator->() const
Iterator dereference.
Random-access iterators support a superset of bidirectional iterator operations.
static std::pair< difference_type, _Distance_precision > _M_get_distance(const _Iterator1 &__lhs, const _Iterator2 &__rhs)
bool operator>(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Test if string follows string.
GNU debug classes for public use.
bool _M_is_end() const
Is this iterator equal to the sequence's end() iterator?
bool operator>=(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const basic_string< _CharT, _Traits, _Alloc > &__rhs)
Test if string doesn't precede string.
_Safe_iterator(const _Iterator &__i, const _Sequence *__seq)
Safe iterator construction from an unsafe iterator and its sequence.