Core/Algorithm: Add AccessByOffset functions
This commit is contained in:
parent
3b2e375382
commit
0d779077c1
|
|
@ -21,6 +21,8 @@ namespace Nz
|
|||
{
|
||||
class ByteArray;
|
||||
|
||||
template<typename T> decltype(auto) AccessByOffset(void* basePtr, std::size_t offset);
|
||||
template<typename T> decltype(auto) AccessByOffset(const void* basePtr, std::size_t offset);
|
||||
template<typename T> constexpr T Align(T offset, T alignment);
|
||||
template<typename T> constexpr T AlignPow2(T offset, T alignment);
|
||||
template<typename F, typename Tuple> decltype(auto) Apply(F&& fn, Tuple&& t);
|
||||
|
|
|
|||
|
|
@ -36,6 +36,44 @@ namespace Nz
|
|||
NAZARA_CORE_API extern const UInt8 BitReverseTable256[256];
|
||||
}
|
||||
|
||||
/*!
|
||||
* \ingroup core
|
||||
* \brief Access a non-typed struct field by offset
|
||||
* \return A pointer to the field of the asked type
|
||||
*
|
||||
* \param basePtr Pointer to the start of the struct
|
||||
* \param offset Offset to the field (as generated by offsetof or similar)
|
||||
*/
|
||||
template<typename T>
|
||||
decltype(auto) AccessByOffset(void* basePtr, std::size_t offset)
|
||||
{
|
||||
static_assert((std::is_reference_v<T> && !std::is_rvalue_reference_v<T>) || std::is_pointer_v<T>);
|
||||
|
||||
if constexpr (std::is_reference_v<T>)
|
||||
return *reinterpret_cast<std::remove_reference_t<T>*>(static_cast<Nz::UInt8*>(basePtr) + offset);
|
||||
else
|
||||
return reinterpret_cast<T>(static_cast<Nz::UInt8*>(basePtr) + offset);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \ingroup core
|
||||
* \brief Access a non-typed struct field by offset
|
||||
* \return A pointer to the field of the asked type
|
||||
*
|
||||
* \param basePtr Pointer to the start of the struct
|
||||
* \param offset Offset to the field (as generated by offsetof or similar)
|
||||
*/
|
||||
template<typename T>
|
||||
decltype(auto) AccessByOffset(const void* basePtr, std::size_t offset)
|
||||
{
|
||||
static_assert((std::is_reference_v<T> && !std::is_rvalue_reference_v<T>) || std::is_pointer_v<T>);
|
||||
|
||||
if constexpr (std::is_reference_v<T>)
|
||||
return *reinterpret_cast<std::remove_reference_t<T>*>(static_cast<const Nz::UInt8*>(basePtr) + offset);
|
||||
else
|
||||
return reinterpret_cast<T>(static_cast<const Nz::UInt8*>(basePtr) + offset);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \ingroup core
|
||||
* \brief Align an offset
|
||||
|
|
|
|||
Loading…
Reference in New Issue