Skip to content

Commit

Permalink
meta: get rid of unnecessary checks
Browse files Browse the repository at this point in the history
  • Loading branch information
skypjack committed Jan 9, 2025
1 parent 2e201c3 commit c158c2d
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 9 deletions.
10 changes: 5 additions & 5 deletions src/entt/meta/meta.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ class meta_any {
template<typename Type>
[[nodiscard]] const Type *try_cast() const {
const auto &other = type_id<std::remove_cv_t<Type>>();
return static_cast<const Type *>(internal::try_cast(internal::meta_context::from(*ctx), node, other, storage.data()));
return static_cast<const Type *>(internal::try_cast(ctx, node, other, storage.data()));
}

/*! @copydoc try_cast */
Expand All @@ -449,7 +449,7 @@ class meta_any {
return std::as_const(*this).try_cast<std::remove_const_t<Type>>();
} else {
const auto &other = type_id<Type>();
return static_cast<Type *>(const_cast<void *>(internal::try_cast(internal::meta_context::from(*ctx), node, other, storage.data())));
return static_cast<Type *>(const_cast<void *>(internal::try_cast(ctx, node, other, storage.data())));
}
}

Expand Down Expand Up @@ -1303,7 +1303,7 @@ class meta_type {
*/
[[nodiscard]] bool can_cast(const meta_type &other) const noexcept {
// casting this is UB in all cases but we aren't going to use the resulting pointer, so...
return (ctx != nullptr) && other && (internal::try_cast(internal::meta_context::from(*ctx), node, *other.node.info, this) != nullptr);
return other && (internal::try_cast(ctx, node, *other.node.info, this) != nullptr);
}

/**
Expand All @@ -1312,7 +1312,7 @@ class meta_type {
* @return True if the conversion is allowed, false otherwise.
*/
[[nodiscard]] bool can_convert(const meta_type &other) const noexcept {
return (ctx != nullptr) && (internal::try_convert(internal::meta_context::from(*ctx), node, other.info(), other.is_arithmetic() || other.is_enum(), nullptr, [](const void *, auto &&...args) { return ((static_cast<void>(args), 1) + ... + 0u); }) != 0u);
return (internal::try_convert(ctx, node, other.info(), other.is_arithmetic() || other.is_enum(), nullptr, [](const void *, auto &&...args) { return ((static_cast<void>(args), 1) + ... + 0u); }) != 0u);
}

/**
Expand Down Expand Up @@ -1547,7 +1547,7 @@ bool meta_any::set(const id_type id, Type &&value) {
}

[[nodiscard]] inline meta_any meta_any::allow_cast(const meta_type &type) const {
return internal::try_convert(internal::meta_context::from(*ctx), node, type.info(), type.is_arithmetic() || type.is_enum(), storage.data(), [this, &type]([[maybe_unused]] const void *instance, [[maybe_unused]] auto &&...args) {
return internal::try_convert(ctx, node, type.info(), type.is_arithmetic() || type.is_enum(), storage.data(), [this, &type]([[maybe_unused]] const void *instance, [[maybe_unused]] auto &&...args) {
if constexpr((std::is_same_v<std::remove_const_t<std::remove_reference_t<decltype(args)>>, internal::meta_type_node> || ...)) {
return (args.from_void(*ctx, nullptr, instance), ...);
} else if constexpr((std::is_same_v<std::remove_const_t<std::remove_reference_t<decltype(args)>>, internal::meta_conv_node> || ...)) {
Expand Down
10 changes: 6 additions & 4 deletions src/entt/meta/node.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,15 @@ template<typename... Args>
return value(context);
}

[[nodiscard]] inline const void *try_cast(const meta_context &context, const meta_type_node &from, const type_info &to, const void *instance) noexcept {
[[nodiscard]] inline const void *try_cast(const meta_ctx *context, const meta_type_node &from, const type_info &to, const void *instance) noexcept {
if((from.info != nullptr) && *from.info == to) {
return instance;
}

if(from.details) {
for(auto &&curr: from.details->base) {
if(const void *elem = try_cast(context, curr.resolve(context), to, curr.cast(instance)); elem) {
ENTT_ASSERT(context != nullptr, "Null context not allowed");
if(const void *elem = try_cast(context, curr.resolve(meta_context::from(*context)), to, curr.cast(instance)); elem) {
return elem;
}
}
Expand All @@ -215,7 +216,7 @@ template<typename... Args>
}

template<typename Func>
[[nodiscard]] inline auto try_convert(const meta_context &context, const meta_type_node &from, const type_info &to, const bool arithmetic_or_enum, const void *instance, Func func) {
[[nodiscard]] inline auto try_convert(const meta_ctx *context, const meta_type_node &from, const type_info &to, const bool arithmetic_or_enum, const void *instance, Func func) {
if(from.info && *from.info == to) {
return func(instance, from);
}
Expand All @@ -228,7 +229,8 @@ template<typename Func>
}

for(auto &&curr: from.details->base) {
if(auto other = try_convert(context, curr.resolve(context), to, arithmetic_or_enum, curr.cast(instance), func); other) {
ENTT_ASSERT(context != nullptr, "Null context not allowed");
if(auto other = try_convert(context, curr.resolve(meta_context::from(*context)), to, arithmetic_or_enum, curr.cast(instance), func); other) {
return other;
}
}
Expand Down

0 comments on commit c158c2d

Please sign in to comment.