로딩중...
검색중...
일치하는것 없음
tbridgeFunc.hpp
이 파일의 문서화 페이지로 가기
1
2#pragma once
3
4#include "core/ast/args.hpp"
6#include "core/ast/params.hpp"
9
10namespace by {
11
12 template <typename T, nbool isBaseObj> class tbridger;
13
18 template <typename Ret, typename T, template <typename, nbool> class Marshaling, typename... Args>
19 class tbaseBridgeFunc: public baseFunc {
21 protected:
22 typedef Ret (T::*fptrType)(Args...);
23
24 public:
25 tbaseBridgeFunc(fptrType fptr, str ret):
26 _fptr(fptr),
27 _type("bridgeFunc", ttype<me>::get(),
28 params(
29 *new param("", Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::onAddParam())...),
30 false, ret.get()),
31 _src(dumSrc::singleton()) {}
32
33 public:
34 static_assert(
36 sizeof(metaIf::yes))...>::value,
37 "can't marshal one of this func's parameter ntypes.");
38
39 public:
40 const ntype& getType() const override { return _type; }
41
42 const baseObj& getOrigin() const override {
43 static obj inner(tbridger<T, tifSub<typename tadaptiveSuper<T>::super, baseObj>::is>::subs());
44 return inner;
45 }
46
47 using super::eval;
48
49 str eval(const args& a) override {
50 tmay<args> evaluated = a.evalAll(getParams()) OR.ret(str());
51
52 return _runNative(*evaluated);
53 }
54
55 void onCloneDeep(const clonable& from) override {
56 me& rhs = (me&) from;
57 this->_type.onCloneDeep(rhs._type);
58 }
59
60 const src& getSrc() const override { return *_src; }
61
62 void setSrc(const src& new1) { _src.bind(new1); }
63
64 protected:
65 virtual str _runNative(args& args) = 0;
66
67 protected:
68 fptrType _fptr;
69 mutable funcType _type;
70 tstr<src> _src;
71 };
72
73 template <typename Ret, typename T, nbool isBaseObj, template <typename, nbool> class Marshaling, typename... Args>
74 class tbridgeFunc: public tbaseBridgeFunc<Ret, T, Marshaling, Args...> {
75 typedef tbaseBridgeFunc<Ret, T, Marshaling, Args...> _super_;
77
78 public:
79 tbridgeFunc(typename super::fptrType fptr):
80 super(fptr, Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::onGetRet()) {}
81
82 protected:
83 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
84
85 template <size_t... index> str _marshal(args& args, std::index_sequence<index...>);
86 };
87
88 template <typename T, template <typename, nbool> class Marshaling, typename... Args>
89 class tbridgeFunc<void, T, false, Marshaling, Args...>: public tbaseBridgeFunc<void, T, Marshaling, Args...> {
90 typedef tbaseBridgeFunc<void, T, Marshaling, Args...> _super_;
92
93 public:
94 tbridgeFunc(typename super::fptrType fptr): super(fptr, Marshaling<void, false>::onGetRet()) {}
95
96 protected:
97 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
98
99 template <size_t... index> str _marshal(args& args, std::index_sequence<index...>);
100 };
101
102 template <typename T, template <typename, nbool> class Marshaling, typename... Args>
103 class tbridgeFunc<void, T, true, Marshaling, Args...>: public tbaseBridgeFunc<void, T, Marshaling, Args...> {
104 typedef tbaseBridgeFunc<void, T, Marshaling, Args...> _super_;
106
107 public:
108 tbridgeFunc(typename super::fptrType fptr): super(fptr, Marshaling<void, false>::onGetRet()) {}
109
110 protected:
111 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
112
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 (me.*(this->_fptr))(
118 }
119 };
120
121 template <typename Ret, typename T, template <typename, nbool> class Marshaling, typename... Args>
122 class tbridgeFunc<Ret, T, true, Marshaling, Args...>: public tbaseBridgeFunc<Ret, T, Marshaling, Args...> {
123 typedef tbaseBridgeFunc<Ret, T, Marshaling, Args...> _super_;
125
126 public:
127 tbridgeFunc(typename _super_::fptrType fptr):
128 super(fptr, Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::onGetRet()) {}
129
130 protected:
131 str _runNative(args& args) override { return _marshal(args, std::index_sequence_for<Args...>()); }
132
133 template <size_t... index> str _marshal(args& a, std::index_sequence<index...>) {
134 T& me = (T*) a.getMe() OR.err("object from frame does not exists.").ret(str());
135 return Marshaling<Ret, tifSub<typename typeTrait<Ret>::Org, node>::is>::toMgd((me.*(this->_fptr)) // funcptr
136 (Marshaling<Args, tifSub<typename typeTrait<Args>::Org, node>::is>::toNative(
137 a[index])...)); // and args.ZZZ
138 }
139 };
140} // 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
script type for function objects in byeol language.
Definition funcType.hpp:11
void onCloneDeep(const clonable &from) override
Performs a deep clone operation for this script type instance.
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
Source location information
Definition src.hpp:15
Base bridge function template
Definition tbridgeFunc.hpp:19
Definition tbridgeFunc.hpp:74
C++ to byeol bridge builder
Definition tbridger.hpp:61
Definition tnarr.hpp:9
to Top