Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_rand.h
Go to the documentation of this file.
1
14#ifndef VL_RAND_H
15#define VL_RAND_H
16
17#include <string.h>
18
19#include "vl_memory.h"
20#include "vl_numtypes.h"
21
29typedef vl_ularge_t vl_rand;
30
40VL_API vl_rand vlRandInit(void);
41
51VL_API vl_rand vlRandNext(vl_rand* rand);
52
53#ifndef VL_H_RANDOM_SPLIT
64static inline void vlRandSplitBytes(vl_rand* randPtr, void* resultPtr)
65{
66 const vl_ularge_t tmp = vlRandNext(randPtr);
67 memcpy(resultPtr, &tmp, sizeof(tmp));
68}
69#define VL_H_RANDOM_SPLIT(randPtr, resultPtr) (vlRandSplitBytes((randPtr), (resultPtr)))
70#endif
71
83VL_API void vlRandFill(vl_rand* rand, void* mem, vl_ularge_t len);
84
85#ifdef VL_U8_T
94#define vlRandUInt8(randPtr) (vl_uint8_t)(vlRandNext(randPtr))
95
96#ifdef VL_U64_T
104#define vlRandUInt8x8(randPtr, resultPtr) VL_H_RANDOM_SPLIT(randPtr, resultPtr)
105#elif defined VL_U32_T
113#define vlRandUInt8x8(randPtr, resultPtr) \
114 VL_H_RANDOM_SPLIT(randPtr, resultPtr); \
115 VL_H_RANDOM_SPLIT(randPtr, ((VL_U8_T*)(resultPtr)) + 4)
116#endif
117#endif
118
119#ifdef VL_U16_T
129#define vlRandUInt16(randPtr) (vl_uint16_t)(vlRandNext(randPtr))
130
131#ifdef VL_U64_T
141#define vlRandUInt16x4(randPtr, resultPtr) VL_H_RANDOM_SPLIT(randPtr, resultPtr)
142#elif defined VL_U32_T
152#define vlRandUInt16x4(randPtr, resultPtr) \
153 VL_H_RANDOM_SPLIT(randPtr, resultPtr); \
154 VL_H_RANDOM_SPLIT(randPtr, ((VL_U16_T*)(resultPtr)) + 2)
155#endif
156#endif
157
158#ifdef VL_U32_T
168#define vlRandUInt32(randPtr) (vl_uint32_t)(vlRandNext(randPtr))
169
170#ifdef VL_U64_T
180#define vlRandUInt32x2(randPtr, resultPtr) VL_H_RANDOM_SPLIT(randPtr, resultPtr)
181#else
191#define vlRandUInt32x2(randPtr, resultPtr) \
192 VL_H_RANDOM_SPLIT(randPtr, resultPtr); \
193 VL_H_RANDOM_SPLIT(randPtr, ((VL_U32_T*)(resultPtr) + 1))
194#endif
195#endif
196
197#ifdef VL_U64_T
198
208#define vlRandUInt64(randPtr) (vl_uint64_t)(vlRandNext(randPtr))
209#endif
210
211#ifdef VL_I8_T
212
222VL_API vl_int8_t vlRandInt8(vl_rand* rand);
223
224#ifdef VL_U64_T
234#define vlRandInt8x8(randPtr, resultPtr) VL_H_RANDOM_SPLIT(randPtr, resultPtr)
235#elif defined VL_U32_T
245#define vlRandInt8x8(randPtr, resultPtr) \
246 VL_H_RANDOM_SPLIT(randPtr, resultPtr); \
247 VL_H_RANDOM_SPLIT(randPtr, ((VL_I8_T*)(resultPtr) + 4)
248#endif
249#endif
250
251#ifdef VL_I16_T
252
261VL_API vl_int16_t vlRandInt16(vl_rand* rand);
262
263#ifdef VL_U64_T
273#define vlRandInt16x4(randPtr, resultPtr) VL_H_RANDOM_SPLIT(randPtr, resultPtr)
274#elif defined VL_U32_T
275
285#define vlRandInt16x4(randPtr, resultPtr) \
286 VL_H_RANDOM_SPLIT(randPtr, resultPtr); \
287 VL_H_RANDOM_SPLIT(randPtr, (VL_I16_T)(resultPtr) + 2)
288#endif
289#endif
290
291#ifdef VL_I32_T
292
301VL_API vl_int32_t vlRandInt32(vl_rand* rand);
302
303#ifdef VL_I64_T
313#define vlRandInt32x2(randPtr, resultPtr) VL_H_RANDOM_SPLIT(randPtr, resultPtr)
314#elif defined VL_I32_T
324#define vlRandInt32x2(randPtr, resultPtr) \
325 VL_H_RANDOM_SPLIT(randPtr, resultPtr); \
326 VL_H_RANDOM_SPLIT(randPtr, ((VL_I32_T*)(resultPtr)) + 1)
327#endif
328#endif
329
330#ifdef VL_I64_T
331
341VL_API vl_int64_t vlRandInt64(vl_rand* rand);
342
343#endif
344
354VL_API vl_float32_t vlRandF(vl_rand* randPtr);
355
365VL_API void vlRandFx2(vl_rand* randPtr, vl_float32_t* resultPtr);
366
377#define vlRandFx4(randPtr, resultPtr) \
378 vlRandFx2(randPtr, (vl_float32_t*)(resultPtr)); \
379 vlRandFx2(randPtr, ((vl_float32_t*)(resultPtr)) + 2)
380
390VL_API vl_float64_t vlRandD(vl_rand* randPtr);
391
392#endif // VL_RAND_H
VL_F32_T vl_float32_t
32-bit floating point number type.
Definition vl_numtypes.h:173
VL_ULARGE_T vl_ularge_t
Largest available unsigned integer type.
Definition vl_numtypes.h:136
VL_API void vlRandFill(vl_rand *rand, void *mem, vl_ularge_t len)
Fills the specified region of memory with random bytes.
VL_API vl_rand vlRandInit(void)
Initializes a random state (aka, seed) based on the current time.
Definition vl_rand.c:46
VL_API vl_float64_t vlRandD(vl_rand *randPtr)
Generate a random double.
VL_API vl_float32_t vlRandF(vl_rand *randPtr)
Generate a random float.
Definition vl_rand.c:164
VL_API void vlRandFx2(vl_rand *randPtr, vl_float32_t *resultPtr)
Generates two random floats.
Definition vl_rand.c:175
VL_API vl_rand vlRandNext(vl_rand *rand)
Returns the "next" 64-bit integer.
Definition vl_rand.c:53