45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#pragma once
|
|
|
|
#include "CoreTypes.h"
|
|
#include "Templates/TypeTraits.h"
|
|
|
|
NS_REDCRAFT_BEGIN
|
|
NS_BEGIN(Memory)
|
|
|
|
template <typename T>
|
|
FORCEINLINE constexpr T Align(T Val, uint64 Alignment)
|
|
{
|
|
static_assert(TypeTraits::TIsIntegral<T>::Value || TypeTraits::TIsPointer<T>::Value, "Align expects an integer or pointer type");
|
|
|
|
return (T)(((uint64)Val + Alignment - 1) & ~(Alignment - 1));
|
|
}
|
|
|
|
template <typename T>
|
|
FORCEINLINE constexpr T AlignDown(T Val, uint64 Alignment)
|
|
{
|
|
static_assert(TypeTraits::TIsIntegral<T>::Value || TypeTraits::TIsPointer<T>::Value, "AlignDown expects an integer or pointer type");
|
|
|
|
return (T)(((uint64)Val) & ~(Alignment - 1));
|
|
}
|
|
|
|
template <typename T>
|
|
FORCEINLINE constexpr bool IsAligned(T Val, uint64 Alignment)
|
|
{
|
|
static_assert(TypeTraits::TIsIntegral<T>::Value || TypeTraits::TIsPointer<T>::Value, "IsAligned expects an integer or pointer type");
|
|
|
|
return !((uint64)Val & (Alignment - 1));
|
|
}
|
|
|
|
template <typename T>
|
|
FORCEINLINE constexpr T AlignArbitrary(T Val, uint64 Alignment)
|
|
{
|
|
static_assert(TypeTraits::TIsIntegral<T>::Value || TypeTraits::TIsPointer<T>::Value, "AlignArbitrary expects an integer or pointer type");
|
|
|
|
return (T)((((uint64)Val + Alignment - 1) / Alignment) * Alignment);
|
|
}
|
|
|
|
NS_END(Memory)
|
|
NS_REDCRAFT_END
|