include/boost/capy/asio/detail/continuation.hpp
85.0% Lines (34/40)
68.8% List of functions (33/48)
Functions (48)
Function
Calls
Lines
Blocks
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::binder0<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> > >(unsigned long, boost::asio::detail::binder0<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> >&, std::pmr::polymorphic_allocator<void>&)
:31
2x
87.5%
89.0%
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::binder0<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot> > >(unsigned long, boost::asio::detail::binder0<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot> >&, std::pmr::polymorphic_allocator<void>&)
:31
1x
87.5%
89.0%
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> >(unsigned long, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>&, std::pmr::polymorphic_allocator<void>&)
:31
0
0.0%
0.0%
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::executor_function>(unsigned long, boost::asio::detail::executor_function&, std::pmr::polymorphic_allocator<void>&)
:31
1x
87.5%
89.0%
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::executor_function_view>(unsigned long, boost::asio::detail::executor_function_view&, std::pmr::polymorphic_allocator<void>&)
:31
0
0.0%
0.0%
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void> >(unsigned long, boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>&, std::pmr::polymorphic_allocator<void>&)
:31
0
0.0%
0.0%
void* boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator new<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void> >(unsigned long, boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>&, std::pmr::polymorphic_allocator<void>&)
:31
1x
87.5%
89.0%
boost::capy::detail::continuation_handle_promise_base_<std::pmr::polymorphic_allocator<void> >::operator delete(void*, unsigned long)
:44
5x
85.7%
80.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::initial_aw_t::await_ready() const
:72
6x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::initial_aw_t::await_ready() const
:72
5x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::initial_aw_t::await_suspend(std::__n4861::coroutine_handle<boost::capy::detail::continuation_handle_promise_type<std::allocator<void> > >)
:73
6x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::initial_aw_t::await_suspend(std::__n4861::coroutine_handle<boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> > >)
:73
5x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::initial_aw_t::await_resume()
:80
6x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::initial_aw_t::await_resume()
:80
5x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::initial_suspend() const
:83
6x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::initial_suspend() const
:83
5x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::final_suspend() const
:87
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::final_suspend() const
:87
0
0.0%
0.0%
auto boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::yield_value<boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::read_op<boost::capy::async_read_stream<boost::capy::noexcept_stream<boost::capy::test::read_stream>, boost::capy::thread_pool::executor_type>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#2}>, std::error_code, unsigned long> > >(boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::read_op<boost::capy::async_read_stream<boost::capy::noexcept_stream<boost::capy::test::read_stream>, boost::capy::thread_pool::executor_type>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#2}>, std::error_code, unsigned long> >&)
:90
2x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::yield_value<boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::write_op<boost::capy::async_write_stream<boost::capy::noexcept_stream<boost::capy::test::write_stream>, boost::capy::thread_pool::executor_type>, boost::asio::const_buffer, boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#1}>, std::error_code, unsigned long> > >(boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::write_op<boost::capy::async_write_stream<boost::capy::noexcept_stream<boost::capy::test::write_stream>, boost::capy::thread_pool::executor_type>, boost::asio::const_buffer, boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#1}>, std::error_code, unsigned long> >&)
:90
1x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::yield_value<boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#1}> >(boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#1}>&)
:90
1x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::yield_value<boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#2}> >(boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#2}>&)
:90
1x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::yield_value<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::append_handler<boost::asio::detail::promise_handler<void (std::__exception_ptr::exception_ptr), std::allocator<void> >, std::__exception_ptr::exception_ptr>, boost::asio::detail::promise_executor<void, boost::asio::execution::detail::blocking::possibly_t<0> >, void> >(boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::append_handler<boost::asio::detail::promise_handler<void (std::__exception_ptr::exception_ptr), std::allocator<void> >, std::__exception_ptr::exception_ptr>, boost::asio::detail::promise_executor<void, boost::asio::execution::detail::blocking::possibly_t<0> >, void>&)
:90
1x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::binder0<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> > >(boost::asio::detail::binder0<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> >&)
:90
2x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::binder0<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot> > >(boost::asio::detail::binder0<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot> >&)
:90
1x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> >(boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>&)
:90
0
0.0%
0.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::executor_function>(boost::asio::detail::executor_function&)
:90
1x
100.0%
100.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::executor_function_view>(boost::asio::detail::executor_function_view&)
:90
0
0.0%
0.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void> >(boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>&)
:90
0
0.0%
0.0%
auto boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::yield_value<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void> >(boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>&)
:90
1x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::unhandled_exception()
:120
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::unhandled_exception()
:120
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::return_void()
:121
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::return_void()
:121
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::get_return_object()
:131
6x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::get_return_object()
:131
5x
100.0%
100.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::read_op<boost::capy::async_read_stream<boost::capy::noexcept_stream<boost::capy::test::read_stream>, boost::capy::thread_pool::executor_type>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#2}>, std::error_code, unsigned long> >, std::allocator<void> >(boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::read_op<boost::capy::async_read_stream<boost::capy::noexcept_stream<boost::capy::test::read_stream>, boost::capy::thread_pool::executor_type>, boost::asio::mutable_buffer, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#2}>, std::error_code, unsigned long> >, std::allocator<void>)
:143
2x
100.0%
53.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::write_op<boost::capy::async_write_stream<boost::capy::noexcept_stream<boost::capy::test::write_stream>, boost::capy::thread_pool::executor_type>, boost::asio::const_buffer, boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#1}>, std::error_code, unsigned long> >, std::allocator<void> >(boost::asio::detail::binder0<boost::asio::detail::append_handler<boost::asio::detail::write_op<boost::capy::async_write_stream<boost::capy::noexcept_stream<boost::capy::test::write_stream>, boost::capy::thread_pool::executor_type>, boost::asio::const_buffer, boost::asio::const_buffer const*, boost::asio::detail::transfer_all_t, boost::capy::boost_asio_test::testStreamToAsio()::{lambda(boost::system::error_code, unsigned long)#1}>, std::error_code, unsigned long> >, std::allocator<void>)
:143
1x
100.0%
53.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#1}>, std::allocator<void> >(boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#1}>, std::allocator<void>)
:143
1x
100.0%
53.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#2}>, std::allocator<void> >(boost::asio::detail::binder0<boost::capy::boost_asio_test::testExecutor()::{lambda()#2}>, std::allocator<void>)
:143
1x
100.0%
53.0%
boost::capy::detail::continuation_handle_promise_type<std::allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::append_handler<boost::asio::detail::promise_handler<void (std::__exception_ptr::exception_ptr), std::allocator<void> >, std::__exception_ptr::exception_ptr>, boost::asio::detail::promise_executor<void, boost::asio::execution::detail::blocking::possibly_t<0> >, void>, std::allocator<void> >(boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::append_handler<boost::asio::detail::promise_handler<void (std::__exception_ptr::exception_ptr), std::allocator<void> >, std::__exception_ptr::exception_ptr>, boost::asio::detail::promise_executor<void, boost::asio::execution::detail::blocking::possibly_t<0> >, void>, std::allocator<void>)
:143
1x
100.0%
47.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder0<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> >, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::binder0<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long> >, std::pmr::polymorphic_allocator<void>)
:143
2x
100.0%
47.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder0<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot> >, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::binder0<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot> >, std::pmr::polymorphic_allocator<void>)
:143
1x
100.0%
47.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, std::pmr::polymorphic_allocator<void>)
:143
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::executor_function, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::executor_function, std::pmr::polymorphic_allocator<void>)
:143
1x
100.0%
47.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::executor_function_view, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::executor_function_view, std::pmr::polymorphic_allocator<void>)
:143
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::asio::detail::binder2<boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot, boost::system::error_code, unsigned long>, boost::system::error_code, unsigned long>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>, std::pmr::polymorphic_allocator<void>)
:143
0
0.0%
0.0%
boost::capy::detail::continuation_handle_promise_type<std::pmr::polymorphic_allocator<void> >::helper boost::capy::detail::make_continuation_helper<boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>, std::pmr::polymorphic_allocator<void> >(boost::asio::detail::work_dispatcher<boost::asio::detail::empty_work_function, boost::capy::detail::asio_coroutine_completion_handler<boost::asio::cancellation_slot>, boost::capy::asio_executor_adapter<boost::capy::executor_ref, std::pmr::polymorphic_allocator<void>, 0>, void>, std::pmr::polymorphic_allocator<void>)
:143
1x
100.0%
47.0%
| Line | TLA | Hits | Source Code |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2026 Vinnie Falco (vinnie.falco@gmail.com) | ||
| 3 | // | ||
| 4 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | ||
| 5 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||
| 6 | // | ||
| 7 | // Official repository: https://github.com/cppalliance/capy | ||
| 8 | // | ||
| 9 | |||
| 10 | #ifndef BOOST_CAPY_ASIO_CONTINUATION_HPP | ||
| 11 | #define BOOST_CAPY_ASIO_CONTINUATION_HPP | ||
| 12 | |||
| 13 | #include <boost/capy/continuation.hpp> | ||
| 14 | #include <boost/capy/concept/executor.hpp> | ||
| 15 | |||
| 16 | #include <memory> | ||
| 17 | |||
| 18 | namespace boost::capy | ||
| 19 | { | ||
| 20 | |||
| 21 | namespace detail | ||
| 22 | { | ||
| 23 | |||
| 24 | template<typename Allocator> | ||
| 25 | struct continuation_handle_promise_base_ | ||
| 26 | { | ||
| 27 | using alloc_t = std::allocator_traits<Allocator> | ||
| 28 | ::template rebind_alloc<char>; | ||
| 29 | |||
| 30 | template<typename Func> | ||
| 31 | 5x | void * operator new(std::size_t n, Func &, Allocator &allocator_) | |
| 32 | { | ||
| 33 | 5x | alloc_t alloc(allocator_); | |
| 34 | 5x | std::size_t m = n; | |
| 35 | 5x | if (n % alignof(alloc_t) > 0) | |
| 36 | ✗ | m += alignof(alloc_t) - (n % alignof(alloc_t)); | |
| 37 | |||
| 38 | 5x | char * mem = alloc.allocate(m + sizeof(alloc)); | |
| 39 | |||
| 40 | 5x | new (mem + m) alloc_t(std::move(alloc)); | |
| 41 | 5x | return mem; | |
| 42 | } | ||
| 43 | |||
| 44 | 5x | void operator delete(void * p, std::size_t n) | |
| 45 | { | ||
| 46 | 5x | std::size_t m = n; | |
| 47 | 5x | if (n % alignof(alloc_t) > 0) | |
| 48 | ✗ | m += alignof(alloc_t) - (n % alignof(alloc_t)); | |
| 49 | |||
| 50 | 5x | auto * a = reinterpret_cast<alloc_t*>(static_cast<char*>(p) + m); | |
| 51 | |||
| 52 | 5x | alloc_t alloc(std::move(*a)); | |
| 53 | 5x | a->~alloc_t(); | |
| 54 | |||
| 55 | 5x | alloc.deallocate(static_cast<char*>(p), n); | |
| 56 | 5x | } | |
| 57 | }; | ||
| 58 | |||
| 59 | |||
| 60 | template<> | ||
| 61 | struct continuation_handle_promise_base_<std::allocator<void>> | ||
| 62 | { | ||
| 63 | }; | ||
| 64 | |||
| 65 | template<typename Allocator> | ||
| 66 | struct continuation_handle_promise_type | ||
| 67 | : continuation_handle_promise_base_<Allocator> | ||
| 68 | { | ||
| 69 | |||
| 70 | struct initial_aw_t | ||
| 71 | { | ||
| 72 | 11x | bool await_ready() const {return false;} | |
| 73 | 11x | void await_suspend( | |
| 74 | std::coroutine_handle<continuation_handle_promise_type<Allocator>> h) | ||
| 75 | { | ||
| 76 | 11x | auto & c = h.promise().cont; | |
| 77 | 11x | c.h = h; | |
| 78 | 11x | c.next = nullptr; | |
| 79 | 11x | } | |
| 80 | 11x | void await_resume() {} | |
| 81 | }; | ||
| 82 | |||
| 83 | 11x | initial_aw_t initial_suspend() const noexcept | |
| 84 | { | ||
| 85 | 11x | return initial_aw_t{}; | |
| 86 | } | ||
| 87 | ✗ | std::suspend_never final_suspend() const noexcept {return {};} | |
| 88 | |||
| 89 | template<typename Function> | ||
| 90 | 11x | auto yield_value(Function & func) | |
| 91 | { | ||
| 92 | struct yielder | ||
| 93 | { | ||
| 94 | Function func; | ||
| 95 | |||
| 96 | bool await_ready() const {return false;} | ||
| 97 | void await_suspend(std::coroutine_handle<> h) | ||
| 98 | { | ||
| 99 | auto f = std::move(func); | ||
| 100 | h.destroy(); | ||
| 101 | |||
| 102 | #if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ <= 14) | ||
| 103 | #pragma GCC diagnostic push | ||
| 104 | #pragma GCC diagnostic ignored "-Warray-bounds" | ||
| 105 | #endif | ||
| 106 | |||
| 107 | std::move(f)(); | ||
| 108 | |||
| 109 | #if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ <= 14) | ||
| 110 | #pragma GCC diagnostic pop | ||
| 111 | #endif | ||
| 112 | |||
| 113 | } | ||
| 114 | void await_resume() {} | ||
| 115 | }; | ||
| 116 | |||
| 117 | 11x | return yielder{std::move(func)}; | |
| 118 | } | ||
| 119 | |||
| 120 | ✗ | void unhandled_exception() { throw; } | |
| 121 | ✗ | void return_void() {} | |
| 122 | |||
| 123 | continuation cont; | ||
| 124 | |||
| 125 | struct helper | ||
| 126 | { | ||
| 127 | continuation * cont; | ||
| 128 | using promise_type = continuation_handle_promise_type; | ||
| 129 | }; | ||
| 130 | |||
| 131 | 11x | helper get_return_object() | |
| 132 | { | ||
| 133 | 11x | return helper{&cont}; | |
| 134 | } | ||
| 135 | }; | ||
| 136 | |||
| 137 | #if defined(__GNUC__) && !defined(__clang__) | ||
| 138 | #pragma GCC diagnostic push | ||
| 139 | #pragma GCC diagnostic ignored "-Wmismatched-new-delete" | ||
| 140 | #endif | ||
| 141 | |||
| 142 | template<std::invocable<> Function, typename Allocator> | ||
| 143 | 11x | auto make_continuation_helper( | |
| 144 | Function func, | ||
| 145 | Allocator) | ||
| 146 | -> continuation_handle_promise_type<Allocator>::helper | ||
| 147 | { | ||
| 148 | co_yield func; | ||
| 149 | 22x | } | |
| 150 | |||
| 151 | #if defined(__GNUC__) && !defined(__clang__) | ||
| 152 | #pragma GCC diagnostic pop | ||
| 153 | #endif | ||
| 154 | |||
| 155 | template<std::invocable<> Function, typename Allocator> | ||
| 156 | 11x | continuation & make_continuation( | |
| 157 | Function && func, | ||
| 158 | Allocator && alloc) | ||
| 159 | { | ||
| 160 | 11x | continuation * c = detail::make_continuation_helper( | |
| 161 | ✗ | std::forward<Function>(func), | |
| 162 | 11x | std::forward<Allocator>(alloc)).cont; | |
| 163 | 11x | return *c; | |
| 164 | } | ||
| 165 | |||
| 166 | } | ||
| 167 | |||
| 168 | |||
| 169 | } | ||
| 170 | |||
| 171 | #endif | ||
| 172 | |||
| 173 |