summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--game/network/network.cpp1
-rw-r--r--game/terrain.cpp1
-rw-r--r--gfx/models/texture.cpp2
-rw-r--r--gfx/models/texture.h2
-rw-r--r--lib/cache.h17
5 files changed, 14 insertions, 9 deletions
diff --git a/game/network/network.cpp b/game/network/network.cpp
index 47e51e2..f59fe1e 100644
--- a/game/network/network.cpp
+++ b/game/network/network.cpp
@@ -2,6 +2,7 @@
#include "routeWalker.h"
#include <array>
#include <cache.h>
+#include <filesystem>
#include <game/network/link.h>
#include <gfx/models/texture.h>
#include <initializer_list>
diff --git a/game/terrain.cpp b/game/terrain.cpp
index 4c902ef..3089f3a 100644
--- a/game/terrain.cpp
+++ b/game/terrain.cpp
@@ -2,6 +2,7 @@
#include "gfx/models/texture.h"
#include <cache.h>
#include <cstddef>
+#include <filesystem>
#include <gfx/gl/shader.h>
#include <gfx/image.h>
#include <gfx/models/mesh.h>
diff --git a/gfx/models/texture.cpp b/gfx/models/texture.cpp
index 612f0a0..79376bc 100644
--- a/gfx/models/texture.cpp
+++ b/gfx/models/texture.cpp
@@ -6,7 +6,7 @@
#include <resource.h>
#include <stb/stb_image.h>
-Cache<Texture> Texture::cachedTexture;
+Cache<Texture, std::filesystem::path> Texture::cachedTexture;
Texture::Texture(const std::filesystem::path & fileName)
{
diff --git a/gfx/models/texture.h b/gfx/models/texture.h
index 35c8c8b..e029a9b 100644
--- a/gfx/models/texture.h
+++ b/gfx/models/texture.h
@@ -11,7 +11,7 @@ class Texture {
public:
explicit Texture(const std::filesystem::path & fileName);
- static Cache<Texture> cachedTexture;
+ static Cache<Texture, std::filesystem::path> cachedTexture;
void Bind() const;
diff --git a/lib/cache.h b/lib/cache.h
index 2a651f0..cdc0a2e 100644
--- a/lib/cache.h
+++ b/lib/cache.h
@@ -2,13 +2,15 @@
#define CACHE_H
#include "special_members.hpp"
+#include <functional>
#include <map>
#include <memory>
-#include <string>
+#include <tuple>
-template<typename Obj> class Cache {
+template<typename Obj, typename... KeyParts> class Cache {
public:
using Ptr = std::shared_ptr<Obj>;
+ using Key = std::tuple<KeyParts...>;
Cache() = default;
virtual ~Cache() = default;
@@ -16,22 +18,23 @@ public:
NO_COPY(Cache);
[[nodiscard]] Ptr
- get(const std::string & key)
+ get(const KeyParts &... keyparts)
{
+ auto key = std::tie(keyparts...);
if (auto e = cached.find(key); e != cached.end()) {
return e->second;
}
- return cached.emplace(key, construct(key)).first->second;
+ return cached.emplace(key, construct(keyparts...)).first->second;
}
[[nodiscard]] virtual Ptr
- construct(const std::string & key) const
+ construct(const KeyParts &... keyparts) const
{
- return std::make_shared<Obj>(key);
+ return std::make_shared<Obj>(keyparts...);
}
private:
- std::map<std::string, Ptr> cached;
+ std::map<Key, Ptr, std::less<>> cached;
};
// IWYU pragma: no_forward_declare Cache