tbridgeClosure.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"
7
8namespace by {
9
10 template <typename T, nbool isBaseObj> class tbridger;
11
15 template <typename Ret, typename T, template <typename, nbool> class Marshaling, typename... Args>
16 class tbridgeClosure: public baseFunc {
18 static_assert(
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.");
21
22 public:
23 tbridgeClosure(std::function<Ret(T&, Args...)> closure): _closure(closure) {}
24
25 public:
26 using super::run;
27
28 const ntype& getType() const override {
29 static mgdType inner("ctor", ttype<me>::get(),
30 params(*new param("", Marshaling<Args, tifSub<Args, node>::is>::onAddParam())...), false,
31 Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::onGetRet());
32 return inner;
33 }
34
35 const baseObj& getOrigin() const override {
36 static obj inner(tbridger<T, tifSub<typename tadaptiveSuper<T>::super, baseObj>::is>::subs());
37 return inner;
38 }
39
40 str run(const args& a) override {
41 args tray;
42 args& evaluated = _evalArgs(a, tray) OR.err("evaluated == null").ret(str());
43
44 return _marshal(evaluated, std::index_sequence_for<Args...>());
45 }
46
47 private:
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());
50
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])...));
53 }
54
55 args* _evalArgs(const args& a, args& tray) {
56 const params& ps = getParams();
57 WHEN(a.len() != ps.len())
58 .err("length of a(%d) and typs(%d) doesn't match.", a.len(), ps.len()).ret(nullptr);
59
60 int n = 0;
61 for(const node& e: a) {
62 str ased = e.as(ps[n++].getOrigin()) OR.ret(nullptr);
63 tray.add(*ased);
64 }
65 tray.setMe(a.getMe());
66 return &tray;
67 }
68
69 private:
70 std::function<Ret(T&, Args...)> _closure;
71 };
72
76 template <typename T, template <typename, nbool> class Marshaling, typename... Args>
77 class tbridgeClosure<void, T, Marshaling, Args...>: public baseFunc {
79 static_assert(
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.");
83
84 public:
85 tbridgeClosure(std::function<void(T&, Args...)> closure): _closure(closure) {}
86
87 public:
88 const ntype& getType() const override {
89 static mgdType inner("ctor", ttype<me>::get(),
90 params(
91 *new param("", Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::onAddParam())...),
92 false, Marshaling<void, false>::onGetRet());
93 return inner;
94 }
95
96 const baseObj& getOrigin() const override {
97 static obj inner(tbridger<T, tifSub<typename tadaptiveSuper<T>::super, baseObj>::is>::subs());
98 return inner;
99 }
100
101 using super::run;
102
103 str run(const args& a) override {
104 args tray;
105 args& evaluated = _evalArgs(a, tray) OR.err("evaluated == null").ret(str());
106
107 return _marshal(evaluated, std::index_sequence_for<Args...>());
108 }
109
110 private:
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
114 _closure(me, Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::toNative(a[index])...);
115 return Marshaling<void, tifSub<void, node>::is>::toMgd();
116 }
117
118 args* _evalArgs(const args& a, args& tray) {
119 const params& ps = getParams();
120 WHEN(a.len() != ps.len())
121 .err("length of a(%d) and typs(%d) doesn't match.", a.len(), ps.len()).ret(nullptr);
122
123 int n = 0;
124 for(const node& e: a) {
125 str ased = e.as(ps[n++].getOrigin()) OR.ret(nullptr);
126 tray.add(*ased);
127 }
128 tray.setMe(a.getMe());
129 return &tray;
130 }
131
132 private:
133 std::function<void(T&, Args...)> _closure;
134 };
135} // namespace by
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