include/boost/corosio/detail/op_base.hpp

100.0% Lines (30/30) 100.0% List of functions (104/104) 77.8% Branches (14/18)
op_base.hpp
f(x) Functions (104)
Function Calls Lines Branches Blocks
boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::bytes_op_base() :39 25x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ull> > > >::bytes_op_base() :39 1x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer> >::bytes_op_base() :39 224872x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::array<boost::capy::mutable_buffer, 2ull> > >::bytes_op_base() :39 3x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::span<boost::capy::mutable_buffer const, 18446744073709551615ull> > >::bytes_op_base() :39 34211x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::const_buffer> >::bytes_op_base() :39 222726x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::const_buffer> > >::bytes_op_base() :39 28x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ull> > > > >::bytes_op_base() :39 2x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::bytes_op_base() :39 2x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::array<boost::capy::const_buffer, 2ull> > >::bytes_op_base() :39 1x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::span<boost::capy::const_buffer const, 18446744073709551615ull> > >::bytes_op_base() :39 34480x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >::bytes_op_base() :39 1x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_awaitable>::bytes_op_base() :39 9x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_from_awaitable>::bytes_op_base() :39 38x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_awaitable>::bytes_op_base() :39 9x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_to_awaitable>::bytes_op_base() :39 31x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::await_ready() const :46 25x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ull> > > >::await_ready() const :46 1x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer> >::await_ready() const :46 224872x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::array<boost::capy::mutable_buffer, 2ull> > >::await_ready() const :46 3x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::span<boost::capy::mutable_buffer const, 18446744073709551615ull> > >::await_ready() const :46 34211x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::const_buffer> >::await_ready() const :46 222726x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::const_buffer> > >::await_ready() const :46 28x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ull> > > > >::await_ready() const :46 2x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::await_ready() const :46 2x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::array<boost::capy::const_buffer, 2ull> > >::await_ready() const :46 1x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::span<boost::capy::const_buffer const, 18446744073709551615ull> > >::await_ready() const :46 34480x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >::await_ready() const :46 1x 100.0% 50.0% 87.5% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_awaitable>::await_ready() const :46 9x 100.0% 75.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_from_awaitable>::await_ready() const :46 38x 100.0% 75.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_awaitable>::await_ready() const :46 9x 100.0% 75.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_to_awaitable>::await_ready() const :46 31x 100.0% 75.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::await_resume() const :53 25x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ull> > > >::await_resume() const :53 1x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer> >::await_resume() const :53 224868x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::array<boost::capy::mutable_buffer, 2ull> > >::await_resume() const :53 3x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::span<boost::capy::mutable_buffer const, 18446744073709551615ull> > >::await_resume() const :53 34211x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::const_buffer> >::await_resume() const :53 222724x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::const_buffer> > >::await_resume() const :53 28x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ull> > > > >::await_resume() const :53 2x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::await_resume() const :53 2x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::array<boost::capy::const_buffer, 2ull> > >::await_resume() const :53 1x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::span<boost::capy::const_buffer const, 18446744073709551615ull> > >::await_resume() const :53 34480x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >::await_resume() const :53 1x 75.0% 50.0% 57.1% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_awaitable>::await_resume() const :53 9x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_from_awaitable>::await_resume() const :53 36x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_awaitable>::await_resume() const :53 9x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_to_awaitable>::await_resume() const :53 29x 100.0% 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 25x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ull> > > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 1x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<boost::capy::mutable_buffer> >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 224872x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::array<boost::capy::mutable_buffer, 2ull> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 3x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_read_stream::read_some_awaitable<std::span<boost::capy::mutable_buffer const, 18446744073709551615ull> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 34211x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::const_buffer> >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 222726x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::const_buffer> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 28x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ull> > > > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 2x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<boost::capy::detail::slice_of<boost::capy::mutable_buffer> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 2x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::array<boost::capy::const_buffer, 2ull> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 1x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::span<boost::capy::const_buffer const, 18446744073709551615ull> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 34480x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::io_write_stream::write_some_awaitable<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 1x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 8x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::recv_from_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 37x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 8x 100.0% 100.0% boost::corosio::detail::bytes_op_base<boost::corosio::udp_socket::send_to_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :60 30x 100.0% 100.0% boost::corosio::detail::value_op_base<boost::corosio::resolver::resolve_awaitable, std::vector<boost::corosio::resolver_entry, std::allocator<boost::corosio::resolver_entry> > >::value_op_base() :84 33x 100.0% 100.0% boost::corosio::detail::value_op_base<boost::corosio::resolver::reverse_resolve_awaitable, boost::corosio::reverse_resolver_result>::value_op_base() :84 16x 100.0% 100.0% boost::corosio::detail::value_op_base<boost::corosio::resolver::resolve_awaitable, std::vector<boost::corosio::resolver_entry, std::allocator<boost::corosio::resolver_entry> > >::await_ready() const :91 33x 100.0% 50.0% 87.5% boost::corosio::detail::value_op_base<boost::corosio::resolver::reverse_resolve_awaitable, boost::corosio::reverse_resolver_result>::await_ready() const :91 16x 100.0% 50.0% 87.5% boost::corosio::detail::value_op_base<boost::corosio::resolver::resolve_awaitable, std::vector<boost::corosio::resolver_entry, std::allocator<boost::corosio::resolver_entry> > >::await_resume() const :98 28x 100.0% 100.0% 100.0% boost::corosio::detail::value_op_base<boost::corosio::resolver::reverse_resolve_awaitable, boost::corosio::reverse_resolver_result>::await_resume() const :98 15x 100.0% 100.0% 100.0% boost::corosio::detail::value_op_base<boost::corosio::resolver::resolve_awaitable, std::vector<boost::corosio::resolver_entry, std::allocator<boost::corosio::resolver_entry> > >::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :105 33x 100.0% 100.0% boost::corosio::detail::value_op_base<boost::corosio::resolver::reverse_resolve_awaitable, boost::corosio::reverse_resolver_result>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :105 16x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_acceptor::wait_awaitable>::void_op_base() :128 6x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::connect_awaitable>::void_op_base() :128 21x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::wait_awaitable>::void_op_base() :128 7x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_acceptor::wait_awaitable>::void_op_base() :128 12x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::connect_awaitable>::void_op_base() :128 1924x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::wait_awaitable>::void_op_base() :128 30x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::connect_awaitable>::void_op_base() :128 18x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::wait_awaitable>::void_op_base() :128 10x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_acceptor::wait_awaitable>::await_ready() const :134 6x 100.0% 75.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::connect_awaitable>::await_ready() const :134 21x 100.0% 50.0% 87.5% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::wait_awaitable>::await_ready() const :134 7x 100.0% 50.0% 87.5% boost::corosio::detail::void_op_base<boost::corosio::tcp_acceptor::wait_awaitable>::await_ready() const :134 12x 100.0% 75.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::connect_awaitable>::await_ready() const :134 1924x 100.0% 50.0% 87.5% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::wait_awaitable>::await_ready() const :134 30x 100.0% 50.0% 87.5% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::connect_awaitable>::await_ready() const :134 18x 100.0% 50.0% 87.5% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::wait_awaitable>::await_ready() const :134 10x 100.0% 50.0% 87.5% boost::corosio::detail::void_op_base<boost::corosio::local_stream_acceptor::wait_awaitable>::await_resume() const :141 5x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::connect_awaitable>::await_resume() const :141 20x 75.0% 50.0% 57.1% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::wait_awaitable>::await_resume() const :141 6x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_acceptor::wait_awaitable>::await_resume() const :141 10x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::connect_awaitable>::await_resume() const :141 1923x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::wait_awaitable>::await_resume() const :141 29x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::connect_awaitable>::await_resume() const :141 18x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::wait_awaitable>::await_resume() const :141 9x 100.0% 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_acceptor::wait_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 5x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::connect_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 21x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::local_stream_socket::wait_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 7x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_acceptor::wait_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 11x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::connect_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 1924x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::tcp_socket::wait_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 30x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::connect_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 18x 100.0% 100.0% boost::corosio::detail::void_op_base<boost::corosio::udp_socket::wait_awaitable>::await_suspend(std::__n4861::coroutine_handle<void>, boost::capy::io_env const*) :148 10x 100.0% 100.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Michael Vandeberg
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/corosio
8 //
9
10 #ifndef BOOST_COROSIO_DETAIL_OP_BASE_HPP
11 #define BOOST_COROSIO_DETAIL_OP_BASE_HPP
12
13 #include <boost/capy/io_result.hpp>
14 #include <boost/capy/ex/executor_ref.hpp>
15 #include <boost/capy/ex/io_env.hpp>
16
17 #include <coroutine>
18 #include <cstddef>
19 #include <stop_token>
20 #include <system_error>
21
22 namespace boost::corosio::detail {
23
24 /* CRTP base for awaitables that return io_result<std::size_t>.
25
26 Derived classes must provide:
27
28 std::coroutine_handle<> dispatch(
29 std::coroutine_handle<> h,
30 capy::executor_ref ex) const;
31
32 which forwards to the backend implementation method, passing
33 token_, &ec_, and &bytes_ as the cancellation/output parameters.
34 */
35 template<class Derived>
36 class bytes_op_base
37 {
38 friend Derived;
39 516439x bytes_op_base() = default;
40
41 public:
42 std::stop_token token_;
43 mutable std::error_code ec_;
44 mutable std::size_t bytes_ = 0;
45
46 516439x bool await_ready() const noexcept
47 {
48 // A pre-set ec_ means the initiator failed before dispatch
49 // (e.g. a closed object); complete immediately with that error.
50
3/4
✓ Branch 3 → 4 taken 516435 times.
✓ Branch 3 → 6 taken 4 times.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 516435 times.
516439x return static_cast<bool>(ec_) || token_.stop_requested();
51 }
52
53 516429x [[nodiscard]] capy::io_result<std::size_t> await_resume() const noexcept
54 {
55
2/2
✓ Branch 3 → 4 taken 1067 times.
✓ Branch 3 → 7 taken 515362 times.
516429x if (token_.stop_requested())
56 1067x return {make_error_code(std::errc::operation_canceled), 0};
57 515362x return {ec_, bytes_};
58 }
59
60 516435x auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env)
61 -> std::coroutine_handle<>
62 {
63 516435x token_ = env->stop_token;
64 516435x return static_cast<Derived const*>(this)->dispatch(h, env->executor);
65 }
66 };
67
68 /* CRTP base for awaitables that return io_result<Value> for a
69 moved-out result object (e.g. the resolver's result lists).
70
71 Derived classes must provide:
72
73 std::coroutine_handle<> dispatch(
74 std::coroutine_handle<> h,
75 capy::executor_ref ex) const;
76
77 which forwards to the backend implementation method, passing
78 token_, &ec_, and &value_ as the cancellation/output parameters.
79 */
80 template<class Derived, class Value>
81 class value_op_base
82 {
83 friend Derived;
84 49x value_op_base() = default;
85
86 public:
87 std::stop_token token_;
88 mutable std::error_code ec_;
89 mutable Value value_{};
90
91 49x bool await_ready() const noexcept
92 {
93 // A pre-set ec_ means the initiator failed before dispatch;
94 // complete immediately with that error.
95
2/4
✓ Branch 3 → 4 taken 49 times.
✗ Branch 3 → 6 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 49 times.
49x return static_cast<bool>(ec_) || token_.stop_requested();
96 }
97
98 43x [[nodiscard]] capy::io_result<Value> await_resume() const noexcept
99 {
100
2/2
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 9 taken 41 times.
43x if (token_.stop_requested())
101 2x return {make_error_code(std::errc::operation_canceled), {}};
102 41x return {ec_, std::move(value_)};
103 }
104
105 49x auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env)
106 -> std::coroutine_handle<>
107 {
108 49x token_ = env->stop_token;
109 49x return static_cast<Derived const*>(this)->dispatch(h, env->executor);
110 }
111 };
112
113 /* CRTP base for awaitables that return io_result<>.
114
115 Derived classes must provide:
116
117 std::coroutine_handle<> dispatch(
118 std::coroutine_handle<> h,
119 capy::executor_ref ex) const;
120
121 which forwards to the backend implementation method, passing
122 token_ and &ec_ as the cancellation/output parameters.
123 */
124 template<class Derived>
125 class void_op_base
126 {
127 friend Derived;
128 2028x void_op_base() = default;
129
130 public:
131 std::stop_token token_;
132 mutable std::error_code ec_;
133
134 2028x bool await_ready() const noexcept
135 {
136 // A pre-set ec_ means the initiator failed before dispatch
137 // (e.g. auto-open); complete immediately with that error.
138
3/4
✓ Branch 3 → 4 taken 2026 times.
✓ Branch 3 → 6 taken 2 times.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 2026 times.
2028x return static_cast<bool>(ec_) || token_.stop_requested();
139 }
140
141 2020x [[nodiscard]] capy::io_result<> await_resume() const noexcept
142 {
143
2/2
✓ Branch 3 → 4 taken 12 times.
✓ Branch 3 → 7 taken 2008 times.
2020x if (token_.stop_requested())
144 12x return {make_error_code(std::errc::operation_canceled)};
145 2008x return {ec_};
146 }
147
148 2026x auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env)
149 -> std::coroutine_handle<>
150 {
151 2026x token_ = env->stop_token;
152 2026x return static_cast<Derived const*>(this)->dispatch(h, env->executor);
153 }
154 };
155
156 } // namespace boost::corosio::detail
157
158 #endif // BOOST_COROSIO_DETAIL_OP_BASE_HPP
159