1#ifndef LIBSBX_SIGNAL_SLOT_HPP_
2#define LIBSBX_SIGNAL_SLOT_HPP_
8#include <libsbx/signals/cleanable.hpp>
9#include <libsbx/signals/function_traits.hpp>
10#include <libsbx/signals/object_ptr.hpp>
12namespace sbx::signals {
17template <
typename... Args>
18using slot_ptr = std::shared_ptr<slot_base<Args...>>;
20template<
typename... Args>
23 template<lockable,
typename...>
34 virtual auto call_slot(Args&&...) ->
void = 0;
36 template<
typename... Others>
37 void operator()(Others&&... args) {
38 if (slot_state::is_connected() && !slot_state::is_blocked()) {
39 call_slot(std::forward<Others>(args)...);
43 template<
typename Callable>
44 bool has_callable(
const Callable& callable)
const {
45 auto handle = get_callable();
46 return eq_function_ptr(callable, handle);
49 template<
typename Callable>
51 auto has_full_callable([[maybe_unused]]
const Callable& callable)
const ->
bool {
55 template<
typename Callable>
57 auto has_full_callable(
const Callable& callable)
const ->
bool {
58 return has_callable(callable);
61 template<
typename Object>
62 bool has_object(
const Object&
object)
const {
63 return get_object() == get_object_ptr(
object);
68 void do_disconnect()
final {
72 virtual auto get_object()
const noexcept -> object_ptr {
76 virtual auto get_callable()
const noexcept ->
function_ptr {
77 return get_function_ptr(
nullptr);
86template<
typename Function,
typename... Args>
91 template<
typename Other,
typename Group>
92 constexpr slot(
cleanable& cleaner, Other&& other, Group group)
94 _function{std::forward<Other>(other)} { }
98 auto call_slot(Args&&... args) ->
void override {
99 std::invoke(_function, std::forward<Args>(args)...);
102 auto get_callable()
const noexcept ->
function_ptr override {
103 return get_function_ptr(_function);
108 std::decay_t<Function> _function;
112template<
typename MemberFunctionPtr,
typename Object,
typename... Args>
116 template<
typename MFP,
typename O>
119 _member_function_ptr{std::forward<MFP>(member_function_ptr)},
120 _object{std::forward<O>(
object)} { }
124 auto call_slot(Args&&... args) ->
void override {
126 std::invoke(_member_function_ptr, _object, std::forward<Args>(args)...);
129 auto get_callable()
const noexcept ->
function_ptr override {
130 return get_function_ptr(_member_function_ptr);
133 auto get_object()
const noexcept -> object_ptr
override {
134 return get_object_ptr(_member_function_ptr);
139 std::decay_t<MemberFunctionPtr> _member_function_ptr;
140 std::decay_t<Object> _object;
144template<
typename Function,
typename WeakPtr,
typename... Args>
148 template<
typename F,
typename P>
151 _function{std::forward<F>(function)},
152 _object{std::forward<P>(
object)} { }
154 auto is_connected()
const noexcept ->
bool override {
155 return !_object.expired() && slot_state::is_connected();
160 auto call_slot(Args&&... args) ->
void override {
161 auto object = _object.lock();
164 slot_state::disconnect();
168 if (slot_state::is_connected()) {
170 std::invoke(_function, std::forward<Args>(args)...);
174 auto get_callable()
const noexcept ->
function_ptr override {
175 return get_function_ptr(_function);
178 auto get_object()
const noexcept -> object_ptr
override {
179 return get_object_ptr(_object);
184 std::decay_t<Function> _function;
185 std::decay_t<WeakPtr> _object;
189template<
typename MemberFunctionPtr,
typename WeakPtr,
typename... Args>
193 template<
typename MFP,
typename O>
196 _member_function_ptr{std::forward<MFP>(member_function_ptr)},
197 _object{std::forward<O>(
object)} { }
199 auto is_connected()
const noexcept ->
bool override {
200 return !_object.expired() && slot_state::is_connected();
205 auto call_slot(Args&&... args) ->
void override {
206 auto object = _object.lock();
209 slot_state::disconnect();
213 if (slot_state::is_connected()) {
215 std::invoke(_member_function_ptr, *_object, std::forward<Args>(args)...);
219 auto get_callable()
const noexcept ->
function_ptr override {
220 return get_function_ptr(_member_function_ptr);
223 auto get_object()
const noexcept -> object_ptr
override {
224 return get_object_ptr(_member_function_ptr);
229 std::decay_t<MemberFunctionPtr> _member_function_ptr;
230 std::decay_t<WeakPtr> _object;
Definition: function_traits.hpp:32
Definition: signal.hpp:16
Definition: slot_state.hpp:14
Definition: cleanable.hpp:10
Definition: function_traits.hpp:74