summaryrefslogtreecommitdiff
path: root/libopie/pim/opimaccesstemplate.h
Side-by-side diff
Diffstat (limited to 'libopie/pim/opimaccesstemplate.h') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/opimaccesstemplate.h57
1 files changed, 54 insertions, 3 deletions
diff --git a/libopie/pim/opimaccesstemplate.h b/libopie/pim/opimaccesstemplate.h
index 31ab516..92d7192 100644
--- a/libopie/pim/opimaccesstemplate.h
+++ b/libopie/pim/opimaccesstemplate.h
@@ -8,4 +8,5 @@
#include <opie/orecordlist.h>
+#include "opimcache.h"
#include "otemplatebase.h"
@@ -24,4 +25,5 @@ public:
typedef ORecordList<T> List;
typedef OPimAccessBackend<T> BackEnd;
+ typedef OPimCache<T> Cache;
/**
@@ -74,4 +76,10 @@ public:
virtual T find( int uid )const;
+ /**
+ * read ahead cache find method ;)
+ */
+ virtual T find( int uid, const QArray<int>&,
+ uint current, CacheDirection dir = Forward )const;
+
/* invalidate cache here */
/**
@@ -100,4 +108,10 @@ public:
*/
virtual bool replace( const T& t) ;
+
+ /**
+ * @internal
+ */
+ void cache( const T& )const;
+ void setSaneCacheSize( int );
protected:
/**
@@ -112,4 +126,5 @@ protected:
BackEnd* backEnd();
BackEnd* m_backEnd;
+ Cache m_cache;
};
@@ -119,5 +134,6 @@ OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end )
: OTemplateBase<T>(), m_backEnd( end )
{
-
+ if (end )
+ end->setFrontend( this );
}
template <class T>
@@ -128,4 +144,5 @@ OPimAccessTemplate<T>::~OPimAccessTemplate() {
template <class T>
bool OPimAccessTemplate<T>::load() {
+ invalidateCache();
return m_backEnd->load();
}
@@ -155,4 +172,24 @@ template <class T>
T OPimAccessTemplate<T>::find( int uid ) const{
T t = m_backEnd->find( uid );
+ cache( t );
+ return t;
+}
+template <class T>
+T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar,
+ uint current, CacheDirection dir )const {
+ /*
+ * better do T.isEmpty()
+ * after a find this way we would
+ * avoid two finds in QCache...
+ */
+ // qWarning("find it now %d", uid );
+ if (m_cache.contains( uid ) ) {
+ qWarning("m cache contains %d", uid);
+ return m_cache.find( uid );
+ }
+
+ T t = m_backEnd->find( uid, ar, current, dir );
+ qWarning("found it and cache it now %d", uid);
+ cache( t );
return t;
}
@@ -164,21 +201,24 @@ void OPimAccessTemplate<T>::clear() {
template <class T>
bool OPimAccessTemplate<T>::add( const T& t ) {
+ cache( t );
return m_backEnd->add( t );
}
template <class T>
bool OPimAccessTemplate<T>::remove( const T& t ) {
- return m_backEnd->remove( t.uid() );
+ return remove( t.uid() );
}
template <class T>
bool OPimAccessTemplate<T>::remove( int uid ) {
+ m_cache.remove( uid );
return m_backEnd->remove( uid );
}
template <class T>
bool OPimAccessTemplate<T>::replace( const T& t ) {
+ m_cache.replace( t );
return m_backEnd->replace( t );
}
template <class T>
void OPimAccessTemplate<T>::invalidateCache() {
-
+ m_cache.invalidate();
}
template <class T>
@@ -193,4 +233,15 @@ template <class T>
void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) {
m_backEnd = end;
+ if (m_backEnd )
+ m_backEnd->setFrontend( this );
+}
+template <class T>
+void OPimAccessTemplate<T>::cache( const T& t ) const{
+ /* hacky we need to work around the const*/
+ ((OPimAccessTemplate<T>*)this)->m_cache.add( t );
+}
+template <class T>
+void OPimAccessTemplate<T>::setSaneCacheSize( int size ) {
+ m_cache.setSize( size );
}
#endif