File Coverage

blib/lib/Algorithm/HyperLogLog.pm
Criterion Covered Total %
statement 37 39 94.8
branch 4 8 50.0
condition n/a
subroutine 7 8 87.5
pod 3 3 100.0
total 51 58 87.9


line stmt bran cond sub pod time code
1             package Algorithm::HyperLogLog;
2 7     7   195864 use strict;
  7         21  
  7         211  
3 7     7   46 use warnings;
  7         19  
  7         210  
4 7     7   136 use 5.008008;
  7         31  
5 7     7   47 use Carp qw(croak);
  7         20  
  7         3400  
6              
7             our $VERSION = '0.24';
8              
9             our $PERL_ONLY;
10             if ( !defined $PERL_ONLY ) {
11             $PERL_ONLY = $ENV{PERL_HLL_PUREPERL} ? 1 : 0;
12             }
13              
14             if ( !exists $INC{'Algorithm/HyperLogLog/PP.pm'} ) {
15             if ( !$PERL_ONLY ) {
16             require XSLoader;
17             $PERL_ONLY = !eval { XSLoader::load( __PACKAGE__, $VERSION ); };
18             }
19             if ($PERL_ONLY) {
20             require 'Algorithm/HyperLogLog/PP.pm';
21             }
22             }
23              
24             sub new_from_file {
25 4     4 1 2299 my ( $class, $filename ) = @_;
26 4 50       121 open my $fh, '<', $filename or die $!;
27 4     0   24 my $on_error = sub { close $fh; croak "Invalid dump file($filename)"; };
  0         0  
  0         0  
28              
29 4         13 binmode $fh;
30 4         10 my ( @dumpdata, $buf, $readed );
31              
32             # Read register size data
33 4         48 $readed = read( $fh, $buf, 1 );
34 4 50       16 $on_error->() if $readed != 1;
35 4         14 my $k = unpack 'C', $buf;
36              
37             # Read register content data
38 4         11 my $m = 2**$k;
39 4         129 $readed = read $fh, $buf, $m;
40 4 50       15 $on_error->() if $readed != $m;
41 4         25 close $fh;
42 4         9594 @dumpdata = unpack 'C*', $buf;
43 4         3070 my $self = $class->_new_from_dump( $k, \@dumpdata );
44 4         878 return $self;
45             }
46              
47             sub dump_to_file {
48 4     4 1 6088 my ( $self, $filename ) = @_;
49 4         33 my $k = log( $self->register_size ) / log(2); # Calculate log2(register_size)
50 4         2129 my $dumpdata = $self->_dump_register();
51 4 50       183 open my $fh, '>', $filename or die $!;
52 4         24 binmode $fh;
53 4         27 my $buf = pack 'C', $k;
54 4         40 print $fh $buf;
55 4         2029 $buf = pack 'C*', @$dumpdata;
56 4         374 print $fh $buf;
57 4         853 close $fh;
58             }
59              
60             sub XS {
61 4     4 1 999 !$PERL_ONLY;
62             }
63              
64             1;
65             __END__