AsyncFw 1.2
Async Framework is c++ runtime with timers, poll notifiers, sockets, coroutines, etc.
 
Loading...
Searching...
No Matches
FunctionConnector.h
1/*
2Copyright (c) 2026 Alexandr Kuzmuk
3
4This file is part of the AsyncFw project. Licensed under the MIT License.
5See {Link: LICENSE file https://mit-license.org} in the project root for full license information.
6*/
7
8#pragma once
9
10#include "AbstractThread.h"
11
12namespace AsyncFw {
13
15
17class AbstractFunctionConnector {
18 friend FunctionConnectionGuard;
19
20public:
21 enum ConnectionType : uint8_t { Auto = 0, Direct = 0x01, Queued = 0x02, Sync = 0x04, AutoOnly = 0x10, DirectOnly = 0x11, QueuedOnly = 0x12, SyncOnly = 0x14 };
22 class Connection {
23 friend AbstractFunctionConnector;
24 friend FunctionConnectionGuard;
25
26 public:
27 enum Type : uint8_t { Auto = AbstractFunctionConnector::Auto, Direct = AbstractFunctionConnector::Direct, Queued = AbstractFunctionConnector::Queued, Sync = AbstractFunctionConnector::Sync, Default = 0x80 };
28
29 protected:
30 Connection(AbstractFunctionConnector *, Type);
31 virtual ~Connection() = 0;
32 AbstractThread *thread_;
33 Type type_;
34
35 private:
36 AbstractFunctionConnector *connector_;
37 FunctionConnectionGuard *guarg_ = nullptr;
38 };
39
40 AbstractFunctionConnector(ConnectionType = Auto);
41
42protected:
43 template <typename F, typename... Args>
44 class QueuedTask : public AbstractThread::AbstractTask {
45 public:
46 QueuedTask(F *f, Args &...args) : f_(f), args_(args...) {}
47 ~QueuedTask() { delete f_; }
48 void operator()() override { std::apply(*f_, args_); }
49 F *f_;
50 std::tuple<Args...> args_;
51 };
52 virtual ~AbstractFunctionConnector() = 0;
53 std::vector<Connection *> list;
54 ConnectionType defaultConnectionType;
55 std::mutex mutex;
56};
57
61template <typename... Args>
62class FunctionConnector : public AbstractFunctionConnector {
63public:
64 using AbstractFunctionConnector::AbstractFunctionConnector;
66 template <typename T>
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);
71#endif
72 }
73
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);
77 }
78
79 void operator()(Args... args) {
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())) {
83 (*c->f)(args...);
84 continue;
85 }
86 if (c->type_ != Connection::Sync) {
87 AbstractThread::AbstractTask *_t = new QueuedTask(c->f->copy(), args...);
88 if (!c->thread_->invokeTask(_t)) delete _t;
89 } else {
90 c->thread_->invokeMethod([c, &args...]() mutable { (*c->f)(args...); }, true);
91 }
92 }
93 }
94
95protected:
96 class Connection : public AbstractFunctionConnector::Connection {
97 friend class FunctionConnector<Args...>;
98
99 public:
100 template <typename T>
101 Connection(T &_f, AbstractFunctionConnector *c, Type t) : AbstractFunctionConnector::Connection(c, t), f(new Function(_f)) {}
102
103 private:
104 struct AbstractFunction : public AsyncFw::AbstractFunction<Args &...> {
105 virtual AbstractFunction *copy() const = 0;
106 };
107 template <typename T>
108 struct Function : AbstractFunction {
109 Function(T &_f) : f(std::move(_f)) {}
110 Function(const Function *_f) : f(_f->f) {}
111 ~Function() {}
112 AbstractFunction *copy() const override { return new Function(this); }
113 void operator()(Args &...args) override { f(std::forward<Args>(args)...); }
114 T f;
115 };
116 ~Connection() override { delete f; }
117 AbstractFunction *f;
118 };
119};
120
122template <typename F>
124public:
125 template <typename... Args>
126 class Connector : private FunctionConnector<Args...> {
127 friend F;
128
129 public:
131 using FunctionConnector<Args...>::connect;
132 template <typename T>
133 AbstractFunctionConnector::Connection &operator()(T f, AbstractFunctionConnector::Connection::Type t = AbstractFunctionConnector::Connection::Default) {
135 }
136
137 protected:
138 using FunctionConnector<Args...>::operator();
139 };
140};
141
144class FunctionConnectionGuard {
145 friend AbstractFunctionConnector::Connection;
146
147public:
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_; }
155
156private:
157 AbstractFunctionConnector::Connection *c_;
158};
159
160class FunctionConnectionGuardList : public std::vector<FunctionConnectionGuard> {
161public:
162 void operator+=(FunctionConnectionGuard &&);
163};
164} // namespace AsyncFw
The AbstractFunctionConnector class.
Definition FunctionConnector.h:17
The AbstractThread class provides the base functionality for thread management.
Definition AbstractThread.h:46
AbstractFunction<> AbstractTask
The AbstractTask type.
Definition AbstractThread.h:56
The FunctionConnectionGuard class.
Definition FunctionConnector.h:144
Защищенный коннетор, отправитель может быть только один.
Definition FunctionConnector.h:123
Обеспечивает соединение отправитель -> получатели. Получатели могут быть вызваны в своих потоках (по ...
Definition FunctionConnector.h:62
Connection & operator()(T f, Connection::Type t=Connection::Default)
Подключиться
Definition FunctionConnector.h:67
Connection & connect(O *o, M m, Connection::Type t=Connection::Default)
Подключиться
Definition FunctionConnector.h:75
void operator()(Args... args)
Отправить
Definition FunctionConnector.h:79