1#ifndef NEFORCE_CORE_REFLECT_REFLECT_HPP__
2#define NEFORCE_CORE_REFLECT_REFLECT_HPP__
14NEFORCE_BEGIN_NAMESPACE__
15NEFORCE_BEGIN_REFLECT__
36 template <
typename... Args,
size_t... Is>
38 return meta_any(T(args[Is].
template convert<Args>()...));
47 meta_(
registry::instance().register_type<T>(name)) {}
54 template <
typename Base>
66 meta_.base_type(base_name);
81 auto* instance =
static_cast<const T*
>(obj);
86 auto* instance =
static_cast<T*
>(obj);
87 auto* val = value.cast<U>();
89 instance->*member = *val;
106 template <
typename U>
109 const auto* prop = meta_.get_property(name);
111 const_cast<meta_property*
>(prop)->set_notify_signal(notify_signal);
123 template <
typename U>
136 template <
typename Ret,
typename... Args>
138 auto invoker = _NEFORCE inner::make_member_invoker(func);
139 auto* meta_func = meta_.function(name, _NEFORCE
move(invoker));
141 meta_func->set_arg_hints(
sizeof...(Args),
sizeof...(Args));
154 template <
typename Ret,
typename... Args>
156 auto invoker = _NEFORCE inner::make_const_member_invoker(func);
157 auto* meta_func = meta_.function(name, _NEFORCE
move(invoker));
159 meta_func->set_arg_hints(
sizeof...(Args),
sizeof...(Args));
172 template <
typename Ret,
typename... 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));
199 template <
typename... Args>
201 static_assert(
is_constructible_v<T, Args...>,
"Constructor must be constructible from Args");
203 if (args.
size() !=
sizeof...(Args)) {
204 NEFORCE_THROW_EXCEPTION(
value_exception(
"Constructor argument count mismatch"));
206 return type_builder::create_with_args<Args...>(args,
make_index_sequence<
sizeof...(Args)>{});
226 meta_.set_table_name(table);
241 meta_.cloner([](
const void* src) ->
meta_any {
return meta_any(*
static_cast<const T*
>(src)); });
252 template <
typename ElementType>
257 meta_.container_size([](
const void* c) ->
size_t {
return static_cast<const T*
>(c)->
size(); });
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) {
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);
286 template <
typename KeyType,
typename MappedType>
292 meta_.container_size([](
const void* c) ->
size_t {
return static_cast<const T*
>(c)->
size(); });
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) {
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>();
308 container->insert({*kptr, *vptr});
336template <
typename T, enable_if_t<is_
class_v<T>,
int> = 0>
346#define NEFORCE_REFLECT_REGISTER(Class) static auto _neforce_reflect_##Class = _NEFORCE reflect::reflect<Class>(#Class)
353#define NEFORCE_REFLECT_REGISTER_DERIVED(Class, Base) \
354 static auto _neforce_reflect_##Class = _NEFORCE reflect::reflect<Class>(#Class).template base<Base>()
361#define NEFORCE_REFLECT_RESOLVE_BASES() _NEFORCE reflect::registry::instance().resolve_all_bases()
366NEFORCE_END_NAMESPACE__
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的便捷变量模板