Core/Algorithm: Improve SafeCast to handle references
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user