#![allow(non_camel_case_types, non_snake_case)]
use crate::{
gmp::{mpf_t, mpq_t, mpz_t, randstate_t},
mpfr::{mpfr_t, prec_t, rnd_t as mpfr_rnd_t},
};
use libc::{c_char, c_int, c_long, c_ulong, intmax_t, uintmax_t, FILE};
include!(concat!(env!("OUT_DIR"), "/mpc_h.rs"));
#[inline]
extern "C" fn INEX_NEG(inex: c_int) -> c_int {
match inex {
2 => -1,
0 => 0,
_ => 1,
}
}
#[inline]
pub extern "C" fn INEX_RE(inex: c_int) -> c_int {
INEX_NEG((inex) & 3)
}
#[inline]
pub extern "C" fn INEX_IM(inex: c_int) -> c_int {
INEX_NEG((inex) >> 2)
}
#[inline]
pub extern "C" fn INEX1(inex: c_int) -> c_int {
inex & 15
}
#[inline]
pub extern "C" fn INEX2(inex: c_int) -> c_int {
inex >> 4
}
pub type rnd_t = c_int;
const RNDN: c_int = mpfr_rnd_t::RNDN as c_int;
const RNDZ: c_int = mpfr_rnd_t::RNDZ as c_int;
const RNDU: c_int = mpfr_rnd_t::RNDU as c_int;
const RNDD: c_int = mpfr_rnd_t::RNDD as c_int;
pub const RNDNN: c_int = RNDN + (RNDN << 4);
pub const RNDNZ: c_int = RNDN + (RNDZ << 4);
pub const RNDNU: c_int = RNDN + (RNDU << 4);
pub const RNDND: c_int = RNDN + (RNDD << 4);
pub const RNDZN: c_int = RNDZ + (RNDN << 4);
pub const RNDZZ: c_int = RNDZ + (RNDZ << 4);
pub const RNDZU: c_int = RNDZ + (RNDU << 4);
pub const RNDZD: c_int = RNDZ + (RNDD << 4);
pub const RNDUN: c_int = RNDU + (RNDN << 4);
pub const RNDUZ: c_int = RNDU + (RNDZ << 4);
pub const RNDUU: c_int = RNDU + (RNDU << 4);
pub const RNDUD: c_int = RNDU + (RNDD << 4);
pub const RNDDN: c_int = RNDD + (RNDN << 4);
pub const RNDDZ: c_int = RNDD + (RNDZ << 4);
pub const RNDDU: c_int = RNDD + (RNDU << 4);
pub const RNDDD: c_int = RNDD + (RNDD << 4);
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct mpc_t {
pub re: mpfr_t,
pub im: mpfr_t,
}
type mpz_srcptr = *const mpz_t;
type mpq_srcptr = *const mpq_t;
type mpf_srcptr = *const mpf_t;
type randstate_ptr = *mut randstate_t;
type mpfr_srcptr = *const mpfr_t;
type mpfr_ptr = *mut mpfr_t;
type mpc_ptr = *mut mpc_t;
type mpc_srcptr = *const mpc_t;
extern "C" {
#[link_name = "mpc_init2"]
pub fn init2(z: mpc_ptr, prec: prec_t);
#[link_name = "mpc_init3"]
pub fn init3(z: mpc_ptr, prec_r: prec_t, prec_i: prec_t);
#[link_name = "mpc_clear"]
pub fn clear(z: mpc_ptr);
#[link_name = "mpc_set_prec"]
pub fn set_prec(x: mpc_ptr, prec: prec_t);
#[link_name = "mpc_get_prec"]
pub fn get_prec(x: mpc_srcptr) -> prec_t;
#[link_name = "mpc_get_prec2"]
pub fn get_prec2(pr: *mut prec_t, pi: *mut prec_t, x: mpc_srcptr);
#[link_name = "mpc_set"]
pub fn set(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_ui"]
pub fn set_ui(rop: mpc_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_si"]
pub fn set_si(rop: mpc_ptr, op: c_long, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_uj"]
pub fn set_uj(rop: mpc_ptr, op: uintmax_t, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_sj"]
pub fn set_sj(rop: mpc_ptr, op: intmax_t, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_d"]
pub fn set_d(rop: mpc_ptr, op: f64, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_z"]
pub fn set_z(rop: mpc_ptr, op: mpz_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_q"]
pub fn set_q(rop: mpc_ptr, op: mpq_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_f"]
pub fn set_f(rop: mpc_ptr, op: mpf_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_fr"]
pub fn set_fr(rop: mpc_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_ui_ui"]
pub fn set_ui_ui(rop: mpc_ptr, op1: c_ulong, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_si_si"]
pub fn set_si_si(rop: mpc_ptr, op1: c_long, op2: c_long, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_uj_uj"]
pub fn set_uj_uj(rop: mpc_ptr, op1: uintmax_t, op2: uintmax_t, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_sj_sj"]
pub fn set_sj_sj(rop: mpc_ptr, op1: intmax_t, op2: intmax_t, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_d_d"]
pub fn set_d_d(rop: mpc_ptr, op1: f64, op2: f64, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_z_z"]
pub fn set_z_z(rop: mpc_ptr, op1: mpz_srcptr, op2: mpz_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_q_q"]
pub fn set_q_q(rop: mpc_ptr, op1: mpq_srcptr, op2: mpq_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_f_f"]
pub fn set_f_f(rop: mpc_ptr, op1: mpf_srcptr, op2: mpf_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_fr_fr"]
pub fn set_fr_fr(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_set_nan"]
pub fn set_nan(rop: mpc_ptr);
#[link_name = "mpc_swap"]
pub fn swap(op1: mpc_ptr, op2: mpc_ptr);
#[link_name = "mpc_strtoc"]
pub fn strtoc(
rop: mpc_ptr,
nptr: *const c_char,
endptr: *mut *mut c_char,
base: c_int,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpc_set_str"]
pub fn set_str(rop: mpc_ptr, s: *const c_char, base: c_int, rnd: rnd_t) -> c_int;
#[link_name = "mpc_get_str"]
pub fn get_str(b: c_int, n: usize, op: mpc_srcptr, rnd: rnd_t) -> *mut c_char;
#[link_name = "mpc_free_str"]
pub fn free_str(rop: *mut c_char);
#[link_name = "mpc_inp_str"]
pub fn inp_str(
rop: mpc_ptr,
stream: *mut FILE,
read: *mut usize,
base: c_int,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpc_out_str"]
pub fn out_str(
stream: *mut FILE,
base: c_int,
n_digits: usize,
op: mpc_srcptr,
rnd: rnd_t,
) -> usize;
#[link_name = "mpc_cmp"]
pub fn cmp(op1: mpc_srcptr, op2: mpc_srcptr) -> c_int;
#[link_name = "mpc_cmp_si_si"]
pub fn cmp_si_si(op1: mpc_srcptr, op2r: c_long, op2i: c_long) -> c_int;
}
#[inline]
pub unsafe extern "C" fn cmp_si(op1: mpc_srcptr, op2: c_long) -> c_int {
cmp_si_si(op1, op2, 0)
}
extern "C" {
#[link_name = "mpc_cmp_abs"]
pub fn cmp_abs(op1: mpc_srcptr, op2: mpc_srcptr) -> c_int;
#[link_name = "mpc_real"]
pub fn real(rop: mpfr_ptr, arg2: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
#[link_name = "mpc_imag"]
pub fn imag(rop: mpfr_ptr, arg2: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
}
#[inline]
pub unsafe extern "C" fn realref(op: mpc_ptr) -> mpfr_ptr {
op as mpfr_ptr
}
#[inline]
pub unsafe extern "C" fn realref_const(op: mpc_srcptr) -> mpfr_srcptr {
op as mpfr_srcptr
}
#[inline]
pub unsafe extern "C" fn imagref(op: mpc_ptr) -> mpfr_ptr {
(op as mpfr_ptr).offset(1)
}
#[inline]
pub unsafe extern "C" fn imagref_const(op: mpc_srcptr) -> mpfr_srcptr {
(op as mpfr_srcptr).offset(1)
}
extern "C" {
#[link_name = "mpc_arg"]
pub fn arg(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
#[link_name = "mpc_proj"]
pub fn proj(rop: mpc_ptr, arg2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_add"]
pub fn add(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_add_ui"]
pub fn add_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_add_fr"]
pub fn add_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sub"]
pub fn sub(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sub_fr"]
pub fn sub_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_fr_sub"]
pub fn fr_sub(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sub_ui"]
pub fn sub_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
}
#[inline]
pub unsafe extern "C" fn ui_sub(rop: mpc_ptr, op1: c_ulong, op2: mpc_srcptr, rnd: rnd_t) -> c_int {
ui_ui_sub(rop, op1, 0, op2, rnd)
}
extern "C" {
#[link_name = "mpc_ui_ui_sub"]
pub fn ui_ui_sub(
rop: mpc_ptr,
re1: c_ulong,
im1: c_ulong,
op2: mpc_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpc_neg"]
pub fn neg(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_mul"]
pub fn mul(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_mul_ui"]
pub fn mul_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_mul_si"]
pub fn mul_si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
#[link_name = "mpc_mul_fr"]
pub fn mul_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_mul_i"]
pub fn mul_i(rop: mpc_ptr, op: mpc_srcptr, sgn: c_int, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sqr"]
pub fn sqr(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_fma"]
pub fn fma(
rop: mpc_ptr,
op1: mpc_srcptr,
op2: mpc_srcptr,
op3: mpc_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpc_div"]
pub fn div(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_div_ui"]
pub fn div_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_div_fr"]
pub fn div_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_ui_div"]
pub fn ui_div(rop: mpc_ptr, op1: c_ulong, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_fr_div"]
pub fn fr_div(rop: mpc_ptr, op1: mpfr_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_conj"]
pub fn conj(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_abs"]
pub fn abs(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
#[link_name = "mpc_norm"]
pub fn norm(rop: mpfr_ptr, op: mpc_srcptr, rnd: mpfr_rnd_t) -> c_int;
#[link_name = "mpc_mul_2ui"]
pub fn mul_2ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_mul_2si"]
pub fn mul_2si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
#[link_name = "mpc_div_2ui"]
pub fn div_2ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_div_2si"]
pub fn div_2si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sqrt"]
pub fn sqrt(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_pow"]
pub fn pow(rop: mpc_ptr, op1: mpc_srcptr, op2: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_pow_d"]
pub fn pow_d(rop: mpc_ptr, op1: mpc_srcptr, op2: f64, rnd: rnd_t) -> c_int;
#[link_name = "mpc_pow_si"]
pub fn pow_si(rop: mpc_ptr, op1: mpc_srcptr, op2: c_long, rnd: rnd_t) -> c_int;
#[link_name = "mpc_pow_ui"]
pub fn pow_ui(rop: mpc_ptr, op1: mpc_srcptr, op2: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_pow_z"]
pub fn pow_z(rop: mpc_ptr, op1: mpc_srcptr, op2: mpz_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_pow_fr"]
pub fn pow_fr(rop: mpc_ptr, op1: mpc_srcptr, op2: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_exp"]
pub fn exp(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_log"]
pub fn log(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_log10"]
pub fn log10(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_rootofunity"]
pub fn rootofunity(rop: mpc_ptr, n: c_ulong, k: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sin"]
pub fn sin(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_cos"]
pub fn cos(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sin_cos"]
pub fn sin_cos(
rop_sin: mpc_ptr,
rop_cos: mpc_ptr,
op: mpc_srcptr,
rnd_sin: rnd_t,
rnd_cos: rnd_t,
) -> c_int;
#[link_name = "mpc_tan"]
pub fn tan(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_sinh"]
pub fn sinh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_cosh"]
pub fn cosh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_tanh"]
pub fn tanh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_asin"]
pub fn asin(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_acos"]
pub fn acos(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_atan"]
pub fn atan(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_asinh"]
pub fn asinh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_acosh"]
pub fn acosh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_atanh"]
pub fn atanh(rop: mpc_ptr, op: mpc_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpc_urandom"]
pub fn urandom(rop: mpc_ptr, state: randstate_ptr) -> c_int;
#[link_name = "mpc_get_version"]
pub fn get_version() -> *const c_char;
}
pub const VERSION: c_int = (VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | VERSION_PATCHLEVEL;
pub const VERSION_MAJOR: c_int = MPC_VERSION_MAJOR;
pub const VERSION_MINOR: c_int = MPC_VERSION_MINOR;
pub const VERSION_PATCHLEVEL: c_int = MPC_VERSION_PATCHLEVEL;
pub const VERSION_STRING: *const c_char = MPC_VERSION_STRING;
#[inline]
pub extern "C" fn VERSION_NUM(major: c_int, minor: c_int, patchlevel: c_int) -> c_int {
(major << 16) | (minor << 8) | patchlevel
}
#[cfg(test)]
mod tests {
use crate::{gmp, mpc, mpfr};
use core::ptr::NonNull;
#[test]
fn check_real_imag_offsets() {
let mut limbs: [gmp::limb_t; 2] = [1 << (gmp::LIMB_BITS - 1), 1 << (gmp::LIMB_BITS - 1)];
let mut c = mpc::mpc_t {
re: mpfr::mpfr_t {
prec: 1,
sign: 1,
exp: 0,
d: NonNull::from(&mut limbs[0]),
},
im: mpfr::mpfr_t {
prec: 1,
sign: 1,
exp: 0,
d: NonNull::from(&mut limbs[1]),
},
};
unsafe {
assert_eq!(&c.re as *const mpfr::mpfr_t, mpc::realref_const(&c));
assert_eq!(&c.im as *const mpfr::mpfr_t, mpc::imagref_const(&c));
assert_eq!(&mut c.re as *mut mpfr::mpfr_t, mpc::realref(&mut c));
assert_eq!(&mut c.im as *mut mpfr::mpfr_t, mpc::imagref(&mut c));
}
}
#[test]
fn check_version() {
use crate::tests;
let (major, minor, patchlevel) = (1, 1, 0);
let version = "1.1.0";
assert_eq!(mpc::VERSION_MAJOR, major);
assert!(mpc::VERSION_MINOR >= minor);
assert!(mpc::VERSION_MINOR > minor || mpc::VERSION_PATCHLEVEL >= patchlevel);
if mpc::VERSION_MINOR == minor && mpc::VERSION_PATCHLEVEL == patchlevel {
assert_eq!(unsafe { tests::str_from_cstr(mpc::get_version()) }, version);
assert_eq!(
unsafe { tests::str_from_cstr(mpc::VERSION_STRING) },
version
);
}
}
}