File Coverage

blib/lib/Bijection.pm
Criterion Covered Total %
statement 33 33 100.0
branch 1 2 50.0
condition 6 18 33.3
subroutine 10 10 100.0
pod 3 3 100.0
total 53 66 80.3


line stmt bran cond sub pod time code
1             package Bijection;
2 3     3   204600 use 5.006; use strict; use warnings; our $VERSION = '0.03';
  3     3   31  
  3     3   15  
  3         7  
  3         61  
  3         27  
  3         7  
  3         154  
3 3     3   1437 use Import::Export; use base qw/Import::Export/;
  3     3   51995  
  3         21  
  3         121  
  3         20  
  3         259  
4 3     3   18 use Carp qw/croak/;
  3         6  
  3         459  
5             our %EX = (biject => [qw/all/], inverse => [qw/all/], bijection_set => [qw/all/]);
6              
7             our (@ALPHA, $COUNT, %INDEX);
8             BEGIN {
9             sub bijection_set {
10 5     5 1 1126 @ALPHA = @_;
11 5         13 $COUNT = @ALPHA;
12 5         16 my $index = -1;
13 5         1074 %INDEX = map +( $_ => ++$index ), @ALPHA;
14             }
15 3     3   18 bijection_set(qw/b c d f g h j k l m n p q r s t v w x y z B C D F G H J K L M N P Q R S T V W X Y Z 0 1 2 3 4 5 6 7 8 9/);
16             }
17              
18             sub biject {
19 5031     5031 1 2528837 my ($id, $out) = @_;
20 5031 50 33     38949 croak "id to encode must be an integer and non-negative" unless (($id =~ m/^\d+$/ || $id > 0) and $id += $COUNT);
      33        
21 5031   33     11939 do { $out .= $ALPHA[($id % $COUNT)]; 1} and $id = int($id/$COUNT) while ($id > 0);
  12411         21295  
  12411         33174  
22 5031   33     17454 reverse ($out || $ALPHA[0]);
23             }
24              
25             sub inverse {
26 5031     5031 1 29583 my ($out, $id) = (@_, 0);
27 5031   33     19047 defined $INDEX{$_} && do { $id = $id * $COUNT + $INDEX{$_}; 1; } or croak "invalid character $_ in $out" for (split //, $out);
  12411   33     18117  
  12411         35458  
28 5031         16813 $id - $COUNT;
29             }
30              
31             1;
32              
33             __END__