/tmp/bitcoin/src/util/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_UTIL_BTCSIGNALS_H |
6 | | #define BITCOIN_UTIL_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 | | /// The default combiner, which only returns void. |
34 | | class null_value |
35 | | { |
36 | | public: |
37 | | using result_type = void; |
38 | | }; |
39 | | |
40 | | /// A combiner, which checks if at least one callback returned true. |
41 | | class any_of |
42 | | { |
43 | | public: |
44 | | // This is the only supported combiner with a non-void return type. As |
45 | | // such, its behavior is embedded into the signal functor. |
46 | | using result_type = bool; |
47 | | }; |
48 | | |
49 | | template <typename Signature, typename Combiner = null_value> |
50 | | class signal; |
51 | | |
52 | | /* |
53 | | * State object representing the liveness of a registered callback. |
54 | | * signal::connect() returns an enabled connection which can be held and |
55 | | * disabled in the future. |
56 | | */ |
57 | | class connection |
58 | | { |
59 | | template <typename Signature, typename Combiner> |
60 | | friend class signal; |
61 | | /** |
62 | | * Track liveness. Also serves as a tag for the constructor used by signal. |
63 | | */ |
64 | | class liveness |
65 | | { |
66 | | friend class connection; |
67 | | std::atomic_bool m_connected{true}; |
68 | | |
69 | 1.38k | void disconnect() { m_connected.store(false); } |
70 | | public: |
71 | 605k | bool connected() const { return m_connected.load(); } |
72 | | }; |
73 | | |
74 | | /** |
75 | | * connections have shared_ptr-like copy and move semantics. |
76 | | */ |
77 | | std::shared_ptr<liveness> m_state{}; |
78 | | |
79 | | /** |
80 | | * Only a signal can create an enabled connection. |
81 | | */ |
82 | 21.8k | explicit connection(std::shared_ptr<liveness>&& state) : m_state{std::move(state)}{} |
83 | | |
84 | | public: |
85 | | /** |
86 | | * The default constructor creates a connection with no associated signal |
87 | | */ |
88 | 6 | constexpr connection() noexcept = default; |
89 | | |
90 | | /** |
91 | | * If a callback is associated with this connection, prevent it from being |
92 | | * called in the future. |
93 | | * |
94 | | * If a connection is disabled as part of a signal's callback function, it |
95 | | * will _not_ be executed in the current signal invocation. |
96 | | * |
97 | | * Note that disconnected callbacks are not removed from their owning |
98 | | * signals here. They are garbage collected in signal::connect(). |
99 | | */ |
100 | | void disconnect() |
101 | 1.88k | { |
102 | 1.88k | if (m_state) { |
103 | 1.38k | m_state->disconnect(); |
104 | 1.38k | } |
105 | 1.88k | } |
106 | | |
107 | | /** |
108 | | * Returns true if this connection was created by a signal and has not been |
109 | | * disabled. |
110 | | */ |
111 | | bool connected() const |
112 | 1.01k | { |
113 | 1.01k | return m_state && m_state->connected(); |
114 | 1.01k | } |
115 | | }; |
116 | | |
117 | | /* |
118 | | * RAII-style connection management |
119 | | */ |
120 | | class scoped_connection |
121 | | { |
122 | | connection m_conn; |
123 | | |
124 | | public: |
125 | 1.00k | explicit scoped_connection(connection rhs) noexcept : m_conn{std::move(rhs)} {} |
126 | | |
127 | 500 | scoped_connection(scoped_connection&&) noexcept = default; |
128 | | |
129 | | /** |
130 | | * For simplicity, disable copy construction and copy/move assignment. |
131 | | */ |
132 | | scoped_connection& operator=(scoped_connection&&) = delete; |
133 | | scoped_connection& operator=(const scoped_connection&) = delete; |
134 | | scoped_connection(const scoped_connection&) = delete; |
135 | | |
136 | | void disconnect() |
137 | 1.50k | { |
138 | 1.50k | m_conn.disconnect(); |
139 | 1.50k | } |
140 | | |
141 | | ~scoped_connection() |
142 | 1.50k | { |
143 | 1.50k | disconnect(); |
144 | 1.50k | } |
145 | | }; |
146 | | |
147 | | /* |
148 | | * Functor for calling zero or more connected callbacks |
149 | | */ |
150 | | template <typename Signature, typename Combiner> |
151 | | class signal |
152 | | { |
153 | | using function_type = std::function<Signature>; |
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.8k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} |
161 | 21.8k | { |
162 | 21.8k | } btcsignals::signal<void (int&), btcsignals::null_value>::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::signal<bool (), btcsignals::any_of>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::connection_holder::connection_holder<void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>(void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)) Line | Count | Source | 160 | 2.55k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 2.55k | { | 162 | 2.55k | } |
init.cpp:btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connection_holder::connection_holder<AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9>(AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9&&) Line | Count | Source | 160 | 1 | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1 | { | 162 | 1 | } |
Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::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&)>&) Unexecuted instantiation: btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connection_holder::connection_holder<std::function<void (bilingual_str const&, unsigned int)>&>(std::function<void (bilingual_str const&, unsigned int)>&) Unexecuted instantiation: btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::any_of>::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)>&) Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::null_value>::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)>&) Unexecuted instantiation: btcsignals::signal<void (), btcsignals::null_value>::connection_holder::connection_holder<std::function<void ()>&>(std::function<void ()>&) Unexecuted instantiation: btcsignals::signal<void (int), btcsignals::null_value>::connection_holder::connection_holder<std::function<void (int)>&>(std::function<void (int)>&) Unexecuted instantiation: btcsignals::signal<void (bool), btcsignals::null_value>::connection_holder::connection_holder<std::function<void (bool)>&>(std::function<void (bool)>&) Unexecuted instantiation: interfaces.cpp:btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connection_holder::connection_holder<node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double)>(node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double)&&) Unexecuted instantiation: interfaces.cpp:btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::null_value>::connection_holder::connection_holder<node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool)>(node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool)&&) btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connection_holder::connection_holder<void (&)(bilingual_str const&, unsigned int)>(void (&)(bilingual_str const&, unsigned int)) Line | Count | Source | 160 | 1.44k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1.44k | { | 162 | 1.44k | } |
btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::any_of>::connection_holder::connection_holder<bool (&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>(bool (&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)) Line | Count | Source | 160 | 1.44k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 1.44k | { | 162 | 1.44k | } |
Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::connection_holder::connection_holder<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0&&) Line | Count | Source | 160 | 7.69k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 7.69k | { | 162 | 7.69k | } |
wallet.cpp:btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::null_value>::connection_holder::connection_holder<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1&&) Line | Count | Source | 160 | 7.69k | connection_holder(Callable&& callback) : m_callback{std::forward<Callable>(callback)} | 161 | 7.69k | { | 162 | 7.69k | } |
|
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.7k | constexpr signal() noexcept = default; btcsignals::signal<void (int&), btcsignals::null_value>::signal() Line | Count | Source | 174 | 3 | constexpr signal() noexcept = default; |
btcsignals::signal<bool (), btcsignals::any_of>::signal() Line | Count | Source | 174 | 1 | constexpr signal() noexcept = default; |
btcsignals::signal<void (), btcsignals::null_value>::signal() Line | Count | Source | 174 | 9.33k | 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::null_value>::signal() Line | Count | Source | 174 | 1.05k | constexpr signal() noexcept = default; |
btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::null_value>::signal() Line | Count | Source | 174 | 1.05k | constexpr signal() noexcept = default; |
btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::signal() Line | Count | Source | 174 | 1.05k | constexpr signal() noexcept = default; |
btcsignals::signal<void (wallet::CWallet*), btcsignals::null_value>::signal() Line | Count | Source | 174 | 1.05k | constexpr signal() noexcept = default; |
btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::null_value>::signal() Line | Count | Source | 174 | 7.23k | constexpr signal() noexcept = default; |
|
175 | 20.7k | ~signal() = default; btcsignals::signal<void (int&), btcsignals::null_value>::~signal() Line | Count | Source | 175 | 3 | ~signal() = default; |
btcsignals::signal<bool (), btcsignals::any_of>::~signal() Line | Count | Source | 175 | 1 | ~signal() = default; |
btcsignals::signal<void (), btcsignals::null_value>::~signal() Line | Count | Source | 175 | 9.33k | ~signal() = default; |
btcsignals::signal<void (wallet::CWallet*), btcsignals::null_value>::~signal() Line | Count | Source | 175 | 1.05k | ~signal() = default; |
btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::~signal() Line | Count | Source | 175 | 1.05k | ~signal() = default; |
btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::null_value>::~signal() Line | Count | Source | 175 | 1.05k | ~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::null_value>::~signal() Line | Count | Source | 175 | 1.05k | ~signal() = default; |
Unexecuted instantiation: btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::null_value>::~signal() Unexecuted instantiation: btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::~signal() Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::null_value>::~signal() Unexecuted instantiation: btcsignals::signal<void (bool), btcsignals::null_value>::~signal() Unexecuted instantiation: btcsignals::signal<void (int), btcsignals::null_value>::~signal() Unexecuted instantiation: btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::~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::any_of>::~signal() Unexecuted instantiation: btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::~signal() btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::null_value>::~signal() Line | Count | Source | 175 | 7.23k | ~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 any_of is hard-coded here. |
188 | | * |
189 | | * Callbacks which return void require special handling. |
190 | | * |
191 | | * In order to avoid locking during the callbacks, the list of callbacks is |
192 | | * cached before they are called. This allows a callback to call connect(), |
193 | | * but the newly connected callback will not be run during the current |
194 | | * signal invocation. |
195 | | * |
196 | | * Note that the parameters are accepted as universal references, though |
197 | | * they are not perfectly forwarded as that could cause a use-after-move if |
198 | | * more than one callback is enabled. |
199 | | */ |
200 | | template <typename... Args> |
201 | | [[nodiscard]] result_type operator()(Args&&... args) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) |
202 | 412k | { |
203 | 412k | std::vector<std::shared_ptr<connection_holder>> connections; |
204 | 412k | { |
205 | 412k | LOCK(m_mutex); |
206 | 412k | connections = m_connections; |
207 | 412k | } |
208 | 412k | if constexpr (std::is_void_v<result_type>) { |
209 | 412k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, |
210 | 412k | "Callback result type must be equal to the combiner result type (void)."); |
211 | 412k | for (const auto& connection : connections) { |
212 | 342k | if (connection->connected()) { |
213 | 342k | connection->m_callback(args...); |
214 | 342k | } |
215 | 342k | } |
216 | 412k | } else { |
217 | 17 | static_assert(std::is_same_v<Combiner, any_of>, |
218 | 17 | "only the any_of combiner is supported and hard-coded into this functor."); |
219 | 17 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, |
220 | 17 | "Callback result type must be equal to the combiner result type (bool)."); |
221 | 17 | result_type ret{false}; |
222 | 19 | for (const auto& connection : connections) { |
223 | 19 | if (connection->connected()) { |
224 | 15 | ret |= connection->m_callback(args...); |
225 | 15 | } |
226 | 19 | } |
227 | 17 | return ret; |
228 | 17 | } |
229 | 412k | } void btcsignals::signal<void (int&), btcsignals::null_value>::operator()<int&>(int&) const Line | Count | Source | 202 | 6 | { | 203 | 6 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 6 | { | 205 | 6 | LOCK(m_mutex); | 206 | 6 | connections = m_connections; | 207 | 6 | } | 208 | 6 | if constexpr (std::is_void_v<result_type>) { | 209 | 6 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 6 | "Callback result type must be equal to the combiner result type (void)."); | 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 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 6 | } |
bool btcsignals::signal<bool (), btcsignals::any_of>::operator()<>() const Line | Count | Source | 202 | 6 | { | 203 | 6 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 6 | { | 205 | 6 | LOCK(m_mutex); | 206 | 6 | connections = m_connections; | 207 | 6 | } | 208 | | if constexpr (std::is_void_v<result_type>) { | 209 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | | "Callback result type must be equal to the combiner result type (void)."); | 211 | | for (const auto& connection : connections) { | 212 | | if (connection->connected()) { | 213 | | connection->m_callback(args...); | 214 | | } | 215 | | } | 216 | 6 | } else { | 217 | 6 | static_assert(std::is_same_v<Combiner, any_of>, | 218 | 6 | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | 6 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | 6 | "Callback result type must be equal to the combiner result type (bool)."); | 221 | 6 | result_type ret{false}; | 222 | 8 | for (const auto& connection : connections) { | 223 | 8 | if (connection->connected()) { | 224 | 4 | ret |= connection->m_callback(args...); | 225 | 4 | } | 226 | 8 | } | 227 | 6 | return ret; | 228 | 6 | } | 229 | 6 | } |
void btcsignals::signal<void (), btcsignals::null_value>::operator()<>() const Line | Count | Source | 202 | 166k | { | 203 | 166k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 166k | { | 205 | 166k | LOCK(m_mutex); | 206 | 166k | connections = m_connections; | 207 | 166k | } | 208 | 166k | if constexpr (std::is_void_v<result_type>) { | 209 | 166k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 166k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 327k | for (const auto& connection : connections) { | 212 | 327k | if (connection->connected()) { | 213 | 327k | connection->m_callback(args...); | 214 | 327k | } | 215 | 327k | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 166k | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::operator()<util::TranslatedLiteral>(util::TranslatedLiteral&&) const Line | Count | Source | 202 | 6.25k | { | 203 | 6.25k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 6.25k | { | 205 | 6.25k | LOCK(m_mutex); | 206 | 6.25k | connections = m_connections; | 207 | 6.25k | } | 208 | 6.25k | if constexpr (std::is_void_v<result_type>) { | 209 | 6.25k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 6.25k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 12.5k | for (const auto& connection : connections) { | 212 | 12.5k | if (connection->connected()) { | 213 | 12.5k | connection->m_callback(args...); | 214 | 12.5k | } | 215 | 12.5k | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 6.25k | } |
void btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::operator()<bilingual_str, CClientUIInterface::MessageBoxFlags>(bilingual_str&&, CClientUIInterface::MessageBoxFlags&&) const Line | Count | Source | 202 | 1 | { | 203 | 1 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 1 | { | 205 | 1 | LOCK(m_mutex); | 206 | 1 | connections = m_connections; | 207 | 1 | } | 208 | 1 | if constexpr (std::is_void_v<result_type>) { | 209 | 1 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 1 | "Callback result type must be equal to the combiner result type (void)."); | 211 | 1 | for (const auto& connection : connections) { | 212 | 1 | if (connection->connected()) { | 213 | 1 | connection->m_callback(args...); | 214 | 1 | } | 215 | 1 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 1 | } |
void btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::operator()<util::TranslatedLiteral, CClientUIInterface::MessageBoxFlags>(util::TranslatedLiteral&&, CClientUIInterface::MessageBoxFlags&&) const Line | Count | Source | 202 | 11 | { | 203 | 11 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 11 | { | 205 | 11 | LOCK(m_mutex); | 206 | 11 | connections = m_connections; | 207 | 11 | } | 208 | 11 | if constexpr (std::is_void_v<result_type>) { | 209 | 11 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 11 | "Callback result type must be equal to the combiner result type (void)."); | 211 | 11 | for (const auto& connection : connections) { | 212 | 11 | if (connection->connected()) { | 213 | 11 | connection->m_callback(args...); | 214 | 11 | } | 215 | 11 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 11 | } |
bool btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::any_of>::operator()<bilingual_str, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, unsigned int>(bilingual_str&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&&, unsigned int&&) const Line | Count | Source | 202 | 11 | { | 203 | 11 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 11 | { | 205 | 11 | LOCK(m_mutex); | 206 | 11 | connections = m_connections; | 207 | 11 | } | 208 | | if constexpr (std::is_void_v<result_type>) { | 209 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | | "Callback result type must be equal to the combiner result type (void)."); | 211 | | for (const auto& connection : connections) { | 212 | | if (connection->connected()) { | 213 | | connection->m_callback(args...); | 214 | | } | 215 | | } | 216 | 11 | } else { | 217 | 11 | static_assert(std::is_same_v<Combiner, any_of>, | 218 | 11 | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | 11 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | 11 | "Callback result type must be equal to the combiner result type (bool)."); | 221 | 11 | result_type ret{false}; | 222 | 11 | for (const auto& connection : connections) { | 223 | 11 | if (connection->connected()) { | 224 | 11 | ret |= connection->m_callback(args...); | 225 | 11 | } | 226 | 11 | } | 227 | 11 | return ret; | 228 | 11 | } | 229 | 11 | } |
void btcsignals::signal<void (int), btcsignals::null_value>::operator()<unsigned long&>(unsigned long&) const Line | Count | Source | 202 | 2.32k | { | 203 | 2.32k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 2.32k | { | 205 | 2.32k | LOCK(m_mutex); | 206 | 2.32k | connections = m_connections; | 207 | 2.32k | } | 208 | 2.32k | if constexpr (std::is_void_v<result_type>) { | 209 | 2.32k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 2.32k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 2.32k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 2.32k | } |
void btcsignals::signal<void (bool), btcsignals::null_value>::operator()<std::atomic<bool>&>(std::atomic<bool>&) const Line | Count | Source | 202 | 9 | { | 203 | 9 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 9 | { | 205 | 9 | LOCK(m_mutex); | 206 | 9 | connections = m_connections; | 207 | 9 | } | 208 | 9 | if constexpr (std::is_void_v<result_type>) { | 209 | 9 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 9 | "Callback result type must be equal to the combiner result type (void)."); | 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 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 9 | } |
void btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::operator()<bilingual_str&, CClientUIInterface::MessageBoxFlags>(bilingual_str&, CClientUIInterface::MessageBoxFlags&&) const Line | Count | Source | 202 | 11 | { | 203 | 11 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 11 | { | 205 | 11 | LOCK(m_mutex); | 206 | 11 | connections = m_connections; | 207 | 11 | } | 208 | 11 | if constexpr (std::is_void_v<result_type>) { | 209 | 11 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 11 | "Callback result type must be equal to the combiner result type (void)."); | 211 | 11 | for (const auto& connection : connections) { | 212 | 11 | if (connection->connected()) { | 213 | 11 | connection->m_callback(args...); | 214 | 11 | } | 215 | 11 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 11 | } |
void btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::operator()<bilingual_str const&, CClientUIInterface::MessageBoxFlags>(bilingual_str const&, CClientUIInterface::MessageBoxFlags&&) const Line | Count | Source | 202 | 172 | { | 203 | 172 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 172 | { | 205 | 172 | LOCK(m_mutex); | 206 | 172 | connections = m_connections; | 207 | 172 | } | 208 | 172 | if constexpr (std::is_void_v<result_type>) { | 209 | 172 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 172 | "Callback result type must be equal to the combiner result type (void)."); | 211 | 172 | for (const auto& connection : connections) { | 212 | 172 | if (connection->connected()) { | 213 | 172 | connection->m_callback(args...); | 214 | 172 | } | 215 | 172 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 172 | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::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 | 202 | 1.35k | { | 203 | 1.35k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 1.35k | { | 205 | 1.35k | LOCK(m_mutex); | 206 | 1.35k | connections = m_connections; | 207 | 1.35k | } | 208 | 1.35k | if constexpr (std::is_void_v<result_type>) { | 209 | 1.35k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 1.35k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 2.69k | for (const auto& connection : connections) { | 212 | 2.69k | if (connection->connected()) { | 213 | 2.69k | connection->m_callback(args...); | 214 | 2.69k | } | 215 | 2.69k | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 1.35k | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::null_value>::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 | 202 | 7.54k | { | 203 | 7.54k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 7.54k | { | 205 | 7.54k | LOCK(m_mutex); | 206 | 7.54k | connections = m_connections; | 207 | 7.54k | } | 208 | 7.54k | if constexpr (std::is_void_v<result_type>) { | 209 | 7.54k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 7.54k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 7.54k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 7.54k | } |
void btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::operator()<SynchronizationState&, CBlockIndex const&, double&>(SynchronizationState&, CBlockIndex const&, double&) const Line | Count | Source | 202 | 95.1k | { | 203 | 95.1k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 95.1k | { | 205 | 95.1k | LOCK(m_mutex); | 206 | 95.1k | connections = m_connections; | 207 | 95.1k | } | 208 | 95.1k | if constexpr (std::is_void_v<result_type>) { | 209 | 95.1k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 95.1k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 95.1k | for (const auto& connection : connections) { | 212 | 113 | if (connection->connected()) { | 213 | 113 | connection->m_callback(args...); | 214 | 113 | } | 215 | 113 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 95.1k | } |
void btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::null_value>::operator()<SynchronizationState&, long&, long&, bool&>(SynchronizationState&, long&, long&, bool&) const Line | Count | Source | 202 | 73.5k | { | 203 | 73.5k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 73.5k | { | 205 | 73.5k | LOCK(m_mutex); | 206 | 73.5k | connections = m_connections; | 207 | 73.5k | } | 208 | 73.5k | if constexpr (std::is_void_v<result_type>) { | 209 | 73.5k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 73.5k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 73.5k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 73.5k | } |
void btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::null_value>::operator()<wallet::DescriptorScriptPubKeyMan*, unsigned long&>(wallet::DescriptorScriptPubKeyMan*&&, unsigned long&) const Line | Count | Source | 202 | 18 | { | 203 | 18 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 18 | { | 205 | 18 | LOCK(m_mutex); | 206 | 18 | connections = m_connections; | 207 | 18 | } | 208 | 18 | if constexpr (std::is_void_v<result_type>) { | 209 | 18 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 18 | "Callback result type must be equal to the combiner result type (void)."); | 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 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 18 | } |
void btcsignals::signal<void (wallet::CWallet*), btcsignals::null_value>::operator()<wallet::CWallet*>(wallet::CWallet*&&) const Line | Count | Source | 202 | 175 | { | 203 | 175 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 175 | { | 205 | 175 | LOCK(m_mutex); | 206 | 175 | connections = m_connections; | 207 | 175 | } | 208 | 175 | if constexpr (std::is_void_v<result_type>) { | 209 | 175 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 175 | "Callback result type must be equal to the combiner result type (void)."); | 211 | 175 | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 175 | } |
void btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::null_value>::operator()<transaction_identifier<false> const&, ChangeType>(transaction_identifier<false> const&, ChangeType&&) const Line | Count | Source | 202 | 4.39k | { | 203 | 4.39k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 4.39k | { | 205 | 4.39k | LOCK(m_mutex); | 206 | 4.39k | connections = m_connections; | 207 | 4.39k | } | 208 | 4.39k | if constexpr (std::is_void_v<result_type>) { | 209 | 4.39k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 4.39k | "Callback result type must be equal to the combiner result type (void)."); | 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 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 4.39k | } |
void btcsignals::signal<void (transaction_identifier<false> const&, ChangeType), btcsignals::null_value>::operator()<transaction_identifier<false>&, ChangeType>(transaction_identifier<false>&, ChangeType&&) const Line | Count | Source | 202 | 25.3k | { | 203 | 25.3k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 25.3k | { | 205 | 25.3k | LOCK(m_mutex); | 206 | 25.3k | connections = m_connections; | 207 | 25.3k | } | 208 | 25.3k | if constexpr (std::is_void_v<result_type>) { | 209 | 25.3k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 25.3k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 25.3k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 25.3k | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::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 | 202 | 1.39k | { | 203 | 1.39k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 1.39k | { | 205 | 1.39k | LOCK(m_mutex); | 206 | 1.39k | connections = m_connections; | 207 | 1.39k | } | 208 | 1.39k | if constexpr (std::is_void_v<result_type>) { | 209 | 1.39k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 1.39k | "Callback result type must be equal to the combiner result type (void)."); | 211 | 1.39k | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 1.39k | } |
void btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::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 | 202 | 837 | { | 203 | 837 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 837 | { | 205 | 837 | LOCK(m_mutex); | 206 | 837 | connections = m_connections; | 207 | 837 | } | 208 | 837 | if constexpr (std::is_void_v<result_type>) { | 209 | 837 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 837 | "Callback result type must be equal to the combiner result type (void)."); | 211 | 837 | for (const auto& connection : connections) { | 212 | 0 | if (connection->connected()) { | 213 | 0 | connection->m_callback(args...); | 214 | 0 | } | 215 | 0 | } | 216 | | } else { | 217 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 837 | } |
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::null_value>::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 | 202 | 28.0k | { | 203 | 28.0k | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 28.0k | { | 205 | 28.0k | LOCK(m_mutex); | 206 | 28.0k | connections = m_connections; | 207 | 28.0k | } | 208 | 28.0k | if constexpr (std::is_void_v<result_type>) { | 209 | 28.0k | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 28.0k | "Callback result type must be equal to the combiner result type (void)."); | 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 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 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::null_value>::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 | 202 | 27 | { | 203 | 27 | std::vector<std::shared_ptr<connection_holder>> connections; | 204 | 27 | { | 205 | 27 | LOCK(m_mutex); | 206 | 27 | connections = m_connections; | 207 | 27 | } | 208 | 27 | if constexpr (std::is_void_v<result_type>) { | 209 | 27 | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 210 | 27 | "Callback result type must be equal to the combiner result type (void)."); | 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 | | static_assert(std::is_same_v<Combiner, any_of>, | 218 | | "only the any_of combiner is supported and hard-coded into this functor."); | 219 | | static_assert(std::is_same_v<result_type, typename function_type::result_type>, | 220 | | "Callback result type must be equal to the combiner result type (bool)."); | 221 | | result_type ret{false}; | 222 | | for (const auto& connection : connections) { | 223 | | if (connection->connected()) { | 224 | | ret |= connection->m_callback(args...); | 225 | | } | 226 | | } | 227 | | return ret; | 228 | | } | 229 | 27 | } |
|
230 | | |
231 | | /* |
232 | | * Connect a new callback to the signal. A forwarding callable accepts |
233 | | * anything that can be stored in a std::function. |
234 | | */ |
235 | | template <typename Callable> |
236 | | connection connect(Callable&& func) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) |
237 | 21.8k | { |
238 | 21.8k | LOCK(m_mutex); |
239 | | |
240 | | // Garbage-collect disconnected connections to prevent unbounded growth |
241 | 260k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); });auto btcsignals::connection btcsignals::signal<void (int&), btcsignals::null_value>::connect<void (&)(int&)>(void (&)(int&))::'lambda'(void (& const&)(int&))::operator()<std::shared_ptr<btcsignals::signal<void (int&), btcsignals::null_value>::connection_holder>>(void (& const&)(int&)) const Line | Count | Source | 241 | 8 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
auto btcsignals::connection btcsignals::signal<bool (), btcsignals::any_of>::connect<bool (&)()>(bool (&)())::'lambda'(bool (& const&)())::operator()<std::shared_ptr<btcsignals::signal<bool (), btcsignals::any_of>::connection_holder>>(bool (& const&)()) const Line | Count | Source | 241 | 2 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::thread_safety::test_method()::$_0 const&) const btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'() const&) const Line | Count | Source | 241 | 251k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_0 const&) const btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_1 const&) const Line | Count | Source | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_2 const&) const Line | Count | Source | 241 | 2 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
btcsignals_tests.cpp:auto btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'() const&) const Line | Count | Source | 241 | 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::null_value>::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::null_value>::connection_holder>>(btcsignals_tests::disconnect_thread_safety::test_method()::$_0 const&) const auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::connect<void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>(void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&))::'lambda'(void (& const&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&))::operator()<std::shared_ptr<btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::connection_holder>>(void (& const&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)) const Line | Count | Source | 241 | 1.24k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: init.cpp:auto btcsignals::connection btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connect<AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9>(AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9&&)::'lambda'(AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9 const&)::operator()<std::shared_ptr<btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connection_holder>>(AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9 const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::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::null_value>::connection_holder>>(std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connect<std::function<void (bilingual_str const&, unsigned int)>&>(std::function<void (bilingual_str const&, unsigned int)>&)::'lambda'(std::function<void (bilingual_str const&, unsigned int)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connection_holder>>(std::function<void (bilingual_str const&, unsigned int)>& const&) const Unexecuted instantiation: 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::any_of>::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::any_of>::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 Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::null_value>::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::null_value>::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 (), btcsignals::null_value>::connect<std::function<void ()>&>(std::function<void ()>&)::'lambda'(std::function<void ()>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::null_value>::connection_holder>>(std::function<void ()>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (int), btcsignals::null_value>::connect<std::function<void (int)>&>(std::function<void (int)>&)::'lambda'(std::function<void (int)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (int), btcsignals::null_value>::connection_holder>>(std::function<void (int)>& const&) const Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (bool), btcsignals::null_value>::connect<std::function<void (bool)>&>(std::function<void (bool)>&)::'lambda'(std::function<void (bool)>& const&)::operator()<std::shared_ptr<btcsignals::signal<void (bool), btcsignals::null_value>::connection_holder>>(std::function<void (bool)>& const&) const Unexecuted instantiation: interfaces.cpp:auto btcsignals::connection btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connect<node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double)>(node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double)&&)::'lambda'(node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double) const&)::operator()<std::shared_ptr<btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connection_holder>>(node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double) const&) const Unexecuted instantiation: interfaces.cpp:auto btcsignals::connection btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::null_value>::connect<node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool)>(node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool)&&)::'lambda'(node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool) const&)::operator()<std::shared_ptr<btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::null_value>::connection_holder>>(node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool) const&) const auto btcsignals::connection btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connect<void (&)(bilingual_str const&, unsigned int)>(void (&)(bilingual_str const&, unsigned int))::'lambda'(void (& const&)(bilingual_str const&, unsigned int))::operator()<std::shared_ptr<btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connection_holder>>(void (& const&)(bilingual_str const&, unsigned int)) const Line | Count | Source | 241 | 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::any_of>::connect<bool (&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>(bool (&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int))::'lambda'(bool (& const&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int))::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::any_of>::connection_holder>>(bool (& const&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)) const Line | Count | Source | 241 | 124 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
Unexecuted instantiation: auto btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0&&)::'lambda'(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0 const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::null_value>::connection_holder>>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0 const&) const Line | Count | Source | 241 | 3.62k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
wallet.cpp:auto btcsignals::connection btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::null_value>::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::null_value>::connection_holder>>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1 const&) const Line | Count | Source | 241 | 3.62k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); |
|
242 | | |
243 | 21.8k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); |
244 | 21.8k | return connection(entry); |
245 | 21.8k | } btcsignals::connection btcsignals::signal<void (int&), btcsignals::null_value>::connect<void (&)(int&)>(void (&)(int&)) Line | Count | Source | 237 | 8 | { | 238 | 8 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 8 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 8 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 8 | return connection(entry); | 245 | 8 | } |
btcsignals::connection btcsignals::signal<bool (), btcsignals::any_of>::connect<bool (&)()>(bool (&)()) Line | Count | Source | 237 | 3 | { | 238 | 3 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 3 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 3 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 3 | return connection(entry); | 245 | 3 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<btcsignals_tests::thread_safety::test_method()::$_0>(btcsignals_tests::thread_safety::test_method()::$_0&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::thread_safety::test_method()::$_2::operator()() const::'lambda'()&&) Line | Count | Source | 237 | 1.00k | { | 238 | 1.00k | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1.00k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1.00k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1.00k | return connection(entry); | 245 | 1.00k | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<btcsignals_tests::recursion_safety::test_method()::$_0>(btcsignals_tests::recursion_safety::test_method()::$_0&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<btcsignals_tests::recursion_safety::test_method()::$_1>(btcsignals_tests::recursion_safety::test_method()::$_1&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<btcsignals_tests::recursion_safety::test_method()::$_2>(btcsignals_tests::recursion_safety::test_method()::$_2&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()>(btcsignals_tests::recursion_safety::test_method()::$_2::operator()() const::'lambda'()&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
btcsignals_tests.cpp:btcsignals::connection btcsignals::signal<void (int&), btcsignals::null_value>::connect<btcsignals_tests::disconnect_thread_safety::test_method()::$_0>(btcsignals_tests::disconnect_thread_safety::test_method()::$_0&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::connect<void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)>(void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)) Line | Count | Source | 237 | 2.55k | { | 238 | 2.55k | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 2.55k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 2.55k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 2.55k | return connection(entry); | 245 | 2.55k | } |
init.cpp:btcsignals::connection btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connect<AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9>(AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9&&) Line | Count | Source | 237 | 1 | { | 238 | 1 | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1 | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1 | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1 | return connection(entry); | 245 | 1 | } |
Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&), btcsignals::null_value>::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&)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connect<std::function<void (bilingual_str const&, unsigned int)>&>(std::function<void (bilingual_str const&, unsigned int)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::any_of>::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)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int, bool), btcsignals::null_value>::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)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (), btcsignals::null_value>::connect<std::function<void ()>&>(std::function<void ()>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (int), btcsignals::null_value>::connect<std::function<void (int)>&>(std::function<void (int)>&) Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (bool), btcsignals::null_value>::connect<std::function<void (bool)>&>(std::function<void (bool)>&) Unexecuted instantiation: interfaces.cpp:btcsignals::connection btcsignals::signal<void (SynchronizationState, CBlockIndex const&, double), btcsignals::null_value>::connect<node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double)>(node::(anonymous namespace)::NodeImpl::handleNotifyBlockTip(std::function<void (SynchronizationState, interfaces::BlockTip, double)>)::'lambda'(SynchronizationState, CBlockIndex const&, double)&&) Unexecuted instantiation: interfaces.cpp:btcsignals::connection btcsignals::signal<void (SynchronizationState, long, long, bool), btcsignals::null_value>::connect<node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool)>(node::(anonymous namespace)::NodeImpl::handleNotifyHeaderTip(std::function<void (SynchronizationState, interfaces::BlockTip, bool)>)::'lambda'(SynchronizationState, long, long, bool)&&) btcsignals::connection btcsignals::signal<void (bilingual_str const&, unsigned int), btcsignals::null_value>::connect<void (&)(bilingual_str const&, unsigned int)>(void (&)(bilingual_str const&, unsigned int)) Line | Count | Source | 237 | 1.44k | { | 238 | 1.44k | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1.44k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1.44k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1.44k | return connection(entry); | 245 | 1.44k | } |
btcsignals::connection btcsignals::signal<bool (bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int), btcsignals::any_of>::connect<bool (&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)>(bool (&)(bilingual_str const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, unsigned int)) Line | Count | Source | 237 | 1.44k | { | 238 | 1.44k | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 1.44k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 1.44k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 1.44k | return connection(entry); | 245 | 1.44k | } |
Unexecuted instantiation: btcsignals::connection btcsignals::signal<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, int), btcsignals::null_value>::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::null_value>::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::null_value>::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::null_value>::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::null_value>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_0&&) Line | Count | Source | 237 | 7.69k | { | 238 | 7.69k | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 7.69k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 7.69k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 7.69k | return connection(entry); | 245 | 7.69k | } |
wallet.cpp:btcsignals::connection btcsignals::signal<void (wallet::ScriptPubKeyMan const*, long), btcsignals::null_value>::connect<wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1>(wallet::CWallet::ConnectScriptPubKeyManNotifiers()::$_1&&) Line | Count | Source | 237 | 7.69k | { | 238 | 7.69k | LOCK(m_mutex); | 239 | | | 240 | | // Garbage-collect disconnected connections to prevent unbounded growth | 241 | 7.69k | std::erase_if(m_connections, [](const auto& holder) { return !holder->connected(); }); | 242 | | | 243 | 7.69k | const auto& entry = m_connections.emplace_back(std::make_shared<connection_holder>(std::forward<Callable>(func))); | 244 | 7.69k | return connection(entry); | 245 | 7.69k | } |
|
246 | | |
247 | | /* |
248 | | * Returns true if there are no enabled callbacks |
249 | | */ |
250 | | [[nodiscard]] bool empty() const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) |
251 | 2.06k | { |
252 | 2.06k | LOCK(m_mutex); |
253 | 2.06k | return std::ranges::none_of(m_connections, [](const auto& holder) { |
254 | 1.51k | return holder->connected(); |
255 | 1.51k | }); auto btcsignals::signal<void (int&), btcsignals::null_value>::empty() const::'lambda'(auto const&)::operator()<std::shared_ptr<btcsignals::signal<void (int&), btcsignals::null_value>::connection_holder>>(auto const&) const Line | Count | Source | 253 | 8 | return std::ranges::none_of(m_connections, [](const auto& holder) { | 254 | 8 | return holder->connected(); | 255 | 8 | }); |
auto btcsignals::signal<void (), btcsignals::null_value>::empty() const::'lambda'(auto const&)::operator()<std::shared_ptr<btcsignals::signal<void (), btcsignals::null_value>::connection_holder>>(auto const&) const Line | Count | Source | 253 | 1.50k | return std::ranges::none_of(m_connections, [](const auto& holder) { | 254 | 1.50k | return holder->connected(); | 255 | 1.50k | }); |
|
256 | 2.06k | } btcsignals::signal<void (int&), btcsignals::null_value>::empty() const Line | Count | Source | 251 | 6 | { | 252 | 6 | LOCK(m_mutex); | 253 | 6 | return std::ranges::none_of(m_connections, [](const auto& holder) { | 254 | 6 | return holder->connected(); | 255 | 6 | }); | 256 | 6 | } |
btcsignals::signal<void (), btcsignals::null_value>::empty() const Line | Count | Source | 251 | 2.05k | { | 252 | 2.05k | LOCK(m_mutex); | 253 | 2.05k | return std::ranges::none_of(m_connections, [](const auto& holder) { | 254 | 2.05k | return holder->connected(); | 255 | 2.05k | }); | 256 | 2.05k | } |
|
257 | | }; |
258 | | |
259 | | } // namespace btcsignals |
260 | | |
261 | | #endif // BITCOIN_UTIL_BTCSIGNALS_H |