aboutsummaryrefslogtreecommitdiff
path: root/src/unstable/cachebase.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/unstable/cachebase.h')
-rw-r--r--src/unstable/cachebase.h28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/unstable/cachebase.h b/src/unstable/cachebase.h
index af2884c..bb543dd 100644
--- a/src/unstable/cachebase.h
+++ b/src/unstable/cachebase.h
@@ -328,6 +328,7 @@ namespace Bu
328 328
329 typedef CacheEntry<keytype, obtype> Entry; 329 typedef CacheEntry<keytype, obtype> Entry;
330 typedef Bu::List<keytype> KeyList; 330 typedef Bu::List<keytype> KeyList;
331 typedef CacheObject<keytype, obtype> ObjectType;
331 332
332 CachePtr<keytype, obtype> insert( obtype *pObject ) 333 CachePtr<keytype, obtype> insert( obtype *pObject )
333 { 334 {
@@ -466,7 +467,10 @@ namespace Bu
466 virtual void _create( const obtype *o )=0; 467 virtual void _create( const obtype *o )=0;
467 virtual void _erase( const keytype &k )=0; 468 virtual void _erase( const keytype &k )=0;
468 469
469 virtual obtype *_load( const keytype &k )=0; 470 virtual obtype *_load(
471 typename Bu::CacheObject<keytype, obtype>::Initializer &initObj,
472 const keytype &k
473 )=0;
470 virtual void _save( const obtype *o )=0; 474 virtual void _save( const obtype *o )=0;
471 475
472 virtual void _sync()=0; 476 virtual void _sync()=0;
@@ -481,7 +485,10 @@ namespace Bu
481 hChanged.insert( pObject->getKey(), true ); 485 hChanged.insert( pObject->getKey(), true );
482 mCacheEntry.unlockWrite(); 486 mCacheEntry.unlockWrite();
483 _create( pObject ); 487 _create( pObject );
484 pObject->setCache( this, pEnt ); 488 // I'm not sold on the ordering here...or the fact we're not
489 // using th initilizer
490 pObject->setCache( this );
491 pObject->setCacheEntry( pEnt );
485 492
486 return pEnt; 493 return pEnt;
487 } 494 }
@@ -497,9 +504,12 @@ namespace Bu
497 catch(...) 504 catch(...)
498 { 505 {
499 // try to load the object from the backing store 506 // try to load the object from the backing store
500 obtype *pObject = _load( k ); 507 typename ObjectType::Initializer initObj(
508 this
509 );
510 obtype *pObject = _load( initObj, k );
501 pEnt = new Entry( pObject ); 511 pEnt = new Entry( pObject );
502 pObject->setCache( this, pEnt ); 512 pObject->setCacheEntry( pEnt );
503 Bu::ReadWriteMutex::WriteLocker wl( mCacheEntry ); 513 Bu::ReadWriteMutex::WriteLocker wl( mCacheEntry );
504 hCacheEntry.insert( k, pEnt ); 514 hCacheEntry.insert( k, pEnt );
505 } 515 }
@@ -536,11 +546,15 @@ namespace Bu
536 ar << *pObject; 546 ar << *pObject;
537 } 547 }
538 548
539 template<typename obtype> 549 template<typename keytype, typename obtype>
540 obtype *_cacheObjectLoad( Bu::Stream &s ) 550 obtype *_cacheObjectLoad(
551 typename Bu::CacheObject<keytype, obtype>::Initializer &initObject,
552 const keytype & /*rKey*/,
553 Bu::Stream &s
554 )
541 { 555 {
542 Bu::Archive ar( s, Bu::Archive::load ); 556 Bu::Archive ar( s, Bu::Archive::load );
543 obtype *ret = new obtype(); 557 obtype *ret = initObject(new obtype());
544 ar >> *ret; 558 ar >> *ret;
545 return ret; 559 return ret;
546 } 560 }