#pragma once #include #include #include "../System/String.h" class Resource { public: virtual bool Load(const std::string& filename) = 0; protected: Resource() : refs(0) {} int refs; }; template class ResourceManager { public: ResourceManager() { } typedef std::map ResourceMap; T* Load(const std::string& name) { typename ResourceManager::ResourceMap::iterator i = m_resources.find(name); if(i == m_resources.end()) { T* resource = new T(); if(!resource->Load(name)) { delete resource; return NULL; } resource->refs = 1; m_resources.insert(std::pair(name, resource)); return resource; } i->second->refs++; return i->second; } T* Find(const std::string& name) { typename ResourceManager::ResourceMap::iterator i = m_resources.find(name); if(i != m_resources.end()) { return i->second; } return NULL; } void Add(const std::string& name, T* resource) { typename ResourceManager::ResourceMap::iterator i = m_resources.find(name); if(i == m_resources.end()) { resource->refs++; m_resources.insert(std::pair(name, resource)); } else { i->second->refs++; } } void Destroy(const std::string& name) { if(name.empty()) return; typename ResourceManager::ResourceMap::iterator i = m_resources.find(name); if(i != m_resources.end()) { T* resource = i->second; resource->refs--; if(resource->m_refs < 1) { delete resource; m_resources.erase(i); } } } void Destroy(T* resource) { typename ResourceManager::ResourceMap::iterator i; for(i = m_resources.begin(); i != m_resources.end(); ++i) { if(i->second == resource){ resource->refs--; if(resource->refs < 1) { m_resources.erase(i); delete resource; } return; } } } private: ResourceMap m_resources; };