30 #ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_H
31 #define _GLIBCXX_DEBUG_SAFE_ITERATOR_H 1
62 template<
typename _Iterator,
typename _Sequence>
70 enum _Distance_precision
84 typedef typename _Sequence::const_iterator const_iterator;
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;
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