Files
secondo/Algebras/FileIndexAlgebra/Cache/LruCache.h
2026-01-23 17:03:45 +08:00

115 lines
2.5 KiB
C++

/*
Least recently used cache
*/
#ifndef LRUCACHE_H
#define LRUCACHE_H
#include <cstddef> // size_t
#include "CacheBase.h"
#include "IncLruCache.h"
namespace fialgebra {
namespace cache {
class LruCache : public CacheBase
{
public:
// ctor
// fileName : Dateiname, Datei muss existieren
// pageSize : Seitengroesse
// pageCount : Anzahl Seiten, die maximal im Cache gehalten werden
LruCache( const char* fileName, size_t pageSize, size_t pageCount );
~LruCache();
// CacheBase::Read()
// Liest die ersten 'length' Bytes der Seite 'pageNo'.
// Liefert Zeiger auf char*-Array.
size_t Read( size_t pageNo, size_t length );
// CacheBase::Write()
// Schreibt die ersten 'length' Bytes des char*-Array
// auf die Seite 'pageNo'.
void Write( size_t pageNo, size_t arr, size_t length );
// CacheBase::Flush()
// Schreibt ausstehende Aenderungen in die Datei.
void Flush();
// CacheBase::GetHitRate()
// Anteil der Cache-Treffer (Anfragen, die aus dem Cache bedient werden
// konnten) an der Gesamtanzahl an Anfragen. Liegt im Intervall [0,1].
// Dient nur zur Info.
double GetHitRate();
private:
// Nested class
// Element, das im Cache landet und neben den eigentlichen Daten der
// entsprechenden Page noch ein paar Verwaltungs-Infos enthaellt.
class CacheElement
{
public:
// ctor
CacheElement( size_t value, size_t length, bool changed );
~CacheElement();
// Value, hier Adresse auf char* der Page
size_t GetValue();
// Gruesse der Page
size_t GetLength();
// Element hat sich geaendert
bool HasChanged();
private:
size_t _value;
size_t _length;
bool _changed;
};
// Schreibt eine Page in den Cache
void WriteCache( size_t pageNo, size_t arr,
size_t length, bool changed );
// Liesst eine Page aus dem Cache
size_t ReadCache( size_t pageNo, size_t length );
// Delete callback, wird vom Cache aufgerufen, wenn ein
// Element aus diesem entfernt wird.
void DeleteCallback( size_t key, CacheElement elem );
// Eigentlicher Cache
include::IncLruCache<size_t, CacheElement> _incCache;
// Gesamtzahl Page-Misses
size_t totalMiss = 0;
// Gesamtzahl Page-Hits
size_t totalHit = 0;
}; // class LruCache
} // namespace cache
} // namespace fialgebra
#endif // LRUCACHE_H