45#ifndef _RWSTD_RW_ITERBASE_H_INCLUDED
46#define _RWSTD_RW_ITERBASE_H_INCLUDED
48#ifndef _RWSTD_RW_DEFS_H_INCLUDED
57template <
class _Iterator>
60 typedef typename _Iterator::value_type value_type;
61 typedef typename _Iterator::difference_type difference_type;
62 typedef typename _Iterator::pointer pointer;
63 typedef typename _Iterator::reference reference;
64 typedef typename _Iterator::iterator_category iterator_category;
69struct input_iterator_tag { };
70struct output_iterator_tag { };
71struct forward_iterator_tag :
public input_iterator_tag { };
72struct bidirectional_iterator_tag :
public forward_iterator_tag { };
73struct random_access_iterator_tag :
public bidirectional_iterator_tag { };
76#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
78template <
class _TypeT>
79struct iterator_traits<_TypeT*>
81 typedef _TypeT value_type;
82 typedef _RWSTD_PTRDIFF_T difference_type;
83 typedef value_type* pointer;
84 typedef value_type& reference;
85 typedef random_access_iterator_tag iterator_category;
89template <
class _TypeT>
90struct iterator_traits<const _TypeT*>
92 typedef _TypeT value_type;
93 typedef _RWSTD_PTRDIFF_T difference_type;
94 typedef const value_type* pointer;
95 typedef const value_type& reference;
96 typedef random_access_iterator_tag iterator_category;
103template <
class _Category,
class _TypeT,
104 class _Distance = _RWSTD_PTRDIFF_T,
105 class _Pointer = _TypeT*,
106 class _Reference = _TypeT&>
109 typedef _TypeT value_type;
110 typedef _Distance difference_type;
111 typedef _Pointer pointer;
112 typedef _Reference reference;
113 typedef _Category iterator_category;
118template <
class _TypeT>
119inline random_access_iterator_tag __iterator_category (
const _TypeT*)
121 return random_access_iterator_tag ();
125template <
class _Category,
class _TypeT,
class _Distance,
126 class _Pointer,
class _Reference>
128__iterator_category (
const iterator<_Category, _TypeT,
129 _Distance, _Pointer, _Reference>&)
131 typedef typename iterator<_Category, _TypeT, _Distance, _TypeT*,
132 _TypeT&>::iterator_category _IterCategory;
134 return _IterCategory ();
139inline bool __is_input_iterator (_Tag)
146inline bool __is_bidirectional_iterator (_Tag)
153inline bool __is_random_access_iterator (_Tag)
160inline bool __is_input_iterator (input_iterator_tag)
167inline bool __is_bidirectional_iterator (bidirectional_iterator_tag)
174inline bool __is_bidirectional_iterator (random_access_iterator_tag)
181inline bool __is_random_access_iterator (random_access_iterator_tag)
187#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
189template <
class _Iterator>
190inline typename iterator_traits<_Iterator>::value_type*
191__value_type (
const _Iterator*)
198template <
class _Category,
class _TypeT,
class _Distance,
199 class _Pointer,
class _Reference>
201__value_type (
const iterator<_Category, _TypeT, _Distance,
202 _Pointer, _Reference>*)
207template <
class _TypeT>
208inline _TypeT* __value_type (
const _TypeT*
const*)
216#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
218template <
class _Iterator>
219inline typename iterator_traits<_Iterator>::difference_type*
220__distance_type (_Iterator)
227template <
class _Category,
class _TypeT,
class _Distance,
228 class _Pointer,
class _Reference>
230__distance_type (iterator<_Category, _TypeT, _Distance, _Pointer, _Reference>)
235template <
class _TypeT>
236inline _RWSTD_PTRDIFF_T* __distance_type (
const _TypeT*)
246template <
class _InputIterator,
class _Distance>
247inline void __advance (_InputIterator &__it, _Distance __n, input_iterator_tag)
258template <
class _ForwardIterator,
class _Distance>
259inline void __advance (_ForwardIterator &__it, _Distance __n,
260 forward_iterator_tag)
262 __advance (__it, __n, input_iterator_tag ());
266template <
class _B
idirectionalIterator,
class _Distance>
267inline void __advance (_BidirectionalIterator &__it, _Distance __n,
268 bidirectional_iterator_tag)
271 __advance (__it, __n, input_iterator_tag ());
280template <
class _RandomAccessIterator,
class _Distance>
281inline void __advance (_RandomAccessIterator& __it, _Distance __n,
282 random_access_iterator_tag)
289template <
class _InputIterator,
class _Distance>
290inline void advance (_InputIterator& __it, _Distance __n)
296template <
class _InputIterator,
class _Distance>
297inline void __distance (
const _InputIterator &__first,
298 const _InputIterator &__last,
302 for (_InputIterator __it = __first; !(__it == __last); ++__it)
307template <
class _ForwardIterator,
class _Distance>
308inline void __distance (
const _ForwardIterator &__first,
309 const _ForwardIterator &__last,
311 forward_iterator_tag)
313 __distance (__first, __last, __n, input_iterator_tag ());
316template <
class _B
idirectionalIterator,
class _Distance>
317inline void __distance (
const _BidirectionalIterator &__first,
318 const _BidirectionalIterator &__last,
320 bidirectional_iterator_tag)
322 __distance (__first, __last, __n, input_iterator_tag ());
326template <
class _RandomAccessIterator,
class _Distance>
327inline void __distance (
const _RandomAccessIterator &__first,
328 const _RandomAccessIterator &__last,
330 random_access_iterator_tag)
332 __n = __last - __first;
336#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
339template <
class _ForwardIterator>
340inline typename iterator_traits<_ForwardIterator>::difference_type
341distance (_ForwardIterator __first, _ForwardIterator __last)
343 typename iterator_traits<_ForwardIterator>::difference_type __n = 0;
345 __distance (__first, __last, __n,
354#if !defined (_RWSTD_NO_EXT_VOID_DISTANCE) \
355 || defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
357template <
class _ForwardIterator,
class _Distance>
358inline void distance (
const _ForwardIterator &__first,
359 const _ForwardIterator &__last,
362 __distance (__first, __last, __n,
377template <
class _ForwardIterator,
class _Distance>
379__rw_distance (
const _ForwardIterator &__first,
380 const _ForwardIterator &__last,
383 _STD::__distance (__first, __last, __n,
392#ifndef _RWSTD_NO_DEBUG_ITER
402template <
class _Container,
class _Iterator,
class _MutableIterator>
405 typedef _Container container_type;
406 typedef _Iterator iterator_type;
407 typedef _STD::iterator_traits<iterator_type> traits_type;
411 typedef typename traits_type::value_type value_type;
412 typedef typename traits_type::difference_type difference_type;
413 typedef typename traits_type::reference reference;
414 typedef typename traits_type::pointer pointer;
415 typedef typename traits_type::iterator_category iterator_category;
417 typedef __rw_debug_iter <container_type, _MutableIterator,
418 _MutableIterator> _C_mutable_iterator;
420 __rw_debug_iter (): _C_cont (0) { }
422 __rw_debug_iter (
const container_type &__cont,
const iterator_type &__it)
423 : _C_iter (__it), _C_cont (&__cont) { }
427 __rw_debug_iter (
const _C_mutable_iterator &__rhs)
428 : _C_iter (__rhs._C_iter), _C_cont (__rhs._C_cont) { }
430 __rw_debug_iter& operator= (
const __rw_debug_iter &__rhs) {
431 _C_iter = __rhs._C_iter;
432 _C_cont = __rhs._C_cont;
441 reference operator[] (difference_type __n)
const {
443 return _C_iter [__n];
448 __rw_debug_iter& operator++ () {
450 return ++_C_iter, *
this;
453 __rw_debug_iter& operator-- () {
455 return --_C_iter, *
this;
458 __rw_debug_iter operator++ (
int) {
459 __rw_debug_iter __tmp = *
this;
460 return ++*
this, __tmp;
463 __rw_debug_iter operator-- (
int) {
464 __rw_debug_iter __tmp = *
this;
465 return --*
this, __tmp;
468 __rw_debug_iter& operator+= (difference_type __n) {
471 && !(_C_cont->end ()._C_iter < _C_iter));
475 __rw_debug_iter& operator-= (difference_type __n) {
478 && !(_C_cont->end ()._C_iter < _C_iter));
482 __rw_debug_iter
operator+ (difference_type __n)
const {
483 return __rw_debug_iter (*
this) += __n;
486 __rw_debug_iter
operator- (difference_type __n)
const {
487 return __rw_debug_iter (*
this) -= __n;
490 bool _C_is_begin ()
const {
491 return _C_cont && _C_cont->begin () == *
this;
494 bool _C_is_end ()
const {
495 return _C_cont && _C_cont->end () == *
this;
498 bool _C_is_dereferenceable ()
const {
499 return !_C_is_end ();
502 bool _C_valid_range (
const __rw_debug_iter &__it)
const {
503 return _C_cont && _C_cont == __it._C_cont;
506 const iterator_type&
base ()
const {
510 iterator_type&
base () {
514#if !defined (__IBMCPP__) || __IBMCPP__ > 502
522 template <
class _Iter>
524 operator- (
const __rw_debug_iter<container_type, _Iter,
525 _MutableIterator> &__rhs)
const {
527 return _C_iter - __rhs._C_iter;
530 template <
class _Iter>
532 operator== (
const __rw_debug_iter<container_type, _Iter,
533 _MutableIterator> &__rhs)
const {
534 return _C_iter == __rhs._C_iter;
537 template <
class _Iter>
539 operator< (
const __rw_debug_iter<container_type, _Iter,
540 _MutableIterator> &__rhs)
const {
541 return _C_iter < __rhs._C_iter;
544 template <
class _Iter>
546 operator!= (
const __rw_debug_iter<container_type, _Iter,
547 _MutableIterator> &__rhs)
const {
548 return !(_C_iter == __rhs._C_iter);
551 template <
class _Iter>
553 operator<= (
const __rw_debug_iter<container_type, _Iter,
554 _MutableIterator> &__rhs)
const {
555 return !(__rhs._C_iter < _C_iter);
558 template <
class _Iter>
560 operator> (
const __rw_debug_iter<container_type, _Iter,
561 _MutableIterator> &__rhs)
const {
562 return __rhs._C_iter < _C_iter;
565 template <
class _Iter>
567 operator>= (
const __rw_debug_iter<container_type, _Iter,
568 _MutableIterator> &__rhs)
const {
569 return !(_C_iter < __rhs._C_iter);
574 iterator_type _C_iter;
575 const container_type *_C_cont;
585#ifndef _RWSTD_NO_NONDEDUCED_CONTEXT
586# define _RWSTD_CONT_DIFF_TYPE typename _Cont::difference_type
588# define _RWSTD_CONT_DIFF_TYPE _RWSTD_PTRDIFF_T
591template <
class _Cont,
class _Iter,
class _MutIter>
592inline _RW::__rw_debug_iter<_Cont, _Iter, _MutIter>
594 const _RW::__rw_debug_iter<_Cont, _Iter, _MutIter> &__x)
599#undef _RWSTD_CONT_DIFF_TYPE
602#if defined (__IBMCPP__) && __IBMCPP__ <= 502
615template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
616inline typename _Cont::difference_type
617operator- (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
618 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
621 return __x._C_iter - __y._C_iter;
624template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
626operator== (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
627 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
629 return __x._C_iter == __y._C_iter;
632template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
634operator< (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
635 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
638 return __x._C_iter < __y._C_iter;
641template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
643operator!= (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
644 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
646 return !(__x == __y);
649template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
651operator<= (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
652 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
657template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
659operator>= (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
660 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
665template <
class _Cont,
class _Iter1,
class _Iter2,
class _MutIter>
667operator> (
const _RW::__rw_debug_iter<_Cont, _Iter1, _MutIter> &__x,
668 const _RW::__rw_debug_iter<_Cont, _Iter2, _MutIter> &__y)
681#define _RWSTD_DEBUG_ITER(cont, it, mutit) __rw_debug_iter< cont, it, mutit >
684template <
class _Cont,
class _Iter,
class _MutIter>
689 return __first._C_cont && __first._C_cont == __last._C_cont;
693template <
class _Iterator>
695__rw_valid_range (
const _Iterator &,
const _Iterator &)
701template <
class _Cont,
class _Iter,
class _MutIter>
707 return __rw_valid_range (__first, __it)
708 && __rw_valid_range (__it, __last);
712template <
class _Iterator>
714__rw_in_range (
const _Iterator&,
const _Iterator&,
const _Iterator&)
720template <
class _Cont,
class _Iter,
class _MutIter>
724 return __it._C_is_dereferenceable ();
728template <
class _Iterator>
730__rw_dereferenceable (
const _Iterator&)
736template <
class _TypeT>
738__rw_dereferenceable (
const _TypeT *__ptr)
745#undef _RWSTD_DEBUG_ITER
const minus< T > & operator-(const minus< T > &lhs, const minus< T > &rhs)
const plus_asgn< T > & operator*(const plus_asgn< T > &lhs, const plus_asgn< T > &rhs)
void operator+(typename A< T >::I, const A< T > &)
#define _RWSTD_NAMESPACE(name)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_OPERATOR_ARROW(signature)
#define _RWSTD_SPECIALIZED_FUNCTION
#define _RWSTD_ITERATOR_CATEGORY(iterT, ignore)
#define _RWSTD_DEBUG_ITER(cont, it, mutit)
#define _RWSTD_CONT_DIFF_TYPE
bool operator>(const DistancePair &lhs, const DistancePair &rhs)
bool operator==(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
bool operator!=(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept
bool operator<(const json_pointer< RefStringTypeLhs > &lhs, const json_pointer< RefStringTypeRhs > &rhs) noexcept