70 lines
1.4 KiB
C++
70 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <type_traits>
|
|
#include "tl/memory_buffer.h"
|
|
#include "compact_signal.h"
|
|
|
|
namespace tl
|
|
{
|
|
|
|
namespace detail
|
|
{
|
|
|
|
struct signal_st_null_mutex
|
|
{
|
|
inline void lock() noexcept {};
|
|
inline void unlock() noexcept {};
|
|
};
|
|
|
|
struct signal_st_thread_policy
|
|
{
|
|
using mutex_t = signal_st_null_mutex;
|
|
using connection_id_counter_t = uint32_t;
|
|
using data_ptr_t = uint64_t*;
|
|
};
|
|
|
|
}
|
|
|
|
using signal_system_st = signal_system<detail::signal_st_thread_policy>;
|
|
using connection_st = signal_system_st::scoped_connection;
|
|
|
|
template <typename Signature>
|
|
class signal_st;
|
|
|
|
template<typename R, typename...Args>
|
|
class signal_st<R(Args...)>
|
|
{
|
|
public:
|
|
signal_st() noexcept = default;
|
|
signal_st(const signal_st&) noexcept = delete;
|
|
signal_st(signal_st&&) noexcept = delete;
|
|
~signal_st() noexcept
|
|
{
|
|
disconnect_all_slots();
|
|
}
|
|
|
|
signal_st& operator=(const signal_st<R(Args...)>&) = delete;
|
|
signal_st& operator=(signal_st<R(Args...)>&&) = delete;
|
|
|
|
connection_st connect(tl::function<void(Args...)> delegate) noexcept
|
|
{
|
|
return signal_system_st::add((intptr_t)this, 0, std::move(delegate));
|
|
}
|
|
|
|
void invoke(Args... args) const noexcept
|
|
{
|
|
signal_system_st::invoke((intptr_t)this, 0, std::forward<Args>(args)...);
|
|
}
|
|
|
|
void disconnect_all_slots() const noexcept
|
|
{
|
|
signal_system_st::remove_all((intptr_t)this);
|
|
}
|
|
|
|
bool has_slots() const
|
|
{
|
|
return signal_system_st::get_slot_count((intptr_t)this, 0) > 0;
|
|
}
|
|
};
|
|
|
|
} |