🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
Property.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "Field.hpp"
25#include "ReflectAPI.hpp"
26
27AST_NAMESPACE_BEGIN
28
29class PropertyVisitor;
30
37enum class EValueType
38{
39 eBool,
40 eInt,
41 eDouble,
42 eQuantity,
43 eString,
44 eObject,
46 eInvalid,
47};
48
49
54AST_UTIL_API errc_t aFakeGet(const void* container, void* value);
55
56
61AST_UTIL_API errc_t aFakeSet(void* container, const void* value);
62
63
64
66class AST_UTIL_API Property: public Field
67{
68public:
71 eReadable = 0x01,
72 eWritable = 0x02,
73 };
74public:
75 Property()
76 : Field()
77 , getter_(&aFakeGet)
78 , setter_(&aFakeSet)
79 {}
80 Property(StringView name, StringView desc, FPropertyGet getter, FPropertySet setter)
81 : Field(name, desc)
82 , getter_(getter?getter:&aFakeGet)
83 , setter_(setter?setter:&aFakeSet)
84 {}
85 Property(FPropertyGet getter, FPropertySet setter)
86 : Field()
87 , getter_(getter?getter:&aFakeGet)
88 , setter_(setter?setter:&aFakeSet)
89 {}
90 ~Property() = default;
91
96 virtual errc_t accept(PropertyVisitor& visitor, const void* container) = 0;
97
101 virtual errc_t getValueDouble(const void* container, double& value) = 0;
102
107 virtual errc_t setValueDouble(void* container, double value) = 0;
108
113 virtual errc_t getValueInt(const void* container, int& value) = 0;
114
119 virtual errc_t setValueInt(void* container, int value) = 0;
120
125 virtual errc_t getValueBool(const void* container, bool& value) = 0;
126
131 virtual errc_t setValueBool(void* container, bool value) = 0;
132
137 virtual errc_t getValueString(const void* container, std::string& value) = 0;
138
143 virtual errc_t setValueString(void* container, StringView value) = 0;
144
145
148 virtual EValueType getValueType() const = 0;
149public:
150 double getValueDouble(const void* container);
151 int getValueInt(const void* container);
152 bool getValueBool(const void* container);
153 std::string getValueString(const void* container);
154
155 template<typename T>
156 T getValue(const void* container);
157public:
160 bool isObject() const;
161
163 errc_t setValueObject(void* container, Object* value);
164
166 errc_t getValueObject(const void* container, Object*& value);
167
168public:
170 bool readOnly() const { return setter_ == nullptr && getter_ != nullptr; }
172 bool writeOnly() const { return setter_ != nullptr && getter_ == nullptr; }
173protected:
178 A_ALWAYS_INLINE
179 errc_t getValue(void* container, void* value)
180 {
181 return getter_(container, value);
182 }
183
188 A_ALWAYS_INLINE
189 errc_t setValue(void* container, const void* value)
190 {
191 return setter_(container, value);
192 }
193protected:
194 FPropertyGet getter_ {nullptr}; // 获取属性值的函数指针
195 FPropertySet setter_ {nullptr}; // 设置属性值的函数指针
196};
197
198
199template<>
200inline double Property::getValue<double>(const void* container)
201{
202 return getValueDouble(container);
203}
204template<>
205inline int Property::getValue<int>(const void* container)
206{
207 return getValueInt(container);
208}
209template<>
210inline bool Property::getValue<bool>(const void* container)
211{
212 return getValueBool(container);
213}
214
215template<>
216inline std::string Property::getValue<std::string>(const void* container)
217{
218 return getValueString(container);
219}
220
221
222
225AST_NAMESPACE_END
反射字段类
定义 Field.hpp:34
对象基类,继承自该类的对象可以使用运行时类型信息相关功能,实现强弱引用计数、运行时元信息(属性访问、序列化等)等基础功能
定义 Object.hpp:86
定义 PropertyVisitor.hpp:44
反射属性类
定义 Property.hpp:67
A_ALWAYS_INLINE errc_t setValue(void *container, const void *value)
设置属性值
定义 Property.hpp:189
virtual errc_t setValueString(void *container, StringView value)=0
设置属性值(String类型)
EPropertyFlag
属性标志位
定义 Property.hpp:70
virtual errc_t getValueDouble(const void *container, double &value)=0
bool writeOnly() const
检查属性是否为只写属性
定义 Property.hpp:172
A_ALWAYS_INLINE errc_t getValue(void *container, void *value)
获取属性值
定义 Property.hpp:179
virtual errc_t accept(PropertyVisitor &visitor, const void *container)=0
接受访问者
virtual EValueType getValueType() const =0
获取属性值类型
virtual errc_t getValueBool(const void *container, bool &value)=0
获取属性值(bool类型)
virtual errc_t setValueBool(void *container, bool value)=0
设置属性值(bool类型)
virtual errc_t setValueInt(void *container, int value)=0
设置属性值(int类型)
virtual errc_t setValueDouble(void *container, double value)=0
设置属性值(double类型)
virtual errc_t getValueInt(const void *container, int &value)=0
获取属性值(int类型)
bool readOnly() const
检查属性是否为只读属性
定义 Property.hpp:170
virtual errc_t getValueString(const void *container, std::string &value)=0
获取属性值(String类型)
errc_t(*)(const void *obj, void *value) FPropertyGet
获取属性值
定义 ReflectAPI.hpp:36
errc_t aFakeSet(void *container, const void *value)
模拟设置属性值的函数
定义 Property.cpp:34
errc_t aFakeGet(const void *container, void *value)
模拟获取属性值的函数
定义 Property.cpp:28
EValueType
定义 Property.hpp:38
@ eInt
int类型
@ eInvalid
无效类型
@ eQuantity
数量值类型
@ eTimePoint
时间点类型
@ eDouble
double类型