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:
parent
82112db29d
commit
2f95cd8f8b
@ -46,10 +46,20 @@ public:
|
|||||||
|
|
||||||
// Core QPromise APIs
|
// Core QPromise APIs
|
||||||
QFuture<T> future() const { return d.future(); }
|
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>>
|
template<typename U = T, typename = QtPrivate::EnableIfSameOrConvertible<U, T>>
|
||||||
bool addResult(U &&result, int index = -1)
|
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)
|
bool addResults(const QList<T> &result)
|
||||||
{ return d.reportResults(result); }
|
{ return d.reportResults(result); }
|
||||||
|
@ -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(const T &result, int index = -1)
|
||||||
\fn template <typename T> bool QPromise<T>::addResult(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
|
Same as
|
||||||
index is unspecified, \a result is added to the end of the collection.
|
\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
|
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.
|
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().
|
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
|
\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
|
QFuture::const_iterator. In order to get all available results without
|
||||||
thinking if there are index gaps or not, use QFuture::results().
|
thinking if there are index gaps or not, use QFuture::results().
|
||||||
|
|
||||||
\sa addResults()
|
\sa addResult(), addResults()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -203,12 +203,20 @@ void tst_QPromise::addResultWithBracedInitializer() // QTBUG-111826
|
|||||||
{
|
{
|
||||||
QString strValue;
|
QString strValue;
|
||||||
int intValue = 0;
|
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;
|
QPromise<MyClass> myPromise;
|
||||||
myPromise.addResult({"bar", 1});
|
myPromise.addResult({"bar", 1});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
QPromise<MyClass> myPromise;
|
||||||
|
myPromise.emplaceResult("bar", 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QPromise::addResultOutOfOrder()
|
void tst_QPromise::addResultOutOfOrder()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user