// Copyright 2018 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #pragma once #include #include #include #include "Common/CommonTypes.h" namespace Common::Random { /// Cryptographically secure pseudo-random number generator, with explicit seed. class PRNG final { public: explicit PRNG(u64 seed) : PRNG(&seed, sizeof(u64)) {} PRNG(void* seed, std::size_t size); ~PRNG(); void Generate(void* buffer, std::size_t size); template T GenerateValue() { static_assert(std::is_arithmetic(), "T must be an arithmetic type in GenerateValue."); T value; Generate(&value, sizeof(value)); return value; } private: struct Impl; std::unique_ptr m_impl; }; /// Fill `buffer` with random bytes using a cryptographically secure pseudo-random number generator. void Generate(void* buffer, std::size_t size); /// Generates a random value of arithmetic type `T` template T GenerateValue() { static_assert(std::is_arithmetic(), "T must be an arithmetic type in GenerateValue."); T value; Generate(&value, sizeof(value)); return value; } } // namespace Common::Random