QFutureInterface: mark the unused setContinuation() overloads as removed

This is a cleanup after the previous patch that introduced the new
setContinuation() overloads. The old API cannot be used correctly with
the new approach that requires to always set a continuation type, so
let's mark it as removed.

Technically, this change is SiC. However, QFutureInterfaceBase was
never documented as a public class, so users are not supposed to derive
from it and should not use setContinuation() methods directly.

Task-number: QTBUG-130662
Change-Id: Idf3d9f5de00a7c4ac34ee3dde1d58902e3a27904
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Ivan Solovev 2025-01-28 15:20:28 +01:00
parent b0e82f5981
commit 3164746eb0
3 changed files with 47 additions and 34 deletions

View File

@ -1380,6 +1380,46 @@ QUuid::Version QUuid::version() const noexcept
#if QT_CORE_REMOVED_SINCE(6, 10)
#if QT_CONFIG(future)
#include "qfuture.h" // for ContinuationWrapper
#include "qfutureinterface.h"
void QtPrivate::watchContinuationImpl(const QObject *context,
QtPrivate::QSlotObjectBase *slotObj,
QFutureInterfaceBase &fi)
{
Q_ASSERT(context);
Q_ASSERT(slotObj);
auto slot = QtPrivate::SlotObjUniquePtr(slotObj);
// That is now a double-inderection, because the setContinuation() overload
// also uses QSlotObjectBase approach. But that's a solution for backwards
// compatibility, so should be fine.
// We pass a default-constructed QVariant() and an Unknown type, because
// that's effectively the same as passing a nullptr continuationData, and
// that's what the old code was doing.
fi.setContinuation(context, QtPrivate::ContinuationWrapper([slot = std::move(slot)]()
{
void *args[] = { nullptr }; // for `void` return value
slot->call(nullptr, args);
}), QVariant(), QFutureInterfaceBase::ContinuationType::Unknown);
}
void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInterfaceBase &)> func)
{
setContinuation(std::move(func), nullptr);
}
void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInterfaceBase &)> func,
QFutureInterfaceBasePrivate *continuationFutureData)
{
// Backwards compatibility - the continuation data was used for
// then-continuations
setContinuation(std::move(func), continuationFutureData, ContinuationType::Then);
}
#endif // QT_CONFIG(future)
#include "qlogging.h"
QNoDebug QMessageLogger::noDebug() const noexcept

View File

@ -55,27 +55,6 @@ signals:
void run();
};
void QtPrivate::watchContinuationImpl(const QObject *context, QSlotObjectBase *slotObj,
QFutureInterfaceBase &fi)
{
Q_ASSERT(context);
Q_ASSERT(slotObj);
auto slot = SlotObjUniquePtr(slotObj);
// That is now a double-inderection, because the setContinuation() overload
// also uses QSlotObjectBase approach. But that's a solution for backwards
// compatibility, so should be fine.
// We pass a default-constructed QVariant() and an Unknown type, because
// that's effectively the same as passing a nullptr continuationData, and
// that's what the old code was doing.
fi.setContinuation(context, ContinuationWrapper([slot = std::move(slot)]()
{
void *args[] = { nullptr }; // for `void` return value
slot->call(nullptr, args);
}), QVariant(), QFutureInterfaceBase::ContinuationType::Unknown);
}
QFutureCallOutInterface::~QFutureCallOutInterface()
= default;
@ -846,19 +825,6 @@ void QFutureInterfaceBasePrivate::setState(QFutureInterfaceBase::State newState)
state.storeRelaxed(newState);
}
void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInterfaceBase &)> func)
{
setContinuation(std::move(func), nullptr);
}
void QFutureInterfaceBase::setContinuation(std::function<void(const QFutureInterfaceBase &)> func,
QFutureInterfaceBasePrivate *continuationFutureData)
{
// Backwards compatibility - the continuation data was used for
// then-continuations
setContinuation(std::move(func), continuationFutureData, ContinuationType::Then);
}
void QFutureInterfaceBase::setContinuation(std::function<void (const QFutureInterfaceBase &)> func,
void *continuationFutureData, ContinuationType type)
{

View File

@ -6,6 +6,7 @@
#include <QtCore/qmutex.h>
#include <QtCore/qresultstore.h>
#include <QtCore/qtcoreexports.h>
#ifndef QT_NO_EXCEPTIONS
#include <exception>
#endif
@ -40,9 +41,11 @@ template<class Function, class ResultType>
class FailureHandler;
#endif
#if QT_CORE_REMOVED_SINCE(6, 10)
void Q_CORE_EXPORT watchContinuationImpl(const QObject *context,
QtPrivate::QSlotObjectBase *slotObj,
QFutureInterfaceBase &fi);
#endif // QT_CORE_REMOVED_SINCE(6, 10)
}
class Q_CORE_EXPORT QFutureInterfaceBase
@ -182,8 +185,10 @@ private:
friend class QtPrivate::FailureHandler;
#endif
#if QT_CORE_REMOVED_SINCE(6, 10)
friend Q_CORE_EXPORT void QtPrivate::watchContinuationImpl(
const QObject *context, QtPrivate::QSlotObjectBase *slotObj, QFutureInterfaceBase &fi);
#endif // QT_CORE_REMOVED_SINCE(6, 10)
template<class T>
friend class QPromise;
@ -197,9 +202,11 @@ protected:
OnCanceled,
};
#if QT_CORE_REMOVED_SINCE(6, 10)
void setContinuation(std::function<void(const QFutureInterfaceBase &)> func);
void setContinuation(std::function<void(const QFutureInterfaceBase &)> func,
QFutureInterfaceBasePrivate *continuationFutureData);
#endif // QT_CORE_REMOVED_SINCE(6, 10)
void setContinuation(std::function<void(const QFutureInterfaceBase &)> func,
void *continuationFutureData, ContinuationType type);
void setContinuation(const QObject *context, std::function<void()> func,