45#ifndef _RWSTD_RW_ITERATOR_H_INCLUDED
46#define _RWSTD_RW_ITERATOR_H_INCLUDED
48#ifndef _RWSTD_RW_ITERBASE_H_INCLUDED
61#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
62# define _RWSTD_ITER_TEMPLATE template <class _Iterator>
63# define _RWSTD_ITER_ID(i) i <_Iterator>
64# define _RWSTD_ITER_DIFF_TYPE(i, ignore) \
65 typename iterator_traits<_Iterator>::difference_type
67# define _RWSTD_ITER_TEMPLATE \
68 template <class _Iterator, class _Category, class _TypeT, \
69 class _Reference, class _Pointer, class _Distance>
70# define _RWSTD_ITER_ID(i) \
71 i <_Iterator, _Category, _TypeT, _Reference, _Pointer, _Distance>
72# define _RWSTD_ITER_DIFF_TYPE(ignore, distance) distance
76#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
78template <
class _Iterator>
80 :
public iterator<typename iterator_traits<_Iterator>::iterator_category,
81 typename iterator_traits<_Iterator>::value_type,
82 typename iterator_traits<_Iterator>::difference_type,
83 typename iterator_traits<_Iterator>::pointer,
84 typename iterator_traits<_Iterator>::reference>
86 typedef iterator_traits<_Iterator> traits_type;
88 typedef typename traits_type::difference_type difference_type;
89 typedef typename traits_type::value_type value_type;
90 typedef typename traits_type::pointer pointer;
91 typedef typename traits_type::reference reference;
95template <
class _Iterator,
class _Category,
class _TypeT,
96 class _Reference = _TypeT&,
97 class _Pointer = _TypeT*,
98 class _Distance = _RWSTD_PTRDIFF_T>
100 :
public iterator<_Category, _TypeT, _Distance, _Pointer, _Reference>
104 typedef _Distance difference_type;
105 typedef _TypeT value_type;
106 typedef _Reference reference;
107 typedef _Pointer pointer;
111 typedef _Iterator iterator_type;
113 reverse_iterator () { }
116 explicit reverse_iterator (iterator_type __rhs) : current (__rhs) { }
119#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
122 template <
class _TypeU>
123 reverse_iterator (
const reverse_iterator<_TypeU>& __rhs)
124 : current (__rhs.base ()) { }
129 template <
class _Iterator2,
class _Category2,
class _TypeU,
130 class _Reference2,
class _Pointer2,
class _Distance2>
131 reverse_iterator (
const reverse_iterator<_Iterator2, _Category2, _TypeU,
132 _Reference2, _Pointer2, _Distance2>& __rhs)
133 : current (__rhs.base ()) { }
139 iterator_type
base ()
const {
145 iterator_type __tmp (
base ());
153 reverse_iterator& operator++ () {
154 return --current, *
this;
158 reverse_iterator operator++ (
int) {
159 reverse_iterator __tmp (*
this);
160 return ++*
this, __tmp;
164 reverse_iterator& operator-- () {
165 return ++current, *
this;
169 reverse_iterator operator-- (
int) {
170 reverse_iterator __tmp (*
this);
171 return --*
this, __tmp;
175 reverse_iterator& operator+= (difference_type __n) {
176 return current -= __n, *
this;
180 reverse_iterator& operator-= (difference_type __n) {
181 return *
this += -__n;
185 reverse_iterator
operator+ (difference_type __n)
const {
186 return reverse_iterator (*
this) += __n;
190 reverse_iterator
operator- (difference_type __n)
const {
191 return reverse_iterator (*
this) -= __n;
195 reference operator[] (difference_type __n)
const {
196 return *(*
this + __n);
201 iterator_type current;
210 return __x.base () == __y.base ();
219 return __y.base() < __x.base();
228 return !(__x == __y);
243inline bool operator>= (
const _RWSTD_ITER_ID (reverse_iterator)& __x,
252inline bool operator<= (
const _RWSTD_ITER_ID (reverse_iterator)& __x,
265 return __y.base () - __x.base ();
278#undef _RWSTD_ITER_DIFF_TYPE
280#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC
291template <
class _Iterator,
class _Category,
class _TypeT,
292 class _Reference = _TypeT&,
293 class _Pointer = _TypeT*,
294 class _Distance = _RWSTD_PTRDIFF_T>
295class __reverse_bi_iterator
296 :
public _STD::iterator<_Category, _TypeT, _Distance, _Pointer, _Reference>
299 typedef _Distance difference_type;
300 typedef _TypeT value_type;
301 typedef _Reference reference;
302 typedef _Pointer pointer;
303 typedef _Iterator iterator_type;
305 __reverse_bi_iterator () { }
307 explicit __reverse_bi_iterator (
const iterator_type &__rhs)
308 : current (__rhs) { }
311#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
313 template <
class _TypeU>
314 __reverse_bi_iterator (
const __reverse_bi_iterator<_TypeU>& __rhs)
315 : current (__rhs.base ()) { }
319 template <
class _Iterator2,
class _Category2,
class _TypeU,
320 class _Reference2,
class _Pointer2,
class _Distance2>
321 __reverse_bi_iterator (
const __reverse_bi_iterator<_Iterator2,
327 : current (__rhs.base ()) { }
331 iterator_type
base ()
const {
336 iterator_type __tmp =
base ();
342 __reverse_bi_iterator& operator++ () {
343 return --current, *
this;
346 __reverse_bi_iterator operator++ (
int) {
347 __reverse_bi_iterator __tmp (*
this);
352 __reverse_bi_iterator& operator-- () {
353 return ++current, *
this;
356 __reverse_bi_iterator operator-- (
int) {
357 __reverse_bi_iterator __tmp (*
this);
364 iterator_type current;
372 return __x.base () == __y.base ();
380 return !(__x == __y);
383#undef _RWSTD_ITER_TEMPLATE
393#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
394# define _RWSTD_INSERT_ITERATOR_BASE(ignore) \
395 iterator<output_iterator_tag, void, void, void, void>
398# define _RWSTD_INSERT_ITERATOR_BASE(cont) \
399 iterator<output_iterator_tag, \
400 typename cont::value_type, \
401 typename cont::difference_type, \
402 typename cont::pointer, \
403 typename cont::reference>
407template <
class _Container>
411 typedef _Container container_type;
413 explicit back_insert_iterator (container_type& __rhs)
414 : container (&__rhs) { }
416 back_insert_iterator&
417 operator= (
typename container_type::const_reference __x) {
418 return container->push_back (__x), *
this;
425 back_insert_iterator& operator++ () {
429 back_insert_iterator operator++ (
int) {
435 container_type* container;
439template <
class _Container>
440inline back_insert_iterator<_Container> back_inserter (_Container& __x)
442 return back_insert_iterator<_Container>(__x);
446template <
class _Container>
450 typedef _Container container_type;
452 explicit front_insert_iterator (container_type& __rhs)
453 : container (&__rhs) { }
455 front_insert_iterator&
456 operator= (
typename container_type::const_reference __x) {
457 return container->push_front (__x), *
this;
464 front_insert_iterator& operator++ () {
468 front_insert_iterator operator++ (
int) {
474 container_type* container;
478template <
class _Container>
479inline front_insert_iterator<_Container> front_inserter (_Container& __x)
481 return front_insert_iterator<_Container>(__x);
485template <
class _Container>
489 typedef _Container container_type;
491 insert_iterator (container_type &__x,
492 typename container_type::iterator __it)
493 : iter (__it), container (&__x) { }
496 operator= (
typename container_type::const_reference __x) {
497 iter = container->insert (iter, __x);
498 return ++iter, *
this;
505 insert_iterator& operator++ () {
509 insert_iterator& operator++ (
int) {
515 typename container_type::iterator iter;
516 container_type* container;
520template <
class _Container,
class _Iterator>
521inline insert_iterator<_Container>
inserter (_Container& __x, _Iterator __it)
523 typedef typename _Container::iterator _Iter;
525 return insert_iterator<_Container> (__x, _Iter (__it));
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_OPERATOR_ARROW(signature)
#define _RWSTD_ITER_ID(i)
#define _RWSTD_ITER_TEMPLATE
#define _RWSTD_INSERT_ITERATOR_BASE(ignore)
#define _RWSTD_ITER_DIFF_TYPE(i, ignore)
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
Helper class for suppressing move-construction in single-argument array constructors.