/tmp/bitcoin/src/btcsignals.h
Line | Count | Source |
1 | | // Copyright (c) The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #ifndef BITCOIN_BTCSIGNALS_H |
6 | | #define BITCOIN_BTCSIGNALS_H |
7 | | |
8 | | #include <sync.h> |
9 | | |
10 | | #include <algorithm> |
11 | | #include <atomic> |
12 | | #include <functional> |
13 | | #include <memory> |
14 | | #include <optional> |
15 | | #include <type_traits> |
16 | | #include <utility> |
17 | | #include <vector> |
18 | | |
19 | | /** |
20 | | * btcsignals is a simple mechanism for signaling events to multiple subscribers. |
21 | | * It is api-compatible with a minimal subset of boost::signals2. |
22 | | * |
23 | | * Rather than using a custom slot type, and the features/complexity that they |
24 | | * imply, std::function is used to store the callbacks. Lifetime management of |
25 | | * the callbacks is left up to the user. |
26 | | * |
27 | | * All usage is thread-safe except for interacting with a connection while |
28 | | * copying/moving it on another thread. |
29 | | */ |
30 | | |
31 | | namespace btcsignals { |
32 | | |
33 | | /* |
34 | | * optional_last_value is the default and only supported combiner. |
35 | | * As such, its behavior is embedded into the signal functor. |
36 | | * |
37 | | * Because optional<void> is undefined, void must be special-cased. |
38 | | */ |
39 | | |
40 | | template <typename T> |
41 | | class optional_last_value |
42 | | { |
43 | | public: |
44 | | using result_type = std::conditional_t<std::is_void_v<T>, void, std::optional<T>>; |
45 | | }; |
46 | | |
47 | | template <typename Signature, typename Combiner = optional_last_value<typename std::function<Signature>::result_type>> |
48 | | class signal; |
49 | | |
50 | | /* |
51 | | * State object representing the liveness of a registered callback. |
52 | | * signal::connect() returns an enabled connection which can be held and |
53 | | * disabled in the future. |
54 | | */ |
55 | | class connection |
56 | | { |
57 | | template <typename Signature, typename Combiner> |
58 | | friend class signal; |
59 | | /** |
60 | | * Track liveness. Also serves as a tag for the constructor used by signal. |
61 | | */ |
62 | | class liveness |
63 | | { |
64 | | friend class connection; |
65 | | std::atomic_bool m_connected{true}; |
66 | | |
67 | 1.38k | void disconnect() { m_connected.store(false); } |
68 | | public: |
69 | 1.10M | bool connected() const { return m_connected.load(); } |
70 | | }; |
71 | | |
72 | | /** |
73 | | * connections have shared_ptr-like copy and move semantics. |
74 | | */ |
75 | | std::shared_ptr<liveness> m_state{}; |
76 | | |
77 | | /** |
78 | | * Only a signal can create an enabled connection. |
79 | | */ |
80 | 21.5k | explicit connection(std::shared_ptr<liveness>&& state) : m_state{std::move(state)}{} |
81 | | |
82 | | public: |
83 | | /** |
84 | | * The default constructor creates a connection with no associated signal |
85 | | */ |
86 | 6 | constexpr connection() noexcept = default; |
87 | | |
88 | | /** |
89 | | * If a callback is associated with this connection, prevent it from being |
90 | | * called in the future. |
91 | | * |
92 | | * If a connection is disabled as part of a signal's callback function, it |
93 | | * will _not_ be executed in the current signal invocation. |
94 | | * |
95 | | * Note that disconnected callbacks are not removed from their owning |
96 | | * signals here. They are garbage collected in signal::connect(). |
97 | | */ |
98 | | void disconnect() |
99 | 1.38k | { |
100 | 1.38k | if (m_state) { |
101 | 1.38k | m_state->disconnect(); |
102 | 1.38k | } |
103 | 1.38k | } |
104 | | |
105 | | /** |
106 | | * Returns true if this connection was created by a signal and has not been |
107 | | * disabled. |
108 | | */ |
109 | | bool connected() const |
110 | 1.01k | { |
111 | 1.01k | return m_state && m_state->connected(); |
112 | 1.01k | } |
113 | | }; |
114 | | |
115 | | /* |
116 | | * RAII-style connection management |
117 | | */ |
118 | | class scoped_connection |
119 | | { |
120 | | connection m_conn; |
121 | | |
122 | | public: |
123 | 1.00k | scoped_connection(connection rhs) noexcept : m_conn{std::move(rhs)} {} |
124 | | |
125 | 0 | scoped_connection(scoped_connection&&) noexcept = default; |
126 | | scoped_connection& operator=(scoped_connection&&) noexcept = default; |
127 | | |
128 | | /** |
129 | | * For simplicity, disable copy assignment and construction. |
130 | | */ |
131 | | scoped_connection& operator=(const scoped_connection&) = delete; |
132 | | scoped_connection(const scoped_connection&) = delete; |
133 | | |
134 | | void disconnect() |
135 | 1.00k | { |
136 | 1.00k | m_conn.disconnect(); |
137 | 1.00k | } |
138 | | |
139 | | ~scoped_connection() |
140 | 1.00k | { |
141 | 1.00k | disconnect(); |
142 | 1.00k | } |
143 | | }; |
144 | | |
145 | | /* |
146 | | * Functor for calling zero or more connected callbacks |
147 | | */ |
148 | | template <typename Signature, typename Combiner> |
149 | | class signal |
150 | | { |
151 | | using function_type = std::function<Signature>; |
152 | | |
153 | | static_assert(std::is_same_v<Combiner, optional_last_value<typename function_type::result_type>>, "only the optional_last_value combiner is supported"); |
154 | | |
155 | | /* |
156 | | * Helper struct for maintaining a callback and its associated connection liveness |
157 | | */ |
158 | | struct connection_holder : connection::liveness { |
159 | | template <typename Callable> |
160 | 21.5k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} |
161 | 21.5k | { |
162 | 21.5k | } btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<void (&)(int&)>(void (&)(int&)) Line | Count | Source | 160 | 8 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 8 | { | 162 | 8 | } |
btcsignals_tests.cpp:btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::connection_holder::connection_holder<(anonymous namespace)::MoveOnlyData (&)(int)>((anonymous namespace)::MoveOnlyData (&)(int)) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::connection_holder::connection_holder<bool (&)()>(bool (&)()) Line | Count | Source | 160 | 3 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 3 | { | 162 | 3 | } |
btcsignals_tests.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::thread_safety::test_method()::$_0>(btcsignals_tests::thread_safety::test_method()::$_0&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals_tests.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()&&) Line | Count | Source | 160 | 1.00k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1.00k | { | 162 | 1.00k | } |
btcsignals_tests.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::recursion_safety::test_method()::$_0>(btcsignals_tests::recursion_safety::test_method()::$_0&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals_tests.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::recursion_safety::test_method()::$_1>(btcsignals_tests::recursion_safety::test_method()::$_1&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals_tests.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::recursion_safety::test_method()::$_2>(btcsignals_tests::recursion_safety::test_method()::$_2&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals_tests.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals_tests.cpp:btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<btcsignals_tests::disconnect_thread_safety::test_method()::$_0>(btcsignals_tests::disconnect_thread_safety::test_method()::$_0&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
btcsignals::signal<bool (bilingual_str const&, unsigned int), btcsignals::optional_last_value<bool>>::connection_holder::connection_holder<std::function<bool (bilingual_str const&, unsigned int)>&>(std::function<bool (bilingual_str const&, unsigned int)>&) Line | Count | Source | 160 | 1.42k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1.42k | { | 162 | 1.42k | } |
btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::optional_last_value<bool>>::connection_holder::connection_holder<std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>&>(std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>&) Line | Count | Source | 160 | 1.42k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1.42k | { | 162 | 1.42k | } |
btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>&) Line | Count | Source | 160 | 2.51k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 2.51k | { | 162 | 2.51k | } |
Unexecuted instantiation: btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void ()>&>(std::function<void ()>&) Unexecuted instantiation: btcsignals::signal<void (int), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (int)>&>(std::function<void (int)>&) Unexecuted instantiation: btcsignals::signal<void (bool), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (bool)>&>(std::function<void (bool)>&) Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>&) btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (SynchronizationState, CBlockIndex const&, double)>&>(std::function<void (SynchronizationState, CBlockIndex const&, double)>&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
Unexecuted instantiation: btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (SynchronizationState, long, long, bool)>&>(std::function<void (SynchronizationState, long, long, bool)>&) Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>&) Unexecuted instantiation: interfaces.cpp:btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*)>(wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*)&&) Unexecuted instantiation: interfaces.cpp:btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>(wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)&&) Unexecuted instantiation: interfaces.cpp:btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType)>(wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType)&&) wallet.cpp:btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0&&) Line | Count | Source | 160 | 7.60k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 7.60k | { | 162 | 7.60k | } |
wallet.cpp:btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::connection_holder::connection_holder<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1&&) Line | Count | Source | 160 | 7.60k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 7.60k | { | 162 | 7.60k | } |
|
163 | | |
164 | | const function_type m_callback; |
165 | | }; |
166 | | |
167 | | mutable Mutex m_mutex; |
168 | | |
169 | | std::vector<std::shared_ptr<connection_holder>> m_connections GUARDED_BY(m_mutex){}; |
170 | | |
171 | | public: |
172 | | using result_type = Combiner::result_type; |
173 | | |
174 | 20.5k | constexpr signal() noexcept = default; btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 3 | constexpr signal() noexcept = default; |
btcsignals_tests.cpp:btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::signal() Line | Count | Source | 174 | 1 | constexpr signal() noexcept = default; |
btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::signal() Line | Count | Source | 174 | 1 | constexpr signal() noexcept = default; |
btcsignals::signal<void (), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 9.23k | constexpr signal() noexcept = default; |
btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 1.03k | constexpr signal() noexcept = default; |
btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 1.03k | constexpr signal() noexcept = default; |
btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 1.03k | constexpr signal() noexcept = default; |
btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 1.03k | constexpr signal() noexcept = default; |
btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::signal() Line | Count | Source | 174 | 7.15k | constexpr signal() noexcept = default; |
|
175 | 20.5k | ~signal() = default; btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 3 | ~signal() = default; |
btcsignals_tests.cpp:btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::~signal() Line | Count | Source | 175 | 1 | ~signal() = default; |
btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::~signal() Line | Count | Source | 175 | 1 | ~signal() = default; |
btcsignals::signal<void (), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 9.23k | ~signal() = default; |
btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 1.03k | ~signal() = default; |
btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 1.03k | ~signal() = default; |
btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 1.03k | ~signal() = default; |
btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 1.03k | ~signal() = default; |
Unexecuted instantiation: btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::optional_last_value<void>>::~signal() Unexecuted instantiation: btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::optional_last_value<void>>::~signal() Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::optional_last_value<void>>::~signal() Unexecuted instantiation: btcsignals::signal<void (bool), btcsignals::optional_last_value<void>>::~signal() Unexecuted instantiation: btcsignals::signal<void (int), btcsignals::optional_last_value<void>>::~signal() Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::optional_last_value<void>>::~signal() Unexecuted instantiation: btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::optional_last_value<bool>>::~signal() Unexecuted instantiation: btcsignals::signal<bool (bilingual_str const&, unsigned int), btcsignals::optional_last_value<bool>>::~signal() btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::~signal() Line | Count | Source | 175 | 7.15k | ~signal() = default; |
|
176 | | |
177 | | /* |
178 | | * For simplicity, disable all moving/copying/assigning. |
179 | | */ |
180 | | signal(const signal&) = delete; |
181 | | signal(signal&&) = delete; |
182 | | signal& operator=(const signal&) = delete; |
183 | | signal& operator=(signal&&) = delete; |
184 | | |
185 | | /* |
186 | | * Execute all enabled callbacks for the signal. Rather than allowing for |
187 | | * custom combiners, the behavior of optional_last_value is hard-coded |
188 | | * here. Return the value of the last executed callback, or nullopt if none |
189 | | * were executed. |
190 | | * |
191 | | * Callbacks which return void require special handling. |
192 | | * |
193 | | * In order to avoid locking during the callbacks, the list of callbacks is |
194 | | * cached before they are called. This allows a callback to call connect(), |
195 | | * but the newly connected callback will not be run during the current |
196 | | * signal invocation. |
197 | | * |
198 | | * Note that the parameters are accepted as universal references, though |
199 | | * they are not perfectly forwarded as that could cause a use-after-move if |
200 | | * more than one callback is enabled. |
201 | | */ |
202 | | template <typename... Args> |
203 | | result_type operator()(Args&&... args) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) |
204 | 406k | { |
205 | 406k | std::vector<std::shared_ptr<connection_holder>> connections; |
206 | 406k | { |
207 | 406k | LOCK(m_mutex); |
208 | 406k | connections = m_connections; |
209 | 406k | } |
210 | 406k | if constexpr (std::is_void_v<result_type>) { |
211 | 590k | for (const auto& connection : connections) { |
212 | 590k | if (connection->connected()) { |
213 | 590k | connection->m_callback(args...); |
214 | 590k | } |
215 | 590k | } |
216 | 406k | } else { |
217 | 189 | result_type ret{std::nullopt}; |
218 | 191 | for (const auto& connection : connections) { |
219 | 191 | if (connection->connected()) { |
220 | 187 | ret.emplace(connection->m_callback(args...)); |
221 | 187 | } |
222 | 191 | } |
223 | 189 | return ret; |
224 | 189 | } |
225 | 406k | } void btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::operator()<int&>(int&) const Line | Count | Source | 204 | 6 | { | 205 | 6 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 6 | { | 207 | 6 | LOCK(m_mutex); | 208 | 6 | connections = m_connections; | 209 | 6 | } | 210 | 6 | if constexpr (std::is_void_v<result_type>) { | 211 | 13 | for (const auto& connection : connections) { | 212 | 13 | if (connection->connected()) { | 213 | 6 | connection->m_callback(args...); | 214 | 6 | } | 215 | 13 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 6 | } |
btcsignals_tests.cpp:std::optional<(anonymous namespace)::MoveOnlyData> btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::operator()<int&>(int&) const Line | Count | Source | 204 | 1 | { | 205 | 1 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 1 | { | 207 | 1 | LOCK(m_mutex); | 208 | 1 | connections = m_connections; | 209 | 1 | } | 210 | | if constexpr (std::is_void_v<result_type>) { | 211 | | for (const auto& connection : connections) { | 212 | | if (connection->connected()) { | 213 | | connection->m_callback(args...); | 214 | | } | 215 | | } | 216 | 1 | } else { | 217 | 1 | result_type ret{std::nullopt}; | 218 | 1 | for (const auto& connection : connections) { | 219 | 1 | if (connection->connected()) { | 220 | 1 | ret.emplace(connection->m_callback(args...)); | 221 | 1 | } | 222 | 1 | } | 223 | 1 | return ret; | 224 | 1 | } | 225 | 1 | } |
std::optional<bool> btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::operator()<>() const Line | Count | Source | 204 | 6 | { | 205 | 6 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 6 | { | 207 | 6 | LOCK(m_mutex); | 208 | 6 | connections = m_connections; | 209 | 6 | } | 210 | | if constexpr (std::is_void_v<result_type>) { | 211 | | for (const auto& connection : connections) { | 212 | | if (connection->connected()) { | 213 | | connection->m_callback(args...); | 214 | | } | 215 | | } | 216 | 6 | } else { | 217 | 6 | result_type ret{std::nullopt}; | 218 | 8 | for (const auto& connection : connections) { | 219 | 8 | if (connection->connected()) { | 220 | 4 | ret.emplace(connection->m_callback(args...)); | 221 | 4 | } | 222 | 8 | } | 223 | 6 | return ret; | 224 | 6 | } | 225 | 6 | } |
void btcsignals::signal<void (), btcsignals::optional_last_value<void>>::operator()<>() const Line | Count | Source | 204 | 162k | { | 205 | 162k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 162k | { | 207 | 162k | LOCK(m_mutex); | 208 | 162k | connections = m_connections; | 209 | 162k | } | 210 | 162k | if constexpr (std::is_void_v<result_type>) { | 211 | 575k | for (const auto& connection : connections) { | 212 | 575k | if (connection->connected()) { | 213 | 575k | connection->m_callback(args...); | 214 | 575k | } | 215 | 575k | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 162k | } |
std::optional<bool> btcsignals::signal<bool (bilingual_str const&, unsigned int), btcsignals::optional_last_value<bool>>::operator()<bilingual_str const&, unsigned int&>(bilingual_str const&, unsigned int&) const Line | Count | Source | 204 | 171 | { | 205 | 171 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 171 | { | 207 | 171 | LOCK(m_mutex); | 208 | 171 | connections = m_connections; | 209 | 171 | } | 210 | | if constexpr (std::is_void_v<result_type>) { | 211 | | for (const auto& connection : connections) { | 212 | | if (connection->connected()) { | 213 | | connection->m_callback(args...); | 214 | | } | 215 | | } | 216 | 171 | } else { | 217 | 171 | result_type ret{std::nullopt}; | 218 | 171 | for (const auto& connection : connections) { | 219 | 171 | if (connection->connected()) { | 220 | 171 | ret.emplace(connection->m_callback(args...)); | 221 | 171 | } | 222 | 171 | } | 223 | 171 | return ret; | 224 | 171 | } | 225 | 171 | } |
std::optional<bool> btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::optional_last_value<bool>>::operator()<bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int&>(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int&) const Line | Count | Source | 204 | 11 | { | 205 | 11 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 11 | { | 207 | 11 | LOCK(m_mutex); | 208 | 11 | connections = m_connections; | 209 | 11 | } | 210 | | if constexpr (std::is_void_v<result_type>) { | 211 | | for (const auto& connection : connections) { | 212 | | if (connection->connected()) { | 213 | | connection->m_callback(args...); | 214 | | } | 215 | | } | 216 | 11 | } else { | 217 | 11 | result_type ret{std::nullopt}; | 218 | 11 | for (const auto& connection : connections) { | 219 | 11 | if (connection->connected()) { | 220 | 11 | ret.emplace(connection->m_callback(args...)); | 221 | 11 | } | 222 | 11 | } | 223 | 11 | return ret; | 224 | 11 | } | 225 | 11 | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::optional_last_value<void>>::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) const Line | Count | Source | 204 | 7.48k | { | 205 | 7.48k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 7.48k | { | 207 | 7.48k | LOCK(m_mutex); | 208 | 7.48k | connections = m_connections; | 209 | 7.48k | } | 210 | 7.48k | if constexpr (std::is_void_v<result_type>) { | 211 | 14.9k | for (const auto& connection : connections) { | 212 | 14.9k | if (connection->connected()) { | 213 | 14.9k | connection->m_callback(args...); | 214 | 14.9k | } | 215 | 14.9k | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 7.48k | } |
void btcsignals::signal<void (int), btcsignals::optional_last_value<void>>::operator()<int&>(int&) const Line | Count | Source | 204 | 2.21k | { | 205 | 2.21k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 2.21k | { | 207 | 2.21k | LOCK(m_mutex); | 208 | 2.21k | connections = m_connections; | 209 | 2.21k | } | 210 | 2.21k | if constexpr (std::is_void_v<result_type>) { | 211 | 2.21k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 2.21k | } |
void btcsignals::signal<void (bool), btcsignals::optional_last_value<void>>::operator()<bool&>(bool&) const Line | Count | Source | 204 | 9 | { | 205 | 9 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 9 | { | 207 | 9 | LOCK(m_mutex); | 208 | 9 | connections = m_connections; | 209 | 9 | } | 210 | 9 | if constexpr (std::is_void_v<result_type>) { | 211 | 9 | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 9 | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::optional_last_value<void>>::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int&, bool&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int&, bool&) const Line | Count | Source | 204 | 7.45k | { | 205 | 7.45k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 7.45k | { | 207 | 7.45k | LOCK(m_mutex); | 208 | 7.45k | connections = m_connections; | 209 | 7.45k | } | 210 | 7.45k | if constexpr (std::is_void_v<result_type>) { | 211 | 7.45k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 7.45k | } |
void btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::optional_last_value<void>>::operator()<SynchronizationState&, CBlockIndex const&, double&>(SynchronizationState&, CBlockIndex const&, double&) const Line | Count | Source | 204 | 94.4k | { | 205 | 94.4k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 94.4k | { | 207 | 94.4k | LOCK(m_mutex); | 208 | 94.4k | connections = m_connections; | 209 | 94.4k | } | 210 | 94.4k | if constexpr (std::is_void_v<result_type>) { | 211 | 94.4k | for (const auto& connection : connections) { | 212 | 113 | if (connection->connected()) { | 213 | 113 | connection->m_callback(args...); | 214 | 113 | } | 215 | 113 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 94.4k | } |
void btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::optional_last_value<void>>::operator()<SynchronizationState&, long&, long&, bool&>(SynchronizationState&, long&, long&, bool&) const Line | Count | Source | 204 | 72.8k | { | 205 | 72.8k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 72.8k | { | 207 | 72.8k | LOCK(m_mutex); | 208 | 72.8k | connections = m_connections; | 209 | 72.8k | } | 210 | 72.8k | if constexpr (std::is_void_v<result_type>) { | 211 | 72.8k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 72.8k | } |
void btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::operator()<wallet::DescriptorScriptPubKeyMan*, unsigned long&>(wallet::DescriptorScriptPubKeyMan*&&, unsigned long&) const Line | Count | Source | 204 | 18 | { | 205 | 18 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 18 | { | 207 | 18 | LOCK(m_mutex); | 208 | 18 | connections = m_connections; | 209 | 18 | } | 210 | 18 | if constexpr (std::is_void_v<result_type>) { | 211 | 48 | for (const auto& connection : connections) { | 212 | 48 | if (connection->connected()) { | 213 | 48 | connection->m_callback(args...); | 214 | 48 | } | 215 | 48 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 18 | } |
void btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::operator()<wallet::CWallet*>(wallet::CWallet*&&) const Line | Count | Source | 204 | 182 | { | 205 | 182 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 182 | { | 207 | 182 | LOCK(m_mutex); | 208 | 182 | connections = m_connections; | 209 | 182 | } | 210 | 182 | if constexpr (std::is_void_v<result_type>) { | 211 | 182 | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 182 | } |
void btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::operator()<transaction_identifier<false> const&, ChangeType>(transaction_identifier<false> const&, ChangeType&&) const Line | Count | Source | 204 | 4.39k | { | 205 | 4.39k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 4.39k | { | 207 | 4.39k | LOCK(m_mutex); | 208 | 4.39k | connections = m_connections; | 209 | 4.39k | } | 210 | 4.39k | if constexpr (std::is_void_v<result_type>) { | 211 | 4.39k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 4.39k | } |
void btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::operator()<transaction_identifier<false>&, ChangeType>(transaction_identifier<false>&, ChangeType&&) const Line | Count | Source | 204 | 25.1k | { | 205 | 25.1k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 25.1k | { | 207 | 25.1k | LOCK(m_mutex); | 208 | 25.1k | connections = m_connections; | 209 | 25.1k | } | 210 | 25.1k | if constexpr (std::is_void_v<result_type>) { | 211 | 25.1k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 25.1k | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, int>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&&, int&&) const Line | Count | Source | 204 | 1.37k | { | 205 | 1.37k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 1.37k | { | 207 | 1.37k | LOCK(m_mutex); | 208 | 1.37k | connections = m_connections; | 209 | 1.37k | } | 210 | 1.37k | if constexpr (std::is_void_v<result_type>) { | 211 | 1.37k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 1.37k | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, int const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&&, int const&) const Line | Count | Source | 204 | 818 | { | 205 | 818 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 818 | { | 207 | 818 | LOCK(m_mutex); | 208 | 818 | connections = m_connections; | 209 | 818 | } | 210 | 818 | if constexpr (std::is_void_v<result_type>) { | 211 | 818 | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 818 | } |
void btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::operator()<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool&, wallet::AddressPurpose, ChangeType>(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool&, wallet::AddressPurpose&&, ChangeType&&) const Line | Count | Source | 204 | 28.0k | { | 205 | 28.0k | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 28.0k | { | 207 | 28.0k | LOCK(m_mutex); | 208 | 28.0k | connections = m_connections; | 209 | 28.0k | } | 210 | 28.0k | if constexpr (std::is_void_v<result_type>) { | 211 | 28.0k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 28.0k | } |
void btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::operator()<std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, char const (&) [1], bool, wallet::AddressPurpose, ChangeType>(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, char const (&) [1], bool&&, wallet::AddressPurpose&&, ChangeType&&) const Line | Count | Source | 204 | 27 | { | 205 | 27 | std::vector<std::shared_ptr<connection_holder>> connections; | 206 | 27 | { | 207 | 27 | LOCK(m_mutex); | 208 | 27 | connections = m_connections; | 209 | 27 | } | 210 | 27 | if constexpr (std::is_void_v<result_type>) { | 211 | 27 | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | result_type ret{std::nullopt}; | 218 | | for (const auto& connection : connections) { | 219 | | if (connection->connected()) { | 220 | | ret.emplace(connection->m_callback(args...)); | 221 | | } | 222 | | } | 223 | | return ret; | 224 | | } | 225 | 27 | } |
|
226 | | |
227 | | /* |
228 | | * Connect a new callback to the signal. A forwarding callable accepts |
229 | | * anything that can be stored in a std::function. |
230 | | */ |
231 | | template <typename Callable> |
232 | | connection connect(Callable&& func) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) |
233 | 21.5k | { |
234 | 21.5k | LOCK(m_mutex); |
235 | | |
236 | | // Garbage-collect disconnected connections to prevent unbounded growth |
237 | 509k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); });auto btcsignals::connection btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connect<void (&)(int&)>(void (&)(int&))::'lambda'(void (& const&)(int&))::operator()<std::shared_ptr<btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connection_holder>>(void (& const&)(int&)) const Line | Count | Source | 237 | 8 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::connect<(anonymous namespace)::MoveOnlyData (&)(int)>((anonymous namespace)::MoveOnlyData (&)(int))::'lambda'((anonymous namespace)::MoveOnlyData (& const&)(int))::operator()<std::shared_ptr<btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::connection_holder>>((anonymous namespace)::MoveOnlyData (& const&)(int)) const auto btcsignals::connection btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::connect<bool (&)()>(bool (&)())::'lambda'(bool (& const&)())::operator()<std::shared_ptr<btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::connection_holder>>(bool (& const&)()) const Line | Count | Source | 237 | 2 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::thread_safety::test_method()::$_0>(btcsignals_tests::thread_safety::test_method()::$_0&&)::'lambda'(btcsignals_tests::thread_safety::test_method()::$_0 const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::thread_safety::test_method()::$_0 const&) const btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()&&)::'lambda'(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'() const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'() const&) const Line | Count | Source | 237 | 500k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_0>(btcsignals_tests::recursion_safety::test_method()::$_0&&)::'lambda'(btcsignals_tests::recursion_safety::test_method()::$_0 const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_0 const&) const btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_1>(btcsignals_tests::recursion_safety::test_method()::$_1&&)::'lambda'(btcsignals_tests::recursion_safety::test_method()::$_1 const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_1 const&) const Line | Count | Source | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_2>(btcsignals_tests::recursion_safety::test_method()::$_2&&)::'lambda'(btcsignals_tests::recursion_safety::test_method()::$_2 const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_2 const&) const Line | Count | Source | 237 | 2 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()&&)::'lambda'(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'() const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'() const&) const Line | Count | Source | 237 | 2 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::disconnect_thread_safety::test_method()::$_0>(btcsignals_tests::disconnect_thread_safety::test_method()::$_0&&)::'lambda'(btcsignals_tests::disconnect_thread_safety::test_method()::$_0 const&)::operator()<std::shared_ptr<btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connection_holder>>(btcsignals_tests::disconnect_thread_safety::test_method()::$_0 const&) const auto btcsignals::connection btcsignals::signal<bool (bilingual_str const&, unsigned int), btcsignals::optional_last_value<bool>>::connect<std::function<bool (bilingual_str const&, unsigned int)>&>(std::function<bool (bilingual_str const&, unsigned int)>&)::'lambda'(std::function<bool (bilingual_str const&, unsigned int)>& const&)::operator()<std::shared_ptr<btcsignals::signal<bool (bilingual_str const&, unsigned int), btcsignals::optional_last_value<bool>>::connection_holder>>(std::function<bool (bilingual_str const&, unsigned int)>& const&) const Line | Count | Source | 237 | 124 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
auto btcsignals::connection btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::optional_last_value<bool>>::connect<std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>&>(std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>&)::'lambda'(std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>& const&)::operator()<std::shared_ptr<btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::optional_last_value<bool>>::connection_holder>>(std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>& const&) const Line | Count | Source | 237 | 124 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::optional_last_value<void>>::connect<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>&)::'lambda'(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>& const&) const Line | Count | Source | 237 | 1.21k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<std::function<void ()>&>(std::function<void ()>&)::'lambda'(std::function<void ()>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void ()>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (int), btcsignals::optional_last_value<void>>::connect<std::function<void (int)>&>(std::function<void (int)>&)::'lambda'(std::function<void (int)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (int), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (int)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (bool), btcsignals::optional_last_value<void>>::connect<std::function<void (bool)>&>(std::function<void (bool)>&)::'lambda'(std::function<void (bool)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (bool), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (bool)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::optional_last_value<void>>::connect<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>&)::'lambda'(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::optional_last_value<void>>::connect<std::function<void (SynchronizationState, CBlockIndex const&, double)>&>(std::function<void (SynchronizationState, CBlockIndex const&, double)>&)::'lambda'(std::function<void (SynchronizationState, CBlockIndex const&, double)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (SynchronizationState, CBlockIndex const&, double)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::optional_last_value<void>>::connect<std::function<void (SynchronizationState, long, long, bool)>&>(std::function<void (SynchronizationState, long, long, bool)>&)::'lambda'(std::function<void (SynchronizationState, long, long, bool)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (SynchronizationState, long, long, bool)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::connect<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>&)::'lambda'(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::connection_holder>>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>& const&) const Unexecuted instantiation: interfaces.cpp:auto btcsignals::connection btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::connect<wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*)>(wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*)&&)::'lambda'(wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*) const&)::operator()<std::shared_ptr<btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::connection_holder>>(wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*) const&) const Unexecuted instantiation: interfaces.cpp:auto btcsignals::connection btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::connect<wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>(wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)&&)::'lambda'(wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType) const&)::operator()<std::shared_ptr<btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::connection_holder>>(wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType) const&) const Unexecuted instantiation: interfaces.cpp:auto btcsignals::connection btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::connect<wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType)>(wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType)&&)::'lambda'(wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType) const&)::operator()<std::shared_ptr<btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::connection_holder>>(wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType) const&) const wallet.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0&&)::'lambda'(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0 const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0 const&) const Line | Count | Source | 237 | 3.60k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
wallet.cpp:auto btcsignals::connection btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1&&)::'lambda'(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1 const&)::operator()<std::shared_ptr<btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::connection_holder>>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1 const&) const Line | Count | Source | 237 | 3.60k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
|
238 | | |
239 | 21.5k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); |
240 | 21.5k | return connection(entry); |
241 | 21.5k | } btcsignals::connection btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connect<void (&)(int&)>(void (&)(int&)) Line | Count | Source | 233 | 8 | { | 234 | 8 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 8 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 8 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 8 | return connection(entry); | 241 | 8 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<(anonymous namespace)::MoveOnlyData (int), btcsignals::optional_last_value<(anonymous namespace)::MoveOnlyData>>::connect<(anonymous namespace)::MoveOnlyData (&)(int)>((anonymous namespace)::MoveOnlyData (&)(int)) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals::connection btcsignals::signal<bool (), btcsignals::optional_last_value<bool>>::connect<bool (&)()>(bool (&)()) Line | Count | Source | 233 | 3 | { | 234 | 3 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 3 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 3 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 3 | return connection(entry); | 241 | 3 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::thread_safety::test_method()::$_0>(btcsignals_tests::thread_safety::test_method()::$_0&&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()&&) Line | Count | Source | 233 | 1.00k | { | 234 | 1.00k | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1.00k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1.00k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1.00k | return connection(entry); | 241 | 1.00k | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_0>(btcsignals_tests::recursion_safety::test_method()::$_0&&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_1>(btcsignals_tests::recursion_safety::test_method()::$_1&&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_2>(btcsignals_tests::recursion_safety::test_method()::$_2&&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()&&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connect<btcsignals_tests::disconnect_thread_safety::test_method()::$_0>(btcsignals_tests::disconnect_thread_safety::test_method()::$_0&&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
btcsignals::connection btcsignals::signal<bool (bilingual_str const&, unsigned int), btcsignals::optional_last_value<bool>>::connect<std::function<bool (bilingual_str const&, unsigned int)>&>(std::function<bool (bilingual_str const&, unsigned int)>&) Line | Count | Source | 233 | 1.42k | { | 234 | 1.42k | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1.42k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1.42k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1.42k | return connection(entry); | 241 | 1.42k | } |
btcsignals::connection btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::optional_last_value<bool>>::connect<std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>&>(std::function<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>&) Line | Count | Source | 233 | 1.42k | { | 234 | 1.42k | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1.42k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1.42k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1.42k | return connection(entry); | 241 | 1.42k | } |
btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::optional_last_value<void>>::connect<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>&) Line | Count | Source | 233 | 2.51k | { | 234 | 2.51k | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 2.51k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 2.51k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 2.51k | return connection(entry); | 241 | 2.51k | } |
Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<std::function<void ()>&>(std::function<void ()>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (int), btcsignals::optional_last_value<void>>::connect<std::function<void (int)>&>(std::function<void (int)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (bool), btcsignals::optional_last_value<void>>::connect<std::function<void (bool)>&>(std::function<void (bool)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::optional_last_value<void>>::connect<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool)>&) btcsignals::connection btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::optional_last_value<void>>::connect<std::function<void (SynchronizationState, CBlockIndex const&, double)>&>(std::function<void (SynchronizationState, CBlockIndex const&, double)>&) Line | Count | Source | 233 | 1 | { | 234 | 1 | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 1 | return connection(entry); | 241 | 1 | } |
Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::optional_last_value<void>>::connect<std::function<void (SynchronizationState, long, long, bool)>&>(std::function<void (SynchronizationState, long, long, bool)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::optional_last_value<void>>::connect<std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>&>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int)>&) Unexecuted instantiation: interfaces.cpp:btcsignals::connection btcsignals::signal<void (wallet::CWallet*), btcsignals::optional_last_value<void>>::connect<wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*)>(wallet::(anonymous namespace)::WalletImpl::handleStatusChanged(std::function<void ()>)::'lambda'(wallet::CWallet*)&&) Unexecuted instantiation: interfaces.cpp:btcsignals::connection btcsignals::signal<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType), btcsignals::optional_last_value<void>>::connect<wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>(wallet::(anonymous namespace)::WalletImpl::handleAddressBookChanged(std::function<void (std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)>)::'lambda'(std::variant<CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool, wallet::AddressPurpose, ChangeType)&&) Unexecuted instantiation: interfaces.cpp:btcsignals::connection btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::optional_last_value<void>>::connect<wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType)>(wallet::(anonymous namespace)::WalletImpl::handleTransactionChanged(std::function<void (transaction_identifier<false> const&, ChangeType)>)::'lambda'(transaction_identifier<false> const&, ChangeType)&&) wallet.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0&&) Line | Count | Source | 233 | 7.60k | { | 234 | 7.60k | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 7.60k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 7.60k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 7.60k | return connection(entry); | 241 | 7.60k | } |
wallet.cpp:btcsignals::connection btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::optional_last_value<void>>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1&&) Line | Count | Source | 233 | 7.60k | { | 234 | 7.60k | LOCK(m_mutex); | 235 | | | 236 | | // Garbage-collect disconnected connections to prevent unbounded growth | 237 | 7.60k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 238 | | | 239 | 7.60k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 240 | 7.60k | return connection(entry); | 241 | 7.60k | } |
|
242 | | |
243 | | /* |
244 | | * Returns true if there are no enabled callbacks |
245 | | */ |
246 | | [[nodiscard]] bool empty() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) |
247 | 2.05k | { |
248 | 2.05k | LOCK(m_mutex); |
249 | 2.05k | return std::ranges::none_of(m_connections, [](const auto& holder) { |
250 | 2.01k | return holder->connected(); |
251 | 2.01k | }); auto btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::empty() const::'lambda'(auto const&)::operator()<std::shared_ptr<btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::connection_holder>>(auto const&) const Line | Count | Source | 249 | 8 | return std::ranges::none_of(m_connections, [](const auto& holder) { | 250 | 8 | return holder->connected(); | 251 | 8 | }); |
auto btcsignals::signal<void (), btcsignals::optional_last_value<void>>::empty() const::'lambda'(auto const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::optional_last_value<void>>::connection_holder>>(auto const&) const Line | Count | Source | 249 | 2.00k | return std::ranges::none_of(m_connections, [](const auto& holder) { | 250 | 2.00k | return holder->connected(); | 251 | 2.00k | }); |
|
252 | 2.05k | } btcsignals::signal<void (int&), btcsignals::optional_last_value<void>>::empty() const Line | Count | Source | 247 | 6 | { | 248 | 6 | LOCK(m_mutex); | 249 | 6 | return std::ranges::none_of(m_connections, [](const auto& holder) { | 250 | 6 | return holder->connected(); | 251 | 6 | }); | 252 | 6 | } |
btcsignals::signal<void (), btcsignals::optional_last_value<void>>::empty() const Line | Count | Source | 247 | 2.04k | { | 248 | 2.04k | LOCK(m_mutex); | 249 | 2.04k | return std::ranges::none_of(m_connections, [](const auto& holder) { | 250 | 2.04k | return holder->connected(); | 251 | 2.04k | }); | 252 | 2.04k | } |
|
253 | | }; |
254 | | |
255 | | } // namespace btcsignals |
256 | | |
257 | | #endif // BITCOIN_BTCSIGNALS_H |