Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qlist.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// Copyright (C) 2019 Intel Corporation
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:significant reason:default
5
6#ifndef QLIST_H
7#define QLIST_H
8
9#include <QtCore/qarraydatapointer.h>
10#include <QtCore/qcompare.h>
11#include <QtCore/qnamespace.h>
12#include <QtCore/qhashfunctions.h>
13#include <QtCore/qiterator.h>
14#include <QtCore/qcontainertools_impl.h>
15#include <QtCore/qnamespace.h>
16#include <QtCore/qscopeguard.h>
17#include <QtCore/qttypetraits.h>
18
19#include <functional>
20#include <limits>
21#include <initializer_list>
22#include <type_traits>
23
24class tst_QList;
25
26QT_BEGIN_NAMESPACE
27
28namespace QtPrivate {
29 template <typename V, typename U> qsizetype indexOf(const QList<V> &list, const U &u, qsizetype from) noexcept;
30 template <typename V, typename U> qsizetype lastIndexOf(const QList<V> &list, const U &u, qsizetype from) noexcept;
31}
32
33template <typename T> struct QListSpecialMethodsBase
34{
35protected:
38
39 using Self = QList<T>;
40 Self *self() { return static_cast<Self *>(this); }
41 const Self *self() const { return static_cast<const Self *>(this); }
42
43public:
44 template <typename AT = T>
45 qsizetype indexOf(const AT &t, qsizetype from = 0) const noexcept;
46 template <typename AT = T>
47 qsizetype lastIndexOf(const AT &t, qsizetype from = -1) const noexcept;
48
49 template <typename AT = T>
50 bool contains(const AT &t) const noexcept
51 {
52 return self()->indexOf(t) != -1;
53 }
54};
55template <typename T> struct QListSpecialMethods : QListSpecialMethodsBase<T>
56{
57protected:
60
61public:
63 using QListSpecialMethodsBase<T>::lastIndexOf;
64 using QListSpecialMethodsBase<T>::contains;
65};
66template <> struct QListSpecialMethods<QByteArray>;
67template <> struct QListSpecialMethods<QString>;
68
69#if !defined(QT_STRICT_QLIST_ITERATORS) && (QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)) && !defined(Q_OS_WIN)
70#define QT_STRICT_QLIST_ITERATORS
71#endif
72
73#ifdef Q_QDOC // define QVector for QDoc
74template<typename T> class QVector : public QList<T> {};
75#endif
76
77template <typename T>
78class QList
79#ifndef Q_QDOC
80 : public QListSpecialMethods<T>
81#endif
82{
83 using Data = QTypedArrayData<T>;
84 using DataOps = QArrayDataOps<T>;
86 class DisableRValueRefs {};
87
88 friend class ::tst_QList;
89
90 DataPointer d;
91
92 template <typename V, typename U> friend qsizetype QtPrivate::indexOf(const QList<V> &list, const U &u, qsizetype from) noexcept;
93 template <typename V, typename U> friend qsizetype QtPrivate::lastIndexOf(const QList<V> &list, const U &u, qsizetype from) noexcept;
94 // This alias prevents the QtPrivate namespace from being exposed into the docs.
95 template <typename InputIterator>
97
98public:
99 using Type = T;
100 using value_type = T;
101 using pointer = T *;
102 using const_pointer = const T *;
103 using reference = T &;
104 using const_reference = const T &;
107#ifndef Q_QDOC
110#else // simplified aliases for QDoc
111 using parameter_type = const T &;
112 using rvalue_ref = T &&;
113#endif
114
115 DataPointer &data_ptr() & { return d; }
116 const DataPointer &data_ptr() const & { return d; }
117 DataPointer &&data_ptr() && { return std::move(d); }
118 // No current use-case for a `const &&` overload
119
120 class const_iterator;
121 class iterator {
122 friend class QList<T>;
123 friend class const_iterator;
124 T *i = nullptr;
125#ifdef QT_STRICT_QLIST_ITERATORS
126 inline constexpr explicit iterator(T *n) : i(n) {}
127#endif
128
129 public:
131 using value_type = T;
132#ifdef QT_COMPILER_HAS_LWG3346
134#endif
136 using iterator_category = std::random_access_iterator_tag;
137 using pointer = T *;
138 using reference = T &;
139
140 inline constexpr iterator() = default;
141#ifndef QT_STRICT_QLIST_ITERATORS
142 inline constexpr explicit iterator(T *n) : i(n) {}
143#endif
144 inline T &operator*() const { return *i; }
145 inline T *operator->() const { return i; }
146 inline T &operator[](qsizetype j) const { return *(i + j); }
147#ifdef __cpp_lib_three_way_comparison
148 friend constexpr auto operator<=>(iterator, iterator) noexcept = default;
149 friend constexpr bool operator==(iterator, iterator) noexcept = default;
150#else
151 inline constexpr bool operator==(iterator o) const { return i == o.i; }
152 inline constexpr bool operator!=(iterator o) const { return i != o.i; }
153 inline constexpr bool operator<(iterator other) const { return i < other.i; }
154 inline constexpr bool operator<=(iterator other) const { return i <= other.i; }
155 inline constexpr bool operator>(iterator other) const { return i > other.i; }
156 inline constexpr bool operator>=(iterator other) const { return i >= other.i; }
157 inline constexpr bool operator==(const_iterator o) const { return i == o.i; }
158 inline constexpr bool operator!=(const_iterator o) const { return i != o.i; }
159 inline constexpr bool operator<(const_iterator other) const { return i < other.i; }
160 inline constexpr bool operator<=(const_iterator other) const { return i <= other.i; }
161 inline constexpr bool operator>(const_iterator other) const { return i > other.i; }
162 inline constexpr bool operator>=(const_iterator other) const { return i >= other.i; }
163#endif // __cpp_lib_three_way_comparison
164 inline constexpr bool operator==(pointer p) const { return i == p; }
165 inline constexpr bool operator!=(pointer p) const { return i != p; }
166 inline iterator &operator++() { ++i; return *this; }
167 inline iterator operator++(int) { auto copy = *this; ++*this; return copy; }
168 inline iterator &operator--() { --i; return *this; }
169 inline iterator operator--(int) { auto copy = *this; --*this; return copy; }
170 inline qsizetype operator-(iterator j) const { return i - j.i; }
171#if QT_DEPRECATED_SINCE(6, 3) && !defined(QT_STRICT_QLIST_ITERATORS)
172 QT_DEPRECATED_VERSION_X_6_3("Use operator* or operator-> rather than relying on "
173 "the implicit conversion between a QList/QVector::iterator "
174 "and a raw pointer")
175 inline operator T*() const { return i; }
176
177 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, iterator>
178 &operator+=(Int j) { i+=j; return *this; }
179 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, iterator>
180 &operator-=(Int j) { i-=j; return *this; }
181 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, iterator>
182 operator+(Int j) const { return iterator(i+j); }
183 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, iterator>
184 operator-(Int j) const { return iterator(i-j); }
185 template <typename Int> friend std::enable_if_t<std::is_integral_v<Int>, iterator>
186 operator+(Int j, iterator k) { return k + j; }
187#else
188 inline iterator &operator+=(qsizetype j) { i += j; return *this; }
189 inline iterator &operator-=(qsizetype j) { i -= j; return *this; }
190 inline iterator operator+(qsizetype j) const { return iterator(i + j); }
191 inline iterator operator-(qsizetype j) const { return iterator(i - j); }
192 friend inline iterator operator+(qsizetype j, iterator k) { return k + j; }
193#endif
194 };
195
197 friend class QList<T>;
198 friend class iterator;
199 const T *i = nullptr;
200#ifdef QT_STRICT_QLIST_ITERATORS
201 inline constexpr explicit const_iterator(const T *n) : i(n) {}
202#endif
203
204 public:
206 using value_type = T;
207#ifdef QT_COMPILER_HAS_LWG3346
209#endif
211 using iterator_category = std::random_access_iterator_tag;
212 using pointer = const T *;
213 using reference = const T &;
214
215 inline constexpr const_iterator() = default;
216#ifndef QT_STRICT_QLIST_ITERATORS
217 inline constexpr explicit const_iterator(const T *n) : i(n) {}
218#endif
219 inline constexpr const_iterator(iterator o): i(o.i) {}
220 inline const T &operator*() const { return *i; }
221 inline const T *operator->() const { return i; }
222 inline const T &operator[](qsizetype j) const { return *(i + j); }
223#ifdef __cpp_lib_three_way_comparison
224 friend constexpr auto operator<=>(const_iterator, const_iterator) noexcept = default;
225 friend constexpr auto operator<=>(const_iterator a, iterator b) noexcept
226 { return a <=> const_iterator(b); }
227 friend constexpr bool operator==(const_iterator, const_iterator) noexcept = default;
228 friend constexpr bool operator==(const_iterator a, iterator b) noexcept
229 { return a == const_iterator(b); }
230#else
231 inline constexpr bool operator==(const_iterator o) const { return i == o.i; }
232 inline constexpr bool operator!=(const_iterator o) const { return i != o.i; }
233 inline constexpr bool operator<(const_iterator other) const { return i < other.i; }
234 inline constexpr bool operator<=(const_iterator other) const { return i <= other.i; }
235 inline constexpr bool operator>(const_iterator other) const { return i > other.i; }
236 inline constexpr bool operator>=(const_iterator other) const { return i >= other.i; }
237 inline constexpr bool operator==(iterator o) const { return i == o.i; }
238 inline constexpr bool operator!=(iterator o) const { return i != o.i; }
239 inline constexpr bool operator<(iterator other) const { return i < other.i; }
240 inline constexpr bool operator<=(iterator other) const { return i <= other.i; }
241 inline constexpr bool operator>(iterator other) const { return i > other.i; }
242 inline constexpr bool operator>=(iterator other) const { return i >= other.i; }
243#endif // __cpp_lib_three_way_comparison
244 inline constexpr bool operator==(pointer p) const { return i == p; }
245 inline constexpr bool operator!=(pointer p) const { return i != p; }
246 inline const_iterator &operator++() { ++i; return *this; }
247 inline const_iterator operator++(int) { auto copy = *this; ++*this; return copy; }
248 inline const_iterator &operator--() { --i; return *this; }
249 inline const_iterator operator--(int) { auto copy = *this; --*this; return copy; }
250 inline qsizetype operator-(const_iterator j) const { return i - j.i; }
251#if QT_DEPRECATED_SINCE(6, 3) && !defined(QT_STRICT_QLIST_ITERATORS)
252 QT_DEPRECATED_VERSION_X_6_3("Use operator* or operator-> rather than relying on "
253 "the implicit conversion between a QList/QVector::const_iterator "
254 "and a raw pointer")
255 inline operator const T*() const { return i; }
256
257 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, const_iterator>
258 &operator+=(Int j) { i+=j; return *this; }
259 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, const_iterator>
260 &operator-=(Int j) { i-=j; return *this; }
261 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, const_iterator>
262 operator+(Int j) const { return const_iterator(i+j); }
263 template <typename Int> std::enable_if_t<std::is_integral_v<Int>, const_iterator>
264 operator-(Int j) const { return const_iterator(i-j); }
265 template <typename Int> friend std::enable_if_t<std::is_integral_v<Int>, const_iterator>
266 operator+(Int j, const_iterator k) { return k + j; }
267#else
268 inline const_iterator &operator+=(qsizetype j) { i += j; return *this; }
269 inline const_iterator &operator-=(qsizetype j) { i -= j; return *this; }
270 inline const_iterator operator+(qsizetype j) const { return const_iterator(i + j); }
271 inline const_iterator operator-(qsizetype j) const { return const_iterator(i - j); }
272 friend inline const_iterator operator+(qsizetype j, const_iterator k) { return k + j; }
273#endif
274 };
277 using reverse_iterator = std::reverse_iterator<iterator>;
278 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
279
280private:
281 void resize_internal(qsizetype i);
282 bool isValidIterator(const_iterator i) const
283 {
284 const std::less<const T*> less = {};
285 return !less(d.end(), i.i) && !less(i.i, d.begin());
286 }
287
288 void verify([[maybe_unused]] qsizetype pos = 0, [[maybe_unused]] qsizetype n = 1) const
289 {
290 Q_ASSERT(pos >= 0);
291 Q_ASSERT(pos <= size());
292 Q_ASSERT(n >= 0);
293 Q_ASSERT(n <= size() - pos);
294 }
295public:
296 QList(DataPointer dd) noexcept
297 : d(dd)
298 {
299 }
300
301public:
302 constexpr QList() noexcept = default;
303 explicit QList(qsizetype size)
304 : d(size)
305 {
306 if (size) {
307 Q_CHECK_PTR(d.data());
308 d.appendInitialize(size);
309 }
310 }
311 QList(qsizetype size, parameter_type t)
312 : d(size)
313 {
314 if (size) {
315 Q_CHECK_PTR(d.data());
316 d->copyAppend(size, t);
317 }
318 }
319
320 inline QList(std::initializer_list<T> args)
321 : d(qsizetype(args.size()))
322 {
323 if (args.size()) {
324 Q_CHECK_PTR(d.data());
325 d->copyAppend(args.begin(), args.end());
326 }
327 }
328
329 QList<T> &operator=(std::initializer_list<T> args)
330 {
331 return assign(args);
332 }
333
334 template <typename InputIterator, if_input_iterator<InputIterator> = true>
335 QList(InputIterator i1, InputIterator i2)
336 {
337 if constexpr (!std::is_convertible_v<typename std::iterator_traits<InputIterator>::iterator_category, std::forward_iterator_tag>) {
338 std::copy(i1, i2, std::back_inserter(*this));
339 } else {
340 const auto distance = std::distance(i1, i2);
341 if (distance) {
342 d = DataPointer(qsizetype(distance));
343 Q_CHECK_PTR(d.data());
344 // appendIteratorRange can deal with contiguous iterators on its own,
345 // this is an optimization for C++17 code.
346 if constexpr (std::is_same_v<std::decay_t<InputIterator>, iterator> ||
347 std::is_same_v<std::decay_t<InputIterator>, const_iterator>) {
348 d->copyAppend(i1.i, i2.i);
349 } else {
350 d->appendIteratorRange(i1, i2);
351 }
352 }
353 }
354 }
355
356 // This constructor is here for compatibility with QStringList in Qt 5, that has a QStringList(const QString &) constructor
357 template<typename String, typename = std::enable_if_t<std::is_same_v<T, QString> && std::is_convertible_v<String, QString>>>
358 inline explicit QList(const String &str)
359 { append(str); }
360
361 QList(qsizetype size, Qt::Initialization)
362 : d(size)
363 {
364 if (size) {
365 Q_CHECK_PTR(d.data());
366 d->appendUninitialized(size);
367 }
368 }
369
370 // compiler-generated special member functions are fine!
371
372 void swap(QList &other) noexcept { d.swap(other.d); }
373
374#ifndef Q_QDOC
375private:
376 template <typename U = T,
377 Qt::if_has_qt_compare_three_way<U, U> = true>
378 friend auto compareThreeWay(const QList &lhs, const QList &rhs)
379 {
380 return QtOrderingPrivate::lexicographicalCompareThreeWay(lhs.begin(), lhs.end(),
381 rhs.begin(), rhs.end());
382 }
383
384#if defined(__cpp_lib_three_way_comparison) && defined(__cpp_lib_concepts)
385 template <typename U = T,
387 friend auto operator<=>(const QList &lhs, const QList &rhs)
388 {
390 rhs.begin(), rhs.end(),
392 }
393#endif // __cpp_lib_three_way_comparison && __cpp_lib_concepts
394
395public:
396 template <typename U = T>
398 {
399 if (size() != other.size())
400 return false;
401 if (begin() == other.begin())
402 return true;
403
404 // do element-by-element comparison
405 return std::equal(begin(), end(), other.begin(), other.end());
406 }
407
408 template <typename U = T>
410 {
411 return !(*this == other);
412 }
413
414#ifndef __cpp_lib_three_way_comparison
415 template <typename U = T>
416 QTypeTraits::compare_lt_result_container<QList, U> operator<(const QList &other) const
417 noexcept(noexcept(std::lexicographical_compare<typename QList<U>::const_iterator,
418 typename QList::const_iterator>(
419 std::declval<QList<U>>().begin(), std::declval<QList<U>>().end(),
420 other.begin(), other.end())))
421 {
422 return std::lexicographical_compare(begin(), end(),
423 other.begin(), other.end());
424 }
425
426 template <typename U = T>
428 noexcept(noexcept(other < std::declval<QList<U>>()))
429 {
430 return other < *this;
431 }
432
433 template <typename U = T>
434 QTypeTraits::compare_lt_result_container<QList, U> operator<=(const QList &other) const
435 noexcept(noexcept(other < std::declval<QList<U>>()))
436 {
437 return !(other < *this);
438 }
439
440 template <typename U = T>
442 noexcept(noexcept(std::declval<QList<U>>() < other))
443 {
444 return !(*this < other);
445 }
446#endif // __cpp_lib_three_way_comparison
447#else
448 bool operator==(const QList &other) const;
449 bool operator!=(const QList &other) const;
450 bool operator<(const QList &other) const;
451 bool operator>(const QList &other) const;
452 bool operator<=(const QList &other) const;
453 bool operator>=(const QList &other) const;
454 friend auto operator<=>(const QList &lhs, const QList &rhs);
455#endif // Q_QDOC
456
457 static constexpr qsizetype maxSize() { return Data::maxSize(); }
458 constexpr qsizetype size() const noexcept
459 {
460 constexpr size_t MaxSize = maxSize();
461 Q_PRESUME(size_t(d.size) <= MaxSize);
462 return d.size;
463 }
464 constexpr qsizetype count() const noexcept { return size(); }
465 constexpr qsizetype length() const noexcept { return size(); }
466
467 constexpr bool isEmpty() const noexcept { return size() == 0; }
468
469 void resize(qsizetype size)
470 {
471 resize_internal(size);
472 if (size > this->size())
473 d.appendInitialize(size);
474 }
475 void resize(qsizetype size, parameter_type c)
476 {
477 resize_internal(size);
478 if (size > this->size())
479 d->copyAppend(size - this->size(), c);
480 }
481 void resizeForOverwrite(qsizetype size)
482 {
483 resize_internal(size);
484 if (size > this->size())
485 d->appendUninitialized(size);
486 }
487
488 inline qsizetype capacity() const { return qsizetype(d.constAllocatedCapacity()); }
489 void reserve(qsizetype size);
490 inline void squeeze();
491
492 void detach() { d.detach(); }
493 bool isDetached() const noexcept { return !d.isShared(); }
494
495 inline bool isSharedWith(const QList<T> &other) const { return d == other.d; }
496
497 pointer data() { detach(); return d.data(); }
498 const_pointer data() const noexcept { return d.data(); }
499 const_pointer constData() const noexcept { return d.data(); }
500 void clear() {
501 if (!size())
502 return;
503 if (d.needsDetach()) {
504 // must allocate memory
505 DataPointer detached(d.allocatedCapacity());
506 d.swap(detached);
507 } else {
508 d->truncate(0);
509 }
510 }
511
512 const_reference at(qsizetype i) const noexcept
513 {
514 Q_ASSERT_X(size_t(i) < size_t(d.size), "QList::at", "index out of range");
515 return data()[i];
516 }
517 reference operator[](qsizetype i)
518 {
519 Q_ASSERT_X(size_t(i) < size_t(d.size), "QList::operator[]", "index out of range");
520 // don't detach() here, we detach in data below:
521 return data()[i];
522 }
523 const_reference operator[](qsizetype i) const noexcept { return at(i); }
524 void append(parameter_type t) { emplaceBack(t); }
526 void append(rvalue_ref t)
527 {
528 if constexpr (DataPointer::pass_parameter_by_value) {
529 Q_UNUSED(t);
530 } else {
531 emplaceBack(std::move(t));
532 }
533 }
534 void append(const QList<T> &l)
535 {
536 append(l.constBegin(), l.constEnd());
537 }
538 void append(QList<T> &&l);
539 void prepend(rvalue_ref t) {
540 if constexpr (DataPointer::pass_parameter_by_value) {
541 Q_UNUSED(t);
542 } else {
543 emplaceFront(std::move(t));
544 }
545 }
546 void prepend(parameter_type t) { emplaceFront(t); }
547
548 template<typename... Args>
549 inline reference emplaceBack(Args &&... args);
550
551 template <typename ...Args>
552 inline reference emplaceFront(Args&&... args);
553
554 iterator insert(qsizetype i, parameter_type t)
555 { return emplace(i, t); }
556 iterator insert(qsizetype i, qsizetype n, parameter_type t);
557 iterator insert(const_iterator before, parameter_type t)
558 {
559 Q_ASSERT_X(isValidIterator(before), "QList::insert", "The specified iterator argument 'before' is invalid");
560 return insert(before, 1, t);
561 }
562 iterator insert(const_iterator before, qsizetype n, parameter_type t)
563 {
564 Q_ASSERT_X(isValidIterator(before), "QList::insert", "The specified iterator argument 'before' is invalid");
565 return insert(std::distance(constBegin(), before), n, t);
566 }
567 iterator insert(const_iterator before, rvalue_ref t)
568 {
569 Q_ASSERT_X(isValidIterator(before), "QList::insert", "The specified iterator argument 'before' is invalid");
570 return insert(std::distance(constBegin(), before), std::move(t));
571 }
572 iterator insert(qsizetype i, rvalue_ref t) {
573 if constexpr (DataPointer::pass_parameter_by_value) {
574 Q_UNUSED(i);
575 Q_UNUSED(t);
576 return end();
577 } else {
578 return emplace(i, std::move(t));
579 }
580 }
581
582 QList &assign(qsizetype n, parameter_type t)
583 {
584 Q_ASSERT(n >= 0);
585 return fill(t, n);
586 }
587
588 template <typename InputIterator, if_input_iterator<InputIterator> = true>
589 QList &assign(InputIterator first, InputIterator last)
590 { d->assign(first, last); return *this; }
591
592 QList &assign(std::initializer_list<T> l)
593 {
594 if (l.size())
595 return assign(l.begin(), l.end());
596 clear();
597 return *this;
598 }
599
600 template <typename ...Args>
601 iterator emplace(const_iterator before, Args&&... args)
602 {
603 Q_ASSERT_X(isValidIterator(before), "QList::emplace", "The specified iterator argument 'before' is invalid");
604 return emplace(std::distance(constBegin(), before), std::forward<Args>(args)...);
605 }
606
607 template <typename ...Args>
608 iterator emplace(qsizetype i, Args&&... args);
609#if 0
610 template< class InputIt >
613#endif
614 void replace(qsizetype i, parameter_type t)
615 {
616 Q_ASSERT_X(i >= 0 && i < d.size, "QList<T>::replace", "index out of range");
617 DataPointer oldData;
618 d.detach(&oldData);
619 d.data()[i] = t;
620 }
621 void replace(qsizetype i, rvalue_ref t)
622 {
623 if constexpr (DataPointer::pass_parameter_by_value) {
624 Q_UNUSED(i);
625 Q_UNUSED(t);
626 } else {
627 Q_ASSERT_X(i >= 0 && i < d.size, "QList<T>::replace", "index out of range");
628 DataPointer oldData;
629 d.detach(&oldData);
630 d.data()[i] = std::move(t);
631 }
632 }
633
634 void remove(qsizetype i, qsizetype n = 1);
635 void removeFirst() noexcept;
636 void removeLast() noexcept;
638 {
639 Q_ASSERT(!isEmpty());
640 const auto eraser = qScopeGuard([&] { d->eraseFirst(); });
641 return std::move(first());
642 }
644 {
645 Q_ASSERT(!isEmpty());
646 const auto eraser = qScopeGuard([&] { d->eraseLast(); });
647 return std::move(last());
648 }
649
650 QList<T> &fill(parameter_type t, qsizetype size = -1);
651
652#ifndef Q_QDOC
653 using QListSpecialMethods<T>::contains;
654 using QListSpecialMethods<T>::indexOf;
655 using QListSpecialMethods<T>::lastIndexOf;
656#else
657 template <typename AT>
658 qsizetype indexOf(const AT &t, qsizetype from = 0) const noexcept;
659 template <typename AT>
660 qsizetype lastIndexOf(const AT &t, qsizetype from = -1) const noexcept;
661 template <typename AT>
662 bool contains(const AT &t) const noexcept;
663#endif
664
665 template <typename AT = T>
666 qsizetype count(const AT &t) const noexcept
667 {
668 return qsizetype(std::count(data(), data() + size(), t));
669 }
670
671 void removeAt(qsizetype i) { remove(i); }
672 template <typename AT = T>
673 qsizetype removeAll(const AT &t)
674 {
675 return QtPrivate::sequential_erase_with_copy(*this, t);
676 }
677
678 template <typename AT = T>
679 bool removeOne(const AT &t)
680 {
681 return QtPrivate::sequential_erase_one(*this, t);
682 }
683
684 template <typename Predicate>
685 qsizetype removeIf(Predicate pred)
686 {
687 return QtPrivate::sequential_erase_if(*this, pred);
688 }
689
690 T takeAt(qsizetype i)
691 {
692 T &t = (*this)[i]; // trigger assert, if any
693 const auto remover = qScopeGuard([&] { remove(i); });
694 return std::move(t);
695 }
696
697 void move(qsizetype from, qsizetype to)
698 {
699 Q_ASSERT_X(from >= 0 && from < size(), "QList::move(qsizetype, qsizetype)", "'from' is out-of-range");
700 Q_ASSERT_X(to >= 0 && to < size(), "QList::move(qsizetype, qsizetype)", "'to' is out-of-range");
701 if (from == to) // don't detach when no-op
702 return;
703 detach();
704 T * const b = d.begin();
705 if (from < to)
706 std::rotate(b + from, b + from + 1, b + to + 1);
707 else
708 std::rotate(b + to, b + from, b + from + 1);
709 }
710
711 // STL-style
712 iterator begin() { detach(); return iterator(d.begin()); }
713 iterator end() { detach(); return iterator(d.end()); }
714
715 const_iterator begin() const noexcept { return const_iterator(d.constBegin()); }
716 const_iterator end() const noexcept { return const_iterator(d.constEnd()); }
717 const_iterator cbegin() const noexcept { return const_iterator(d.constBegin()); }
718 const_iterator cend() const noexcept { return const_iterator(d.constEnd()); }
719 const_iterator constBegin() const noexcept { return const_iterator(d.constBegin()); }
720 const_iterator constEnd() const noexcept { return const_iterator(d.constEnd()); }
723 const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
724 const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
725 const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
726 const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
727
729 inline iterator erase(const_iterator pos) { return erase(pos, pos+1); }
730
731 // more Qt
732 inline T& first() { Q_ASSERT(!isEmpty()); return *begin(); }
733 inline const T &first() const noexcept { Q_ASSERT(!isEmpty()); return *begin(); }
734 inline const T &constFirst() const noexcept { Q_ASSERT(!isEmpty()); return *begin(); }
735 inline T& last() { Q_ASSERT(!isEmpty()); return *(end()-1); }
736 inline const T &last() const noexcept { Q_ASSERT(!isEmpty()); return *(end()-1); }
737 inline const T &constLast() const noexcept { Q_ASSERT(!isEmpty()); return *(end()-1); }
738 inline bool startsWith(parameter_type t) const { return !isEmpty() && first() == t; }
739 inline bool endsWith(parameter_type t) const { return !isEmpty() && last() == t; }
740 QList<T> mid(qsizetype pos, qsizetype len = -1) const;
741
742 QList<T> first(qsizetype n) const
743 { verify(0, n); return QList<T>(begin(), begin() + n); }
744 QList<T> last(qsizetype n) const
745 { verify(0, n); return QList<T>(end() - n, end()); }
746 QList<T> sliced(qsizetype pos) const
747 { verify(pos, 0); return QList<T>(begin() + pos, end()); }
748 QList<T> sliced(qsizetype pos, qsizetype n) const
749 { verify(pos, n); return QList<T>(begin() + pos, begin() + pos + n); }
750
751 T value(qsizetype i) const { return value(i, T()); }
752 T value(qsizetype i, parameter_type defaultValue) const;
753
754 void swapItemsAt(qsizetype i, qsizetype j) {
755 Q_ASSERT_X(i >= 0 && i < size() && j >= 0 && j < size(),
756 "QList<T>::swap", "index out of range");
757 detach();
758 qSwap(d.begin()[i], d.begin()[j]);
759 }
760
761 // STL compatibility
762 inline void push_back(parameter_type t) { append(t); }
763 void push_back(rvalue_ref t) { append(std::move(t)); }
764 void push_front(rvalue_ref t) { prepend(std::move(t)); }
765 inline void push_front(parameter_type t) { prepend(t); }
766 void pop_back() noexcept { removeLast(); }
767 void pop_front() noexcept { removeFirst(); }
768
769 template <typename ...Args>
770 reference emplace_back(Args&&... args) { return emplaceBack(std::forward<Args>(args)...); }
771
772 inline bool empty() const noexcept
773 { return d.size == 0; }
774 inline reference front() { return first(); }
775 inline const_reference front() const noexcept { return first(); }
776 inline reference back() { return last(); }
777 inline const_reference back() const noexcept { return last(); }
779 constexpr qsizetype max_size() const noexcept
780 {
781 return maxSize();
782 }
783
784 // comfort
785 QList<T> &operator+=(const QList<T> &l) { append(l); return *this; }
786 QList<T> &operator+=(QList<T> &&l) { append(std::move(l)); return *this; }
787 inline QList<T> operator+(const QList<T> &l) const &
788 { QList n = *this; n += l; return n; }
789 QList<T> operator+(const QList<T> &l) &&
790 { return std::move(*this += l); }
791 inline QList<T> operator+(QList<T> &&l) const &
792 { QList n = *this; n += std::move(l); return n; }
793 QList<T> operator+(QList<T> &&l) &&
794 { return std::move(*this += std::move(l)); }
795 inline QList<T> &operator+=(parameter_type t)
796 { append(t); return *this; }
797 inline QList<T> &operator<< (parameter_type t)
798 { append(t); return *this; }
799 inline QList<T> &operator<<(const QList<T> &l)
800 { *this += l; return *this; }
801 inline QList<T> &operator<<(QList<T> &&l)
802 { *this += std::move(l); return *this; }
803 inline QList<T> &operator+=(rvalue_ref t)
804 { append(std::move(t)); return *this; }
805 inline QList<T> &operator<<(rvalue_ref t)
806 { append(std::move(t)); return *this; }
807
808 // Consider deprecating in 6.4 or later
809 static QList<T> fromList(const QList<T> &list) noexcept { return list; }
810 QList<T> toList() const noexcept { return *this; }
811
812 static inline QList<T> fromVector(const QList<T> &vector) noexcept { return vector; }
813 inline QList<T> toVector() const noexcept { return *this; }
814
815 template<qsizetype N>
816 static QList<T> fromReadOnlyData(const T (&t)[N]) noexcept
817 {
818 return QList<T>({ nullptr, const_cast<T *>(t), N });
819 }
820};
821
822template <typename InputIterator,
823 typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
824 QtPrivate::IfIsInputIterator<InputIterator> = true>
825QList(InputIterator, InputIterator) -> QList<ValueType>;
826
827template <typename T>
828inline void QList<T>::resize_internal(qsizetype newSize)
829{
830 Q_ASSERT(newSize >= 0);
831
832 if (d.needsDetach() || newSize > capacity() - d.freeSpaceAtBegin()) {
833 d.detachAndGrow(QArrayData::GrowsAtEnd, newSize - d.size, nullptr, nullptr);
834 } else if (newSize < size()) {
835 d->truncate(newSize);
836 }
837}
838
839template <typename T>
840void QList<T>::reserve(qsizetype asize)
841{
842 // capacity() == 0 for immutable data, so this will force a detaching below
843 if (asize <= capacity() - d.freeSpaceAtBegin()) {
844 if (d.flags() & Data::CapacityReserved)
845 return; // already reserved, don't shrink
846 if (!d.isShared()) {
847 // accept current allocation, don't shrink
848 d.setFlag(Data::CapacityReserved);
849 return;
850 }
851 }
852
853 qsizetype newSize = qMax(asize, size());
854 DataPointer detached(newSize);
855 if (newSize)
856 Q_CHECK_PTR(detached.data());
857 detached->copyAppend(d.begin(), d.end());
858 if (detached.d_ptr())
859 detached.setFlag(Data::CapacityReserved);
860 d.swap(detached);
861}
862
863template <typename T>
864inline void QList<T>::squeeze()
865{
866 if (!d.isMutable())
867 return;
868 if (d.needsDetach() || size() < capacity()) {
869 // must allocate memory
870 DataPointer detached(size());
871 if (size()) {
872 Q_CHECK_PTR(detached.data());
873 if (d.needsDetach())
874 detached->copyAppend(d.data(), d.data() + d.size);
875 else
876 detached->moveAppend(d.data(), d.data() + d.size);
877 }
878 d.swap(detached);
879 }
880 // We're detached so this is fine
881 d.clearFlag(Data::CapacityReserved);
882}
883
884template <typename T>
885inline void QList<T>::remove(qsizetype i, qsizetype n)
886{
887 Q_ASSERT_X(size_t(i) + size_t(n) <= size_t(d.size), "QList::remove", "index out of range");
888 Q_ASSERT_X(n >= 0, "QList::remove", "invalid count");
889
890 if (n == 0)
891 return;
892
893 d.detach();
894 d->erase(d.begin() + i, n);
895}
896
897template <typename T>
898inline void QList<T>::removeFirst() noexcept
899{
900 Q_ASSERT(!isEmpty());
901 d.detach();
902 d->eraseFirst();
903}
904
905template <typename T>
906inline void QList<T>::removeLast() noexcept
907{
908 Q_ASSERT(!isEmpty());
909 d.detach();
910 d->eraseLast();
911}
912
913
914template<typename T>
915inline T QList<T>::value(qsizetype i, parameter_type defaultValue) const
916{
917 return size_t(i) < size_t(d.size) ? at(i) : defaultValue;
918}
919
920template <typename T>
922{
923 d->growAppend(i1.i, i2.i);
924}
925
926template <typename T>
927inline void QList<T>::append(QList<T> &&other)
928{
929 Q_ASSERT(&other != this);
930 if (other.isEmpty())
931 return;
932 if (other.d.needsDetach() || !std::is_nothrow_move_constructible_v<T>)
933 return append(other);
934
935 // due to precondition &other != this, we can unconditionally modify 'this'
936 d.detachAndGrow(QArrayData::GrowsAtEnd, other.size(), nullptr, nullptr);
937 Q_ASSERT(d.freeSpaceAtEnd() >= other.size());
938 d->moveAppend(other.d.begin(), other.d.end());
939}
940
941template<typename T>
942template<typename... Args>
943inline typename QList<T>::reference QList<T>::emplaceFront(Args &&... args)
944{
945 d->emplace(0, std::forward<Args>(args)...);
946 return *d.begin();
947}
948
949
950template <typename T>
951inline typename QList<T>::iterator
952QList<T>::insert(qsizetype i, qsizetype n, parameter_type t)
953{
954 Q_ASSERT_X(size_t(i) <= size_t(d.size), "QList<T>::insert", "index out of range");
955 Q_ASSERT_X(n >= 0, "QList::insert", "invalid count");
956 if (Q_LIKELY(n))
957 d->insert(i, n, t);
958 return begin() + i;
959}
960
961template <typename T>
962template <typename ...Args>
963typename QList<T>::iterator
964QList<T>::emplace(qsizetype i, Args&&... args)
965{
966 Q_ASSERT_X(i >= 0 && i <= d.size, "QList<T>::insert", "index out of range");
967 d->emplace(i, std::forward<Args>(args)...);
968 return begin() + i;
969}
970
971template<typename T>
972template<typename... Args>
973inline typename QList<T>::reference QList<T>::emplaceBack(Args &&... args)
974{
975 d->emplace(d.size, std::forward<Args>(args)...);
976 return *(end() - 1);
977}
978
979template <typename T>
981{
982 Q_ASSERT_X(isValidIterator(abegin), "QList::erase", "The specified iterator argument 'abegin' is invalid");
983 Q_ASSERT_X(isValidIterator(aend), "QList::erase", "The specified iterator argument 'aend' is invalid");
984 Q_ASSERT(aend >= abegin);
985
986 qsizetype i = std::distance(constBegin(), abegin);
987 qsizetype n = std::distance(abegin, aend);
988 remove(i, n);
989
990 return begin() + i;
991}
992
993template <typename T>
994inline QList<T> &QList<T>::fill(parameter_type t, qsizetype newSize)
995{
996 if (newSize == -1)
997 newSize = size();
998 if (d.needsDetach() || newSize > capacity()) {
999 // must allocate memory
1000 DataPointer detached(d.detachCapacity(newSize));
1001 detached->copyAppend(newSize, t);
1002 d.swap(detached);
1003 } else {
1004 // we're detached
1005 const T copy(t);
1006 d->assign(d.begin(), d.begin() + qMin(size(), newSize), t);
1007 if (newSize > size()) {
1008 d->copyAppend(newSize - size(), copy);
1009 } else if (newSize < size()) {
1010 d->truncate(newSize);
1011 }
1012 }
1013 return *this;
1014}
1015
1016namespace QtPrivate {
1017template <typename T, typename U>
1018qsizetype indexOf(const QList<T> &vector, const U &u, qsizetype from) noexcept
1019{
1020 if (from < 0)
1021 from = qMax(from + vector.size(), qsizetype(0));
1022 if (from < vector.size()) {
1023 auto n = vector.begin() + from - 1;
1024 auto e = vector.end();
1025 while (++n != e)
1026 if (*n == u)
1027 return qsizetype(n - vector.begin());
1028 }
1029 return -1;
1030}
1031
1032template <typename T, typename U>
1033qsizetype lastIndexOf(const QList<T> &vector, const U &u, qsizetype from) noexcept
1034{
1035 if (from < 0)
1036 from += vector.d.size;
1037 else if (from >= vector.size())
1038 from = vector.size() - 1;
1039 if (from >= 0) {
1040 auto b = vector.begin();
1041 auto n = vector.begin() + from + 1;
1042 while (n != b) {
1043 if (*--n == u)
1044 return qsizetype(n - b);
1045 }
1046 }
1047 return -1;
1048}
1049}
1050
1051template <typename T>
1052template <typename AT>
1053qsizetype QListSpecialMethodsBase<T>::indexOf(const AT &t, qsizetype from) const noexcept
1054{
1055 return QtPrivate::indexOf(*self(), t, from);
1056}
1057
1058template <typename T>
1059template <typename AT>
1060qsizetype QListSpecialMethodsBase<T>::lastIndexOf(const AT &t, qsizetype from) const noexcept
1061{
1062 return QtPrivate::lastIndexOf(*self(), t, from);
1063}
1064
1065template <typename T>
1066inline QList<T> QList<T>::mid(qsizetype pos, qsizetype len) const
1067{
1068 qsizetype p = pos;
1069 qsizetype l = len;
1070 using namespace QtPrivate;
1071 switch (QContainerImplHelper::mid(d.size, &p, &l)) {
1072 case QContainerImplHelper::Null:
1073 case QContainerImplHelper::Empty:
1074 return QList();
1075 case QContainerImplHelper::Full:
1076 return *this;
1077 case QContainerImplHelper::Subset:
1078 break;
1079 }
1080
1081 // Allocate memory
1082 DataPointer copied(l);
1083 copied->copyAppend(data() + p, data() + p + l);
1084 return copied;
1085}
1086
1087Q_DECLARE_SEQUENTIAL_ITERATOR(List)
1088Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(List)
1089
1090template <typename T>
1091size_t qHash(const QList<T> &key, size_t seed = 0)
1092 noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
1093{
1094 return qHashRange(key.cbegin(), key.cend(), seed);
1095}
1096
1097template <typename T, typename AT>
1098qsizetype erase(QList<T> &list, const AT &t)
1099{
1100 return QtPrivate::sequential_erase(list, t);
1101}
1102
1103template <typename T, typename Predicate>
1104qsizetype erase_if(QList<T> &list, Predicate pred)
1105{
1106 return QtPrivate::sequential_erase_if(list, pred);
1107}
1108
1109// ### Qt 7 char32_t
1110QList<uint> QStringView::toUcs4() const { return QtPrivate::convertToUcs4(*this); }
1111
1112QT_END_NAMESPACE
1113
1114#include <QtCore/qbytearraylist.h>
1115#include <QtCore/qstringlist.h>
1116
1117#endif // QLIST_H
\inmodule QtCore\reentrant
Definition qdatastream.h:50
constexpr bool operator==(iterator o) const
Definition qlist.h:237
constexpr bool operator<(iterator other) const
Definition qlist.h:239
constexpr bool operator<(const_iterator other) const
Definition qlist.h:233
const_iterator operator-(qsizetype j) const
Definition qlist.h:271
constexpr bool operator==(pointer p) const
Definition qlist.h:244
const T & reference
Definition qlist.h:213
constexpr bool operator>(const_iterator other) const
Definition qlist.h:235
std::random_access_iterator_tag iterator_category
Definition qlist.h:211
const T & operator[](qsizetype j) const
Definition qlist.h:222
const_iterator & operator-=(qsizetype j)
Definition qlist.h:269
constexpr const_iterator(iterator o)
Definition qlist.h:219
constexpr const_iterator()=default
const T & operator*() const
Definition qlist.h:220
constexpr bool operator!=(const_iterator o) const
Definition qlist.h:232
const_iterator operator+(qsizetype j) const
Definition qlist.h:270
const T * pointer
Definition qlist.h:212
constexpr bool operator<=(iterator other) const
Definition qlist.h:240
const value_type element_type
Definition qlist.h:210
const_iterator & operator++()
Definition qlist.h:246
constexpr bool operator!=(pointer p) const
Definition qlist.h:245
constexpr bool operator>(iterator other) const
Definition qlist.h:241
qsizetype operator-(const_iterator j) const
Definition qlist.h:250
constexpr bool operator==(const_iterator o) const
Definition qlist.h:231
constexpr bool operator>=(iterator other) const
Definition qlist.h:242
const_iterator operator--(int)
Definition qlist.h:249
const_iterator & operator--()
Definition qlist.h:248
const_iterator operator++(int)
Definition qlist.h:247
constexpr bool operator!=(iterator o) const
Definition qlist.h:238
const_iterator & operator+=(qsizetype j)
Definition qlist.h:268
friend const_iterator operator+(qsizetype j, const_iterator k)
Definition qlist.h:272
constexpr bool operator<=(const_iterator other) const
Definition qlist.h:234
const T * operator->() const
Definition qlist.h:221
constexpr bool operator>=(const_iterator other) const
Definition qlist.h:236
constexpr bool operator>(iterator other) const
Definition qlist.h:155
iterator operator+(qsizetype j) const
Definition qlist.h:190
iterator & operator-=(qsizetype j)
Definition qlist.h:189
T & operator[](qsizetype j) const
Definition qlist.h:146
iterator & operator++()
Definition qlist.h:166
constexpr bool operator<(const_iterator other) const
Definition qlist.h:159
constexpr bool operator!=(pointer p) const
Definition qlist.h:165
constexpr bool operator<=(iterator other) const
Definition qlist.h:154
constexpr bool operator!=(iterator o) const
Definition qlist.h:152
constexpr bool operator<=(const_iterator other) const
Definition qlist.h:160
T & operator*() const
Definition qlist.h:144
iterator operator++(int)
Definition qlist.h:167
constexpr bool operator>(const_iterator other) const
Definition qlist.h:161
constexpr bool operator>=(iterator other) const
Definition qlist.h:156
constexpr bool operator<(iterator other) const
Definition qlist.h:153
friend iterator operator+(qsizetype j, iterator k)
Definition qlist.h:192
std::random_access_iterator_tag iterator_category
Definition qlist.h:136
constexpr bool operator!=(const_iterator o) const
Definition qlist.h:158
constexpr bool operator==(const_iterator o) const
Definition qlist.h:157
constexpr bool operator>=(const_iterator other) const
Definition qlist.h:162
qsizetype operator-(iterator j) const
Definition qlist.h:170
iterator & operator--()
Definition qlist.h:168
constexpr iterator()=default
T * operator->() const
Definition qlist.h:145
iterator operator-(qsizetype j) const
Definition qlist.h:191
value_type element_type
Definition qlist.h:135
constexpr bool operator==(iterator o) const
Definition qlist.h:151
iterator & operator+=(qsizetype j)
Definition qlist.h:188
constexpr bool operator==(pointer p) const
Definition qlist.h:164
iterator operator--(int)
Definition qlist.h:169
Definition qlist.h:82
void append(const_iterator i1, const_iterator i2)
Definition qlist.h:921
void pop_back() noexcept
Definition qlist.h:766
iterator insert(const_iterator before, parameter_type t)
Definition qlist.h:557
void removeFirst() noexcept
Definition qlist.h:898
QList< T > & fill(parameter_type t, qsizetype size=-1)
Definition qlist.h:994
const_pointer constData() const noexcept
Definition qlist.h:499
void push_front(rvalue_ref t)
Definition qlist.h:764
T & first()
Definition qlist.h:732
T & last()
Definition qlist.h:735
QList(const String &str)
Definition qlist.h:358
const_iterator begin() const noexcept
Definition qlist.h:715
bool isDetached() const noexcept
Definition qlist.h:493
void removeAt(qsizetype i)
Definition qlist.h:671
reference back()
Definition qlist.h:776
QList< T > last(qsizetype n) const
Definition qlist.h:744
bool isSharedWith(const QList< T > &other) const
Definition qlist.h:495
QList< T > & operator+=(const QList< T > &l)
Definition qlist.h:785
QList< T > operator+(const QList< T > &l) &&
Definition qlist.h:789
reference emplaceFront(Args &&... args)
Definition qlist.h:943
reference emplace_back(Args &&... args)
Definition qlist.h:770
const T & constLast() const noexcept
Definition qlist.h:737
iterator erase(const_iterator begin, const_iterator end)
Definition qlist.h:980
iterator Iterator
Definition qlist.h:275
void resizeForOverwrite(qsizetype size)
Definition qlist.h:481
QList< T > sliced(qsizetype pos, qsizetype n) const
Definition qlist.h:748
QList(std::initializer_list< T > args)
Definition qlist.h:320
constexpr qsizetype max_size() const noexcept
Definition qlist.h:779
QTypeTraits::compare_eq_result_container< QList, U > operator==(const QList &other) const
Definition qlist.h:397
iterator insert(qsizetype i, parameter_type t)
Definition qlist.h:554
bool empty() const noexcept
Definition qlist.h:772
bool removeOne(const AT &t)
Definition qlist.h:679
QList< T > toList() const noexcept
Definition qlist.h:810
QList(InputIterator i1, InputIterator i2)
Definition qlist.h:335
static QList< T > fromReadOnlyData(const T(&t)[N]) noexcept
Definition qlist.h:816
static QList< T > fromList(const QList< T > &list) noexcept
Definition qlist.h:809
QList(qsizetype size, parameter_type t)
Definition qlist.h:311
const_reference back() const noexcept
Definition qlist.h:777
qsizetype capacity() const
Definition qlist.h:488
void swapItemsAt(qsizetype i, qsizetype j)
Definition qlist.h:754
void push_back(parameter_type t)
Definition qlist.h:762
void shrink_to_fit()
Definition qlist.h:778
QList< T > operator+(const QList< T > &l) const &
Definition qlist.h:787
void detach()
Definition qlist.h:492
const_iterator end() const noexcept
Definition qlist.h:716
iterator erase(const_iterator pos)
Definition qlist.h:729
bool endsWith(parameter_type t) const
Definition qlist.h:739
qsizetype count(const AT &t) const noexcept
Definition qlist.h:666
bool startsWith(parameter_type t) const
Definition qlist.h:738
const T * const_pointer
Definition qlist.h:102
friend qsizetype QtPrivate::lastIndexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
iterator end()
Definition qlist.h:713
QList< T > operator+(QList< T > &&l) &&
Definition qlist.h:793
T takeAt(qsizetype i)
Definition qlist.h:690
std::reverse_iterator< iterator > reverse_iterator
Definition qlist.h:277
const_reference at(qsizetype i) const noexcept
Definition qlist.h:512
value_type takeFirst()
Definition qlist.h:637
constexpr qsizetype size() const noexcept
Definition qlist.h:458
QList< T > sliced(qsizetype pos) const
Definition qlist.h:746
QList< T > toVector() const noexcept
Definition qlist.h:813
T value(qsizetype i) const
Definition qlist.h:751
void swap(QList &other) noexcept
Definition qlist.h:372
iterator insert(const_iterator before, qsizetype n, parameter_type t)
Definition qlist.h:562
QList< T > & operator=(std::initializer_list< T > args)
Definition qlist.h:329
void move(qsizetype from, qsizetype to)
Definition qlist.h:697
QList(DataPointer dd) noexcept
Definition qlist.h:296
const_reverse_iterator crbegin() const noexcept
Definition qlist.h:725
T * pointer
Definition qlist.h:101
reference operator[](qsizetype i)
Definition qlist.h:517
const_iterator constBegin() const noexcept
Definition qlist.h:719
const_reference operator[](qsizetype i) const noexcept
Definition qlist.h:523
const_reverse_iterator rbegin() const noexcept
Definition qlist.h:723
constexpr QList() noexcept=default
void remove(qsizetype i, qsizetype n=1)
Definition qlist.h:885
value_type takeLast()
Definition qlist.h:643
const DataPointer & data_ptr() const &
Definition qlist.h:116
qsizetype removeIf(Predicate pred)
Definition qlist.h:685
reference front()
Definition qlist.h:774
DataPointer & data_ptr() &
Definition qlist.h:115
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition qlist.h:278
qsizetype removeAll(const AT &t)
Definition qlist.h:673
iterator emplace(qsizetype i, Args &&... args)
Definition qlist.h:964
const T & first() const noexcept
Definition qlist.h:733
iterator insert(qsizetype i, qsizetype n, parameter_type t)
Definition qlist.h:952
void append(QList< T > &&l)
Definition qlist.h:927
T & reference
Definition qlist.h:103
void squeeze()
Definition qlist.h:864
reference emplaceBack(Args &&... args)
Definition qlist.h:973
QList< T > mid(qsizetype pos, qsizetype len=-1) const
Definition qlist.h:1066
reverse_iterator rend()
Definition qlist.h:722
QTypeTraits::compare_lt_result_container< QList, U > operator>(const QList &other) const noexcept(noexcept(other< std::declval< QList< U > >()))
Definition qlist.h:427
T value_type
Definition qlist.h:100
void prepend(rvalue_ref t)
Definition qlist.h:539
QList< T > operator+(QList< T > &&l) const &
Definition qlist.h:791
QList & assign(std::initializer_list< T > l)
Definition qlist.h:592
iterator begin()
Definition qlist.h:712
void resize(qsizetype size, parameter_type c)
Definition qlist.h:475
QList< T > first(qsizetype n) const
Definition qlist.h:742
const T & constFirst() const noexcept
Definition qlist.h:734
static constexpr qsizetype maxSize()
Definition qlist.h:457
iterator emplace(const_iterator before, Args &&... args)
Definition qlist.h:601
void reserve(qsizetype size)
Definition qlist.h:840
QList & assign(InputIterator first, InputIterator last)
Definition qlist.h:589
static QList< T > fromVector(const QList< T > &vector) noexcept
Definition qlist.h:812
void replace(qsizetype i, parameter_type t)
Definition qlist.h:614
reverse_iterator rbegin()
Definition qlist.h:721
void pop_front() noexcept
Definition qlist.h:767
constexpr bool isEmpty() const noexcept
Definition qlist.h:467
pointer data()
Definition qlist.h:497
const T & const_reference
Definition qlist.h:104
const T & last() const noexcept
Definition qlist.h:736
constexpr qsizetype count() const noexcept
Definition qlist.h:464
void removeLast() noexcept
Definition qlist.h:906
void resize(qsizetype size)
Definition qlist.h:469
friend auto compareThreeWay(const QList &lhs, const QList &rhs)
Definition qlist.h:378
T Type
Definition qlist.h:99
const_iterator cend() const noexcept
Definition qlist.h:718
void append(parameter_type t)
Definition qlist.h:524
QList< T > & operator+=(parameter_type t)
Definition qlist.h:795
QTypeTraits::compare_eq_result_container< QList, U > operator!=(const QList &other) const
Definition qlist.h:409
const_iterator constEnd() const noexcept
Definition qlist.h:720
const_reverse_iterator rend() const noexcept
Definition qlist.h:724
T value(qsizetype i, parameter_type defaultValue) const
Definition qlist.h:915
const_iterator cbegin() const noexcept
Definition qlist.h:717
QList & assign(qsizetype n, parameter_type t)
Definition qlist.h:582
QTypeTraits::compare_lt_result_container< QList, U > operator>=(const QList &other) const noexcept(noexcept(std::declval< QList< U > >()< other))
Definition qlist.h:441
const_pointer data() const noexcept
Definition qlist.h:498
constexpr qsizetype length() const noexcept
Definition qlist.h:465
void clear()
Definition qlist.h:500
const_reference front() const noexcept
Definition qlist.h:775
QList< T > & operator+=(QList< T > &&l)
Definition qlist.h:786
friend qsizetype QtPrivate::indexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
DataPointer && data_ptr() &&
Definition qlist.h:117
void append(const QList< T > &l)
Definition qlist.h:534
const_iterator ConstIterator
Definition qlist.h:276
const_reverse_iterator crend() const noexcept
Definition qlist.h:726
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:177
Combined button and popup list for selecting options.
QString && asString(QString &&s)
Definition qstring.h:1701
constexpr QAnyStringArg qStringLikeToArg(QAnyStringView s) noexcept
Definition qstring.h:1763
qsizetype indexOf(const QList< T > &vector, const U &u, qsizetype from) noexcept
Definition qlist.h:1018
const QString & asString(const QString &s)
Definition qstring.h:1700
qsizetype lastIndexOf(const QList< T > &vector, const U &u, qsizetype from) noexcept
Definition qlist.h:1033
qsizetype lastIndexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
constexpr qsizetype lengthHelperPointer(const Char *data) noexcept
qsizetype indexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
std::is_same< Char, char32_t > IsCompatibleChar32TypeHelper
Definition qstring.h:57
constexpr bool isLatin1(QLatin1StringView s) noexcept
Definition qstring.h:77
QString operator""_s(const char16_t *str, size_t size) noexcept
Definition qstring.h:1809
Definition qcompare.h:111
QByteArrayView qToByteArrayViewIgnoringNull(const QByteArrayLike &b) noexcept
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
#define __has_builtin(x)
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION unsigned int qt_int_sqrt(unsigned int n)
\inmodule QtCore \title Global Qt Declarations
Definition qglobal.cpp:100
qsizetype erase(QList< T > &list, const AT &t)
Definition qlist.h:1098
QList(InputIterator, InputIterator) -> QList< ValueType >
qsizetype erase_if(QList< T > &list, Predicate pred)
Definition qlist.h:1104
QString operator+(const QString &s1, QChar s2)
Definition qstring.h:1564
QString operator+(QString &&lhs, const QString &rhs)
Definition qstring.h:1562
qsizetype erase_if(QString &s, Predicate pred)
Definition qstring.h:1801
#define QT_UNICODE_LITERAL(str)
Definition qstring.h:1835
QString operator+(QString &&lhs, QChar rhs)
Definition qstring.h:1566
QString operator+(QChar s1, const QString &s2)
Definition qstring.h:1568
QString operator+(const QString &s1, const QString &s2)
Definition qstring.h:1560
qsizetype erase(QString &s, const T &t)
Definition qstring.h:1795
QList< QList< qInternalCallback > > callbacks
Definition qglobal.cpp:129
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
Definition qlist.h:1053
const Self * self() const
Definition qlist.h:41
bool contains(const AT &t) const noexcept
Definition qlist.h:50
QListSpecialMethodsBase()=default
qsizetype lastIndexOf(const AT &t, qsizetype from=-1) const noexcept
Definition qlist.h:1060
QListSpecialMethods()=default
constexpr QAnyStringArg(QAnyStringView v) noexcept
Definition qstring.h:1747
QAnyStringView string
Definition qstring.h:1745
QLatin1StringView string
Definition qstring.h:1739
constexpr QLatin1StringArg(QLatin1StringView v) noexcept
Definition qstring.h:1741
constexpr QStringViewArg(QStringView v) noexcept
Definition qstring.h:1735