summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qlist.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-11-12 17:24:56 +0100
committerLars Knoll <lars.knoll@qt.io>2020-11-17 11:47:45 +0100
commita1f3be3e41f70b0dc39abe6ccdab9a493bd9b32f (patch)
tree9c7048844c39ef3984a1fd1d9aae4a6c58a966a0 /src/corelib/tools/qlist.h
parent8c1ff780180dd80bd11f7f582c4621d75d473618 (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.h25
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)