1 #ifndef ossimItemCache_HEADER 2 #define ossimItemCache_HEADER 67 template<
class ItemType>
71 typename std::shared_ptr<ItemType> SharedItemType;
84 std::shared_ptr<ItemType> m_item;
86 typedef std::map<ossimString, std::shared_ptr<Node> > CacheType;
87 typedef std::map<ossim_uint64, std::shared_ptr<Node> > LruType;
97 std::shared_ptr<ItemType> getItem(
const ossimString& key);
98 std::shared_ptr<const ItemType> getItem(
const ossimString& key)
const;
107 std::shared_ptr<ItemType> item);
115 std::shared_ptr<ItemType> removeItem(
const ossimString& key);
141 mutable RWLock m_itemCacheMutex;
142 mutable RWLock m_lruCacheMutex;
145 mutable LruType m_lruCache;
158 std::shared_ptr<ItemType> item);
172 void touchNode(std::shared_ptr<Node> node)
const;
180 std::shared_ptr<Node> removeItemFromCache(
const ossimString& key);
188 std::shared_ptr<Node> removeItemFromLruCache(
ossim_uint64 key)
const;
199 template<
class ItemType>
200 typename std::shared_ptr<ItemType> ItemCache<ItemType>::getItem(
const ossimString& key)
203 std::shared_ptr<ItemType> result;
204 typename CacheType::iterator iter = m_cache.find(key);
205 if(iter != m_cache.end())
207 result = iter->second->m_item;
208 touchNode(iter->second);
213 template<
class ItemType>
214 typename std::shared_ptr<const ItemType> ItemCache<ItemType>::getItem(
const ossimString& key)
const 217 std::shared_ptr<const ItemType> result;
218 typename CacheType::const_iterator iter = m_cache.find(key);
219 if(iter != m_cache.end())
221 result = iter->second->m_item;
222 touchNode(iter->second);
227 template<
class ItemType>
228 void ItemCache<ItemType>::addItem(
const ossimString& key,
229 std::shared_ptr<ItemType> item)
232 protectedAddItem(key, item);
234 template<
class ItemType>
235 typename std::shared_ptr<ItemType> ItemCache<ItemType>::removeItem(
const ossimString& key)
238 std::shared_ptr<ItemType> result;
239 std::shared_ptr<Node> node = removeItemFromCache(key);
242 result = node->m_item;
243 removeItemFromLruCache(node->m_lruId);
249 template<
class ItemType>
250 void ItemCache<ItemType>::protectedAddItem(
const ossimString& key,
251 std::shared_ptr<ItemType> item)
253 if(m_cache.size() > m_maxItemsToCache)
257 typename CacheType::iterator iter = m_cache.find(key);
258 if(iter!= m_cache.end())
262 std::shared_ptr<Node> node = iter->second;
269 std::shared_ptr<Node> nodePtr = std::make_shared<Node>();
270 nodePtr->m_cacheId = key;
271 nodePtr->m_item = item;
272 nodePtr->m_lruId = nextId();
273 m_cache.insert(std::make_pair(key, nodePtr));
276 if(m_lruCache.size() > 0)
278 m_lruCache.insert(--m_lruCache.end(),
279 std::make_pair(nodePtr->m_lruId,
284 m_lruCache.insert(std::make_pair(nodePtr->m_lruId,
291 template<
class ItemType>
292 void ItemCache<ItemType>::touchNode(std::shared_ptr<Node> node)
const 294 m_lruCache.erase(node->m_lruId);
295 node->m_lruId = nextId();
298 if(m_lruCache.size() > 0)
300 m_lruCache.insert(m_lruCache.end(), std::make_pair(node->m_lruId, node));
304 m_lruCache.insert(std::make_pair(node->m_lruId, node));
309 template<
class ItemType>
312 return m_currentId++;
315 template<
class ItemType>
316 void ItemCache<ItemType>::setMinAndMaxItemsToCache(
ossim_uint32 maxItemsToCache,
320 m_maxItemsToCache = maxItemsToCache;
321 m_minItemsToCache = minItemsToCache;
323 template<
class ItemType>
324 void ItemCache<ItemType>::reset()
332 template<
class ItemType>
333 void ItemCache<ItemType>::shrinkCache()
335 if(m_minItemsToCache < 1)
342 typename LruType::iterator iter = m_lruCache.begin();
344 while((m_cache.size() > m_minItemsToCache)&&
345 (iter != m_lruCache.end()))
347 removeItemFromCache(iter->second->m_cacheId);
348 iter = m_lruCache.erase(iter);
353 if(m_cache.size() >= previousSize)
361 template<
class ItemType>
362 ossim_uint32 ItemCache<ItemType>::getMaxItemsToCache()
const 365 return m_maxItemsToCache;
368 template<
class ItemType>
369 ossim_uint32 ItemCache<ItemType>::getMinItemsToCache()
const 372 return m_minItemsToCache;
375 template<
class ItemType>
376 std::shared_ptr< typename ItemCache<ItemType>::Node> ItemCache<ItemType>::removeItemFromCache(
const ossimString& key)
378 std::shared_ptr<Node> result;
380 typename CacheType::iterator iter = m_cache.find(key);
381 if(iter != m_cache.end())
383 result = iter->second;
390 template<
class ItemType>
391 std::shared_ptr<typename ItemCache<ItemType>::Node> ItemCache<ItemType>::removeItemFromLruCache(
ossim_uint64 key)
const 393 std::shared_ptr<Node> result;
395 typename LruType::iterator iter = m_lruCache.find(key);
396 if(iter != m_lruCache.end())
398 result = iter->second;
399 m_lruCache.erase(iter);
This code was derived from https://gist.github.com/mshockwave.
unsigned long long ossim_uint64
unsigned int ossim_uint32