13 #ifndef LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_
14 #define LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_
21 #include <initializer_list>
23 #include <type_traits>
41 template <
typename T> std::vector<T>
ConsumeBytes(
size_t num_bytes) {
43 return ConsumeBytes<T>(num_bytes, num_bytes);
54 std::vector<T>
result = ConsumeBytes<T>(num_bytes + 1, num_bytes);
55 result.back() = terminator;
65 "ConsumeBytesAsString cannot convert the data to a string.");
81 static_assert(
sizeof(
T) <=
sizeof(
uint64_t),
"Unsupported integral type.");
166 template <
typename T,
size_t size>
168 static_assert(
size > 0,
"The array must be non empty.");
169 return array[ConsumeIntegralInRange<size_t>(0,
size - 1)];
172 template <
typename T>
178 return *(list.begin() + ConsumeIntegralInRange<size_t>(0, list.size() - 1));
186 return static_cast<T>(ConsumeIntegralInRange<uint32_t>(
187 0,
static_cast<uint32_t>(T::kMaxValue)));
194 "A floating point type is required.");
202 T result =
static_cast<T>(ConsumeIntegral<IntegralType>());
211 return ConsumeFloatingPointInRange<T>(std::numeric_limits<T>::lowest(),
224 constexpr
T zero(.0);
255 template <
typename T>
257 static_assert(
sizeof(
T) ==
sizeof(
uint8_t),
"Incompatible data type.");
267 if (num_bytes_to_consume != 0)
283 static_assert(
sizeof(TS) ==
sizeof(TU),
"Incompatible data types.");
284 static_assert(!std::numeric_limits<TU>::is_signed,
285 "Source type must be unsigned.");
288 if (std::numeric_limits<TS>::is_modulo)
289 return static_cast<TS
>(
value);
294 return static_cast<TS
>(
value);
297 return TS_min +
static_cast<char>(
value - TS_min);
305 #endif // LLVM_FUZZER_FUZZED_DATA_PROVIDER_H_