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 18     18   530024 use strict;
  18         61  
  18         426  
4 18     18   71 use warnings;
  18         30  
  18         451  
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 18     18   14009 use Math::BigInt try => 'GMP,Pari';
  18         313296  
  18         80  
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 18     18   307954 use parent -norequire => 'Math::BigInt';
  18         45  
  18         144  
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 18 50   18   1623 if ( !eval { __PACKAGE__->fffrom_bytes('1234') } ) {
  18         412  
23 18         76 *from_bytes = \&_pp_from_bytes;
24             }
25              
26 18 50       39 if ( !eval { __PACKAGE__->new(1234)->aaas_bytes() } ) {
  18         105  
27 18         2028 *as_bytes = \&_pp_as_bytes;
28             }
29              
30 18         384 $@ = q<>;
31             }
32              
33 18     18   6500 use Crypt::Perl::X ();
  18         50  
  18         2919  
34              
35             sub _pp_from_bytes {
36 2803     2803   919355 my $class = shift;
37              
38 2803         16609 return $class->from_hex( unpack 'H*', $_[0] );
39             }
40              
41             sub _pp_as_bytes {
42 5090     5090   22010 my ($self) = @_;
43              
44 5090 50       17295 die Crypt::Perl::X::create('Generic', "Negatives ($self) can’t convert to bytes!") if $self < 0;
45              
46 5090         845258 my $hex = $self->as_hex();
47              
48             #Ensure that we have an even number of hex digits.
49 5090 100       9694084 if (length($hex) % 2) {
50 2180         7870 substr($hex, 1, 1) = q<>; #just remove the “x” of “0x”
51             }
52             else {
53 2910         6336 substr($hex, 0, 2) = q<>; #remove “0x”
54             }
55              
56 5090         31601 return pack 'H*', $hex;
57             }
58              
59             sub bit_length {
60 1435     1435 0 8878 my ($self) = @_;
61              
62             #Probably faster than 1 + $self->copy()->blog(2) …
63 1435         5680 return( length($self->as_bin()) - 2 );
64             }
65              
66             sub test_bit {
67 410270     410270 0 841459 my ($self, $bit_from_least) = @_;
68              
69 410270         1133097 my $bstr = substr( $self->as_bin(), 2 );
70              
71 410270 100       425179860 return 0 if $bit_from_least >= length($bstr);
72              
73 409753         1411115 return substr($bstr, -$bit_from_least - 1, 1);
74             }
75              
76             1;