]> git.vpit.fr Git - perl/modules/autovivification.git/commitdiff
Specify the lists in the iterator object
authorVincent Pit <vince@profvince.com>
Wed, 29 Apr 2015 14:15:52 +0000 (11:15 -0300)
committerVincent Pit <vince@profvince.com>
Wed, 29 Apr 2015 14:15:52 +0000 (11:15 -0300)
t/44-multideref.t

index b19b8ce1af8b338fe7150f8217a97c83bb3b5b7c..85f3c1cfcff839bbea6bf9d4e2703ad34fb2bd2e 100644 (file)
@@ -54,11 +54,30 @@ sub reset_vars {
  sub new {
   my $class = shift;
 
+  my (@lists, @max);
+  for my $arg (@_) {
+   next unless defined $arg;
+   my $type = ref $arg;
+   my $list;
+   if ($type eq 'ARRAY') {
+    $list = $arg;
+   } elsif ($type eq '') {
+    $list = [ 1 .. $arg ];
+   } else {
+    die "Invalid argument of type $type";
+   }
+   my $max = @$list;
+   die "Empty list" unless $max;
+   push @lists, $list;
+   push @max,   $max;
+  }
+
   my $len = @_;
   bless {
-   len => $len,
-   max => \@_,
-   idx => [ (0) x $len ],
+   len   => $len,
+   max   => \@max,
+   lists => \@lists,
+   idx   => [ (0) x $len ],
   }, $class;
  }
 
@@ -81,19 +100,20 @@ sub reset_vars {
   return $i < $len;
  }
 
- sub pick {
+ sub items {
   my $self = shift;
 
-  my ($len, $idx) = @$self{qw<len idx>};
+  my ($len, $lists, $idx) = @$self{qw<len lists idx>};
 
-  return map $_[$_]->[$idx->[$_]], 0 .. ($len - 1);
+  return map $lists->[$_]->[$idx->[$_]], 0 .. ($len - 1);
  }
 }
 
-my $iterator = autovivification::TestIterator->new(4, 4, (8) x $depth);
+my $iterator = autovivification::TestIterator->new(
+ \@prefixes, \@heads, (\@derefs) x $depth,
+);
 do {
- my ($prefix, @elems)
-                    = $iterator->pick(\@prefixes, \@heads, (\@derefs) x $depth);
+ my ($prefix, @elems) = $iterator->items;
  my $code = $prefix->(join '', @elems);
  my $exp  = ($code =~ /^\s*exists/) ? !1
                                     : (($code =~ /=\s*$magic_val/) ? $magic_val