Added SignalAutoToken.

This commit is contained in:
Patrick Wuttke 2025-11-04 17:51:02 +01:00
parent 5e71b0ff9e
commit c54a87c90e

View File

@ -75,10 +75,70 @@ public:
template<typename... TArgs>
using Signal = BaseSignal<MIJIN_DEFAULT_ALLOCATOR, TArgs...>;
template<template<typename> typename TAllocator, typename... TArgs>
class SignalAutoToken
{
public:
using signal_t = BaseSignal<TAllocator, TArgs...>;
private:
signal_t* signal_ = nullptr;
signal_token_t token_ = INVALID_SIGNAL_TOKEN;
public:
SignalAutoToken() = default;
SignalAutoToken(const SignalAutoToken&) = delete;
SignalAutoToken(SignalAutoToken&& other) MIJIN_NOEXCEPT
: signal_(std::exchange(other.signal_, nullptr)), token_(std::exchange(other.token_, INVALID_SIGNAL_TOKEN)) {}
template<typename THandler>
SignalAutoToken(signal_t& signal, THandler&& handler, Oneshot oneshot = Oneshot::NO) MIJIN_NOEXCEPT
: signal_(&signal), token_(signal.connect(std::forward<THandler>(handler), oneshot))
{}
template<typename TObject>
SignalAutoToken(signal_t& signal, TObject& object, void (TObject::* handler)(TArgs...), Oneshot oneshot = Oneshot::NO) MIJIN_NOEXCEPT
: signal_(&signal), token_(signal.connect(object, handler, oneshot)) {}
template<typename TObject>
SignalAutoToken(signal_t& signal, TObject& object, void (TObject::* handler)(TArgs...) const, Oneshot oneshot = Oneshot::NO) MIJIN_NOEXCEPT
: signal_(&signal), token_(signal.connect(object, handler, oneshot)) {}
~SignalAutoToken() noexcept
{
reset();
}
SignalAutoToken& operator=(const SignalAutoToken&) = delete;
SignalAutoToken& operator=(SignalAutoToken&& other) MIJIN_NOEXCEPT
{
if (this != &other)
{
reset();
signal_ = std::exchange(other.signal_, nullptr);
token_ = std::exchange(other.token_, INVALID_SIGNAL_TOKEN);
}
return *this;
}
private:
void reset() MIJIN_NOEXCEPT;
friend signal_t;
};
//
// public functions
//
template<template<typename> typename TAllocator, typename... TArgs>
void SignalAutoToken<TAllocator, TArgs...>::reset() MIJIN_NOEXCEPT
{
if (signal_ != nullptr && token_ != INVALID_SIGNAL_TOKEN)
{
signal_->disconnect(token_);
signal_ = nullptr;
token_ = INVALID_SIGNAL_TOKEN;
}
}
template<template<typename> typename TAllocator, typename... TArgs>
template<typename THandler, typename TWeak>
inline auto BaseSignal<TAllocator, TArgs...>::connect(THandler handler, Oneshot oneshot, std::weak_ptr<TWeak> referenced) MIJIN_NOEXCEPT -> token_t