File Coverage

blib/lib/RPerl/Operation/Expression/Operator/GMPFunctions.pm
Criterion Covered Total %
statement 29 102 28.4
branch n/a
condition n/a
subroutine 10 30 33.3
pod 0 22 0.0
total 39 154 25.3


line stmt bran cond sub pod time code
1             # [[[ HEADER ]]]
2             package RPerl::Operation::Expression::Operator::GMPFunctions;
3 1     1   7 use strict;
  1         3  
  1         25  
4 1     1   5 use warnings;
  1         2  
  1         24  
5 1     1   6 use RPerl::AfterSubclass;
  1         2  
  1         218  
6             our $VERSION = 0.004_000;
7              
8             # [[[ OO INHERITANCE ]]]
9 1     1   7 use parent qw(RPerl::Operation::Expression::Operator);
  1         3  
  1         7  
10 1     1   49 use RPerl::Operation::Expression::Operator;
  1         2  
  1         23  
11              
12             # [[[ CRITICS ]]]
13             ## no critic qw(ProhibitUselessNoCritic ProhibitMagicNumbers RequireCheckedSyscalls) # USER DEFAULT 1: allow numeric values & print operator
14             ## no critic qw(RequireInterpolationOfMetachars) # USER DEFAULT 2: allow single-quoted control characters & sigils
15              
16             # [[[ INCLUDES ]]]
17 1     1   6 use RPerl::DataType::GMPInteger;
  1         2  
  1         19  
18 1     1   397 use Math::BigInt lib => 'GMP'; # we still actually use GMP in PERLOPS_PERLTYPES mode, albeit indirectly via Math::BigInt::GMP
  1         3  
  1         5  
19 1     1   1133 use Exporter 'import';
  1         3  
  1         788  
