[+] Improve RNG apis. TODO: more work is needed
This commit is contained in:
parent
3651c22159
commit
188e478033
@ -28,25 +28,37 @@ namespace Aurora::RNG
|
||||
|
||||
|
||||
template<typename T, int N>
|
||||
inline void NextArray(T(&array)[N])
|
||||
inline void NextFillArray(T(&array)[N])
|
||||
{
|
||||
Read(array, N * sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline void NextArray(T *array, AuUInt32 length)
|
||||
inline void NextFillArray(T *array, AuUInt32 length)
|
||||
{
|
||||
Raed(array, length * sizeof(T));
|
||||
Read(array, length * sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline T NextTmpl()
|
||||
static inline T &NextFillRange(const T &items)
|
||||
{
|
||||
NextFillArray(items.begin(), items.end() - items.begin());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline T NextFillTmpl()
|
||||
{
|
||||
T ret {};
|
||||
Read(&ret, sizeof(T));
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline T &NextIterator(T &begin, T &end)
|
||||
{
|
||||
return begin + NextIndex(AuUInt(end - begin));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline T &NextArray(T *items, AuUInt32 count)
|
||||
{
|
||||
@ -60,9 +72,9 @@ namespace Aurora::RNG
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline T &RngRange(const T &items)
|
||||
static inline T &NextRange(const T &items)
|
||||
{
|
||||
return RngArray(items.begin(), items.end() - items.begin());
|
||||
return NextIterator(items.begin(), items.end());
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -33,7 +33,7 @@ namespace Aurora::RNG
|
||||
// Note: it is conceivable that someone may want the following templates for some cryptographic purpose
|
||||
|
||||
template<bool fast = true, typename T, int N>
|
||||
static inline void RngArray(T(&array)[N])
|
||||
static inline void RngFillArray(T(&array)[N])
|
||||
{
|
||||
if constexpr (fast)
|
||||
{
|
||||
@ -46,7 +46,7 @@ namespace Aurora::RNG
|
||||
}
|
||||
|
||||
template<bool fast = true, typename T>
|
||||
static inline void RngArray(T *array, AuUInt32 length)
|
||||
static inline void RngFillArray(T *array, AuUInt32 length)
|
||||
{
|
||||
if constexpr (fast)
|
||||
{
|
||||
@ -58,6 +58,12 @@ namespace Aurora::RNG
|
||||
}
|
||||
}
|
||||
|
||||
template<bool fast = true, typename T>
|
||||
static inline T &RngFillRange(const T &items)
|
||||
{
|
||||
return RngFillArray<fast>(items.begin(), items.end() - items.begin());
|
||||
}
|
||||
|
||||
template<bool fast = true, typename T>
|
||||
static inline T RngTmpl()
|
||||
{
|
||||
|
@ -261,7 +261,7 @@ namespace Aurora::RNG
|
||||
static void InitFastRng()
|
||||
{
|
||||
AuArray<AuUInt8, 64> maxEntropy;
|
||||
RngArray<false, AuUInt8>(maxEntropy.data(), 64);
|
||||
RngFillArray<false, AuUInt8>(maxEntropy.data(), 64);
|
||||
gWellRand = WELL_SeedRandBig64(maxEntropy);
|
||||
gFastDevice = RandomUnique(RandomDef {false});
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ namespace Aurora::RNG
|
||||
else
|
||||
{
|
||||
this->fast_ = {};
|
||||
RNG::RngArray<false>(this->fast_.state);
|
||||
RNG::RngFillArray<false>(this->fast_.state);
|
||||
}
|
||||
}
|
||||
// secure rng requires no init -> we just passthrough to the global ReadSecureRNG function
|
||||
@ -110,7 +110,7 @@ namespace Aurora::RNG
|
||||
|
||||
AuUInt8 RandomDevice::NextByte()
|
||||
{
|
||||
return NextTmpl<AuUInt8>();
|
||||
return NextFillTmpl<AuUInt8>();
|
||||
}
|
||||
|
||||
bool RandomDevice::NextBoolean()
|
||||
@ -120,12 +120,12 @@ namespace Aurora::RNG
|
||||
|
||||
AuUInt32 RandomDevice::NextU32()
|
||||
{
|
||||
return NextTmpl<AuUInt32>();
|
||||
return NextFillTmpl<AuUInt32>();
|
||||
}
|
||||
|
||||
AuUInt64 RandomDevice::NextU64()
|
||||
{
|
||||
return NextTmpl<AuUInt64>();
|
||||
return NextFillTmpl<AuUInt64>();
|
||||
}
|
||||
|
||||
AuInt32 RandomDevice::NextInt(AuInt32 min, AuInt32 max)
|
||||
|
Loading…
Reference in New Issue
Block a user