21#include "pw_assert/assert.h"
22#include "pw_bytes/span.h"
23#include "pw_span/span.h"
24#include "pw_status/status_with_size.h"
39 void GetInt(T& dest) {
40 static_assert(std::is_integral<T>::value,
41 "Use Get() for non-integral types");
42 Get({
reinterpret_cast<std::byte*
>(&dest),
sizeof(T)});
58 void GetInt(T& dest,
const T& exclusive_upper_bound) {
59 static_assert(std::is_unsigned_v<T>,
"T must be an unsigned integer");
60 PW_ASSERT(exclusive_upper_bound != 0);
62 if (exclusive_upper_bound < 2) {
67 const uint8_t leading_zeros_in_upper_bound =
68 CountLeadingZeros(exclusive_upper_bound);
72 std::numeric_limits<T>::max() >> leading_zeros_in_upper_bound;
81 if (dest < exclusive_upper_bound) {
90 virtual void Get(ByteSpan dest) = 0;
102 for (std::byte b : data) {
109 uint8_t CountLeadingZeros(T value) {
110 if constexpr (std::is_same_v<T, unsigned>) {
111 return static_cast<uint8_t
>(__builtin_clz(value));
112 }
else if constexpr (std::is_same_v<T, unsigned long>) {
113 return static_cast<uint8_t
>(__builtin_clzl(value));
114 }
else if constexpr (std::is_same_v<T, unsigned long long>) {
115 return static_cast<uint8_t
>(__builtin_clzll(value));
117 static_assert(
sizeof(T) <
sizeof(
unsigned));
120 return static_cast<uint8_t
>(__builtin_clz(value) -
121 ((
sizeof(unsigned) -
sizeof(T)) * CHAR_BIT));
virtual void InjectEntropyBits(uint32_t data, uint_fast8_t num_bits)=0
void GetInt(T &dest, const T &exclusive_upper_bound)
Definition: random.h:58
virtual void Get(ByteSpan dest)=0
void InjectEntropy(ConstByteSpan data)
Injects entropy into the pool byte-by-byte.
Definition: random.h:101