Coverage Report

Created: 2026-04-29 19:21

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