7#include <QtCore/qglobal.h>
8#include <QtCore/qcontainertools_impl.h>
10#ifdef __cpp_lib_ranges
16#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
19#define Q_DISABLE_BACKWARD_ITERATOR
21#define Q_DISABLE_BACKWARD_ITERATOR
22 template<typename It = decltype(i), QtPrivate::IfIteratorCanMoveBackwards<It> = true>
25#define Q_DECLARE_SEQUENTIAL_ITERATOR(C) template
29{
30 typedef typename Q##C<T>::const_iterator const_iterator;
32 const_iterator i; public
34 inline Q##C##Iterator(const Q##C<T> &container)
35 : c(container), i(c.constBegin()) {}
36 inline Q##C##Iterator &operator
=(const Q##C<T> &container)
37 { c = container; i = c.constBegin(); return *this; }
38 inline void toFront() { i = c.constBegin(); }
39 inline void toBack() { i = c.constEnd(); }
40 inline bool hasNext() const { return i != c.constEnd(); }
41 inline const T &next() { return *i++; }
42 inline const T &peekNext() const { return *i; }
44 inline bool hasPrevious() const { return i != c.constBegin(); }
46 inline const T &previous() { return *--i; }
48 inline const T &peekPrevious() const { const_iterator p = i; return *--p; }
49 inline bool findNext(const T &t)
50 { while (i != c.constEnd()) if (*i++ == t) return true; return false; }
52 inline bool findPrevious(const T &t)
53 { while (i != c.constBegin()) if (*(--i) == t) return true;
55};
57#define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C) template
60 QMutable##C##Iterator \
61{
62 typedef typename Q##C<T>::iterator iterator;
63 typedef typename Q##C<T>::const_iterator const_iterator;
66 inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } public
68 inline QMutable##C##Iterator(Q##C<T> &container)
70 { i = c->begin(); n = c->end(); }
71 inline QMutable##C##Iterator &operator
=(Q##C<T> &container)
72 { c = &container; i = c->begin(); n = c->end(); return *this; }
73 inline void toFront() { i = c->begin(); n = c->end(); }
74 inline void toBack() { i = c->end(); n = i; }
75 inline bool hasNext() const { return c->constEnd() != const_iterator(i); }
76 inline T &next() { n = i++; return *n; }
77 inline T &peekNext() const { return *i; }
79 inline bool hasPrevious() const { return c->constBegin() != const_iterator(i); }
81 inline T &previous() { n = --i; return *n; }
83 inline T &peekPrevious() const { iterator p = i; return *--p; }
85 { if (c->constEnd() != const_iterator(n)) { i = c->erase(n); n = c->end(); } }
86 inline void setValue(const T &t) const { if (c->constEnd() != const_iterator(n)) *n = t; }
87 inline T &value() { Q_ASSERT(item_exists()); return *n; }
88 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
89 inline void insert(const T &t) { n = i = c->insert(i, t); ++i; }
90 inline bool findNext(const T &t)
91 { while (c->constEnd() != const_iterator(n = i)) if (*i++ == t) return true; return false; }
93 inline bool findPrevious(const T &t)
94 { while (c->constBegin() != const_iterator(i)) if (*(n = --i) == t) return true;
95 n = c->end(); return false; } \
96};
98#define Q_DECLARE_ASSOCIATIVE_ITERATOR(C) template
100 <class Key, class T> class
102{
103 typedef typename Q##C<Key,T>::const_iterator const_iterator;
106 inline bool item_exists() const { return n != c.constEnd(); } public
108 typedef const_iterator Item;
109 inline Q##C##Iterator(const Q##C<Key,T> &container)
110 : c(container), i(c.constBegin()), n(c.constEnd()) {}
111 inline Q##C##Iterator &operator
=(const Q##C<Key,T> &container)
112 { c = container; i = c.constBegin(); n = c.constEnd(); return *this; }
113 inline void toFront() { i = c.constBegin(); n = c.constEnd(); }
114 inline void toBack() { i = c.constEnd(); n = c.constEnd(); }
115 inline bool hasNext() const { return i != c.constEnd(); }
116 inline Item next() { n = i++; return n; }
117 inline Item peekNext() const { return i; }
119 inline bool hasPrevious() const { return i != c.constBegin(); }
121 inline Item previous() { n = --i; return n; }
123 inline Item peekPrevious() const { const_iterator p = i; return --p; }
124 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
125 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
126 inline bool findNext(const T &t)
127 { while ((n = i) != c.constEnd()) if (*i++ == t) return true; return false; }
129 inline bool findPrevious(const T &t)
130 { while (i != c.constBegin()) if (*(n = --i) == t) return true;
131 n = c.constEnd(); return false; } \
132};
134#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C) template
136 <class Key, class T> class
137 QMutable##C##Iterator \
138{
139 typedef typename Q##C<Key,T>::iterator iterator;
140 typedef typename Q##C<Key,T>::const_iterator const_iterator;
143 inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } public
145 typedef iterator Item;
146 inline QMutable##C##Iterator(Q##C<Key,T> &container)
148 { i = c->begin(); n = c->end(); }
149 inline QMutable##C##Iterator &operator
=(Q##C<Key,T> &container)
150 { c = &container; i = c->begin(); n = c->end(); return *this; }
151 inline void toFront() { i = c->begin(); n = c->end(); }
152 inline void toBack() { i = c->end(); n = c->end(); }
153 inline bool hasNext() const { return const_iterator(i) != c->constEnd(); }
154 inline Item next() { n = i++; return n; }
155 inline Item peekNext() const { return i; }
157 inline bool hasPrevious() const { return const_iterator(i) != c->constBegin(); }
159 inline Item previous() { n = --i; return n; }
161 inline Item peekPrevious() const { iterator p = i; return --p; }
163 { if (const_iterator(n) != c->constEnd()) { i = c->erase(n); n = c->end(); } }
164 inline void setValue(const T &t) { if (const_iterator(n) != c->constEnd()) *n = t; }
165 inline T &value() { Q_ASSERT(item_exists()); return *n; }
166 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
167 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
168 inline bool findNext(const T &t)
169 { while (const_iterator(n = i) != c->constEnd()) if (*i++ == t) return true; return false; }
171 inline bool findPrevious(const T &t)
172 { while (const_iterator(i) != c->constBegin()) if (*(n = --i) == t) return true;
173 n = c->end(); return false; } \
174};
176#define Q_DECLARE_ASSOCIATIVE_FORWARD_ITERATOR(C) template
178 <class Key, class T> class
180{
181 typedef typename Q##C<Key,T>::const_iterator const_iterator;
184 inline bool item_exists() const { return n != c.constEnd(); } public
186 typedef const_iterator Item;
187 inline Q##C##Iterator(const Q##C<Key,T> &container)
188 : c(container), i(c.constBegin()), n(c.constEnd()) {}
189 inline Q##C##Iterator &operator
=(const Q##C<Key,T> &container)
190 { c = container; i = c.constBegin(); n = c.constEnd(); return *this; }
191 inline void toFront() { i = c.constBegin(); n = c.constEnd(); }
192 inline void toBack() { i = c.constEnd(); n = c.constEnd(); }
193 inline bool hasNext() const { return i != c.constEnd(); }
194 inline Item next() { n = i++; return n; }
195 inline Item peekNext() const { return i; }
196 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
197 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
198 inline bool findNext(const T &t)
199 { while ((n = i) != c.constEnd()) if (*i++ == t) return true; return false; } \
200};
202#define Q_DECLARE_MUTABLE_ASSOCIATIVE_FORWARD_ITERATOR(C) template
204 <class Key, class T> class
205 QMutable##C##Iterator \
206{
207 typedef typename Q##C<Key,T>::iterator iterator;
208 typedef typename Q##C<Key,T>::const_iterator const_iterator;
211 inline bool item_exists() const { return const_iterator(n) != c->constEnd(); } public
213 typedef iterator Item;
214 inline QMutable##C##Iterator(Q##C<Key,T> &container)
216 { i = c->begin(); n = c->end(); }
217 inline QMutable##C##Iterator &operator
=(Q##C<Key,T> &container)
218 { c = &container; i = c->begin(); n = c->end(); return *this; }
219 inline void toFront() { i = c->begin(); n = c->end(); }
220 inline void toBack() { i = c->end(); n = c->end(); }
221 inline bool hasNext() const { return const_iterator(i) != c->constEnd(); }
222 inline Item next() { n = i++; return n; }
223 inline Item peekNext() const { return i; }
225 { if (const_iterator(n) != c->constEnd()) { i = c->erase(n); n = c->end(); } }
226 inline void setValue(const T &t) { if (const_iterator(n) != c->constEnd()) *n = t; }
227 inline T &value() { Q_ASSERT(item_exists()); return *n; }
228 inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
229 inline const Key &key() const { Q_ASSERT(item_exists()); return n.key(); }
230 inline bool findNext(const T &t)
231 { while (const_iterator(n = i) != c->constEnd()) if (*i++ == t) return true; return false; } \
232};
236#define Q_DECLARE_SEQUENTIAL_ITERATOR(C)
237#define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C)
238#define Q_DECLARE_ASSOCIATIVE_ITERATOR(C)
239#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C)
240#define Q_DECLARE_ASSOCIATIVE_FORWARD_ITERATOR(C)
241#define Q_DECLARE_MUTABLE_ASSOCIATIVE_FORWARD_ITERATOR(C)
246template <
typename Key,
typename T,
typename Iterator>
249 static Key
key(
const Iterator &it) {
return it.key(); }
250 static Key
key(Iterator &it) {
return it.key(); }
251 static T
value(
const Iterator &it) {
return it.value(); }
252 static T
value(Iterator &it) {
return it.value(); }
257template <
typename Key,
typename T,
class Iterator,
272 return std::pair<Key, T>(Traits::key(i), Traits::value(i));
278 return pointer{ std::pair<Key, T>(Traits::key(i), Traits::value(i)) };
288 Iterator
base()
const {
return i; }
296template <
typename Map>
308template <
typename Map>
310#ifdef __cpp_lib_ranges
322template <
typename Map>
327 auto begin() {
return this->map().keyValueBegin(); }
328 auto begin()
const {
return this->map().keyValueBegin(); }
329 auto end() {
return this->map().keyValueEnd(); }
330 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)