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   542156 use strict;
  18         67  
  18         444  
4 18     18   74 use warnings;
  18         28  
  18         504  
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   14427 use Math::BigInt try => 'GMP,Pari';
  18         330991  
  18         79  
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   321557 use parent -norequire => 'Math::BigInt';
  18         38  
  18         142  
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   1937 if ( !eval { __PACKAGE__->fffrom_bytes('1234') } ) {
  18         409  
23 18         90 *from_bytes = \&_pp_from_bytes;
24             }
25              
26 18 50       43 if ( !eval { __PACKAGE__->new(1234)->aaas_bytes() } ) {
  18         108  
27 18         2055 *as_bytes = \&_pp_as_bytes;
28             }
29              
30 18         392 $@ = q<>;
31             }
32              
33 18     18   6600 use Crypt::Perl::X ();
  18         54  
  18         3040  
34              
35             sub _pp_from_bytes {
36 2803     2803   945498 my $class = shift;
37              
38 2803         16612 return $class->from_hex( unpack 'H*', $_[0] );
39             }
40              
41             sub _pp_as_bytes {
42 5090     5090   23749 my ($self) = @_;
43              
44 5090 50       17690 die Crypt::Perl::X::create('Generic', "Negatives ($self) can’t convert to bytes!") if $self < 0;
45              
46 5090         864559 my $hex = $self->as_hex();
47              
48             #Ensure that we have an even number of hex digits.
49 5090 100       10013220 if (length($hex) % 2) {
50 2178         7829 substr($hex, 1, 1) = q<>; #just remove the “x” of “0x”
51             }
52             else {
53 2912         6508 substr($hex, 0, 2) = q<>; #remove “0x”
54             }
55              
56 5090         31877 return pack 'H*', $hex;
57             }
58              
59             sub bit_length {
60 1435     1435 0 9230 my ($self) = @_;
61              
62             #Probably faster than 1 + $self->copy()->blog(2) …
63 1435         5526 return( length($self->as_bin()) - 2 );
64             }
65              
66             sub test_bit {
67 410378     410378 0 792919 my ($self, $bit_from_least) = @_;
68              
69 410378         1094886 my $bstr = substr( $self->as_bin(), 2 );
70              
71 410378 100       428350647 return 0 if $bit_from_least >= length($bstr);
72              
73 409867         1331814 return substr($bstr, -$bit_from_least - 1, 1);
74             }
75              
76             1;