|  | // Copyright 2021 The Tint Authors. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef SRC_TINT_FUZZERS_RANDOM_GENERATOR_H_ | 
|  | #define SRC_TINT_FUZZERS_RANDOM_GENERATOR_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <random> | 
|  | #include <vector> | 
|  |  | 
|  | #include "src/tint/fuzzers/random_generator_engine.h" | 
|  |  | 
|  | namespace tint::fuzzers { | 
|  |  | 
|  | /// Pseudo random generator utility class for fuzzing | 
|  | class RandomGenerator { | 
|  | public: | 
|  | /// @brief Initializes using provided engine | 
|  | /// @param engine - engine implementation to use | 
|  | explicit RandomGenerator(std::unique_ptr<RandomGeneratorEngine> engine); | 
|  |  | 
|  | /// @brief Creates a MersenneTwisterEngine and initializes using that | 
|  | /// @param seed - seed value to use for engine | 
|  | explicit RandomGenerator(uint64_t seed); | 
|  |  | 
|  | /// Destructor | 
|  | ~RandomGenerator() = default; | 
|  |  | 
|  | /// Move Constructor | 
|  | RandomGenerator(RandomGenerator&&) = default; | 
|  |  | 
|  | /// Get uint32_t value from uniform distribution. | 
|  | /// @param lower - lower bound of integer generated | 
|  | /// @param upper - upper bound of integer generated | 
|  | /// @returns i, where lower <= i < upper | 
|  | uint32_t GetUInt32(uint32_t lower, uint32_t upper); | 
|  |  | 
|  | /// Get uint32_t value from uniform distribution. | 
|  | /// @param bound - Upper bound of integer generated | 
|  | /// @returns i, where 0 <= i < bound | 
|  | uint32_t GetUInt32(uint32_t bound); | 
|  |  | 
|  | /// Get uint32_t value from uniform distribution. | 
|  | /// @param lower - lower bound of integer generated | 
|  | /// @param upper - upper bound of integer generated | 
|  | /// @returns i, where lower <= i < upper | 
|  | uint64_t GetUInt64(uint64_t lower, uint64_t upper); | 
|  |  | 
|  | /// Get uint64_t value from uniform distribution. | 
|  | /// @param bound - Upper bound of integer generated | 
|  | /// @returns i, where 0 <= i < bound | 
|  | uint64_t GetUInt64(uint64_t bound); | 
|  |  | 
|  | /// Get 1 byte of pseudo-random data | 
|  | /// Should be more efficient then calling GetNBytes(1); | 
|  | /// @returns 1-byte of random data | 
|  | uint8_t GetByte(); | 
|  |  | 
|  | /// Get 4 bytes of pseudo-random data | 
|  | /// Should be more efficient then calling GetNBytes(4); | 
|  | /// @returns 4-bytes of random data | 
|  | uint32_t Get4Bytes(); | 
|  |  | 
|  | /// Get N bytes of pseudo-random data | 
|  | /// @param dest - memory location to store data | 
|  | /// @param n - number of bytes of data to get | 
|  | void GetNBytes(uint8_t* dest, size_t n); | 
|  |  | 
|  | /// Get random bool with even odds | 
|  | /// @returns true 50% of the time and false %50 of time. | 
|  | bool GetBool(); | 
|  |  | 
|  | /// Get random bool with weighted odds | 
|  | /// @param percentage - likelihood of true being returned | 
|  | /// @returns true |percentage|% of the time, and false (100 - |percentage|)% | 
|  | /// of the time. | 
|  | bool GetWeightedBool(uint32_t percentage); | 
|  |  | 
|  | /// Returns a randomly-chosen element from vector v. | 
|  | /// @param v - the vector from which the random element will be selected. | 
|  | /// @return a random element of vector v. | 
|  | template <typename T> | 
|  | inline T GetRandomElement(const std::vector<T>& v) { | 
|  | return v[GetUInt64(0, v.size())]; | 
|  | } | 
|  |  | 
|  | /// Calculate a seed value based on a blob of data. | 
|  | /// Currently hashes bytes near the front of the buffer, after skipping N | 
|  | /// bytes. | 
|  | /// @param data - pointer to data to base calculation off of, must be !nullptr | 
|  | /// @param size - number of elements in |data|, must be > 0 | 
|  | /// @returns calculated seed value | 
|  | static uint64_t CalculateSeed(const uint8_t* data, size_t size); | 
|  |  | 
|  | private: | 
|  | // Disallow copy & assign | 
|  | RandomGenerator(const RandomGenerator&) = delete; | 
|  | RandomGenerator& operator=(const RandomGenerator&) = delete; | 
|  |  | 
|  | std::unique_ptr<RandomGeneratorEngine> engine_; | 
|  | };  // class RandomGenerator | 
|  |  | 
|  | }  // namespace tint::fuzzers | 
|  |  | 
|  | #endif  // SRC_TINT_FUZZERS_RANDOM_GENERATOR_H_ |