summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/awaitable.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/awaitable.hpp')
-rw-r--r--3rdparty/asio/include/asio/awaitable.hpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/3rdparty/asio/include/asio/awaitable.hpp b/3rdparty/asio/include/asio/awaitable.hpp
new file mode 100644
index 00000000000..b9e8d51df5c
--- /dev/null
+++ b/3rdparty/asio/include/asio/awaitable.hpp
@@ -0,0 +1,133 @@
+//
+// awaitable.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// 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_AWAITABLE_HPP
+#define ASIO_AWAITABLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+
+#if defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+# include <coroutine>
+#else // defined(ASIO_HAS_STD_COROUTINE)
+# include <experimental/coroutine>
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+#include "asio/any_io_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+using std::coroutine_handle;
+using std::suspend_always;
+#else // defined(ASIO_HAS_STD_COROUTINE)
+using std::experimental::coroutine_handle;
+using std::experimental::suspend_always;
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+template <typename> class awaitable_thread;
+template <typename, typename> class awaitable_frame;
+
+} // namespace detail
+
+/// The return type of a coroutine or asynchronous operation.
+template <typename T, typename Executor = any_io_executor>
+class ASIO_NODISCARD awaitable
+{
+public:
+ /// The type of the awaited value.
+ typedef T value_type;
+
+ /// The executor type that will be used for the coroutine.
+ typedef Executor executor_type;
+
+ /// Default constructor.
+ constexpr awaitable() noexcept
+ : frame_(nullptr)
+ {
+ }
+
+ /// Move constructor.
+ awaitable(awaitable&& other) noexcept
+ : frame_(std::exchange(other.frame_, nullptr))
+ {
+ }
+
+ /// Destructor
+ ~awaitable()
+ {
+ if (frame_)
+ frame_->destroy();
+ }
+
+ /// Checks if the awaitable refers to a future result.
+ bool valid() const noexcept
+ {
+ return !!frame_;
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+ // Support for co_await keyword.
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ // Support for co_await keyword.
+ template <class U>
+ void await_suspend(
+ detail::coroutine_handle<detail::awaitable_frame<U, Executor>> h)
+ {
+ frame_->push_frame(&h.promise());
+ }
+
+ // Support for co_await keyword.
+ T await_resume()
+ {
+ return awaitable(static_cast<awaitable&&>(*this)).frame_->get();
+ }
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+private:
+ template <typename> friend class detail::awaitable_thread;
+ template <typename, typename> friend class detail::awaitable_frame;
+
+ // Not copy constructible or copy assignable.
+ awaitable(const awaitable&) = delete;
+ awaitable& operator=(const awaitable&) = delete;
+
+ // Construct the awaitable from a coroutine's frame object.
+ explicit awaitable(detail::awaitable_frame<T, Executor>* a)
+ : frame_(a)
+ {
+ }
+
+ detail::awaitable_frame<T, Executor>* frame_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/awaitable.hpp"
+
+#endif // defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_AWAITABLE_HPP