Added SignalAutoToken.
This commit is contained in:
parent
5e71b0ff9e
commit
c54a87c90e
@ -75,10 +75,70 @@ public:
|
|||||||
template<typename... TArgs>
|
template<typename... TArgs>
|
||||||
using Signal = BaseSignal<MIJIN_DEFAULT_ALLOCATOR, 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
|
// 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<template<typename> typename TAllocator, typename... TArgs>
|
||||||
template<typename THandler, typename TWeak>
|
template<typename THandler, typename TWeak>
|
||||||
inline auto BaseSignal<TAllocator, TArgs...>::connect(THandler handler, Oneshot oneshot, std::weak_ptr<TWeak> referenced) MIJIN_NOEXCEPT -> token_t
|
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