libs/capy/include/boost/capy/detail/run_callbacks.hpp

92.6% Lines (25/27) 52.4% Functions (98/187) 80.0% Branches (4/5)
libs/capy/include/boost/capy/detail/run_callbacks.hpp
Line Branch Hits Source Code
1 //
2 // Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
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/capy
8 //
9
10 #ifndef BOOST_CAPY_DETAIL_RUN_CALLBACKS_HPP
11 #define BOOST_CAPY_DETAIL_RUN_CALLBACKS_HPP
12
13 #include <boost/capy/detail/config.hpp>
14
15 #include <concepts>
16 #include <exception>
17 #include <type_traits>
18 #include <utility>
19
20 namespace boost {
21 namespace capy {
22 namespace detail {
23
24 struct default_handler
25 {
26 template<class T>
27 2 void operator()(T&&) const noexcept
28 {
29 2 }
30
31 920 void operator()() const noexcept
32 {
33 920 }
34
35 599 void operator()(std::exception_ptr ep) const
36 {
37
1/2
✓ Branch 1 taken 599 times.
✗ Branch 2 not taken.
599 if(ep)
38 599 std::rethrow_exception(ep);
39 }
40 };
41
42 template<class H1, class H2>
43 struct handler_pair
44 {
45 static_assert(
46 std::is_nothrow_move_constructible_v<H1> &&
47 std::is_nothrow_move_constructible_v<H2>,
48 "Handlers must be nothrow move constructible");
49
50 H1 h1_;
51 H2 h2_;
52
53 template<class T>
54 14 void operator()(T&& v)
55 {
56
1/1
✓ Branch 3 taken 1 time.
14 h1_(std::forward<T>(v));
57 14 }
58
59 1 void operator()()
60 {
61 1 h1_();
62 1 }
63
64 7 void operator()(std::exception_ptr ep)
65 {
66
1/1
✓ Branch 2 taken 6 times.
7 h2_(ep);
67 7 }
68 };
69
70 template<class H1>
71 struct handler_pair<H1, default_handler>
72 {
73 static_assert(
74 std::is_nothrow_move_constructible_v<H1>,
75 "Handler must be nothrow move constructible");
76
77 H1 h1_;
78
79 template<class T>
80 59 void operator()(T&& v)
81 {
82 59 h1_(std::forward<T>(v));
83 59 }
84
85 1841 void operator()()
86 {
87 1841 h1_();
88 1841 }
89
90 1203 void operator()(std::exception_ptr ep)
91 {
92 if constexpr(std::invocable<H1, std::exception_ptr>)
93
1/1
✓ Branch 2 taken 602 times.
1203 h1_(ep);
94 else
95 std::rethrow_exception(ep);
96 604 }
97 };
98
99 } // namespace detail
100 } // namespace capy
101 } // namespace boost
102
103 #endif
104