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"
41 void GetInt(T& dest) {
42 static_assert(std::is_integral<T>::value,
43 "Use Get() for non-integral types");
44 Get({
reinterpret_cast<std::byte*
>(&dest),
sizeof(T)});
60 void GetInt(T& dest,
const T& exclusive_upper_bound) {
61 static_assert(std::is_unsigned_v<T>,
"T must be an unsigned integer");
62 PW_ASSERT(exclusive_upper_bound != 0);
64 if (exclusive_upper_bound < 2) {
69 const uint8_t leading_zeros_in_upper_bound =
70 CountLeadingZeros(exclusive_upper_bound);
74 std::numeric_limits<T>::max() >> leading_zeros_in_upper_bound;
83 if (dest < exclusive_upper_bound) {
104 for (std::byte b : data) {
111 uint8_t CountLeadingZeros(T value) {
112 if constexpr (std::is_same_v<T, unsigned>) {
113 return static_cast<uint8_t
>(__builtin_clz(value));
114 }
else if constexpr (std::is_same_v<T, unsigned long>) {
115 return static_cast<uint8_t
>(__builtin_clzl(value));
116 }
else if constexpr (std::is_same_v<T, unsigned long long>) {
117 return static_cast<uint8_t
>(__builtin_clzll(value));
119 static_assert(
sizeof(T) <
sizeof(
unsigned));
122 return static_cast<uint8_t
>(__builtin_clz(value) -
123 ((
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:60
virtual void Get(ByteSpan dest)=0
void InjectEntropy(ConstByteSpan data)
Injects entropy into the pool byte-by-byte.
Definition: random.h:103