From f8f9bf563a738001ef790a3c502160772f425c6f Mon Sep 17 00:00:00 2001 From: m-aXimilian Date: Tue, 24 Jun 2025 23:06:50 +0200 Subject: [PATCH] leverage concepts and provide a templateized Enumerate function --- lib/resources/resource.cpp | 1 + lib/resources/resource.hpp | 25 ++++++++++++++++++------- tests/lib/resources/test_resource.cpp | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lib/resources/resource.cpp b/lib/resources/resource.cpp index 3c6e81e..d98e10b 100644 --- a/lib/resources/resource.cpp +++ b/lib/resources/resource.cpp @@ -1,6 +1,7 @@ #include "resource.hpp" #include +#include #include using pixelarium::imaging::PixelariumImage; diff --git a/lib/resources/resource.hpp b/lib/resources/resource.hpp index 8c2514b..5d3a4a8 100644 --- a/lib/resources/resource.hpp +++ b/lib/resources/resource.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -17,17 +18,16 @@ struct IResource template concept ResT = requires(R& r) { static_cast(r); }; -// template -template +template class IResourcePool { public: virtual ~IResourcePool() = default; - virtual std::optional GetResource(size_t id) const = 0; - virtual size_t SetResource(std::unique_ptr res) = 0; - virtual bool ModifyResource(size_t id, std::unique_ptr res) = 0; + virtual std::optional GetResource(size_t id) const = 0; + virtual size_t SetResource(std::unique_ptr res) = 0; + virtual bool ModifyResource(size_t id, std::unique_ptr res) = 0; virtual bool DeleteResource(size_t id) = 0; - virtual void EnumerateResources(const std::function& func) = 0; + virtual void EnumerateResources(const std::function& func) = 0; virtual size_t GetTotalSize() const = 0; }; @@ -53,7 +53,18 @@ class ImageResourcePool : public IResourcePool void EnumerateResources(const std::function& func) override; - size_t GetTotalSize() const override { return resources_.size();} + template + requires std::invocable + void Enumerate(Callable&& func) const + { + for (const auto& e : this->resources_) + { + func(e.first, *e.second); + } + } + + size_t GetTotalSize() const override { return resources_.size(); } + private: std::unordered_map> resources_; }; diff --git a/tests/lib/resources/test_resource.cpp b/tests/lib/resources/test_resource.cpp index 69fcb97..76e9a6a 100644 --- a/tests/lib/resources/test_resource.cpp +++ b/tests/lib/resources/test_resource.cpp @@ -90,3 +90,17 @@ TEST(ImageResourcePoolTest, EnumerateResources) EXPECT_NE(std::find(found_ids.begin(), found_ids.end(), id1), found_ids.end()); EXPECT_NE(std::find(found_ids.begin(), found_ids.end(), id2), found_ids.end()); } + +TEST(ImageResourcePoolTest, TemplatedEnumerate) +{ + ImageResourcePool pool; + auto id1 = pool.SetResource(std::make_unique()); + auto id2 = pool.SetResource(std::make_unique()); + std::vector found_ids{}; + + pool.Enumerate([&found_ids](size_t id, const pixelarium::imaging::PixelariumImage& img) { found_ids.push_back(id); }); + + EXPECT_EQ(found_ids.size(), 2); + EXPECT_NE(std::find(found_ids.begin(), found_ids.end(), id1), found_ids.end()); + EXPECT_NE(std::find(found_ids.begin(), found_ids.end(), id2), found_ids.end()); +}