로딩중...
검색중...
일치하는것 없음
tbridgeClosure.hpp
이 파일의 문서화 페이지로 가기
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
16 template <typename Ret, typename T, template <typename, nbool> class Marshaling, typename... Args>
17 class tbridgeClosure: public baseFunc {
19 static_assert(
20 allTrues<(sizeof(Marshaling<Args, tifSub<Args, node>::is>::canMarshal()) == sizeof(metaIf::yes))...>::value,
21 "can't marshal one of this func's parameter ntypes.");
22
23 public:
24 tbridgeClosure(std::function<Ret(T&, Args...)> closure): _closure(closure) {}
25
26 public:
27 using super::eval;
28
29 const ntype& getType() const override {
30 static mgdType inner("ctor", ttype<me>::get(),
31 params(*new param("", Marshaling<Args, tifSub<Args, node>::is>::onAddParam())...), false,
32 Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::onGetRet());
33 return inner;
34 }
35
36 const baseObj& getOrigin() const override {
37 static obj inner(tbridger<T, tifSub<typename tadaptiveSuper<T>::super, baseObj>::is>::subs());
38 return inner;
39 }
40
41 str eval(const args& a) override {
42 args tray;
43 args& evaluated = _evalArgs(a, tray) OR.err("evaluated == null").ret(str());
44
45 return _marshal(evaluated, std::index_sequence_for<Args...>());
46 }
47
48 private:
49 template <size_t... index> str _marshal(args& a, std::index_sequence<index...>) {
50 T& me = (T*) a.getMe() OR.err("object from frame does not exists.").ret(str());
51
53 _closure(me, Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::toNative(a[index])...));
54 }
55
56 args* _evalArgs(const args& a, args& tray) {
57 const params& ps = getParams();
58 WHEN(a.len() != ps.len())
59 .err("length of a(%d) and typs(%d) doesn't match.", a.len(), ps.len()).ret(nullptr);
60
61 int n = 0;
62 for(const node& e: a) {
63 str ased = e.as(ps[n++].getOrigin()) OR.ret(nullptr);
64 tray.add(*ased);
65 }
66 tray.setMe(a.getMe());
67 return &tray;
68 }
69
70 private:
71 std::function<Ret(T&, Args...)> _closure;
72 };
73
78 template <typename T, template <typename, nbool> class Marshaling, typename... Args>
79 class tbridgeClosure<void, T, Marshaling, Args...>: public baseFunc {
81 static_assert(
83 sizeof(metaIf::yes))...>::value,
84 "can't marshal one of this func's parameter ntypes.");
85
86 public:
87 tbridgeClosure(std::function<void(T&, Args...)> closure): _closure(closure) {}
88
89 public:
90 const ntype& getType() const override {
91 static mgdType inner("ctor", ttype<me>::get(),
92 params(
93 *new param("", Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::onAddParam())...),
95 return inner;
96 }
97
98 const baseObj& getOrigin() const override {
99 static obj inner(tbridger<T, tifSub<typename tadaptiveSuper<T>::super, baseObj>::is>::subs());
100 return inner;
101 }
102
103 using super::eval;
104
105 str eval(const args& a) override {
106 args tray;
107 args& evaluated = _evalArgs(a, tray) OR.err("evaluated == null").ret(str());
108
109 return _marshal(evaluated, std::index_sequence_for<Args...>());
110 }
111
112 private:
113 template <size_t... index> str _marshal(args& a, std::index_sequence<index...>) {
114 T& me = (T*) a.getMe() OR.err("object from frame does not exists.").ret(str());
115
116 _closure(me, Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::toNative(a[index])...);
118 }
119
120 args* _evalArgs(const args& a, args& tray) {
121 const params& ps = getParams();
122 WHEN(a.len() != ps.len())
123 .err("length of a(%d) and typs(%d) doesn't match.", a.len(), ps.len()).ret(nullptr);
124
125 int n = 0;
126 for(const node& e: a) {
127 str ased = e.as(ps[n++].getOrigin()) OR.ret(nullptr);
128 tray.add(*ased);
129 }
130 tray.setMe(a.getMe());
131 return &tray;
132 }
133
134 private:
135 std::function<void(T&, Args...)> _closure;
136 };
137} // namespace by
Function or object evaluation arguments
Definition args.hpp:22
Base class for all function types
Definition baseFunc.hpp:41
virtual params & getParams()
Base class for representing byeol objects
Definition baseObj.hpp:73
func closure with captured object scope
Definition closure.hpp:20
Script type for byeol objects
Definition mgdType.hpp:18
Base class for all AST nodes in the byeol language
Definition node.hpp:195
represents native c++ type system for byeol language
Definition ntype.hpp:33
Byeol runtime environment object
Definition obj.hpp:62
Function parameter
Definition param.hpp:14
Function parameter list container
Definition params.hpp:16
Bridge closure for C++ lambda/function objects
Definition tbridgeClosure.hpp:17
C++ to byeol bridge builder
Definition tbridger.hpp:61
Definition tnarr.hpp:9
to Top