// Copyright (c) 2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_MRUSET_H #define BITCOIN_MRUSET_H #include #include /** STL-like set container that only keeps the most recent N elements. */ template class mruset { public: typedef T key_type; typedef T value_type; typedef typename std::set::iterator iterator; typedef typename std::set::const_iterator const_iterator; typedef typename std::set::size_type size_type; protected: std::set set; std::deque queue; size_type nMaxSize; public: mruset(size_type nMaxSizeIn = 0) { nMaxSize = nMaxSizeIn; } iterator begin() const { return set.begin(); } iterator end() const { return set.end(); } size_type size() const { return set.size(); } bool empty() const { return set.empty(); } iterator find(const key_type& k) const { return set.find(k); } size_type count(const key_type& k) const { return set.count(k); } bool inline friend operator==(const mruset& a, const mruset& b) { return a.set == b.set; } bool inline friend operator==(const mruset& a, const std::set& b) { return a.set == b; } bool inline friend operator<(const mruset& a, const mruset& b) { return a.set < b.set; } std::pair insert(const key_type& x) { std::pair ret = set.insert(x); if (ret.second) { if (nMaxSize && queue.size() == nMaxSize) { set.erase(queue.front()); queue.pop_front(); } queue.push_back(x); } return ret; } size_type max_size() const { return nMaxSize; } size_type max_size(size_type s) { if (s) while (queue.size() > s) { set.erase(queue.front()); queue.pop_front(); } nMaxSize = s; return nMaxSize; } }; #endif