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
 |