From 2e76e1384fbf347a16b752d2cfd1d8b1a794569b Mon Sep 17 00:00:00 2001 From: Joel Rosdahl Date: Sun, 11 Sep 2022 15:36:13 +0200 Subject: [PATCH] feat: Print result format version and no of files in --inspect --- src/core/Result.cpp | 29 ++++++++++++++++++----------- src/core/Result.hpp | 13 +++++++++++++ src/core/ResultInspector.cpp | 7 +++++++ src/core/ResultInspector.hpp | 2 ++ 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/core/Result.cpp b/src/core/Result.cpp index e2733778c..e1da64577 100644 --- a/src/core/Result.cpp +++ b/src/core/Result.cpp @@ -176,22 +176,29 @@ Deserializer::Deserializer(nonstd::span data) : m_data(data) void Deserializer::visit(Deserializer::Visitor& visitor) const { + Header header; + CacheEntryDataReader reader(m_data); - const auto result_format_version = reader.read_int(); - if (result_format_version != k_format_version) { + header.format_version = reader.read_int(); + 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(); - 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(); + 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(); switch (marker) { case k_embedded_file_marker: @@ -215,9 +222,9 @@ Deserializer::visit(Deserializer::Visitor& visitor) const } } - 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)); } } diff --git a/src/core/Result.hpp b/src/core/Result.hpp index 805bcd0f8..b1d0fcc79 100644 --- a/src/core/Result.hpp +++ b/src/core/Result.hpp @@ -95,11 +95,19 @@ public: // Read a result from `data`. Deserializer(nonstd::span 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 data) = 0; @@ -118,6 +126,11 @@ private: 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 { diff --git a/src/core/ResultInspector.cpp b/src/core/ResultInspector.cpp index 3ef88c6f9..b27a3f1d3 100644 --- a/src/core/ResultInspector.cpp +++ b/src/core/ResultInspector.cpp @@ -28,6 +28,13 @@ ResultInspector::ResultInspector(FILE* stream) : m_stream(stream) { } +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, diff --git a/src/core/ResultInspector.hpp b/src/core/ResultInspector.hpp index 94a9b8c67..9fdd9d32f 100644 --- a/src/core/ResultInspector.hpp +++ b/src/core/ResultInspector.hpp @@ -31,6 +31,8 @@ class ResultInspector : public Result::Deserializer::Visitor 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 data) override; -- 2.47.2