#pragma once #include "Device.hpp" #include "util/Buffer.hpp" #include #include #include #include namespace io { /// @brief In-memory filesystem device class MemoryDevice : public Device { enum class NodeType { DIR, FILE }; struct File { util::Buffer content; }; struct Dir { std::vector content; }; struct Node { std::variant data; NodeType type() const { return std::visit([](auto&& arg) -> NodeType { using T = std::decay_t; if constexpr (std::is_same_v) return NodeType::DIR; else if constexpr (std::is_same_v) return NodeType::FILE; }, data); } template bool holds_alternative() const { return std::holds_alternative(data); } template T* get_if() { return std::get_if(&data); } }; public: MemoryDevice(); std::filesystem::path resolve(std::string_view path) override; std::unique_ptr write(std::string_view path) override; std::unique_ptr read(std::string_view path) override; size_t size(std::string_view path) override; file_time_type lastWriteTime(std::string_view path) override; bool exists(std::string_view path) override; bool isdir(std::string_view path) override; bool isfile(std::string_view path) override; bool mkdir(std::string_view path) override; bool mkdirs(std::string_view path) override; bool remove(std::string_view path) override; uint64_t removeAll(std::string_view path) override; std::unique_ptr list(std::string_view path) override; private: std::unordered_map nodes; Dir rootDir {}; Node* createFile(std::string path, util::Buffer&& content); Dir* createDir(std::string path); Dir* getDir(std::string_view path); }; }