last_used_cache.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // This file is part of Desktop App Toolkit,
  2. // a set of libraries for developing nice desktop applications.
  3. //
  4. // For license and copyright information please follow this link:
  5. // https://github.com/desktop-app/legal/blob/master/LEGAL
  6. //
  7. #pragma once
  8. #include <list>
  9. #include <unordered_map>
  10. namespace base {
  11. template <typename Entry>
  12. class last_used_cache {
  13. public:
  14. void up(Entry entry);
  15. void remove(Entry entry);
  16. void clear();
  17. Entry take_lowest();
  18. private:
  19. std::list<Entry> _queue;
  20. std::unordered_map<Entry, typename std::list<Entry>::iterator> _map;
  21. };
  22. template <typename Entry>
  23. void last_used_cache<Entry>::up(Entry entry) {
  24. if (!_queue.empty() && _queue.back() == entry) {
  25. return;
  26. }
  27. const auto i = _map.find(entry);
  28. if (i != end(_map)) {
  29. _queue.splice(end(_queue), _queue, i->second);
  30. } else {
  31. _map.emplace(entry, _queue.insert(end(_queue), entry));
  32. }
  33. }
  34. template <typename Entry>
  35. void last_used_cache<Entry>::remove(Entry entry) {
  36. const auto i = _map.find(entry);
  37. if (i != end(_map)) {
  38. _queue.erase(i->second);
  39. _map.erase(i);
  40. }
  41. }
  42. template <typename Entry>
  43. void last_used_cache<Entry>::clear() {
  44. _queue.clear();
  45. _map.clear();
  46. }
  47. template <typename Entry>
  48. Entry last_used_cache<Entry>::take_lowest() {
  49. if (_queue.empty()) {
  50. return Entry();
  51. }
  52. auto result = std::move(_queue.front());
  53. _queue.erase(begin(_queue));
  54. _map.erase(result);
  55. return result;
  56. }
  57. } // namespace base