Tree-RB
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Tree/RB.pm view on Meta::CPAN
my %args;
if(ref $arg eq 'HASH') {
%args = %$arg;
}
else {
$args{-key} = $arg;
}
if(@_ && exists $args{-key}) {
my $arg = shift;
if(ref $arg eq 'HASH') {
%args = (%$arg, %args);
}
}
if(! exists $args{-key}) {
defined $args{'-reverse'} or croak("Expected option '-reverse' is undefined");
}
$self->[HASH_SEEK_ARG] = \%args;
if($self->[HASH_ITER]) {
$self->_reset_hash_iter;
}
}
sub _reset_hash_iter {
my $self = shift;
if($self->[HASH_SEEK_ARG]) {
my $iter = ($self->[HASH_SEEK_ARG]{'-reverse'} ? 'rev_iter' : 'iter');
$self->[HASH_ITER] = $self->$iter($self->[HASH_SEEK_ARG]{'-key'});
}
else {
$self->[HASH_ITER] = $self->iter;
}
}
sub FIRSTKEY {
my $self = shift;
$self->_reset_hash_iter;
my $node = $self->[HASH_ITER]->next
or return;
return $node->[_KEY];
}
sub NEXTKEY {
my $self = shift;
my $node = $self->[HASH_ITER]->next
or return;
return $node->[_KEY];
}
sub new {
my ($class, $cmp) = @_;
my $obj = [];
$obj->[SIZE] = 0;
if($cmp) {
ref $cmp eq 'CODE'
or croak('Invalid arg: codref expected');
$obj->[CMP] = $cmp;
}
return bless $obj => $class;
}
*TIEHASH = \&new;
sub DESTROY { $_[0]->[ROOT]->DESTROY if $_[0]->[ROOT] }
sub CLEAR {
my $self = shift;
if($self->[ROOT]) {
$self->[ROOT]->DESTROY;
undef $self->[ROOT];
undef $self->[HASH_ITER];
$self->[SIZE] = 0;
}
}
sub UNTIE {
my $self = shift;
$self->DESTROY;
undef @$self;
}
sub resort {
my $self = $_[0];
my $cmp = $_[1];
ref $cmp eq 'CODE'
or croak sprintf(q[Arg of type coderef required; got %s], ref $cmp || 'undef');
my $new_tree = __PACKAGE__->new($cmp);
$self->[ROOT]->strip(sub { $new_tree->put($_[0]) });
$new_tree->put(delete $self->[ROOT]);
$_[0] = $new_tree;
}
sub root { $_[0]->[ROOT] }
sub size { $_[0]->[SIZE] }
*SCALAR = \&size;
sub min {
my $self = shift;
return undef unless $self->[ROOT];
return $self->[ROOT]->min;
}
sub max {
my $self = shift;
return undef unless $self->[ROOT];
return $self->[ROOT]->max;
}
sub lookup {
my $self = shift;
my $key = shift;
defined $key
or croak("Can't use undefined value as key");
my $mode = shift || LUEQUAL;
my $cmp = $self->[CMP];
my $y;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.143 second using v1.00-cache-2.02-grep-82fe00e-cpan-cec75d87357c )