diff options
-rw-r--r-- | lib/cache.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/cache.h b/lib/cache.h new file mode 100644 index 0000000..48b9c55 --- /dev/null +++ b/lib/cache.h @@ -0,0 +1,29 @@ +#ifndef CACHE_H +#define CACHE_H + +#include <map> +#include <memory> + +template<typename Obj> class Cache { +public: + using Ptr = std::shared_ptr<Obj>; + [[nodiscard]] Ptr + get(const std::string & key) + { + if (auto e = cached.find(key); e != cached.end()) { + return e->second; + } + return cached.emplace(key, construct(key)).first->second; + } + + [[nodiscard]] virtual Ptr + construct(const std::string & key) const + { + return std::make_shared<Obj>(key); + } + +private: + std::map<std::string, Ptr> cached; +}; + +#endif |