Seregon/ShadPKG

A tool for deriving PKG packet encryption keys for ps4 written in c++

C++/47.3 KB/No license
common/alignment.h
ShadPKG / common / alignment.h
1// SPDX-FileCopyrightText: 2014 Jannik Vogel <email@jannikvogel.de>
2// SPDX-License-Identifier: CC0-1.0
3 
4#pragma once
5 
6#include <cstddef>
7#include <type_traits>
8 
9namespace Common {
10 
11template <typename T>
12[[nodiscard]] constexpr T AlignUp(T value, std::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)};
15 value -= mod;
16 return static_cast<T>(mod == T{0} ? value : value + size);
17}
18 
19template <typename T>
20[[nodiscard]] constexpr T AlignDown(T value, std::size_t size) {
21 static_assert(std::is_unsigned_v<T>, "T must be an unsigned value.");
22 return static_cast<T>(value - value % size);
23}
24 
25template <typename T>
26 requires std::is_integral_v<T>
27[[nodiscard]] constexpr bool IsAligned(T value, std::size_t alignment) {
28 return (value & (alignment - 1)) == 0;
29}
30 
31template <typename T>
32 requires std::is_integral_v<T>
33[[nodiscard]] constexpr bool Is16KBAligned(T value) {
34 return (value & 0x3FFF) == 0;
35}
36 
37template <typename T>
38 requires std::is_integral_v<T>
39[[nodiscard]] constexpr bool Is64KBAligned(T value) {
40 return (value & 0xFFFF) == 0;
41}
42 
43template <typename T>
44 requires std::is_integral_v<T>
45[[nodiscard]] constexpr bool Is2MBAligned(T value) {
46 return (value & 0x1FFFFF) == 0;
47}
48 
49} // namespace Common
50