12 #include <type_traits> 23 void disconnect(Object *
object);
26 using SlotList = std::list<BoundMethodBase *>;
28 void connect(BoundMethodBase *slot);
29 void disconnect(std::function<
bool(SlotList::iterator &)> match);
37 template<
typename... Args>
38 class Signal :
public SignalBase
47 template<typename T, typename R, std::enable_if_t<std::is_base_of<Object, T>::value> * =
nullptr>
48 void connect(T *obj, R (T::*func)(Args...),
51 Object *
object =
static_cast<Object *
>(obj);
52 SignalBase::connect(
new BoundMethodMember<T, R, Args...>(obj,
object, func, type));
55 template<typename T, typename R, std::enable_if_t<!std::is_base_of<Object, T>::value> * =
nullptr>
57 template<
typename T,
typename R>
59 void connect(T *obj, R (T::*func)(Args...))
61 SignalBase::connect(
new BoundMethodMember<T, R, Args...>(obj,
nullptr, func));
65 template<
typename T,
typename Func,
66 std::enable_if_t<std::is_base_of<Object, T>::value &&
67 std::is_invocable_v<Func, Args...>> * =
nullptr>
71 SignalBase::connect(
new BoundMethodFunctor<T, void, Func, Args...>(obj,
object, func, type));
74 template<
typename T,
typename Func,
75 std::enable_if_t<!std::is_base_of<Object, T>::value &&
76 std::is_invocable_v<Func, Args...>> * =
nullptr>
78 template<
typename T,
typename Func>
82 SignalBase::connect(
new BoundMethodFunctor<T, void, Func, Args...>(obj,
nullptr, func));
88 SignalBase::connect(
new BoundMethodStatic<R, Args...>(func));
93 SignalBase::disconnect([]([[maybe_unused]] SlotList::iterator &iter) {
101 SignalBase::disconnect([obj](SlotList::iterator &iter) {
102 return (*iter)->match(obj);
106 template<
typename T,
typename R>
109 SignalBase::disconnect([obj, func](SlotList::iterator &iter) {
110 BoundMethodArgs<R, Args...> *slot =
111 static_cast<BoundMethodArgs<R, Args...
> *>(*iter);
113 if (!slot->match(obj))
122 return static_cast<BoundMethodMember<T, R, Args...
> *>(slot)->match(func);
129 SignalBase::disconnect([func](SlotList::iterator &iter) {
130 BoundMethodArgs<R, Args...> *slot =
131 static_cast<BoundMethodArgs<R, Args...
> *>(*iter);
133 if (!slot->match(
nullptr))
136 return static_cast<BoundMethodStatic<R, Args...
> *>(slot)->match(func);
146 for (BoundMethodBase *slot : slots())
147 static_cast<BoundMethodArgs<
void, Args...
> *>(slot)->activate(args...);
void emit(Args... args)
Emit the signal and call all connected slots.
Definition: signal.h:140
ConnectionType
Connection type for asynchronous communication.
Definition: bound_method.h:19
void connect(T *obj, Func func)
Connect the signal to a function object slot.
Definition: signal.h:80
void disconnect()
Disconnect the signal from all slots.
Definition: signal.h:91
void connect(T *obj, R(T::*func)(Args...))
Connect the signal to a member function slot.
Definition: signal.h:59
void disconnect(T *obj)
Disconnect the signal from all slots of the object.
Definition: signal.h:99
Top-level libcamera namespace.
Definition: backtrace.h:17
void disconnect(R(*func)(Args...))
Disconnect the signal from the slot static function func.
Definition: signal.h:127
void disconnect(T *obj, R(T::*func)(Args...))
Disconnect the signal from the object slot member function func.
Definition: signal.h:107
Base object to support automatic signal disconnection.
Definition: object.h:26
Method bind and invocation.
If the sender and the receiver live in the same thread, ConnectionTypeDirect is used. Otherwise ConnectionTypeQueued is used.
Definition: bound_method.h:20
void connect(R(*func)(Args...))
Connect the signal to a static function slot.
Definition: signal.h:86