arb_sys/
arf.rs

1#![allow(non_camel_case_types)]
2
3//! *See the [Arb documentation](https://arblib.org/).
4
5use derivative::Derivative;
6
7use flint_sys::deps::*;
8use flint_sys::flint::*;
9use flint_sys::fmpq::fmpq;
10use flint_sys::fmpz::fmpz;
11
12use crate::fmpr::fmpr_struct;
13use crate::mag::mag_struct;
14use libc::{c_char, c_int, FILE};
15
16#[repr(C)]
17#[derive(Debug, Copy, Clone)]
18pub struct mantissa_noptr_struct {
19    pub d: [mp_limb_t; 2usize],
20}
21
22#[repr(C)]
23#[derive(Debug, Copy, Clone)]
24pub struct mantissa_ptr_struct {
25    pub alloc: mp_size_t,
26    pub d: mp_ptr,
27}
28
29#[repr(C)]
30#[derive(Copy, Clone)]
31pub union mantissa_struct {
32    pub noptr: mantissa_noptr_struct,
33    pub ptr: mantissa_ptr_struct,
34}
35
36#[repr(C)]
37#[derive(Copy, Clone, Derivative)]
38#[derivative(Debug)]
39pub struct arf_struct {
40    pub exp: fmpz,
41    pub size: mp_size_t,
42    #[derivative(Debug="ignore")]
43    pub d: mantissa_struct,
44}
45
46pub type arf_t = [arf_struct; 1usize];
47pub type arf_ptr = *mut arf_struct;
48pub type arf_srcptr = *const arf_struct;
49
50extern "C" {
51    pub fn arf_rounds_down(rnd: c_int, sgnbit: c_int) -> c_int;
52    pub fn arf_rounds_up(rnd: c_int, sgnbit: c_int) -> c_int;
53    pub fn arf_rnd_to_mpfr(rnd: c_int) -> mpfr_rnd_t;
54    pub fn _arf_promote(x: *mut arf_struct, n: mp_size_t);
55    pub fn _arf_demote(x: *mut arf_struct);
56    pub fn arf_init(x: *mut arf_struct);
57    pub fn arf_clear(x: *mut arf_struct);
58    pub fn arf_zero(x: *mut arf_struct);
59    pub fn arf_pos_inf(x: *mut arf_struct);
60    pub fn arf_neg_inf(x: *mut arf_struct);
61    pub fn arf_nan(x: *mut arf_struct);
62    pub fn arf_is_special(x: *const arf_struct) -> c_int;
63    pub fn arf_is_zero(x: *const arf_struct) -> c_int;
64    pub fn arf_is_pos_inf(x: *const arf_struct) -> c_int;
65    pub fn arf_is_neg_inf(x: *const arf_struct) -> c_int;
66    pub fn arf_is_nan(x: *const arf_struct) -> c_int;
67    pub fn arf_is_normal(x: *const arf_struct) -> c_int;
68    pub fn arf_is_finite(x: *const arf_struct) -> c_int;
69    pub fn arf_is_inf(x: *const arf_struct) -> c_int;
70    pub fn arf_one(x: *mut arf_struct);
71    pub fn arf_is_one(x: *const arf_struct) -> c_int;
72    pub fn arf_sgn(x: *const arf_struct) -> c_int;
73    pub fn arf_cmp(x: *const arf_struct, y: *const arf_struct) -> c_int;
74    pub fn arf_cmpabs(x: *const arf_struct, y: *const arf_struct) -> c_int;
75    pub fn arf_cmpabs_ui(x: *const arf_struct, y: mp_limb_t) -> c_int;
76    pub fn arf_cmpabs_d(x: *const arf_struct, y: f64) -> c_int;
77    pub fn arf_cmp_si(x: *const arf_struct, y: mp_limb_signed_t) -> c_int;
78    pub fn arf_cmp_ui(x: *const arf_struct, y: mp_limb_t) -> c_int;
79    pub fn arf_cmp_d(x: *const arf_struct, y: f64) -> c_int;
80    pub fn arf_swap(y: *mut arf_struct, x: *mut arf_struct);
81    pub fn arf_set(y: *mut arf_struct, x: *const arf_struct);
82    pub fn arf_neg(y: *mut arf_struct, x: *const arf_struct);
83    pub fn arf_init_set_ui(x: *mut arf_struct, v: mp_limb_t);
84    pub fn arf_init_set_si(x: *mut arf_struct, v: mp_limb_signed_t);
85    pub fn arf_set_ui(x: *mut arf_struct, v: mp_limb_t);
86    pub fn arf_set_si(x: *mut arf_struct, v: mp_limb_signed_t);
87    pub fn arf_init_set_shallow(z: *mut arf_struct, x: *const arf_struct);
88    pub fn arf_init_neg_shallow(z: *mut arf_struct, x: *const arf_struct);
89    pub fn arf_init_set_mag_shallow(y: *mut arf_struct, x: *const mag_struct);
90    pub fn arf_init_neg_mag_shallow(z: *mut arf_struct, x: *const mag_struct);
91    pub fn arf_cmpabs_mag(x: *const arf_struct, y: *const mag_struct) -> c_int;
92    pub fn arf_mag_cmpabs(x: *const mag_struct, y: *const arf_struct) -> c_int;
93    pub fn arf_set_mpn(y: *mut arf_struct, x: mp_srcptr, xn: mp_size_t, sgnbit: c_int);
94    pub fn arf_set_mpz(y: *mut arf_struct, x: *const __mpz_struct);
95    pub fn arf_set_fmpz(y: *mut arf_struct, x: *const fmpz);
96    pub fn _arf_set_round_ui(
97        x: *mut arf_struct,
98        v: mp_limb_t,
99        sgnbit: c_int,
100        prec: mp_limb_signed_t,
101        rnd: c_int,
102    ) -> c_int;
103    pub fn _arf_set_round_uiui(
104        z: *mut arf_struct,
105        fix: *mut mp_limb_signed_t,
106        hi: mp_limb_t,
107        lo: mp_limb_t,
108        sgnbit: c_int,
109        prec: mp_limb_signed_t,
110        rnd: c_int,
111    ) -> c_int;
112    pub fn _arf_set_round_mpn(
113        y: *mut arf_struct,
114        exp_shift: *mut mp_limb_signed_t,
115        x: mp_srcptr,
116        xn: mp_size_t,
117        sgnbit: c_int,
118        prec: mp_limb_signed_t,
119        rnd: c_int,
120    ) -> c_int;
121    pub fn arf_set_round_ui(
122        x: *mut arf_struct,
123        v: mp_limb_t,
124        prec: mp_limb_signed_t,
125        rnd: c_int,
126    ) -> c_int;
127    pub fn arf_set_round_si(
128        x: *mut arf_struct,
129        v: mp_limb_signed_t,
130        prec: mp_limb_signed_t,
131        rnd: c_int,
132    ) -> c_int;
133    pub fn arf_set_round_mpz(
134        y: *mut arf_struct,
135        x: *const __mpz_struct,
136        prec: mp_limb_signed_t,
137        rnd: c_int,
138    ) -> c_int;
139    pub fn arf_set_round_fmpz(
140        y: *mut arf_struct,
141        x: *const fmpz,
142        prec: mp_limb_signed_t,
143        rnd: c_int,
144    ) -> c_int;
145    pub fn arf_set_round(
146        y: *mut arf_struct,
147        x: *const arf_struct,
148        prec: mp_limb_signed_t,
149        rnd: c_int,
150    ) -> c_int;
151    pub fn arf_neg_round(
152        y: *mut arf_struct,
153        x: *const arf_struct,
154        prec: mp_limb_signed_t,
155        rnd: c_int,
156    ) -> c_int;
157    pub fn arf_get_fmpr(y: *mut fmpr_struct, x: *const arf_struct);
158    pub fn arf_set_fmpr(y: *mut arf_struct, x: *const fmpr_struct);
159    pub fn arf_get_mpfr(x: *mut __mpfr_struct, y: *const arf_struct, rnd: mpfr_rnd_t) -> c_int;
160    pub fn arf_set_mpfr(x: *mut arf_struct, y: *const __mpfr_struct);
161    pub fn arf_equal(x: *const arf_struct, y: *const arf_struct) -> c_int;
162    pub fn arf_equal_si(x: *const arf_struct, y: mp_limb_signed_t) -> c_int;
163    pub fn arf_min(z: *mut arf_struct, a: *const arf_struct, b: *const arf_struct);
164    pub fn arf_max(z: *mut arf_struct, a: *const arf_struct, b: *const arf_struct);
165    pub fn arf_abs(y: *mut arf_struct, x: *const arf_struct);
166    pub fn arf_bits(x: *const arf_struct) -> mp_limb_signed_t;
167    pub fn arf_bot(e: *mut fmpz, x: *const arf_struct);
168    pub fn arf_is_int(x: *const arf_struct) -> c_int;
169    pub fn arf_is_int_2exp_si(x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
170    pub fn arf_cmp_2exp_si(x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
171    pub fn arf_cmpabs_2exp_si(x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
172    pub fn arf_set_si_2exp_si(x: *mut arf_struct, man: mp_limb_signed_t, exp: mp_limb_signed_t);
173    pub fn arf_set_ui_2exp_si(x: *mut arf_struct, man: mp_limb_t, exp: mp_limb_signed_t);
174    pub fn arf_mul_2exp_si(y: *mut arf_struct, x: *const arf_struct, e: mp_limb_signed_t);
175    pub fn arf_mul_2exp_fmpz(y: *mut arf_struct, x: *const arf_struct, e: *const fmpz);
176    pub fn arf_set_round_fmpz_2exp(
177        y: *mut arf_struct,
178        x: *const fmpz,
179        exp: *const fmpz,
180        prec: mp_limb_signed_t,
181        rnd: c_int,
182    ) -> c_int;
183    pub fn arf_abs_bound_lt_2exp_fmpz(b: *mut fmpz, x: *const arf_struct);
184    pub fn arf_abs_bound_le_2exp_fmpz(b: *mut fmpz, x: *const arf_struct);
185    pub fn arf_abs_bound_lt_2exp_si(x: *const arf_struct) -> mp_limb_signed_t;
186    pub fn arf_frexp(man: *mut arf_struct, exp: *mut fmpz, x: *const arf_struct);
187    pub fn arf_get_fmpz_2exp(man: *mut fmpz, exp: *mut fmpz, x: *const arf_struct);
188    pub fn _arf_get_integer_mpn(
189        y: mp_ptr,
190        x: mp_srcptr,
191        xn: mp_size_t,
192        exp: mp_limb_signed_t,
193    ) -> c_int;
194    pub fn _arf_set_mpn_fixed(
195        z: *mut arf_struct,
196        xp: mp_srcptr,
197        xn: mp_size_t,
198        fixn: mp_size_t,
199        negative: c_int,
200        prec: mp_limb_signed_t,
201        rnd: c_int,
202    ) -> c_int;
203    pub fn arf_get_fmpz(z: *mut fmpz, x: *const arf_struct, rnd: c_int) -> c_int;
204    pub fn arf_get_si(x: *const arf_struct, rnd: c_int) -> mp_limb_signed_t;
205    pub fn arf_get_fmpz_fixed_fmpz(y: *mut fmpz, x: *const arf_struct, e: *const fmpz) -> c_int;
206    pub fn arf_get_fmpz_fixed_si(y: *mut fmpz, x: *const arf_struct, e: mp_limb_signed_t) -> c_int;
207    pub fn arf_set_fmpz_2exp(x: *mut arf_struct, man: *const fmpz, exp: *const fmpz);
208    pub fn arf_floor(z: *mut arf_struct, x: *const arf_struct);
209    pub fn arf_ceil(z: *mut arf_struct, x: *const arf_struct);
210    pub fn arf_debug(x: *const arf_struct);
211    pub fn arf_fprint(file: *mut FILE, x: *const arf_struct);
212    pub fn arf_fprintd(file: *mut FILE, y: *const arf_struct, d: mp_limb_signed_t);
213    pub fn arf_print(x: *const arf_struct);
214    pub fn arf_printd(y: *const arf_struct, d: mp_limb_signed_t);
215    pub fn arf_randtest(
216        x: *mut arf_struct,
217        state: *mut flint_rand_s,
218        bits: mp_limb_signed_t,
219        mag_bits: mp_limb_signed_t,
220    );
221    pub fn arf_randtest_not_zero(
222        x: *mut arf_struct,
223        state: *mut flint_rand_s,
224        bits: mp_limb_signed_t,
225        mag_bits: mp_limb_signed_t,
226    );
227    pub fn arf_randtest_special(
228        x: *mut arf_struct,
229        state: *mut flint_rand_s,
230        bits: mp_limb_signed_t,
231        mag_bits: mp_limb_signed_t,
232    );
233    pub fn arf_urandom(
234        x: *mut arf_struct,
235        state: *mut flint_rand_s,
236        bits: mp_limb_signed_t,
237        rnd: c_int,
238    );
239    pub static mut __arf_mul_tmp: mp_ptr;
240    pub static mut __arf_mul_alloc: mp_limb_signed_t;
241    pub fn _arf_mul_tmp_cleanup();
242    pub fn arf_mul_special(z: *mut arf_struct, x: *const arf_struct, y: *const arf_struct);
243    pub fn arf_mul_via_mpfr(
244        z: *mut arf_struct,
245        x: *const arf_struct,
246        y: *const arf_struct,
247        prec: mp_limb_signed_t,
248        rnd: c_int,
249    ) -> c_int;
250    pub fn arf_mul_rnd_any(
251        z: arf_ptr,
252        x: arf_srcptr,
253        y: arf_srcptr,
254        prec: mp_limb_signed_t,
255        rnd: c_int,
256    ) -> c_int;
257    pub fn arf_mul_rnd_down(
258        z: arf_ptr,
259        x: arf_srcptr,
260        y: arf_srcptr,
261        prec: mp_limb_signed_t,
262    ) -> c_int;
263    pub fn arf_neg_mul(
264        z: *mut arf_struct,
265        x: *const arf_struct,
266        y: *const arf_struct,
267        prec: mp_limb_signed_t,
268        rnd: c_int,
269    ) -> c_int;
270    pub fn arf_mul_ui(
271        z: arf_ptr,
272        x: arf_srcptr,
273        y: mp_limb_t,
274        prec: mp_limb_signed_t,
275        rnd: c_int,
276    ) -> c_int;
277    pub fn arf_mul_si(
278        z: arf_ptr,
279        x: arf_srcptr,
280        y: mp_limb_signed_t,
281        prec: mp_limb_signed_t,
282        rnd: c_int,
283    ) -> c_int;
284    pub fn arf_mul_mpz(
285        z: arf_ptr,
286        x: arf_srcptr,
287        y: *const __mpz_struct,
288        prec: mp_limb_signed_t,
289        rnd: c_int,
290    ) -> c_int;
291    pub fn arf_mul_fmpz(
292        z: arf_ptr,
293        x: arf_srcptr,
294        y: *const fmpz,
295        prec: mp_limb_signed_t,
296        rnd: c_int,
297    ) -> c_int;
298    pub static mut __arf_add_tmp: mp_ptr;
299    pub static mut __arf_add_alloc: mp_limb_signed_t;
300    pub fn _arf_add_tmp_cleanup();
301    pub fn _arf_add_mpn(
302        z: *mut arf_struct,
303        xp: mp_srcptr,
304        xn: mp_size_t,
305        xsgnbit: c_int,
306        xexp: *const fmpz,
307        yp: mp_srcptr,
308        yn: mp_size_t,
309        ysgnbit: c_int,
310        shift: mp_limb_t,
311        prec: mp_limb_signed_t,
312        rnd: c_int,
313    ) -> c_int;
314    pub fn arf_add(
315        z: arf_ptr,
316        x: arf_srcptr,
317        y: arf_srcptr,
318        prec: mp_limb_signed_t,
319        rnd: c_int,
320    ) -> c_int;
321    pub fn arf_add_si(
322        z: arf_ptr,
323        x: arf_srcptr,
324        y: mp_limb_signed_t,
325        prec: mp_limb_signed_t,
326        rnd: c_int,
327    ) -> c_int;
328    pub fn arf_add_ui(
329        z: arf_ptr,
330        x: arf_srcptr,
331        y: mp_limb_t,
332        prec: mp_limb_signed_t,
333        rnd: c_int,
334    ) -> c_int;
335    pub fn arf_add_fmpz(
336        z: arf_ptr,
337        x: arf_srcptr,
338        y: *const fmpz,
339        prec: mp_limb_signed_t,
340        rnd: c_int,
341    ) -> c_int;
342    pub fn arf_add_fmpz_2exp(
343        z: arf_ptr,
344        x: arf_srcptr,
345        y: *const fmpz,
346        exp: *const fmpz,
347        prec: mp_limb_signed_t,
348        rnd: c_int,
349    ) -> c_int;
350    pub fn arf_sub(
351        z: arf_ptr,
352        x: arf_srcptr,
353        y: arf_srcptr,
354        prec: mp_limb_signed_t,
355        rnd: c_int,
356    ) -> c_int;
357    pub fn arf_sub_si(
358        z: arf_ptr,
359        x: arf_srcptr,
360        y: mp_limb_signed_t,
361        prec: mp_limb_signed_t,
362        rnd: c_int,
363    ) -> c_int;
364    pub fn arf_sub_ui(
365        z: arf_ptr,
366        x: arf_srcptr,
367        y: mp_limb_t,
368        prec: mp_limb_signed_t,
369        rnd: c_int,
370    ) -> c_int;
371    pub fn arf_sub_fmpz(
372        z: arf_ptr,
373        x: arf_srcptr,
374        y: *const fmpz,
375        prec: mp_limb_signed_t,
376        rnd: c_int,
377    ) -> c_int;
378    pub fn arf_addmul(
379        z: arf_ptr,
380        x: arf_srcptr,
381        y: arf_srcptr,
382        prec: mp_limb_signed_t,
383        rnd: c_int,
384    ) -> c_int;
385    pub fn arf_addmul_ui(
386        z: arf_ptr,
387        x: arf_srcptr,
388        y: mp_limb_t,
389        prec: mp_limb_signed_t,
390        rnd: c_int,
391    ) -> c_int;
392    pub fn arf_addmul_si(
393        z: arf_ptr,
394        x: arf_srcptr,
395        y: mp_limb_signed_t,
396        prec: mp_limb_signed_t,
397        rnd: c_int,
398    ) -> c_int;
399    pub fn arf_addmul_mpz(
400        z: arf_ptr,
401        x: arf_srcptr,
402        y: *const __mpz_struct,
403        prec: mp_limb_signed_t,
404        rnd: c_int,
405    ) -> c_int;
406    pub fn arf_addmul_fmpz(
407        z: arf_ptr,
408        x: arf_srcptr,
409        y: *const fmpz,
410        prec: mp_limb_signed_t,
411        rnd: c_int,
412    ) -> c_int;
413    pub fn arf_submul(
414        z: arf_ptr,
415        x: arf_srcptr,
416        y: arf_srcptr,
417        prec: mp_limb_signed_t,
418        rnd: c_int,
419    ) -> c_int;
420    pub fn arf_submul_ui(
421        z: arf_ptr,
422        x: arf_srcptr,
423        y: mp_limb_t,
424        prec: mp_limb_signed_t,
425        rnd: c_int,
426    ) -> c_int;
427    pub fn arf_submul_si(
428        z: arf_ptr,
429        x: arf_srcptr,
430        y: mp_limb_signed_t,
431        prec: mp_limb_signed_t,
432        rnd: c_int,
433    ) -> c_int;
434    pub fn arf_submul_mpz(
435        z: arf_ptr,
436        x: arf_srcptr,
437        y: *const __mpz_struct,
438        prec: mp_limb_signed_t,
439        rnd: c_int,
440    ) -> c_int;
441    pub fn arf_submul_fmpz(
442        z: arf_ptr,
443        x: arf_srcptr,
444        y: *const fmpz,
445        prec: mp_limb_signed_t,
446        rnd: c_int,
447    ) -> c_int;
448    pub fn arf_sosq(
449        z: *mut arf_struct,
450        x: *const arf_struct,
451        y: *const arf_struct,
452        prec: mp_limb_signed_t,
453        rnd: c_int,
454    ) -> c_int;
455    pub fn arf_div(
456        z: arf_ptr,
457        x: arf_srcptr,
458        y: arf_srcptr,
459        prec: mp_limb_signed_t,
460        rnd: c_int,
461    ) -> c_int;
462    pub fn arf_div_ui(
463        z: arf_ptr,
464        x: arf_srcptr,
465        y: mp_limb_t,
466        prec: mp_limb_signed_t,
467        rnd: c_int,
468    ) -> c_int;
469    pub fn arf_ui_div(
470        z: arf_ptr,
471        x: mp_limb_t,
472        y: arf_srcptr,
473        prec: mp_limb_signed_t,
474        rnd: c_int,
475    ) -> c_int;
476    pub fn arf_div_si(
477        z: arf_ptr,
478        x: arf_srcptr,
479        y: mp_limb_signed_t,
480        prec: mp_limb_signed_t,
481        rnd: c_int,
482    ) -> c_int;
483    pub fn arf_si_div(
484        z: arf_ptr,
485        x: mp_limb_signed_t,
486        y: arf_srcptr,
487        prec: mp_limb_signed_t,
488        rnd: c_int,
489    ) -> c_int;
490    pub fn arf_div_fmpz(
491        z: arf_ptr,
492        x: arf_srcptr,
493        y: *const fmpz,
494        prec: mp_limb_signed_t,
495        rnd: c_int,
496    ) -> c_int;
497    pub fn arf_fmpz_div(
498        z: arf_ptr,
499        x: *const fmpz,
500        y: arf_srcptr,
501        prec: mp_limb_signed_t,
502        rnd: c_int,
503    ) -> c_int;
504    pub fn arf_fmpz_div_fmpz(
505        z: arf_ptr,
506        x: *const fmpz,
507        y: *const fmpz,
508        prec: mp_limb_signed_t,
509        rnd: c_int,
510    ) -> c_int;
511    pub fn arf_sqrt(z: arf_ptr, x: arf_srcptr, prec: mp_limb_signed_t, rnd: c_int) -> c_int;
512    pub fn arf_sqrt_ui(
513        z: *mut arf_struct,
514        x: mp_limb_t,
515        prec: mp_limb_signed_t,
516        rnd: c_int,
517    ) -> c_int;
518    pub fn arf_sqrt_fmpz(
519        z: *mut arf_struct,
520        x: *const fmpz,
521        prec: mp_limb_signed_t,
522        rnd: c_int,
523    ) -> c_int;
524    pub fn arf_rsqrt(z: arf_ptr, x: arf_srcptr, prec: mp_limb_signed_t, rnd: c_int) -> c_int;
525    pub fn arf_root(
526        z: *mut arf_struct,
527        x: *const arf_struct,
528        k: mp_limb_t,
529        prec: mp_limb_signed_t,
530        rnd: c_int,
531    ) -> c_int;
532    pub fn arf_get_mag(y: *mut mag_struct, x: *const arf_struct);
533    pub fn arf_get_mag_lower(y: *mut mag_struct, x: *const arf_struct);
534    pub fn arf_set_mag(y: *mut arf_struct, x: *const mag_struct);
535    pub fn mag_init_set_arf(y: *mut mag_struct, x: *const arf_struct);
536    pub fn mag_fast_init_set_arf(y: *mut mag_struct, x: *const arf_struct);
537    pub fn arf_mag_fast_add_ulp(
538        z: *mut mag_struct,
539        x: *const mag_struct,
540        y: *const arf_struct,
541        prec: mp_limb_signed_t,
542    );
543    pub fn arf_mag_add_ulp(
544        z: *mut mag_struct,
545        x: *const mag_struct,
546        y: *const arf_struct,
547        prec: mp_limb_signed_t,
548    );
549    pub fn arf_mag_set_ulp(z: *mut mag_struct, y: *const arf_struct, prec: mp_limb_signed_t);
550    pub fn arf_get_fmpq(y: *mut fmpq, x: *const arf_struct);
551    pub fn arf_set_fmpq(
552        y: *mut arf_struct,
553        x: *const fmpq,
554        prec: mp_limb_signed_t,
555        rnd: c_int,
556    ) -> c_int;
557    pub fn arf_complex_mul(
558        e: *mut arf_struct,
559        f: *mut arf_struct,
560        a: *const arf_struct,
561        b: *const arf_struct,
562        c: *const arf_struct,
563        d: *const arf_struct,
564        prec: mp_limb_signed_t,
565        rnd: c_int,
566    ) -> c_int;
567    pub fn arf_complex_mul_fallback(
568        e: *mut arf_struct,
569        f: *mut arf_struct,
570        a: *const arf_struct,
571        b: *const arf_struct,
572        c: *const arf_struct,
573        d: *const arf_struct,
574        prec: mp_limb_signed_t,
575        rnd: c_int,
576    ) -> c_int;
577    pub fn arf_complex_sqr(
578        e: *mut arf_struct,
579        f: *mut arf_struct,
580        a: *const arf_struct,
581        b: *const arf_struct,
582        prec: mp_limb_signed_t,
583        rnd: c_int,
584    ) -> c_int;
585    pub fn arf_sum(
586        s: *mut arf_struct,
587        terms: arf_srcptr,
588        len: mp_limb_signed_t,
589        prec: mp_limb_signed_t,
590        rnd: c_int,
591    ) -> c_int;
592    pub fn arf_get_d(x: *const arf_struct, rnd: c_int) -> f64;
593    pub fn arf_set_d(x: *mut arf_struct, v: f64);
594    pub fn arf_allocated_bytes(x: *const arf_struct) -> mp_limb_signed_t;
595    pub fn arf_get_str(x: *const arf_struct, n: mp_limb_signed_t) -> *mut c_char;
596    pub fn arf_load_str(res: *mut arf_struct, data: *const c_char) -> c_int;
597    pub fn arf_dump_str(x: *const arf_struct) -> *mut c_char;
598    pub fn arf_load_file(res: *mut arf_struct, stream: *mut FILE) -> c_int;
599    pub fn arf_dump_file(stream: *mut FILE, x: *const arf_struct) -> c_int;
600}
601
602// Manual implementations of macro-defined functions
603
604#[inline]
605pub unsafe fn arf_mul(
606    z: arf_ptr,
607    x: arf_srcptr,
608    y: arf_srcptr,
609    prec: mp_limb_signed_t,
610    rnd: c_int) -> c_int 
611{
612    if rnd == crate::FMPR_RND_DOWN {
613        arf_mul_rnd_down(z, x, y, prec)
614    } else {
615        arf_mul_rnd_any(z, x, y, prec, rnd)
616    } 
617}
618
619#[cfg(test)]
620mod tests {
621    use super::*;
622    use std::mem::MaybeUninit;
623    use libc::c_long;
624    use quickcheck::quickcheck;
625
626    quickcheck! {
627        fn test_arf_mul(x_int: c_int, y_int: c_int) -> bool {
628            let mut x = MaybeUninit::uninit();
629            let mut y = MaybeUninit::uninit();
630            let mut z = MaybeUninit::uninit();
631
632            unsafe {
633                let x_long = x_int as c_long;
634                let y_long = y_int as c_long;
635
636                arf_init_set_si(x.as_mut_ptr(), x_long);
637                arf_init_set_si(y.as_mut_ptr(), y_long);
638                arf_init(z.as_mut_ptr());
639                
640                arf_mul(z.as_mut_ptr(), x.as_ptr(), y.as_ptr(), 130, crate::ARF_RND_NEAR);
641                let res = arf_equal_si(z.as_ptr(), x_long*y_long);
642                
643                arf_clear(x.as_mut_ptr());
644                arf_clear(y.as_mut_ptr());
645                arf_clear(z.as_mut_ptr());
646
647                res != 0
648            }
649        }
650    }
651}