🛰️航天仿真算法库 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#include <type_traits>
28
29AST_NAMESPACE_BEGIN
30
36using FPropertyGet = errc_t (*)(const void* obj, void* value);
37using FPropertySet = errc_t (*)(void* obj, const void* value);
38using FPropertyGetItemByString = errc_t (*)(const void* obj, StringView key, Object*& value);
39using FPropertyGetItemByIndex = errc_t (*)(const void* obj, size_t key, Object*& value);
40
41
42
43// ----------------------------------------------------------------------------
44// 底层工厂函数
45// ----------------------------------------------------------------------------
46AST_UTIL_CAPI Property* _aNewPropertyBool(FPropertyGet getter, FPropertySet setter);
47AST_UTIL_CAPI Property* _aNewPropertyInt(FPropertyGet getter, FPropertySet setter);
48AST_UTIL_CAPI Property* _aNewPropertyDouble(FPropertyGet getter, FPropertySet setter);
49AST_UTIL_CAPI Property* _aNewPropertyString(FPropertyGet getter, FPropertySet setter);
50AST_UTIL_CAPI Property* _aNewPropertyQuantity(FPropertyGet getter, FPropertySet setter, Dimension dimension);
51AST_UTIL_CAPI Property* _aNewPropertyObject(FPropertyGet getter, FPropertySet setter, Class* cls);
52
53
54
55// ============================================================================
56// 基础类型特征与函数指针
57// ============================================================================
58
59template<typename T>
61{
62 using output_type = T;
63 using input_type = T;
64};
65
66template<>
67struct property_trait<std::string>
68{
69 using output_type = std::string;
70 using input_type = StringView;
71};
72
73template<>
75{
76 using output_type = TimePoint;
77 using input_type = TimePoint;
78};
79
80#ifndef SWIG
81
82// ----------------------------------------------------------------------------
83// 类型到工厂函数的分发
84// ----------------------------------------------------------------------------
85template<typename T> Property* _aNewProperty(FPropertyGet getter, FPropertySet setter);
86
87template<>
88inline Property* _aNewProperty<bool>(FPropertyGet getter, FPropertySet setter)
89{
90 return _aNewPropertyBool(getter, setter);
91}
92
93template<>
94inline Property* _aNewProperty<int>(FPropertyGet getter, FPropertySet setter)
95{
96 return _aNewPropertyInt(getter, setter);
97}
98
99template<>
100inline Property* _aNewProperty<double>(FPropertyGet getter, FPropertySet setter)
101{
102 return _aNewPropertyDouble(getter, setter);
103}
104
105template<>
106inline Property* _aNewProperty<std::string>(FPropertyGet getter, FPropertySet setter)
107{
108 return _aNewPropertyString(getter, setter);
109}
110
111// ============================================================================
112// 内部辅助模板:生成 Getter/Setter Lambda
113// ============================================================================
114namespace detail
115{
116 // 访问模式标签
117 struct MemberPtrTag {}; // 成员指针
118 struct GetterOnlyTag {}; // 只读 getter
119 struct GetterVoidSetterTag {}; // getter + void setter
120 struct GetterErrorSetterTag {}; // getter + errc_t setter
121
122 // 基础 Builder:由标签派发到具体实现
123 template<typename T, typename ValueType, typename Tag>
125
126 // ---------- 1. 成员指针访问 ----------
127 template<typename T, typename ValueType>
128 struct PropertyBuilder<T, ValueType, MemberPtrTag>
129 {
130 template<ValueType T::*Member>
131 static FPropertyGet makeGetter()
132 {
133 return [](const void* obj, void* value) -> errc_t
134 {
135 *static_cast<ValueType*>(value) = static_cast<const T*>(obj)->*Member;
136 return 0;
137 };
138 }
139
140 template<ValueType T::*Member>
141 static FPropertySet makeSetter()
142 {
143 return [](void* obj, const void* value) -> errc_t
144 {
145 using InputType = typename property_trait<ValueType>::input_type;
146 static_cast<T*>(obj)->*Member = ValueType(*static_cast<const InputType*>(value));
147 return 0;
148 };
149 }
150 };
151
152 // ---------- 2. 只读 getter ----------
153 template<typename T, typename ValueType>
154 struct PropertyBuilder<T, ValueType, GetterOnlyTag>
155 {
156 template<ValueType (T::*Getter)() const>
157 static FPropertyGet makeGetter()
158 {
159 return [](const void* obj, void* value) -> errc_t
160 {
161 *static_cast<ValueType*>(value) = (static_cast<const T*>(obj)->*Getter)();
162 return 0;
163 };
164 }
165
166 static FPropertySet makeSetter() { return nullptr; }
167 };
168
169 // ---------- 3. getter + void setter ----------
170 template<typename T, typename ValueType>
172 {
173 template<ValueType (T::*Getter)() const>
174 static FPropertyGet makeGetter()
175 {
176 return [](const void* obj, void* value) -> errc_t
177 {
178 *static_cast<ValueType*>(value) = (static_cast<const T*>(obj)->*Getter)();
179 return 0;
180 };
181 }
182
183 template<void (T::*Setter)(ValueType)>
184 static FPropertySet makeSetter()
185 {
186 return [](void* obj, const void* value) -> errc_t
187 {
188 (static_cast<T*>(obj)->*Setter)(*static_cast<const ValueType*>(value));
189 return 0;
190 };
191 }
192 };
193
194 // ---------- 4. getter + errc_t setter ----------
195 template<typename T, typename ValueType>
197 {
198 template<ValueType (T::*Getter)() const>
199 static FPropertyGet makeGetter()
200 {
201 return [](const void* obj, void* value) -> errc_t
202 {
203 *static_cast<ValueType*>(value) = (static_cast<const T*>(obj)->*Getter)();
204 return 0;
205 };
206 }
207
208 template<errc_t (T::*Setter)(ValueType)>
209 static FPropertySet makeSetter()
210 {
211 return [](void* obj, const void* value) -> errc_t
212 {
213 return (static_cast<T*>(obj)->*Setter)(*static_cast<const ValueType*>(value));
214 };
215 }
216 };
217
218 // ---------- std::string 特殊处理:setter 输入类型为 StringView ----------
219 template<typename T>
220 struct PropertyBuilder<T, std::string, GetterVoidSetterTag>
221 {
222 template<const std::string& (T::*Getter)() const>
223 static FPropertyGet makeGetter()
224 {
225 return [](const void* obj, void* value) -> errc_t
226 {
227 *static_cast<std::string*>(value) = (static_cast<const T*>(obj)->*Getter)();
228 return 0;
229 };
230 }
231
232 template<void (T::*Setter)(StringView)>
233 static FPropertySet makeSetter()
234 {
235 return [](void* obj, const void* value) -> errc_t
236 {
237 (static_cast<T*>(obj)->*Setter)(*static_cast<const StringView*>(value));
238 return 0;
239 };
240 }
241 };
242
243 template<typename T>
244 struct PropertyBuilder<T, std::string, GetterErrorSetterTag>
245 {
246 template<const std::string& (T::*Getter)() const>
247 static FPropertyGet makeGetter()
248 {
249 return [](const void* obj, void* value) -> errc_t
250 {
251 *static_cast<std::string*>(value) = (static_cast<const T*>(obj)->*Getter)();
252 return 0;
253 };
254 }
255
256 template<errc_t (T::*Setter)(StringView)>
257 static FPropertySet makeSetter()
258 {
259 return [](void* obj, const void* value) -> errc_t
260 {
261 return (static_cast<T*>(obj)->*Setter)(*static_cast<const StringView*>(value));
262 };
263 }
264 };
265
266 // ---------- std::string 值返回版本的辅助函数 ----------
267 template<typename T>
269 {
270 template<std::string (T::*Getter)() const>
271 static FPropertyGet makeGetter()
272 {
273 return [](const void* obj, void* value) -> errc_t
274 {
275 *static_cast<std::string*>(value) = (static_cast<const T*>(obj)->*Getter)();
276 return 0;
277 };
278 }
279
280 template<void (T::*Setter)(StringView)>
281 static FPropertySet makeVoidSetter()
282 {
283 return [](void* obj, const void* value) -> errc_t
284 {
285 (static_cast<T*>(obj)->*Setter)(*static_cast<const StringView*>(value));
286 return 0;
287 };
288 }
289
290 template<errc_t (T::*Setter)(StringView)>
291 static FPropertySet makeErrorSetter()
292 {
293 return [](void* obj, const void* value) -> errc_t
294 {
295 return (static_cast<T*>(obj)->*Setter)(*static_cast<const StringView*>(value));
296 };
297 }
298 };
299
300} // namespace detail
301
302// ============================================================================
303// 统一的公共 API
304// ============================================================================
305
306// ----------------------------------------------------------------------------
307// 1. 成员指针版本
308// ----------------------------------------------------------------------------
309template<typename T, typename MemberType, MemberType T::*Member>
310A_ALWAYS_INLINE Property* aNewPropertyMem()
311{
312 using ValueType = typename std::decay<MemberType>::type;
314 return _aNewProperty<ValueType>(
315 Builder::template makeGetter<Member>(),
316 Builder::template makeSetter<Member>()
317 );
318}
319
320// ----------------------------------------------------------------------------
321// 2. 只读 getter 版本
322// ----------------------------------------------------------------------------
323template<typename T, typename Ret, Ret (T::*Getter)() const>
324A_ALWAYS_INLINE Property* aNewPropertyReadOnly()
325{
326 using ValueType = typename std::decay<Ret>::type;
327 using Builder = detail::PropertyBuilder<T, ValueType, detail::GetterOnlyTag>;
328 return _aNewProperty<ValueType>(
329 Builder::template makeGetter<Getter>(),
330 nullptr
331 );
332}
333
334// ----------------------------------------------------------------------------
335// 3. getter + void setter 版本
336// ----------------------------------------------------------------------------
337template<typename T,
338 typename Ret,
339 Ret (T::*Getter)() const,
340 void (T::*Setter)(Ret)>
341A_ALWAYS_INLINE Property* aNewProperty()
342{
343 using ValueType = typename std::decay<Ret>::type;
344 using Builder = detail::PropertyBuilder<T, ValueType, detail::GetterVoidSetterTag>;
345 return _aNewProperty<ValueType>(
346 Builder::template makeGetter<Getter>(),
347 Builder::template makeSetter<Setter>()
348 );
349}
350
351// ----------------------------------------------------------------------------
352// 4. getter + errc_t setter 版本
353// ----------------------------------------------------------------------------
354template<typename T,
355 typename Ret,
356 Ret (T::*Getter)() const,
357 errc_t (T::*Setter)(Ret)>
358A_ALWAYS_INLINE Property* aNewPropertyWithError()
359{
360 using ValueType = typename std::decay<Ret>::type;
361 using Builder = detail::PropertyBuilder<T, ValueType, detail::GetterErrorSetterTag>;
362 return _aNewProperty<ValueType>(
363 Builder::template makeGetter<Getter>(),
364 Builder::template makeSetter<Setter>()
365 );
366}
367
368
369// 成员指针版本
370template<typename T, double T::*Member>
371A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim)
372{
373 using Builder = detail::PropertyBuilder<T, double, detail::MemberPtrTag>;
374 return _aNewPropertyQuantity(
375 Builder::template makeGetter<Member>(),
376 Builder::template makeSetter<Member>(),
377 dim
378 );
379}
380
381// 只读 getter 版本
382template<typename T, double (T::*Getter)() const>
383A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim)
384{
385 using Builder = detail::PropertyBuilder<T, double, detail::GetterOnlyTag>;
386 return _aNewPropertyQuantity(
387 Builder::template makeGetter<Getter>(),
388 nullptr,
389 dim
390 );
391}
392
393// getter + void setter 版本
394template<typename T,
395 double (T::*Getter)() const,
396 void (T::*Setter)(double)>
397A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim)
398{
399 using Builder = detail::PropertyBuilder<T, double, detail::GetterVoidSetterTag>;
400 return _aNewPropertyQuantity(
401 Builder::template makeGetter<Getter>(),
402 Builder::template makeSetter<Setter>(),
403 dim
404 );
405}
406
407// getter + errc_t setter 版本
408template<typename T,
409 double (T::*Getter)() const,
410 errc_t (T::*Setter)(double)>
411A_ALWAYS_INLINE Property* aNewPropertyQuantityWithError(Dimension dim)
412{
413 using Builder = detail::PropertyBuilder<T, double, detail::GetterErrorSetterTag>;
414 return _aNewPropertyQuantity(
415 Builder::template makeGetter<Getter>(),
416 Builder::template makeSetter<Setter>(),
417 dim
418 );
419}
420
421// ============================================================================
422// 对象类型属性
423// ============================================================================
424
425// 成员指针版本
426template<typename T, typename ObjectType, ObjectType* T::*Member>
427A_ALWAYS_INLINE Property* aNewPropertyObject()
428{
429 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::MemberPtrTag>;
430 return _aNewPropertyObject(
431 Builder::template makeGetter<Member>(),
432 Builder::template makeSetter<Member>(),
433 &ObjectType::staticType
434 );
435}
436
437// 只读 getter 版本
438template<typename T, typename ObjectType, ObjectType* (T::*Getter)() const>
439A_ALWAYS_INLINE Property* aNewPropertyObject()
440{
441 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::GetterOnlyTag>;
442 return _aNewPropertyObject(
443 Builder::template makeGetter<Getter>(),
444 nullptr,
445 &ObjectType::staticType
446 );
447}
448
449// getter + void setter 版本
450template<typename T, typename ObjectType, ObjectType* (T::*Getter)() const, void (T::*Setter)(ObjectType*)>
451A_ALWAYS_INLINE Property* aNewPropertyObject()
452{
453 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::GetterVoidSetterTag>;
454 return _aNewPropertyObject(
455 Builder::template makeGetter<Getter>(),
456 Builder::template makeSetter<Setter>(),
457 &ObjectType::staticType
458 );
459}
460
461// getter + errc_t setter 版本
462template<typename T, typename ObjectType, ObjectType* (T::*Getter)() const, errc_t (T::*Setter)(ObjectType*)>
463A_ALWAYS_INLINE Property* aNewPropertyObjectWithError()
464{
465 using Builder = detail::PropertyBuilder<T, ObjectType*, detail::GetterErrorSetterTag>;
466 return _aNewPropertyObject(
467 Builder::template makeGetter<Getter>(),
468 Builder::template makeSetter<Setter>(),
469 &ObjectType::staticType
470 );
471}
472
473// ============================================================================
474// 兼容旧 API(内联转发)
475// ============================================================================
476
477// ---- 成员指针旧接口 ----
478template<typename T, bool T::*Member>
479A_ALWAYS_INLINE Property* aNewPropertyBoolMem() { return aNewPropertyMem<T, bool, Member>(); }
480template<typename T, int T::*Member>
481A_ALWAYS_INLINE Property* aNewPropertyIntMem() { return aNewPropertyMem<T, int, Member>(); }
482template<typename T, double T::*Member>
483A_ALWAYS_INLINE Property* aNewPropertyDoubleMem() { return aNewPropertyMem<T, double, Member>(); }
484template<typename T, std::string T::*Member>
485A_ALWAYS_INLINE Property* aNewPropertyStringMem() { return aNewPropertyMem<T, std::string, Member>(); }
486
487template<typename T, bool T::*Member>
488A_ALWAYS_INLINE Property* aNewPropertyBool() { return aNewPropertyBoolMem<T, Member>(); }
489template<typename T, int T::*Member>
490A_ALWAYS_INLINE Property* aNewPropertyInt() { return aNewPropertyIntMem<T, Member>(); }
491template<typename T, double T::*Member>
492A_ALWAYS_INLINE Property* aNewPropertyDouble() { return aNewPropertyDoubleMem<T, Member>(); }
493template<typename T, std::string T::*Member>
494A_ALWAYS_INLINE Property* aNewPropertyString() { return aNewPropertyStringMem<T, Member>(); }
495
496template<typename T, double T::*Member>
497A_ALWAYS_INLINE Property* aNewPropertyQuantityMem(Dimension dim) {
498 return aNewPropertyQuantity<T, Member>(dim);
499}
500
501// ---- 只读 getter 旧接口 ----
502template<typename T, bool (T::*Getter)() const>
503A_ALWAYS_INLINE Property* aNewPropertyBool() { return aNewPropertyReadOnly<T, bool, Getter>(); }
504template<typename T, int (T::*Getter)() const>
505A_ALWAYS_INLINE Property* aNewPropertyInt() { return aNewPropertyReadOnly<T, int, Getter>(); }
506template<typename T, double (T::*Getter)() const>
507A_ALWAYS_INLINE Property* aNewPropertyDouble() { return aNewPropertyReadOnly<T, double, Getter>(); }
508template<typename T, std::string (T::*Getter)() const>
509A_ALWAYS_INLINE Property* aNewPropertyString() { return aNewPropertyReadOnly<T, std::string, Getter>(); }
510
511
512
513// ---- getter + void setter 旧接口 ----
514template<typename T, bool (T::*Getter)() const, void (T::*Setter)(bool)>
515A_ALWAYS_INLINE Property* aNewPropertyBool() { return aNewProperty<T, bool, Getter, Setter>(); }
516template<typename T, int (T::*Getter)() const, void (T::*Setter)(int)>
517A_ALWAYS_INLINE Property* aNewPropertyInt() { return aNewProperty<T, int, Getter, Setter>(); }
518template<typename T, double (T::*Getter)() const, void (T::*Setter)(double)>
519A_ALWAYS_INLINE Property* aNewPropertyDouble() { return aNewProperty<T, double, Getter, Setter>(); }
520template<typename T,
521 const std::string& (T::*Getter)() const,
522 void (T::*Setter)(StringView)>
523A_ALWAYS_INLINE Property* aNewPropertyString()
524{
525 using Builder = detail::PropertyBuilder<T, std::string, detail::GetterVoidSetterTag>;
526 return _aNewProperty<std::string>(
527 Builder::template makeGetter<Getter>(),
528 Builder::template makeSetter<Setter>()
529 );
530}
531
532// std::string 值返回版本:支持 std::string value() const;
533template<typename T,
534 std::string (T::*Getter)() const,
535 void (T::*Setter)(StringView)>
536A_ALWAYS_INLINE Property* aNewPropertyString()
537{
538 using Builder = detail::PropertyBuilderValueString<T>;
539 return _aNewProperty<std::string>(
540 Builder::template makeGetter<Getter>(),
541 Builder::template makeVoidSetter<Setter>()
542 );
543}
544
545
546// ---- getter + errc_t setter 旧接口 ----
547template<typename T, bool (T::*Getter)() const, errc_t (T::*Setter)(bool)>
548A_ALWAYS_INLINE Property* aNewPropertyBool() { return aNewPropertyWithError<T, bool, Getter, Setter>(); }
549template<typename T, int (T::*Getter)() const, errc_t (T::*Setter)(int)>
550A_ALWAYS_INLINE Property* aNewPropertyInt() { return aNewPropertyWithError<T, int, Getter, Setter>(); }
551template<typename T, double (T::*Getter)() const, errc_t (T::*Setter)(double)>
552A_ALWAYS_INLINE Property* aNewPropertyDouble() { return aNewPropertyWithError<T, double, Getter, Setter>(); }
553template<typename T,
554 const std::string& (T::*Getter)() const,
555 errc_t (T::*Setter)(StringView)>
556A_ALWAYS_INLINE Property* aNewPropertyString()
557{
558 using Builder = detail::PropertyBuilder<T, std::string, detail::GetterErrorSetterTag>;
559 return _aNewProperty<std::string>(
560 Builder::template makeGetter<Getter>(),
561 Builder::template makeSetter<Setter>()
562 );
563}
564
565// std::string 值返回版本:支持 std::string value() const;
566template<typename T,
567 std::string (T::*Getter)() const,
568 errc_t (T::*Setter)(StringView)>
569A_ALWAYS_INLINE Property* aNewPropertyString()
570{
571 using Builder = detail::PropertyBuilderValueString<T>;
572 return _aNewProperty<std::string>(
573 Builder::template makeGetter<Getter>(),
574 Builder::template makeErrorSetter<Setter>()
575 );
576}
577
578template<typename T, double (T::*Getter)() const, errc_t (T::*Setter)(double)>
579A_ALWAYS_INLINE Property* aNewPropertyQuantity(Dimension dim) {
580 return aNewPropertyQuantityWithError<T, Getter, Setter>(dim);
581}
582
583#endif
584
587AST_NAMESPACE_END
类元信息
定义 Class.hpp:40
量纲
定义 Dimension.hpp:355
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:86
反射属性类
定义 Property.hpp:67
绝对时间点
定义 TimePoint.hpp:106
errc_t(*)(void *obj, const void *value) FPropertySet
设置属性值
定义 ReflectAPI.hpp:37
errc_t(*)(const void *obj, void *value) FPropertyGet
获取属性值
定义 ReflectAPI.hpp:36
定义 ReflectAPI.hpp:120
定义 ReflectAPI.hpp:118
定义 ReflectAPI.hpp:119
定义 ReflectAPI.hpp:117
定义 ReflectAPI.hpp:124
定义 ReflectAPI.hpp:61