summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/core/opimaccesstemplate.h
Unidiff
Diffstat (limited to 'libopie2/opiepim/core/opimaccesstemplate.h') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/core/opimaccesstemplate.h57
1 files changed, 54 insertions, 3 deletions
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h
index 31ab516..92d7192 100644
--- a/libopie2/opiepim/core/opimaccesstemplate.h
+++ b/libopie2/opiepim/core/opimaccesstemplate.h
@@ -8,4 +8,5 @@
8#include <opie/orecordlist.h> 8#include <opie/orecordlist.h>
9 9
10#include "opimcache.h"
10#include "otemplatebase.h" 11#include "otemplatebase.h"
11 12
@@ -24,4 +25,5 @@ public:
24 typedef ORecordList<T> List; 25 typedef ORecordList<T> List;
25 typedef OPimAccessBackend<T> BackEnd; 26 typedef OPimAccessBackend<T> BackEnd;
27 typedef OPimCache<T> Cache;
26 28
27 /** 29 /**
@@ -74,4 +76,10 @@ public:
74 virtual T find( int uid )const; 76 virtual T find( int uid )const;
75 77
78 /**
79 * read ahead cache find method ;)
80 */
81 virtual T find( int uid, const QArray<int>&,
82 uint current, CacheDirection dir = Forward )const;
83
76 /* invalidate cache here */ 84 /* invalidate cache here */
77 /** 85 /**
@@ -100,4 +108,10 @@ public:
100 */ 108 */
101 virtual bool replace( const T& t) ; 109 virtual bool replace( const T& t) ;
110
111 /**
112 * @internal
113 */
114 void cache( const T& )const;
115 void setSaneCacheSize( int );
102protected: 116protected:
103 /** 117 /**
@@ -112,4 +126,5 @@ protected:
112 BackEnd* backEnd(); 126 BackEnd* backEnd();
113 BackEnd* m_backEnd; 127 BackEnd* m_backEnd;
128 Cache m_cache;
114 129
115}; 130};
@@ -119,5 +134,6 @@ OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end )
119 : OTemplateBase<T>(), m_backEnd( end ) 134 : OTemplateBase<T>(), m_backEnd( end )
120{ 135{
121 136 if (end )
137 end->setFrontend( this );
122} 138}
123template <class T> 139template <class T>
@@ -128,4 +144,5 @@ OPimAccessTemplate<T>::~OPimAccessTemplate() {
128template <class T> 144template <class T>
129bool OPimAccessTemplate<T>::load() { 145bool OPimAccessTemplate<T>::load() {
146 invalidateCache();
130 return m_backEnd->load(); 147 return m_backEnd->load();
131} 148}
@@ -155,4 +172,24 @@ template <class T>
155T OPimAccessTemplate<T>::find( int uid ) const{ 172T OPimAccessTemplate<T>::find( int uid ) const{
156 T t = m_backEnd->find( uid ); 173 T t = m_backEnd->find( uid );
174 cache( t );
175 return t;
176}
177template <class T>
178T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar,
179 uint current, CacheDirection dir )const {
180 /*
181 * better do T.isEmpty()
182 * after a find this way we would
183 * avoid two finds in QCache...
184 */
185 // qWarning("find it now %d", uid );
186 if (m_cache.contains( uid ) ) {
187 qWarning("m cache contains %d", uid);
188 return m_cache.find( uid );
189 }
190
191 T t = m_backEnd->find( uid, ar, current, dir );
192 qWarning("found it and cache it now %d", uid);
193 cache( t );
157 return t; 194 return t;
158} 195}
@@ -164,21 +201,24 @@ void OPimAccessTemplate<T>::clear() {
164template <class T> 201template <class T>
165bool OPimAccessTemplate<T>::add( const T& t ) { 202bool OPimAccessTemplate<T>::add( const T& t ) {
203 cache( t );
166 return m_backEnd->add( t ); 204 return m_backEnd->add( t );
167} 205}
168template <class T> 206template <class T>
169bool OPimAccessTemplate<T>::remove( const T& t ) { 207bool OPimAccessTemplate<T>::remove( const T& t ) {
170 return m_backEnd->remove( t.uid() ); 208 return remove( t.uid() );
171} 209}
172template <class T> 210template <class T>
173bool OPimAccessTemplate<T>::remove( int uid ) { 211bool OPimAccessTemplate<T>::remove( int uid ) {
212 m_cache.remove( uid );
174 return m_backEnd->remove( uid ); 213 return m_backEnd->remove( uid );
175} 214}
176template <class T> 215template <class T>
177bool OPimAccessTemplate<T>::replace( const T& t ) { 216bool OPimAccessTemplate<T>::replace( const T& t ) {
217 m_cache.replace( t );
178 return m_backEnd->replace( t ); 218 return m_backEnd->replace( t );
179} 219}
180template <class T> 220template <class T>
181void OPimAccessTemplate<T>::invalidateCache() { 221void OPimAccessTemplate<T>::invalidateCache() {
182 222 m_cache.invalidate();
183} 223}
184template <class T> 224template <class T>
@@ -193,4 +233,15 @@ template <class T>
193void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { 233void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) {
194 m_backEnd = end; 234 m_backEnd = end;
235 if (m_backEnd )
236 m_backEnd->setFrontend( this );
237}
238template <class T>
239void OPimAccessTemplate<T>::cache( const T& t ) const{
240 /* hacky we need to work around the const*/
241 ((OPimAccessTemplate<T>*)this)->m_cache.add( t );
242}
243template <class T>
244void OPimAccessTemplate<T>::setSaneCacheSize( int size ) {
245 m_cache.setSize( size );
195} 246}
196#endif 247#endif