Add IntegerFor template class + Update GenerateUuidV4

This commit is contained in:
sspacelynx 2021-09-03 14:58:02 +02:00 committed by ◱ Mark
parent ea3c7301b1
commit 14dc42b991
2 changed files with 20 additions and 1 deletions

View File

@ -340,6 +340,20 @@ namespace skyline {
return frz::elsa<frz::string>{}(frz::string(view.data(), view.size()), 0); return frz::elsa<frz::string>{}(frz::string(view.data(), view.size()), 0);
} }
/**
* @brief Selects the largest possible integer type for representing an object alongside providing the size of the object in terms of the underlying type
*/
template<class T>
struct IntegerFor {
using type = std::conditional_t<sizeof(T) % sizeof(u64) == 0, u64,
std::conditional_t<sizeof(T) % sizeof(u32) == 0, u32,
std::conditional_t<sizeof(T) % sizeof(u16) == 0, u16, u8>
>
>;
static constexpr size_t count{sizeof(T) / sizeof(type)};
};
namespace detail { namespace detail {
static thread_local std::mt19937_64 generator{GetTimeTicks()}; static thread_local std::mt19937_64 generator{GetTimeTicks()};
} }
@ -354,6 +368,11 @@ namespace skyline {
std::generate(in.begin(), in.end(), gen); std::generate(in.begin(), in.end(), gen);
} }
template<class T> requires (!std::is_integral_v<T> && std::is_trivially_copyable_v<T>)
void FillRandomBytes(T &object) {
FillRandomBytes(std::span(reinterpret_cast<typename IntegerFor<T>::type *>(&object), IntegerFor<T>::count));
}
} }
/** /**

View File

@ -58,7 +58,7 @@ namespace skyline {
// Create an initial random UUID // Create an initial random UUID
UuidLayout uuid; UuidLayout uuid;
util::FillRandomBytes(span(&uuid, 1).cast<u64>()); util::FillRandomBytes(uuid);
// Set format bits // Set format bits
uuid.reserved = reserved; uuid.reserved = reserved;