#pragma once #include #include #include #include namespace engine { template class ResourceManager { public: ResourceManager() {} ~ResourceManager() {} ResourceManager(const ResourceManager&) = delete; ResourceManager& operator=(const ResourceManager&) = delete; 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"); } } 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(); } } return {}; } private: std::unordered_map> m_resources{}; }; }