Skip to content

Commit

Permalink
[Core] fix ambiguous as casters for pointer and booleans
Browse files Browse the repository at this point in the history
  • Loading branch information
Arthapz committed Nov 3, 2024
1 parent 8763c54 commit 8404a71
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 6 deletions.
32 changes: 27 additions & 5 deletions modules/stormkit/Core/TypeSafe/AsCast.mpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,9 @@ export namespace stormkit { inline namespace core {

// cast to boolean
template<meta::IsStrictOneOf<bool, Boolean> To, typename From>
requires std::convertible_to<To, meta::CanonicalType<From>>
requires(std::convertible_to<To, meta::CanonicalType<From>>
and not meta::IsVariantType<meta::CanonicalType<From>>
and not meta::IsOptionalType<meta::CanonicalType<From>>)
constexpr auto as(From&& value,
const std::source_location& location
= std::source_location::current()) noexcept -> To;
Expand Down Expand Up @@ -458,7 +460,9 @@ namespace stormkit { inline namespace core {
/////////////////////////////////////
/////////////////////////////////////
template<meta::IsStrictOneOf<bool, Boolean> To, typename From>
requires std::convertible_to<To, meta::CanonicalType<From>>
requires(std::convertible_to<To, meta::CanonicalType<From>>
and not meta::IsVariantType<meta::CanonicalType<From>>
and not meta::IsOptionalType<meta::CanonicalType<From>>)
STORMKIT_FORCE_INLINE constexpr auto as(From&& value, const std::source_location&) noexcept
-> To {
return static_cast<bool>(std::forward<From>(value));
Expand Down Expand Up @@ -594,7 +598,13 @@ namespace stormkit { inline namespace core {
using Pointer = Type*;
using To_ = std::conditional_t<meta::IsRawPointer<To>, Ref<meta::ElementType<To>>, To>;

return To_ { std::bit_cast<Pointer>(std::data(std::forward<From>(value))) };
if constexpr (meta::IsSpecializationOf<To_, Ref>) {
if constexpr (meta::IsConst<Type>)
return borrow(std::bit_cast<Pointer>(std::data(std::forward<From>(value))));
else
return borrowMut(std::bit_cast<Pointer>(std::data(std::forward<From>(value))));
} else
return To_ { std::bit_cast<Pointer>(std::data(std::forward<From>(value))) };
}

/////////////////////////////////////
Expand Down Expand Up @@ -628,7 +638,13 @@ namespace stormkit { inline namespace core {
static_assert(meta::Is<PointerElement, ToElementType>,
"Invalid Polymorphic cast !");

return To_ { static_cast<ToPointerType>(ptr) };
if constexpr (meta::IsSpecializationOf<To_, Ref>) {
if constexpr (meta::IsConst<ToElementType>)
return borrow(static_cast<ToPointerType>(ptr));
else
return borrowMut(static_cast<ToPointerType>(ptr));
} else
return To_ { static_cast<ToPointerType>(ptr) };
} else {
static_assert(meta::Is<CanonicalFrom, meta::CanonicalType<To>>,
"Invalid Polymorphic cast !");
Expand All @@ -651,7 +667,13 @@ namespace stormkit { inline namespace core {
using To_ = std::conditional_t<meta::IsRawPointer<To>, Ref<ToElementType>, To>;
static_assert(meta::Is<CanonicalFrom, ToElementType>, "Invalid Polymorphic cast !");

return To_ { static_cast<ToPointerType>(&value) };
if constexpr (meta::IsSpecializationOf<To_, Ref>) {
if constexpr (meta::IsConst<ToElementType>)
return borrow(static_cast<ToPointerType>(&value));
else
return borrowMut(static_cast<ToPointerType>(&value));
} else
return To_ { static_cast<ToPointerType>(&value) };
} else {
static_assert(meta::Is<CanonicalFrom, meta::CanonicalType<To>>,
"Invalid Polymorphic cast !");
Expand Down
2 changes: 1 addition & 1 deletion tests/src/core/TypeSafe/Boolean.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace {
auto bool_1 = Boolean { true };
expects(static_cast<bool>(bool_1));

bindBack([](auto foo) {}, 1)();
bindBack([](auto) {}, 1)();

auto bool_2 = Boolean { false };
expects(!static_cast<bool>(bool_2));
Expand Down

0 comments on commit 8404a71

Please sign in to comment.