Algorithm-SkipList
view release on metacpan or search on metacpan
t/02-merge_append.t view on Meta::CPAN
#-*- mode: perl;-*-
package NumericNode;
# use Carp::Assert;
our @ISA = qw( Algorithm::SkipList::Node );
sub validate_key {
my $self = shift;
# assert( UNIVERSAL::isa($self, "Algorithm::SkipList::Node") ), if DEBUG;
my $key = shift;
return ($key =~ /^\-?\d+$/); # make sure key is simple natural number
}
sub key_cmp {
my $self = shift;
# assert( UNIVERSAL::isa($self, "Algorithm::SkipList::Node") ), if DEBUG;
my $left = $self->key;
my $right = shift;
unless (defined $left) { return -1; }
# Numeric Comparison
return ($left <=> $right);
}
package main;
use Test::More tests => 264;
use Algorithm::SkipList 0.73;
# We build two lists and merge them
my $f = new Algorithm::SkipList( node_class => 'NumericNode' );
ok( ref($f) eq "Algorithm::SkipList");
foreach my $i (qw( 1 3 5 7 9 )) {
my $finger = $f->insert($i, $i);
ok($f->find($i, $finger) == $i); # test return of fingers from insertion
}
ok($f->size == 5);
$f->merge($f);
ok($f->size == 5);
my $g = new Algorithm::SkipList( node_class => 'NumericNode' );
ok( ref($g) eq "Algorithm::SkipList");
foreach my $i (qw( 2 4 6 8 10 )) {
$g->insert($i, $i);
}
ok($g->size == 5);
$f->merge($g);
ok($f->size == 10);
# $f->_debug;
# $g->_debug;
foreach my $i (1..10) {
ok($f->find($i) == $i);
}
( run in 1.356 second using v1.01-cache-2.11-cpan-140bd7fdf52 )