/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include #include namespace base { template class last_used_cache { public: void up(Entry entry); void remove(Entry entry); void clear(); Entry take_lowest(); private: std::list _queue; std::unordered_map::iterator> _map; }; template void last_used_cache::up(Entry entry) { if (!_queue.empty() && _queue.back() == entry) { return; } const auto i = _map.find(entry); if (i != end(_map)) { _queue.splice(end(_queue), _queue, i->second); } else { _map.emplace(entry, _queue.insert(end(_queue), entry)); } } template void last_used_cache::remove(Entry entry) { const auto i = _map.find(entry); if (i != end(_map)) { _queue.erase(i->second); _map.erase(i); } } template void last_used_cache::clear() { _queue.clear(); _map.clear(); } template Entry last_used_cache::take_lowest() { if (_queue.empty()) { return Entry(); } auto result = std::move(_queue.front()); _queue.erase(begin(_queue)); _map.erase(result); return result; } } // namespace base