Go to the documentation of this file.
6#ifndef iproc_TMorphLockedProducerBase_included
7#define iproc_TMorphLockedProducerBase_included
11#include <QtCore/QList>
21template <
class Key,
class CacheObject,
class SourceObject>
47 const SourceObject& source,
48 CacheObject& cache)
const = 0;
53 double m_maxCumulatedWeight;
55 mutable double m_cumulatedWeight;
59 bool operator==(
const Key& key)
61 return this->key == key;
66 std::unique_ptr<CacheObject> objectPtr;
70 typedef QList<ListElement> CachedList;
72 CachedList m_cachedList;
78template <
class Key,
class CacheObject,
class SourceObject>
80: m_maxCumulatedWeight(10), m_cumulatedWeight(0)
85template <
class Key,
class CacheObject,
class SourceObject>
88 return m_maxCumulatedWeight;
92template <
class Key,
class CacheObject,
class SourceObject>
95 m_maxCumulatedWeight = value;
103template <
class Key,
class CacheObject,
class SourceObject>
106 typename CachedList::iterator foundIter = std::find(m_cachedList.begin(), m_cachedList.end(), key);
107 if (foundIter != m_cachedList.end()){
108 foundIter->lockedCount++;
110 return foundIter->objectPtr.get();
113 const SourceObject* sourcePtr = LockSourceObject(key);
114 if (sourcePtr !=
nullptr){
115 std::unique_ptr<CacheObject> newObjectPtr(
new CacheObject);
116 if (newObject ==
nullptr){
120 double weight = CalcCacheObject(key, *sourcePtr, *newObjectPtr);
122 UnlockSourceObject(key, sourcePtr);
128 m_cachedList.push_back(ListElement());
130 ListElement& element = m_cachedList.back();
133 element.objectPtr = std::move(newObjectPtr);
134 element.weight = weight;
135 element.lockedCount = 1;
137 m_cumulatedWeight += weight;
141 return element.objectPtr.get();
148template <
class Key,
class CacheObject,
class SourceObject>
151 for (
typename CachedList::iterator iter = m_cachedList.begin();
152 iter != m_cachedList.end();
154 if (iter->objectPtr.get() == objectPtr){
155 if (--iter->lockedCount <= 0){
156 m_cachedList.erase(iter);
167template <
class Key,
class CacheObject,
class SourceObject>
170 typename CachedList::iterator iter = m_cachedList.begin();
171 while ( (m_cumulatedWeight > m_maxCumulatedWeight) &&
172 (iter != m_cachedList.end())){
173 if (iter->lockedCount <= 0){
174 m_cumulatedWeight -= iter->weight;
176 iter = m_cachedList.erase(iter);
Template interface for providers of cached data.
virtual double CalcCacheObject(const Key &key, const SourceObject &source, CacheObject &cache) const =0
Calculate cache object from source object.
virtual const CacheObject * ProduceLockedObject(const Key &key)
Begin of accessing to cached element.
void SetMaxCumulatedWeight(double value)
virtual const SourceObject * LockSourceObject(const Key &key)=0
void CleanElementList()
Remove elements from list if cumulated weight is above defined maximum.
double GetMaxCumulatedWeight() const
TMorphLockedProducerBase()
virtual void UnlockObject(const CacheObject *objectPtr)
End of accessing to cached element.
virtual void UnlockSourceObject(const Key &key, const SourceObject *sourcePtr)=0
This namespace containes interfaces and implementation of data processing concepts.
© Witold Gantzke and Kirill Lepskiy