tbridgeFunc.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "core/ast/args.hpp"
6#include "core/ast/params.hpp"
8
9namespace by {
10
11 template <typename T, nbool isBaseObj> class tbridger;
12
16 template <typename Ret, typename T, template <typename, nbool> class Marshaling, typename... Args>
17 class tbaseBridgeFunc: public baseFunc {
19 protected:
20 typedef Ret (T::*fptrType)(Args...);
21
22 public:
23 tbaseBridgeFunc(fptrType fptr, str ret):
24 _fptr(fptr),
25 _type("bridgeFunc", ttype<me>::get(),
26 params(
27 *new param("", Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::onAddParam())...),
28 false, ret.get()),
29 _src(dumSrc::singleton()) {}
30
31 public:
32 static_assert(
33 allTrues<(sizeof(Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::canMarshal()) ==
34 sizeof(metaIf::yes))...>::value,
35 "can't marshal one of this func's parameter ntypes.");
36
37 public:
38 const ntype& getType() const override { return _type; }
39
40 const baseObj& getOrigin() const override {
41 static obj inner(tbridger<T, tifSub<typename tadaptiveSuper<T>::super, baseObj>::is>::subs());
42 return inner;
43 }
44
45 using super::run;
46
47 str run(const args& a) override {
48 tmay<args> evaluated = a.evalAll(getParams()) OR.ret(str());
49
50 return _runNative(*evaluated);
51 }
52
53 void onCloneDeep(const clonable& from) override {
54 me& rhs = (me&) from;
55 this->_type.onCloneDeep(rhs._type);
56 }
57
58 const src& getSrc() const override { return *_src; }
59
60 void setSrc(const src& new1) { _src.bind(new1); }
61
62 protected:
63 virtual str _runNative(args& args) = 0;
64
65 protected:
66 fptrType _fptr;
67 mutable mgdType _type;
68 tstr<src> _src;
69 };
70
71 template <typename Ret, typename T, nbool isBaseObj, template <typename, nbool> class Marshaling, typename... Args>
72 class tbridgeFunc: public tbaseBridgeFunc<Ret, T, Marshaling, Args...> {
73 typedef tbaseBridgeFunc<Ret, T, Marshaling, Args...> _super_;
74 BY(ME(tbridgeFunc, _super_), CLONE(tbridgeFunc))
75
76 public:
77 tbridgeFunc(typename super::fptrType fptr):
78 super(fptr, Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::onGetRet()) {}
79
80 protected:
81 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
82
83 template <size_t... index> str _marshal(args& args, std::index_sequence<index...>);
84 };
85
86 template <typename T, template <typename, nbool> class Marshaling, typename... Args>
87 class tbridgeFunc<void, T, false, Marshaling, Args...>: public tbaseBridgeFunc<void, T, Marshaling, Args...> {
88 typedef tbaseBridgeFunc<void, T, Marshaling, Args...> _super_;
89 BY(ME(tbridgeFunc, _super_), CLONE(tbridgeFunc))
90
91 public:
92 tbridgeFunc(typename super::fptrType fptr): super(fptr, Marshaling<void, false>::onGetRet()) {}
93
94 protected:
95 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
96
97 template <size_t... index> str _marshal(args& args, std::index_sequence<index...>);
98 };
99
100 template <typename T, template <typename, nbool> class Marshaling, typename... Args>
101 class tbridgeFunc<void, T, true, Marshaling, Args...>: public tbaseBridgeFunc<void, T, Marshaling, Args...> {
102 typedef tbaseBridgeFunc<void, T, Marshaling, Args...> _super_;
103 BY(ME(tbridgeFunc, _super_), CLONE(tbridgeFunc))
104
105 public:
106 tbridgeFunc(typename super::fptrType fptr): super(fptr, Marshaling<void, false>::onGetRet()) {}
107
108 protected:
109 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
110
111 template <size_t... index> str _marshal(args& a, std::index_sequence<index...>) {
112 T& me = (T*) a.getMe() OR.err("object from frame does not exists.").ret(str());
113 (me.*(this->_fptr))(
114 Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::toNative(a[index])...);
115 return Marshaling<void, tifSub<void, node>::is>::toMgd();
116 }
117 };
118
119 template <typename Ret, typename T, template <typename, nbool> class Marshaling, typename... Args>
120 class tbridgeFunc<Ret, T, true, Marshaling, Args...>: public tbaseBridgeFunc<Ret, T, Marshaling, Args...> {
121 typedef tbaseBridgeFunc<Ret, T, Marshaling, Args...> _super_;
122 BY(ME(tbridgeFunc, _super_), CLONE(tbridgeFunc))
123
124 public:
125 tbridgeFunc(typename _super_::fptrType fptr):
126 super(fptr, Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::onGetRet()) {}
127
128 protected:
129 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
130
131 template <size_t... index> str _marshal(args& a, std::index_sequence<index...>) {
132 T& me = (T*) a.getMe() OR.err("object from frame does not exists.").ret(str());
133 return Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::toMgd((me.*(this->_fptr)) // funcptr
134 (Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::toNative(
135 a[index])...)); // and args.ZZZ
136 }
137 };
138} // namespace by
Base class for all types without explicit super class.
Definition: adam.hpp:11
Function call arguments container.
Definition: args.hpp:13
Base class for all function types.
Definition: baseFunc.hpp:18
virtual params & getParams()
Base class for all objects in byeol language.
Definition: baseObj.hpp:24
Interface for objects that can be cloned.
Definition: clonable.hpp:12
Managed type for byeol objects.
Definition: mgdType.hpp:17
Base class for all AST nodes in byeol language.
Definition: node.hpp:30
Native type system for byeol language.
Definition: ntype.hpp:19
Managed object in byeol programming environment.
Definition: obj.hpp:19
Function parameter definition.
Definition: param.hpp:13
Function parameter list container.
Definition: params.hpp:15
Source location information.
Definition: src.hpp:11
Base bridge function template.
Definition: tbridgeFunc.hpp:17
Definition: tbridgeFunc.hpp:72
Bridge builder for C++ classes.
Definition: tbridger.hpp:18
Optional value wrapper with byeol-style interface.
Definition: tmay.hpp:18
Template type wrapper for type metadata management.
Definition: ttype.hpp:16
Type trait to check if T is subclass of super.
Definition: rtti.hpp:48