62 lines
1.1 KiB
C++
62 lines
1.1 KiB
C++
#include <cstring>
|
|
#include <test/test.hpp>
|
|
|
|
namespace lt::test {
|
|
|
|
class FuzzDataProvider
|
|
{
|
|
public:
|
|
FuzzDataProvider(const uint8_t *data, size_t size): m_data(data, size)
|
|
{
|
|
}
|
|
|
|
template<typename T>
|
|
requires(
|
|
std::is_trivially_constructible_v<T> //
|
|
&& std::is_trivially_copy_constructible_v<T> //
|
|
&& std::is_trivially_copy_assignable_v<T>
|
|
)
|
|
|
|
auto consume() -> std::optional<T>
|
|
{
|
|
if (m_data.size() < sizeof(T))
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
T value;
|
|
std::memcpy(&value, m_data.data(), sizeof(T));
|
|
|
|
m_data = m_data.subspan(sizeof(T));
|
|
return value;
|
|
}
|
|
|
|
auto consume_string(size_t size) -> std::optional<std::string>
|
|
{
|
|
if (m_data.size() < size)
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
// NOLINTNEXTLINE
|
|
auto value = std::string { (const char *)m_data.data(), size };
|
|
m_data = m_data.subspan(size);
|
|
|
|
return value;
|
|
}
|
|
|
|
auto consume_remaining_as_string() -> std::string
|
|
{
|
|
if (m_data.empty())
|
|
{
|
|
return std::string {};
|
|
}
|
|
|
|
return { m_data.begin(), m_data.end() };
|
|
};
|
|
|
|
private:
|
|
std::span<const uint8_t> m_data;
|
|
};
|
|
|
|
} // namespace lt::test
|