WebCFace 3.1.1
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
func.h
Go to the documentation of this file.
1#pragma once
3#include "func_result.h"
4#include "arg.h"
6#include "func_trait.h"
7#include "exception.h"
8#include <thread>
9
11namespace internal {
12struct FuncInfo;
13}
14
15namespace traits {
16template <typename BadArg>
18template <typename BadArg>
22};
23// MSVCでexplicitな変換operatorがあるとき
24// std::is_constructible_t<Arg, ValAdaptor> が正しくtrueを返さないため、
25// decltypeで実装している
26template <typename Arg, typename = void>
27struct IsConstructibleArg : std::false_type {};
28template <>
29struct IsConstructibleArg<ValAdaptor, void> : std::true_type {};
30template <>
31struct IsConstructibleArg<ValAdaptorVector, void> : std::true_type {};
32template <typename Arg>
34 Arg, std::void_t<decltype(std::declval<ValAdaptorVector>().operator Arg())>>
35 : std::true_type {};
36
37template <typename... Args>
39template <>
41 struct ArgTypesCheckResult {
43 };
44};
45template <typename FirstArg, typename... OtherArgs>
46struct FuncArgTypesIterationTrait<FirstArg, OtherArgs...> {
47 using ArgTypesCheckResult = typename std::conditional_t<
49 FuncArgTypesIterationTrait<OtherArgs...>,
51};
52template <typename... Args>
54 typename FuncArgTypesIterationTrait<Args...>::ArgTypesCheckResult;
55
56template <typename BadArg>
60};
61template <typename Ret>
62using FuncReturnTypeTrait = std::conditional_t<
63 std::disjunction_v<std::is_void<Ret>,
64 std::is_constructible<ValAdaptorVector, Ret>>,
67
75template <typename T>
77template <typename Ret, typename... Args>
78struct FuncSignatureTrait<Ret(Args...)> : InvokeSignatureTrait<Ret(Args...)> {
81 static constexpr bool return_void = std::is_void_v<Ret>;
82 static inline bool assertArgsNum(const CallHandle &handle) {
83 return handle.assertArgsNum(sizeof...(Args));
84 }
85 static inline std::vector<Arg> argsInfo() {
86 return std::vector<Arg>{Arg{valTypeOf<Args>()}...};
87 }
88};
89template <typename Ret, typename T, typename... Args>
90struct FuncSignatureTrait<Ret (T::*)(Args...)>
91 : FuncSignatureTrait<Ret(Args...)> {};
92template <typename Ret, typename T, typename... Args>
93struct FuncSignatureTrait<Ret (T::*)(Args...) const>
94 : FuncSignatureTrait<Ret(Args...)> {};
95template <typename Ret, typename... Args>
96struct FuncSignatureTrait<Ret (*)(Args...)> : FuncSignatureTrait<Ret(Args...)> {
97};
98
99template <typename T>
101 std::declval<std::decay_t<T>>()))>;
102
103} // namespace traits
104
109class WEBCFACE_DLL Func : protected Field {
110 public:
113
114 Func() = default;
115 Func(const Field &base);
116 Func(const Field &base, const SharedString &field)
117 : Func(Field{base, field}) {}
118
119 using Field::lastName;
120 using Field::lastNameW;
121 using Field::member;
122 using Field::name;
123 using Field::nameW;
131 return this->Field::child(static_cast<SharedString &>(field));
132 }
137 [[deprecated]]
138 Func child(int index) const {
139 return this->Field::child(std::to_string(index));
140 }
149 return child(std::move(field));
150 }
156 [[deprecated]]
157 Func operator[](int index) const {
158 return child(std::to_string(index));
159 }
164 Func parent() const { return this->Field::parent(); }
165
167
168 protected:
173 const Func &setImpl(ValType return_type, std::vector<Arg> &&args,
174 std::function<FuncType> &&func_impl) const;
179 const Func &setImpl(ValType return_type, std::nullopt_t,
180 std::function<FuncType> &&func_impl) const;
181 const Func &
182 setImpl(const std::shared_ptr<internal::FuncInfo> &func_info) const;
183
188 template <typename F1>
189 static void catchAll(F1 &&f_run, const CallHandle &handle) {
191 try {
192 f_run();
193 return;
194 } catch (const std::exception &e) {
195 error = e.what();
196 } catch (const std::string &e) {
197 error = e;
198 } catch (const char *e) {
199 error = e;
200 } catch (const std::wstring &e) {
201 error = e;
202 } catch (const wchar_t *e) {
203 error = e;
204 } catch (...) {
205 error = "unknown exception";
206 }
207 handle.reject(error);
208 }
213 template <typename F1>
214 static void tryRun(F1 &&f_run, const CallHandle &handle) {
215 catchAll([&] { handle.respond(f_run()); }, handle);
216 }
217
218 public:
232 template <typename T,
233 typename traits::FuncObjTrait<
234 T>::ReturnTypeTrait::FuncReturnTypeCheckOk = traits::TraitOk,
236 traits::TraitOk>
237 const Func &set(T func) const {
238 return setImpl(
241 [func = std::move(func)](const CallHandle &handle) {
243 tryRun(
244 [&] {
246 args_tuple;
247 argToTuple(handle.args(), args_tuple);
248 if constexpr (traits::FuncObjTrait<
249 T>::return_void) {
250 std::apply(func, args_tuple);
251 return ValAdaptorVector();
252 } else {
253 auto ret = std::apply(func, args_tuple);
254 return ValAdaptorVector(ret);
255 }
256 },
257 handle);
258 }
259 });
260 }
274 template <typename T,
275 typename traits::FuncObjTrait<
276 T>::ReturnTypeTrait::FuncReturnTypeCheckOk = traits::TraitOk,
278 traits::TraitOk>
279 const Func &setAsync(T func) const {
280 return setImpl(
283 [func_p = std::make_shared<T>(std::move(func))](
284 const CallHandle &handle) {
286 std::thread([func_p, handle]() {
287 tryRun(
288 [&] {
290 args_tuple;
291 argToTuple(handle.args(), args_tuple);
292 if constexpr (traits::FuncObjTrait<
293 T>::return_void) {
294 std::apply(*func_p, args_tuple);
295 return ValAdaptorVector();
296 } else {
297 auto ret = std::apply(*func_p, args_tuple);
298 return ValAdaptorVector(ret);
299 }
300 },
301 handle);
302 }).detach();
303 }
304 });
305 }
316 template <typename T>
317 [[deprecated("use set() or setAsync()")]]
318 const Func &operator=(T func) const {
319 this->set(std::move(func));
320 return *this;
321 }
322
342 template <typename T,
343 typename std::enable_if_t<
344 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
345 std::nullptr_t> = nullptr>
346 const Func &set(std::vector<Arg> args, ValType return_type,
347 T callback) const {
348 auto args_size = args.size();
349 return setImpl(return_type, std::move(args),
350 [args_size, callback = std::move(callback)](
351 const CallHandle &handle) {
352 if (handle.assertArgsNum(args_size)) {
353 catchAll([&] { callback(handle); }, handle);
354 }
355 });
356 }
374 template <typename T,
375 typename std::enable_if_t<
376 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
377 std::nullptr_t> = nullptr>
378 const Func &setAsync(std::vector<Arg> args, ValType return_type,
379 T callback) const {
380 auto args_size = args.size();
381 return setImpl(
382 return_type, std::move(args),
383 [args_size,
384 callback = std::make_shared<std::function<void(FuncCallHandle)>>(
385 std::move(callback))](const CallHandle &handle) {
386 if (handle.assertArgsNum(args_size)) {
387 std::thread([callback, handle] {
388 catchAll([&] { callback->operator()(handle); }, handle);
389 }).detach();
390 }
391 });
392 }
409 template <typename T,
410 typename std::enable_if_t<
411 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
412 std::nullptr_t> = nullptr>
413 const Func &set(T callback) const {
414 return setImpl(ValType::none_, std::nullopt,
415 [base = *this, callback = std::move(callback)](
416 const CallHandle &handle) {
417 if (handle.assertArgsNum(base.args().size())) {
418 catchAll([&] { callback(handle); }, handle);
419 }
420 });
421 }
438 template <typename T,
439 typename std::enable_if_t<
440 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
441 std::nullptr_t> = nullptr>
442 const Func &setAsync(T callback) const {
443 return setImpl(
444 ValType::none_, std::nullopt,
445 [base = *this,
446 callback = std::make_shared<std::function<void(FuncCallHandle)>>(
447 std::move(callback))](const CallHandle &handle) {
448 if (handle.assertArgsNum(base.args().size())) {
449 std::thread([callback, handle] {
450 catchAll([&] { callback->operator()(handle); }, handle);
451 }).detach();
452 }
453 });
454 }
455
460 const Func &free() const;
461
479 template <typename... Args>
480 Promise runAsync(Args... args) const {
481 return runAsync(
482 std::vector<ValAdaptorVector>{ValAdaptorVector(args)...});
483 }
484 Promise runAsync(std::vector<ValAdaptorVector> args_vec) const;
485 Promise runAsync(std::vector<ValAdaptor> args_vec) const {
486 return runAsync(
487 std::vector<ValAdaptorVector>(args_vec.begin(), args_vec.end()));
488 }
489
495 bool exists() const;
503 int index() const;
515 const Func &setIndex(int index) const;
516
521 ValType returnType() const;
528 std::vector<Arg> args() const;
529
530 const Arg args(std::size_t i) const { return args().at(i); }
531
545 const Func &setArgs(const std::vector<Arg> &args) const;
555 const Func &setReturnType(ValType return_type) const;
556
561 template <typename T, typename std::enable_if_t<std::is_same_v<T, Func>,
562 std::nullptr_t> = nullptr>
563 bool operator==(const T &other) const {
564 return static_cast<Field>(*this) == static_cast<Field>(other);
565 }
566 template <typename T, typename std::enable_if_t<std::is_same_v<T, Func>,
567 std::nullptr_t> = nullptr>
568 bool operator!=(const T &other) const {
569 return static_cast<Field>(*this) != static_cast<Field>(other);
570 }
571};
572
573class WEBCFACE_DLL FuncListener : protected Func {
574 ValType return_type_ = ValType::none_;
575 std::vector<Arg> args_{};
576
577 public:
578 FuncListener() = default;
579 FuncListener(const Field &base);
580 FuncListener(const Field &base, const SharedString &field)
581 : FuncListener(Field{base, field}) {}
582
585 using Field::member;
586 using Field::name;
587
592 FuncListener &listen();
599 FuncListener &listen(std::size_t args_num,
600 ValType return_type = ValType::none_) {
601 this->args_.resize(args_num);
602 this->return_type_ = return_type;
603 listen();
604 return *this;
605 }
606
613 FuncListener &setArgs(const std::vector<Arg> &args) {
614 this->args_ = args;
615 return *this;
616 }
624 this->return_type_ = type;
625 return *this;
626 }
627
638 std::optional<FuncCallHandle> fetchCall() const;
639};
640
引数の情報を表す。
Definition arg.h:31
呼び出された関数の引数の取得と戻り値のセットをするインタフェース
Definition func_result.h:275
void reject(const ValAdaptor &message) const
Definition func_result.cc:92
void respond(const ValAdaptorVector &value) const
Definition func_result.cc:74
bool assertArgsNum(std::size_t expected) const
引数の数をチェックする
Definition func_result.cc:111
const std::vector< ValAdaptorVector > & args() const
関数の引数を取得する
Definition func_result.cc:323
Definition func.h:573
FuncListener(const Field &base, const SharedString &field)
Definition func.h:580
FuncListener & setReturnType(ValType type)
戻り値の型をセットする
Definition func.h:623
FuncListener & setArgs(const std::vector< Arg > &args)
引数の情報をセットする
Definition func.h:613
FuncListener & listen(std::size_t args_num, ValType return_type=ValType::none_)
関数呼び出しの待受を開始する
Definition func.h:599
関数1つを表すクラス
Definition func.h:109
bool operator==(const T &other) const
Funcの参照先を比較
Definition func.h:563
const Func & setAsync(T func) const
非同期に実行される関数をセットする
Definition func.h:279
const Func & setAsync(T callback) const
引数にFuncCallHandleを取り非同期に実行される関数を登録する
Definition func.h:442
Promise runAsync(std::vector< ValAdaptor > args_vec) const
Definition func.h:485
const Func & setAsync(std::vector< Arg > args, ValType return_type, T callback) const
引数にFuncCallHandleを取り非同期に実行される関数を登録する
Definition func.h:378
Func operator[](StringInitializer field) const
Definition func.h:148
Func child(int index) const
Definition func.h:138
void(CallHandle) FuncType
Definition func.h:166
const Arg args(std::size_t i) const
Definition func.h:530
const Func & operator=(T func) const
関数をセットする
Definition func.h:318
Func()=default
static void catchAll(F1 &&f_run, const CallHandle &handle)
Definition func.h:189
Func child(StringInitializer field) const
「(thisの名前).(追加の名前)」を新しい名前とするField
Definition func.h:130
bool operator!=(const T &other) const
Definition func.h:568
const Func & set(std::vector< Arg > args, ValType return_type, T callback) const
引数にCallHandleを取る関数を登録する
Definition func.h:346
Func(const Field &base, const SharedString &field)
Definition func.h:116
static void tryRun(F1 &&f_run, const CallHandle &handle)
Definition func.h:214
const Func & set(T func) const
関数をセットする
Definition func.h:237
const Func & set(T callback) const
引数にCallHandleを取る関数を登録する
Definition func.h:413
Func parent() const
nameの最後のピリオドの前までを新しい名前とするField
Definition func.h:164
Func operator[](int index) const
Definition func.h:157
Promise runAsync(Args... args) const
関数を実行する (非同期)
Definition func.h:480
非同期で実行した関数の実行結果を取得するインタフェース。
Definition func_result.h:30
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:170
SharedString のpublicなコンストラクタインタフェース (入力専用)
Definition encoding.h:235
Definition component_canvas2d.h:148
Viewを構築するときに使う一時的なViewComponent.
Definition component_view.h:292
ValAdaptorのVector.
Definition val_adaptor_vec.h:17
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:81
std::nullptr_t TraitOkType
Definition trait.h:11
std::conditional_t< std::disjunction_v< std::is_void< Ret >, std::is_constructible< ValAdaptorVector, Ret > >, FuncReturnTypeCheckOkTrait, This_return_type_is_not_supported_by_WebCFace_Func< Ret > > FuncReturnTypeTrait
Definition func.h:66
constexpr std::nullptr_t TraitOk
Definition trait.h:12
typename FuncArgTypesIterationTrait< Args... >::ArgTypesCheckResult FuncArgTypesTrait
Definition func.h:54
constexpr auto getInvokeSignature(T &&) -> decltype(&T::operator())
Definition func_trait.h:13
void argToTuple(const std::vector< ValAdaptorVector > &args, T &tuple)
ValAdaptorのリストから任意の型のタプルに変換する
Definition val_adaptor_vec.h:257
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:21
ValType valTypeOf()
TのValTypeを得る
Definition val_adaptor_vec.h:278
ClientDataの参照とメンバ名とデータ名を持つクラス
Definition field.h:68
Field parent() const
nameの最後のピリオドの前までを新しい名前とするField
Definition field.cc:39
Field child(const SharedString &field) const
Definition field.cc:48
typename std::conditional_t< IsConstructibleArg< std::decay_t< FirstArg > >::value, FuncArgTypesIterationTrait< OtherArgs... >, FuncArgTypesIterationFailureTrait< FirstArg > >::ArgTypesCheckResult ArgTypesCheckResult
Definition func.h:50
TraitOkType FuncReturnTypeCheckOk
Definition func.h:59
static std::vector< Arg > argsInfo()
Definition func.h:85
FuncReturnTypeTrait< Ret > ReturnTypeTrait
Definition func.h:79
static bool assertArgsNum(const CallHandle &handle)
Definition func.h:82
FuncArgTypesTrait< Args... > ArgTypesTrait
Definition func.h:80
Definition func_trait.h:21
#define WEBCFACE_DLL
Definition webcface-config.h:69
#define WEBCFACE_NS_END
Definition webcface-config.h:113
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:112
#define WEBCFACE_CALL_FP
Definition webcface-config.h:107