File Coverage

blib/lib/Parse/YALALR/Vector.pm
Criterion Covered Total %
statement 6 59 10.1
branch 0 18 0.0
condition 0 3 0.0
subroutine 2 13 15.3
pod 0 11 0.0
total 8 104 7.6


line stmt bran cond sub pod time code
1             package Parse::YALALR::Vector;
2              
3 1     1   7 use strict;
  1         2  
  1         37  
4 1     1   6 use Carp;
  1         2  
  1         944  
5              
6             # Translates between three types:
7             # call them bitvec, symname, symnum
8              
9             sub new {
10 0     0 0   my ($class) = @_;
11 0   0       return bless { numvals => 0 }, ref $class || $class;
12             }
13              
14             # add_value : symname -> symnum
15             #
16             # Register a symname, return its symnum
17             sub add_value {
18 0     0 0   my ($self, $val) = @_;
19 0 0         if ($self->{len_used}) { # DEBUGGING
20 0           confess "Parse::YALALR::Vector expanded to include $val after vec used, ".
21             "len would be wrong";
22             }
23 0           $self->{values}->[$self->{numvals}] = $val;
24 0           $self->{indices}->{$val} = $self->{numvals}++;
25             }
26              
27             # get_index : symname -> symnum
28             sub get_index {
29 0     0 0   my ($self, $val, $nocreate) = @_;
30 0 0         croak("Huh? get_index(number)??")
31             if $val =~ /^\d+$/;
32 0           my $i = $self->{indices}->{$val};
33 0 0         if (defined $i) { return $i; }
  0 0          
34 0           elsif (!$nocreate) { return $self->add_value($val); }
35 0           else { return undef; }
36             }
37              
38             # get_value : symnum -> symname
39             sub get_value {
40 0     0 0   my ($self, $i) = @_;
41 0           return $self->{values}->[$i];
42             }
43              
44             # get_onevec : symname -> bitvec
45             sub get_onevec {
46 0     0 0   my ($self, $val) = @_;
47 0           my $i = $self->get_index($val);
48 0           my $vec = "";
49 0           vec($vec, $i, 1) = 1;
50 0           $self->{len_used} = 1; # DEBUGGING
51 0           return $vec;
52             }
53              
54             # make_onevec : symnum -> bitvec
55             sub make_onevec {
56 0     0 0   my ($self, $i) = @_;
57 0           my $vec = '';
58 0           vec($vec, $self->{numvals} - 1, 1) = 0; # Set the length
59 0           vec($vec, $i, 1) = 1;
60 0           $self->{len_used} = 1; # DEBUGGING
61 0           return $vec;
62             }
63              
64             # make_nullvec : () -> bitvec
65             sub make_nullvec {
66 0     0 0   my ($self) = @_;
67 0           my $vec = '';
68 0           vec($vec, $self->{numvals} - 1, 1) = 0; # Set the length
69 0           $self->{len_used} = 1; # DEBUGGING
70 0           return $vec;
71             }
72              
73              
74             sub dump_bits {
75 0     0 0   my ($self, $vec) = @_;
76 0           return unpack("b*", $vec);
77             }
78              
79             # get_values : bitvec -> ( symname )
80             sub get_values {
81 0     0 0   my ($self, $vec) = @_;
82 0           my @result;
83 0           for (my $i = 0; $i < 8 * length($vec); $i++) {
84 0 0         push(@result, $self->{values}->[$i])
85             if vec($vec, $i, 1);
86             }
87 0           return @result;
88             }
89              
90             # get_indices : bitvec -> ( symnum )
91             sub get_indices {
92 0     0 0   my ($self, $vec) = @_;
93 0           my @result;
94 0           for (my $i = 0; $i < 8 * length($vec); $i++) {
95 0 0         push(@result, $i) if vec($vec, $i, 1);
96             }
97 0           return @result;
98             }
99              
100             sub dump_vals {
101 0     0 0   my ($self, $vec) = @_;
102 0           my @vals;
103              
104 0 0         if (defined $vec) {
105 0           for my $i (0 .. length($vec) * 8) {
106 0 0         push(@vals, $self->get_value($i)) if (vec($vec, $i, 1));
107             }
108             } else {
109 0           for my $i (0 .. $self->{numvals} - 1) {
110 0 0         push(@vals, $self->get_value($i)) if (vec($vec, $i, 1));
111             }
112             }
113              
114 0           return @vals;
115             }
116              
117             1;