summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/alignment.h22
1 files changed, 9 insertions, 13 deletions
diff --git a/src/common/alignment.h b/src/common/alignment.h
index 2127dc186..fb81f10d8 100644
--- a/src/common/alignment.h
+++ b/src/common/alignment.h
@@ -9,8 +9,7 @@
9namespace Common { 9namespace Common {
10 10
11template <typename T> 11template <typename T>
12[[nodiscard]] constexpr T AlignUp(T value, std::size_t size) { 12requires std::is_unsigned_v<T>[[nodiscard]] constexpr T AlignUp(T value, size_t size) {
13 static_assert(std::is_unsigned_v<T>, "T must be an unsigned value.");
14 auto mod{static_cast<T>(value % size)}; 13 auto mod{static_cast<T>(value % size)};
15 value -= mod; 14 value -= mod;
16 return static_cast<T>(mod == T{0} ? value : value + size); 15 return static_cast<T>(mod == T{0} ? value : value + size);
@@ -22,36 +21,33 @@ requires std::is_unsigned_v<T>[[nodiscard]] constexpr T AlignUpLog2(T value, siz
22} 21}
23 22
24template <typename T> 23template <typename T>
25[[nodiscard]] constexpr T AlignDown(T value, std::size_t size) { 24requires std::is_unsigned_v<T>[[nodiscard]] constexpr T AlignDown(T value, size_t size) {
26 static_assert(std::is_unsigned_v<T>, "T must be an unsigned value.");
27 return static_cast<T>(value - value % size); 25 return static_cast<T>(value - value % size);
28} 26}
29 27
30template <typename T> 28template <typename T>
31[[nodiscard]] constexpr bool Is4KBAligned(T value) { 29requires std::is_unsigned_v<T>[[nodiscard]] constexpr bool Is4KBAligned(T value) {
32 static_assert(std::is_unsigned_v<T>, "T must be an unsigned value.");
33 return (value & 0xFFF) == 0; 30 return (value & 0xFFF) == 0;
34} 31}
35 32
36template <typename T> 33template <typename T>
37[[nodiscard]] constexpr bool IsWordAligned(T value) { 34requires std::is_unsigned_v<T>[[nodiscard]] constexpr bool IsWordAligned(T value) {
38 static_assert(std::is_unsigned_v<T>, "T must be an unsigned value.");
39 return (value & 0b11) == 0; 35 return (value & 0b11) == 0;
40} 36}
41 37
42template <typename T> 38template <typename T>
43[[nodiscard]] constexpr bool IsAligned(T value, std::size_t alignment) { 39requires std::is_integral_v<T>[[nodiscard]] constexpr bool IsAligned(T value, size_t alignment) {
44 using U = typename std::make_unsigned<T>::type; 40 using U = typename std::make_unsigned_t<T>;
45 const U mask = static_cast<U>(alignment - 1); 41 const U mask = static_cast<U>(alignment - 1);
46 return (value & mask) == 0; 42 return (value & mask) == 0;
47} 43}
48 44
49template <typename T, std::size_t Align = 16> 45template <typename T, size_t Align = 16>
50class AlignmentAllocator { 46class AlignmentAllocator {
51public: 47public:
52 using value_type = T; 48 using value_type = T;
53 using size_type = std::size_t; 49 using size_type = size_t;
54 using difference_type = std::ptrdiff_t; 50 using difference_type = ptrdiff_t;
55 51
56 using propagate_on_container_copy_assignment = std::true_type; 52 using propagate_on_container_copy_assignment = std::true_type;
57 using propagate_on_container_move_assignment = std::true_type; 53 using propagate_on_container_move_assignment = std::true_type;