17class AbstractFunctionConnector {
18 friend FunctionConnectionGuard;
21 enum ConnectionType : uint8_t { Auto = 0, Direct = 0x01, Queued = 0x02, Sync = 0x04, AutoOnly = 0x10, DirectOnly = 0x11, QueuedOnly = 0x12, SyncOnly = 0x14 };
23 friend AbstractFunctionConnector;
24 friend FunctionConnectionGuard;
27 enum Type : uint8_t { Auto = AbstractFunctionConnector::Auto, Direct = AbstractFunctionConnector::Direct, Queued = AbstractFunctionConnector::Queued, Sync = AbstractFunctionConnector::Sync, Default = 0x80 };
30 Connection(AbstractFunctionConnector *, Type);
31 virtual ~Connection() = 0;
36 AbstractFunctionConnector *connector_;
37 FunctionConnectionGuard *guarg_ =
nullptr;
40 AbstractFunctionConnector(ConnectionType = Auto);
43 template <
typename F,
typename... Args>
46 QueuedTask(F *f, Args &...args) : f_(f), args_(args...) {}
47 ~QueuedTask() {
delete f_; }
48 void operator()()
override { std::apply(*f_, args_); }
50 std::tuple<Args...> args_;
52 virtual ~AbstractFunctionConnector() = 0;
53 std::vector<Connection *> list;
54 ConnectionType defaultConnectionType;
64 using AbstractFunctionConnector::AbstractFunctionConnector;
67 Connection &
operator()(T f, Connection::Type t = Connection::Default) {
68 std::lock_guard<std::mutex> lock(mutex);
69#ifndef __clang_analyzer__
70 return *
new Connection(f,
this, t);
74 template <
typename O,
typename M>
75 Connection &
connect(O *o, M m, Connection::Type t = Connection::Default) {
76 return operator()([o, m](Args... args) { (o->*m)(args...); }, t);
80 std::lock_guard<std::mutex> lock(mutex);
81 for (
const Connection *c : *
reinterpret_cast<std::vector<Connection *> *
>(&list)) {
82 if (c->type_ == Connection::Direct || (c->type_ != Connection::Queued && c->thread_->id() == std::this_thread::get_id())) {
86 if (c->type_ != Connection::Sync) {
88 if (!c->thread_->invokeTask(_t))
delete _t;
90 c->thread_->invokeMethod([c, &args...]()
mutable { (*c->f)(args...); },
true);
96 class Connection :
public AbstractFunctionConnector::Connection {
100 template <
typename T>
104 struct AbstractFunction :
public AsyncFw::AbstractFunction<Args &...> {
105 virtual AbstractFunction *copy()
const = 0;
107 template <
typename T>
108 struct Function : AbstractFunction {
109 Function(T &_f) : f(std::move(_f)) {}
110 Function(
const Function *_f) : f(_f->f) {}
112 AbstractFunction *copy()
const override {
return new Function(
this); }
113 void operator()(Args &...args)
override { f(std::forward<Args>(args)...); }
116 ~Connection()
override {
delete f; }
144class FunctionConnectionGuard {
145 friend AbstractFunctionConnector::Connection;
148 FunctionConnectionGuard();
149 FunctionConnectionGuard(FunctionConnectionGuard &&);
150 FunctionConnectionGuard(AbstractFunctionConnector::Connection &);
151 ~FunctionConnectionGuard();
152 void operator=(AbstractFunctionConnector::Connection &);
153 void operator=(FunctionConnectionGuard &&);
154 operator bool()
const {
return c_; }
157 AbstractFunctionConnector::Connection *c_;