|
|
@@ -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;
|