11188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//===- FuzzerRandom.h - Internal header for the Fuzzer ----------*- C++ -* ===//
21188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//
31188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//                     The LLVM Compiler Infrastructure
41188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//
51188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker// This file is distributed under the University of Illinois Open Source
61188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker// License. See LICENSE.TXT for details.
71188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//
81188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//===----------------------------------------------------------------------===//
91188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker// fuzzer::Random
101188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker//===----------------------------------------------------------------------===//
111188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
121188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#ifndef LLVM_FUZZER_RANDOM_H
131188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#define LLVM_FUZZER_RANDOM_H
141188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
151188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#include <random>
161188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
171188dcf30923cb444143ffa4b83dc951037e76agitbuildkickernamespace fuzzer {
181188dcf30923cb444143ffa4b83dc951037e76agitbuildkickerclass Random {
191188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker public:
201188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  Random(unsigned int seed) : R(seed) {}
211188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  size_t Rand() { return R(); }
221188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  size_t RandBool() { return Rand() % 2; }
231188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  size_t operator()(size_t n) { return n ? Rand() % n : 0; }
241188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  intptr_t operator()(intptr_t From, intptr_t To) {
251188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker    assert(From < To);
261188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker    intptr_t RangeSize = To - From + 1;
271188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker    return operator()(RangeSize) + From;
281188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  }
291188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  std::mt19937 &Get_mt19937() { return R; }
301188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker private:
311188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker  std::mt19937 R;
321188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker};
331188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
341188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker}  // namespace fuzzer
351188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker
361188dcf30923cb444143ffa4b83dc951037e76agitbuildkicker#endif  // LLVM_FUZZER_RANDOM_H
37