#include "literal.h"
#include "random.h"
namespace wasm {
Random::Random(std::vector<char>&& bytes_, FeatureSet features)
: bytes(std::move(bytes_)), features(features) {
if (bytes.empty()) {
bytes.push_back(0);
}
}
int8_t Random::get() {
if (pos == bytes.size()) {
finishedInput = true;
pos = 0;
xorFactor++;
}
return bytes[pos++] ^ xorFactor;
}
int16_t Random::get16() {
auto temp = uint16_t(get()) << 8;
return temp | uint16_t(get());
}
int32_t Random::get32() {
auto temp = uint32_t(get16()) << 16;
return temp | uint32_t(get16());
}
int64_t Random::get64() {
auto temp = uint64_t(get32()) << 32;
return temp | uint64_t(get32());
}
float Random::getFloat() { return Literal(get32()).reinterpretf32(); }
double Random::getDouble() { return Literal(get64()).reinterpretf64(); }
uint32_t Random::upTo(uint32_t x) {
if (x == 0) {
return 0;
}
uint32_t raw;
if (x <= 255) {
raw = get();
} else if (x <= 65535) {
raw = get16();
} else {
raw = get32();
}
auto ret = raw % x;
xorFactor += raw / x;
return ret;
}
}