From 9a223098f658cebd2a7abc173e2392d6d3a4a991 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Thu, 8 Sep 2022 11:17:25 +0800 Subject: [PATCH] Initial Commit --- SHADE_Engine/SHADE_Engine.vcxproj | 2 + SHADE_Engine/SHADE_Engine.vcxproj.filters | 2 + SHADE_Engine/src/Filesystem/SHFileSystem.cpp | 75 ++++++++++++++++++++ SHADE_Engine/src/Filesystem/SHFileSystem.h | 44 ++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 SHADE_Engine/src/Filesystem/SHFileSystem.cpp create mode 100644 SHADE_Engine/src/Filesystem/SHFileSystem.h diff --git a/SHADE_Engine/SHADE_Engine.vcxproj b/SHADE_Engine/SHADE_Engine.vcxproj index d89ec12a..ba1be338 100644 --- a/SHADE_Engine/SHADE_Engine.vcxproj +++ b/SHADE_Engine/SHADE_Engine.vcxproj @@ -103,10 +103,12 @@ + + Create diff --git a/SHADE_Engine/SHADE_Engine.vcxproj.filters b/SHADE_Engine/SHADE_Engine.vcxproj.filters index b16c713b..6ca01248 100644 --- a/SHADE_Engine/SHADE_Engine.vcxproj.filters +++ b/SHADE_Engine/SHADE_Engine.vcxproj.filters @@ -10,11 +10,13 @@ Engine + Engine + \ No newline at end of file diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.cpp b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp new file mode 100644 index 00000000..81ff6a8b --- /dev/null +++ b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp @@ -0,0 +1,75 @@ +#include "SHFileSystem.h" +#include "fileapi.h" +#include + +namespace SHADE +{ + char const FOLDER_MAX_COUNT {15}; + + std::unordered_map> SHFileSystem::folders; + + SHFolder::SHFolder(FolderHandle id, FolderName name) + :id{id}, name{name}, subFolders(0) + { + } + + FolderLocation SHFileSystem::CreateNewFolderHere(FolderName name, FolderLocation here) noexcept + { + if (here == 0) + { + if (!folders.contains(0)) + { + folders[0] = std::make_unique(0, "root"); + } + + FolderCounter const count = static_cast(folders[here]->subFolders.size()); + + assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n"); + + FolderHandle const location = static_cast(count); + + CreateFolderHelper(folders[0]->path, here, location, name); + + return location; + } + + assert(folders.contains(here), "Folder creation location does not exist/invalid\n"); + + FolderCounter const count = static_cast(folders[here]->subFolders.size()); + + FolderHandle location = here; + location <<= 4; + location |= count; + + assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n"); + CreateFolderHelper(folders[0]->path, here, location, name); + + return location; + } + + bool SHFileSystem::DeleteFolder(FolderLocation location) noexcept + { + assert(folders.contains(location), "Delete target does not exist/invalid.\n"); + + for (auto const& subFolder : folders[location]->subFolders) + { + DeleteFolder(subFolder); + } + + RemoveDirectoryA(folders[location]->path.string().c_str()); + return true; + } + + bool SHFileSystem::CreateFolderHelper(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept + { + assert( + CreateDirectoryA(path.string().c_str(), nullptr), + "Failed to create folder\n" + ); + + folders[location] = std::make_unique(location, name); + folders[parent]->subFolders.push_back(location); + + return true; + } +} diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.h b/SHADE_Engine/src/Filesystem/SHFileSystem.h new file mode 100644 index 00000000..c58eb81e --- /dev/null +++ b/SHADE_Engine/src/Filesystem/SHFileSystem.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace SHADE +{ + typedef unsigned char FolderCounter; + typedef unsigned char FileCounter; + typedef uint32_t FolderLocation; + typedef uint32_t FolderHandle; + typedef std::string FolderName; + typedef std::filesystem::path FolderPath; + + class SHFolder + { + public: + SHFolder(FolderHandle id, FolderName name); + + FolderHandle id; + FolderName name; + std::vector subFolders; + + private: + FolderPath path; + friend class SHFileSystem; + }; + + class SHFileSystem + { + public: + static FolderLocation CreateNewFolderHere(FolderName name, FolderLocation here = 0) noexcept; + + static bool DeleteFolder(FolderLocation location) noexcept; + + private: + static std::unordered_map> folders; + + static bool CreateFolderHelper(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept; + }; +} \ No newline at end of file