00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _RESOURCECACHE_
00019 #define _RESOURCECACHE_
00020
00021 #include <hash_map>
00022 #include <list>
00023 #include <map>
00024 #include <string>
00025
00026 #include "resource/AbstractResourceFile.h"
00027 #include "resource/AbstractResourceListener.h"
00028 #include "resource/Resource.h"
00029 #include "resource/ResourceHandle.h"
00030 #include "util/StringHasher.h"
00031
00032 class ResourceCache
00033 {
00034 private:
00035 typedef stdext::hash_map<std::string, AbstractResourceFile*, StringHasher> ResourceFileMap;
00036 typedef stdext::hash_map<std::string, ResourceHandlePtr, StringHasher> ResourceHandleMap;
00037 typedef std::list<AbstractResourceListener*> ResourceListenerList;
00038 typedef stdext::hash_map<std::string, ResourceListenerList, StringHasher> ResourceListenerMap;
00039 typedef std::list<ResourceHandlePtr> ResourceHandleList;
00040
00041 ResourceHandleMap m_resources;
00042 ResourceHandleList m_lru;
00043 ResourceFileMap m_resourceFiles;
00044 ResourceListenerMap m_resourceListeners;
00045
00046 unsigned long m_nMaxCacheSize;
00047 unsigned long m_nAllocated;
00048
00049 bool FreeMemory(unsigned int nSize);
00050 char* AllocateMemory(unsigned int nSize);
00051
00052 void DestroyResource(ResourceHandlePtr pResource);
00053 void DestroyLeastUsedResource();
00054
00055 ResourceHandlePtr LoadResource(Resource* const pResource);
00056 ResourceHandlePtr FindLoadedResource(const Resource& resource) const;
00057 void UpdateResourceUsage(ResourceHandlePtr const pResourceHandle);
00058 public:
00059 ResourceCache(unsigned long nSize)
00060 :m_nMaxCacheSize(nSize), m_nAllocated(0)
00061 {
00062 }
00063
00064 ~ResourceCache() { Clear(); }
00065
00066 bool OpenResourceFile(const std::string& path, const RESFILETYPE type);
00067 bool CloseResourceFile(const std::string& path);
00068
00069 void RegisterResourceListener(const Resource& res, AbstractResourceListener* pResourceListener);
00070 void UnregisterResourceListener(const Resource& res, AbstractResourceListener* pResourceListener);
00071
00072 const ResourceHandlePtr Get(Resource * const pResource);
00073
00074 void Clear();
00075 };
00076
00077 #endif