From a5592293f8b093b325c4cb8bd5e98dc07bfc4419 Mon Sep 17 00:00:00 2001 From: Andrei Golubev Date: Wed, 28 Oct 2020 12:33:35 +0100 Subject: [PATCH] Reject `const T*`-convertible types in QCommonArrayOps::copyAppend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In many cases (e.g. relocatable and pod), generic version is more expensive. Let's not expect array data ops to only get QADP iterators as input. Instead, reject generic version for any const T* -convertible iterator and force compiler to select copyAppend(const T *b, const T *e) as a suitable overload Change-Id: I47a09d35a8ff15322381c2aa28258bfc7deebbad Reviewed-by: Lars Knoll Reviewed-by: MÃ¥rten Nordheim --- src/corelib/tools/qarraydataops.h | 4 ++-- src/corelib/tools/qcontainertools_impl.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 2162512883a..c6ab3b1c483 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -1267,8 +1267,8 @@ public: template void copyAppend(It b, It e, QtPrivate::IfIsForwardIterator = true, - QtPrivate::IfIsNotSame, iterator> = true, - QtPrivate::IfIsNotSame, const_iterator> = true) + QtPrivate::IfIsNotConvertible = true, + QtPrivate::IfIsNotConvertible = true) { Q_ASSERT(this->isMutable() || b == e); Q_ASSERT(!this->isShared() || b == e); diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h index 0f9225e461c..f4dfecffcec 100644 --- a/src/corelib/tools/qcontainertools_impl.h +++ b/src/corelib/tools/qcontainertools_impl.h @@ -147,6 +147,9 @@ using IfAssociativeIteratorHasFirstAndSecond = template using IfIsNotSame = typename std::enable_if::value, bool>::type; + +template +using IfIsNotConvertible = typename std::enable_if::value, bool>::type; } // namespace QtPrivate QT_END_NAMESPACE