5 #ifndef DYNACACHEIMPL_H 6 #define DYNACACHEIMPL_H 12 #define MAKE_CACHETYPE_INSTANCE(C, T) \ 13 template class DynaCache<C>; \ 14 typedef DynaCache<C> T##Cache 39 _autoTouch = other._autoTouch;
53 _autoTouch = autoTouch;
64 _pageReplacements = 0L;
77 return _pageList ==
nullptr || _pageList->size() == 0;
82 return _pageList !=
nullptr && _pageList->size() >= _maxPages;
87 if (_pageList !=
nullptr) {
88 for (T* page : *_pageList) {
99 if (_pageList !=
nullptr) {
100 for (T* page : *_pageList) {
115 return _pageList->size();
125 if (maxPages < _maxPages) {
126 for (
int i = maxPages; i < _maxPages; ++i)
129 _maxPages = maxPages;
134 _listener = listener;
139 if (_pageList !=
nullptr && !_pageList->isEmpty()) {
140 for (T* page : *_pageList) {
148 if (_listener !=
nullptr)
154 if (_pageList !=
nullptr) {
155 _pageList->moveToFirst(entry);
172 auto* entry = _pageList->pushEntry(page);
174 _pageMap->put(page->getKeyValue(), entry);
175 if (_listener !=
nullptr)
189 auto* entry = _pageList->getLast();
190 if (entry !=
nullptr) {
191 T* page = getPageForRemoval(entry);
192 _pageMap->remove(page->getKeyValue());
194 page->setKeyValue(keyValue);
195 _pageMap->put(keyValue, entry);
207 auto* entry = _pageList->getLast();
208 if (entry !=
nullptr) {
209 T* page = getPageForRemoval(entry);
210 _pageMap->remove(page->getKeyValue());
211 entry->setObject(newPage);
212 _pageMap->put(newPage->getKeyValue(), entry);
213 if (_pageList->isOwnsMembers()) {
224 auto* entry = findPageEntry(keyValue);
225 if (entry !=
nullptr) {
226 T* page = getPageForRemoval(entry);
227 _pageMap->remove(page->getKeyValue());
228 _pageList->deleteEntry(entry);
234 auto* entry = _pageList->getLast();
235 if (entry !=
nullptr) {
236 T* page = getPageForRemoval(entry);
237 _pageMap->remove(page->getKeyValue());
238 _pageList->deleteEntry(entry);
244 int pagesToRemove = (int)(((
double)_pageList->count()) * removePercent);
245 for (
int i = 0; i < pagesToRemove; ++i) {
253 auto* entry = _pageMap->get(keyValue);
259 auto* entry = findPageEntry(keyValue);
260 if (entry !=
nullptr && _autoTouch)
267 auto* entry = findPageEntry(keyValue);
268 if (entry ==
nullptr) {
269 if (_pageList->size() >= _maxPages)
270 entry = useLastPage(keyValue);
271 if (entry ==
nullptr) {
272 T* page = getNewPage();
273 page->setKeyValue(keyValue);
274 entry = addNewPage(page);
284 auto* entry = findPageEntry(page->getKeyValue());
285 if (entry ==
nullptr) {
286 if (_pageList->size() >= _maxPages)
287 entry = useLastPage(page);
288 if (entry ==
nullptr)
289 entry = addNewPage(page);
298 auto* entry = findPageEntry(keyValue);
299 return entry !=
nullptr ? entry->getObject() :
nullptr;
304 auto* entry = getPageEntry(keyValue);
305 return entry !=
nullptr ? entry->getObject() :
nullptr;
310 auto* entry = putPageEntry(keyValue);
311 return entry !=
nullptr ? entry->getObject() :
nullptr;
316 auto* entry = putPageEntry(page);
317 return entry !=
nullptr ? entry->getObject() :
nullptr;
323 cout <<
"\n---------------------- Cache Status -------------------------" << endl;
325 cout <<
"File Name : " << name << endl;
327 cout <<
"Configured Max. Pages : " << getMaxPages() << endl;
328 cout <<
"Total Pages Loaded : " << _pageList->size() << endl;
329 cout <<
"Total Dirty Pages : " << getDirtyPageCount() << endl;
330 cout <<
"\n----------------------- Statistics --------------------------" << endl;
331 cout <<
"Page Flushes : " << _pageFlushes << endl;
332 cout <<
"Page Accesses : " << _pageAccesses << endl;
333 cout <<
"Page Replacements : " << _pageReplacements << endl;
T * getObject() const
Definition: DynaLinkedListImpl.h:58
void resetStats()
Definition: DynaCacheImpl.h:62
virtual void flushPage(T *page)
Definition: DynaCacheImpl.h:147
virtual T * getPageForRemoval(LinkedEntry< T > *entry)
Definition: DynaCacheImpl.h:181
void setOwnsMembers(bool ownsMembers)
Definition: DynaLinkedListImpl.h:149
Definition: IDynaCacheListener.h:11
bool isEmpty()
Definition: DynaCacheImpl.h:76
void touchEntry(LinkedEntry< T > *entry)
Definition: DynaCacheImpl.h:153
DynaLinkedList< T > * getPageList()
Definition: DynaCacheImpl.h:119
bool isFull()
Definition: DynaCacheImpl.h:81
Definition: DynaLinkedList.h:32
T * putPage(Index keyValue)
Definition: DynaCacheImpl.h:309
Definition: DynaCache.h:16
void setAutoTouch(bool autoTouch)
Definition: DynaCacheImpl.h:52
virtual void setListener(IDynaCacheListener< T > *listener)
Definition: DynaCacheImpl.h:133
virtual ~DynaCache()
Definition: DynaCacheImpl.h:25
LinkedEntry< T > * useLastPage(Index keyValue)
Definition: DynaCacheImpl.h:188
int getPageCount()
Definition: DynaCacheImpl.h:114
Definition: DynaHashMap.h:73
Definition: ICachePage.h:18
DynaLinkedList< T > * _pageList
Definition: DynaCache.h:20
LinkedEntry< T > * findPageEntry(Index keyValue)
Definition: DynaCacheImpl.h:252
DynaCache()
Definition: DynaCacheImpl.h:17
T * findPage(Index keyValue)
Definition: DynaCacheImpl.h:297
Definition: IntWrapper.h:13
Definition: DynaLinkedList.h:28
DynaCache< T > * copy() override
Definition: DynaCacheImpl.h:47
int getDirtyPageCount()
Definition: DynaCacheImpl.h:97
T * getPage(Index keyValue)
Definition: DynaCacheImpl.h:303
void removeLastPage()
Definition: DynaCacheImpl.h:233
DynaHashMap< Index, LinkedEntry< T > > * _pageMap
Definition: DynaCache.h:21
void removePage(Index keyValue)
Definition: DynaCacheImpl.h:223
void clear()
Definition: DynaCacheImpl.h:69
int _maxPages
Definition: DynaCache.h:19
bool isAutoTouch()
Definition: DynaCacheImpl.h:57
LinkedEntry< T > * addNewPage(T *page)
Definition: DynaCacheImpl.h:171
bool isDirty()
Definition: DynaCacheImpl.h:86
Definition: Exception.h:13
T * getNewPage()
Definition: DynaCacheImpl.h:161
void printStatReport(String &name)
Definition: DynaCacheImpl.h:321
LinkedEntry< T > * putPageEntry(Index keyValue)
Definition: DynaCacheImpl.h:266
void setMaxPages(int maxPages)
Definition: DynaCacheImpl.h:124
void setOwnsMembers(bool ownsMembers)
Definition: DynaHashMap.h:121
IDynaCacheListener< T > * _listener
Definition: DynaCache.h:22
int getMaxPages()
Definition: DynaCacheImpl.h:109
LinkedEntry< T > * getPageEntry(Index keyValue)
Definition: DynaCacheImpl.h:258
virtual void purgePages(double removePercent=0.80)
Definition: DynaCacheImpl.h:243
void flush()
Definition: DynaCacheImpl.h:138