1 // Copyright © 2017–2021 Trevor Spiteri
2 
3 // This program is free software: you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public License
5 // as published by the Free Software Foundation, either version 3 of
6 // the License, or (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful, but
9 // WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License and a copy of the GNU General Public License along with
15 // this program. If not, see <https://www.gnu.org/licenses/>.
16 
17 /*!
18 Function and type bindings for the [MPC] library.
19 
20 # Examples
21 
22 ```rust
23 use core::{f64, mem::MaybeUninit};
24 use gmp_mpfr_sys::{mpc, mpfr};
25 let one_third = 1.0_f64 / 3.0;
26 let neg_inf = f64::NEG_INFINITY;
27 unsafe {
28     let mut c = MaybeUninit::uninit();
29     mpc::init3(c.as_mut_ptr(), 53, 53);
30     let mut c = c.assume_init();
31     let dirs = mpc::set_d_d(&mut c, one_third, neg_inf, mpc::RNDNN);
32     assert_eq!(dirs, 0);
33     let re_ptr = mpc::realref_const(&c);
34     let re = mpfr::get_d(re_ptr, mpfr::rnd_t::RNDN);
35     assert_eq!(re, one_third);
36     let im_ptr = mpc::imagref_const(&c);
37     let im = mpfr::get_d(im_ptr, mpfr::rnd_t::RNDN);
38     assert_eq!(im, neg_inf);
39     mpc::clear(&mut c);
40 }
41 ```
42 
43 [MPC]: http://www.multiprecision.org/mpc/
44 */
45 #![allow(non_camel_case_types, non_snake_case)]
46 
47 use crate::{
48     gmp::{mpf_t, mpq_t, mpz_t, randstate_t},
49     mpfr::{mpfr_t, prec_t, rnd_t as mpfr_rnd_t},
50 };
51 use libc::{c_char, c_int, c_long, c_ulong, intmax_t, uintmax_t, FILE};
52 
53 include!(concat!(env!("OUT_DIR"), "/mpc_h.rs"));
54 
55 #[inline]
INEX_NEG(inex: c_int) -> c_int56 extern "C" fn INEX_NEG(inex: c_int) -> c_int {
57     match inex {
58         2 => -1,
59         0 => 0,
60         _ => 1,
61     }
62 }
63 /// See: [Return Value](../C/MPC/constant.GNU_MPC_Basics.html#return_002dvalue)
64 #[inline]
INEX_RE(inex: c_int) -> c_int65 pub extern "C" fn INEX_RE(inex: c_int) -> c_int {
66     INEX_NEG((inex) & 3)
67 }
68 /// See: [Return Value](../C/MPC/constant.GNU_MPC_Basics.html#return_002dvalue)
69 #[inline]
INEX_IM(inex: c_int) -> c_int70 pub extern "C" fn INEX_IM(inex: c_int) -> c_int {
71     INEX_NEG((inex) >> 2)
72 }
73 /// See: [Return Value](../C/MPC/constant.GNU_MPC_Basics.html#return_002dvalue)
74 #[inline]
INEX1(inex: c_int) -> c_int75 pub extern "C" fn INEX1(inex: c_int) -> c_int {
76     inex & 15
77 }
78 /// See: [Return Value](../C/MPC/constant.GNU_MPC_Basics.html#return_002dvalue)
79 #[inline]
INEX2(inex: c_int) -> c_int80 pub extern "C" fn INEX2(inex: c_int) -> c_int {
81     inex >> 4
82 }
83 
84 /// See: [`mpc_rnd_t`](../C/MPC/constant.GNU_MPC_Basics.html#index-mpc_005frnd_005ft)
85 pub type rnd_t = c_int;
86 
87 const RNDN: c_int = mpfr_rnd_t::RNDN as c_int;
88 const RNDZ: c_int = mpfr_rnd_t::RNDZ as c_int;
89 const RNDU: c_int = mpfr_rnd_t::RNDU as c_int;
90 const RNDD: c_int = mpfr_rnd_t::RNDD as c_int;
91 
92 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
93 pub const RNDNN: c_int = RNDN + (RNDN << 4);
94 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
95 pub const RNDNZ: c_int = RNDN + (RNDZ << 4);
96 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
97 pub const RNDNU: c_int = RNDN + (RNDU << 4);
98 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
99 pub const RNDND: c_int = RNDN + (RNDD << 4);
100 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
101 pub const RNDZN: c_int = RNDZ + (RNDN << 4);
102 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
103 pub const RNDZZ: c_int = RNDZ + (RNDZ << 4);
104 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
105 pub const RNDZU: c_int = RNDZ + (RNDU << 4);
106 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
107 pub const RNDZD: c_int = RNDZ + (RNDD << 4);
108 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
109 pub const RNDUN: c_int = RNDU + (RNDN << 4);
110 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
111 pub const RNDUZ: c_int = RNDU + (RNDZ << 4);
112 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
113 pub const RNDUU: c_int = RNDU + (RNDU << 4);
114 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
115 pub const RNDUD: c_int = RNDU + (RNDD << 4);
116 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
117 pub const RNDDN: c_int = RNDD + (RNDN << 4);
118 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
119 pub const RNDDZ: c_int = RNDD + (RNDZ << 4);
120 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
121 pub const RNDDU: c_int = RNDD + (RNDU << 4);
122 /// See: [Rounding Modes](../C/MPC/constant.GNU_MPC_Basics.html#Rounding-Modes)
123 pub const RNDDD: c_int = RNDD + (RNDD << 4);
124 
125 /// See: [`mpc_t`](../C/MPC/constant.GNU_MPC_Basics.html#index-mpc_005ft)
126 ///
127 /// # Future compatibility
128 ///
129 /// The fields listed here are considered internal details. These
130 /// internals may change in new minor releases of this crate, though
131 /// they will be kept unchanged for patch releases. Any code that
132 /// makes use of these internals should list the dependency as
133 /// `version = "~1.4"` inside [*Cargo.toml*], *not* `version = "1.4"`.
134 ///
135 /// [*Cargo.toml*]: https://doc.rust-lang.org/cargo/guide/dependencies.html
136 #[repr(C)]
137 #[derive(Clone, Copy, Debug)]
138 pub struct mpc_t {
139     /// Internal implementation detail: real part.
140     pub re: mpfr_t,
141     /// Internal implementation detail: imaginary part.
142     pub im: mpfr_t,
143 }
144 
145 // Types for function declarations in this file.
146 
147 type mpz_srcptr = *const mpz_t;
148 type mpq_srcptr = *const mpq_t;
149 type mpf_srcptr = *const mpf_t;
150 type randstate_ptr = *mut randstate_t;
151 type mpfr_srcptr = *const mpfr_t;
152 type mpfr_ptr = *mut mpfr_t;
153 type mpc_ptr = *mut mpc_t;
154 type mpc_srcptr = *const mpc_t;
155 
156 extern "C" {
157     // Initialization Functions
158 
159     /// See: [`mpc_init2`](../C/MPC/constant.Complex_Functions.html#index-mpc_005finit2)
160     #[link_name = "mpc_init2"]
init2(z: mpc_ptr, prec: prec_t)161     pub fn init2(z: mpc_ptr, prec: prec_t);
162     /// See: [`mpc_init3`](../C/MPC/constant.Complex_Functions.html#index-mpc_005finit3)
163     #[link_name = "mpc_init3"]
init3(z: mpc_ptr, prec_r: prec_t, prec_i: prec_t)164     pub fn init3(z: mpc_ptr, prec_r: prec_t, prec_i: prec_t);
165     /// See: [`mpc_clear`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fclear)
166     #[link_name = "mpc_clear"]
clear(z: mpc_ptr)167     pub fn clear(z: mpc_ptr);
168     /// See: [`mpc_set_prec`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fprec)
169     #[link_name = "mpc_set_prec"]
set_prec(x: mpc_ptr, prec: prec_t)170     pub fn set_prec(x: mpc_ptr, prec: prec_t);
171     /// See: [`mpc_get_prec`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fget_005fprec)
172     #[link_name = "mpc_get_prec"]
get_prec(x: mpc_srcptr) -> prec_t173     pub fn get_prec(x: mpc_srcptr) -> prec_t;
174     /// See: [`mpc_get_prec2`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fget_005fprec2)
175     #[link_name = "mpc_get_prec2"]
get_prec2(pr: *mut prec_t, pi: *mut prec_t, x: mpc_srcptr)176     pub fn get_prec2(pr: *mut prec_t, pi: *mut prec_t, x: mpc_srcptr);
177 
178     // Assignment Functions
179 
180     /// See: [`mpc_set`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset)
181     #[link_name = "mpc_set"]
set(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int182     pub fn set(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
183     /// See: [`mpc_set_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fui)
184     #[link_name = "mpc_set_ui"]
set_ui(rop: mpc_ptr, op: c_ulong, rnd: rnd_t) -> c_int185     pub fn set_ui(rop: mpc_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
186     /// See: [`mpc_set_si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fsi)
187     #[link_name = "mpc_set_si"]
set_si(rop: mpc_ptr, op: c_long, rnd: rnd_t) -> c_int188     pub fn set_si(rop: mpc_ptr, op: c_long, rnd: rnd_t) -> c_int;
189     /// See: [`mpc_set_uj`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fuj)
190     #[link_name = "mpc_set_uj"]
set_uj(rop: mpc_ptr, op: uintmax_t, rnd: rnd_t) -> c_int191     pub fn set_uj(rop: mpc_ptr, op: uintmax_t, rnd: rnd_t) -> c_int;
192     /// See: [`mpc_set_sj`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fsj)
193     #[link_name = "mpc_set_sj"]
set_sj(rop: mpc_ptr, op: intmax_t, rnd: rnd_t) -> c_int194     pub fn set_sj(rop: mpc_ptr, op: intmax_t, rnd: rnd_t) -> c_int;
195     /// See: [`mpc_set_d`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fd)
196     #[link_name = "mpc_set_d"]
set_d(rop: mpc_ptr, op: f64, rnd: rnd_t) -> c_int197     pub fn set_d(rop: mpc_ptr, op: f64, rnd: rnd_t) -> c_int;
198     /// See: [`mpc_set_z`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fz)
199     #[link_name = "mpc_set_z"]
set_z(rop: mpc_ptr, op: mpz_srcptr, rnd: rnd_t) -> c_int200     pub fn set_z(rop: mpc_ptr, op: mpz_srcptr, rnd: rnd_t) -> c_int;
201     /// See: [`mpc_set_q`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fq)
202     #[link_name = "mpc_set_q"]
set_q(rop: mpc_ptr, op: mpq_srcptr, rnd: rnd_t) -> c_int203     pub fn set_q(rop: mpc_ptr, op: mpq_srcptr, rnd: rnd_t) -> c_int;
204     /// See: [`mpc_set_f`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005ff)
205     #[link_name = "mpc_set_f"]
set_f(rop: mpc_ptr, op: mpf_srcptr, rnd: rnd_t) -> c_int206     pub fn set_f(rop: mpc_ptr, op: mpf_srcptr, rnd: rnd_t) -> c_int;
207     /// See: [`mpc_set_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005ffr)
208     #[link_name = "mpc_set_fr"]
set_fr(rop: mpc_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int209     pub fn set_fr(rop: mpc_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
210     /// See: [`mpc_set_ui_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fui_005fui)
211     #[link_name = "mpc_set_ui_ui"]
set_ui_ui(rop: mpc_ptr, op1: c_ulong, op2: c_ulong, rnd: rnd_t) -> c_int212     pub fn set_ui_ui(rop: mpc_ptr, op1: c_ulong, op2: c_ulong, rnd: rnd_t) -> c_int;
213     /// See: [`mpc_set_si_si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fsi_005fsi)
214     #[link_name = "mpc_set_si_si"]
set_si_si(rop: mpc_ptr, op1: c_long, op2: c_long, rnd: rnd_t) -> c_int215     pub fn set_si_si(rop: mpc_ptr, op1: c_long, op2: c_long, rnd: rnd_t) -> c_int;
216     /// See: [`mpc_set_uj_uj`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fuj_005fuj)
217     #[link_name = "mpc_set_uj_uj"]
set_uj_uj(rop: mpc_ptr, op1: uintmax_t, op2: uintmax_t, rnd: rnd_t) -> c_int218     pub fn set_uj_uj(rop: mpc_ptr, op1: uintmax_t, op2: uintmax_t, rnd: rnd_t) -> c_int;
219     /// See: [`mpc_set_sj_sj`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fsj_005fsj)
220     #[link_name = "mpc_set_sj_sj"]
set_sj_sj(rop: mpc_ptr, op1: intmax_t, op2: intmax_t, rnd: rnd_t) -> c_int221     pub fn set_sj_sj(rop: mpc_ptr, op1: intmax_t, op2: intmax_t, rnd: rnd_t) -> c_int;
222     /// See: [`mpc_set_d_d`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fd_005fd)
223     #[link_name = "mpc_set_d_d"]
set_d_d(rop: mpc_ptr, op1: f64, op2: f64, rnd: rnd_t) -> c_int224     pub fn set_d_d(rop: mpc_ptr, op1: f64, op2: f64, rnd: rnd_t) -> c_int;
225     /// See: [`mpc_set_z_z`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fz_005fz)
226     #[link_name = "mpc_set_z_z"]
set_z_z(rop: mpc_ptr, op1: mpz_srcptr, op2: mpz_srcptr, rnd: rnd_t) -> c_int227     pub fn set_z_z(rop: mpc_ptr, op1: mpz_srcptr, op2: mpz_srcptr, rnd: rnd_t) -> c_int;
228     /// See: [`mpc_set_q_q`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fq_005fq)
229     #[link_name = "mpc_set_q_q"]
set_q_q(rop: mpc_ptr, op1: mpq_srcptr, op2: mpq_srcptr, rnd: rnd_t) -> c_int230     pub fn set_q_q(rop: mpc_ptr, op1: mpq_srcptr, op2: mpq_srcptr, rnd: rnd_t) -> c_int;
231     /// See: [`mpc_set_f_f`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005ff_005ff)
232     #[link_name = "mpc_set_f_f"]
set_f_f(rop: mpc_ptr, op1: mpf_srcptr, op2: mpf_srcptr, rnd: rnd_t) -> c_int233     pub fn set_f_f(rop: mpc_ptr, op1: mpf_srcptr, op2: mpf_srcptr, rnd: rnd_t) -> c_int;
234     /// See: [`mpc_set_fr_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005ffr_005ffr)
235     #[link_name = "mpc_set_fr_fr"]
set_fr_fr(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int236     pub fn set_fr_fr(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
237     /// See: [`mpc_set_nan`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fnan)
238     #[link_name = "mpc_set_nan"]
set_nan(rop: mpc_ptr)239     pub fn set_nan(rop: mpc_ptr);
240     /// See: [`mpc_swap`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fswap)
241     #[link_name = "mpc_swap"]
swap(op1: mpc_ptr, op2: mpc_ptr)242     pub fn swap(op1: mpc_ptr, op2: mpc_ptr);
243 
244     // String and Stream Input and Output
245 
246     /// See: [`mpc_strtoc`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fstrtoc)
247     #[link_name = "mpc_strtoc"]
strtoc( rop: mpc_ptr, nptr: *const c_char, endptr: *mut *mut c_char, base: c_int, rnd: rnd_t, ) -> c_int248     pub fn strtoc(
249         rop: mpc_ptr,
250         nptr: *const c_char,
251         endptr: *mut *mut c_char,
252         base: c_int,
253         rnd: rnd_t,
254     ) -> c_int;
255     /// See: [`mpc_set_str`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fset_005fstr)
256     #[link_name = "mpc_set_str"]
set_str(rop: mpc_ptr, s: *const c_char, base: c_int, rnd: rnd_t) -> c_int257     pub fn set_str(rop: mpc_ptr, s: *const c_char, base: c_int, rnd: rnd_t) -> c_int;
258     /// See: [`mpc_get_str`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fget_005fstr)
259     #[link_name = "mpc_get_str"]
get_str(b: c_int, n: usize, op: mpc_srcptr, rnd: rnd_t) -> *mut c_char260     pub fn get_str(b: c_int, n: usize, op: mpc_srcptr, rnd: rnd_t) -> *mut c_char;
261     /// See: [`mpc_free_str`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ffree_005fstr)
262     #[link_name = "mpc_free_str"]
free_str(rop: *mut c_char)263     pub fn free_str(rop: *mut c_char);
264     /// See: [`mpc_inp_str`](../C/MPC/constant.Complex_Functions.html#index-mpc_005finp_005fstr)
265     #[link_name = "mpc_inp_str"]
inp_str( rop: mpc_ptr, stream: *mut FILE, read: *mut usize, base: c_int, rnd: rnd_t, ) -> c_int266     pub fn inp_str(
267         rop: mpc_ptr,
268         stream: *mut FILE,
269         read: *mut usize,
270         base: c_int,
271         rnd: rnd_t,
272     ) -> c_int;
273     /// See: [`mpc_out_str`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fout_005fstr)
274     #[link_name = "mpc_out_str"]
out_str( stream: *mut FILE, base: c_int, n_digits: usize, op: mpc_srcptr, rnd: rnd_t, ) -> usize275     pub fn out_str(
276         stream: *mut FILE,
277         base: c_int,
278         n_digits: usize,
279         op: mpc_srcptr,
280         rnd: rnd_t,
281     ) -> usize;
282 
283     // Comparison Functions
284 
285     /// See: [`mpc_cmp`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fcmp)
286     #[link_name = "mpc_cmp"]
cmp(op1: mpc_srcptr, op2: mpc_srcptr) -> c_int287     pub fn cmp(op1: mpc_srcptr, op2: mpc_srcptr) -> c_int;
288     /// See: [`mpc_cmp_si_si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fcmp_005fsi_005fsi)
289     #[link_name = "mpc_cmp_si_si"]
cmp_si_si(op1: mpc_srcptr, op2r: c_long, op2i: c_long) -> c_int290     pub fn cmp_si_si(op1: mpc_srcptr, op2r: c_long, op2i: c_long) -> c_int;
291 }
292 /// See: [`mpc_cmp_si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fcmp_005fsi)
293 #[inline]
cmp_si(op1: mpc_srcptr, op2: c_long) -> c_int294 pub unsafe extern "C" fn cmp_si(op1: mpc_srcptr, op2: c_long) -> c_int {
295     unsafe { cmp_si_si(op1, op2, 0) }
296 }
297 extern "C" {
298     /// See: [`mpc_cmp_abs`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fcmp_005fabs)
299     #[link_name = "mpc_cmp_abs"]
cmp_abs(op1: mpc_srcptr, op2: mpc_srcptr) -> c_int300     pub fn cmp_abs(op1: mpc_srcptr, op2: mpc_srcptr) -> c_int;
301 
302     // Projection and Decomposing Functions
303     /// See: [`mpc_real`](../C/MPC/constant.Complex_Functions.html#index-mpc_005freal)
304     #[link_name = "mpc_real"]
real(rop: mpfr_ptr, arg2: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int305     pub fn real(rop: mpfr_ptr, arg2: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
306     /// See: [`mpc_imag`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fimag)
307     #[link_name = "mpc_imag"]
imag(rop: mpfr_ptr, arg2: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int308     pub fn imag(rop: mpfr_ptr, arg2: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
309 }
310 /// See: [`mpc_realref`](../C/MPC/constant.Complex_Functions.html#index-mpc_005frealref)
311 #[inline]
realref(op: mpc_ptr) -> mpfr_ptr312 pub unsafe extern "C" fn realref(op: mpc_ptr) -> mpfr_ptr {
313     op as mpfr_ptr
314 }
315 /// Constant version of [`realref`](fn.realref.html).
316 #[inline]
realref_const(op: mpc_srcptr) -> mpfr_srcptr317 pub unsafe extern "C" fn realref_const(op: mpc_srcptr) -> mpfr_srcptr {
318     op as mpfr_srcptr
319 }
320 /// See: [`mpc_imagref`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fimagref)
321 #[inline]
imagref(op: mpc_ptr) -> mpfr_ptr322 pub unsafe extern "C" fn imagref(op: mpc_ptr) -> mpfr_ptr {
323     unsafe { (op as mpfr_ptr).offset(1) }
324 }
325 /// Constant version of [`imagref`](fn.imagref.html).
326 #[inline]
imagref_const(op: mpc_srcptr) -> mpfr_srcptr327 pub unsafe extern "C" fn imagref_const(op: mpc_srcptr) -> mpfr_srcptr {
328     unsafe { (op as mpfr_srcptr).offset(1) }
329 }
330 extern "C" {
331     /// See: [`mpc_arg`](../C/MPC/constant.Complex_Functions.html#index-mpc_005farg)
332     #[link_name = "mpc_arg"]
arg(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int333     pub fn arg(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
334     /// See: [`mpc_proj`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fproj)
335     #[link_name = "mpc_proj"]
proj(rop: mpc_ptr, arg2: mpc_srcptr, rnd: rnd_t) -> c_int336     pub fn proj(rop: mpc_ptr, arg2: mpc_srcptr, rnd: rnd_t) -> c_int;
337 
338     // Basic Arithmetic Functions
339 
340     /// See: [`mpc_add`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fadd)
341     #[link_name = "mpc_add"]
add(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int342     pub fn add(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
343     /// See: [`mpc_add_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fadd_005fui)
344     #[link_name = "mpc_add_ui"]
add_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int345     pub fn add_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
346     /// See: [`mpc_add_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fadd_005ffr)
347     #[link_name = "mpc_add_fr"]
add_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int348     pub fn add_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
349     /// See: [`mpc_fr_sub`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ffr_005fsub)
350     #[link_name = "mpc_sub"]
sub(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int351     pub fn sub(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
352     /// See: [`mpc_sub_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsub_005ffr)
353     #[link_name = "mpc_sub_fr"]
sub_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int354     pub fn sub_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
355     /// See: [`mpc_fr_sub`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ffr_005fsub)
356     #[link_name = "mpc_fr_sub"]
fr_sub(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int357     pub fn fr_sub(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
358     /// See: [`mpc_sub_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsub_005fui)
359     #[link_name = "mpc_sub_ui"]
sub_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int360     pub fn sub_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
361 }
362 /// See: [`mpc_ui_sub`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fui_005fsub)
363 #[inline]
ui_sub(rop: mpc_ptr, op1: c_ulong, op2: mpc_srcptr, rnd: rnd_t) -> c_int364 pub unsafe extern "C" fn ui_sub(rop: mpc_ptr, op1: c_ulong, op2: mpc_srcptr, rnd: rnd_t) -> c_int {
365     unsafe { ui_ui_sub(rop, op1, 0, op2, rnd) }
366 }
367 extern "C" {
368     /// See: [`mpc_ui_ui_sub`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fui_005fui_005fsub)
369     #[link_name = "mpc_ui_ui_sub"]
ui_ui_sub( rop: mpc_ptr, re1: c_ulong, im1: c_ulong, op2: mpc_srcptr, rnd: rnd_t, ) -> c_int370     pub fn ui_ui_sub(
371         rop: mpc_ptr,
372         re1: c_ulong,
373         im1: c_ulong,
374         op2: mpc_srcptr,
375         rnd: rnd_t,
376     ) -> c_int;
377     /// See: [`mpc_neg`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fneg)
378     #[link_name = "mpc_neg"]
neg(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int379     pub fn neg(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
380     /// See: [`mpc_sum`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsum)
381     #[link_name = "mpc_sum"]
sum(rop: mpc_ptr, op: *const mpc_ptr, n: c_ulong, rnd: rnd_t) -> c_int382     pub fn sum(rop: mpc_ptr, op: *const mpc_ptr, n: c_ulong, rnd: rnd_t) -> c_int;
383     /// See: [`mpc_mul`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul)
384     #[link_name = "mpc_mul"]
mul(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int385     pub fn mul(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
386     /// See: [`mpc_mul_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul_005fui)
387     #[link_name = "mpc_mul_ui"]
mul_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int388     pub fn mul_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
389     /// See: [`mpc_mul_si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul_005fsi)
390     #[link_name = "mpc_mul_si"]
mul_si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int391     pub fn mul_si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
392     /// See: [`mpc_mul_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul_005ffr)
393     #[link_name = "mpc_mul_fr"]
mul_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int394     pub fn mul_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
395     /// See: [`mpc_mul_i`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul_005fi)
396     #[link_name = "mpc_mul_i"]
mul_i(rop: mpc_ptr, op: mpc_srcptr, sgn: c_int, rnd: rnd_t) -> c_int397     pub fn mul_i(rop: mpc_ptr, op: mpc_srcptr, sgn: c_int, rnd: rnd_t) -> c_int;
398     /// See: [`mpc_sqr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsqr)
399     #[link_name = "mpc_sqr"]
sqr(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int400     pub fn sqr(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
401     /// See: [`mpc_fma`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ffma)
402     #[link_name = "mpc_fma"]
fma( rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, op3: mpc_srcptr, rnd: rnd_t, ) -> c_int403     pub fn fma(
404         rop: mpc_ptr,
405         op1: mpc_srcptr,
406         op2: mpc_srcptr,
407         op3: mpc_srcptr,
408         rnd: rnd_t,
409     ) -> c_int;
410     /// See: [`mpc_dot`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fdot)
411     #[link_name = "mpc_dot"]
dot( rop: mpc_ptr, op1: *const mpc_ptr, op2: *const mpc_ptr, n: c_ulong, rnd: rnd_t, ) -> c_int412     pub fn dot(
413         rop: mpc_ptr,
414         op1: *const mpc_ptr,
415         op2: *const mpc_ptr,
416         n: c_ulong,
417         rnd: rnd_t,
418     ) -> c_int;
419     /// See: [`mpc_div`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fdiv)
420     #[link_name = "mpc_div"]
div(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int421     pub fn div(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
422     /// See: [`mpc_div_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fdiv_005fui)
423     #[link_name = "mpc_div_ui"]
div_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int424     pub fn div_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
425     /// See: [`mpc_div_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fdiv_005ffr)
426     #[link_name = "mpc_div_fr"]
div_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int427     pub fn div_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
428     /// See: [`mpc_ui_div`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fui_005fdiv)
429     #[link_name = "mpc_ui_div"]
ui_div(rop: mpc_ptr, op1: c_ulong, op2: mpc_srcptr, rnd: rnd_t) -> c_int430     pub fn ui_div(rop: mpc_ptr, op1: c_ulong, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
431     /// See: [`mpc_fr_div`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ffr_005fdiv)
432     #[link_name = "mpc_fr_div"]
fr_div(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int433     pub fn fr_div(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
434     /// See: [`mpc_conj`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fconj)
435     #[link_name = "mpc_conj"]
conj(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int436     pub fn conj(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
437     /// See: [`mpc_abs`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fabs)
438     #[link_name = "mpc_abs"]
abs(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int439     pub fn abs(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
440     /// See: [`mpc_norm`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fnorm)
441     #[link_name = "mpc_norm"]
norm(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int442     pub fn norm(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
443     /// See: [`mpc_mul_2ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul_005f2ui)
444     #[link_name = "mpc_mul_2ui"]
mul_2ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int445     pub fn mul_2ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
446     /// See: [`mpc_mul_2si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fmul_005f2si)
447     #[link_name = "mpc_mul_2si"]
mul_2si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int448     pub fn mul_2si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
449     /// See: [`mpc_div_2ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fdiv_005f2ui)
450     #[link_name = "mpc_div_2ui"]
div_2ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int451     pub fn div_2ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
452     /// See: [`mpc_div_2si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fdiv_005f2si)
453     #[link_name = "mpc_div_2si"]
div_2si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int454     pub fn div_2si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
455 
456     // Power Functions and Logarithms
457 
458     /// See: [`mpc_sqrt`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsqrt)
459     #[link_name = "mpc_sqrt"]
sqrt(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int460     pub fn sqrt(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
461     /// See: [`mpc_pow`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fpow)
462     #[link_name = "mpc_pow"]
pow(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int463     pub fn pow(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
464     /// See: [`mpc_pow_d`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fpow_005fd)
465     #[link_name = "mpc_pow_d"]
pow_d(rop: mpc_ptr, op1: mpc_srcptr, op2: f64, rnd: rnd_t) -> c_int466     pub fn pow_d(rop: mpc_ptr, op1: mpc_srcptr, op2: f64, rnd: rnd_t) -> c_int;
467     /// See: [`mpc_pow_si`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fpow_005fsi)
468     #[link_name = "mpc_pow_si"]
pow_si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int469     pub fn pow_si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
470     /// See: [`mpc_pow_ui`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fpow_005fui)
471     #[link_name = "mpc_pow_ui"]
pow_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int472     pub fn pow_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
473     /// See: [`mpc_pow_z`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fpow_005fz)
474     #[link_name = "mpc_pow_z"]
pow_z(rop: mpc_ptr, op1: mpc_srcptr, op2: mpz_srcptr, rnd: rnd_t) -> c_int475     pub fn pow_z(rop: mpc_ptr, op1: mpc_srcptr, op2: mpz_srcptr, rnd: rnd_t) -> c_int;
476     /// See: [`mpc_pow_fr`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fpow_005ffr)
477     #[link_name = "mpc_pow_fr"]
pow_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int478     pub fn pow_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
479     /// See: [`mpc_exp`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fexp)
480     #[link_name = "mpc_exp"]
exp(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int481     pub fn exp(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
482     /// See: [`mpc_log`](../C/MPC/constant.Complex_Functions.html#index-mpc_005flog)
483     #[link_name = "mpc_log"]
log(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int484     pub fn log(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
485     /// See: [`mpc_log10`](../C/MPC/constant.Complex_Functions.html#index-mpc_005flog10)
486     #[link_name = "mpc_log10"]
log10(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int487     pub fn log10(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
488     /// See: [`mpc_rootofunity`](../C/MPC/constant.Complex_Functions.html#index-mpc_005frootofunity)
489     #[link_name = "mpc_rootofunity"]
rootofunity(rop: mpc_ptr, n: c_ulong, k: c_ulong, rnd: rnd_t) -> c_int490     pub fn rootofunity(rop: mpc_ptr, n: c_ulong, k: c_ulong, rnd: rnd_t) -> c_int;
491 
492     // Trigonometric Functions
493 
494     /// See: [`mpc_sin`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsin)
495     #[link_name = "mpc_sin"]
sin(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int496     pub fn sin(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
497     /// See: [`mpc_cos`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fcos)
498     #[link_name = "mpc_cos"]
cos(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int499     pub fn cos(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
500     /// See: [`mpc_sin_cos`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsin_005fcos)
501     #[link_name = "mpc_sin_cos"]
sin_cos( rop_sin: mpc_ptr, rop_cos: mpc_ptr, op: mpc_srcptr, rnd_sin: rnd_t, rnd_cos: rnd_t, ) -> c_int502     pub fn sin_cos(
503         rop_sin: mpc_ptr,
504         rop_cos: mpc_ptr,
505         op: mpc_srcptr,
506         rnd_sin: rnd_t,
507         rnd_cos: rnd_t,
508     ) -> c_int;
509     /// See: [`mpc_tan`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ftan)
510     #[link_name = "mpc_tan"]
tan(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int511     pub fn tan(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
512     /// See: [`mpc_sinh`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fsinh)
513     #[link_name = "mpc_sinh"]
sinh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int514     pub fn sinh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
515     /// See: [`mpc_cosh`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fcosh)
516     #[link_name = "mpc_cosh"]
cosh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int517     pub fn cosh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
518     /// See: [`mpc_tanh`](../C/MPC/constant.Complex_Functions.html#index-mpc_005ftanh)
519     #[link_name = "mpc_tanh"]
tanh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int520     pub fn tanh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
521     /// See: [`mpc_asin`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fasin)
522     #[link_name = "mpc_asin"]
asin(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int523     pub fn asin(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
524     /// See: [`mpc_acos`](../C/MPC/constant.Complex_Functions.html#index-mpc_005facos)
525     #[link_name = "mpc_acos"]
acos(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int526     pub fn acos(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
527     /// See: [`mpc_atan`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fatan)
528     #[link_name = "mpc_atan"]
atan(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int529     pub fn atan(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
530     /// See: [`mpc_asinh`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fasinh)
531     #[link_name = "mpc_asinh"]
asinh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int532     pub fn asinh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
533     /// See: [`mpc_acosh`](../C/MPC/constant.Complex_Functions.html#index-mpc_005facosh)
534     #[link_name = "mpc_acosh"]
acosh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int535     pub fn acosh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
536     /// See: [`mpc_atanh`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fatanh)
537     #[link_name = "mpc_atanh"]
atanh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int538     pub fn atanh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
539 
540     // Miscellaneous Functions
541 
542     /// See: [`mpc_urandom`](../C/MPC/constant.Complex_Functions.html#index-mpc_005furandom)
543     #[link_name = "mpc_urandom"]
urandom(rop: mpc_ptr, state: randstate_ptr) -> c_int544     pub fn urandom(rop: mpc_ptr, state: randstate_ptr) -> c_int;
545     /// See: [`mpc_get_version`](../C/MPC/constant.Complex_Functions.html#index-mpc_005fget_005fversion)
546     #[link_name = "mpc_get_version"]
get_version() -> *const c_char547     pub fn get_version() -> *const c_char;
548 }
549 /// See: [`MPC_VERSION`](../C/MPC/constant.Complex_Functions.html#index-MPC_005fVERSION)
550 pub const VERSION: c_int = (VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | VERSION_PATCHLEVEL;
551 /// See: [`MPC_VERSION_MAJOR`](../C/MPC/constant.Complex_Functions.html#index-MPC_005fVERSION_005fMAJOR)
552 pub const VERSION_MAJOR: c_int = MPC_VERSION_MAJOR;
553 /// See: [`MPC_VERSION_MINOR`](../C/MPC/constant.Complex_Functions.html#index-MPC_005fVERSION_005fMINOR)
554 pub const VERSION_MINOR: c_int = MPC_VERSION_MINOR;
555 /// See: [`MPC_VERSION_PATCHLEVEL`](../C/MPC/constant.Complex_Functions.html#index-MPC_005fVERSION_005fPATCHLEVEL)
556 pub const VERSION_PATCHLEVEL: c_int = MPC_VERSION_PATCHLEVEL;
557 /// See: [`MPC_VERSION_STRING`](../C/MPC/constant.Complex_Functions.html#index-MPC_005fVERSION_005fSTRING)
558 pub const VERSION_STRING: *const c_char = MPC_VERSION_STRING;
559 /// See: [`MPC_VERSION_NUM`](../C/MPC/constant.Complex_Functions.html#index-MPC_005fVERSION_005fNUM)
560 #[inline]
VERSION_NUM(major: c_int, minor: c_int, patchlevel: c_int) -> c_int561 pub extern "C" fn VERSION_NUM(major: c_int, minor: c_int, patchlevel: c_int) -> c_int {
562     (major << 16) | (minor << 8) | patchlevel
563 }
564 
565 #[cfg(test)]
566 mod tests {
567     use crate::{gmp, mpc, mpfr};
568     use core::ptr::NonNull;
569 
570     #[test]
check_real_imag_offsets()571     fn check_real_imag_offsets() {
572         let mut limbs: [gmp::limb_t; 2] = [1 << (gmp::LIMB_BITS - 1), 1 << (gmp::LIMB_BITS - 1)];
573         let mut c = mpc::mpc_t {
574             re: mpfr::mpfr_t {
575                 prec: 1,
576                 sign: 1,
577                 exp: 0,
578                 d: NonNull::from(&mut limbs[0]),
579             },
580             im: mpfr::mpfr_t {
581                 prec: 1,
582                 sign: 1,
583                 exp: 0,
584                 d: NonNull::from(&mut limbs[1]),
585             },
586         };
587         unsafe {
588             assert_eq!(&c.re as *const mpfr::mpfr_t, mpc::realref_const(&c));
589             assert_eq!(&c.im as *const mpfr::mpfr_t, mpc::imagref_const(&c));
590             assert_eq!(&mut c.re as *mut mpfr::mpfr_t, mpc::realref(&mut c));
591             assert_eq!(&mut c.im as *mut mpfr::mpfr_t, mpc::imagref(&mut c));
592         }
593     }
594 
595     #[test]
check_version()596     fn check_version() {
597         use crate::tests;
598 
599         let (major, minor, patchlevel) = (1, 2, 1);
600         let version = "1.2.1";
601 
602         assert_eq!(mpc::VERSION_MAJOR, major);
603         assert!(mpc::VERSION_MINOR >= minor);
604         if cfg!(not(feature = "use-system-libs")) {
605             assert!(mpc::VERSION_MINOR > minor || mpc::VERSION_PATCHLEVEL >= patchlevel);
606             if mpc::VERSION_MINOR == minor && mpc::VERSION_PATCHLEVEL == patchlevel {
607                 assert_eq!(unsafe { tests::str_from_cstr(mpc::get_version()) }, version);
608                 assert_eq!(
609                     unsafe { tests::str_from_cstr(mpc::VERSION_STRING) },
610                     version
611                 );
612             }
613         }
614     }
615 }
616