NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
reflect.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_REFLECT_HPP__
2#define NEFORCE_CORE_REFLECT_REFLECT_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
16
22
31template <typename T>
33private:
34 meta_type& meta_;
35
36 template <typename... Args, size_t... Is>
37 static meta_any create_with_args(const vector<meta_any>& args, index_sequence<Is...> /*unused*/) {
38 return meta_any(T(args[Is].template convert<Args>()...));
39 }
40
41public:
46 explicit type_builder(string_view name) :
47 meta_(registry::instance().register_type<T>(name)) {}
48
54 template <typename Base>
56 meta_.base_type(&registry::instance().register_type<Base>(type_name_v<Base>));
57 return *this;
58 }
59
66 meta_.base_type(base_name);
67 return *this;
68 }
69
78 template <typename U>
79 type_builder& property(string_view name, U T::* member, const uint16_t attrs = PROP_NONE) {
80 meta_property::getter getter = [member](const void* obj) -> meta_any {
81 auto* instance = static_cast<const T*>(obj);
82 return meta_any(instance->*member);
83 };
84
85 meta_property::setter setter = [member](void* obj, const meta_any& value) {
86 auto* instance = static_cast<T*>(obj);
87 auto* val = value.cast<U>();
88 if (val) {
89 instance->*member = *val;
90 }
91 };
92
93 meta_.property(name, type_id_for<U>(), move(getter), move(setter), attrs);
94 return *this;
95 }
96
106 template <typename U>
107 type_builder& property(string_view name, U T::* member, const uint16_t attrs, string_view notify_signal) {
108 this->template property<U>(name, member, attrs);
109 const auto* prop = meta_.get_property(name);
110 if (prop) {
111 const_cast<meta_property*>(prop)->set_notify_signal(notify_signal);
112 }
113 return *this;
114 }
115
123 template <typename U>
125 return this->template property<U>(name, member, PROP_READ_ONLY);
126 }
127
136 template <typename Ret, typename... Args>
137 type_builder& function(string_view name, Ret (T::*func)(Args...)) {
138 auto invoker = _NEFORCE inner::make_member_invoker(func);
139 auto* meta_func = meta_.function(name, _NEFORCE move(invoker));
140 if (meta_func) {
141 meta_func->set_arg_hints(sizeof...(Args), sizeof...(Args));
142 }
143 return *this;
144 }
145
154 template <typename Ret, typename... Args>
155 type_builder& function(string_view name, Ret (T::*func)(Args...) const) {
156 auto invoker = _NEFORCE inner::make_const_member_invoker(func);
157 auto* meta_func = meta_.function(name, _NEFORCE move(invoker));
158 if (meta_func) {
159 meta_func->set_arg_hints(sizeof...(Args), sizeof...(Args));
160 }
161 return *this;
162 }
163
172 template <typename Ret, typename... Args>
173 type_builder& static_function(string_view name, Ret (*func)(Args...)) {
174 auto invoker = _NEFORCE inner::make_static_invoker(func);
175 auto* meta_func = meta_.function(name, _NEFORCE move(invoker));
176 meta_func->set_arg_hints(sizeof...(Args), sizeof...(Args));
177 return *this;
178 }
179
185 static_assert(is_default_constructible_v<T>, "Constructor must be default constructible");
186 meta_.constructor([](const vector<meta_any>&) -> meta_any {
187 meta_any result;
188 result.emplace<T>();
189 return result;
190 });
191 return *this;
192 }
193
199 template <typename... Args>
201 static_assert(is_constructible_v<T, Args...>, "Constructor must be constructible from Args");
202 meta_.constructor([](const vector<meta_any>& args) -> meta_any {
203 if (args.size() != sizeof...(Args)) {
204 NEFORCE_THROW_EXCEPTION(value_exception("Constructor argument count mismatch"));
205 }
206 return type_builder::create_with_args<Args...>(args, make_index_sequence<sizeof...(Args)>{});
207 });
208 return *this;
209 }
210
226 meta_.set_table_name(table);
227 return *this;
228 }
229
231 meta_.register_signal(name);
232 return *this;
233 }
234
240 static_assert(is_copy_constructible_v<T>, "Clone requires copy constructible type");
241 meta_.cloner([](const void* src) -> meta_any { return meta_any(*static_cast<const T*>(src)); });
242 return *this;
243 }
244
252 template <typename ElementType>
254 meta_.container(container_kind::sequential);
255 meta_.element_type_id(type_id_for<ElementType>());
256
257 meta_.container_size([](const void* c) -> size_t { return static_cast<const T*>(c)->size(); });
258
259 meta_.container_get([](const void* c, size_t index) -> meta_any {
260 const auto* container = static_cast<const T*>(c);
261 auto it = container->begin();
262 for (size_t i = 0; i < index; ++i) {
263 ++it;
264 }
265 return meta_any(*it);
266 });
267
268 meta_.container_insert([](void* c, const meta_any& val) {
269 auto* container = static_cast<T*>(c);
270 if (auto* ptr = val.cast<ElementType>()) {
271 container->push_back(*ptr);
272 }
273 });
274
275 return *this;
276 }
277
286 template <typename KeyType, typename MappedType>
288 meta_.container(container_kind::associative);
289 meta_.key_type_id(type_id_for<KeyType>());
290 meta_.mapped_type_id(type_id_for<MappedType>());
291
292 meta_.container_size([](const void* c) -> size_t { return static_cast<const T*>(c)->size(); });
293
294 meta_.container_get([](const void* c, size_t index) -> meta_any {
295 const auto* container = static_cast<const T*>(c);
296 auto it = container->begin();
297 for (size_t i = 0; i < index; ++i) {
298 ++it;
299 }
300 return meta_any(it->first);
301 });
302
303 meta_.container_insert_kv([](void* c, const meta_any& key, const meta_any& val) {
304 auto* container = static_cast<T*>(c);
305 auto* kptr = key.cast<KeyType>();
306 auto* vptr = val.cast<MappedType>();
307 if (kptr && vptr) {
308 container->insert({*kptr, *vptr});
309 }
310 });
311
312 return *this;
313 }
314
319 NEFORCE_NODISCARD meta_type& meta() noexcept { return meta_; }
320
325 NEFORCE_NODISCARD const meta_type& meta() const noexcept { return meta_; }
326};
327
336template <typename T, enable_if_t<is_class_v<T>, int> = 0>
338 return type_builder<T>(name);
339}
340
341
346#define NEFORCE_REFLECT_REGISTER(Class) static auto _neforce_reflect_##Class = _NEFORCE reflect::reflect<Class>(#Class)
347
353#define NEFORCE_REFLECT_REGISTER_DERIVED(Class, Base) \
354 static auto _neforce_reflect_##Class = _NEFORCE reflect::reflect<Class>(#Class).template base<Base>()
355
361#define NEFORCE_REFLECT_RESOLVE_BASES() _NEFORCE reflect::registry::instance().resolve_all_bases()
362 // Reflection
364
365NEFORCE_END_REFLECT__
366NEFORCE_END_NAMESPACE__
367#endif // NEFORCE_CORE_REFLECT_REFLECT_HPP__
属性反射元数据类
function< void(void *, const meta_any &)> setter
属性写入器类型
function< meta_any(const void *)> getter
属性读取器类型
类型反射元数据类
meta_type & register_signal(string_view name)
注册信号名称
反射类型注册表
static registry & instance()
获取单例实例
type_builder & enable_clone()
启用多态克隆支持
meta_type & meta() noexcept
获取元数据对象
type_builder & property(string_view name, U T::*member, const uint16_t attrs, string_view notify_signal)
添加属性(带变更通知信号)
type_builder & base(string_view base_name)
添加基类(延迟解析)
type_builder & function(string_view name, Ret(T::*func)(Args...) const)
添加常量成员函数
type_builder & constructor()
添加带参数构造函数
type_builder & readonly_property(string_view name, U T::*member)
添加只读属性
type_builder(string_view name)
构造函数
type_builder & function(string_view name, Ret(T::*func)(Args...))
添加成员函数
type_builder & static_function(string_view name, Ret(*func)(Args...))
添加静态函数
type_builder & constructor()
添加默认构造函数
type_builder & table_name(string_view table)
注册信号成员
const meta_type & meta() const noexcept
获取常量元数据对象
type_builder & as_associative_container()
注册为关联容器类型
type_builder & as_sequential_container()
注册为顺序容器类型
type_builder & base()
添加基类(已解析)
type_builder & property(string_view name, U T::*member, const uint16_t attrs=PROP_NONE)
添加属性
动态大小数组容器
constexpr size_type size() const noexcept
获取当前元素数量
unsigned short uint16_t
16位无符号整数类型
integer_sequence< size_t, Values... > index_sequence
索引序列
make_integer_sequence< size_t, Size > make_index_sequence
生成指定长度的索引序列
constexpr type_id type_id_for() noexcept
计算类型 T 的运行时期类型标识
type_builder< T > reflect(string_view name)
创建类型反射构建器
constexpr string_view type_name_v
type_name 的便捷访问变量模板
@ PROP_READ_ONLY
仅 getter,无 setter
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr bool is_constructible_v
is_constructible的便捷变量模板
constexpr bool is_default_constructible_v
is_default_constructible的便捷变量模板
constexpr bool is_copy_constructible_v
is_copy_constructible的便捷变量模板
函数反射元数据
反射类型注册表