// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Export.hpp #pragma once #ifndef NAZARA_CORE_VIRTUALDIRECTORY_HPP #define NAZARA_CORE_VIRTUALDIRECTORY_HPP #include #include #include #include #include #include #include #include namespace Nz { class VirtualDirectory; class VirtualDirectoryResolver; using VirtualDirectoryPtr = std::shared_ptr; class VirtualDirectory : public std::enable_shared_from_this { public: struct DirectoryEntry; struct FileEntry; using Entry = std::variant; inline VirtualDirectory(std::weak_ptr parentDirectory = {}); inline VirtualDirectory(std::shared_ptr resolver, std::weak_ptr parentDirectory = {}); VirtualDirectory(const VirtualDirectory&) = delete; VirtualDirectory(VirtualDirectory&&) = delete; ~VirtualDirectory() = default; inline void AllowUproot(bool uproot = true); inline bool Exists(std::string_view path); template bool Foreach(F&& callback, bool recursive = false, bool includeDots = false); template bool GetDirectoryEntry(std::string_view path, F&& callback); template bool GetEntry(std::string_view path, F&& callback); template bool GetFileContent(std::string_view path, F&& callback); inline const std::shared_ptr& GetResolver() const; inline bool IsUprootAllowed() const; inline DirectoryEntry& StoreDirectory(std::string_view path, std::shared_ptr resolver); inline DirectoryEntry& StoreDirectory(std::string_view path, VirtualDirectoryPtr directory); inline FileEntry& StoreFile(std::string_view path, std::shared_ptr stream); inline FileEntry& StoreFile(std::string_view path, ByteArray content); inline FileEntry& StoreFile(std::string_view path, const void* data, std::size_t size); VirtualDirectory& operator=(const VirtualDirectory&) = delete; VirtualDirectory& operator=(VirtualDirectory&&) = delete; // File entries struct FileEntry { std::shared_ptr stream; }; // Directory entries struct DirectoryEntry { VirtualDirectoryPtr directory; }; private: template bool GetEntryInternal(std::string_view name, bool allowResolve, F&& callback); inline bool CreateOrRetrieveDirectory(std::string_view path, std::shared_ptr& directory, std::string_view& entryName); template T& StoreInternal(std::string name, T value); template static bool CallbackReturn(F&& callback, Args&&... args); template static bool SplitPath(std::string_view path, F1&& dirCB, F2&& fileCB); struct ContentEntry { std::string name; Entry entry; }; std::shared_ptr m_resolver; std::vector m_cachedDirectoryParts; std::vector m_content; std::weak_ptr m_parent; bool m_isUprootAllowed; }; class NAZARA_CORE_API VirtualDirectoryResolver { public: VirtualDirectoryResolver() = default; VirtualDirectoryResolver(const VirtualDirectoryResolver&) = delete; VirtualDirectoryResolver(VirtualDirectoryResolver&&) = delete; virtual ~VirtualDirectoryResolver(); virtual void ForEach(std::weak_ptr parent, FunctionRef callback) const = 0; virtual std::optional Resolve(std::weak_ptr parent, const std::string_view* parts, std::size_t partCount) const = 0; VirtualDirectoryResolver& operator=(const VirtualDirectoryResolver&) = delete; VirtualDirectoryResolver& operator=(VirtualDirectoryResolver&&) = delete; }; } #include #endif // NAZARA_CORE_VIRTUALDIRECTORY_HPP