20             our @EXPORT = qw(
21             gmp_init gmp_init_set_unsigned_integer gmp_init_set_signed_integer
22             gmp_set gmp_set_unsigned_integer gmp_set_signed_integer gmp_set_number gmp_set_string
23             gmp_get_unsigned_integer gmp_get_signed_integer gmp_get_number gmp_get_string
24             gmp_add gmp_sub gmp_mul gmp_mul_unsigned_integer gmp_mul_signed_integer gmp_sub_mul_unsigned_integer gmp_add_mul_unsigned_integer gmp_neg
25             gmp_div_truncate_quotient
26             gmp_cmp
27             );
28              
29             # [[[ OO PROPERTIES ]]]
30             our hashref $properties = {};
31              
32             # [[[ SUBROUTINES & OO METHODS ]]]
33              
34             # [[[ INITIALIZATION FUNCTIONS ]]]
35              
36             # void mpz_init (mpz_t x)
37             #our void $gmp_init = sub {
38       0 0   sub gmp_init {
39             # ( my gmp_integer $x ) = @_;
40             }
41              
42             # [[[ COMBINED INITIALIZATION AND ASSIGNMENT FUNCTIONS ]]]
43              
44             # void mpz_init_set_ui (mpz_t rop, unsigned long int op)
45             #our void $gmp_init_set_unsigned_integer = sub {
46             sub gmp_init_set_unsigned_integer {
47 0     0 0 0 ( my gmp_integer $rop, my unsigned_integer $op ) = @_;
48 0         0 $rop->bzero();
49 0         0 $rop->badd($op);
50             }
51              
52             # void mpz_init_set_si (mpz_t rop, signed long int op)
53             #our void $gmp_init_set_signed_integer = sub {
54             sub gmp_init_set_signed_integer {
55 0     0 0 0 ( my gmp_integer $rop, my integer $op ) = @_;
56 0         0 $rop->bzero();
57 0         0 $rop->badd($op);
58             }
59              
60             # [[[ ASSIGNMENT FUNCTIONS ]]]
61              
62             # void mpz_set (mpz_t rop, const mpz_t op)
63             #our void $gmp_set = sub {
64             sub gmp_set {
65 0     0 0 0 ( my gmp_integer $rop, my gmp_integer $op ) = @_;
66 0         0 $rop->bzero();
67 0         0 $rop->badd($op);
68             }
69              
70             # void mpz_set_ui (mpz_t rop, unsigned long int op)
71             #our void $gmp_set_unsigned_integer = sub {
72             sub gmp_set_unsigned_integer {
73 0     0 0 0 ( my gmp_integer $rop, my unsigned_integer $op ) = @_;
74 0         0 $rop->bzero();
75 0         0 $rop->badd($op);
76             }
77              
78             # void mpz_set_si (mpz_t rop, signed long int op)
79             #our void $gmp_set_signed_integer = sub {
80             sub gmp_set_signed_integer {
81 22     22 0 2435 ( my gmp_integer $rop, my integer $op ) = @_;
82 22         90 $rop->bzero();
83 22         590 $rop->badd($op);
84             }
85              
86             # void mpz_set_d (mpz_t rop, double op)
87             #our void $gmp_set_number = sub {
88             sub gmp_set_number {
89 0     0 0 0 ( my gmp_integer $rop, my number $op ) = @_;
90 0         0 $rop->bzero();
91 0         0 $rop->badd($op);
92             }
93              
94             # int mpz_set_str (mpz_t rop, const char *str, int base)
95             #our integer $gmp_set_string = sub {
96             sub gmp_set_string {
97 0     0 0 0 ( my gmp_integer $rop, my string $str ) = @_;
98 0         0 my Math::BigInt $tmp = Math::BigInt->new($str);
99 0         0 $rop->bzero();
100 0         0 $rop->badd($tmp);
101             }
102              
103             # [[[ CONVERSION FUNCTIONS ]]]
104              
105             # unsigned long int mpz_get_ui (const mpz_t op)
106             #our unsigned_integer $gmp_get_unsigned_integer = sub {
107             sub gmp_get_unsigned_integer {
108 0     0 0 0 ( my gmp_integer $op ) = @_;
109 0         0 return $op->numify();
110             }
111              
112             # signed long int mpz_get_si (const mpz_t op)
113             #our integer $gmp_get_signed_integer = sub {
114             sub gmp_get_signed_integer {
115 2     2 0 6 ( my gmp_integer $op ) = @_;
116 2         19 return $op->numify();
117             }
118              
119             # double mpz_get_d (const mpz_t op)
120             #our integer $gmp_get_number = sub {
121             sub gmp_get_number {
122 0     0 0   ( my gmp_integer $op ) = @_;
123 0           return $op->numify();
124             }
125              
126             # char * mpz_get_str (char *str, int base, const mpz_t op)
127             #our string $gmp_get_string = sub {
128             sub gmp_get_string {
129 0     0 0   ( my gmp_integer $op ) = @_;
130 0           return $op->bstr();
131             }
132              
133             # [[[ ARITHMETIC FUNCTIONS ]]]
134              
135             # void mpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2)
136             #our gmp_integer $gmp_add = sub {
137             sub gmp_add {
138 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my gmp_integer $op2 ) = @_;
139             # in case $op1 and/or $op2 are the same variables as $rop, make copies so you don't zero them out before reading them
140 0           my gmp_integer $op1_copy = $op1->copy();
141 0           my gmp_integer $op2_copy = $op2->copy();
142 0           $rop->bzero();
143 0           $rop->badd($op1_copy);
144 0           $rop->badd($op2_copy);
145             }
146              
147             # void mpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2)
148             #our gmp_integer $gmp_sub = sub {
149             sub gmp_sub {
150 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my gmp_integer $op2 ) = @_;
151 0           my gmp_integer $op1_copy = $op1->copy();
152 0           my gmp_integer $op2_copy = $op2->copy();
153 0           $rop->bzero();
154 0           $rop->badd($op1_copy);
155 0           $rop->bsub($op2_copy);
156             }
157              
158             # void mpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2)
159             #our void $gmp_mul = sub {
160             sub gmp_mul {
161 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my gmp_integer $op2 ) = @_;
162 0           my gmp_integer $op1_copy = $op1->copy();
163 0           $rop->bzero();
164 0           $rop->badd($op1_copy);
165 0           $rop->bmul($op2);
166             }
167              
168             # void mpz_mul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2)
169             #our void $gmp_mul_unsigned_integer = sub {
170             sub gmp_mul_unsigned_integer {
171 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my unsigned_integer $op2 ) = @_;
172 0           my gmp_integer $op1_copy = $op1->copy();
173 0           $rop->bzero();
174 0           $rop->badd($op1_copy);
175 0           $rop->bmul($op2);
176             }
177              
178             # void mpz_mul_si (mpz_t rop, const mpz_t op1, long int op2)
179             #our void $gmp_mul_signed_integer = sub {
180             sub gmp_mul_signed_integer {
181 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my integer $op2 ) = @_;
182 0           my gmp_integer $op1_copy = $op1->copy();
183 0           $rop->bzero();
184 0           $rop->badd($op1_copy);
185 0           $rop->bmul($op2);
186             }
187              
188             # void mpz_submul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2)
189             #our gmp_integer $gmp_sub_mul_unsigned_integer = sub {
190             sub gmp_sub_mul_unsigned_integer {
191 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my unsigned_integer $op2 ) = @_;
192 0           my gmp_integer $op1_copy = $op1->copy();
193 0           $op1_copy->bmul($op2);
194 0           $rop->bsub($op1_copy);
195             }
196              
197             # void mpz_addmul_ui (mpz_t rop, const mpz_t op1, unsigned long int op2)
198             #our void $gmp_add_mul_unsigned_integer = sub {
199             sub gmp_add_mul_unsigned_integer {
200 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1, my unsigned_integer $op2 ) = @_;
201 0           my gmp_integer $op1_copy = $op1->copy();
202 0           $op1_copy->bmul($op2);
203 0           $rop->badd($op1_copy);
204             }
205              
206             # void mpz_neg (mpz_t rop, const mpz_t op)
207             #our void $gmp_neg = sub {
208             sub gmp_neg {
209 0     0 0   ( my gmp_integer $rop, my gmp_integer $op1 ) = @_;
210 0           my gmp_integer $op1_copy = $op1->copy();
211 0           $rop->bzero();
212 0           $rop->badd($op1_copy);
213 0           $rop->bmul(Math::BigInt->bone('-'));
214             }
215              
216             # [[[ DIVISION FUNCTIONS ]]]
217              
218             # void mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
219             #our void $gmp_div_truncate_quotient = sub {
220             sub gmp_div_truncate_quotient {
221 0     0 0   ( my gmp_integer $q, my gmp_integer $n, my gmp_integer $d ) = @_;
222 0           my gmp_integer $n_copy = $n->copy();
223 0           my gmp_integer $d_copy = $d->copy();
224 0           $q->bzero();
225 0           $q->badd($n_copy);
226 0           $q->bdiv($d_copy);
227             }
228              
229             # [[[ COMPARISON FUNCTIONS ]]]
230              
231             # int mpz_cmp (const mpz_t op1, const mpz_t op2)
232             #our integer $gmp_cmp = sub {
233             sub gmp_cmp {
234 0     0 0   ( my gmp_integer $op1, my gmp_integer $op2 ) = @_;
235 0           return $op1->bcmp($op2);
236             }
237              
238             1; # end of class