#pragma once #include #include #include namespace ArchiveEx { static constexpr std::size_t NAMELEN {64}; 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 Extract(int index, std::uint8_t*& buffer, bool null_terminated=false) const; int Extract(const char* filepath, std::uint8_t*& buffer, bool null_terminated=false) const; int Find(const char* filepath) const; int Insert(const char* filepath); void WriteMeta(); void GenerateBlockMap(); std::size_t FindFreeSpot(std::size_t bytes) const; void PrintNamesOfEntries() const; void PrintBlocks() const; std::size_t DirectoryBlocks() const; private: const char* path; std::size_t directory_offset; std::vector entries; std::vector blocks; }; Archive CreateEmpty(const char* path); } // namespace ArchiveEx