23 #define DUMP_CACHE_STAT
26 #define ca_assert(cond) arb_assert(cond)
27 #define ca_assert_expensive(cond) // arb_assert(cond) // uncomment to enable expensive assertions
32 template <
typename SMARTPTR>
class Cache;
37 typedef typename std::list< CacheEntry<SMARTPTR> >::iterator EntryIter;
39 static EntryPtr& no_handle() {
55 void setClientPtr() { my_handle =
this; }
56 void clearClientPtr() { my_handle =
NULp; }
57 void setData(SMARTPTR& new_data) { data = new_data; }
59 EntryIter getIterator() {
63 void setIterator(EntryIter newIter) { iter = newIter; }
76 template <
typename SMARTPTR>
class Cache {
77 typedef CacheEntry<SMARTPTR> Entry;
78 typedef Entry* EntryPtr;
79 typedef std::list<Entry> Entries;
81 typedef typename Entries::iterator EntryIter;
88 #if defined(DUMP_CACHE_STAT)
93 #if defined(ASSERTION_USED)
94 bool curr_size_valid()
const {
return cached.size() == curr_size; }
97 void keep(
size_t kept_elems) {
100 if (count>kept_elems) {
101 size_t toRemove = count-kept_elems;
102 EntryIter e = cached.begin();
104 while (toRemove--) e++->clearClientPtr();
105 cached.erase(cached.begin(), e);
106 curr_size = kept_elems;
112 EntryIter top() {
return --cached.end(); }
114 #if defined(ASSERTION_USED)
115 bool is_member(EntryIter iter) {
116 for (EntryIter i = cached.begin(); i != cached.end(); ++i) {
117 if (i == iter)
return true;
121 static bool is_valid_size(
size_t Size) {
return Size>0; }
124 void insert(EntryPtr& my_handle, SMARTPTR& data) {
127 my_handle->setData(data);
129 #if defined(DUMP_CACHE_STAT)
134 cached.push_back(CacheEntry<SMARTPTR>(my_handle, data));
138 cached.back().setClientPtr();
141 my_handle->setIterator(top());
146 #if defined(DUMP_CACHE_STAT)
150 void touch(Entry& entry) {
151 EntryIter iter = entry.getIterator();
154 cached.splice(cached.end(), cached, iter);
158 #if defined(DUMP_CACHE_STAT)
162 void remove(EntryPtr& my_handle) {
164 EntryIter iter = my_handle->getIterator();
166 my_handle->clearClientPtr();
184 Cache(
size_t Size) : curr_size(0), max_size(Size) {
186 #if defined(DUMP_CACHE_STAT)
197 #if defined(DUMP_CACHE_STAT)
198 printf(
"Cache-Stat: max_size=%zu inserts=%zu accesses=%zu\n",
size(), insert_count, access_count);
209 size_t size()
const {
return max_size; }
216 if (new_size<max_size) keep(new_size);
226 template <
typename SMARTPTR>
class CacheHandle :
virtual Noncopyable {
227 CacheEntry<SMARTPTR> *entry;
253 cache.insert(entry, data);
278 return entry->get_data();
304 #error cache.h included twice
SMARTPTR access(Cache< SMARTPTR > &cache)
void resize(size_t new_size)
SMARTPTR get_data() const
Cache for any SmartPtr type.
void assign(SMARTPTR data, Cache< SMARTPTR > &cache)
Handle for Cache entries.
void release(Cache< SMARTPTR > &cache)
GB_ERROR init_data(GBDATA *gb_main)
#define ca_assert_expensive(cond)
void flush()
flush the cache, i.e. uncache all elements