summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/tools/qarraydataops.h8
-rw-r--r--src/corelib/tools/qlist.h25
2 files changed, 16 insertions, 17 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index 950b26d1a2d..7b55406ac2d 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -917,18 +917,14 @@ public:
// using Base::assign;
// using Base::compare;
- using Base::copyAppend;
-
template<typename It>
- void copyAppend(It b, It e, QtPrivate::IfIsForwardIterator<It> = true,
- QtPrivate::IfIsNotConvertible<It, const T *> = true,
- QtPrivate::IfIsNotConvertible<It, const T *> = true)
+ void appendIteratorRange(It b, It e, QtPrivate::IfIsForwardIterator<It> = true)
{
Q_ASSERT(this->isMutable() || b == e);
Q_ASSERT(!this->isShared() || b == e);
-
const qsizetype distance = std::distance(b, e);
Q_ASSERT(distance >= 0 && distance <= this->allocatedCapacity() - this->size);
+ Q_UNUSED(distance);
T *iter = this->end();
for (; b != e; ++iter, ++b) {
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 4511e1282a4..85d3b30432a 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -181,22 +181,25 @@ public:
d->copyAppend(args.begin(), args.end());
return *this;
}
- template <typename InputIterator, QtPrivate::IfIsForwardIterator<InputIterator> = true>
+ template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
QList(InputIterator i1, InputIterator i2)
{
- const auto distance = std::distance(i1, i2);
- if (distance) {
- d = DataPointer(Data::allocate(distance));
- d->copyAppend(i1, i2);
+ if constexpr (!std::is_convertible_v<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>) {
+ std::copy(i1, i2, std::back_inserter(*this));
+ } else {
+ const auto distance = std::distance(i1, i2);
+ if (distance) {
+ d = DataPointer(Data::allocate(distance));
+ if constexpr (std::is_same_v<std::decay_t<InputIterator>, iterator> ||
+ std::is_same_v<std::decay_t<InputIterator>, const_iterator>) {
+ d->copyAppend(i1, i2);
+ } else {
+ d->appendIteratorRange(i1, i2);
+ }
+ }
}
}
- template <typename InputIterator, QtPrivate::IfIsNotForwardIterator<InputIterator> = true>
- QList(InputIterator i1, InputIterator i2)
- {
- std::copy(i1, i2, std::back_inserter(*this));
- }
-
// This constructor is here for compatibility with QStringList in Qt 5, that has a QStringList(const QString &) constructor
template<typename String, typename = std::enable_if_t<std::is_same_v<T, QString> && std::is_convertible_v<String, QString>>>
inline explicit QList(const String &str)