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>
This commit is contained in:
parent
8c1ff78018
commit
a1f3be3e41
@ -917,18 +917,14 @@ public:
|
|||||||
// using Base::assign;
|
// using Base::assign;
|
||||||
// using Base::compare;
|
// using Base::compare;
|
||||||
|
|
||||||
using Base::copyAppend;
|
|
||||||
|
|
||||||
template<typename It>
|
template<typename It>
|
||||||
void copyAppend(It b, It e, QtPrivate::IfIsForwardIterator<It> = true,
|
void appendIteratorRange(It b, It e, QtPrivate::IfIsForwardIterator<It> = true)
|
||||||
QtPrivate::IfIsNotConvertible<It, const T *> = true,
|
|
||||||
QtPrivate::IfIsNotConvertible<It, const T *> = true)
|
|
||||||
{
|
{
|
||||||
Q_ASSERT(this->isMutable() || b == e);
|
Q_ASSERT(this->isMutable() || b == e);
|
||||||
Q_ASSERT(!this->isShared() || b == e);
|
Q_ASSERT(!this->isShared() || b == e);
|
||||||
|
|
||||||
const qsizetype distance = std::distance(b, e);
|
const qsizetype distance = std::distance(b, e);
|
||||||
Q_ASSERT(distance >= 0 && distance <= this->allocatedCapacity() - this->size);
|
Q_ASSERT(distance >= 0 && distance <= this->allocatedCapacity() - this->size);
|
||||||
|
Q_UNUSED(distance);
|
||||||
|
|
||||||
T *iter = this->end();
|
T *iter = this->end();
|
||||||
for (; b != e; ++iter, ++b) {
|
for (; b != e; ++iter, ++b) {
|
||||||
|
@ -181,22 +181,25 @@ public:
|
|||||||
d->copyAppend(args.begin(), args.end());
|
d->copyAppend(args.begin(), args.end());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
template <typename InputIterator, QtPrivate::IfIsForwardIterator<InputIterator> = true>
|
template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
|
||||||
QList(InputIterator i1, InputIterator i2)
|
QList(InputIterator i1, InputIterator i2)
|
||||||
{
|
{
|
||||||
const auto distance = std::distance(i1, i2);
|
if constexpr (!std::is_convertible_v<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>) {
|
||||||
if (distance) {
|
std::copy(i1, i2, std::back_inserter(*this));
|
||||||
d = DataPointer(Data::allocate(distance));
|
} else {
|
||||||
d->copyAppend(i1, i2);
|
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
|
// 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>>>
|
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)
|
inline explicit QList(const String &str)
|
||||||
|
@ -1169,7 +1169,7 @@ void tst_QArrayData::arrayOpsExtra()
|
|||||||
auto copy = cloneArrayDataPointer(dataPointer, dataPointer.size);
|
auto copy = cloneArrayDataPointer(dataPointer, dataPointer.size);
|
||||||
const size_t distance = std::distance(first, last);
|
const size_t distance = std::distance(first, last);
|
||||||
|
|
||||||
dataPointer->copyAppend(first, last);
|
dataPointer->appendIteratorRange(first, last);
|
||||||
QCOMPARE(size_t(dataPointer.size), originalSize + distance);
|
QCOMPARE(size_t(dataPointer.size), originalSize + distance);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (; i < originalSize; ++i)
|
for (; i < originalSize; ++i)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user