diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-11-12 17:24:56 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-11-17 11:47:45 +0100 |
commit | a1f3be3e41f70b0dc39abe6ccdab9a493bd9b32f (patch) | |
tree | 9c7048844c39ef3984a1fd1d9aae4a6c58a966a0 /src/corelib/tools/qlist.h | |
parent | 8c1ff780180dd80bd11f7f582c4621d75d473618 (diff) |
Clean up QList(iterator, iterator)
Fold the two overloads into one, and distinguish the cases using
if constexpr. Do not overload QArrayOps::copyAppend(), to make it
clear which one is being used.
Change-Id: If6a894841aacb84ba190fb2209246f5f61034b42
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/tools/qlist.h')
-rw-r--r-- | src/corelib/tools/qlist.h | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 4511e1282a..85d3b30432 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) |