void
Deserializer::visit(Deserializer::Visitor& visitor) const
{
+ Header header;
+
CacheEntryDataReader reader(m_data);
- const auto result_format_version = reader.read_int<uint8_t>();
- if (result_format_version != k_format_version) {
+ header.format_version = reader.read_int<uint8_t>();
+ if (header.format_version != k_format_version) {
+ visitor.on_header(header);
throw Error(FMT("Unknown result format version: {} != {}",
- result_format_version,
+ header.format_version,
k_format_version));
}
- const auto n_files = reader.read_int<uint8_t>();
- if (n_files >= k_max_raw_file_entries) {
- throw Error(FMT(
- "Too many raw file entries: {} > {}", n_files, k_max_raw_file_entries));
+ header.n_files = reader.read_int<uint8_t>();
+ if (header.n_files >= k_max_raw_file_entries) {
+ visitor.on_header(header);
+ throw Error(FMT("Too many raw file entries: {} > {}",
+ header.n_files,
+ k_max_raw_file_entries));
}
+ visitor.on_header(header);
+
uint8_t file_number;
- for (file_number = 0; file_number < n_files; ++file_number) {
+ for (file_number = 0; file_number < header.n_files; ++file_number) {
const auto marker = reader.read_int<uint8_t>();
switch (marker) {
case k_embedded_file_marker:
}
}
- if (file_number != n_files) {
- throw Error(
- FMT("Too few entries (read {}, expected {})", file_number, n_files));
+ if (file_number != header.n_files) {
+ throw Error(FMT(
+ "Too few entries (read {}, expected {})", file_number, header.n_files));
}
}
// Read a result from `data`.
Deserializer(nonstd::span<const uint8_t> data);
+ struct Header
+ {
+ uint8_t format_version = 0;
+ uint8_t n_files = 0;
+ };
+
class Visitor
{
public:
virtual ~Visitor() = default;
+ virtual void on_header(const Header& header);
+
virtual void on_embedded_file(uint8_t file_number,
FileType file_type,
nonstd::span<const uint8_t> data) = 0;
uint8_t file_number) const;
};
+inline void
+Deserializer::Visitor::on_header(const Header& /*header*/)
+{
+}
+
// This class knows how to serialize a result cache entry.
class Serializer : public core::Serializer
{
{
}
+void
+ResultInspector::on_header(const Result::Deserializer::Header& header)
+{
+ PRINT(m_stream, "Result format version: {}\n", header.format_version);
+ PRINT(m_stream, "Number of files: {}\n", header.n_files);
+}
+
void
ResultInspector::on_embedded_file(uint8_t file_number,
Result::FileType file_type,
public:
ResultInspector(FILE* stream);
+ void on_header(const Result::Deserializer::Header& header) override;
+
void on_embedded_file(uint8_t file_number,
Result::FileType file_type,
nonstd::span<const uint8_t> data) override;