🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
ReflectAPI.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/StringView.hpp"
25#include "AstUtil/Dimension.hpp"
26#include <string>
27
28AST_NAMESPACE_BEGIN
29
35template<typename T>
37{
38 using output_type = T;
39 using input_type = T;
40};
41
42template<>
43struct property_trait<std::string>
44{
45 using output_type = std::string;
46 using input_type = StringView;
47};
48
49template<>
51{
52 using output_type = TimePoint;
53 using input_type = TimePoint;
54};
55
56
57
58typedef errc_t (*FPropertyGet)(const void* obj, void* value);
59typedef errc_t (*FPropertySet)(void* obj, void const* value);
60
61
62class Property;
63
68AST_UTIL_CAPI Property* _aNewPropertyBool(FPropertyGet getter, FPropertySet setter);
69
70
75AST_UTIL_CAPI Property* _aNewPropertyInt(FPropertyGet getter, FPropertySet setter);
76
77
83AST_UTIL_CAPI Property* _aNewPropertyDouble(FPropertyGet getter, FPropertySet setter);
84
85
91AST_UTIL_CAPI Property* _aNewPropertyString(FPropertyGet getter, FPropertySet setter);
92
93
100AST_UTIL_CAPI Property* _aNewPropertyQuantity(FPropertyGet getter, FPropertySet setter, Dimension dimension);
101
102
103
104template<typename T>
105A_ALWAYS_INLINE Property* _aNewProperty(FPropertyGet getter, FPropertySet setter);
106
107
108
114template<>
115A_ALWAYS_INLINE Property* _aNewProperty<bool>(FPropertyGet getter, FPropertySet setter)
116{
117 return _aNewPropertyBool(getter, setter);
118}
119
125template<>
126A_ALWAYS_INLINE Property* _aNewProperty<int>(FPropertyGet getter, FPropertySet setter)
127{
128 return _aNewPropertyInt(getter, setter);
129}
130
136template<>
137A_ALWAYS_INLINE Property* _aNewProperty<double>(FPropertyGet getter, FPropertySet setter)
138{
139 return _aNewPropertyDouble(getter, setter);
140}
141
142
148template<>
149A_ALWAYS_INLINE Property* _aNewProperty<std::string>(FPropertyGet getter, FPropertySet setter)
150{
151 return _aNewPropertyString(getter, setter);
152}
153
154
160template<typename T, bool T::* Member>
162{
163 return _aNewPropertyBool(
164 [](const void* obj, void* value) -> errc_t
165 {
166 *((bool*)value) = ((T*)obj)->*Member;
167 return 0;
168 },
169 [](void* obj, const void* value) -> errc_t
170 {
171 ((T*)obj)->*Member = *((bool*)value);
172 return 0;
173 }
174 );
175}
176
177
178
184template<typename T, bool T::* Member>
185A_ALWAYS_INLINE Property* aNewPropertyBool()
186{
187 return aNewPropertyBoolMem<T, Member>();
188}
189
190
191template<typename T, int T::* Member>
192A_ALWAYS_INLINE Property* aNewPropertyIntMem()
193{
194 return _aNewPropertyInt(
195 [](const void* obj, void* value) -> errc_t
196 {
197 *((int*)value) = ((T*)obj)->*Member;
198 return 0;
199 },
200 [](void* obj, const void* value) -> errc_t
201 {
202 ((T*)obj)->*Member = *((int*)value);
203 return 0;
204 }
205 );
206}
207
208
209
210template<typename T, int T::* Member>
211A_ALWAYS_INLINE Property* aNewPropertyInt()
212{
213 return aNewPropertyIntMem<T, Member>();
214}
215
216
217template<typename T, double T::* Member>
218A_ALWAYS_INLINE Property* aNewPropertyDoubleMem()
219{
220 return _aNewPropertyDouble(
221 [](const void* obj, void* value) -> errc_t
222 {
223 *((double*)value) = ((T*)obj)->*Member;
224 return 0;
225 },
226 [](void* obj, const void* value) -> errc_t
227 {
228 ((T*)obj)->*Member = *((double*)value);
229 return 0;
230 }
231 );
232}
233
234
235
241template<typename T, double T::* Member>
242A_ALWAYS_INLINE Property* aNewPropertyDouble()
243{
244 return aNewPropertyDoubleMem<T, Member>();
245}
246
247
248
249template<typename T, double T::* Member>
250A_ALWAYS_INLINE Property* aNewPropertyQuantityMem(Dimension dimension)
251{
252 return _aNewPropertyDouble(
253 [](const void* obj, void* value) -> errc_t
254 {
255 *((double*)value) = ((T*)obj)->*Member;
256 return 0;
257 },
258 [](void* obj, const void* value) -> errc_t
259 {
260 ((T*)obj)->*Member = *((double*)value);
261 return 0;
262 },
263 dimension
264 );
265}
266
267
268
274template<typename T, double T::* Member>
275A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dimension)
276{
277 return aNewPropertyQuantityMem<T, Member>(dimension);
278}
279
280template<typename T, std::string T::* Member>
281A_ALWAYS_INLINE Property* aNewPropertyStringMem()
282{
283 return _aNewPropertyString(
284 [](const void* obj, void* value) -> errc_t
285 {
286 *((std::string*)value) = ((T*)obj)->*Member;
287 return 0;
288 },
289 [](void* obj, const void* value) -> errc_t
290 {
291 ((T*)obj)->*Member = std::string(*((typename property_trait<std::string>::input_type*)value));
292 return 0;
293 }
294 );
295}
296
297
298template<typename T, std::string T::* Member>
299A_ALWAYS_INLINE Property* aNewPropertyString()
300{
301 return aNewPropertyStringMem<T, Member>();
302}
303
304
305
311template<typename T, bool(T::* Getter) () const>
312A_ALWAYS_INLINE Property* aNewPropertyBool()
313{
314 return _aNewPropertyBool(
315 [](const void* obj, void* value) -> errc_t
316 {
317 *((bool*)value) = (((T*)obj)->*Getter)();
318 return 0;
319 },
320 nullptr
321 );
322}
323
324
325template<typename T, int(T::* Getter) () const>
326A_ALWAYS_INLINE Property* aNewPropertyInt()
327{
328 return _aNewPropertyInt(
329 [](const void* obj, void* value) -> errc_t
330 {
331 *((int*)value) = (((T*)obj)->*Getter)();
332 return 0;
333 },
334 nullptr
335 );
336}
337
338
339
345template<typename T, double (T::* Getter) () const>
346A_ALWAYS_INLINE Property* aNewPropertyDouble()
347{
348 static_assert(Getter!=nullptr, "invalid getter");
349
350 return _aNewPropertyDouble(
351 [](const void* obj, void* value) -> errc_t
352 {
353 *((double*)value) = (((T*)obj)->*Getter)();
354 return 0;
355 },
356 nullptr
357 );
358}
359
360
366template<typename T, double (T::* Getter) () const>
367A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dimension)
368{
369 static_assert(Getter!=nullptr, "invalid getter");
370
372 [](const void* obj, void* value) -> errc_t
373 {
374 *((double*)value) = (((T*)obj)->*Getter)();
375 return 0;
376 },
377 nullptr,
378 dimension
379 );
380}
381
382
388template<typename T, std::string(T::*Getter)() const>
389A_ALWAYS_INLINE Property* aNewPropertyString()
390{
391 return _aNewPropertyString(
392 [](const void* obj, void* value) -> errc_t
393 {
394 *((std::string*)value) = (((T*)obj)->*Getter)();
395 return 0;
396 },
397 nullptr
398 );
399}
400
401
402template<typename T, bool (T::* Getter) () const, void (T::* Setter)(bool)>
403A_ALWAYS_INLINE Property* aNewPropertyBool()
404{
405 return _aNewPropertyBool(
406 [](const void* obj, void* value) -> errc_t
407 {
408 *((bool*)value) = (((T*)obj)->*Getter)();
409 return 0;
410 },
411 [](void* obj, const void* value) -> errc_t
412 {
413 static_assert(Setter!=nullptr, "invalid setter");
414 (((T*)obj)->*Setter)(*((bool*)value));
415 return 0;
416 }
417 );
418}
419
420
421
428template<typename T, int(T::* Getter) () const, void (T::* Setter)(int)>
429A_ALWAYS_INLINE Property* aNewPropertyInt()
430{
431 static_assert(Getter!=nullptr, "invalid getter");
432 static_assert(Setter!=nullptr, "invalid setter");
433
434 return _aNewPropertyInt(
435 [](const void* obj, void* value) -> errc_t
436 {
437 *((int*)value) = (((T*)obj)->*Getter)();
438 return 0;
439 },
440 [](void* obj, const void* value) -> errc_t
441 {
442 (((T*)obj)->*Setter)(*((int*)value));
443 return 0;
444 }
445 );
446}
447
448
455template<typename T, double (T::* Getter) () const, void (T::* Setter)(double)>
456A_ALWAYS_INLINE Property* aNewPropertyDouble()
457{
458 static_assert(Getter!=nullptr, "invalid getter");
459 static_assert(Setter!=nullptr, "invalid setter");
460
461 return _aNewPropertyDouble(
462 [](const void* obj, void* value) -> errc_t
463 {
464 *((double*)value) = (((T*)obj)->*Getter)();
465 return 0;
466 },
467 [](void* obj, const void* value) -> errc_t
468 {
469 (((T*)obj)->*Setter)(*((double*)value));
470 return 0;
471 }
472 );
473}
474
481template<typename T, double (T::* Getter) () const, void (T::* Setter)(double)>
482A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dimension)
483{
484 static_assert(Getter!=nullptr, "invalid getter");
485 static_assert(Setter!=nullptr, "invalid setter");
486
488 [](const void* obj, void* value) -> errc_t
489 {
490 *((double*)value) = (((T*)obj)->*Getter)();
491 return 0;
492 },
493 [](void* obj, const void* value) -> errc_t
494 {
495 (((T*)obj)->*Setter)(*((double*)value));
496 return 0;
497 },
498 dimension
499 );
500}
501
502
503template<typename T, const std::string& (T::* Getter) () const, void (T::* Setter)(StringView)>
504A_ALWAYS_INLINE Property* aNewPropertyString()
505{
506 static_assert(Getter!=nullptr, "invalid getter");
507 static_assert(Setter!=nullptr, "invalid setter");
508
509 return _aNewPropertyString(
510 [](const void* obj, void* value) -> errc_t
511 {
512 *((std::string*)value) = (((T*)obj)->*Getter)();
513 return 0;
514 },
515 [](void* obj, const void* value) -> errc_t
516 {
517 (((T*)obj)->*Setter)(*((typename property_trait<std::string>::input_type*)value));
518 return 0;
519 }
520 );
521}
522
523
524
531template<typename T, bool (T::* Getter) () const, errc_t (T::* Setter)(bool)>
532A_ALWAYS_INLINE Property* aNewPropertyBool()
533{
534 return _aNewPropertyBool(
535 [](const void* obj, void* value) -> errc_t
536 {
537 *((bool*)value) = (((T*)obj)->*Getter)();
538 return 0;
539 },
540 [](void* obj, const void* value) -> errc_t
541 {
542 static_assert(Setter!=nullptr, "invalid setter");
543 return (((T*)obj)->*Setter)(*((bool*)value));
544 }
545 );
546}
547
548
549
556template<typename T, int (T::* Getter) () const, errc_t (T::* Setter)(int)>
557A_ALWAYS_INLINE Property* aNewPropertyInt()
558{
559 static_assert(Getter!=nullptr, "invalid getter");
560 static_assert(Setter!=nullptr, "invalid setter");
561
562 return _aNewPropertyInt(
563 [](const void* obj, void* value) -> errc_t
564 {
565 *((int*)value) = (((T*)obj)->*Getter)();
566 return 0;
567 },
568 [](void* obj, const void* value) -> errc_t
569 {
570 return (((T*)obj)->*Setter)(*((int*)value));
571 }
572 );
573}
574
575
582template<typename T, double (T::* Getter) () const, errc_t (T::* Setter)(double)>
583A_ALWAYS_INLINE Property* aNewPropertyDouble()
584{
585 static_assert(Getter!=nullptr, "invalid getter");
586 static_assert(Setter!=nullptr, "invalid setter");
587
588 return _aNewPropertyDouble(
589 [](const void* obj, void* value) -> errc_t
590 {
591 *((double*)value) = (((T*)obj)->*Getter)();
592 return 0;
593 },
594 [](void* obj, const void* value) -> errc_t
595 {
596 return (((T*)obj)->*Setter)(*((double*)value));
597 }
598 );
599}
600
601
608template<typename T, double (T::* Getter) () const, errc_t (T::* Setter)(double)>
609A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dimension)
610{
611 static_assert(Getter!=nullptr, "invalid getter");
612 static_assert(Setter!=nullptr, "invalid setter");
613
615 [](const void* obj, void* value) -> errc_t
616 {
617 *((double*)value) = (((T*)obj)->*Getter)();
618 return 0;
619 },
620 [](void* obj, const void* value) -> errc_t
621 {
622 return (((T*)obj)->*Setter)(*((double*)value));
623 },
624 dimension
625 );
626}
627
634template<typename T, const std::string& (T::* Getter) () const, errc_t (T::* Setter)(StringView)>
635A_ALWAYS_INLINE Property* aNewPropertyString()
636{
637 static_assert(Getter!=nullptr, "invalid getter");
638 static_assert(Setter!=nullptr, "invalid setter");
639
640 return _aNewPropertyString(
641 [](const void* obj, void* value) -> errc_t
642 {
643 *((std::string*)value) = (((T*)obj)->*Getter)();
644 return 0;
645 },
646 [](void* obj, const void* value) -> errc_t
647 {
648 return (((T*)obj)->*Setter)(*((typename property_trait<std::string>::input_type*)value));
649 }
650 );
651}
652
655AST_NAMESPACE_END
量纲
定义 Dimension.hpp:354
反射属性类
定义 Property.hpp:58
绝对时间点
定义 TimePoint.hpp:106
Property * _aNewPropertyBool(FPropertyGet getter, FPropertySet setter)
创建一个布尔属性
定义 ReflectAPI.cpp:33
A_ALWAYS_INLINE Property * aNewPropertyQuantity(Dimension dimension)
创建一个数量值属性
定义 ReflectAPI.hpp:275
Property * _aNewPropertyString(FPropertyGet getter, FPropertySet setter)
创建一个字符串属性
定义 ReflectAPI.cpp:48
Property * _aNewPropertyQuantity(FPropertyGet getter, FPropertySet setter, Dimension dimension)
创建一个量纲属性
定义 ReflectAPI.cpp:53
A_ALWAYS_INLINE Property * aNewPropertyString()
创建一个字符串属性
定义 ReflectAPI.hpp:299
A_ALWAYS_INLINE Property * aNewPropertyDouble()
创建一个双精度属性
定义 ReflectAPI.hpp:242
A_ALWAYS_INLINE Property * aNewPropertyBool()
创建一个布尔属性
定义 ReflectAPI.hpp:185
Property * _aNewPropertyInt(FPropertyGet getter, FPropertySet setter)
创建一个整数属性
定义 ReflectAPI.cpp:38
Property * _aNewPropertyDouble(FPropertyGet getter, FPropertySet setter)
创建一个双精度属性
定义 ReflectAPI.cpp:43
A_ALWAYS_INLINE Property * aNewPropertyBoolMem()
创建一个布尔属性
定义 ReflectAPI.hpp:161
定义 ReflectAPI.hpp:37