diff options
author | Mike Buland <eichlan@xagasoft.com> | 2008-11-10 23:10:38 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2008-11-10 23:10:38 +0000 |
commit | 4bbeb6208ac33f71a09701cc5251f0412977946e (patch) | |
tree | 038a71056f91d7ce3b26f90fde3519d404e7cb63 | |
parent | 61edfe804eb1a1dbf96fcdf2f1b700ed1cfa7ff9 (diff) | |
download | libbu++-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.h | 9 | ||||
-rw-r--r-- | src/cache.h | 31 | ||||
-rw-r--r-- | src/cachehandler.cpp | 8 | ||||
-rw-r--r-- | src/cachehandler.h | 16 | ||||
-rw-r--r-- | src/cachehandlernids.cpp | 0 | ||||
-rw-r--r-- | src/cachehandlernids.h | 0 | ||||
-rw-r--r-- | src/cptr.h | 10 | ||||
-rw-r--r-- | src/tests/cache.cpp | 30 |
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 | ||
3 | Bu::CacheHandler::CacheHandler() | ||
4 | { | ||
5 | } | ||
6 | |||
7 | Bu::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 | ||
4 | namespace Bu | 4 | namespace 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 | |||
@@ -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 | |||
8 | public: | 8 | public: |
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 | ||
39 | DECL_CACHABLE( Bob ); | ||
40 | DEF_CACHABLE( Bob ); | ||
41 | |||
25 | int main() | 42 | int 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 | ||