diff options
author | Mike Buland <eichlan@xagasoft.com> | 2008-10-09 20:20:34 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2008-10-09 20:20:34 +0000 |
commit | 4808617ef54d40efcf1a3ed30525898defb74e10 (patch) | |
tree | e16763eb646fdf3dea7c32a8d57c147356be9299 | |
parent | fecbea5970bb89c15b35f5df5b09914b4c91efe0 (diff) | |
download | libbu++-4808617ef54d40efcf1a3ed30525898defb74e10.tar.gz libbu++-4808617ef54d40efcf1a3ed30525898defb74e10.tar.bz2 libbu++-4808617ef54d40efcf1a3ed30525898defb74e10.tar.xz libbu++-4808617ef54d40efcf1a3ed30525898defb74e10.zip |
More cache development. I'm going to have to switch from template functions to
functors. I like template functions a little more, but functors can be at
least as fast. It won't be much of a change.
Diffstat (limited to '')
-rw-r--r-- | src/cachable.cpp | 15 | ||||
-rw-r--r-- | src/cachable.h | 19 | ||||
-rw-r--r-- | src/cache.h | 49 | ||||
-rw-r--r-- | src/cptr.h | 14 | ||||
-rw-r--r-- | src/membuf.cpp | 2 | ||||
-rw-r--r-- | src/tests/cache.cpp | 31 |
6 files changed, 126 insertions, 4 deletions
diff --git a/src/cachable.cpp b/src/cachable.cpp new file mode 100644 index 0000000..7fa2d23 --- /dev/null +++ b/src/cachable.cpp | |||
@@ -0,0 +1,15 @@ | |||
1 | #include "bu/cachable.h" | ||
2 | |||
3 | Bu::Cachable::Cachable() | ||
4 | { | ||
5 | } | ||
6 | |||
7 | Bu::Cachable::~Cachable() | ||
8 | { | ||
9 | } | ||
10 | |||
11 | template<> long Bu::getCacheId<Bu::Cachable>( const Bu::Cachable *o ) | ||
12 | { | ||
13 | return o->getCacheId(); | ||
14 | } | ||
15 | |||
diff --git a/src/cachable.h b/src/cachable.h new file mode 100644 index 0000000..529da6f --- /dev/null +++ b/src/cachable.h | |||
@@ -0,0 +1,19 @@ | |||
1 | #ifndef BU_CACHABLE_H | ||
2 | #define BU_CACHABLE_H | ||
3 | |||
4 | namespace Bu | ||
5 | { | ||
6 | class Cachable | ||
7 | { | ||
8 | public: | ||
9 | Cachable(); | ||
10 | virtual ~Cachable(); | ||
11 | |||
12 | virtual long getCacheId() const =0; | ||
13 | }; | ||
14 | |||
15 | template<class obtype> long getCacheId( const obtype *o ); | ||
16 | template<> long getCacheId<Cachable>( const Cachable *o ); | ||
17 | }; | ||
18 | |||
19 | #endif | ||
diff --git a/src/cache.h b/src/cache.h index 24ef652..344d1c6 100644 --- a/src/cache.h +++ b/src/cache.h | |||
@@ -1,20 +1,69 @@ | |||
1 | #ifndef BU_CACHE_H | 1 | #ifndef BU_CACHE_H |
2 | #define BU_CACHE_H | 2 | #define BU_CACHE_H |
3 | 3 | ||
4 | #include "bu/cptr.h" | ||
5 | #include "bu/hash.h" | ||
6 | |||
7 | #define BU_TRACE | ||
8 | #include "bu/trace.h" | ||
9 | |||
4 | namespace Bu | 10 | namespace Bu |
5 | { | 11 | { |
12 | template<class obtype> class Cache; | ||
13 | template<class obtype> long getCacheId( const obtype *o ); | ||
14 | |||
6 | template<class obtype> | 15 | template<class obtype> |
7 | class Cache | 16 | class Cache |
8 | { | 17 | { |
18 | friend class Bu::CPtr<obtype>; | ||
19 | typedef Bu::CPtr<obtype> Ptr; | ||
20 | public: | ||
21 | typedef long cid; /**< Cache ID type. Unique cache entry ID. */ | ||
22 | |||
9 | public: | 23 | public: |
10 | Cache() | 24 | Cache() |
11 | { | 25 | { |
26 | TRACE(); | ||
12 | } | 27 | } |
13 | 28 | ||
14 | virtual ~Cache() | 29 | virtual ~Cache() |
15 | { | 30 | { |
31 | TRACE(); | ||
32 | } | ||
33 | |||
34 | Ptr insert( obtype *pData ) | ||
35 | { | ||
36 | TRACE(); | ||
37 | CacheEntry e = {pData, 0}; | ||
38 | hEnt.insert( getCacheId( pData ), e ); | ||
39 | return Ptr( *this, pData ); | ||
16 | } | 40 | } |
17 | 41 | ||
42 | private: | ||
43 | void incRef( obtype *pData ) | ||
44 | { | ||
45 | TRACE(); | ||
46 | hEnt.get( getCacheId( pData ) ).iRefs++; | ||
47 | } | ||
48 | |||
49 | void decRef( obtype *pData ) | ||
50 | { | ||
51 | TRACE(); | ||
52 | CacheEntry &e = hEnt.get( getCacheId( pData ) ); | ||
53 | e.iRefs--; | ||
54 | } | ||
55 | |||
56 | private: | ||
57 | typedef struct CacheEntry | ||
58 | { | ||
59 | obtype *pData; | ||
60 | int iRefs; | ||
61 | } CacheEntry; | ||
62 | |||
63 | //typedef Bu::Hash<ptrdiff_t, int> RefHash; | ||
64 | typedef Bu::Hash<cid, CacheEntry> CidHash; | ||
65 | //RefHash hRefs; | ||
66 | CidHash hEnt; | ||
18 | }; | 67 | }; |
19 | }; | 68 | }; |
20 | 69 | ||
@@ -1,23 +1,31 @@ | |||
1 | #ifndef BU_C_PTR_H | 1 | #ifndef BU_C_PTR_H |
2 | #define BU_C_PTR_H | 2 | #define BU_C_PTR_H |
3 | 3 | ||
4 | #include "bu/cache.h" | ||
5 | |||
6 | namespace Bu | 4 | namespace Bu |
7 | { | 5 | { |
6 | template<class obtype> class Cache; | ||
7 | |||
8 | template<class obtype> | 8 | template<class obtype> |
9 | class CPtr | 9 | class CPtr |
10 | { | 10 | { |
11 | friend class Bu::Cache<obtype>; | 11 | friend class Bu::Cache<obtype>; |
12 | private: | 12 | private: |
13 | CPtr( Cache<obtype> &rCache, obtype &rData ) | 13 | CPtr( Cache<obtype> &rCache, obtype *pData ) : |
14 | rCache( rCache ), | ||
15 | pData( pData ) | ||
14 | { | 16 | { |
17 | rCache.incRef( pData ); | ||
15 | } | 18 | } |
16 | 19 | ||
17 | public: | 20 | public: |
18 | virtual ~CPtr() | 21 | virtual ~CPtr() |
19 | { | 22 | { |
23 | rCache.decRef( pData ); | ||
20 | } | 24 | } |
25 | |||
26 | private: | ||
27 | Bu::Cache<obtype> &rCache; | ||
28 | obtype *pData; | ||
21 | }; | 29 | }; |
22 | }; | 30 | }; |
23 | 31 | ||
diff --git a/src/membuf.cpp b/src/membuf.cpp index e7c7ac8..f22a8de 100644 --- a/src/membuf.cpp +++ b/src/membuf.cpp | |||
@@ -52,7 +52,7 @@ size_t Bu::MemBuf::write( const void *pBuf, size_t nBytes ) | |||
52 | { | 52 | { |
53 | // Trickier, we must do this in two parts, overwrite, then append | 53 | // Trickier, we must do this in two parts, overwrite, then append |
54 | // Frist, overwrite. | 54 | // Frist, overwrite. |
55 | int iOver = sBuf.getSize() - nPos; | 55 | size_t iOver = sBuf.getSize() - nPos; |
56 | if( iOver > nBytes ) | 56 | if( iOver > nBytes ) |
57 | iOver = nBytes; | 57 | iOver = nBytes; |
58 | memcpy( sBuf.getStr()+nPos, pBuf, iOver ); | 58 | memcpy( sBuf.getStr()+nPos, pBuf, iOver ); |
diff --git a/src/tests/cache.cpp b/src/tests/cache.cpp new file mode 100644 index 0000000..e51c31b --- /dev/null +++ b/src/tests/cache.cpp | |||
@@ -0,0 +1,31 @@ | |||
1 | #include <stdio.h> | ||
2 | |||
3 | #include "bu/cache.h" | ||
4 | #include "bu/cachable.h" | ||
5 | |||
6 | class Bob : public Bu::Cachable | ||
7 | { | ||
8 | public: | ||
9 | Bob() | ||
10 | { | ||
11 | } | ||
12 | |||
13 | virtual ~Bob() | ||
14 | { | ||
15 | } | ||
16 | |||
17 | long getCacheId() const | ||
18 | { | ||
19 | return 0; | ||
20 | } | ||
21 | |||
22 | int iInt; | ||
23 | }; | ||
24 | |||
25 | int main() | ||
26 | { | ||
27 | Bu::Cache<Bob> bobCache; | ||
28 | |||
29 | // Bu::CPtr<Bob> pB = bobCache.insert( new Bob() ); | ||
30 | } | ||
31 | |||