#pragma once #include #include #include namespace Archive { static constexpr std::size_t NAMELEN {64}; struct Header { std::uint32_t version; std::uint32_t total_entries; struct { std::uint32_t total_blocks; std::uint32_t compressed_size; std::uint32_t offset; } directory; }; struct Entry { char name[NAMELEN]; std::uint32_t original_size; std::uint32_t compressed_size; std::uint32_t offset; }; class Archive { public: explicit Archive(const char* path); int Expand(int index, std::uint8_t*& buffer, bool null_terminated=false) const; int Expand(const char* filepath, std::uint8_t*& buffer, bool null_terminated=false) const; int Find(const char* filepath) const; int Update(const char* filepath); void WriteMeta(); void UpdateBlockMap(); std::size_t FindFreeSpot(std::size_t bytes) const; void PrintNamesOfEntries() const; void PrintBlocks() const; std::size_t DirectoryBlocks() const; private: const char* path; Header header; std::vector entries; std::vector blocks; }; } // namespace Archive