Algorithm-SkipList

 view release on metacpan or  search on metacpan

t/02-merge_append.t  view on Meta::CPAN

  my ($k1,$v1) = $g->greatest;
  my ($k2,$v2) = $f->greatest;
  ok($k1 == $k2);
  ok($v1 == $v2);
}

my $z = $f->copy;
ok($z->size == $f->size);

# if ($z->size != $f->size) {
#   $z->_debug;
#   $f->_debug;
#   $g->_debug;
#   die;
# }

foreach my $i (-2..10) {
  ok($f->find($i) == (($i%2)?$i:-$i) ), if ($i);
  ok($z->find($i) == (($i%2)?$i:-$i) ), if ($i);
}

$z->clear;
ok($z->size == 0);


$z->append( $f->copy );
ok($z->size == $f->size);

foreach my $i (-2..10) {
  ok($z->find($i) == (($i%2)?$i:-$i) ), if ($i);
}

{
  my @keys = $g->keys;
  ok(scalar @keys == $g->size);

  foreach my $i (1..10) {
    ok($i == $keys[$i-1]); }

  ok(scalar $g->first_key == shift @keys);
  while (@keys) { ok($g->next_key == shift @keys); }


  my @vals = $g->values;
  ok(scalar @vals == $g->size);

  foreach my $i (1..10) {
    ok($g->find($i) == $vals[$i-1]); }
}


{
  my $g = new Algorithm::SkipList( node_class => 'NumericNode' );

  foreach (20..29) {
    $g->insert( $_, 1+$g->size );
  }
  
  my $count = $g->size;
  foreach my $key (20..29) {
    ok( defined $g->find($key), "verify key in g" );
    my $h = $g->copy( $key );
    ok( defined $h,           "verify h is defined" );

    ok( $h->size == $count,   "verify size of h" );
    ok( ($h->least)[0] == $key );
    ok( ($h->least)[1] == $g->find($key) );

    if ($key <= 28) {
      my $h = $g->copy( $key, undef, 28 );
      ok( defined $h, "verify h is defined" );

      ok( $h->size == ($count-1), "verify size of h" );
      ok( ($h->least)[0] == $key );
      ok( ($h->least)[1] == $g->find($key) );
    }

    $count--;
  }


  my $h = $g->copy(19);
  ok(! defined $h);

  $h = $g->copy(30);
  ok(! defined $h);
}

{
  foreach my $i (20..29) {
    my $g = new Algorithm::SkipList( node_class => 'NumericNode' );

    foreach (20..29) {
      $g->insert( $_, 1+$g->size );
    }

    my $size = $g->size;

    my $h = $g->truncate($i);
    ok(defined $h);
    ok($size == ($h->size + $g->size));

    my $gn = $g->_greatest_node;
    my $hn = $h->_first_node;

    ok( $hn->key_cmp($i) == 0 ), if ($h->size);

    unless ($gn->isa("Algorithm::SkipList::Header")) {
      ok( $hn->key_cmp($gn->key) == 1 ), if ($gn->key);
    }

    unless ($hn->isa("Algorithm::SkipList::Header")) {
      ok( $gn->key_cmp($hn->key) == -1 ), if ($hn->key);
    }
  }
  
}



( run in 0.502 second using v1.01-cache-2.11-cpan-13bb782fe5a )