ANNA Suite  2020b
Multipurpose development suite for Telco applications
LRUMap.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7 
8 
9 #ifndef anna_core_util_LRUMap_hpp
10 #define anna_core_util_LRUMap_hpp
11 
12 #include <map>
13 
14 #include <anna/config/defines.hpp>
15 
16 namespace anna {
17 
31 template <typename K, typename V> class LRUMap {
32  typedef typename std::pair <V, anna::Millisecond> timed_value;
33  typedef typename std::map <K, timed_value> container;
34  typedef typename container::value_type value_type;
35 
36 public:
37  typedef typename container::iterator iterator;
38  typedef typename container::const_iterator const_iterator;
39 
45  LRUMap(const char* name, const int maxSize) : a_name(name), a_maxSize(maxSize) { ;}
46 
50  ~LRUMap() { clear(); }
51 
56  bool isEmpty() const { return a_container.size() == 0; }
57 
62  int size() const { return a_container.size(); }
63 
72  V* find(const K& key) {
73  iterator ii = a_container.find(key);
74 
75  if(ii == end())
76  return NULL;
77 
78  /*
79  * Recupera el valor asociado a la clave K y actualiza el momento de acceso.
80  */
82  return &value(ii);
83  }
84 
92  void add(const K& key, const V& v) {
93  iterator ii = a_container.find(key);
94 
95  // Sobreescribe el valor asociado a K y actualiza su tiempo de acceso.
96  if(ii != end()) {
97  value(ii) = v;
99  return;
100  }
101 
102  // Si no se ha alcanzado el máximo, sólo hay que insertar el nuevo (K,V)
103  if(size() < a_maxSize) {
104  timed_value tvalue(v, functions::millisecond());
105  a_container.insert(value_type(key, tvalue));
106  return;
107  }
108 
109  // Se ha alcanzado el máximo, hay que buscar el que haga más tiempo que no se
110  // accede => el que tenga el menor 'Time' asociado.
111  iterator minii = begin();
112  Millisecond minTime = millisecond(minii);
113 
114  for(iterator ii = begin(), maxii = end(); ii != maxii; ii ++) {
115  if(millisecond(ii) < minTime)
116  minTime = millisecond(minii = ii);
117  }
118 
119  /*
120  * El map no permite sobre-escribir la clave => por eso tenemos que borrar el nodo
121  * más antiguo y crear otro nuevo.
122  */
123  a_container.erase(minii);
124  timed_value tvalue(v, functions::millisecond());
125  a_container.insert(value_type(key, tvalue));
126  }
127 
131  void clear() { a_container.clear(); }
132 
138  iterator begin() { return a_container.begin(); }
139 
145  const_iterator begin() const { return a_container.begin(); }
146 
152  iterator end() { return a_container.end(); }
153 
159  const_iterator end() const { return a_container.end(); }
160 
167  static K key(iterator& ii) { return ii->first; }
168 
175  static V& value(iterator& ii) {
176  timed_value* v = &ii->second;
177  return v->first;
178  }
179 
185  static Millisecond& millisecond(iterator& ii) {
186  timed_value* v = &ii->second;
187  return v->second;
188  }
189 
196  static K key(const_iterator& ii) { return ii->first; }
197 
204  static const V& value(const_iterator& ii) {
205  const timed_value* v = &ii->second;
206  return v->first;
207  }
208 
214  static Millisecond millisecond(const_iterator& ii) {
215  const timed_value* v = &ii->second;
216  return v->second;
217  }
218 
223  std::string asString() const
224  {
225  std::string msg("LRUMap { Name: ");
226  msg += a_name;
227  msg += functions::asText(" | N: ", a_maxSize);
228  msg += functions::asText(" | n: ", size());
229  return msg += " }";
230  }
231 
232 private:
233  const char* a_name;
234  const int a_maxSize;
235  container a_container;
236 };
237 
238 }
239 
240 #endif
241 
242 
243 
container::iterator iterator
Definition: LRUMap.hpp:37
V * find(const K &key)
Definition: LRUMap.hpp:72
Definition: Millisecond.hpp:24
iterator begin()
Definition: LRUMap.hpp:138
const_iterator end() const
Definition: LRUMap.hpp:159
static std::string asText(const char *comment, const int number)
Definition: functions.hpp:153
void clear()
Definition: LRUMap.hpp:131
static const V & value(const_iterator &ii)
Definition: LRUMap.hpp:204
std::string asString() const
Definition: LRUMap.hpp:223
static K key(const_iterator &ii)
Definition: LRUMap.hpp:196
static Millisecond millisecond()
Definition: functions.hpp:379
int size() const
Definition: LRUMap.hpp:62
Definition: LRUMap.hpp:31
static Millisecond & millisecond(iterator &ii)
Definition: LRUMap.hpp:185
void add(const K &key, const V &v)
Definition: LRUMap.hpp:92
bool isEmpty() const
Definition: LRUMap.hpp:56
static K key(iterator &ii)
Definition: LRUMap.hpp:167
LRUMap(const char *name, const int maxSize)
Definition: LRUMap.hpp:45
container::const_iterator const_iterator
Definition: LRUMap.hpp:38
const_iterator begin() const
Definition: LRUMap.hpp:145
Definition: app.hpp:12
~LRUMap()
Definition: LRUMap.hpp:50
static V & value(iterator &ii)
Definition: LRUMap.hpp:175
iterator end()
Definition: LRUMap.hpp:152
static Millisecond millisecond(const_iterator &ii)
Definition: LRUMap.hpp:214