13#ifndef LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_
14#define LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_
23#include <initializer_list>
77 template <
typename T,
size_t size>
138 static_assert(
sizeof(std::string::value_type) ==
sizeof(
uint8_t),
139 "ConsumeBytesAsString cannot convert the data to a string.");
176 result.shrink_to_fit();
197 std::numeric_limits<T>::max());
206 static_assert(std::is_integral_v<T>,
"An integral type is required.");
207 static_assert(
sizeof(
T) <=
sizeof(
uint64_t),
"Unsupported integral type.");
231 if (
range != std::numeric_limits<
decltype(
range)>::max())
232 result = result % (
range + 1);
234 return static_cast<T>(
static_cast<uint64_t>(min) + result);
242 std::numeric_limits<T>::max());
255 constexpr T zero(.0);
260 range = (max / 2.0) - (min / 2.0);
274 static_assert(std::is_floating_point_v<T>,
275 "A floating point type is required.");
284 result /=
static_cast<T>(std::numeric_limits<IntegralType>::max());
297 static_assert(std::is_enum_v<T>,
"|T| must be an enum type.");
298 return static_cast<T>(
303template <
typename T,
size_t size>
305 static_assert(size > 0,
"The array must be non empty.");
309template <
typename T,
size_t size>
311 static_assert(size > 0,
"The array must be non empty.");
353 static_assert(
sizeof(
T) ==
sizeof(
uint8_t),
"Incompatible data type.");
361 std::vector<T> result(size);
373 result.shrink_to_fit();
377template <
typename TS,
typename TU>
379 static_assert(
sizeof(
TS) ==
sizeof(
TU),
"Incompatible data types.");
380 static_assert(!std::numeric_limits<TU>::is_signed,
381 "Source type must be unsigned.");
383 if constexpr (std::numeric_limits<TS>::is_modulo)
384 return static_cast<TS>(value);
388 constexpr auto TS_max =
static_cast<TU>(std::numeric_limits<TS>::max());
390 return static_cast<TS>(value);
392 constexpr auto TS_min = std::numeric_limits<TS>::min();
void Advance(size_t num_bytes)
std::vector< T > ConsumeBytesWithTerminator(size_t num_bytes, T terminator=0)
std::string ConsumeBytesAsString(size_t num_bytes)
std::vector< T > ConsumeBytes(size_t num_bytes)
T ConsumeIntegralInRange(T min, T max)
TS ConvertUnsignedToSigned(TU value)
const uint8_t * data_ptr_
size_t ConsumeData(void *destination, size_t num_bytes)
std::vector< T > ConsumeRemainingBytes()
T PickValueInArray(const T(&array)[size])
T ConsumeFloatingPointInRange(T min, T max)
std::string ConsumeRandomLengthString()
FuzzedDataProvider & operator=(const FuzzedDataProvider &)=delete
void CopyAndAdvance(void *destination, size_t num_bytes)
std::string ConsumeRemainingBytesAsString()
FuzzedDataProvider(const FuzzedDataProvider &)=delete
FuzzedDataProvider(const uint8_t *data, size_t size)
~FuzzedDataProvider()=default
#define T(expected, seed, data)
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.