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