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 : // --- Deferred implementations (instantiated when Socket/Acceptor are complete) ---
75 :
76 : template<class Traits, class Socket, class Acceptor, class Endpoint>
77 : void
78 HIT 81489 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>::operator()()
79 : {
80 81489 : complete_io_op(*this);
81 81489 : }
82 :
83 : template<class Traits, class Socket, class Acceptor, class Endpoint>
84 : void
85 198 : reactor_stream_base_op<Traits, Socket, Acceptor, Endpoint>::cancel() noexcept
86 : {
87 198 : if (this->socket_impl_)
88 192 : this->socket_impl_->cancel_single_op(*this);
89 6 : else if (this->acceptor_impl_)
90 6 : this->acceptor_impl_->cancel_single_op(*this);
91 : else
92 MIS 0 : this->request_cancel();
93 HIT 198 : }
94 :
95 : template<class Traits, class Socket, class Acceptor, class Endpoint>
96 : void
97 8522 : reactor_stream_connect_op<Traits, Socket, Acceptor, Endpoint>::operator()()
98 : {
99 8522 : complete_connect_op(*this);
100 8522 : }
101 :
102 : template<class Traits, class Socket, class Acceptor, class Endpoint>
103 : void
104 8530 : reactor_stream_accept_op<Traits, Socket, Acceptor, Endpoint>::operator()()
105 : {
106 8530 : complete_accept_op<Socket>(*this);
107 8530 : }
108 :
109 : } // namespace boost::corosio::detail
110 :
111 : #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_STREAM_OPS_HPP
|