Added SignalAutoToken.
This commit is contained in:
parent
5e71b0ff9e
commit
c54a87c90e
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user