1#ifndef NEFORCE_CORE_REFLECT_METATYPE_HPP__
2#define NEFORCE_CORE_REFLECT_METATYPE_HPP__
18NEFORCE_BEGIN_NAMESPACE__
19NEFORCE_BEGIN_REFLECT__
87 if (visited ==
nullptr) {
88 visited = &local_visited;
91 if (
find(visited->begin(), visited->end(), type_id_) != visited->end()) {
96 for (
const auto* base: base_types_) {
97 if (base !=
nullptr) {
98 base->collect_properties(result, visited);
102 for (
const auto&
property: properties_) {
103 const auto&
name =
property.first;
104 const auto& prop =
property.second;
105 result.emplace_back(
name, prop.get());
112 if (visited ==
nullptr) {
113 visited = &local_visited;
116 if (
find(visited->begin(), visited->end(), type_id_) != visited->end()) {
121 for (
const auto* base: base_types_) {
122 if (base !=
nullptr) {
123 base->collect_functions(result, visited);
127 for (
const auto& f: functions_) {
128 const auto&
name = f.first;
129 const auto& func = f.second;
130 result.emplace_back(name, func.get());
175 NEFORCE_NODISCARD
size_t size() const noexcept {
return size_; }
188 if (base !=
nullptr) {
189 base_types_.push_back(base);
200 pending_base_names_.push_back(base_name);
210 if (type_id_ == base_id) {
213 for (
const auto* base: base_types_) {
214 if (base !=
nullptr && base->is_derived_from(base_id)) {
227 for (
const auto* base: base_types_) {
228 if (base !=
nullptr && (base->name() == base_name || base->is_derived_from(base_name))) {
247 properties_.emplace(
name,
move(prop));
259 return it->second.get();
268 constructor_ =
move(ctor);
298 NEFORCE_NODISCARD
bool is_enum() const noexcept {
return !!enum_info_; }
306 enum_info_ =
move(info);
321 container_kind_ = kind;
334 element_type_id_ = id;
360 mapped_type_id_ = id;
368 container_size_ =
move(func);
378 return container_size_ ? container_size_(container_ptr) : 0;
385 container_get_ =
move(func);
396 return container_get_ ? container_get_(container_ptr, index) :
meta_any{};
403 container_insert_ =
move(func);
411 if (container_insert_) {
412 container_insert_(container_ptr, value);
420 container_insert_kv_ =
move(func);
428 if (container_insert_kv_) {
429 container_insert_kv_(container_ptr, key, value);
444 const auto it = properties_.find(
name);
445 if (it != properties_.end()) {
446 return it->second.get();
449 for (
const auto* base: base_types_) {
450 if (base !=
nullptr) {
451 if (
const auto* prop = base->get_property(
name)) {
465 const auto it = functions_.find(
name);
466 if (it != functions_.end()) {
467 return it->second.get();
470 for (
const auto* base: base_types_) {
471 if (base !=
nullptr) {
472 if (
const auto* func = base->get_function(
name)) {
486 signal_names_.push_back(
name);
514 return constructor_ ? constructor_(args) :
meta_any{};
521 NEFORCE_NODISCARD
const auto&
properties()
const {
return properties_; }
527 NEFORCE_NODISCARD
const auto&
functions()
const {
return functions_; }
535 collect_properties(result);
545 collect_functions(result);
564 NEFORCE_NODISCARD
bool has_pending_bases() const noexcept {
return !pending_base_names_.empty(); }
570NEFORCE_END_NAMESPACE__
constexpr basic_string_view view(const size_type off, const size_type count=npos) const
获取子视图
constexpr void push_back(const T &value)
在末尾拷贝插入元素
unsigned char uint8_t
8位无符号整数类型
unsigned short uint16_t
16位无符号整数类型
constexpr Iterator find(Iterator first, Iterator last, const T &value)
查找范围内第一个等于指定值的元素
constexpr none_t none
默认空表示
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
bool name(char *buffer, size_t size)
获取当前线程名称
constexpr unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr