File indexing completed on 2024-05-12 05:29:23

0001 /*
0002  *   SPDX-FileCopyrightText: 2014-2016 Ivan Cukic <ivan.cukic@kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #pragma once
0008 
0009 #include <QFuture>
0010 #include <QFutureWatcher>
0011 
0012 #include "utils/optional_view.h"
0013 // #include <boost/optional.hpp>
0014 
0015 #ifdef ENABLE_QJSVALUE_CONTINUATION
0016 #include <QJSValue>
0017 #endif
0018 
0019 namespace kamd
0020 {
0021 namespace utils
0022 {
0023 namespace detail
0024 { //_
0025 #ifdef ENABLE_QJSVALUE_CONTINUATION
0026 inline void test_continuation(const QJSValue &continuation)
0027 {
0028     if (!continuation.isCallable()) {
0029         qCWarning(KAMD_LOG_RESOURCES) << "Passed handler is not callable: " << continuation.toString();
0030     }
0031 }
0032 
0033 template<typename _ReturnType>
0034 inline void pass_value(const QFuture<_ReturnType> &future, QJSValue continuation)
0035 {
0036     auto result = continuation.call({future.result()});
0037     if (result.isError()) {
0038         qCWarning(KAMD_LOG_RESOURCES) << "Handler returned this error: " << result.toString();
0039     }
0040 }
0041 
0042 inline void pass_value(const QFuture<void> &future, QJSValue continuation)
0043 {
0044     Q_UNUSED(future);
0045     auto result = continuation.call({});
0046     if (result.isError()) {
0047         qCWarning(KAMD_LOG_RESOURCES) << "Handler returned this error: " << result.toString();
0048     }
0049 }
0050 #endif
0051 
0052 template<typename _Continuation>
0053 inline void test_continuation(_Continuation &&continuation)
0054 {
0055     Q_UNUSED(continuation);
0056 }
0057 
0058 template<typename _ReturnType, typename _Continuation>
0059 inline void pass_value(const QFuture<_ReturnType> &future, _Continuation &&continuation)
0060 {
0061     using namespace kamd::utils;
0062     continuation(future.resultCount() > 0 ? make_optional_view(future.result()) : none());
0063 }
0064 
0065 template<typename _Continuation>
0066 inline void pass_value(_Continuation &&continuation)
0067 {
0068     continuation();
0069 }
0070 
0071 } //^ namespace detail
0072 
0073 template<typename _ReturnType, typename _Continuation>
0074 inline void continue_with(const QFuture<_ReturnType> &future, _Continuation &&continuation)
0075 {
0076     detail::test_continuation(continuation);
0077 
0078     auto watcher = new QFutureWatcher<_ReturnType>();
0079     QObject::connect(watcher, &QFutureWatcherBase::finished, [=]() mutable {
0080         detail::pass_value(future, continuation);
0081     });
0082 
0083     watcher->setFuture(future);
0084 }
0085 
0086 } // namespace utils
0087 } // namespace kamd