Base module

Signal< RT(Args...), MutexT >

Thread-safe signal and slot implementation for callback-based event dispatch.

Signal< RT(Args...), MutexT >

#include <icy/signal.h>

Thread-safe signal and slot implementation for callback-based event dispatch.

Public Methods

ReturnNameDescription
intattach const inlineConnects a lambda or std::function to the signal.
intattach const inlineConnects a pre-constructed SlotPtr to the signal.
booldetach const inlineDetaches the slot with the given ID.
booldetach const inlineDetaches all slots associated with the given instance pointer.
booldetach const inlineDetaches the slot whose delegate compares equal to other->delegate.
voiddetachAll const inlineDetaches and destroys all currently attached slots.
RTemit virtual inlineEmits the signal, invoking all live attached slots in priority order.
std::vector< SlotPtr >slots const inlineReturns a snapshot copy of the current slot list.
size_tnslots const inlineReturns the number of slots currently registered with this signal.
intoperator+= inlineAttaches a function; equivalent to attach(func).
intoperator+= inlineAttaches a pre-constructed slot; equivalent to attach(slot).
booloperator-= inlineDetaches the slot with the given ID; equivalent to detach(id).
booloperator-= inlineDetaches all slots for the given instance; equivalent to detach(instance).
booloperator-= inlineDetaches the slot matching slot's delegate; equivalent to detach(slot).
SignalDefaulted constructor.
Signal inlineCopy constructor; copies the slot list and last-assigned ID from r.
Signal &operator= inlineCopy assignment operator; copies the slot list and last-assigned ID from r.

attach

const inline

inline int attach(Function const & func, void * instance, int id, int priority) const

Connects a lambda or std::function to the signal.

Parameters

  • func The callable to invoke when the signal is emitted.

  • instance Optional owner pointer used for instance-based detach; pass nullptr if not applicable.

  • id Explicit slot ID to assign; pass -1 to auto-assign.

  • priority Higher values are called first; pass -1 for default ordering.

Returns

