diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/tools/qarraydataops.h | 8 | ||||
| -rw-r--r-- | src/corelib/tools/qlist.h | 25 |
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) |
