tbridger.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include "core/ast/obj.hpp"
12
13namespace by {
14
18 template <typename T, nbool isBaseObj = tifSub<typename tadaptiveSuper<T>::super, baseObj>::is> class tbridger {
19 BY(ME(tbridger))
20 template <typename Ret, typename T1, nbool, template <typename, nbool> class Marshaling, typename... Args>
21 friend class tbridgeFunc;
22 template <typename T1> friend class tbridge;
23
24 private:
25 tbridger() = default;
26
27 public:
28 static scope& subs() { return _get()._subs; }
29
30 static me& extend(const scope& src) {
31 subs().link(src);
32 return _get();
33 }
34
35 static me& func(const std::string& name, const baseFunc& bridgeFunc) {
36 _get().subs().add(name, bridgeFunc);
37 return _get();
38 }
39
40 static me& func(const std::string* name, const baseFunc& bridgeFunc)
41 BY_SIDE_FUNC(name, func(*name, bridgeFunc), _get());
42 static me& func(const std::string& name, const baseFunc* bridgeFunc)
43 BY_SIDE_FUNC(bridgeFunc, func(name, *bridgeFunc), _get());
44 static me& func(const std::string* name, const baseFunc* bridgeFunc)
45 BY_SIDE_FUNC(name&& bridgeFunc, func(*name, *bridgeFunc), _get());
46
47 template <typename... Args> static me& ctor() {
48 return func(baseObj::CTOR_NAME, new tbridgeCtor<T, Args...>());
49 }
50
51 template <typename Ret, typename... Args> static me& func(const std::string& name, Ret (T::*fptr)(Args...)) {
52 return funcNonConst(name, fptr);
53 }
54
55 template <typename Ret, typename... Args>
56 static me& func(const std::string* name, Ret (T::*fptr)(Args...)) BY_SIDE_FUNC(name, func(*name, fptr), _get());
57
58 template <typename Ret, typename... Args>
59 static me& func(const std::string& name, Ret (T::*fptr)(Args...) const) {
60 return funcConst(name, fptr);
61 }
62
63 template <typename Ret, typename... Args>
64 static me& func(const std::string* name, Ret (T::*fptr)(Args...) const)
65 BY_SIDE_FUNC(name, func(*name, fptr), _get());
66
67 template <typename Ret, typename... Args>
68 static me& funcNonConst(const std::string& name, Ret (T::*fptr)(Args...)) {
70 }
71
72 template <typename Ret, typename... Args>
73 static me& funcNonConst(const std::string* name, Ret (T::*fptr)(Args...))
74 BY_SIDE_FUNC(name, funcNonConst(*name, fptr), _get());
75
76 template <typename Ret, typename... Args>
77 static me& funcConst(const std::string& name, Ret (T::*fptr)(Args...) const) {
78 return func(name, new tbridgeFunc<Ret, T, isBaseObj, tmarshaling, Args...>((Ret(T::*)(Args...)) fptr));
79 }
80
81 template <typename Ret, typename... Args>
82 static me& funcConst(const std::string* name, Ret (T::*fptr)(Args...) const)
83 BY_SIDE_FUNC(name, funcConst(*name, fptr), _get());
84
85 template <typename Ret, typename... Args>
86 static me& genericFunc(const std::string& name, Ret (T::*fptr)(Args...)) {
88 }
89
90 template <typename Ret, typename... Args>
91 static me& genericFunc(const std::string* name, Ret (T::*fptr)(Args...))
92 BY_SIDE_FUNC(name, genericFunc(*name, fptr), _get());
93
94 template <typename Ret, typename... Args>
95 static me& genericFunc(const std::string& name, Ret (T::*fptr)(Args...) const) {
96 return func(name,
98 }
99
100 template <typename Ret, typename... Args>
101 static me& genericFunc(const std::string* name, Ret (T::*fptr)(Args...) const)
102 BY_SIDE_FUNC(name, genericFunc(*name, fptr), _get());
103
104 template <typename Ret, typename... Args>
105 static me& genericFuncNonConst(const std::string& name, Ret (T::*fptr)(Args...)) {
106 return func(name,
108 }
109
110 template <typename Ret, typename... Args>
111 static me& genericFuncNonConst(const std::string* name, Ret (T::*fptr)(Args...))
112 BY_SIDE_FUNC(name, genericFuncNonConst(*name, fptr), _get());
113
114 template <typename Ret, typename... Args>
115 static me& genericFuncConst(const std::string& name, Ret (T::*fptr)(Args...) const) {
116 return func(name,
118 }
119
120 template <typename Ret, typename... Args>
121 static me& genericFuncConst(const std::string* name, Ret (T::*fptr)(Args...) const)
122 BY_SIDE_FUNC(name, genericFuncConst(*name, fptr), _get());
123
124 template <typename Ret, typename T1 = T, typename... Args>
125 static me& closure(const std::string& name, std::function<Ret(T1&, Args...)> c) {
127 }
128
129 template <typename Ret, typename T1 = T, typename... Args>
130 static me& closure(const std::string* name, std::function<Ret(T1&, Args...)> c)
131 BY_SIDE_FUNC(name, closure(*name, c), _get());
132
133 template <typename Ret, typename T1 = T>
134 static me& closure(const std::string& name, std::function<Ret(T1&)> c) {
135 return func(name, new tbridgeClosure<Ret, T1, tmarshaling>(c));
136 }
137
138 template <typename Ret, typename T1 = T>
139 static me& closure(const std::string* name, std::function<Ret(T1&)> c)
140 BY_SIDE_FUNC(name, closure(*name, c), _get());
141
142 static tbridge<T>* make(T* real) { return new tbridge(real); }
143
144 private:
145 static me& _get() {
146 static me _inner;
147 return _inner;
148 }
149
150 private:
151 scope _subs;
152 };
153
154 template <typename T> class tbridger<T, true> {
155 BY(ME(tbridger))
156
157 private:
158 tbridger() = default;
159
160 public:
161 static scope& subs() { return _get()._subs; }
162
163 static me& extend(const scope& src) {
164 subs().link(src);
165 return _get();
166 }
167
168 static me& func(const std::string& name, const baseFunc& bridgeFunc) {
169 _get().subs().add(name, bridgeFunc);
170 return _get();
171 }
172
173 static me& func(const std::string& name, const baseFunc* bridgeFunc) { return func(name, *bridgeFunc); }
174
175 static me& ctor() { return func(baseObj::CTOR_NAME, new tbridgeCtor<T>()); }
176
177 template <typename... Args> static me& ctor() {
178 return func(baseObj::CTOR_NAME, new tbridgeCtor<T, Args...>());
179 }
180
181 /*template <typename T1, typename... Args> static me& ctorIndirect() {
182 return func(baseObj::CTOR_NAME, new tbridgeCtor<T1, Args...>());
183 }*/
184
185 template <typename Ret, typename T1 = T, typename... Args>
186 static me& closure(const std::string& name, std::function<Ret(T1&, Args...)> c) {
188 }
189
190 template <typename Ret, typename T1 = T>
191 static me& closure(const std::string& name, std::function<Ret(T1&)> c) {
192 return func(name, new tbridgeClosure<Ret, T1, tmarshaling>(c));
193 }
194
195 template <typename Ret, typename... Args> static me& func(const std::string& name, Ret (T::*fptr)(Args...)) {
196 return funcNonConst(name, fptr);
197 }
198
199 template <typename Ret, typename... Args>
200 static me& func(const std::string& name, Ret (T::*fptr)(Args...) const) {
201 return funcConst(name, fptr);
202 }
203
204 template <typename Ret, typename... Args>
205 static me& funcNonConst(const std::string& name, Ret (T::*fptr)(Args...)) {
207 }
208
209 template <typename Ret, typename... Args>
210 static me& funcConst(const std::string& name, Ret (T::*fptr)(Args...) const) {
211 typedef typename T::super s;
212 auto* fun = new tbridgeFunc<Ret, T, true, tmarshaling, Args...>((Ret(T::*)(Args...)) fptr);
213 fun->setSrc(*new src(dumSrcFile::singleton(), name, point{0, 0}));
214 return func(name, fun);
215 }
216
217 template <typename Ret, typename... Args>
218 static me& genericFunc(const std::string& name, Ret (T::*fptr)(Args...)) {
219 auto* fun = new tbridgeFunc<Ret, T, true, tgenericMarshaling, Args...>(fptr);
220 fun->setSrc(*new src(dumSrcFile::singleton(), name, point{0, 0}));
221 return func(name, fun);
222 }
223
224 template <typename Ret, typename... Args>
225 static me& genericFuncNonConst(const std::string& name, Ret (T::*fptr)(Args...)) {
226 auto* fun = new tbridgeFunc<Ret, T, true, tgenericMarshaling, Args...>((Ret(T::*)(Args...)) fptr);
227 fun->setSrc(*new src(dumSrcFile::singleton(), name, point{0, 0}));
228 return func(name, fun);
229 }
230
231 template <typename Ret, typename... Args>
232 static me& genericFunc(const std::string& name, Ret (T::*fptr)(Args...) const) {
233 auto* fun = new tbridgeFunc<Ret, T, true, tgenericMarshaling, Args...>((Ret(T::*)(Args...)) fptr);
234 fun->setSrc(*new src(dumSrcFile::singleton(), name, point{0, 0}));
235 return func(name, fun);
236 }
237
238 template <typename Ret, typename... Args>
239 static me& genericFuncConst(const std::string& name, Ret (T::*fptr)(Args...) const) {
240 auto* fun = new tbridgeFunc<Ret, T, true, tgenericMarshaling, Args...>((Ret(T::*)(Args...)) fptr);
241 fun->setSrc(*new src(dumSrcFile::singleton(), name, point{0, 0}));
242 return func(name, fun);
243 }
244
245 private:
246 static me& _get() {
247 static me _inner;
248 return _inner;
249 }
250
251 private:
252 scope _subs;
253 };
254} // namespace by
Base class for all function types.
Definition: baseFunc.hpp:18
Base class for all objects in byeol language.
Definition: baseObj.hpp:24
func closure with captured object scope
Definition: closure.hpp:19
Constructor function for byeol objects.
Definition: ctor.hpp:11
Function definition in byeol language.
Definition: func.hpp:20
Source location information.
Definition: src.hpp:11
Bridge closure for C++ lambda/function objects.
Definition: tbridgeClosure.hpp:16
Bridge constructor for C++ objects.
Definition: tbridgeCtor.hpp:15
Definition: tbridgeFunc.hpp:72
Bridge template for C++ objects.
Definition: tbridge.hpp:17
Bridge builder for C++ classes.
Definition: tbridger.hpp:18
virtual nbool link(const iter &portion)
link to another chain instance. if iterator is not the begin of another chain, this chain won't link ...
Source code position tracking structure.
Definition: point.hpp:11
Definition: tgenericMarshaling.hpp:10
Template marshaling interface for C++ bridge.
Definition: tmarshaling.hpp:18