File Coverage

lib/Crypt/Perl/BigInt.pm
Criterion Covered Total %
statement 37 37 100.0
branch 7 10 70.0
condition n/a
subroutine 10 10 100.0
pod 0 2 0.0
total 54 59 91.5


line stmt bran cond sub pod time code
1             package Crypt::Perl::BigInt;
2              
3 17     17   530791 use strict;
  17         51  
  17         402  
4 17     17   71 use warnings;
  17         40  
  17         424  
5              
6             #Even though Crypt::Perl intends to be pure Perl, there’s no reason
7             #not to use faster computation methods when they’re available.
8 17     17   14144 use Math::BigInt try => 'GMP,Pari';
  17         318464  
  17         85  
9              
10             #No FastCalc because of bugs shown in the following test runs:
11             #http://www.cpantesters.org/cpan/report/a03dce70-c698-11e6-a1ce-1a99c671d6e6
12             #http://www.cpantesters.org/cpan/report/0a3e797e-c693-11e6-8c46-2488c671d6e6
13              
14             #To test pure Perl speed, comment out the above and enable:
15             #use Math::BigInt;
16              
17 17     17   304851 use parent -norequire => 'Math::BigInt';
  17         40  
  17         156  
18              
19             #There has been some trouble getting GMP and Pari to do from_bytes()
20             #and as_bytes(), so let’s check on those here.
21             BEGIN {
22 17 50   17   1570 if ( !eval { __PACKAGE__->fffrom_bytes('1234') } ) {
  17         348  
23 17         72 *from_bytes = \&_pp_from_bytes;
24             }
25              
26 17 50       42 if ( !eval { __PACKAGE__->new(1234)->aaas_bytes() } ) {
  17         139  
27 17         1986 *as_bytes = \&_pp_as_bytes;
28             }
29              
30 17         399 $@ = q<>;
31             }
32              
33 17     17   6731 use Crypt::Perl::X ();
  17         49  
  17         2925  
34              
35             sub _pp_from_bytes {
36 2803     2803   990791 my $class = shift;
37              
38 2803         15311 return $class->from_hex( unpack 'H*', $_[0] );
39             }
40              
41             sub _pp_as_bytes {
42 5090     5090   22079 my ($self) = @_;
43              
44 5090 50       17252 die Crypt::Perl::X::create('Generic', "Negatives ($self) can’t convert to bytes!") if $self < 0;
45              
46 5090         847676 my $hex = $self->as_hex();
47              
48             #Ensure that we have an even number of hex digits.
49 5090 100       10026152 if (length($hex) % 2) {
50 2174         7016 substr($hex, 1, 1) = q<>; #just remove the “x” of “0x”
51             }
52             else {
53 2916         6372 substr($hex, 0, 2) = q<>; #remove “0x”
54             }
55              
56 5090         32092 return pack 'H*', $hex;
57             }
58              
59             sub bit_length {
60 1435     1435 0 9080 my ($self) = @_;
61              
62             #Probably faster than 1 + $self->copy()->blog(2) …
63 1435         6216 return( length($self->as_bin()) - 2 );
64             }
65              
66             sub test_bit {
67 410342     410342 0 814171 my ($self, $bit_from_least) = @_;
68              
69 410342         1062635 my $bstr = substr( $self->as_bin(), 2 );
70              
71 410342 100       438323870 return 0 if $bit_from_least >= length($bstr);
72              
73 409808         1345435 return substr($bstr, -$bit_from_least - 1, 1);
74             }
75              
76             1;