The assigned slot ID, which can be passed to [detach()](#detach-2) to disconnect.


attach

const inline

inline int attach(SlotPtr slot) const

Connects a pre-constructed SlotPtr to the signal.

Duplicate slots (matched by delegate equality) are removed before insertion. Slots are kept sorted in descending priority order after insertion.

Parameters

  • slot The slot to attach. Must have a valid delegate.

Returns

The assigned slot ID, which can be passed to [detach()](#detach-2) to disconnect.

Exceptions

  • std::logic_error if slot->id is set explicitly and already in use.

detach

const inline

inline bool detach(int id) const

Detaches the slot with the given ID.

Safe to call from within a slot's callback (the slot is marked dead before erasure).

Parameters

  • id The slot ID returned by [attach()](#attach-3).

Returns

true if a slot was found and removed; false if the ID was not found.


detach

const inline

inline bool detach(const void * instance) const

Detaches all slots associated with the given instance pointer.

Useful for bulk disconnect when an object is destroyed. Matches slots by their stored instance pointer, not by delegate equality.

Parameters

  • instance The owner pointer used when the slots were attached.

Returns

true if at least one slot was removed; false otherwise.


detach

const inline

inline bool detach(SlotPtr other) const

Detaches the slot whose delegate compares equal to other->delegate.

Used by the [slot()](api_icy.md#slot) helper overloads and operator-= to disconnect a specific class-member or function binding by value.

Parameters

  • other A slot whose delegate is compared against attached slots.

Returns

true if a matching slot was found and removed; false otherwise.


detachAll

const inline

inline void detachAll() const

Detaches and destroys all currently attached slots.

Each slot is marked dead before removal. After this call [nslots()](#nslots) returns 0.


emit

virtual inline

virtual inline RT emit(Args... args)

Emits the signal, invoking all live attached slots in priority order.

For [Signal](icy-Signal.html#signal)<bool(...)>: iterates slots and returns true as soon as any slot returns true, stopping further propagation. Returns false if no slot handled the event.

For [Signal](icy-Signal.html#signal)<void(...)>: calls every live slot unconditionally.

Emission snapshots raw slot pointers under a shared lock, then invokes delegates without holding the lock. Dead slots are swept after the outermost emission returns, allowing attach/detach inside callbacks without copying shared_ptrs on the hot path.

Parameters

  • args Arguments forwarded to each connected slot.

Returns

For bool return type: true if any slot handled the event, false otherwise. For void return type: nothing.


slots

const inline

inline std::vector< SlotPtr > slots() const

Returns a snapshot copy of the current slot list.

The copy is taken under a shared lock, so it is safe to call concurrently with attach/detach operations. Only currently live slots are returned.

Returns

A vector of SlotPtr representing all currently registered slots.


nslots

const inline

inline size_t nslots() const

Returns the number of slots currently registered with this signal.

The count is taken under a shared lock. Slots that were concurrently killed but not yet erased may still be included in the count.

Returns

The number of entries in the internal slot list.


operator+=

inline

inline int operator+=(Function const & func)

Attaches a function; equivalent to attach(func).

Returns

Assigned slot ID.


operator+=

inline

inline int operator+=(SlotPtr slot)

Attaches a pre-constructed slot; equivalent to attach(slot).

Returns

Assigned slot ID.


operator-=

inline

inline bool operator-=(int id)

Detaches the slot with the given ID; equivalent to detach(id).

Returns

true if removed.


operator-=

inline

inline bool operator-=(const void * instance)

Detaches all slots for the given instance; equivalent to detach(instance).

Returns

true if any removed.


operator-=

inline

inline bool operator-=(SlotPtr slot)

Detaches the slot matching slot's delegate; equivalent to detach(slot).

Returns

true if removed.


Signal

Signal() = default

Defaulted constructor.


Signal

inline

inline Signal(const Signal & r)

Copy constructor; copies the slot list and last-assigned ID from r.

Parameters

  • r The signal to copy from.

operator=

inline

inline Signal & operator=(const Signal & r)

Copy assignment operator; copies the slot list and last-assigned ID from r.

Parameters

  • r The signal to copy from.

Returns

Reference to this signal.

Public Types

NameDescription
Function
SlotPtr
Slot

Function

std::function< RT(Args...)> Function()

SlotPtr

std::shared_ptr< internal::Slot< RT, Args... > > SlotPtr()

Slot

internal::Slot< RT, Args... > Slot()

Private Attributes

ReturnNameDescription
MutexT_mutex
std::vector< SlotPtr >_slots
size_t_liveCount
int_lastId
EmitDepth_emitDepth
SweepFlag_needsSweep

_mutex

MutexT _mutex

_slots

std::vector< SlotPtr > _slots

_liveCount

size_t _liveCount = 0

_lastId

int _lastId = 0

_emitDepth

EmitDepth _emitDepth {}

_needsSweep

SweepFlag _needsSweep {}

Private Methods

ReturnNameDescription
size_tkillMatchingLocked const inline
size_temitDepthLocked const inline
voidbeginEmitLocked const inline
boolendEmitLocked const inline
voidrequestSweepLocked const inline
boolconsumeSweepRequest const inline
voidsweepLocked const inline
voidfinishEmit inline
voidresetEmitState inline

killMatchingLocked

const inline

template<typename Matcher> inline size_t killMatchingLocked(Matcher && matcher, bool removeAll) const

emitDepthLocked

const inline

inline size_t emitDepthLocked() const

beginEmitLocked

const inline

inline void beginEmitLocked() const

endEmitLocked

const inline

inline bool endEmitLocked() const

requestSweepLocked

const inline

inline void requestSweepLocked() const

consumeSweepRequest

const inline

inline bool consumeSweepRequest() const

sweepLocked

const inline

inline void sweepLocked() const

finishEmit

inline

inline void finishEmit()

resetEmitState

inline

inline void resetEmitState()