5 # ifndef VCCC_SIGNAL_CONNECTION_H_
6 # define VCCC_SIGNAL_CONNECTION_H_
23 struct connection_impl_base {
24 virtual ~connection_impl_base() =
default;
25 virtual bool is_connected()
const = 0;
26 virtual void disconnect() = 0;
27 virtual void track(connection* conn, std::weak_ptr<void> target) = 0;
30 template<
typename Signal,
typename SlotPtr>
31 struct connection_impl :
public connection_impl_base {
32 using signal_type = Signal;
33 using slot_ptr = SlotPtr;
38 connection_impl(
const std::shared_ptr<signal_type>& signal_ptr, SlotPtr&& slot)
39 : signal_ptr_(signal_ptr), slot_(
std::move(slot)), connected(true) {}
42 void disconnect()
override {
43 auto ptr = signal_ptr_.lock();
48 if (!connected.compare_exchange_strong(state,
false))
51 auto weak_slot = slot_.first;
52 if (weak_slot.lock() ==
nullptr)
55 ptr->disconnect(slot_.second);
58 bool is_connected()
const override {
59 return connected.load();
65 void track(connection* conn, std::weak_ptr<void> target)
override {
66 auto signal = signal_ptr_.lock();
67 if (signal ==
nullptr)
69 signal->set_track(conn,
std::addressof(slot_.second), std::move(target));
73 std::weak_ptr<signal_type> signal_ptr_;
75 std::atomic_bool connected{
false};
87 explicit connection(std::shared_ptr<connection_impl_base> ptr)
105 return pimpl !=
nullptr &&
pimpl->is_connected();
109 pimpl->track(
this, std::move(target));
110 return std::move(*
this);
114 std::shared_ptr<connection_impl_base>
pimpl;
Connection manager for a single slot.
Definition: connection.h:83
void disconnect() const
Definition: connection.h:98
connection(std::shared_ptr< connection_impl_base > ptr)
Definition: connection.h:87
connection(connection &&) noexcept=default
connection & operator=(connection const &other)=default
connection(connection const &)=default
connection track(std::weak_ptr< void > target) &&
Definition: connection.h:108
std::shared_ptr< connection_impl_base > pimpl
Definition: connection.h:114
bool is_connected() const
Definition: connection.h:104
Scoped connection manager for a single slot.
Definition: connection.h:120
void disconnect() const
Definition: connection.h:98
raii_connection(const connection &conn)
Definition: connection.h:133
raii_connection(connection &&conn) noexcept
Definition: connection.h:134
raii_connection & operator=(const connection &conn)
Definition: connection.h:145
~raii_connection()
Definition: connection.h:127
raii_connection & operator=(connection &&conn)
Definition: connection.h:151
raii_connection(raii_connection &&other) noexcept
Definition: connection.h:132
raii_connection & operator=(const raii_connection &rhs)=delete
raii_connection & operator=(raii_connection &&other)
Definition: connection.h:137
raii_connection()=default
raii_connection(const raii_connection &other)=delete
std::enable_if_t< std::is_object< T >::value, T * > addressof(T &t) noexcept
Definition: addressof.hpp:33
Definition: matrix.hpp:495
Definition: directory.h:12