Fix deprecations and compile warnings (#34)

- Use std::invoke_result, fallback to std::result_of on C++11/14.
- Use RVO instead of std::move (GCC warning: redundant-move).
- Replace QSharedPointer with std::shared_ptr (GCC warning: unititialized value).
- QLinkedList is deprecated in Qt 5.15.
This commit is contained in:
Peter Würtz 2020-04-02 13:39:03 +02:00 committed by GitHub
parent 88289a7635
commit b7ecd95b04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 11 deletions

View File

@ -34,6 +34,14 @@ class QPromiseReject;
namespace QtPromisePrivate { namespace QtPromisePrivate {
// Use std::invoke_result for C++17 and beyond
#if (__cplusplus >= 201703L) || defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L)
using std::invoke_result;
#else
template<class F, class... ArgTypes>
using invoke_result = std::result_of<F(ArgTypes...)>;
#endif
// https://stackoverflow.com/a/21653558 // https://stackoverflow.com/a/21653558
template<typename F> template<typename F>
static void qtpromise_defer(F&& f, const QPointer<QThread>& thread) static void qtpromise_defer(F&& f, const QPointer<QThread>& thread)
@ -138,7 +146,7 @@ struct PromiseDeduce<QtPromise::QPromise<T>> : public PromiseDeduce<T>
template<typename Functor, typename... Args> template<typename Functor, typename... Args>
struct PromiseFunctor struct PromiseFunctor
{ {
using ResultType = typename std::result_of<Functor(Args...)>::type; using ResultType = typename invoke_result<Functor, Args...>::type;
using PromiseType = typename PromiseDeduce<ResultType>::Type; using PromiseType = typename PromiseDeduce<ResultType>::Type;
}; };
@ -231,7 +239,7 @@ struct PromiseDispatch<void>
template<typename T, typename THandler, typename TArg = typename ArgsOf<THandler>::first> template<typename T, typename THandler, typename TArg = typename ArgsOf<THandler>::first>
struct PromiseHandler struct PromiseHandler
{ {
using ResType = typename std::result_of<THandler(T)>::type; using ResType = typename invoke_result<THandler, T>::type;
using Promise = typename PromiseDeduce<ResType>::Type; using Promise = typename PromiseDeduce<ResType>::Type;
template<typename TResolve, typename TReject> template<typename TResolve, typename TReject>
@ -247,7 +255,7 @@ struct PromiseHandler
template<typename T, typename THandler> template<typename T, typename THandler>
struct PromiseHandler<T, THandler, void> struct PromiseHandler<T, THandler, void>
{ {
using ResType = typename std::result_of<THandler()>::type; using ResType = typename invoke_result<THandler>::type;
using Promise = typename PromiseDeduce<ResType>::Type; using Promise = typename PromiseDeduce<ResType>::Type;
template<typename TResolve, typename TReject> template<typename TResolve, typename TReject>
@ -263,7 +271,7 @@ struct PromiseHandler<T, THandler, void>
template<typename THandler> template<typename THandler>
struct PromiseHandler<void, THandler, void> struct PromiseHandler<void, THandler, void>
{ {
using ResType = typename std::result_of<THandler()>::type; using ResType = typename invoke_result<THandler>::type;
using Promise = typename PromiseDeduce<ResType>::Type; using Promise = typename PromiseDeduce<ResType>::Type;
template<typename TResolve, typename TReject> template<typename TResolve, typename TReject>
@ -312,7 +320,7 @@ struct PromiseHandler<void, std::nullptr_t, void>
template<typename T, typename THandler, typename TArg = typename ArgsOf<THandler>::first> template<typename T, typename THandler, typename TArg = typename ArgsOf<THandler>::first>
struct PromiseCatcher struct PromiseCatcher
{ {
using ResType = typename std::result_of<THandler(TArg)>::type; using ResType = typename invoke_result<THandler, TArg>::type;
template<typename TResolve, typename TReject> template<typename TResolve, typename TReject>
static std::function<void(const PromiseError&)> static std::function<void(const PromiseError&)>
@ -333,7 +341,7 @@ struct PromiseCatcher
template<typename T, typename THandler> template<typename T, typename THandler>
struct PromiseCatcher<T, THandler, void> struct PromiseCatcher<T, THandler, void>
{ {
using ResType = typename std::result_of<THandler()>::type; using ResType = typename invoke_result<THandler>::type;
template<typename TResolve, typename TReject> template<typename TResolve, typename TReject>
static std::function<void(const PromiseError&)> static std::function<void(const PromiseError&)>
@ -371,7 +379,7 @@ struct PromiseMapper
template<typename T, typename F, template<typename, typename...> class Sequence, typename... Args> template<typename T, typename F, template<typename, typename...> class Sequence, typename... Args>
struct PromiseMapper<Sequence<T, Args...>, F> struct PromiseMapper<Sequence<T, Args...>, F>
{ {
using ReturnType = typename std::result_of<F(T, int)>::type; using ReturnType = typename invoke_result<F, T, int>::type;
using ResultType = QVector<typename PromiseDeduce<ReturnType>::Type::Type>; using ResultType = QVector<typename PromiseDeduce<ReturnType>::Type::Type>;
using PromiseType = QtPromise::QPromise<ResultType>; using PromiseType = QtPromise::QPromise<ResultType>;
}; };

View File

@ -8,14 +8,15 @@
#ifndef QTPROMISE_QPROMISECONNECTIONS_H #ifndef QTPROMISE_QPROMISECONNECTIONS_H
#define QTPROMISE_QPROMISECONNECTIONS_H #define QTPROMISE_QPROMISECONNECTIONS_H
#include <QtCore/QSharedPointer> #include <QtCore/QObject>
#include <memory>
namespace QtPromise { namespace QtPromise {
class QPromiseConnections class QPromiseConnections
{ {
public: public:
QPromiseConnections() : m_d(QSharedPointer<Data>::create()) { } QPromiseConnections() : m_d(std::make_shared<Data>()) { }
int count() const { return m_d->connections.count(); } int count() const { return m_d->connections.count(); }
@ -48,7 +49,7 @@ private:
} }
}; };
QSharedPointer<Data> m_d; std::shared_ptr<Data> m_d;
}; };
} // namespace QtPromise } // namespace QtPromise

View File

@ -32,7 +32,7 @@ static inline typename QtPromisePrivate::PromiseDeduce<T>::Type resolve(T&& valu
template<typename T> template<typename T>
static inline QPromise<T> resolve(QPromise<T> value) static inline QPromise<T> resolve(QPromise<T> value)
{ {
return std::move(value); return value;
} }
static inline QPromise<void> resolve() static inline QPromise<void> resolve()

View File

@ -290,7 +290,10 @@ void tst_helpers_reduce::functorThrows()
void tst_helpers_reduce::sequenceTypes() void tst_helpers_reduce::sequenceTypes()
{ {
#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
// QLinkedList is deprecated since Qt 5.15.
SequenceTester<QLinkedList<QPromise<int>>>::exec(); SequenceTester<QLinkedList<QPromise<int>>>::exec();
#endif
SequenceTester<QList<QPromise<int>>>::exec(); SequenceTester<QList<QPromise<int>>>::exec();
SequenceTester<QVector<QPromise<int>>>::exec(); SequenceTester<QVector<QPromise<int>>>::exec();
SequenceTester<std::list<QPromise<int>>>::exec(); SequenceTester<std::list<QPromise<int>>>::exec();

View File

@ -283,7 +283,10 @@ void tst_qpromise_reduce::functorThrows()
void tst_qpromise_reduce::sequenceTypes() void tst_qpromise_reduce::sequenceTypes()
{ {
#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
// QLinkedList is deprecated since Qt 5.15.
SequenceTester<QLinkedList<QPromise<int>>>::exec(); SequenceTester<QLinkedList<QPromise<int>>>::exec();
#endif
SequenceTester<QList<QPromise<int>>>::exec(); SequenceTester<QList<QPromise<int>>>::exec();
SequenceTester<QVector<QPromise<int>>>::exec(); SequenceTester<QVector<QPromise<int>>>::exec();
SequenceTester<std::list<QPromise<int>>>::exec(); SequenceTester<std::list<QPromise<int>>>::exec();