95.45% Lines (21/22) 100.00% Functions (8/8)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2026 Michael Vandeberg 2   // Copyright (c) 2026 Michael Vandeberg
3   // 3   //
4   // Distributed under the Boost Software License, Version 1.0. (See accompanying 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) 5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6   // 6   //
7   // Official repository: https://github.com/cppalliance/corosio 7   // Official repository: https://github.com/cppalliance/corosio
8   // 8   //
9   9  
10   #ifndef BOOST_COROSIO_DETAIL_OP_BASE_HPP 10   #ifndef BOOST_COROSIO_DETAIL_OP_BASE_HPP
11   #define BOOST_COROSIO_DETAIL_OP_BASE_HPP 11   #define BOOST_COROSIO_DETAIL_OP_BASE_HPP
12   12  
13   #include <boost/capy/io_result.hpp> 13   #include <boost/capy/io_result.hpp>
14   #include <boost/capy/ex/executor_ref.hpp> 14   #include <boost/capy/ex/executor_ref.hpp>
15   #include <boost/capy/ex/io_env.hpp> 15   #include <boost/capy/ex/io_env.hpp>
16   16  
17   #include <coroutine> 17   #include <coroutine>
18   #include <cstddef> 18   #include <cstddef>
19   #include <stop_token> 19   #include <stop_token>
20   #include <system_error> 20   #include <system_error>
21   21  
22   namespace boost::corosio::detail { 22   namespace boost::corosio::detail {
23   23  
24   /* CRTP base for awaitables that return io_result<std::size_t>. 24   /* CRTP base for awaitables that return io_result<std::size_t>.
25   25  
26   Derived classes must provide: 26   Derived classes must provide:
27   27  
28   std::coroutine_handle<> dispatch( 28   std::coroutine_handle<> dispatch(
29   std::coroutine_handle<> h, 29   std::coroutine_handle<> h,
30   capy::executor_ref ex) const; 30   capy::executor_ref ex) const;
31   31  
32   which forwards to the backend implementation method, passing 32   which forwards to the backend implementation method, passing
33   token_, &ec_, and &bytes_ as the cancellation/output parameters. 33   token_, &ec_, and &bytes_ as the cancellation/output parameters.
34   */ 34   */
35   template<class Derived> 35   template<class Derived>
36   class bytes_op_base 36   class bytes_op_base
37   { 37   {
38   friend Derived; 38   friend Derived;
HITCBC 39   429269 bytes_op_base() = default; 39   446919 bytes_op_base() = default;
40   40  
41   public: 41   public:
42   std::stop_token token_; 42   std::stop_token token_;
43   mutable std::error_code ec_; 43   mutable std::error_code ec_;
44   mutable std::size_t bytes_ = 0; 44   mutable std::size_t bytes_ = 0;
45   45  
HITCBC 46   429269 bool await_ready() const noexcept 46   446919 bool await_ready() const noexcept
47   { 47   {
HITCBC 48   429269 return token_.stop_requested(); 48   446919 return token_.stop_requested();
49   } 49   }
50   50  
HITCBC 51   429269 capy::io_result<std::size_t> await_resume() const noexcept 51   446919 capy::io_result<std::size_t> await_resume() const noexcept
52   { 52   {
HITCBC 53   429269 if (token_.stop_requested()) 53   446919 if (token_.stop_requested())
HITCBC 54   193 return {make_error_code(std::errc::operation_canceled), 0}; 54   193 return {make_error_code(std::errc::operation_canceled), 0};
HITCBC 55   429076 return {ec_, bytes_}; 55   446726 return {ec_, bytes_};
56   } 56   }
57   57  
HITCBC 58   429269 auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env) 58   446919 auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env)
59   -> std::coroutine_handle<> 59   -> std::coroutine_handle<>
60   { 60   {
HITCBC 61   429269 token_ = env->stop_token; 61   446919 token_ = env->stop_token;
HITCBC 62   429269 return static_cast<Derived const*>(this)->dispatch( 62   446919 return static_cast<Derived const*>(this)->dispatch(
HITCBC 63   429269 h, env->executor); 63   446919 h, env->executor);
64   } 64   }
65   }; 65   };
66   66  
67   /* CRTP base for awaitables that return io_result<>. 67   /* CRTP base for awaitables that return io_result<>.
68   68  
69   Derived classes must provide: 69   Derived classes must provide:
70   70  
71   std::coroutine_handle<> dispatch( 71   std::coroutine_handle<> dispatch(
72   std::coroutine_handle<> h, 72   std::coroutine_handle<> h,
73   capy::executor_ref ex) const; 73   capy::executor_ref ex) const;
74   74  
75   which forwards to the backend implementation method, passing 75   which forwards to the backend implementation method, passing
76   token_ and &ec_ as the cancellation/output parameters. 76   token_ and &ec_ as the cancellation/output parameters.
77   */ 77   */
78   template<class Derived> 78   template<class Derived>
79   class void_op_base 79   class void_op_base
80   { 80   {
81   friend Derived; 81   friend Derived;
HITCBC 82   6328 void_op_base() = default; 82   7538 void_op_base() = default;
83   83  
84   public: 84   public:
85   std::stop_token token_; 85   std::stop_token token_;
86   mutable std::error_code ec_; 86   mutable std::error_code ec_;
87   87  
HITCBC 88   6328 bool await_ready() const noexcept 88   7538 bool await_ready() const noexcept
89   { 89   {
HITCBC 90   6328 return token_.stop_requested(); 90   7538 return token_.stop_requested();
91   } 91   }
92   92  
HITCBC 93   6328 capy::io_result<> await_resume() const noexcept 93   7538 capy::io_result<> await_resume() const noexcept
94   { 94   {
HITCBC 95   6328 if (token_.stop_requested()) 95   7538 if (token_.stop_requested())
MISUBC 96   return {make_error_code(std::errc::operation_canceled)}; 96   return {make_error_code(std::errc::operation_canceled)};
HITCBC 97   6328 return {ec_}; 97   7538 return {ec_};
98   } 98   }
99   99  
HITCBC 100   6328 auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env) 100   7538 auto await_suspend(std::coroutine_handle<> h, capy::io_env const* env)
101   -> std::coroutine_handle<> 101   -> std::coroutine_handle<>
102   { 102   {
HITCBC 103   6328 token_ = env->stop_token; 103   7538 token_ = env->stop_token;
HITCBC 104   6328 return static_cast<Derived const*>(this)->dispatch( 104   7538 return static_cast<Derived const*>(this)->dispatch(
HITCBC 105   6328 h, env->executor); 105   7538 h, env->executor);
106   } 106   }
107   }; 107   };
108   108  
109   } // namespace boost::corosio::detail 109   } // namespace boost::corosio::detail
110   110  
111   #endif // BOOST_COROSIO_DETAIL_OP_BASE_HPP 111   #endif // BOOST_COROSIO_DETAIL_OP_BASE_HPP