10 template <
typename T, n
bool isBaseObj>
class tbridger;
15 template <
typename Ret,
typename T,
template <
typename, n
bool>
class Marshaling,
typename... Args>
19 allTrues<(
sizeof(Marshaling<Args, tifSub<Args, node>::is>::canMarshal()) ==
sizeof(metaIf::yes))...>::value,
20 "can't marshal one of this func's parameter ntypes.");
28 const ntype& getType()
const override {
31 Marshaling<Ret,
tifSub<
typename typeTrait<Ret>::Org,
node>::is>::onGetRet());
35 const baseObj& getOrigin()
const override {
40 str run(
const args& a)
override {
42 args& evaluated = _evalArgs(a, tray) OR.err(
"evaluated == null").ret(
str());
44 return _marshal(evaluated, std::index_sequence_for<Args...>());
48 template <
size_t... index>
str _marshal(
args& a, std::index_sequence<index...>) {
49 T& me = (T*) a.getMe() OR.err(
"object from frame does not exists.").ret(
str());
51 return Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org,
node>::is>::toMgd(
52 _closure(me, Marshaling<Args,
tifSub<
typename typeTrait<Args>::Org,
node>::is>::toNative(a[index])...));
57 WHEN(a.len() != ps.len())
58 .err(
"length of a(%d) and typs(%d) doesn't match.", a.len(), ps.len()).ret(
nullptr);
61 for(
const node& e: a) {
62 str ased = e.as(ps[n++].getOrigin()) OR.ret(
nullptr);
65 tray.
setMe(a.getMe());
70 std::function<Ret(T&, Args...)> _closure;
76 template <
typename T,
template <
typename, n
bool>
class Marshaling,
typename... Args>
80 allTrues<(
sizeof(Marshaling<Args, tifSub<typename typeTrait<Args>::Org,
node>::is>::canMarshal()) ==
81 sizeof(metaIf::yes))...>::value,
82 "can't marshal one of this func's parameter ntypes.");
88 const ntype& getType()
const override {
91 *
new param(
"", Marshaling<Args,
tifSub<
typename typeTrait<Args>::Org,
node>::is>::onAddParam())...),
92 false, Marshaling<void, false>::onGetRet());
96 const baseObj& getOrigin()
const override {
103 str run(
const args& a)
override {
105 args& evaluated = _evalArgs(a, tray) OR.err(
"evaluated == null").ret(
str());
107 return _marshal(evaluated, std::index_sequence_for<Args...>());
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());
114 _closure(me, Marshaling<Args,
tifSub<
typename typeTrait<Args>::Org,
node>::is>::toNative(a[index])...);
115 return Marshaling<void, tifSub<void, node>::is>::toMgd();
120 WHEN(a.len() != ps.len())
121 .err(
"length of a(%d) and typs(%d) doesn't match.", a.len(), ps.len()).ret(
nullptr);
124 for(
const node& e: a) {
125 str ased = e.as(ps[n++].getOrigin()) OR.ret(
nullptr);
128 tray.
setMe(a.getMe());
133 std::function<void(T&, Args...)> _closure;
Base class for all types without explicit super class.
Definition: adam.hpp:11
Function call arguments container.
Definition: args.hpp:13
const me & setMe(const node &me) const
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
func closure with captured object scope
Definition: closure.hpp:19
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
Bridge closure for C++ lambda/function objects.
Definition: tbridgeClosure.hpp:16
Bridge builder for C++ classes.
Definition: tbridger.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