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
35 : : reactor_op<Socket, Acceptor>
36 : {
37 : void operator()() override;
38 : void cancel() noexcept override;
39 : };
40 :
41 : template<class Traits, class Socket, class Acceptor, class Endpoint>
42 : struct reactor_stream_connect_op final
43 : : reactor_connect_op<
44 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>,
45 : Endpoint>
46 : {
47 : void operator()() override;
48 : };
49 :
50 : template<class Traits, class Socket, class Acceptor, class Endpoint>
51 : struct reactor_stream_read_op final
52 : : reactor_read_op<
53 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>>
54 : {
55 : };
56 :
57 : template<class Traits, class Socket, class Acceptor, class Endpoint>
58 : struct reactor_stream_write_op final
59 : : reactor_write_op<
60 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>,
61 : typename Traits::write_policy>
62 : {
63 : };
64 :
65 : template<class Traits, class Socket, class Acceptor, class Endpoint>
66 : struct reactor_stream_accept_op final
67 : : reactor_accept_op<
68 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>,
69 : typename Traits::accept_policy>
70 : {
71 : void operator()() override;
72 : };
73 :
74 : template<class Traits, class Socket, class Acceptor, class Endpoint>
75 : struct reactor_stream_wait_op final
76 : : reactor_wait_op<
77 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>>
78 : {
79 : void operator()() override;
80 : };
81 :
82 : // --- Deferred implementations (instantiated when Socket/Acceptor are complete) ---
83 :
84 : template<class Traits, class Socket, class Acceptor, class Endpoint>
85 : void
86 HIT 78903 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>::operator()()
87 : {
88 78903 : complete_io_op(*this);
89 78903 : }
90 :
91 : template<class Traits, class Socket, class Acceptor, class Endpoint>
92 : void
93 197 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>::cancel() noexcept
94 : {
95 197 : if (this->socket_impl_)
96 191 : this->socket_impl_->cancel_single_op(*this);
97 6 : else if (this->acceptor_impl_)
98 6 : this->acceptor_impl_->cancel_single_op(*this);
99 : else
100 MIS 0 : this->request_cancel();
101 HIT 197 : }
102 :
103 : template<class Traits, class Socket, class Acceptor, class Endpoint>
104 : void
105 8429 : reactor_stream_connect_op<Traits, Socket, Acceptor, Endpoint>::operator()()
106 : {
107 8429 : complete_connect_op(*this);
108 8429 : }
109 :
110 : template<class Traits, class Socket, class Acceptor, class Endpoint>
111 : void
112 8423 : reactor_stream_accept_op<Traits, Socket, Acceptor, Endpoint>::operator()()
113 : {
114 8423 : complete_accept_op<Socket>(*this);
115 8423 : }
116 :
117 : template<class Traits, class Socket, class Acceptor, class Endpoint>
118 : void
119 10 : reactor_stream_wait_op<Traits, Socket, Acceptor, Endpoint>::operator()()
120 : {
121 10 : complete_wait_op(*this);
122 10 : }
123 :
124 : } // namespace boost::corosio::detail
125 :
126 : #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_STREAM_OPS_HPP
|