Tie-Hash-Cache-MRU

 view release on metacpan or  search on metacpan

lib/Tie/Hash/Cache/MRU.pm  view on Meta::CPAN

package Tie::Hash::Cache::MRU;

use 5.006001;
use strict;
use warnings;


our $VERSION = '0.02';

sub CURRENT(){0};
sub OLD(){1};
sub TIME(){2}
sub SIZE(){3};
sub LIFE(){4};
sub HASH(){5};
# FETCH, STORE, EXISTS, DELETE, FIRSTKEY, NEXTKEY, CLEAR. DESTROY
sub S(){6};
sub F(){7};
sub D(){8};
sub E(){9};
sub C(){10};
sub FK(){11};
sub NK(){12};
sub DE(){13};

sub TIEHASH {

	my $pack = shift;
	my %arg = @_;

	no warnings;
	my @obj = ( {}, {}, {},
	 @arg{qw/SIZE LIFE HASH
	STORE FETCH DELETE EXISTS CLEAR FIRSTKEY NEXTKEY DESTROY/});

	defined $obj[LIFE] or delete $obj[TIME];
	$obj[F] ||= sub($){$obj[HASH]->{$_[0]}};
	$obj[S] ||= sub($$){$obj[HASH]->{$_[0]} = $_[1]};
	$obj[D] ||= sub($){delete $obj[HASH]->{$_[0]}};
	$obj[E] ||= sub($){exists $obj[HASH]->{$_[0]}};
	defined $obj[C] or $obj[C] = sub(){%{$obj[HASH]} = () };


	bless \@obj, $pack;

}

my $NOTEXIST;

sub FETCH { # obj, key

	if($_[0]->[LIFE]){

	   if(exists $_[0]->[TIME]->{$_[1]}
	      and 
	      (time() - $_[0]->[TIME]->{$_[1]}) > $_[0]->[LIFE] ){

	   	$_[0]->[CURRENT]->{$_[1]} =
		&{$_[0]->[E]}($_[1])?
		&{$_[0]->[F]}($_[1]):
		\$NOTEXIST;
	   };
	   $_[0]->[TIME]->{$_[1]} = time;
	};

	if (exists $_[0]->[CURRENT]->{$_[1]}){
	      $_[0]->[CURRENT]->{$_[1]} eq \$NOTEXIST
		and return undef;
	      return $_[0]->[CURRENT]->{$_[1]}
	};
	if (exists $_[0]->[OLD]->{$_[1]}){
	      $_[0]->[OLD]->{$_[1]} eq \$NOTEXIST
	       and $_[0]->[CURRENT]->{$_[1]} = \$NOTEXIST
		and return undef;
	      return 
		   $_[0]->[CURRENT]->{$_[1]} =
		   delete $_[0]->[OLD]->{$_[1]}
	};
	no warnings;
	if (%{$_[0]->[CURRENT]} > $_[0]->[SIZE]){
		if($_[0]->[LIFE]){
			delete @{$_[0]->[TIME]}{
			   grep { ! exist $_[0]->[CURRENT]->{$_} }
			      keys %{ $_[0]->[OLD] }



( run in 2.144 seconds using v1.01-cache-2.11-cpan-a49fcb8fa48 )