From 172d3ea720b5f3d18befcdd367c70995ed667ef1 Mon Sep 17 00:00:00 2001 From: SweetId <2630750+SweetId@users.noreply.github.com> Date: Sun, 24 Mar 2024 21:58:55 -0400 Subject: [PATCH] Foreach can now be recursive --- include/Nazara/Core/VirtualDirectory.hpp | 2 +- include/Nazara/Core/VirtualDirectory.inl | 33 ++++++++++++++++--- .../Engine/Core/VirtualDirectoryTest.cpp | 2 +- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/include/Nazara/Core/VirtualDirectory.hpp b/include/Nazara/Core/VirtualDirectory.hpp index 436eb2f4a..e326e0f0e 100644 --- a/include/Nazara/Core/VirtualDirectory.hpp +++ b/include/Nazara/Core/VirtualDirectory.hpp @@ -41,7 +41,7 @@ namespace Nz inline bool Exists(std::string_view path); - template void Foreach(F&& callback, bool includeDots = false); + 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); diff --git a/include/Nazara/Core/VirtualDirectory.inl b/include/Nazara/Core/VirtualDirectory.inl index 03c422c1a..34fab7668 100644 --- a/include/Nazara/Core/VirtualDirectory.inl +++ b/include/Nazara/Core/VirtualDirectory.inl @@ -36,7 +36,7 @@ namespace Nz } template - void VirtualDirectory::Foreach(F&& callback, bool includeDots) + bool VirtualDirectory::Foreach(F&& callback, bool recursive, bool includeDots) { if (includeDots) { @@ -46,16 +46,26 @@ namespace Nz { Entry parentEntry = DirectoryEntry{ { parent } }; if (!CallbackReturn(callback, std::string_view(".."), parentEntry)) - return; + return false; } else if (!CallbackReturn(callback, std::string_view(".."), ourselves)) - return; + return false; } for (auto&& entry : m_content) { if (!CallbackReturn(callback, std::string_view(entry.name), std::as_const(entry.entry))) - return; + return false; + + if (recursive) + { + if (std::holds_alternative(entry.entry)) + { + DirectoryEntry& child = std::get(entry.entry); + if (!child.directory->Foreach(callback, recursive, includeDots)) + return false; + } + } } if (m_resolver) @@ -70,9 +80,22 @@ namespace Nz if (it != m_content.end() && it->name == filename) return true; //< this was already returned - return CallbackReturn(callback, filename, std::move(entry)); + if (!CallbackReturn(callback, filename, entry)) + return false; + + if (recursive) + { + if (std::holds_alternative(entry)) + { + DirectoryEntry& child = std::get(entry); + if (!child.directory->Foreach(callback, recursive, includeDots)) + return false; + } + } + return true; }); } + return true; } template diff --git a/tests/UnitTests/Engine/Core/VirtualDirectoryTest.cpp b/tests/UnitTests/Engine/Core/VirtualDirectoryTest.cpp index c02d0c592..616513799 100644 --- a/tests/UnitTests/Engine/Core/VirtualDirectoryTest.cpp +++ b/tests/UnitTests/Engine/Core/VirtualDirectoryTest.cpp @@ -32,7 +32,7 @@ TEST_CASE("VirtualDirectory", "[Core][VirtualDirectory]") } if (name != "." && name != "..") FAIL("Got file " << name); - }, true); + }, false, true); CHECK(dot); CHECK(dotDot);