Coverage Report

Created: 2026-06-16 16:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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