WebCFace 3.1.1
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
func_internal.h
Go to the documentation of this file.
1#pragma once
2#include <condition_variable>
3#include <unordered_map>
4#include <mutex>
6#include "webcface/func.h"
7
9namespace message {
10struct FuncInfo;
11struct Call;
12} // namespace message
13
14namespace internal {
19struct PromiseData : public std::enable_shared_from_this<PromiseData> {
24 std::mutex m;
25 std::condition_variable cond;
26
27 std::function<void(Promise)> reach_event;
28 std::function<void(Promise)> finish_event;
29 bool reach_event_done = false;
30 bool finish_event_done = false;
31
32 bool reached = false;
33 bool found = false;
34 bool finished = false;
35 bool is_error = false;
38
40 std::size_t caller_id;
41 const std::vector<ValAdaptorVector> args_;
42 std::variant<int, std::vector<wcfMultiVal>, std::vector<wcfMultiValW>>
44
48 void callReachEvent();
52 void callFinishEvent();
53
57 explicit PromiseData(const Field &base, std::vector<ValAdaptorVector> &&args,
58 std::size_t caller_id = 0)
59 : reach_event(), finish_event(), base(base),
60 caller_id(caller_id), args_(std::move(args)) {}
61
66 template <std::size_t v_index, typename CVal>
67 std::vector<CVal> &initCArgs();
68
69 Promise getter();
70 CallHandle setter();
71
72 std::size_t callerId() const { return caller_id; }
73};
74
83 std::mutex mtx;
84 std::unordered_map<std::size_t, std::shared_ptr<PromiseData>> promises;
85 std::size_t next_caller_id = 0;
86
87 public:
92 std::shared_ptr<PromiseData> addResult(const Field &base) {
93 std::lock_guard lock(mtx);
94 std::size_t caller_id = next_caller_id++;
95 auto state = std::make_shared<PromiseData>(
96 base, std::vector<ValAdaptorVector>{}, caller_id);
97 promises.emplace(caller_id, state);
98 return state;
99 }
104 std::shared_ptr<PromiseData> getResult(std::size_t caller_id) {
105 std::lock_guard lock(mtx);
106 auto it = promises.find(caller_id);
107 if (it != promises.end()) {
108 return it->second;
109 } else {
110 throw PromiseError("caller id not found");
111 }
112 }
117 void removeResult(std::size_t caller_id) {
118 std::lock_guard lock(mtx);
119 auto it = promises.find(caller_id);
120 if (it != promises.end()) {
121 promises.erase(it);
122 } else {
123 throw PromiseError("caller id not found");
124 }
125 }
126};
127
136struct FuncInfo : public Field {
138 std::optional<std::vector<Arg>> args;
139 std::function<Func::FuncType> func_impl;
140 int index;
141
148 void run(const CallHandle &handle) {
149 if (func_impl) {
150 func_impl(handle);
151 } else {
152 throw SanityError("func_impl is null");
153 }
154 }
155
161 void run(webcface::message::Call &&call);
162
163 FuncInfo();
164 FuncInfo(const Field &base, ValType return_type,
165 std::optional<std::vector<Arg>> &&args,
166 std::function<Func::FuncType> &&func_impl);
167 FuncInfo(const message::FuncInfo &m);
168 message::FuncInfo toMessage(const SharedString &field);
169};
170
171} // namespace internal
呼び出された関数の引数の取得と戻り値のセットをするインタフェース
Definition func_result.h:275
非同期で実行した関数の実行結果を取得するインタフェース。
Definition func_result.h:30
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:170
ValAdaptorのVector.
Definition val_adaptor_vec.h:17
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:81
PromiseDataのリストを保持する。
Definition func_internal.h:82
std::shared_ptr< PromiseData > addResult(const Field &base)
新しいcaller_idを振って新しいAsyncFuncStateを生成しそれを返す
Definition func_internal.h:92
std::shared_ptr< PromiseData > getResult(std::size_t caller_id)
AsyncFuncStateを取得
Definition func_internal.h:104
void removeResult(std::size_t caller_id)
resultを設定し終わったstateを削除
Definition func_internal.h:117
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:21
ClientDataの参照とメンバ名とデータ名を持つクラス
Definition field.h:68
Funcの実行結果の処理中に発生した例外
Definition exception.h:71
未初期化の変数にアクセスした場合に発生する例外
Definition exception.h:47
関数1つの情報を表す。関数の実体も持つ
Definition func_internal.h:136
std::function< Func::FuncType > func_impl
Definition func_internal.h:139
std::optional< std::vector< Arg > > args
Definition func_internal.h:138
ValType return_type
Definition func_internal.h:137
int index
Definition func_internal.h:140
void run(const CallHandle &handle)
func_implをこのスレッドで実行
Definition func_internal.h:148
PromiseとCallHandleのデータを保持するクラス
Definition func_internal.h:19
std::condition_variable cond
Definition func_internal.h:25
std::size_t callerId() const
Definition func_internal.h:72
std::size_t caller_id
Definition func_internal.h:40
std::function< void(Promise)> reach_event
Definition func_internal.h:27
Field base
Definition func_internal.h:39
ValAdaptor rejection
Definition func_internal.h:37
std::function< void(Promise)> finish_event
Definition func_internal.h:28
ValAdaptorVector response
Definition func_internal.h:36
std::mutex m
Definition func_internal.h:24
std::variant< int, std::vector< wcfMultiVal >, std::vector< wcfMultiValW > > c_args_
Definition func_internal.h:43
const std::vector< ValAdaptorVector > args_
Definition func_internal.h:41
PromiseData(const Field &base, std::vector< ValAdaptorVector > &&args, std::size_t caller_id=0)
Definition func_internal.h:57
関数呼び出し (client(caller)->server->client(receiver))
Definition func.h:23
Definition func.h:108
#define WEBCFACE_NS_END
Definition webcface-config.h:113
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:112