You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rngxx/include/rngxx.h

90 lines
1.8 KiB

// C api for rngxx
#ifndef _RNGXX_H
#define _RNGXX_H
#ifndef _RNGXX_IMPL
#define _RNGXX_COMMON_MINIMAL
#endif
#include "rngxx/internal/common.h"
#ifndef _RNGXX_IMPL
#undef _RNGXX_COMMON_MINIMAL
#endif
#ifdef __cplusplus
#ifndef _RNGXX_IMPL_ONLY_TYPES
#warning "C++ compilers might not like this header file. Please use the C++ interface for C++ TUs"
#endif
extern "C" {
#endif
// -- C API types -- (C++ compat)
typedef struct Random rng_t;
enum rng_kind {
RNG_KIND_CRAND,
};
enum rng_next_flag {
RNG_TYQ_SIGNED = 0, // Binary with `unsigned`.
RNG_TYQ_UNSIGNED = 1 << 0,
RNG_TYQ_CHAOS = 1 << 1,
}; // 2 bits
typedef int rng_bool_t;
enum rng_next_type {
RNG_TY_BLOB = 0,
RNG_TY_BOOL, // Expects type `rng_bool_t`.
RNG_TY_INT8,
RNG_TY_INT16,
RNG_TY_INT32,
RNG_TY_INT64,
RNG_TY_F32,
RNG_TY_F64,
}; // 4 bits
struct rng_next_opt {
union {
// Bounded types
struct {
const void* restrict pmin;
const void* restrict pmax;
} range;
// Blob types
size_t len;
} bound;
struct {
enum rng_next_type type : 4;
enum rng_next_flag mod : 2;
uint8_t _unused : 2;
} ty; // 8 bits
};
typedef __typeof( ((struct rng_next_opt*)NULL)->ty ) rng_next_tyq; // Qualified type
// -- // --
#ifndef _RNGXX_IMPL_ONLY_TYPES
// -- C API functions -- (C++ NO compat)
int rng_raw(rng_t* engine, void* restrict output, struct rng_next_opt opt);
void rng_next_bin(rng_t* engine, unsigned char* restrict output, size_t n);
void* rng_next_ty(rng_t* engine, void* restrict output, enum rng_next_type ty, enum rng_next_flag flags);
void* rng_next_tyb(rng_t* engine, void* restrict output, enum rng_next_type ty, enum rng_next_flag flags, const void* pmin, const void* pmax);
rng_t* rng_new(enum rng_kind kind, const u64 seed[static restrict 1]);
void rng_free(rng_t* rng);
// -- // --
#endif
#ifdef __cplusplus
}
#endif
#endif /* _RNGXX_H */