#ifndef ResourceManager_h__ #define ResourceManager_h__ #include #include #include #include #include "Factory.h" class Resource { public: unsigned int TypeID; unsigned int ResourceID; }; class ResourceManager { public: ResourceManager() : m_CurrentResourceTypeID(0) { } // Registers the factory function of a resource type void RegisterType(std::string resourceType, std::function factoryFunction); // Loads a resource and caches it for future use void Preload(std::string resourceType, std::string resourceName); template // Hot-loads a resource and caches it for future use T* Load(std::string resourceType, std::string resourceName); template // Fetches a preloaded resource T* Fetch(std::string resourceName) const; private: std::unordered_map> m_FactoryFunctions; // type -> factory function std::unordered_map m_ResourceCache; // name -> resource // TODO: Getters for IDs unsigned int m_CurrentResourceTypeID; std::unordered_map m_ResourceTypeIDs; // Number of resources of a type. Doubles as local ID. std::unordered_map m_ResourceCount; unsigned int GetTypeID(std::string resourceType); unsigned int GetNewResourceID(unsigned int typeID); // Internal: Create a resource and cache it Resource* CreateResource(std::string resourceType, std::string resourceName); }; template T* ResourceManager::Load(std::string resourceType, std::string resourceName) { return static_cast(CreateResource(resourceType, resourceName)); } template T* ResourceManager::Fetch(std::string resourceName) const { if (m_ResourceCache.find(resourceName) == m_ResourceCache.end()) { LOG_ERROR("Failed to fetch resource \"%s\": Resource not loaded!", resourceName.c_str()); return nullptr; } else { return static_cast(m_ResourceCache.at(resourceName)); } } #endif // ResourceManager_h__