PcapPlusPlus  Next
LRUList.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <list>
4 #include <cstddef>
5 #include <unordered_map>
6 
7 #if __cplusplus > 199711L || _MSC_VER >= 1800
8 # include <utility>
9 #endif
10 
12 
15 namespace pcpp
16 {
17 
23  template <typename T> class LRUList
24  {
25  public:
26  using ListIterator = typename std::list<T>::iterator;
27  using MapIterator = typename std::unordered_map<T, ListIterator>::iterator;
28 
31  explicit LRUList(std::size_t maxSize) : m_MaxSize(maxSize)
32  {}
33 
44  int put(const T& element, T* deletedValue = nullptr)
45  {
46  m_CacheItemsList.push_front(element);
47 
48  // Inserting a new element. If an element with an equivalent key already exists the method returns an
49  // iterator to the element that prevented the insertion
50  std::pair<MapIterator, bool> pair =
51  m_CacheItemsMap.insert(std::make_pair(element, m_CacheItemsList.begin()));
52  if (!pair.second) // already exists
53  {
54  m_CacheItemsList.erase(pair.first->second);
55  pair.first->second = m_CacheItemsList.begin();
56  }
57 
58  if (m_CacheItemsMap.size() > m_MaxSize)
59  {
60  ListIterator lruIter = m_CacheItemsList.end();
61  --lruIter;
62 
63  if (deletedValue != nullptr)
64  {
65 #if __cplusplus > 199711L || _MSC_VER >= 1800
66  *deletedValue = std::move(*lruIter);
67 #else
68  *deletedValue = *lruIter;
69 #endif
70  }
71  m_CacheItemsMap.erase(*lruIter);
72  m_CacheItemsList.erase(lruIter);
73  return 1;
74  }
75 
76  return 0;
77  }
78 
81  const T& getMRUElement() const
82  {
83  return m_CacheItemsList.front();
84  }
85 
88  const T& getLRUElement() const
89  {
90  return m_CacheItemsList.back();
91  }
92 
95  void eraseElement(const T& element)
96  {
97  MapIterator iter = m_CacheItemsMap.find(element);
98  if (iter == m_CacheItemsMap.end())
99  {
100  return;
101  }
102 
103  m_CacheItemsList.erase(iter->second);
104  m_CacheItemsMap.erase(iter);
105  }
106 
108  size_t getMaxSize() const
109  {
110  return m_MaxSize;
111  }
112 
114  size_t getSize() const
115  {
116  return m_CacheItemsMap.size();
117  }
118 
119  private:
120  std::list<T> m_CacheItemsList;
121  std::unordered_map<T, ListIterator> m_CacheItemsMap;
122  size_t m_MaxSize;
123  };
124 
125 } // namespace pcpp
Definition: LRUList.h:24
size_t getMaxSize() const
Definition: LRUList.h:108
const T & getLRUElement() const
Definition: LRUList.h:88
int put(const T &element, T *deletedValue=nullptr)
Definition: LRUList.h:44
const T & getMRUElement() const
Definition: LRUList.h:81
void eraseElement(const T &element)
Definition: LRUList.h:95
LRUList(std::size_t maxSize)
Definition: LRUList.h:31
size_t getSize() const
Definition: LRUList.h:114
The main namespace for the PcapPlusPlus lib.