#pragma once
#include "../support/attributes.h"
#include <stdint.h>
class kiss99
{
uint32_t z = 362436069;
uint32_t w = 521288629;
uint32_t jsr = 123456789;
uint32_t jcong = 380116160;
public:
kiss99() noexcept = default;
kiss99(uint32_t _z, uint32_t _w, uint32_t _jsr, uint32_t _jcong) noexcept
: z{_z}, w{_w}, jsr{_jsr}, jcong{_jcong}
{}
NO_SANITIZE("unsigned-integer-overflow")
uint32_t operator()() noexcept
{
z = 36969 * (z & 0xffff) + (z >> 16);
w = 18000 * (w & 0xffff) + (w >> 16);
jcong = 69069 * jcong + 1234567;
jsr ^= (jsr << 17);
jsr ^= (jsr >> 13);
jsr ^= (jsr << 5);
return (((z << 16) + w) ^ jcong) + jsr;
}
};