Go to the documentation of this file.00001
00002 #ifndef mbl_lru_cache_h_
00003 #define mbl_lru_cache_h_
00004
00005
00006
00007
00008
00009 #include <vcl_list.h>
00010 #include <vcl_map.h>
00011 #include <vcl_utility.h>
00012 #include <vcl_cassert.h>
00013
00014
00015
00016
00017
00018 template <class I, class V>
00019 class mbl_lru_cache
00020 {
00021
00022 typedef vcl_list<I> list_type;
00023
00024 list_type l_;
00025
00026
00027 typedef vcl_map<I, vcl_pair<V, typename list_type::iterator> > map_type;
00028 map_type m_;
00029
00030 unsigned long n_;
00031
00032 public:
00033
00034 mbl_lru_cache(): n_(0) {}
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 mbl_lru_cache(unsigned n): n_(n) {}
00048
00049
00050
00051 const V* lookup(const I& index)
00052 {
00053 assert (m_.size() == l_.size());
00054 typename map_type::iterator it= m_.find(index);
00055 if (it != m_.end())
00056 {
00057 l_.push_front(index);
00058 l_.erase((*it).second.second);
00059 (*it).second.second = l_.begin();
00060 return &((*it).second.first);
00061 }
00062 else return 0;
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072 void insert(const I& index, const V& value, bool dont_if_full=false)
00073 {
00074 assert (m_.size() == l_.size());
00075 assert (m_.find(index) == m_.end());
00076
00077 if (m_.size() < n_)
00078 {
00079 l_.push_front(index);
00080 m_[index] = vcl_make_pair(value, l_.begin());
00081 }
00082 else
00083 {
00084 if (!dont_if_full)
00085 {
00086 l_.push_front(index);
00087 m_[index] = vcl_make_pair(value, l_.begin()) ;
00088 m_.erase( m_.find(l_.back()));
00089 l_.pop_back();
00090 }
00091 }
00092 }
00093 void clear() {l_.clear(); m_.clear();}
00094 bool full() const { return m_.size() < n_;}
00095 void resize(unsigned n)
00096 {
00097 while (m_.size() > n)
00098 {
00099 m_.erase( m_.find(l_.back()));
00100 l_.pop_back();
00101 }
00102 n_=n;
00103 }
00104 };
00105
00106 #endif // mbl_lru_cache_h_