Program Listing for File byte_stream.hpp

Return to documentation for file (inexor/vulkan-renderer/io/byte_stream.hpp)

#pragma once

#include <filesystem>
#include <vector>

namespace inexor::vulkan_renderer::io {

class ByteStream {
protected:
    std::vector<std::uint8_t> m_buffer;

    [[nodiscard]] static std::vector<std::uint8_t> read_file(const std::filesystem::path &path);

public:
    ByteStream() = default;
    explicit ByteStream(std::vector<std::uint8_t> buffer);
    explicit ByteStream(const std::filesystem::path &path);

    [[nodiscard]] std::size_t size() const;
    [[nodiscard]] const std::vector<std::uint8_t> &buffer() const;
};

class ByteStreamReader {
private:
    const ByteStream &m_stream;
    std::vector<std::uint8_t>::const_iterator m_iter;

    void check_end(std::size_t size) const;

public:
    explicit ByteStreamReader(const ByteStream &stream);

    [[nodiscard]] std::size_t remaining() const;
    void skip(std::size_t size);

    template <typename T, typename... Args>
    [[nodiscard]] T read(const Args &...);
};

class ByteStreamWriter : public ByteStream {
public:
    using ByteStream::ByteStream;

    template <typename T>
    void write(const T &value);
};

} // namespace inexor::vulkan_renderer::io