Cache-Ref
view release on metacpan or search on metacpan
lib/Cache/Ref/CAR.pm view on Meta::CPAN
package Cache::Ref::CAR;
BEGIN {
$Cache::Ref::CAR::AUTHORITY = 'cpan:NUFFIN';
}
BEGIN {
$Cache::Ref::CAR::VERSION = '0.04';
}
# ABSTRACT: CLOCK with Adaptive Replacement
use Moose;
use List::Util qw(max min);
use Cache::Ref::CAR::Base ();
use namespace::autoclean;
extends qw(Cache::Ref);
with qw(Cache::Ref::CAR::Base);
sub _mru_history_too_big {
my $self = shift;
$self->_mru_history_size
and
$self->_mru_history_size + $self->_mru_size == $self->size;
}
sub _mfu_history_too_big {
my $self = shift;
$self->_index_size == $self->size * 2;
}
sub _decrease_mru_target_size {
my $self = shift;
if ( $self->_mru_target_size > 0 ) {
my $adjustment = int( $self->_mru_history_size / $self->_mfu_history_size );
$self->_set_mru_target_size( max( 0, $self->_mru_target_size - max(1, $adjustment) ) );
}
}
sub _increase_mru_target_size {
my $self = shift;
my $adjustment = int( $self->_mfu_history_size / $self->_mru_history_size );
$self->_set_mru_target_size( min( $self->size, $self->_mru_target_size + max(1, $adjustment) ) );
}
sub _restore_from_mfu_history {
my ( $self, $e ) = @_;
$self->_mfu_push($e);
}
sub _restore_from_mru_history {
my ( $self, $e ) = @_;
$self->_mfu_push($e);
}
sub expire {
my ( $self, $how_many ) = @_;
$how_many ||= 1;
if ( my $mru = $self->_mru ) {
my $cur = $self->_next($mru);
# mru pool is too big
while ( $cur and $self->_mru_size >= max(1,$self->_mru_target_size) ) {
my $next = $self->_next($cur);
$self->_circular_splice($cur);
( run in 1.775 second using v1.01-cache-2.11-cpan-39bf76dae61 )