PlasmaActivities

continue_with.h
1/*
2 SPDX-FileCopyrightText: 2014-2016 Ivan Cukic <ivan.cukic(at)kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
7#ifndef UTILS_CONTINUE_WITH_H
8#define UTILS_CONTINUE_WITH_H
9
10#include <QDebug>
11#include <QFuture>
12#include <QFutureWatcher>
13
14#include <optional>
15
16#ifdef ENABLE_QJSVALUE_CONTINUATION
17#include <QJSValue>
18#endif
19
20namespace kamd
21{
22namespace utils
23{
24namespace detail
25{ //_
26#ifdef ENABLE_QJSVALUE_CONTINUATION
27inline void test_continuation(const QJSValue &continuation)
28{
29 if (!continuation.isCallable()) {
30 qWarning() << "Passed handler is not callable: " << continuation.toString();
31 }
32}
33
34template<typename _ReturnType>
35inline void pass_value(const QFuture<_ReturnType> &future, QJSValue continuation)
36{
37 auto result = continuation.call({future.result()});
38 if (result.isError()) {
39 qWarning() << "Handler returned this error: " << result.toString();
40 }
41}
42
43inline void pass_value(const QFuture<void> &future, QJSValue continuation)
44{
45 Q_UNUSED(future);
46 auto result = continuation.call({});
47 if (result.isError()) {
48 qWarning() << "Handler returned this error: " << result.toString();
49 }
50}
51#endif
52
53template<typename _Continuation>
54inline void test_continuation(_Continuation &&continuation)
55{
56 Q_UNUSED(continuation);
57}
58
59template<typename _ReturnType, typename _Continuation>
60inline void pass_value(const QFuture<_ReturnType> &future, _Continuation &&continuation)
61{
62 using namespace kamd::utils;
63 continuation(future.resultCount() > 0 ? std::optional(future.result()) : std::nullopt);
64}
65
66template<typename _Continuation>
67inline void pass_value(_Continuation &&continuation)
68{
69 continuation();
70}
71
72} //^ namespace detail
73
74template<typename _ReturnType, typename _Continuation>
75inline void continue_with(const QFuture<_ReturnType> &future, _Continuation &&continuation)
76{
77 detail::test_continuation(continuation);
78
79 auto watcher = new QFutureWatcher<_ReturnType>();
80 QObject::connect(watcher, &QFutureWatcherBase::finished, [=]() mutable {
81 detail::pass_value(future, continuation);
82 });
83
84 watcher->setFuture(future);
85}
86
87} // namespace utils
88} // namespace kamd
89
90#endif /* !UTILS_CONTINUE_WITH_H */
T result() const const
int resultCount() const const
QJSValue call(const QJSValueList &args) const const
bool isCallable() const const
QString toString() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Feb 28 2025 12:01:06 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.