Line data 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 599 : if(ep)
38 599 : std::rethrow_exception(ep);
39 0 : }
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 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 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 1203 : h1_(ep);
94 : else
95 0 : std::rethrow_exception(ep);
96 604 : }
97 : };
98 :
99 : } // namespace detail
100 : } // namespace capy
101 : } // namespace boost
102 :
103 : #endif
|