#include #include namespace lt::test { class FuzzDataProvider { public: FuzzDataProvider(const uint8_t *data, size_t size): m_data(data, size) { } template requires( std::is_trivially_constructible_v // && std::is_trivially_copy_constructible_v // && std::is_trivially_copy_assignable_v ) auto consume() -> std::optional { 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 { 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 m_data; }; } // namespace lt::test