Core/Algorithm: Improve SafeCast to handle references

This commit is contained in:
Jérôme Leclercq 2022-01-02 21:59:58 +01:00
parent 55784a7dfc
commit aac6e38da2
2 changed files with 6 additions and 6 deletions

View File

@ -36,7 +36,7 @@ namespace Nz
template<typename T> void HashCombine(std::size_t& seed, const T& v);
template<typename T> bool IsPowerOfTwo(T value);
template<typename T> T ReverseBits(T integer);
template<typename To, typename From> To SafeCast(From value);
template<typename To, typename From> To SafeCast(From&& value);
template<typename T> constexpr auto UnderlyingCast(T value) -> std::underlying_type_t<T>;
template<typename T>

View File

@ -50,9 +50,9 @@ namespace Nz
decltype(auto) AccessByOffset(void* basePtr, std::size_t offset)
{
if constexpr (std::is_lvalue_reference_v<T>)
return *reinterpret_cast<std::remove_reference_t<T>*>(static_cast<Nz::UInt8*>(basePtr) + offset);
return *reinterpret_cast<std::remove_reference_t<T>*>(static_cast<UInt8*>(basePtr) + offset);
else if constexpr (std::is_pointer_v<T>)
return reinterpret_cast<T>(static_cast<Nz::UInt8*>(basePtr) + offset);
return reinterpret_cast<T>(static_cast<UInt8*>(basePtr) + offset);
else
static_assert(AlwaysFalse<T>(), "AccessByOffset requires a reference or pointer type");
}
@ -71,9 +71,9 @@ namespace Nz
static_assert(std::is_lvalue_reference_v<T> || std::is_pointer_v<T>);
if constexpr (std::is_lvalue_reference_v<T>)
return *reinterpret_cast<std::remove_reference_t<T>*>(static_cast<const Nz::UInt8*>(basePtr) + offset);
return *reinterpret_cast<std::remove_reference_t<T>*>(static_cast<const UInt8*>(basePtr) + offset);
else if constexpr (std::is_pointer_v<T>)
return reinterpret_cast<T>(static_cast<const Nz::UInt8*>(basePtr) + offset);
return reinterpret_cast<T>(static_cast<const UInt8*>(basePtr) + offset);
else
static_assert(AlwaysFalse<T>(), "AccessByOffset requires a reference or pointer type");
}
@ -296,7 +296,7 @@ namespace Nz
}
template<typename To, typename From>
To SafeCast(From value)
To SafeCast(From&& value)
{
#ifdef NAZARA_COMPILER_MSVC
// Disable unreachable code warnings