#pragma once #include "foundation/result.h" #include #include #include #include namespace pp::foundation { class ByteReader { public: explicit ByteReader(std::span bytes) noexcept; [[nodiscard]] std::size_t position() const noexcept; [[nodiscard]] std::size_t size() const noexcept; [[nodiscard]] std::size_t remaining() const noexcept; [[nodiscard]] bool empty() const noexcept; [[nodiscard]] Status seek(std::size_t position) noexcept; [[nodiscard]] Result read_u8() noexcept; [[nodiscard]] Result read_u16_le() noexcept; [[nodiscard]] Result read_u32_le() noexcept; [[nodiscard]] Result> read_bytes(std::size_t count) noexcept; private: std::span bytes_; std::size_t position_ = 0; }; class ByteWriter { public: explicit ByteWriter(std::vector& bytes) noexcept; [[nodiscard]] std::size_t size() const noexcept; [[nodiscard]] Status write_u8(std::uint8_t value); [[nodiscard]] Status write_u16_le(std::uint16_t value); [[nodiscard]] Status write_u32_le(std::uint32_t value); [[nodiscard]] Status write_bytes(std::span bytes); private: std::vector* bytes_ = nullptr; }; }