/* -*- c++ -*- * borrowed from vdr-text2skin */ #ifndef VDR_IMAGECACHE_HPP #define VDR_IMAGECACHE_HPP #include #include #include template class cxCache { private: typedef std::vector usage_list; typedef typename usage_list::iterator usage_iterator; typedef std::map item_map; typedef typename item_map::iterator item_iterator; item_map mItems; usage_list mUsage; unsigned int mMaxItems; protected: virtual void DeleteObject(const key_type &Key, data_type &Data) = 0; virtual void ResetObject(data_type &Data) = 0; public: cxCache(unsigned int MaxItems); virtual ~cxCache(); void Reset(void); void Flush(void); bool Contains(const key_type &Key); data_type &operator[](const key_type &Key); unsigned int Count(void) { return mUsage.size(); } }; template inline bool cxCache::Contains(const key_type &Key) { return mItems.find(Key) != mItems.end(); } template cxCache::cxCache(unsigned int MaxItems) { mMaxItems = MaxItems; } template cxCache::~cxCache() { } template void cxCache::Flush(void) { item_iterator it = mItems.begin(); for (; it != mItems.end(); ++it) DeleteObject(it->first, it->second); mUsage.clear(); mItems.clear(); } template void cxCache::Reset(void) { item_iterator it = mItems.begin(); for (; it != mItems.end(); ++it) ResetObject(it->second); } template data_type &cxCache::operator[](const key_type &Key) { item_iterator it = mItems.find(Key); if (it != mItems.end()) { usage_iterator ut = mUsage.begin(); for (; ut != mUsage.end(); ++ut) { if (*ut == Key) { mUsage.erase(ut); break; } } mUsage.push_back(Key); return it->second; } if (mUsage.size() == mMaxItems) { item_iterator it = mItems.find(*mUsage.begin()); DeleteObject(it->first, it->second); mUsage.erase(mUsage.begin()); mItems.erase(it); } it = mItems.insert(typename item_map::value_type(Key, data_type())).first; return it->second; } #endif // VDR_IMAGECACHE_HPP