From d9e34e7e70b827fd3037c3f8adac519e5c8845b3 Mon Sep 17 00:00:00 2001 From: Avril Date: Sat, 6 Nov 2021 00:02:26 +0000 Subject: [PATCH] Start: Seeding API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fortune for rngxx's current commit: Half curse − 半凶 --- include/rngxx/internal/seed.h | 31 +++++++++++++++++++++++++++++++ src/iter.cpp | 10 ---------- src/seed.cpp | 13 +++++++++++++ 3 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 include/rngxx/internal/seed.h delete mode 100644 src/iter.cpp create mode 100644 src/seed.cpp diff --git a/include/rngxx/internal/seed.h b/include/rngxx/internal/seed.h new file mode 100644 index 0000000..24a6711 --- /dev/null +++ b/include/rngxx/internal/seed.h @@ -0,0 +1,31 @@ +#pragma once + +#include "common.h" + +namespace rng +{ + template + struct seed_gen + { + virtual T generate_seed() = 0; + + inline virtual ~seed_gen(){} + }; + + namespace seed + { + typedef u64 sm128r[2]; + struct sm128 { + sm128r m_raw; + }; + + struct splitmix64 : public virtual seed_gen + { + splitmix64(u64 i); + + sm128 generate_seed() override; + private: + sm128r m_state; + }; + } +} diff --git a/src/iter.cpp b/src/iter.cpp deleted file mode 100644 index 65d5824..0000000 --- a/src/iter.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include - -//XXX: Doing this is not going to work ... -#if 0 -void t(Random& r) -{ - for(auto&& i : r.iter()) (void)i; -} -#endif - diff --git a/src/seed.cpp b/src/seed.cpp new file mode 100644 index 0000000..21537cf --- /dev/null +++ b/src/seed.cpp @@ -0,0 +1,13 @@ +#include + +extern "C" { + // TODO: XXX: how to return a god damn array without typedef ffs???? + extern u64 (*sm64_compute[2])(u64, u64); +} + +namespace rng::seed +{ + splitmix64::splitmix64(u64 u) : m_state(sm64_compute(u, 0)){} + + sm128 splitmix64::generate_seed() { return sm128 { m_state = sm64_compute(m_state[0], m_state[1]) }; } +}