Core/Algorithm: Improve SafeCast to handle references
This commit is contained in:
parent
55784a7dfc
commit
aac6e38da2
|
|
@ -36,7 +36,7 @@ namespace Nz
|
||||||
template<typename T> void HashCombine(std::size_t& seed, const T& v);
|
template<typename T> void HashCombine(std::size_t& seed, const T& v);
|
||||||
template<typename T> bool IsPowerOfTwo(T value);
|
template<typename T> bool IsPowerOfTwo(T value);
|
||||||
template<typename T> T ReverseBits(T integer);
|
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> constexpr auto UnderlyingCast(T value) -> std::underlying_type_t<T>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|
|
||||||
|
|
@ -50,9 +50,9 @@ namespace Nz
|
||||||
decltype(auto) AccessByOffset(void* basePtr, std::size_t offset)
|
decltype(auto) AccessByOffset(void* basePtr, std::size_t offset)
|
||||||
{
|
{
|
||||||
if constexpr (std::is_lvalue_reference_v<T>)
|
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>)
|
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
|
else
|
||||||
static_assert(AlwaysFalse<T>(), "AccessByOffset requires a reference or pointer type");
|
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>);
|
static_assert(std::is_lvalue_reference_v<T> || std::is_pointer_v<T>);
|
||||||
|
|
||||||
if constexpr (std::is_lvalue_reference_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>)
|
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
|
else
|
||||||
static_assert(AlwaysFalse<T>(), "AccessByOffset requires a reference or pointer type");
|
static_assert(AlwaysFalse<T>(), "AccessByOffset requires a reference or pointer type");
|
||||||
}
|
}
|
||||||
|
|
@ -296,7 +296,7 @@ namespace Nz
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename To, typename From>
|
template<typename To, typename From>
|
||||||
To SafeCast(From value)
|
To SafeCast(From&& value)
|
||||||
{
|
{
|
||||||
#ifdef NAZARA_COMPILER_MSVC
|
#ifdef NAZARA_COMPILER_MSVC
|
||||||
// Disable unreachable code warnings
|
// Disable unreachable code warnings
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue