TLA Line data 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_NATIVE_DETAIL_REACTOR_REACTOR_STREAM_OPS_HPP
11 : #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_STREAM_OPS_HPP
12 :
13 : #include <boost/corosio/native/detail/reactor/reactor_op.hpp>
14 : #include <boost/corosio/native/detail/reactor/reactor_op_complete.hpp>
15 :
16 : namespace boost::corosio::detail {
17 :
18 : /* Parameterized stream op types for reactor backends.
19 :
20 : Given a Traits type (providing write_policy, accept_policy) and
21 : forward-declared Socket/Acceptor types, generates all the concrete
22 : op types needed for a stream socket. The cancel() and operator()()
23 : bodies reference Socket/Acceptor but are only instantiated when the
24 : vtable of a derived type is emitted -- at which point those types
25 : are complete.
26 :
27 : @tparam Traits Backend traits (epoll_traits, kqueue_traits, etc.)
28 : @tparam Socket The concrete stream socket type (forward-declared).
29 : @tparam Acceptor The concrete stream acceptor type (forward-declared).
30 : @tparam Endpoint The endpoint type (endpoint or local_endpoint).
31 : */
32 :
33 : template<class Traits, class Socket, class Acceptor, class Endpoint>
34 : struct reactor_stream_base_op : reactor_op<Socket, Acceptor>
35 : {
36 : void operator()() override;
37 : void cancel() noexcept override;
38 : };
39 :
40 : template<class Traits, class Socket, class Acceptor, class Endpoint>
41 : struct reactor_stream_connect_op final
42 : : reactor_connect_op<
43 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>,
44 : Endpoint>
45 : {
46 : void operator()() override;
47 : };
48 :
49 : template<class Traits, class Socket, class Acceptor, class Endpoint>
50 : struct reactor_stream_read_op final
51 : : reactor_read_op<
52 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>>
53 : {};
54 :
55 : template<class Traits, class Socket, class Acceptor, class Endpoint>
56 : struct reactor_stream_write_op final
57 : : reactor_write_op<
58 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>,
59 : typename Traits::write_policy>
60 : {};
61 :
62 : template<class Traits, class Socket, class Acceptor, class Endpoint>
63 : struct reactor_stream_accept_op final
64 : : reactor_accept_op<
65 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>,
66 : typename Traits::accept_policy>
67 : {
68 : void operator()() override;
69 : };
70 :
71 : template<class Traits, class Socket, class Acceptor, class Endpoint>
72 : struct reactor_stream_wait_op final
73 : : reactor_wait_op<
74 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>>
75 : {
76 : void operator()() override;
77 : };
78 :
79 : // --- Deferred implementations (instantiated when Socket/Acceptor are complete) ---
80 :
81 : template<class Traits, class Socket, class Acceptor, class Endpoint>
82 : void
83 HIT 81838 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>::operator()()
84 : {
85 81838 : complete_io_op(*this);
86 81838 : }
87 :
88 : template<class Traits, class Socket, class Acceptor, class Endpoint>
89 : void
90 325 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>::cancel() noexcept
91 : {
92 325 : if (this->socket_impl_)
93 237 : this->socket_impl_->cancel_single_op(*this);
94 88 : else if (this->acceptor_impl_)
95 88 : this->acceptor_impl_->cancel_single_op(*this);
96 : else
97 MIS 0 : this->request_cancel();
98 HIT 325 : }
99 :
100 : template<class Traits, class Socket, class Acceptor, class Endpoint>
101 : void
102 4565 : reactor_stream_connect_op<Traits, Socket, Acceptor, Endpoint>::operator()()
103 : {
104 4565 : complete_connect_op(*this);
105 4565 : }
106 :
107 : template<class Traits, class Socket, class Acceptor, class Endpoint>
108 : void
109 4611 : reactor_stream_accept_op<Traits, Socket, Acceptor, Endpoint>::operator()()
110 : {
111 4611 : complete_accept_op<Socket>(*this);
112 4611 : }
113 :
114 : template<class Traits, class Socket, class Acceptor, class Endpoint>
115 : void
116 123 : reactor_stream_wait_op<Traits, Socket, Acceptor, Endpoint>::operator()()
117 : {
118 123 : complete_wait_op(*this);
119 123 : }
120 :
121 : } // namespace boost::corosio::detail
122 :
123 : #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_STREAM_OPS_HPP
|