// // Copyright (c) 2022 Klemens Morgenstern (klemens.morgenstern@gmx.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 BOOST_COBALT_DETAIL_DETACHED_HPP #define BOOST_COBALT_DETAIL_DETACHED_HPP #include #include #include #include #include #include #include #include #include #include #include namespace boost::cobalt { struct detached; namespace detail { struct detached_promise : promise_memory_resource_base, promise_cancellation_base, promise_throw_if_cancelled_base, enable_awaitables, enable_await_allocator, enable_await_executor, enable_await_deferred { using promise_cancellation_base::await_transform; using promise_throw_if_cancelled_base::await_transform; using enable_awaitables::await_transform; using enable_await_allocator::await_transform; using enable_await_executor::await_transform; using enable_await_deferred::await_transform; [[nodiscard]] detached get_return_object(); std::suspend_never await_transform( cobalt::this_coro::reset_cancellation_source_t reset) noexcept { this->reset_cancellation_source(reset.source); return {}; } using executor_type = executor; executor_type exec; const executor_type & get_executor() const {return exec;} template detached_promise(Args & ...args) : #if !defined(BOOST_COBALT_NO_PMR) promise_memory_resource_base(detail::get_memory_resource_from_args(args...)), #endif exec{detail::get_executor_from_args(args...)} { } std::suspend_never initial_suspend() noexcept {return {};} std::suspend_never final_suspend() noexcept {return {};} void return_void() {} #if !defined(BOOST_NO_EXCEPTIONS) void unhandled_exception() { throw ; } #endif }; } } #endif //BOOST_COBALT_DETAIL_DETACHED_HPP