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  // Try to insert a mapping to the new element.
47  // TODO: C++17: use try_emplace instead of emplace when we switch to C++17
48  auto pair = m_CacheItemsMap.emplace(element, m_CacheItemsList.end());
49  if (!pair.second)
50  {
51  // The element already exists. Move it to the head of the list.
52  m_CacheItemsList.splice(m_CacheItemsList.begin(), m_CacheItemsList, pair.first->second);
53  return 0;
54  }
55 
56  // The element is new.
57  m_CacheItemsList.push_front(element);
58  pair.first->second = m_CacheItemsList.begin();
59 
60  if (m_CacheItemsMap.size() > m_MaxSize)
61  {
62  auto& item = m_CacheItemsList.back();
63 
64  if (deletedValue != nullptr)
65  {
66 #if __cplusplus > 199711L || _MSC_VER >= 1800
67  *deletedValue = std::move(item);
68 #else
69  *deletedValue = item;
70 #endif
71  }
72  m_CacheItemsMap.erase(item);
73  m_CacheItemsList.pop_back();
74  return 1;
75  }
76 
77  return 0;
78  }
79 
82  const T& getMRUElement() const
83  {
84  return m_CacheItemsList.front();
85  }
86 
89  const T& getLRUElement() const
90  {
91  return m_CacheItemsList.back();
92  }
93 
96  void eraseElement(const T& element)
97  {
98  MapIterator iter = m_CacheItemsMap.find(element);
99  if (iter == m_CacheItemsMap.end())
100  {
101  return;
102  }
103 
104  m_CacheItemsList.erase(iter->second);
105  m_CacheItemsMap.erase(iter);
106  }
107 
109  size_t getMaxSize() const
110  {
111  return m_MaxSize;
112  }
113 
115  size_t getSize() const
116  {
117  return m_CacheItemsMap.size();
118  }
119 
120  private:
121  std::list<T> m_CacheItemsList;
122  std::unordered_map<T, ListIterator> m_CacheItemsMap;
123  size_t m_MaxSize;
124  };
125 
126 } // namespace pcpp
Definition: LRUList.h:24
size_t getMaxSize() const
Definition: LRUList.h:109
const T & getLRUElement() const
Definition: LRUList.h:89
int put(const T &element, T *deletedValue=nullptr)
Definition: LRUList.h:44
const T & getMRUElement() const
Definition: LRUList.h:82
void eraseElement(const T &element)
Definition: LRUList.h:96
LRUList(std::size_t maxSize)
Definition: LRUList.h:31
size_t getSize() const
Definition: LRUList.h:115
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19