#include #include #include inline unsigned char RNG::byte() { return (unsigned char)next_int(255); } void RNG::bytes(unsigned char* ptr, std::size_t len) { for(std::size_t i=0;i #include namespace { // C interface using namespace std; #define extract_ptr(ptr) ((RNG*)(ptr)) static inline RNG& extract_ref(rng_t rng) { return *extract_ptr(rng); } template static inline T* extract_downcast_ptr(rng_t rng) { return dynamic_cast(extract_ptr(rng)); } extern "C" { rng_t rng_new(rng_init_opt opt) { switch(opt.kind) { case RNG_KIND_FRNG: return (rng_t) new rng::frng(opt.init.frng.state); case RNG_KIND_DRNG: return (rng_t) new rng::drng(opt.init.drng.state); case RNG_KIND_XORNG: return (rng_t) new rng::xoroshiro128plus(opt.init.xorng.state); default: panic("Unknown RNG init opt: %d", opt.kind); } return nullptr; } void rng_free(rng_t rng) { RNG* ptr = (RNG*)rng; delete ptr; } void rng_test_spec(rng_t rng) { cout << "rng_test_spec:" << endl; rng::test_algo(std::move(extract_ref(rng))); } } }