#pragma once #include #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; using connection_st = signal_system_st::scoped_connection; template class signal_st; template class signal_st { 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&) = delete; signal_st& operator=(signal_st&&) = delete; connection_st connect(tl::function 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)...); } 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; } }; }