/* * Copyright (C) 2016+ AzerothCore * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ #ifndef CACHE_H #define CACHE_H #include #include #include "Define.h" #include #include #include "WorldModelRoot.h" #include "Model.h" template class GenericCache { public: GenericCache() {} static const uint32 FlushLimit = 300; // We can't get too close to filling up all the memory, and we have to be wary of the maximum number of open streams. void Insert(K key, T* val) { ACE_GUARD(ACE_Thread_Mutex, g, mutex); if (_items.size() > FlushLimit) Clear(); _items[key] = val; } T* Get(K key) { ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL); typename std::map::iterator itr = _items.find(key); if (itr != _items.end()) return itr->second; return NULL; } void Clear() { for (typename std::map::iterator itr = _items.begin(); itr != _items.end(); ++itr) delete itr->second; _items.clear(); } private: std::map _items; ACE_Thread_Mutex mutex; }; class CacheClass { public: CacheClass() {} GenericCache ModelCache; GenericCache WorldModelCache; void Clear() { ModelCache.Clear(); WorldModelCache.Clear(); } }; extern CacheClass* Cache; #endif