pub mod mpz;
pub mod mpf;
pub mod mpq;
pub use crate::ops::mpz::{*, sub::*, add::*, mul::*, div::*, rem::*, cmp::*};
pub use crate::ops::mpf::{*, sub::*, add::*, mul::*, div::*, rem::*, cmp::*};
pub use crate::ops::mpq::{*, sub::*, add::*, mul::*, div::*, rem::*, cmp::*};
pub use onforward_ref::*;
use std::ops::{Mul, MulAssign, Div, DivAssign};
use crate::prim::{mpz::*, mpf::*, mpq::*};
onforward_ref_binop!{impl Mul, mul for mpz_s, mpf_s, mpf_s}
impl<'a, 'b> Mul<&'b mpf_s> for &'a mpz_s {
type Output = <mpf_s as Mul<mpf_s>>::Output;
#[inline]
fn mul(self, rhs: &'b mpf_s) -> <mpf_s as Mul<mpf_s>>::Output {
mpf_s::from(self) * rhs
}
}
onforward_ref_binop!{impl Mul, mul for mpf_s, mpz_s, mpf_s}
impl<'a, 'b> Mul<&'b mpz_s> for &'a mpf_s {
type Output = <mpf_s as Mul<mpz_s>>::Output;
#[inline]
fn mul(self, rhs: &'b mpz_s) -> <mpf_s as Mul<mpz_s>>::Output {
self * mpf_s::from(rhs)
}
}
onforward_ref_op_assign!{impl MulAssign, mul_assign for mpf_s, mpz_s}
impl<'a> MulAssign<&'a mpz_s> for mpf_s {
#[inline]
fn mul_assign(&mut self, rhs: &'a mpz_s) -> () {
*self *= mpf_s::from(rhs);
}
}
onforward_ref_binop!{impl Div, div for mpz_s, mpf_s, mpf_s}
impl<'a, 'b> Div<&'b mpf_s> for &'a mpz_s {
type Output = <mpf_s as Div<mpf_s>>::Output;
#[inline]
fn div(self, rhs: &'b mpf_s) -> <mpf_s as Div<mpf_s>>::Output {
mpf_s::from(self) / rhs
}
}
onforward_ref_binop!{impl Div, div for mpf_s, mpz_s, mpf_s}
impl<'a, 'b> Div<&'b mpz_s> for &'a mpf_s {
type Output = <mpf_s as Div<mpz_s>>::Output;
#[inline]
fn div(self, rhs: &'b mpz_s) -> <mpf_s as Div<mpz_s>>::Output {
self / mpf_s::from(rhs)
}
}
onforward_ref_op_assign!{impl DivAssign, div_assign for mpf_s, mpz_s}
impl<'a> DivAssign<&'a mpz_s> for mpf_s {
#[inline]
fn div_assign(&mut self, rhs: &'a mpz_s) -> () {
*self /= mpf_s::from(rhs);
}
}
onforward_ref_binop!{impl Mul, mul for mpz_s, mpq_s, mpq_s}
impl<'a, 'b> Mul<&'b mpq_s> for &'a mpz_s {
type Output = <mpq_s as Mul<mpq_s>>::Output;
#[inline]
fn mul(self, rhs: &'b mpq_s) -> <mpq_s as Mul<mpq_s>>::Output {
mpq_s::from(self) * rhs
}
}
onforward_ref_binop!{impl Mul, mul for mpq_s, mpz_s, mpq_s}
impl<'a, 'b> Mul<&'b mpz_s> for &'a mpq_s {
type Output = <mpq_s as Mul<mpz_s>>::Output;
#[inline]
fn mul(self, rhs: &'b mpz_s) -> <mpq_s as Mul<mpz_s>>::Output {
self * mpq_s::from(rhs)
}
}
onforward_ref_op_assign!{impl MulAssign, mul_assign for mpq_s, mpz_s}
impl<'a> MulAssign<&'a mpz_s> for mpq_s {
#[inline]
fn mul_assign(&mut self, rhs: &'a mpz_s) -> () {
*self *= mpq_s::from(rhs);
}
}
onforward_ref_binop!{impl Div, div for mpz_s, mpq_s, mpq_s}
impl<'a, 'b> Div<&'b mpq_s> for &'a mpz_s {
type Output = <mpq_s as Div<mpq_s>>::Output;
#[inline]
fn div(self, rhs: &'b mpq_s) -> <mpq_s as Div<mpq_s>>::Output {
mpq_s::from(self) / rhs
}
}
onforward_ref_binop!{impl Div, div for mpq_s, mpz_s, mpq_s}
impl<'a, 'b> Div<&'b mpz_s> for &'a mpq_s {
type Output = <mpq_s as Div<mpz_s>>::Output;
#[inline]
fn div(self, rhs: &'b mpz_s) -> <mpq_s as Div<mpz_s>>::Output {
self / mpq_s::from(rhs)
}
}
onforward_ref_op_assign!{impl DivAssign, div_assign for mpq_s, mpz_s}
impl<'a> DivAssign<&'a mpz_s> for mpq_s {
#[inline]
fn div_assign(&mut self, rhs: &'a mpz_s) -> () {
*self /= mpq_s::from(rhs);
}
}
onforward_ref_binop!{impl Mul, mul for mpq_s, mpf_s, mpf_s}
impl<'a, 'b> Mul<&'b mpf_s> for &'a mpq_s {
type Output = <mpf_s as Mul<mpf_s>>::Output;
#[inline]
fn mul(self, rhs: &'b mpf_s) -> <mpf_s as Mul<mpf_s>>::Output {
self.numref() * rhs / self.denref()
}
}
onforward_ref_binop!{impl Mul, mul for mpf_s, mpq_s, mpf_s}
impl<'a, 'b> Mul<&'b mpq_s> for &'a mpf_s {
type Output = <mpf_s as Mul<mpq_s>>::Output;
#[inline]
fn mul(self, rhs: &'b mpq_s) -> <mpf_s as Mul<mpq_s>>::Output {
self * rhs.numref() / rhs.denref()
}
}
onforward_ref_op_assign!{impl MulAssign, mul_assign for mpf_s, mpq_s}
impl<'a> MulAssign<&'a mpq_s> for mpf_s {
#[inline]
fn mul_assign(&mut self, rhs: &'a mpq_s) -> () {
self.set(&(&*self * rhs)); }
}
onforward_ref_binop!{impl Div, div for mpq_s, mpf_s, mpf_s}
impl<'a, 'b> Div<&'b mpf_s> for &'a mpq_s {
type Output = <mpf_s as Div<mpf_s>>::Output;
#[inline]
fn div(self, rhs: &'b mpf_s) -> <mpf_s as Div<mpf_s>>::Output {
self.numref() / (self.denref() * rhs)
}
}
onforward_ref_binop!{impl Div, div for mpf_s, mpq_s, mpf_s}
impl<'a, 'b> Div<&'b mpq_s> for &'a mpf_s {
type Output = <mpf_s as Div<mpq_s>>::Output;
#[inline]
fn div(self, rhs: &'b mpq_s) -> <mpf_s as Div<mpq_s>>::Output {
self * rhs.denref() / rhs.numref()
}
}
onforward_ref_op_assign!{impl DivAssign, div_assign for mpf_s, mpq_s}
impl<'a> DivAssign<&'a mpq_s> for mpf_s {
#[inline]
fn div_assign(&mut self, rhs: &'a mpq_s) -> () {
self.set(&(&*self / rhs)); }
}