mru.h
Go to the documentation of this file.00001 #ifndef cxxtls_mru_h_included
00002 #define cxxtls_mru_h_included
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <list>
00033
00034 namespace cxxtls
00035 {
00036 template<class T>
00037 class MRU
00061 {
00062 public:
00063
00064 typedef T value_type;
00065 typedef std::list<T> rep_type;
00066
00067 typedef typename rep_type::iterator iterator;
00068
00069 iterator end() { return data_.end(); }
00070
00071 iterator mostRecent() { return data_.begin(); }
00072
00073 iterator leastRecent()
00074
00075 {
00076 if(empty())
00077 return data_.end();
00078
00079 iterator rv = data_.end();
00080 --rv;
00081
00082 return rv;
00083 }
00084
00085 bool empty() const { return data_.empty(); }
00086
00087 void activate(T const &item)
00090 {
00091 iterator where = find(item);
00092
00093 if(where != data_.end())
00094 {
00095 data_.erase(where);
00096 }
00097
00098 data_.push_front(item);
00099
00100 }
00101
00102 void discard(T const &item)
00104 {
00105 iterator where = find(item);
00106
00107 if(where != data_.end())
00108 data_.erase(where);
00109 }
00110
00111
00112
00113 private:
00114 rep_type data_;
00115
00116 iterator find(T const &query)
00117
00118 {
00119 iterator next = data_.begin();
00120 iterator end = data_.end();
00121
00122 while(next != end)
00123 {
00124 if(query == *next)
00125 return next;
00126
00127 ++next;
00128 }
00129
00130 return next;
00131
00132 }
00133
00134
00135
00136 };
00137
00138 };
00139
00140
00141 #endif