2#ifndef LIBSBX_SIGNAL_SLOT_HPP_
3#define LIBSBX_SIGNAL_SLOT_HPP_
9#include <libsbx/signals/cleanable.hpp>
10#include <libsbx/signals/function_traits.hpp>
11#include <libsbx/signals/object_ptr.hpp>
13namespace sbx::signals {
18template <
typename... Args>
19using slot_ptr = std::shared_ptr<slot_base<Args...>>;
21template<
typename... Args>
24 template<lockable,
typename...>
35 virtual auto call_slot(Args&&...) ->
void = 0;
37 template<
typename... Others>
38 void operator()(Others&&... args) {
39 if (slot_state::is_connected() && !slot_state::is_blocked()) {
40 call_slot(std::forward<Others>(args)...);
44 template<
typename Callable>
45 bool has_callable(
const Callable& callable)
const {
46 auto handle = get_callable();
47 return eq_function_ptr(callable, handle);
50 template<
typename Callable>
52 auto has_full_callable([[maybe_unused]]
const Callable& callable)
const ->
bool {
56 template<
typename Callable>
58 auto has_full_callable(
const Callable& callable)
const ->
bool {
59 return has_callable(callable);
62 template<
typename Object>
63 bool has_object(
const Object&
object)
const {
64 return get_object() == get_object_ptr(
object);
69 void do_disconnect()
final {
73 virtual auto get_object()
const noexcept -> object_ptr {
77 virtual auto get_callable()
const noexcept ->
function_ptr {
78 return get_function_ptr(
nullptr);
87template<
typename Function,
typename... Args>
92 template<
typename Other,
typename Group>
93 constexpr slot(
cleanable& cleaner, Other&& other, Group group)
95 _function{std::forward<Other>(other)} { }
99 auto call_slot(Args&&... args) ->
void override {
100 std::invoke(_function, std::forward<Args>(args)...);
103 auto get_callable()
const noexcept ->
function_ptr override {
104 return get_function_ptr(_function);
109 std::decay_t<Function> _function;
113template<
typename MemberFunctionPtr,
typename Object,
typename... Args>
117 template<
typename MFP,
typename O>
120 _member_function_ptr{std::forward<MFP>(member_function_ptr)},
121 _object{std::forward<O>(
object)} { }
125 auto call_slot(Args&&... args) ->
void override {
127 std::invoke(_member_function_ptr, _object, std::forward<Args>(args)...);
130 auto get_callable()
const noexcept ->
function_ptr override {
131 return get_function_ptr(_member_function_ptr);
134 auto get_object()
const noexcept -> object_ptr
override {
135 return get_object_ptr(_member_function_ptr);
140 std::decay_t<MemberFunctionPtr> _member_function_ptr;
141 std::decay_t<Object> _object;
145template<
typename Function,
typename WeakPtr,
typename... Args>
149 template<
typename F,
typename P>
152 _function{std::forward<F>(function)},
153 _object{std::forward<P>(
object)} { }
155 auto is_connected()
const noexcept ->
bool override {
156 return !_object.expired() && slot_state::is_connected();
161 auto call_slot(Args&&... args) ->
void override {
162 auto object = _object.lock();
165 slot_state::disconnect();
169 if (slot_state::is_connected()) {
171 std::invoke(_function, std::forward<Args>(args)...);
175 auto get_callable()
const noexcept ->
function_ptr override {
176 return get_function_ptr(_function);
179 auto get_object()
const noexcept -> object_ptr
override {
180 return get_object_ptr(_object);
185 std::decay_t<Function> _function;
186 std::decay_t<WeakPtr> _object;
190template<
typename MemberFunctionPtr,
typename WeakPtr,
typename... Args>
194 template<
typename MFP,
typename O>
197 _member_function_ptr{std::forward<MFP>(member_function_ptr)},
198 _object{std::forward<O>(
object)} { }
200 auto is_connected()
const noexcept ->
bool override {
201 return !_object.expired() && slot_state::is_connected();
206 auto call_slot(Args&&... args) ->
void override {
207 auto object = _object.lock();
210 slot_state::disconnect();
214 if (slot_state::is_connected()) {
216 std::invoke(_member_function_ptr, *_object, std::forward<Args>(args)...);
220 auto get_callable()
const noexcept ->
function_ptr override {
221 return get_function_ptr(_member_function_ptr);
224 auto get_object()
const noexcept -> object_ptr
override {
225 return get_object_ptr(_member_function_ptr);
230 std::decay_t<MemberFunctionPtr> _member_function_ptr;
231 std::decay_t<WeakPtr> _object;
Definition: function_traits.hpp:33
Definition: signal.hpp:17
Definition: slot_state.hpp:15
Definition: cleanable.hpp:11
Definition: function_traits.hpp:75