Go to the documentation of this file.
6#ifndef iproc_TMemCachedProducerComp_included
7#define iproc_TMemCachedProducerComp_included
11#include <QtCore/QList>
25template <
class Key,
class CacheObject>
36 I_TASSIGN(m_slaveCacheEngineCompPtr,
"SlaveCacheEngine",
"Slave cache engine providing access to cached object",
true,
"SlaveCacheEngine");
37 I_ASSIGN(m_maxCachedObjectsAttrPtr,
"MaxCachedObjects",
"Maximal number of cached objects",
true, 20);
52 I_ATTR(
int, m_maxCachedObjectsAttrPtr);
56 bool operator==(
const Key& key)
58 return this->key == key;
62 const CacheObject* objectPtr;
66 typedef QList<ListElement> CachedList;
67 typedef QMap<const CacheObject*, typename CachedList::reverse_iterator> ObjectToListMap;
69 CachedList m_cachedList;
70 ObjectToListMap m_objectToListMap;
78template <
class Key,
class CacheObject>
81 typename CachedList::iterator foundIter = std::find(m_cachedList.begin(), m_cachedList.end(), key);
82 if (foundIter != m_cachedList.end()){
83 foundIter->lockedCount++;
85 return foundIter->objectPtr;
88 if (m_slaveCacheEngineCompPtr !=
nullptr){
89 const CacheObject* objectPtr = m_slaveCacheEngineCompPtr->ProduceLockedObject(key);
90 if (objectPtr !=
nullptr){
91 m_cachedList.push_back(ListElement());
93 ListElement& element = m_cachedList.back();
94 m_objectToListMap[objectPtr] = m_cachedList.rbegin();
97 element.objectPtr = objectPtr;
98 element.lockedCount = 1;
110template <
class Key,
class CacheObject>
113 typename ObjectToListMap::iterator foundIter = m_objectToListMap.find(objectPtr);
114 Q_ASSERT(foundIter != m_objectToListMap.end());
116 typename CachedList::reverse_iterator objectIter = foundIter.value();
117 Q_ASSERT(objectIter != m_cachedList.rend());
119 objectIter->lockedCount--;
127template <
class Key,
class CacheObject>
130 int maxCachedObjects = qMax(0, *m_maxCachedObjectsAttrPtr);
132 typename CachedList::iterator iter = m_cachedList.begin();
133 while ( (
int(m_cachedList.size()) > maxCachedObjects) &&
134 (iter != m_cachedList.end())){
135 Q_ASSERT(m_objectToListMap.find(iter->objectPtr) != m_objectToListMap.end());
137 if (iter->lockedCount <= 0){
138 Q_ASSERT(m_slaveCacheEngineCompPtr !=
nullptr);
140 m_slaveCacheEngineCompPtr->UnlockObject(iter->objectPtr);
142 m_objectToListMap.erase(iter->objectPtr);
143 iter = m_cachedList.erase(iter);
150 Q_ASSERT(m_cachedList.size() == m_objectToListMap.size());
Base class for component implementation.
Template interface for providers of cached data.
Template implementation iproc::TILockedProducer buffering objects in memory cache.
void CleanElementList()
Remove elements from list if cumulated weight is above defined maximum.
virtual void UnlockObject(const CacheObject *objectPtr)
End of accessing to cached element.
icomp::CComponentBase BaseClass
TILockedProducer< Key, CacheObject > LockedProducerType
virtual const CacheObject * ProduceLockedObject(const Key &key)
Begin of accessing to cached element.
This namespace containes interfaces and implementation of data processing concepts.
© Witold Gantzke and Kirill Lepskiy