#pragma once #if !defined(MIJIN_SOURCE_MIJIN_VIRTUAL_FILESYSTEM_MEMORY_HPP_INCLUDED) #define MIJIN_SOURCE_MIJIN_VIRTUAL_FILESYSTEM_MEMORY_HPP_INCLUDED 1 #include #include #include "../container/vector_map.hpp" #include "../util/flag.hpp" #include "../virtual_filesystem/filesystem.hpp" namespace mijin { namespace detail { struct MemoryFile { std::span data; }; struct MemoryFolder { VectorMap, std::allocator> files; // TODO: make the FS library allocator aware VectorMap, std::allocator> folders; }; } class MemoryFileSystemAdapter : public FileSystemAdapter { public: MIJIN_DEFINE_FLAG(Overwrite); MIJIN_DEFINE_FLAG(CopyData); private: detail::MemoryFolder root_; std::vector> fileData_; public: [[nodiscard]] std::vector listFiles(const fs::path& folder) override; [[nodiscard]] FileInfo getFileInfo(const fs::path& file) override; [[nodiscard]] StreamError open(const fs::path& path, FileOpenMode mode, std::unique_ptr& outStream) override; bool addFile(const fs::path& path, std::span data, Overwrite overwrite = Overwrite::NO, CopyData copyData = CopyData::NO); bool addFile(const fs::path& path, std::span data, CopyData copyData) { return addFile(path, data, Overwrite::NO, copyData); } void addFolder(const fs::path& path); private: detail::MemoryFolder* findFolder(const fs::path& path, bool create = false) MIJIN_NOEXCEPT; FileInfo folderInfo(const fs::path& path, const detail::MemoryFolder& folder) const MIJIN_NOEXCEPT; FileInfo fileInfo(const fs::path& path, const detail::MemoryFile& file) const MIJIN_NOEXCEPT; }; } // namespace mijin #endif // !defined(MIJIN_SOURCE_MIJIN_VIRTUAL_FILESYSTEM_MEMORY_HPP_INCLUDED)