From 972f8845a85d6a07140025e4257cb8a1a2699b5d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 8 Oct 2018 11:55:13 +0200 Subject: [PATCH] Invert include dependencies between QList and QVector This is a very slight source incompatibility, but required as a preparation for Qt 6, where QList should inherit QVector or share the implementation with it. This requires some special work to correctly instantiate and export QVector from Qt Core on MSVC. Change-Id: I1d042c5fafdde7afe59409eda2580871d4832fcd Reviewed-by: Thiago Macieira --- src/corelib/tools/qlist.cpp | 17 ++++++++++++++ src/corelib/tools/qlist.h | 32 ++++++++++++++++++++++++++ src/corelib/tools/qvector.h | 46 +++---------------------------------- 3 files changed, 52 insertions(+), 43 deletions(-) diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp index 17aba8035ba..0eed4a619e6 100644 --- a/src/corelib/tools/qlist.cpp +++ b/src/corelib/tools/qlist.cpp @@ -47,6 +47,23 @@ QT_BEGIN_NAMESPACE +/* + ### Qt 5: + ### This needs to be removed for next releases of Qt. It is a workaround for vc++ because + ### Qt exports QPolygon and QPolygonF that inherit QVector and + ### QVector respectively. +*/ + +#if defined(Q_CC_MSVC) && defined(QT_BUILD_CORE_LIB) +QT_BEGIN_INCLUDE_NAMESPACE +#include +QT_END_INCLUDE_NAMESPACE + +template class Q_CORE_EXPORT QVector; +template class Q_CORE_EXPORT QVector; +#endif + + /* QList as an array-list combines the easy-of-use of a random access interface with fast list operations and the low memory diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 49ccbc9c9fc..073993ee568 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -1051,6 +1052,37 @@ inline int QList::count_impl(const T &t, QListData::ArrayCompatibleLayout) co t)); } +template +Q_OUTOFLINE_TEMPLATE QVector QList::toVector() const +{ + QVector result(size()); + for (int i = 0; i < size(); ++i) + result[i] = at(i); + return result; +} + +template +QList QList::fromVector(const QVector &vector) +{ + return vector.toList(); +} + +template +Q_OUTOFLINE_TEMPLATE QList QVector::toList() const +{ + QList result; + result.reserve(size()); + for (int i = 0; i < size(); ++i) + result.append(at(i)); + return result; +} + +template +QVector QVector::fromList(const QList &list) +{ + return list.toVector(); +} + Q_DECLARE_SEQUENTIAL_ITERATOR(List) Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(List) diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 30fd7b28657..778bcb3745c 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -42,7 +42,6 @@ #include #include -#include #include #include #include @@ -968,37 +967,6 @@ Q_OUTOFLINE_TEMPLATE QVector QVector::mid(int pos, int len) const return midResult; } -template -Q_OUTOFLINE_TEMPLATE QList QVector::toList() const -{ - QList result; - result.reserve(size()); - for (int i = 0; i < size(); ++i) - result.append(at(i)); - return result; -} - -template -Q_OUTOFLINE_TEMPLATE QVector QList::toVector() const -{ - QVector result(size()); - for (int i = 0; i < size(); ++i) - result[i] = at(i); - return result; -} - -template -QVector QVector::fromList(const QList &list) -{ - return list.toVector(); -} - -template -QList QList::fromVector(const QVector &vector) -{ - return vector.toList(); -} - Q_DECLARE_SEQUENTIAL_ITERATOR(Vector) Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(Vector) @@ -1046,20 +1014,12 @@ inline bool operator>=(const QVector &lhs, const QVector &rhs) ### QVector respectively. */ -#ifdef Q_CC_MSVC +#if defined(Q_CC_MSVC) && !defined(QT_BUILD_CORE_LIB) QT_BEGIN_INCLUDE_NAMESPACE #include QT_END_INCLUDE_NAMESPACE - -#ifndef Q_TEMPLATE_EXTERN -#if defined(QT_BUILD_CORE_LIB) -#define Q_TEMPLATE_EXTERN -#else -#define Q_TEMPLATE_EXTERN extern -#endif -#endif -Q_TEMPLATE_EXTERN template class Q_CORE_EXPORT QVector; -Q_TEMPLATE_EXTERN template class Q_CORE_EXPORT QVector; +extern template class Q_CORE_EXPORT QVector; +extern template class Q_CORE_EXPORT QVector; #endif QVector QStringView::toUcs4() const { return QtPrivate::convertToUcs4(*this); }