112 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #pragma once
 | |
| 
 | |
| #if !defined(MIJIN_VIRTUAL_FILESYSTEM_RELATIVE_HPP_INCLUDED)
 | |
| #define MIJIN_VIRTUAL_FILESYSTEM_RELATIVE_HPP_INCLUDED 1
 | |
| 
 | |
| #include "./filesystem.hpp"
 | |
| #include "../internal/common.hpp"
 | |
| 
 | |
| namespace mijin
 | |
| {
 | |
| 
 | |
| //
 | |
| // public defines
 | |
| //
 | |
| 
 | |
| //
 | |
| // public constants
 | |
| //
 | |
| 
 | |
| //
 | |
| // public types
 | |
| //
 | |
| 
 | |
| template<typename TWrapped>
 | |
| class RelativeFileSystemAdapter : public FileSystemAdapter
 | |
| {
 | |
| private:
 | |
|     TWrapped wrapped_;
 | |
|     fs::path root_;
 | |
| public:
 | |
|     template<typename... TArgs>
 | |
|     explicit RelativeFileSystemAdapter(fs::path root, TArgs&&... args)
 | |
|         : wrapped_(std::forward<TArgs>(args)...), root_(std::move(root)) {}
 | |
|     RelativeFileSystemAdapter(const RelativeFileSystemAdapter&) = default;
 | |
|     RelativeFileSystemAdapter(RelativeFileSystemAdapter&&) MIJIN_NOEXCEPT = default;
 | |
| 
 | |
|     RelativeFileSystemAdapter& operator=(const RelativeFileSystemAdapter&) = default;
 | |
|     RelativeFileSystemAdapter& operator=(RelativeFileSystemAdapter&&) MIJIN_NOEXCEPT = default;
 | |
| 
 | |
|     std::vector<fs::path> getRoots() override;
 | |
|     fs::path getHomeFolder() override;
 | |
|     std::vector<FileInfo> listFiles(const fs::path& folder) override;
 | |
|     FileInfo getFileInfo(const fs::path& file) override;
 | |
|     Optional<fs::path> getNativePath(const fs::path& file) override;
 | |
|     StreamError open(const fs::path& path, FileOpenMode mode, std::unique_ptr<Stream>& outStream) override;
 | |
| private:
 | |
|     fs::path appendPath(const fs::path& other) const MIJIN_NOEXCEPT;
 | |
| };
 | |
| 
 | |
| //
 | |
| // public functions
 | |
| //
 | |
| 
 | |
| template<typename TWrapped>
 | |
| std::vector<fs::path> RelativeFileSystemAdapter<TWrapped>::getRoots()
 | |
| {
 | |
|     return { root_ };
 | |
| }
 | |
| 
 | |
| template<typename TWrapped>
 | |
| fs::path RelativeFileSystemAdapter<TWrapped>::getHomeFolder()
 | |
| {
 | |
|     return root_;
 | |
| }
 | |
| 
 | |
| template<typename TWrapped>
 | |
| std::vector<FileInfo> RelativeFileSystemAdapter<TWrapped>::listFiles(const fs::path& folder)
 | |
| {
 | |
|     std::vector<FileInfo> result;
 | |
| 
 | |
|     result = wrapped_.listFiles(appendPath(folder));
 | |
|     for (FileInfo& fileInfo : result) {
 | |
|         fileInfo.path = "/" / fileInfo.path.lexically_relative(root_);
 | |
|     }
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| template<typename TWrapped>
 | |
| FileInfo RelativeFileSystemAdapter<TWrapped>::getFileInfo(const fs::path& file)
 | |
| {
 | |
|     return wrapped_.getFileInfo(appendPath(file));
 | |
| }
 | |
| 
 | |
| template<typename TWrapped>
 | |
| Optional<fs::path> RelativeFileSystemAdapter<TWrapped>::getNativePath(const fs::path& file)
 | |
| {
 | |
|     return wrapped_.getNativePath(appendPath(file));
 | |
| }
 | |
| 
 | |
| template<typename TWrapped>
 | |
| StreamError RelativeFileSystemAdapter<TWrapped>::open(const fs::path& path, FileOpenMode mode, std::unique_ptr<Stream>& outStream)
 | |
| {
 | |
|     return wrapped_.open(appendPath(path), mode, outStream);
 | |
| }
 | |
| 
 | |
| template<typename TWrapped>
 | |
| fs::path RelativeFileSystemAdapter<TWrapped>::appendPath(const fs::path& other) const MIJIN_NOEXCEPT
 | |
| {
 | |
|     fs::path combinedPath = root_;
 | |
|     if (other.is_absolute()) {
 | |
|         combinedPath += other;
 | |
|     }
 | |
|     else {
 | |
|         combinedPath /= other;
 | |
|     }
 | |
|     return combinedPath;
 | |
| }
 | |
| } // namespace mijin
 | |
| 
 | |
| #endif // !defined(MIJIN_VIRTUAL_FILESYSTEM_RELATIVE_HPP_INCLUDED)
 |