1#ifndef NEFORCE_CORE_REFLECT_METATYPE_HPP__
2#define NEFORCE_CORE_REFLECT_METATYPE_HPP__
16NEFORCE_BEGIN_NAMESPACE__
17NEFORCE_BEGIN_REFLECT__
43 reflect::type_id type_id_;
56 visited = &local_visited;
59 if (
find(visited->begin(), visited->end(), type_id_) != visited->end()) {
64 for (
const auto* base: base_types_) {
66 base->collect_properties(result, visited);
70 for (
const auto&
property: properties_) {
71 const auto&
name =
property.first;
72 const auto& prop =
property.second;
73 result.emplace_back(
name, prop.get());
81 visited = &local_visited;
84 if (
find(visited->begin(), visited->end(), type_id_) != visited->end()) {
89 for (
const auto* base: base_types_) {
91 base->collect_functions(result, visited);
95 for (
const auto& f: functions_) {
96 const auto&
name = f.first;
97 const auto& func = f.second;
98 result.emplace_back(
name, func.get());
117 NEFORCE_NODISCARD reflect::type_id
type_id() const noexcept {
return type_id_; }
127 NEFORCE_NODISCARD
size_t size() const noexcept {
return size_; }
141 base_types_.push_back(base);
152 pending_base_names_.push_back(base_name);
162 if (type_id_ == base_id) {
165 for (
auto* base: base_types_) {
166 if (base && base->is_derived_from(base_id)) {
202 return it->second.get();
211 constructor_ =
move(ctor);
221 const auto it = properties_.find(
string(
name));
222 if (it != properties_.end()) {
223 return it->second.get();
226 for (
const auto* base: base_types_) {
228 if (
auto* prop = base->get_property(
name)) {
242 const auto it = functions_.find(
string(
name));
243 if (it != functions_.end()) {
244 return it->second.get();
247 for (
const auto* base: base_types_) {
249 if (
auto* func = base->get_function(
name)) {
269 return constructor_ ? constructor_(args) :
meta_any{};
276 NEFORCE_NODISCARD
const auto&
properties()
const {
return properties_; }
282 NEFORCE_NODISCARD
const auto&
functions()
const {
return functions_; }
290 collect_properties(result);
300 collect_functions(result);
320NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD constexpr size_t to_hash() const noexcept
计算哈希值
NEFORCE_CONSTEXPR20 void push_back(const T &value)
在末尾拷贝插入元素
NEFORCE_NODISCARD constexpr Iterator find(Iterator first, Iterator last, const T &value)
查找范围内第一个等于指定值的元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
NEFORCE_ALWAYS_INLINE_INLINE thread::id id() noexcept
获取当前线程标识符
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr