8#include <QtCore/qarraydatapointer.h>
9#include <QtCore/qnamespace.h>
10#include <QtCore/qhashfunctions.h>
11#include <QtCore/qiterator.h>
12#include <QtCore/qcontainertools_impl.h>
16#include <initializer_list>
35 const Self *
self()
const {
return static_cast<const Self *
>(
this); }
38 template <
typename AT = T>
40 template <typename
AT = T>
43 template <typename
AT = T>
61#if !defined(QT_STRICT_QLIST_ITERATORS) && (QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)) && !defined(Q_OS_WIN)
62#define QT_STRICT_QLIST_ITERATORS
78 class DisableRValueRefs {};
80 friend class ::tst_QList;
87 template <
typename InputIterator>
101 using rvalue_ref =
typename std::conditional<DataPointer::pass_parameter_by_value, DisableRValueRefs, T &&>::type;
109 friend class QList<T>;
112#ifdef QT_STRICT_QLIST_ITERATORS
120#if __cplusplus >= 202002L && (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE >= 11)
121 using iterator_concept = std::contiguous_iterator_tag;
129#ifndef QT_STRICT_QLIST_ITERATORS
154#if QT_DEPRECATED_SINCE(6, 3) && !defined(QT_STRICT_QLIST_ITERATORS)
156 "the implicit conversion between a QList/QVector::iterator "
158 inline operator T*()
const {
return i; }
160 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
iterator>
162 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
iterator>
164 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
iterator>
166 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
iterator>
168 template <
typename Int>
friend std::enable_if_t<std::is_integral_v<Int>,
iterator>
180 friend class QList<T>;
182 const T *
i =
nullptr;
183#ifdef QT_STRICT_QLIST_ITERATORS
191#if __cplusplus >= 202002L && (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE >= 11)
192 using iterator_concept = std::contiguous_iterator_tag;
200#ifndef QT_STRICT_QLIST_ITERATORS
226#if QT_DEPRECATED_SINCE(6, 3) && !defined(QT_STRICT_QLIST_ITERATORS)
228 "the implicit conversion between a QList/QVector::const_iterator "
230 inline operator const T*()
const {
return i; }
232 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
const_iterator>
234 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
const_iterator>
236 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
const_iterator>
238 template <
typename Int> std::enable_if_t<std::is_integral_v<Int>,
const_iterator>
240 template <
typename Int>
friend std::enable_if_t<std::is_integral_v<Int>,
const_iterator>
259 const std::less<const T*> less = {};
260 return !less(
d->end(),
i.i) && !less(
i.i,
d->begin());
274 d->appendInitialize(
size);
298 template <
typename InputIterator, if_input_iterator<InputIterator> = true>
299 QList(InputIterator i1, InputIterator i2)
301 if constexpr (!std::is_convertible_v<typename std::iterator_traits<InputIterator>::iterator_category, std::forward_iterator_tag>) {
302 std::copy(i1, i2, std::back_inserter(*
this));
304 const auto distance = std::distance(i1, i2);
309 if constexpr (std::is_same_v<std::decay_t<InputIterator>,
iterator> ||
311 d->copyAppend(i1.i, i2.i);
313 d->appendIteratorRange(i1, i2);
320 template<
typename String,
typename = std::enable_if_t<std::is_same_v<T, QString> && std::is_convertible_v<String, QString>>>
329 template <
typename U = T>
340 template <
typename U = T>
343 return !(*
this ==
other);
346 template <
typename U = T>
348 noexcept(
noexcept(std::lexicographical_compare<typename QList<U>::const_iterator,
350 std::declval<QList<U>>().
begin(), std::declval<QList<U>>().
end(),
353 return std::lexicographical_compare(
begin(),
end(),
357 template <
typename U = T>
359 noexcept(
noexcept(other < std::declval<QList<U>>()))
361 return other < *
this;
364 template <
typename U = T>
366 noexcept(
noexcept(other < std::declval<QList<U>>()))
368 return !(
other < *
this);
371 template <
typename U = T>
373 noexcept(
noexcept(std::declval<QList<U>>() <
other))
375 return !(*
this <
other);
390 inline bool isEmpty() const noexcept {
return d->size == 0; }
394 resize_internal(
size);
400 resize_internal(
size);
420 if (
d->needsDetach()) {
431 Q_ASSERT_X(
size_t(
i) <
size_t(
d->size),
"QList::at",
"index out of range");
436 Q_ASSERT_X(
size_t(
i) <
size_t(
d->size),
"QList::operator[]",
"index out of range");
442 void append(const_iterator i1, const_iterator i2);
465 template<
typename... Args>
468 template <
typename ...Args>
476 Q_ASSERT_X(isValidIterator(before),
"QList::insert",
"The specified iterator argument 'before' is invalid");
481 Q_ASSERT_X(isValidIterator(before),
"QList::insert",
"The specified iterator argument 'before' is invalid");
486 Q_ASSERT_X(isValidIterator(before),
"QList::insert",
"The specified iterator argument 'before' is invalid");
505 template <
typename InputIterator, if_input_iterator<InputIterator> = true>
510 {
return assign(l.begin(), l.end()); }
512 template <
typename ...Args>
515 Q_ASSERT_X(isValidIterator(before),
"QList::emplace",
"The specified iterator argument 'before' is invalid");
519 template <
typename ...Args>
522 template<
class InputIt >
524 iterator
insert( const_iterator
pos, std::initializer_list<T> ilist );
528 Q_ASSERT_X(
i >= 0 && i < d->
size,
"QList<T>::replace",
"index out of range");
539 Q_ASSERT_X(
i >= 0 && i < d->
size,
"QList<T>::replace",
"index out of range");
542 d.data()[
i] = std::move(
t);
559 template <
typename AT>
561 template <typename
AT>
563 template <typename
AT>
567 template <
typename AT = T>
574 template <
typename AT = T>
580 template <
typename AT = T>
586 template <
typename Predicate>
595 Q_ASSERT_X(from >= 0 && from <
size(),
"QList::move(qsizetype, qsizetype)",
"'from' is out-of-range");
596 Q_ASSERT_X(to >= 0 && to <
size(),
"QList::move(qsizetype, qsizetype)",
"'to' is out-of-range");
600 T *
const b =
d->begin();
602 std::rotate(
b + from,
b + from + 1,
b + to + 1);
604 std::rotate(
b + to,
b + from,
b + from + 1);
666 "QList<T>::swap",
"index out of range");
679 template <
typename ...Args>
683 {
return d->size == 0; }
694 {
QList n = *
this;
n += l;
return n; }
696 {
return std::move(*
this += l); }
698 {
QList n = *
this;
n += std::move(l);
return n; }
700 {
return std::move(*
this += std::move(l)); }
706 { *
this += l;
return *
this; }
708 { *
this += std::move(l);
return *
this; }
710 {
append(std::move(
t));
return *
this; }
712 {
append(std::move(
t));
return *
this; }
721 template<qsizetype N>
724 return QList<T>({
nullptr,
const_cast<T *
>(
t), N });
728template <
typename InputIterator,
729 typename ValueType =
typename std::iterator_traits<InputIterator>::value_type,
738 if (
d->needsDetach() || newSize >
capacity() -
d.freeSpaceAtBegin()) {
740 }
else if (newSize <
size()) {
741 d->truncate(newSize);
749 if (asize <=
capacity() -
d.freeSpaceAtBegin()) {
750 if (
d->flags() & Data::CapacityReserved)
752 if (!
d->isShared()) {
754 d->setFlag(Data::CapacityReserved);
761 if (detached.
d_ptr())
762 detached->
setFlag(Data::CapacityReserved);
783 d->clearFlag(Data::CapacityReserved);
789 Q_ASSERT_X(
size_t(
i) +
size_t(
n) <=
size_t(
d->size),
"QList::remove",
"index out of range");
790 Q_ASSERT_X(
n >= 0,
"QList::remove",
"invalid count");
796 d->erase(
d->begin() +
i,
n);
819 return size_t(
i) < size_t(
d->size) ?
at(
i) : defaultValue;
825 d->growAppend(i1.i, i2.i);
834 if (
other.d->needsDetach() || !std::is_nothrow_move_constructible_v<T>)
844template<
typename... Args>
847 d->emplace(0, std::forward<Args>(
args)...);
856 Q_ASSERT_X(
size_t(
i) <=
size_t(
d->size),
"QList<T>::insert",
"index out of range");
857 Q_ASSERT_X(
n >= 0,
"QList::insert",
"invalid count");
864template <
typename ...Args>
868 Q_ASSERT_X(
i >= 0 && i <= d->
size,
"QList<T>::insert",
"index out of range");
869 d->emplace(
i, std::forward<Args>(
args)...);
874template<
typename... Args>
877 d->emplace(
d->size, std::forward<Args>(
args)...);
884 Q_ASSERT_X(isValidIterator(abegin),
"QList::erase",
"The specified iterator argument 'abegin' is invalid");
885 Q_ASSERT_X(isValidIterator(aend),
"QList::erase",
"The specified iterator argument 'aend' is invalid");
888 qsizetype i = std::distance(constBegin(), abegin);
900 if (
d->needsDetach() || newSize >
capacity()) {
902 DataPointer detached(Data::allocate(
d->detachCapacity(newSize)));
908 d->assign(
d.begin(),
d.begin() +
qMin(
size(), newSize),
t);
909 if (newSize >
size()) {
911 }
else if (newSize <
size()) {
912 d->truncate(newSize);
919template <
typename T,
typename U>
934template <
typename T,
typename U>
954template <
typename AT>
961template <
typename AT>
973 switch (QContainerImplHelper::mid(
d.size, &
p, &l)) {
974 case QContainerImplHelper::Null:
975 case QContainerImplHelper::Empty:
977 case QContainerImplHelper::Full:
979 case QContainerImplHelper::Subset:
999template <
typename T,
typename AT>
1005template <
typename T,
typename Predicate>
1016#include <QtCore/qbytearraylist.h>
1017#include <QtCore/qstringlist.h>
\inmodule QtCore \reentrant
constexpr bool operator==(iterator o) const
constexpr bool operator<(iterator other) const
constexpr bool operator<(const_iterator other) const
const_iterator operator-(qsizetype j) const
constexpr bool operator==(pointer p) const
constexpr bool operator>(const_iterator other) const
std::random_access_iterator_tag iterator_category
const T & operator[](qsizetype j) const
const_iterator & operator-=(qsizetype j)
constexpr const_iterator(iterator o)
constexpr const_iterator()=default
const T & operator*() const
constexpr bool operator!=(const_iterator o) const
const_iterator operator+(qsizetype j) const
qsizetype difference_type
constexpr bool operator<=(iterator other) const
const_iterator & operator++()
constexpr bool operator!=(pointer p) const
constexpr bool operator>(iterator other) const
qsizetype operator-(const_iterator j) const
constexpr bool operator==(const_iterator o) const
constexpr bool operator>=(iterator other) const
const_iterator operator--(int)
const_iterator & operator--()
const_iterator operator++(int)
constexpr bool operator!=(iterator o) const
const_iterator & operator+=(qsizetype j)
friend const_iterator operator+(qsizetype j, const_iterator k)
constexpr bool operator<=(const_iterator other) const
const T * operator->() const
constexpr bool operator>=(const_iterator other) const
constexpr bool operator>(iterator other) const
iterator operator+(qsizetype j) const
iterator & operator-=(qsizetype j)
T & operator[](qsizetype j) const
constexpr bool operator<(const_iterator other) const
constexpr bool operator!=(pointer p) const
constexpr bool operator<=(iterator other) const
qsizetype difference_type
constexpr bool operator!=(iterator o) const
constexpr bool operator<=(const_iterator other) const
constexpr bool operator>(const_iterator other) const
constexpr bool operator>=(iterator other) const
constexpr bool operator<(iterator other) const
friend iterator operator+(qsizetype j, iterator k)
std::random_access_iterator_tag iterator_category
constexpr bool operator!=(const_iterator o) const
constexpr bool operator==(const_iterator o) const
constexpr bool operator>=(const_iterator other) const
qsizetype operator-(iterator j) const
constexpr iterator()=default
iterator operator-(qsizetype j) const
constexpr bool operator==(iterator o) const
iterator & operator+=(qsizetype j)
constexpr bool operator==(pointer p) const
void append(const_iterator i1, const_iterator i2)
iterator insert(const_iterator before, parameter_type t)
qsizetype size() const noexcept
void removeFirst() noexcept
QList< T > & fill(parameter_type t, qsizetype size=-1)
const_pointer constData() const noexcept
void push_front(rvalue_ref t)
bool isEmpty() const noexcept
typename std::conditional< DataPointer::pass_parameter_by_value, DisableRValueRefs, T && >::type rvalue_ref
void replace(qsizetype i, rvalue_ref t)
const_iterator begin() const noexcept
void push_back(rvalue_ref t)
bool isDetached() const noexcept
void removeAt(qsizetype i)
QList< T > last(qsizetype n) const
bool isSharedWith(const QList< T > &other) const
iterator insert(const_iterator before, rvalue_ref t)
QList< T > & operator+=(const QList< T > &l)
QList< T > operator+(const QList< T > &l) &&
reference emplaceFront(Args &&... args)
reference emplace_back(Args &&... args)
const T & constLast() const noexcept
iterator erase(const_iterator begin, const_iterator end)
QList< T > sliced(qsizetype pos, qsizetype n) const
QList(std::initializer_list< T > args)
QTypeTraits::compare_eq_result_container< QList, U > operator==(const QList &other) const
iterator insert(qsizetype i, parameter_type t)
QTypeTraits::compare_lt_result_container< QList, U > operator<=(const QList &other) const noexcept(noexcept(other< std::declval< QList< U > >()))
bool empty() const noexcept
bool removeOne(const AT &t)
QList< T > toList() const noexcept
QList(InputIterator i1, InputIterator i2)
QList< T > & operator+=(rvalue_ref t)
static QList< T > fromReadOnlyData(const T(&t)[N]) noexcept
static QList< T > fromList(const QList< T > &list) noexcept
QList(qsizetype size, parameter_type t)
const_reference back() const noexcept
qsizetype capacity() const
QTypeTraits::compare_lt_result_container< QList, U > operator<(const QList &other) const noexcept(noexcept(std::lexicographical_compare< typename QList< U >::const_iterator, typename QList::const_iterator >(std::declval< QList< U > >().begin(), std::declval< QList< U > >().end(), other.begin(), other.end())))
void swapItemsAt(qsizetype i, qsizetype j)
void push_back(parameter_type t)
QList< T > operator+(const QList< T > &l) const &
const_iterator end() const noexcept
iterator erase(const_iterator pos)
bool endsWith(parameter_type t) const
qsizetype count(const AT &t) const noexcept
bool startsWith(parameter_type t) const
friend qsizetype QtPrivate::lastIndexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
QList< T > operator+(QList< T > &&l) &&
typename DataPointer::parameter_type parameter_type
qsizetype length() const noexcept
std::reverse_iterator< iterator > reverse_iterator
const_reference at(qsizetype i) const noexcept
iterator insert(qsizetype i, rvalue_ref t)
QList< T > & operator<<(parameter_type t)
QList< T > sliced(qsizetype pos) const
QList< T > toVector() const noexcept
T value(qsizetype i) const
void prepend(parameter_type t)
void swap(QList &other) noexcept
iterator insert(const_iterator before, qsizetype n, parameter_type t)
QList< T > & operator=(std::initializer_list< T > args)
void move(qsizetype from, qsizetype to)
QList(DataPointer dd) noexcept
const_reverse_iterator crbegin() const noexcept
reference operator[](qsizetype i)
void append(rvalue_ref t)
const_iterator constBegin() const noexcept
const_reference operator[](qsizetype i) const noexcept
const_reverse_iterator rbegin() const noexcept
void remove(qsizetype i, qsizetype n=1)
qsizetype removeIf(Predicate pred)
std::reverse_iterator< const_iterator > const_reverse_iterator
qsizetype removeAll(const AT &t)
iterator emplace(qsizetype i, Args &&... args)
const T & first() const noexcept
iterator insert(qsizetype i, qsizetype n, parameter_type t)
void push_front(parameter_type t)
void append(QList< T > &&l)
qsizetype count() const noexcept
reference emplaceBack(Args &&... args)
QList< T > mid(qsizetype pos, qsizetype len=-1) const
QTypeTraits::compare_lt_result_container< QList, U > operator>(const QList &other) const noexcept(noexcept(other< std::declval< QList< U > >()))
void prepend(rvalue_ref t)
QList< T > operator+(QList< T > &&l) const &
QList & assign(std::initializer_list< T > l)
void resize(qsizetype size, parameter_type c)
QList< T > first(qsizetype n) const
const T & constFirst() const noexcept
iterator emplace(const_iterator before, Args &&... args)
void reserve(qsizetype size)
QList & assign(InputIterator first, InputIterator last)
static QList< T > fromVector(const QList< T > &vector) noexcept
void replace(qsizetype i, parameter_type t)
reverse_iterator rbegin()
void pop_front() noexcept
const T & const_reference
const T & last() const noexcept
void removeLast() noexcept
void resize(qsizetype size)
const_iterator cend() const noexcept
void append(parameter_type t)
QList< T > & operator+=(parameter_type t)
QTypeTraits::compare_eq_result_container< QList, U > operator!=(const QList &other) const
const_iterator constEnd() const noexcept
const_reverse_iterator rend() const noexcept
T value(qsizetype i, parameter_type defaultValue) const
const_iterator cbegin() const noexcept
QList & assign(qsizetype n, parameter_type t)
QTypeTraits::compare_lt_result_container< QList, U > operator>=(const QList &other) const noexcept(noexcept(std::declval< QList< U > >()< other))
const_pointer data() const noexcept
const_reference front() const noexcept
QList< T > & operator+=(QList< T > &&l)
friend qsizetype QtPrivate::indexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
void append(const QList< T > &l)
const_reverse_iterator crend() const noexcept
QList< uint > toUcs4() const
Returns a UCS-4/UTF-32 representation of the string view as a QList<uint>.
\macro QT_RESTRICTED_CAST_FROM_ASCII
list append(new Employee("Blackpool", "Stephen"))
Combined button and popup list for selecting options.
std::enable_if_t< std::conjunction_v< QTypeTraits::has_operator_equal_container< Container, T >... >, bool > compare_eq_result_container
std::enable_if_t< std::conjunction_v< QTypeTraits::has_operator_less_than_container< Container, T >... >, bool > compare_lt_result_container
auto sequential_erase_one(Container &c, const T &t)
Q_CORE_EXPORT QList< uint > convertToUcs4(QStringView str)
auto sequential_erase_if(Container &c, Predicate &pred)
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype lastIndexOf(QByteArrayView haystack, qsizetype from, QByteArrayView needle) noexcept
auto sequential_erase_with_copy(Container &c, const T &t)
auto sequential_erase(Container &c, const T &t)
typename std::enable_if< std::is_convertible< typename std::iterator_traits< Iterator >::iterator_category, std::input_iterator_tag >::value, bool >::type IfIsInputIterator
qsizetype indexOf(const QList< V > &list, const U &u, qsizetype from) noexcept
static jboolean copy(JNIEnv *, jobject)
size_t qHashRange(InputIterator first, InputIterator last, size_t seed=0) noexcept(noexcept(qHash(*first)))
#define Q_DECLARE_SEQUENTIAL_ITERATOR(C)
#define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C)
qsizetype erase(QList< T > &list, const AT &t)
qsizetype erase_if(QList< T > &list, Predicate pred)
size_t qHash(const QList< T > &key, size_t seed=0) noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei GLsizei GLfloat distance
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
#define Q_ASSERT_X(cond, x, msg)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
#define QT_DEPRECATED_VERSION_X_6_3(text)
settings remove("monkey")
void setFlag(typename Data::ArrayOptions f) noexcept
std::conditional< pass_parameter_by_value, T, constT & >::type parameter_type
@ pass_parameter_by_value
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
const Self * self() const
~QListSpecialMethodsBase()=default
bool contains(const AT &t) const noexcept
qsizetype lastIndexOf(const AT &t, qsizetype from=-1) const noexcept
~QListSpecialMethods()=default
static QPair< QTypedArrayData *, T * > allocate(qsizetype capacity, AllocationOption option=QArrayData::KeepSize)
void appendInitialize(qsizetype newSize)
void moveAppend(T *b, T *e)
void copyAppend(const T *b, const T *e)