diff --git a/include/dwarfs/fs_section.h b/include/dwarfs/fs_section.h index 3eac39c4..6214d7c1 100644 --- a/include/dwarfs/fs_section.h +++ b/include/dwarfs/fs_section.h @@ -22,8 +22,10 @@ #pragma once #include +#include #include #include +#include #include "dwarfs/fstypes.h" @@ -53,6 +55,18 @@ class fs_section { size_t end() const { return start() + length(); } + std::optional section_number() const { + return impl_->section_number(); + } + + std::optional xxh3_64_value() const { + return impl_->xxh3_64_value(); + } + + std::optional> sha2_512_256_value() const { + return impl_->sha2_512_256_value(); + } + class impl { public: virtual ~impl() = default; @@ -68,6 +82,9 @@ class fs_section { virtual bool check_fast(mmif const& mm) const = 0; virtual bool verify(mmif const& mm) const = 0; virtual std::span data(mmif const& mm) const = 0; + virtual std::optional section_number() const = 0; + virtual std::optional xxh3_64_value() const = 0; + virtual std::optional> sha2_512_256_value() const = 0; }; private: diff --git a/src/dwarfs/fs_section.cpp b/src/dwarfs/fs_section.cpp index 7aaf7558..27d7ae17 100644 --- a/src/dwarfs/fs_section.cpp +++ b/src/dwarfs/fs_section.cpp @@ -105,6 +105,18 @@ class fs_section_v1 final : public fs_section::impl { return mm.span(start_, hdr_.length); } + std::optional section_number() const override { + return std::nullopt; + } + + std::optional xxh3_64_value() const override { + return std::nullopt; + } + + std::optional> sha2_512_256_value() const override { + return std::nullopt; + } + private: size_t start_; section_header hdr_; @@ -162,6 +174,19 @@ class fs_section_v2 final : public fs_section::impl { return mm.span(start_, hdr_.length); } + std::optional section_number() const override { + return hdr_.number; + } + + std::optional xxh3_64_value() const override { + return hdr_.xxh3_64; + } + + std::optional> sha2_512_256_value() const override { + return std::vector(hdr_.sha2_512_256, + hdr_.sha2_512_256 + sizeof(hdr_.sha2_512_256)); + } + private: size_t start_; section_header_v2 hdr_; @@ -203,6 +228,18 @@ class fs_section_v2_lazy final : public fs_section::impl { return section().data(mm); } + std::optional section_number() const override { + return section().section_number(); + } + + std::optional xxh3_64_value() const override { + return section().xxh3_64_value(); + } + + std::optional> sha2_512_256_value() const override { + return section().sha2_512_256_value(); + } + private: fs_section::impl const& section() const;