@ -9,10 +9,6 @@
# include <vector>
# include <utility>
# include <boost/multi_index_container.hpp>
# include <boost/multi_index/ordered_index.hpp>
# include <boost/multi_index/sequenced_index.hpp>
/** STL-like set container that only keeps the most recent N elements. */
template < typename T >
class mruset
@ -66,60 +62,4 @@ public:
size_type max_size ( ) const { return nMaxSize ; }
} ;
/** STL-like map container that only keeps the most recent N elements. */
template < typename K , typename V >
class mrumap
{
private :
struct key_extractor {
typedef K result_type ;
const result_type & operator ( ) ( const std : : pair < K , V > & e ) const { return e . first ; }
result_type & operator ( ) ( std : : pair < K , V > * e ) const { return e - > first ; }
} ;
typedef boost : : multi_index_container <
std : : pair < K , V > ,
boost : : multi_index : : indexed_by <
boost : : multi_index : : sequenced < > ,
boost : : multi_index : : ordered_unique < key_extractor >
>
> map_type ;
public :
typedef K key_type ;
typedef std : : pair < K , V > value_type ;
typedef typename map_type : : iterator iterator ;
typedef typename map_type : : const_iterator const_iterator ;
typedef typename map_type : : size_type size_type ;
protected :
map_type m_ ;
size_type max_size_ ;
public :
mrumap ( size_type max_size_in = 1 ) { clear ( max_size_in ) ; }
iterator begin ( ) { return m_ . begin ( ) ; }
iterator end ( ) { return m_ . end ( ) ; }
const_iterator begin ( ) const { return m_ . begin ( ) ; }
const_iterator end ( ) const { return m_ . end ( ) ; }
size_type size ( ) const { return m_ . size ( ) ; }
bool empty ( ) const { return m_ . empty ( ) ; }
iterator find ( const key_type & key ) { return m_ . template project < 0 > ( boost : : get < 1 > ( m_ ) . find ( key ) ) ; }
const_iterator find ( const key_type & key ) const { return m_ . template project < 0 > ( boost : : get < 1 > ( m_ ) . find ( key ) ) ; }
size_type count ( const key_type & key ) const { return boost : : get < 1 > ( m_ ) . count ( key ) ; }
void clear ( size_type max_size_in ) { m_ . clear ( ) ; max_size_ = max_size_in ; }
std : : pair < iterator , bool > insert ( const K & key , const V & value )
{
std : : pair < K , V > elem ( key , value ) ;
std : : pair < iterator , bool > p = m_ . push_front ( elem ) ;
if ( p . second & & m_ . size ( ) > max_size_ ) {
m_ . pop_back ( ) ;
}
return p ;
}
void erase ( iterator it ) { m_ . erase ( it ) ; }
void erase ( const key_type & k ) { boost : : get < 1 > ( m_ ) . erase ( k ) ; }
size_type max_size ( ) const { return max_size_ ; }
} ;
# endif // BITCOIN_MRUSET_H