1 #ifndef OSMSCOUT_CACHE_H 2 #define OSMSCOUT_CACHE_H 23 #include <osmscout/CoreFeatures.h> 27 #include <unordered_map> 57 template <
class K,
class V,
class IK = PageId>
94 virtual size_t GetSize(
const V& value)
const = 0;
99 using Map = std::unordered_map<K, typename OrderList::iterator>;
110 IK KeyToInternalKey(K key)
112 return key - std::numeric_limits<K>::min();
121 while (size>maxSize) {
125 map.erase(map.find(order.back().key));
130 previousEntry=order.end();
143 map.reserve(maxSize);
144 previousEntry=order.end();
173 if (previousEntry!=order.end() &&
174 previousEntry->key==key) {
175 reference=previousEntry;
179 typename Map::iterator iter=map.find(key);
181 if (iter!=map.end()) {
183 order.splice(order.begin(),order,iter->second);
186 iter->second=order.begin();
188 reference=order.begin();
189 previousEntry=reference;
209 order.push_front(entry);
211 previousEntry=order.begin();
212 return order.begin();
215 typename Map::iterator iter=map.find(entry.key);
217 if (iter!=map.end()) {
219 order.splice(order.begin(),order,iter->second);
222 iter->second=order.begin();
224 order.front().value=entry.value;
228 order.push_front(entry);
231 map[entry.key]=order.begin();
236 previousEntry=order.begin();
237 return order.begin();
246 this->maxSize=maxSize;
250 map.reserve(maxSize);
269 previousEntry=order.end();
285 memory+=map.size()*
sizeof(
CacheRef);
288 memory+=size*
sizeof(CacheEntry);
290 for (
typename std::list<CacheEntry>::const_iterator entry=order.begin();
293 memory+=sizer.GetSize(entry->value);
304 log.
Debug() << cacheName <<
" entries: " << size <<
", memory " <<
GetMemory(sizer);
K key
Definition: Cache.h:66
std::unordered_map< FileOffset, typename OrderList::iterator > Map
Definition: Cache.h:99
bool GetEntry(const K &key, CacheRef &reference)
Definition: Cache.h:165
size_t GetMaxSize() const
Definition: Cache.h:256
void DumpStatistics(const char *cacheName, const ValueSizer &sizer)
Definition: Cache.h:302
Cache(size_t maxSize)
Definition: Cache.h:140
V value
Definition: Cache.h:67
size_t GetSize() const
Definition: Cache.h:275
void Flush()
Definition: Cache.h:264
Log & Debug(bool state)
Definition: Logger.h:428
CacheEntry(const K &key)
Definition: Cache.h:69
CacheEntry(const K &key, const V &value)
Definition: Cache.h:75
std::list< CacheEntry > OrderList
Definition: Cache.h:97
virtual size_t GetSize(const V &value) const =0
bool IsActive() const
Definition: Cache.h:150
size_t GetMemory(const ValueSizer &sizer) const
Definition: Cache.h:280
Cache::CacheRef SetEntry(const CacheEntry &entry)
Definition: Cache.h:204
typename OrderList::iterator CacheRef
Definition: Cache.h:98
void SetMaxSize(size_t maxSize)
Definition: Cache.h:244
virtual ~ValueSizer()=default