8#include <QtCore/qglobal.h>
9#include <QtCore/qcontainertools_impl.h>
11#ifdef __cpp_lib_ranges
17#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
20#define Q_DISABLE_BACKWARD_ITERATOR
22#define Q_DISABLE_BACKWARD_ITERATOR
23 template<typename It = decltype(i), QtPrivate::IfIteratorCanMoveBackwards<It> = true>
26#define Q_DECLARE_SEQUENTIAL_ITERATOR(C) template
30{
31 typedef typename Q##C<T>::const_iterator const_iterator;
33 const_iterator i; public
35 inline Q##C##Iterator(const Q##C<T> &container)
36 : c(container), i(c.constBegin()) {}
37 inline Q##C##Iterator &operator
=(const Q##C<T> &container)
38 { c = container; i = c.constBegin(); return *this; }
39 inline void toFront() { i = c.constBegin(); }
40 inline void toBack() { i = c.constEnd(); }
41 inline bool hasNext() const { return i != c.constEnd(); }
42 inline const T &next() { return *i++; }
43 inline const T &peekNext() const { return *i; }
45 inline bool hasPrevious() const { return i != c.constBegin(); }
47 inline const T &previous() { return *--i; }
49 inline const T &peekPrevious() const { const_iterator p = i; return *--p; }
50 inline bool findNext(const T &t)
51 { while (i != c.constEnd()) if (*i++ == t) return true; return false; }
53 inline bool findPrevious(const T &t)
54 { while (i != c.constBegin()) if (*(--i) == t) return true;
56};
58#define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C) template
61 QMutable##C##Iterator \
62{
63 typedef typename Q##C<T>::iterator iterator;
64 typedef typename Q##C<T>::const_iterator const_iterator;
67 inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } public
69 inline QMutable##C##Iterator(Q##C<T> &container)
71 { i = c->begin(); n = c->end(); }
72 inline QMutable##C##Iterator &operator
=(Q##C<T> &container)
73 { c = &container; i = c->begin(); n = c->end(); return *this; }
74 inline void toFront() { i = c->begin(); n = c->end(); }
75 inline void toBack() { i = c->end(); n = i; }
76 inline bool hasNext() const { return c->constEnd() != const_iterator(i); }
77 inline T &next() { n = i++; return *n; }
78 inline T &peekNext() const { return *i; }
80 inline bool hasPrevious() const { return c->constBegin() != const_iterator(i); }
82 inline T &previous() { n = --i; return *n; }
84 inline T &peekPrevious() const { iterator p = i; return *--p; }
86 { if (c->constEnd() != const_iterator(n)) { i = c->erase(n); n = c->end(); } }
87 inline void setValue(const T &t) const { if (c->constEnd() != const_iterator(n)) *n = t; }
88 inline T &value() { Q_ASSERT(item_exists()); return *n; }
89 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
90 inline void insert(const T &t) { n = i = c->insert(i, t); ++i; }
91 inline bool findNext(const T &t)
92 { while (c->constEnd() != const_iterator(n = i)) if (*i++ == t) return true; return false; }
94 inline bool findPrevious(const T &t)
95 { while (c->constBegin() != const_iterator(i)) if (*(n = --i) == t) return true;
96 n = c->end(); return false; } \
97};
99#define Q_DECLARE_ASSOCIATIVE_ITERATOR(C) template
101 <class Key, class T> class
103{
104 typedef typename Q##C<Key,T>::const_iterator const_iterator;
107 inline bool item_exists() const { return n != c.constEnd(); } public
109 typedef const_iterator Item;
110 inline Q##C##Iterator(const Q##C<Key,T> &container)
111 : c(container), i(c.constBegin()), n(c.constEnd()) {}
112 inline Q##C##Iterator &operator
=(const Q##C<Key,T> &container)
113 { c = container; i = c.constBegin(); n = c.constEnd(); return *this; }
114 inline void toFront() { i = c.constBegin(); n = c.constEnd(); }
115 inline void toBack() { i = c.constEnd(); n = c.constEnd(); }
116 inline bool hasNext() const { return i != c.constEnd(); }
117 inline Item next() { n = i++; return n; }
118 inline Item peekNext() const { return i; }
120 inline bool hasPrevious() const { return i != c.constBegin(); }
122 inline Item previous() { n = --i; return n; }
124 inline Item peekPrevious() const { const_iterator p = i; return --p; }
125 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
126 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
127 inline bool findNext(const T &t)
128 { while ((n = i) != c.constEnd()) if (*i++ == t) return true; return false; }
130 inline bool findPrevious(const T &t)
131 { while (i != c.constBegin()) if (*(n = --i) == t) return true;
132 n = c.constEnd(); return false; } \
133};
135#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C) template
137 <class Key, class T> class
138 QMutable##C##Iterator \
139{
140 typedef typename Q##C<Key,T>::iterator iterator;
141 typedef typename Q##C<Key,T>::const_iterator const_iterator;
144 inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } public
146 typedef iterator Item;
147 inline QMutable##C##Iterator(Q##C<Key,T> &container)
149 { i = c->begin(); n = c->end(); }
150 inline QMutable##C##Iterator &operator
=(Q##C<Key,T> &container)
151 { c = &container; i = c->begin(); n = c->end(); return *this; }
152 inline void toFront() { i = c->begin(); n = c->end(); }
153 inline void toBack() { i = c->end(); n = c->end(); }
154 inline bool hasNext() const { return const_iterator(i) != c->constEnd(); }
155 inline Item next() { n = i++; return n; }
156 inline Item peekNext() const { return i; }
158 inline bool hasPrevious() const { return const_iterator(i) != c->constBegin(); }
160 inline Item previous() { n = --i; return n; }
162 inline Item peekPrevious() const { iterator p = i; return --p; }
164 { if (const_iterator(n) != c->constEnd()) { i = c->erase(n); n = c->end(); } }
165 inline void setValue(const T &t) { if (const_iterator(n) != c->constEnd()) *n = t; }
166 inline T &value() { Q_ASSERT(item_exists()); return *n; }
167 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
168 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
169 inline bool findNext(const T &t)
170 { while (const_iterator(n = i) != c->constEnd()) if (*i++ == t) return true; return false; }
172 inline bool findPrevious(const T &t)
173 { while (const_iterator(i) != c->constBegin()) if (*(n = --i) == t) return true;
174 n = c->end(); return false; } \
175};
177#define Q_DECLARE_ASSOCIATIVE_FORWARD_ITERATOR(C) template
179 <class Key, class T> class
181{
182 typedef typename Q##C<Key,T>::const_iterator const_iterator;
185 inline bool item_exists() const { return n != c.constEnd(); } public
187 typedef const_iterator Item;
188 inline Q##C##Iterator(const Q##C<Key,T> &container)
189 : c(container), i(c.constBegin()), n(c.constEnd()) {}
190 inline Q##C##Iterator &operator
=(const Q##C<Key,T> &container)
191 { c = container; i = c.constBegin(); n = c.constEnd(); return *this; }
192 inline void toFront() { i = c.constBegin(); n = c.constEnd(); }
193 inline void toBack() { i = c.constEnd(); n = c.constEnd(); }
194 inline bool hasNext() const { return i != c.constEnd(); }
195 inline Item next() { n = i++; return n; }
196 inline Item peekNext() const { return i; }
197 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
198 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
199 inline bool findNext(const T &t)
200 { while ((n = i) != c.constEnd()) if (*i++ == t) return true; return false; } \
201};
203#define Q_DECLARE_MUTABLE_ASSOCIATIVE_FORWARD_ITERATOR(C) template
205 <class Key, class T> class
206 QMutable##C##Iterator \
207{
208 typedef typename Q##C<Key,T>::iterator iterator;
209 typedef typename Q##C<Key,T>::const_iterator const_iterator;
212 inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } public
214 typedef iterator Item;
215 inline QMutable##C##Iterator(Q##C<Key,T> &container)
217 { i = c->begin(); n = c->end(); }
218 inline QMutable##C##Iterator &operator
=(Q##C<Key,T> &container)
219 { c = &container; i = c->begin(); n = c->end(); return *this; }
220 inline void toFront() { i = c->begin(); n = c->end(); }
221 inline void toBack() { i = c->end(); n = c->end(); }
222 inline bool hasNext() const { return const_iterator(i) != c->constEnd(); }
223 inline Item next() { n = i++; return n; }
224 inline Item peekNext() const { return i; }
226 { if (const_iterator(n) != c->constEnd()) { i = c->erase(n); n = c->end(); } }
227 inline void setValue(const T &t) { if (const_iterator(n) != c->constEnd()) *n = t; }
228 inline T &value() { Q_ASSERT(item_exists()); return *n; }
229 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
230 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
231 inline bool findNext(const T &t)
232 { while (const_iterator(n = i) != c->constEnd()) if (*i++ == t) return true; return false; } \
233};
237#define Q_DECLARE_SEQUENTIAL_ITERATOR(C)
238#define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C)
239#define Q_DECLARE_ASSOCIATIVE_ITERATOR(C)
240#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C)
241#define Q_DECLARE_ASSOCIATIVE_FORWARD_ITERATOR(C)
242#define Q_DECLARE_MUTABLE_ASSOCIATIVE_FORWARD_ITERATOR(C)
247template <
typename Key,
typename T,
typename Iterator>
250 static Key
key(
const Iterator &it) {
return it.key(); }
251 static Key
key(Iterator &it) {
return it.key(); }
252 static T
value(
const Iterator &it) {
return it.value(); }
253 static T
value(Iterator &it) {
return it.value(); }
258template <
typename Key,
typename T,
class Iterator,
273 return std::pair<Key, T>(Traits::key(i), Traits::value(i));
279 return pointer{ std::pair<Key, T>(Traits::key(i), Traits::value(i)) };
289 Iterator
base()
const {
return i; }
297template <
typename Map>
309template <
typename Map>
311#ifdef __cpp_lib_ranges
323template <
typename Map>
328 auto begin() {
return this->map().keyValueBegin(); }
329 auto begin()
const {
return this->map().keyValueBegin(); }
330 auto end() {
return this->map().keyValueEnd(); }
331 auto end()
const {
return this->map().keyValueEnd(); }
Iterator::difference_type difference_type
constexpr QKeyValueIterator(Iterator o) noexcept(std::is_nothrow_move_constructible< Iterator >::value)
std::pair< Key, T > operator*() const
std::pair< Key, T > value_type
friend bool operator==(QKeyValueIterator lhs, QKeyValueIterator rhs) noexcept
QKeyValueIterator()=default
pointer operator->() const
QKeyValueIterator operator++(int)
Iterator::iterator_category iterator_category
QKeyValueIterator & operator--()
const value_type & reference
QKeyValueIterator operator--(int)
friend bool operator!=(QKeyValueIterator lhs, QKeyValueIterator rhs) noexcept
QKeyValueIterator & operator++()
QKeyValueRangeStorage(Map &map)
QKeyValueRangeStorage(const Map &map)
QKeyValueRangeStorage(Map &&map)
#define Q_DISABLE_BACKWARD_ITERATOR
static T value(Iterator &it)
static Key key(const Iterator &it)
static T value(const Iterator &it)
static Key key(Iterator &it)