WebCFace 2.5.2
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"
5#include "trait.h"
6
8namespace internal {
9struct FuncInfo;
10}
11
12namespace traits {
13template <typename T>
14constexpr auto getInvokeSignature(T &&) -> decltype(&T::operator()) {
15 return &T::operator();
16}
17template <typename Ret, typename... Args>
18constexpr auto getInvokeSignature(Ret (*p)(Args...)) {
19 return p;
20}
21template <typename T>
23 decltype(getInvokeSignature(std::declval<std::decay_t<T>>()));
24
25template <bool>
27template <>
28struct FuncArgTypeCheck<true> {
30};
31template <typename... Args>
33 : FuncArgTypeCheck<(std::is_convertible_v<ValAdaptor, Args> && ...)> {};
34
35template <bool>
37template <>
38struct FuncReturnTypeCheck<true> {
40};
41template <typename Ret>
43 : FuncReturnTypeCheck<std::is_same_v<Ret, void> ||
44 std::is_constructible_v<ValAdaptor, Ret>> {};
45
46template <typename T>
55template <typename Ret, typename... Args>
56struct FuncSignatureTrait<Ret(Args...)> {
59 static constexpr bool return_void = std::is_same_v<Ret, void>;
60 static inline bool assertArgsNum(const CallHandle &handle) {
61 return handle.assertArgsNum(sizeof...(Args));
62 }
63 static inline std::vector<Arg> argsInfo() {
64 return std::vector<Arg>{Arg{valTypeOf<Args>()}...};
65 }
66 using ReturnType = Ret;
67 using ArgsTuple = std::tuple<std::decay_t<Args>...>;
68};
69template <typename Ret, typename T, typename... Args>
70struct FuncSignatureTrait<Ret (T::*)(Args...)>
71 : FuncSignatureTrait<Ret(Args...)> {};
72template <typename Ret, typename T, typename... Args>
73struct FuncSignatureTrait<Ret (T::*)(Args...) const>
74 : FuncSignatureTrait<Ret(Args...)> {};
75template <typename Ret, typename... Args>
76struct FuncSignatureTrait<Ret (*)(Args...)> : FuncSignatureTrait<Ret(Args...)> {
77};
78
86template <typename T>
88
89} // namespace traits
90
95class WEBCFACE_DLL Func : protected Field {
96 public:
99
100 Func() = default;
101 Func(const Field &base);
102 Func(const Field &base, const SharedString &field)
103 : Func(Field{base, field}) {}
104
105 using Field::lastName;
106 using Field::member;
107 using Field::name;
108 using Field::nameW;
113 Func child(std::string_view field) const {
114 return this->Field::child(field);
115 }
120 Func child(std::wstring_view field) const {
121 return this->Field::child(field);
122 }
126 Func child(int index) const { return this->Field::child(index); }
131 Func operator[](std::string_view field) const { return child(field); }
136 Func operator[](std::wstring_view field) const { return child(field); }
141 Func operator[](const char *field) const { return child(field); }
145 Func operator[](const wchar_t *field) const { return child(field); }
150 Func operator[](int index) const { return child(index); }
155 Func parent() const { return this->Field::parent(); }
156
158
159 protected:
164 const Func &setImpl(ValType return_type, std::vector<Arg> &&args,
165 std::function<FuncType> &&func_impl) const;
170 const Func &setImpl(ValType return_type, std::nullopt_t,
171 std::function<FuncType> &&func_impl) const;
172 const Func &
173 setImpl(const std::shared_ptr<internal::FuncInfo> &func_info) const;
174
179 template <typename F1>
180 static void catchAll(F1 &&f_run, const CallHandle &handle) {
181 ValAdaptor error;
182 try {
183 f_run();
184 return;
185 } catch (const std::exception &e) {
186 error = e.what();
187 } catch (const std::string &e) {
188 error = e;
189 } catch (const char *e) {
190 error = e;
191 } catch (const std::wstring &e) {
192 error = e;
193 } catch (const wchar_t *e) {
194 error = e;
195 } catch (...) {
196 error = "unknown exception";
197 }
198 handle.reject(error);
199 }
204 template <typename F1>
205 static void tryRun(F1 &&f_run, const CallHandle &handle) {
206 catchAll([&] { handle.respond(f_run()); }, handle);
207 }
208
209 public:
223 template <typename T,
225 ReturnTypeSupportedByWebCFaceFunc = traits::TraitOk,
227 ArgTypesSupportedByWebCFaceFunc = traits::TraitOk>
228 const Func &set(T func) const {
229 return setImpl(
232 [func = std::move(func)](const CallHandle &handle) {
234 typename traits::FuncObjTrait<T>::ArgsTuple args_tuple;
235 argToTuple(handle.args(), args_tuple);
236 tryRun(
237 [&] {
238 if constexpr (traits::FuncObjTrait<
239 T>::return_void) {
240 std::apply(func, args_tuple);
241 return ValAdaptor::emptyVal();
242 } else {
243 auto ret = std::apply(func, args_tuple);
244 return ret;
245 }
246 },
247 handle);
248 }
249 });
250 }
264 template <typename T,
266 ReturnTypeSupportedByWebCFaceFunc = traits::TraitOk,
268 ArgTypesSupportedByWebCFaceFunc = traits::TraitOk>
269 const Func &setAsync(T func) const {
270 return setImpl(
273 [func_p = std::make_shared<T>(std::move(func))](
274 const CallHandle &handle) {
276 typename traits::FuncObjTrait<T>::ArgsTuple args_tuple;
277 argToTuple(handle.args(), args_tuple);
278 std::thread(
279 [func_p, handle](auto args_tuple) {
280 tryRun(
281 [&] {
282 if constexpr (traits::FuncObjTrait<
283 T>::return_void) {
284 std::apply(*func_p, args_tuple);
285 return ValAdaptor::emptyVal();
286 } else {
287 auto ret =
288 std::apply(*func_p, args_tuple);
289 return ret;
290 }
291 },
292 handle);
293 },
294 std::move(args_tuple))
295 .detach();
296 }
297 });
298 }
309 template <typename T>
310 [[deprecated("use set() or setAsync()")]] const Func &
311 operator=(T func) const {
312 this->set(std::move(func));
313 return *this;
314 }
315
335 template <typename T,
336 typename std::enable_if_t<
337 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
338 std::nullptr_t> = nullptr>
339 const Func &set(std::vector<Arg> args, ValType return_type,
340 T callback) const {
341 auto args_size = args.size();
342 return setImpl(return_type, std::move(args),
343 [args_size, callback = std::move(callback)](
344 const CallHandle &handle) {
345 if (handle.assertArgsNum(args_size)) {
346 catchAll([&] { callback(handle); }, handle);
347 }
348 });
349 }
367 template <typename T,
368 typename std::enable_if_t<
369 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
370 std::nullptr_t> = nullptr>
371 const Func &setAsync(std::vector<Arg> args, ValType return_type,
372 T callback) const {
373 auto args_size = args.size();
374 return setImpl(
375 return_type, std::move(args),
376 [args_size,
377 callback = std::make_shared<std::function<void(FuncCallHandle)>>(
378 std::move(callback))](const CallHandle &handle) {
379 if (handle.assertArgsNum(args_size)) {
380 std::thread([callback, handle] {
381 catchAll([&] { callback->operator()(handle); }, handle);
382 }).detach();
383 }
384 });
385 }
402 template <typename T,
403 typename std::enable_if_t<
404 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
405 std::nullptr_t> = nullptr>
406 const Func &set(T callback) const {
407 return setImpl(ValType::none_, std::nullopt,
408 [base = *this, callback = std::move(callback)](
409 const CallHandle &handle) {
410 if (handle.assertArgsNum(base.args().size())) {
411 catchAll([&] { callback(handle); }, handle);
412 }
413 });
414 }
431 template <typename T,
432 typename std::enable_if_t<
433 std::is_same_v<std::invoke_result_t<T, CallHandle>, void>,
434 std::nullptr_t> = nullptr>
435 const Func &setAsync(T callback) const {
436 return setImpl(
437 ValType::none_, std::nullopt,
438 [base = *this,
439 callback = std::make_shared<std::function<void(FuncCallHandle)>>(
440 std::move(callback))](const CallHandle &handle) {
441 if (handle.assertArgsNum(base.args().size())) {
442 std::thread([callback, handle] {
443 catchAll([&] { callback->operator()(handle); }, handle);
444 }).detach();
445 }
446 });
447 }
448
457 [[deprecated("Func::hidden() does nothing since ver1.10")]]
458 const Func &hidden(bool) const {
459 return *this;
460 }
461
466 const Func &free() const;
467
480 template <typename... Args>
481 [[deprecated("use runAsync")]]
482 ValAdaptor run(Args... args) const {
483 return run({ValAdaptor(args)...});
484 }
485 [[deprecated("use runAsync")]]
486 ValAdaptor run(std::vector<ValAdaptor> &&args_vec) const {
487 auto p = runAsync(std::move(args_vec));
488 p.waitFinish();
489 if (p.found()) {
490 if (p.isError()) {
491 throw std::runtime_error(p.rejection());
492 } else {
493 return p.response();
494 }
495 } else {
496 throw FuncNotFound(*this);
497 }
498 }
503 template <typename... Args>
504 [[deprecated("use runAsync")]]
505 ValAdaptor operator()(Args... args) const {
506 return run(args...);
507 }
508
522 template <typename... Args>
523 Promise runAsync(Args... args) const {
524 return runAsync({ValAdaptor(args)...});
525 }
526 Promise runAsync(std::vector<ValAdaptor> args_vec) const;
527
533 bool exists() const;
534
539 ValType returnType() const;
546 std::vector<Arg> args() const;
547
548 const Arg args(std::size_t i) const { return args().at(i); }
549
563 const Func &setArgs(const std::vector<Arg> &args) const;
572 const Func &setReturnType(ValType return_type) const;
573
578 template <typename T, typename std::enable_if_t<std::is_same_v<T, Func>,
579 std::nullptr_t> = nullptr>
580 bool operator==(const T &other) const {
581 return static_cast<Field>(*this) == static_cast<Field>(other);
582 }
583 template <typename T, typename std::enable_if_t<std::is_same_v<T, Func>,
584 std::nullptr_t> = nullptr>
585 bool operator!=(const T &other) const {
586 return static_cast<Field>(*this) != static_cast<Field>(other);
587 }
588};
589
590class WEBCFACE_DLL FuncListener : protected Func {
591 ValType return_type_ = ValType::none_;
592 std::vector<Arg> args_{};
593
594 public:
595 FuncListener() = default;
596 FuncListener(const Field &base);
597 FuncListener(const Field &base, const SharedString &field)
598 : FuncListener(Field{base, field}) {}
599
602 using Field::member;
603 using Field::name;
604
609 FuncListener &listen();
616 FuncListener &listen(std::size_t args_num,
617 ValType return_type = ValType::none_) {
618 this->args_.resize(args_num);
619 this->return_type_ = return_type;
620 listen();
621 return *this;
622 }
623
630 FuncListener &setArgs(const std::vector<Arg> &args) {
631 this->args_ = args;
632 return *this;
633 }
641 this->return_type_ = type;
642 return *this;
643 }
644
653 [[deprecated("FuncListener::hidden() does nothing since ver1.10")]]
655 return *this;
656 }
667 std::optional<FuncCallHandle> fetchCall() const;
668};
669
引数の情報を表す。
Definition arg.h:30
呼び出された関数の引数の取得と戻り値のセットをするインタフェース
Definition func_result.h:323
void respond(const ValAdaptor &value) const
Definition func_result.cc:83
const std::vector< ValAdaptor > & args() const
関数の引数を取得する
Definition func_result.cc:332
void reject(const ValAdaptor &message) const
Definition func_result.cc:101
bool assertArgsNum(std::size_t expected) const
引数の数をチェックする
Definition func_result.cc:123
Definition func.h:590
FuncListener(const Field &base, const SharedString &field)
Definition func.h:597
FuncListener & setReturnType(ValType type)
戻り値の型をセットする
Definition func.h:640
FuncListener & setArgs(const std::vector< Arg > &args)
引数の情報をセットする
Definition func.h:630
FuncListener & hidden(bool)
関数を関数リストで非表示にする (他clientのentryに表示されなくする)
Definition func.h:654
FuncListener & listen(std::size_t args_num, ValType return_type=ValType::none_)
関数呼び出しの待受を開始する
Definition func.h:616
関数1つを表すクラス
Definition func.h:95
ValAdaptor operator()(Args... args) const
run()と同じ
Definition func.h:505
Func child(std::wstring_view field) const
「(thisの名前).(追加の名前)」を新しい名前とするField (wstring)
Definition func.h:120
bool operator==(const T &other) const
Funcの参照先を比較
Definition func.h:580
const Func & setAsync(T func) const
非同期に実行される関数をセットする
Definition func.h:269
const Func & setAsync(T callback) const
引数にFuncCallHandleを取り非同期に実行される関数を登録する
Definition func.h:435
ValAdaptor run(Args... args) const
関数を実行する (同期)
Definition func.h:482
const Func & hidden(bool) const
関数を関数リストで非表示にする (他clientのentryに表示されなくする)
Definition func.h:458
Func child(std::string_view field) const
「(thisの名前).(追加の名前)」を新しい名前とするField
Definition func.h:113
const Func & setAsync(std::vector< Arg > args, ValType return_type, T callback) const
引数にFuncCallHandleを取り非同期に実行される関数を登録する
Definition func.h:371
Func child(int index) const
Definition func.h:126
void(CallHandle) FuncType
Definition func.h:157
Func operator[](std::string_view field) const
Definition func.h:131
const Arg args(std::size_t i) const
Definition func.h:548
const Func & operator=(T func) const
関数をセットする
Definition func.h:311
Func()=default
static void catchAll(F1 &&f_run, const CallHandle &handle)
Definition func.h:180
bool operator!=(const T &other) const
Definition func.h:585
Func operator[](const wchar_t *field) const
Definition func.h:145
Func operator[](std::wstring_view field) const
Definition func.h:136
const Func & set(std::vector< Arg > args, ValType return_type, T callback) const
引数にCallHandleを取る関数を登録する
Definition func.h:339
Func(const Field &base, const SharedString &field)
Definition func.h:102
ValAdaptor run(std::vector< ValAdaptor > &&args_vec) const
Definition func.h:486
static void tryRun(F1 &&f_run, const CallHandle &handle)
Definition func.h:205
const Func & set(T func) const
関数をセットする
Definition func.h:228
const Func & set(T callback) const
引数にCallHandleを取る関数を登録する
Definition func.h:406
Func parent() const
nameの最後のピリオドの前までを新しい名前とするField
Definition func.h:155
Func operator[](int index) const
Definition func.h:150
Func operator[](const char *field) const
Definition func.h:141
Promise runAsync(Args... args) const
関数を実行する (非同期)
Definition func.h:523
非同期で実行した関数の実行結果を取得するインタフェース。
Definition func_result.h:50
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:69
Definition component_canvas2d.h:137
Viewを構築するときに使う一時的なViewComponent.
Definition component_view.h:267
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:87
static const ValAdaptor & emptyVal()
Definition val_adaptor.cc:6
std::nullptr_t TraitOkType
Definition trait.h:11
decltype(getInvokeSignature(std::declval< std::decay_t< T > >())) InvokeSignature
Definition func.h:23
constexpr std::nullptr_t TraitOk
Definition trait.h:12
constexpr auto getInvokeSignature(T &&) -> decltype(&T::operator())
Definition func.h:14
void argToTuple(const std::vector< ValAdaptor > &args, T &tuple)
ValAdaptorのリストから任意の型のタプルに変換する
Definition val_adaptor.h:331
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:21
ValType valTypeOf()
TのValTypeを得る
Definition val_adaptor.h:34
ClientDataの参照とメンバ名とデータ名を持つクラス
Definition field.h:70
Field parent() const
nameの最後のピリオドの前までを新しい名前とするField
Definition field.cc:33
Field child(const SharedString &field) const
Definition field.cc:42
Funcの実行ができなかった場合発生する例外
Definition func_result.h:32
TraitOkType ArgTypesSupportedByWebCFaceFunc
Definition func.h:29
TraitOkType ReturnTypeSupportedByWebCFaceFunc
Definition func.h:39
static std::vector< Arg > argsInfo()
Definition func.h:63
static bool assertArgsNum(const CallHandle &handle)
Definition func.h:60
std::tuple< std::decay_t< Args >... > ArgsTuple
Definition func.h:67
#define WEBCFACE_DLL
Definition webcface-config.h:60
#define WEBCFACE_NS_END
Definition webcface-config.h:104
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:103
#define WEBCFACE_CALL_FP
Definition webcface-config.h:98