#pragma once #include #include #include #include #include namespace engine { class IResourceManager { public: virtual ~IResourceManager() = default; }; template class ResourceManager : public IResourceManager { public: std::shared_ptr add(const std::string& name, std::unique_ptr&& resource) { if (m_resources.contains(name) == false) { std::shared_ptr resourceSharedPtr(std::move(resource)); m_resources.emplace(name, resourceSharedPtr); return resourceSharedPtr; } else { throw std::runtime_error("Cannot add a resource which already exists"); } } void addPersistent(const std::string& name, std::unique_ptr&& resource) { m_persistentResources.push_back(add(name, std::move(resource))); } std::shared_ptr get(const std::string& name) { if (m_resources.contains(name)) { std::weak_ptr ptr = m_resources.at(name); if (ptr.expired() == false) { return ptr.lock(); } else { m_resources.erase(name); } } // resource doesn't exist: throw std::runtime_error("Resource doesn't exist: " + name); return {}; } private: std::unordered_map> m_resources{}; std::vector> m_persistentResources{}; // This array owns persistent resources }; }