13cab2bb3Spatrick //===- FuzzerRandom.h - Internal header for the Fuzzer ----------*- C++ -* ===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // fuzzer::Random 93cab2bb3Spatrick //===----------------------------------------------------------------------===// 103cab2bb3Spatrick 113cab2bb3Spatrick #ifndef LLVM_FUZZER_RANDOM_H 123cab2bb3Spatrick #define LLVM_FUZZER_RANDOM_H 133cab2bb3Spatrick 143cab2bb3Spatrick #include <random> 153cab2bb3Spatrick 163cab2bb3Spatrick namespace fuzzer { 173cab2bb3Spatrick class Random : public std::minstd_rand { 183cab2bb3Spatrick public: Random(unsigned int seed)193cab2bb3Spatrick Random(unsigned int seed) : std::minstd_rand(seed) {} operator()203cab2bb3Spatrick result_type operator()() { return this->std::minstd_rand::operator()(); } 21*d89ec533Spatrick template <typename T> Rand()22*d89ec533Spatrick typename std::enable_if<std::is_integral<T>::value, T>::type Rand() { 23*d89ec533Spatrick return static_cast<T>(this->operator()()); 24*d89ec533Spatrick } RandBool()25*d89ec533Spatrick size_t RandBool() { return this->operator()() % 2; } SkewTowardsLast(size_t n)263cab2bb3Spatrick size_t SkewTowardsLast(size_t n) { 273cab2bb3Spatrick size_t T = this->operator()(n * n); 28*d89ec533Spatrick size_t Res = static_cast<size_t>(sqrt(T)); 293cab2bb3Spatrick return Res; 303cab2bb3Spatrick } 31*d89ec533Spatrick template <typename T> operator()32*d89ec533Spatrick typename std::enable_if<std::is_integral<T>::value, T>::type operator()(T n) { 33*d89ec533Spatrick return n ? Rand<T>() % n : 0; 34*d89ec533Spatrick } 35*d89ec533Spatrick template <typename T> 36*d89ec533Spatrick typename std::enable_if<std::is_integral<T>::value, T>::type operator()37*d89ec533Spatrick operator()(T From, T To) { 383cab2bb3Spatrick assert(From < To); 39*d89ec533Spatrick auto RangeSize = static_cast<unsigned long long>(To) - 40*d89ec533Spatrick static_cast<unsigned long long>(From) + 1; 41*d89ec533Spatrick return static_cast<T>(this->operator()(RangeSize) + From); 423cab2bb3Spatrick } 433cab2bb3Spatrick }; 443cab2bb3Spatrick 453cab2bb3Spatrick } // namespace fuzzer 463cab2bb3Spatrick 473cab2bb3Spatrick #endif // LLVM_FUZZER_RANDOM_H 48