summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp')
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp b/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp
new file mode 100644
index 00000000000..55aa6d0c2b6
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp
@@ -0,0 +1,177 @@
+//
+// experimental/detail/partial_promise.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_EXPERIMENTAL_DETAIL_PARTIAL_PROMISE_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_PARTIAL_PROMISE_HPP
+
+#include "asio/detail/config.hpp"
+#include "asio/experimental/detail/coro_traits.hpp"
+#include "asio/awaitable.hpp"
+#include <iostream>
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+# include <coroutine>
+#else // defined(ASIO_HAS_STD_COROUTINE)
+# include <experimental/coroutine>
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+
+using std::coroutine_handle;
+using std::coroutine_traits;
+using std::suspend_never;
+using std::suspend_always;
+using std::noop_coroutine;
+
+#else // defined(ASIO_HAS_STD_COROUTINE)
+
+using std::experimental::coroutine_handle;
+using std::experimental::coroutine_traits;
+using std::experimental::suspend_never;
+using std::experimental::suspend_always;
+using std::experimental::noop_coroutine;
+
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+struct partial_promise
+{
+ auto initial_suspend() noexcept
+ {
+ return asio::detail::suspend_always{};
+ }
+
+ auto final_suspend() noexcept
+ {
+ struct awaitable_t
+ {
+ partial_promise *p;
+
+ constexpr bool await_ready() noexcept { return true; }
+
+ auto await_suspend(asio::detail::coroutine_handle<>) noexcept
+ {
+ p->get_return_object().destroy();
+ }
+
+ constexpr void await_resume() noexcept {}
+ };
+
+ return awaitable_t{this};
+ }
+
+ void return_void() {}
+
+ coroutine_handle<partial_promise> get_return_object()
+ {
+ return coroutine_handle<partial_promise>::from_promise(*this);
+ }
+
+ void unhandled_exception()
+ {
+ assert(false);
+ }
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+
+namespace std {
+
+template<typename ... Args>
+struct coroutine_traits<
+ coroutine_handle<asio::experimental::detail::partial_promise>,
+ Args...>
+{
+ using promise_type = asio::experimental::detail::partial_promise;
+};
+
+} // namespace std
+
+#else // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace std { namespace experimental {
+
+template<typename... Args>
+struct coroutine_traits<
+ coroutine_handle<asio::experimental::detail::partial_promise>,
+ Args...>
+{
+ using promise_type = asio::experimental::detail::partial_promise;
+};
+
+}} // namespace std::experimental
+
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template<typename CompletionToken>
+auto post_coroutine(CompletionToken token) noexcept
+ -> coroutine_handle<partial_promise>
+{
+ post(std::move(token));
+ co_return;
+}
+
+template<execution::executor Executor, typename CompletionToken>
+auto post_coroutine(Executor exec, CompletionToken token) noexcept
+ -> coroutine_handle<partial_promise>
+{
+ post(exec, std::move(token));
+ co_return;
+}
+
+template<execution_context Context, typename CompletionToken>
+auto post_coroutine(Context &ctx, CompletionToken token) noexcept
+ -> coroutine_handle<partial_promise>
+{
+ post(ctx, std::move(token));
+ co_return;
+}
+
+template<typename CompletionToken>
+auto dispatch_coroutine(CompletionToken token) noexcept
+ -> coroutine_handle<partial_promise>
+{
+ dispatch(std::move(token));
+ co_return;
+}
+
+template<execution::executor Executor, typename CompletionToken>
+auto dispatch_coroutine(Executor exec, CompletionToken token) noexcept
+ -> coroutine_handle<partial_promise>
+{
+ dispatch(exec, std::move(token));
+ co_return;
+}
+
+template<execution_context Context, typename CompletionToken>
+auto dispatch_coroutine(Context &ctx, CompletionToken token) noexcept
+ -> coroutine_handle<partial_promise>
+{
+ dispatch(ctx, std::move(token));
+ co_return;
+}
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_PARTIAL_PROMISE_HPP