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