12template<
typename Key,
typename Value>
19 bool operator==(
const Key &rhs)
const
24 using Entries = std::vector<Entry>;
25 using value_type =
typename Entries::value_type;
26 using size_type =
typename Entries::size_type;
27 using difference_type =
typename Entries::difference_type;
29 using reference =
typename Entries::const_reference;
30 using const_reference =
typename Entries::const_reference;
31 using pointer =
typename Entries::const_pointer;
32 using iterator =
typename Entries::const_iterator;
33 using const_iterator =
typename Entries::const_iterator;
35 void setMaxEntries(
int maxEntries)
37 mMaxEntries = maxEntries;
40 std::size_t size()
const
42 return mEntries.size();
45 const_iterator begin()
const
47 return mEntries.begin();
50 const_iterator end()
const
52 return std::next(mEntries.begin(), size());
55 const_iterator find(
const Key &key)
58 const auto begin = mEntries.begin();
59 const auto end = std::next(mEntries.begin(), size());
60 auto it = std::find(begin, end, key);
61 if (it == begin || it == end) {
66 std::rotate(begin, it, it + 1);
67 return mEntries.cbegin();
70 void insert(Key key, Value value)
72 auto entriesSize = size();
73 if (mMaxEntries == -1 || (entriesSize <
static_cast<size_t>(mMaxEntries))) {
76 mEntries.resize(entriesSize);
80 std::rotate(mEntries.begin(), std::next(mEntries.begin(), entriesSize - 1), std::next(mEntries.begin(), entriesSize));
83 mEntries.front() = {std::move(key), std::move(value)};
86 bool remove(
const Key &key)
88 const auto begin = mEntries.begin();
89 const auto end = std::next(mEntries.begin(), size());
90 auto it = std::find(begin, end, key);
95 std::move(std::next(it), end, it);
96 mEntries.resize(size() - 1);
107 int mMaxEntries = -1;