Long live QPromise::emplaceResult/At()!

And implement the rvalue overload of addResult() using it.

[ChangeLog][QtCore][QPromise] Added emplaceResult() and
emplaceResultAt() member functions.

Fixes: QTBUG-112270
Change-Id: Id369542215a60c0818f1afa8d564498be84732e8
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Marc Mutz 2023-03-28 16:32:00 +02:00
parent 82112db29d
commit 2f95cd8f8b
3 changed files with 47 additions and 6 deletions

View File

@ -46,10 +46,20 @@ public:
// Core QPromise APIs
QFuture<T> future() const { return d.future(); }
template<typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true>
bool emplaceResultAt(int index, Args&&...args)
{
return d.reportAndEmplaceResult(index, std::forward<Args>(args)...);
}
template<typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true>
bool emplaceResult(Args&&...args)
{
return d.reportAndEmplaceResult(-1, std::forward<Args>(args)...);
}
template<typename U = T, typename = QtPrivate::EnableIfSameOrConvertible<U, T>>
bool addResult(U &&result, int index = -1)
{
return d.reportResult(std::forward<U>(result), index);
return d.reportAndEmplaceResult(index, std::forward<U>(result));
}
bool addResults(const QList<T> &result)
{ return d.reportResults(result); }

View File

@ -91,15 +91,38 @@
/*! \fn template <typename T> bool QPromise<T>::addResult(const T &result, int index = -1)
\fn template <typename T> bool QPromise<T>::addResult(T &&result, int index = -1)
Adds \a result to the internal result collection at \a index position. If
index is unspecified, \a result is added to the end of the collection.
Same as
\code
emplaceResultAt(index, result); // first overload
emplaceResultAt(index, std::move(result)); // second overload
\endcode
or, if \c{index == -1} (the default)
\code
emplaceResult(result); // first overload
emplaceResult(std::move(result)); // second overload
\endcode
Returns \c true when \a result is added to the collection.
\sa emplaceResultAt(), emplaceResult(), addResults()
*/
/*!
\fn template <typename T> template <typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> QPromise<T>::emplaceResultAt(int index, Args&&...args)
\fn template <typename T> template <typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> QPromise<T>::emplaceResult(Args&&...args)
\since 6.6
Adds a result constructed from \a args... to the internal result collection
at \a index position (emplaceResultAt()) or the end of of the collection
(emplaceResult()).
Returns \c true when the result was added to the collection.
Returns \c false when this promise is in canceled or finished state or when
\a result is rejected. addResult() rejects \a result if there's already
the result was rejected. addResult() rejects to add a result if there's already
another result in the collection stored at the same index.
These functions only participate in overload resolutions if \c T is
constructible from \a args....
You can get a result at a specific index by calling QFuture::resultAt().
\note It is possible to specify an arbitrary index and request result at
@ -108,7 +131,7 @@
QFuture::const_iterator. In order to get all available results without
thinking if there are index gaps or not, use QFuture::results().
\sa addResults()
\sa addResult(), addResults()
*/
/*!

View File

@ -203,12 +203,20 @@ void tst_QPromise::addResultWithBracedInitializer() // QTBUG-111826
{
QString strValue;
int intValue = 0;
#ifndef __cpp_aggregate_paren_init // make emplacement work with MyClass
MyClass(QString s, int i) : strValue(std::move(s)), intValue(i) {}
#endif
};
{
QPromise<MyClass> myPromise;
myPromise.addResult({"bar", 1});
}
{
QPromise<MyClass> myPromise;
myPromise.emplaceResult("bar", 1);
}
}
void tst_QPromise::addResultOutOfOrder()