summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2008-11-10 23:10:38 +0000
committerMike Buland <eichlan@xagasoft.com>2008-11-10 23:10:38 +0000
commit4bbeb6208ac33f71a09701cc5251f0412977946e (patch)
tree038a71056f91d7ce3b26f90fde3519d404e7cb63
parent61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9 (diff)
downloadlibbu++-4bbeb6208ac33f71a09701cc5251f0412977946e.tar.gz
libbu++-4bbeb6208ac33f71a09701cc5251f0412977946e.tar.bz2
libbu++-4bbeb6208ac33f71a09701cc5251f0412977946e.tar.xz
libbu++-4bbeb6208ac33f71a09701cc5251f0412977946e.zip
Ok, the cache-id officiation is being delegated to the CacheHandlers, this is
just fine, since they can do it any way they want. The Congo CacheHandlers will all have to be specialized versions of the generic ones, but they'll use all the general functionality, just make up IDs differently. It'll rock.
-rw-r--r--src/cachable.h9
-rw-r--r--src/cache.h31
-rw-r--r--src/cachehandler.cpp8
-rw-r--r--src/cachehandler.h16
-rw-r--r--src/cachehandlernids.cpp0
-rw-r--r--src/cachehandlernids.h0
-rw-r--r--src/cptr.h10
-rw-r--r--src/tests/cache.cpp30
8 files changed, 91 insertions, 13 deletions
diff --git a/src/cachable.h b/src/cachable.h
index 529da6f..a54c55b 100644
--- a/src/cachable.h
+++ b/src/cachable.h
@@ -16,4 +16,13 @@ namespace Bu
16 template<> long getCacheId<Cachable>( const Cachable *o ); 16 template<> long getCacheId<Cachable>( const Cachable *o );
17}; 17};
18 18
19#define DECL_CACHABLE( name ) \
20 namespace Bu { template<> long getCacheId<name>( const name *o ); }
21
22#define DEF_CACHABLE( name ) \
23 template<> long Bu::getCacheId<name>( const name *o ) \
24 { \
25 return getCacheId<Bu::Cachable>( (Bu::Cachable *)o ); \
26 }
27
19#endif 28#endif
diff --git a/src/cache.h b/src/cache.h
index 344d1c6..8ab0659 100644
--- a/src/cache.h
+++ b/src/cache.h
@@ -3,6 +3,8 @@
3 3
4#include "bu/cptr.h" 4#include "bu/cptr.h"
5#include "bu/hash.h" 5#include "bu/hash.h"
6#include "bu/list.h"
7#include "bu/cachehandler.h"
6 8
7#define BU_TRACE 9#define BU_TRACE
8#include "bu/trace.h" 10#include "bu/trace.h"
@@ -29,6 +31,21 @@ namespace Bu
29 virtual ~Cache() 31 virtual ~Cache()
30 { 32 {
31 TRACE(); 33 TRACE();
34 for( HandlerList::iterator i = lHandler.begin();
35 i != lHandler.end(); i++ )
36 {
37 delete *i;
38 }
39 }
40
41 void appendHandler( CacheHandler *pHand )
42 {
43 lHandler.append( pHand );
44 }
45
46 void prependHandler( CacheHandler *pHand )
47 {
48 lHandler.prepend( pHand );
32 } 49 }
33 50
34 Ptr insert( obtype *pData ) 51 Ptr insert( obtype *pData )
@@ -39,6 +56,18 @@ namespace Bu
39 return Ptr( *this, pData ); 56 return Ptr( *this, pData );
40 } 57 }
41 58
59 Ptr get( cid cId )
60 {
61 TRACE();
62 return Ptr( *this, hEnt.get( cId ).pData );
63 }
64
65 int getRefCnt( cid cId )
66 {
67 TRACE();
68 return hEnt.get( cId ).iRefs;
69 }
70
42 private: 71 private:
43 void incRef( obtype *pData ) 72 void incRef( obtype *pData )
44 { 73 {
@@ -64,6 +93,8 @@ namespace Bu
64 typedef Bu::Hash<cid, CacheEntry> CidHash; 93 typedef Bu::Hash<cid, CacheEntry> CidHash;
65 //RefHash hRefs; 94 //RefHash hRefs;
66 CidHash hEnt; 95 CidHash hEnt;
96 typedef Bu::List<CacheHandler *> HandlerList;
97 HandlerList lHandler;
67 }; 98 };
68}; 99};
69 100
diff --git a/src/cachehandler.cpp b/src/cachehandler.cpp
index d208e98..efd12e7 100644
--- a/src/cachehandler.cpp
+++ b/src/cachehandler.cpp
@@ -1,2 +1,10 @@
1#include "bu/cachehandler.h" 1#include "bu/cachehandler.h"
2 2
3Bu::CacheHandler::CacheHandler()
4{
5}
6
7Bu::CacheHandler::~CacheHandler()
8{
9}
10
diff --git a/src/cachehandler.h b/src/cachehandler.h
index 72fb2b2..6ce1471 100644
--- a/src/cachehandler.h
+++ b/src/cachehandler.h
@@ -3,21 +3,13 @@
3 3
4namespace Bu 4namespace Bu
5{ 5{
6 template<class obtype>
7 class CacheHandler 6 class CacheHandler
8 { 7 {
9 public: 8 public:
10 CacheHandler() 9 CacheHandler();
11 { 10 virtual ~CacheHandler();
12 } 11 virtual void load()=0;
13 12 virtual void unload()=0;
14 virtual ~CacheHandler()
15 {
16 }
17
18 void forceLoad()
19 {
20 }
21 13
22 private: 14 private:
23 }; 15 };
diff --git a/src/cachehandlernids.cpp b/src/cachehandlernids.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cachehandlernids.cpp
diff --git a/src/cachehandlernids.h b/src/cachehandlernids.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/cachehandlernids.h
diff --git a/src/cptr.h b/src/cptr.h
index 138ace8..5aafbd3 100644
--- a/src/cptr.h
+++ b/src/cptr.h
@@ -23,6 +23,16 @@ namespace Bu
23 rCache.decRef( pData ); 23 rCache.decRef( pData );
24 } 24 }
25 25
26 obtype &operator*()
27 {
28 return *pData;
29 }
30
31 obtype *operator->()
32 {
33 return pData;
34 }
35
26 private: 36 private:
27 Bu::Cache<obtype> &rCache; 37 Bu::Cache<obtype> &rCache;
28 obtype *pData; 38 obtype *pData;
diff --git a/src/tests/cache.cpp b/src/tests/cache.cpp
index e51c31b..f05de57 100644
--- a/src/tests/cache.cpp
+++ b/src/tests/cache.cpp
@@ -8,24 +8,52 @@ class Bob : public Bu::Cachable
8public: 8public:
9 Bob() 9 Bob()
10 { 10 {
11 TRACE();
11 } 12 }
12 13
13 virtual ~Bob() 14 virtual ~Bob()
14 { 15 {
16 TRACE();
17 }
18
19 void setInt( int i )
20 {
21 TRACE();
22 iInt = i;
23 }
24
25 int getInt()
26 {
27 return iInt;
15 } 28 }
16 29
17 long getCacheId() const 30 long getCacheId() const
18 { 31 {
32 TRACE();
19 return 0; 33 return 0;
20 } 34 }
21 35
22 int iInt; 36 int iInt;
23}; 37};
24 38
39DECL_CACHABLE( Bob );
40DEF_CACHABLE( Bob );
41
25int main() 42int main()
26{ 43{
27 Bu::Cache<Bob> bobCache; 44 Bu::Cache<Bob> bobCache;
28 45
29// Bu::CPtr<Bob> pB = bobCache.insert( new Bob() ); 46 Bu::CPtr<Bob> pB1 = bobCache.insert( new Bob() );
47
48 (*pB1).setInt( 44 );
49
50 printf("RefCnt = %d\n", bobCache.getRefCnt( 0 ) );
51
52 Bu::CPtr<Bob> pB2 = bobCache.get( 0 );
53
54 printf("RefCnt = %d\n", bobCache.getRefCnt( 0 ) );
55
56 printf("Int = %d\n", pB2->getInt() );
57
30} 58}
31 59