use crate::Float;
use crate::misc;
use core::fmt::{
Binary, Debug, Display, Formatter, LowerExp, LowerHex, Octal, Pointer, Result as FmtResult,
UpperExp, UpperHex,
};
use core::marker::PhantomData;
use core::ops::Deref;
use gmp_mpfr_sys::mpfr::mpfr_t;
#[derive(Clone, Copy)]
#[repr(transparent)]
pub struct BorrowFloat<'a> {
inner: mpfr_t,
phantom: PhantomData<&'a Float>,
}
impl<'a> BorrowFloat<'a> {
pub const unsafe fn from_raw(raw: mpfr_t) -> BorrowFloat<'a> {
BorrowFloat {
inner: raw,
phantom: PhantomData,
}
}
#[cfg(feature = "complex")]
pub(crate) const fn into_raw(b: BorrowFloat<'a>) -> mpfr_t {
b.inner
}
#[inline]
pub const fn const_deref<'b>(b: &'b BorrowFloat<'a>) -> &'b Float {
let ptr = misc::cast_ptr(&b.inner);
unsafe { &*ptr }
}
}
impl Deref for BorrowFloat<'_> {
type Target = Float;
#[inline]
fn deref(&self) -> &Float {
BorrowFloat::const_deref(self)
}
}
impl Pointer for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Pointer::fmt(&&**self, f)
}
}
impl Display for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Display::fmt(&**self, f)
}
}
impl Debug for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Debug::fmt(&**self, f)
}
}
impl Binary for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Binary::fmt(&**self, f)
}
}
impl Octal for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Octal::fmt(&**self, f)
}
}
impl LowerHex for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
LowerHex::fmt(&**self, f)
}
}
impl UpperHex for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
UpperHex::fmt(&**self, f)
}
}
impl LowerExp for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
LowerExp::fmt(&**self, f)
}
}
impl UpperExp for BorrowFloat<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
UpperExp::fmt(&**self, f)
}
}
unsafe impl Send for BorrowFloat<'_> {}
unsafe impl Sync for BorrowFloat<'_> {}