From 3afcfbc400526d84a434b7efb03d3854f6992ef6 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 24 Jan 2024 10:15:28 +0100 Subject: [PATCH] Port QVersionNumber to QSpan The new ctor could replace all existing ones. However, keep the QList ctors to participate in implicit sharing, but mark them as weak overloads in order to break the ambiguity for arguments that convert to both QList and QSpan. Also keep the initalizer_list ctor because it's implicit, and should be. [ChangeLog][Potentially Source-Incompatible Changes] We have begun to port APIs to QSpan, replacing overload sets of concrete container classes. This breaks code that relied on concrete container class overloads and passed types that implicitly convert to such a container, but not to QSpan. The backwards-compatible fix is to make the conversion explicit. [ChangeLog][QtCore][QVersionNumber] Added construction from QSpan, replacing the QVarLengthArray constructor. Fixes: QTBUG-121480 Change-Id: I9be173d0471872ddc449c876465c6a01abc49ff4 Reviewed-by: Thiago Macieira --- src/corelib/tools/qversionnumber.cpp | 9 ++++++--- src/corelib/tools/qversionnumber.h | 12 +++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/corelib/tools/qversionnumber.cpp b/src/corelib/tools/qversionnumber.cpp index 84bce0cfd41..4b8ace71cc9 100644 --- a/src/corelib/tools/qversionnumber.cpp +++ b/src/corelib/tools/qversionnumber.cpp @@ -81,10 +81,13 @@ QT_IMPL_METATYPE_EXTERN(QVersionNumber) */ /*! - \fn template QVersionNumber::QVersionNumber(const QVarLengthArray &seg) - \since 6.4 + \fn QVersionNumber::QVersionNumber(QSpan args) + \since 6.8 - Constructs a version number from the list of numbers contained in \a seg. + Constructs a version number from the span specified by \a args. + + \note In Qt versions prior to 6.8, QVersionNumber could only be constructed + from QList, QVarLenthArray or std::initializer_list. */ /*! diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h index 80cf7428c90..95217a6effa 100644 --- a/src/corelib/tools/qversionnumber.h +++ b/src/corelib/tools/qversionnumber.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 2 @@ -113,7 +114,7 @@ class QVersionNumber Q_CORE_EXPORT void setListData(QList &&seg); - explicit SegmentStorage(std::initializer_list args) + explicit SegmentStorage(QSpan args) : SegmentStorage(args.begin(), args.end()) {} explicit SegmentStorage(const int *first, const int *last) @@ -256,19 +257,20 @@ public: inline QVersionNumber() noexcept : m_segments() {} + Q_WEAK_OVERLOAD inline explicit QVersionNumber(const QList &seg) : m_segments(seg) { } // compiler-generated copy/move ctor/assignment operators and the destructor are ok + Q_WEAK_OVERLOAD explicit QVersionNumber(QList &&seg) : m_segments(std::move(seg)) { } inline QVersionNumber(std::initializer_list args) - : m_segments(args) + : m_segments(QSpan{args}) {} - template - explicit QVersionNumber(const QVarLengthArray &sec) - : m_segments(sec.begin(), sec.end()) + explicit QVersionNumber(QSpan args) + : m_segments(args) {} inline explicit QVersionNumber(int maj)