meta: rework internal function meta_arg_node

This commit is contained in:
Michele Caini
2022-09-21 14:37:03 +02:00
parent fea0210b6e
commit 699aa5cd96
2 changed files with 8 additions and 12 deletions

View File

@@ -135,16 +135,12 @@ template<typename Type>
meta_type_node resolve() noexcept;
template<typename... Args>
[[nodiscard]] auto *meta_arg_node(type_list<Args...>, [[maybe_unused]] const std::size_t index) noexcept {
using element_type = meta_type_node (*)() noexcept;
if constexpr(sizeof...(Args) == 0u) {
return static_cast<element_type>(nullptr);
} else {
const element_type args[sizeof...(Args)]{&internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>>...};
ENTT_ASSERT(index < sizeof...(Args), "Out of bounds");
return args[index];
}
[[nodiscard]] auto meta_arg_node(type_list<Args...>, [[maybe_unused]] const std::size_t index) noexcept {
std::size_t pos{};
meta_type_node (*value)() noexcept = nullptr;
((value = (pos++ == index ? &internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>> : value)), ...);
ENTT_ASSERT(value != nullptr, "Out of bounds");
return value();
}
[[nodiscard]] inline meta_type_node *try_resolve(const type_info &info) noexcept {
@@ -220,7 +216,7 @@ template<typename Type>
node.templ = meta_template_node{
meta_template_traits<Type>::args_type::size,
&resolve<typename meta_template_traits<Type>::class_type>,
+[](const std::size_t index) noexcept { return meta_arg_node(typename meta_template_traits<Type>::args_type{}, index)(); }};
+[](const std::size_t index) noexcept { return meta_arg_node(typename meta_template_traits<Type>::args_type{}, index); }};
}
return node;

View File

@@ -176,7 +176,7 @@ meta_any meta_dispatch([[maybe_unused]] Type &&value) {
*/
template<typename Type>
[[nodiscard]] static meta_type meta_arg(const std::size_t index) noexcept {
return internal::meta_arg_node(Type{}, index)();
return internal::meta_arg_node(Type{}, index);
}
/**