oxiproj-core 0.1.2

Foundation types for OxiProj: coordinates, errors, ellipsoids, datums, and units.
Documentation
//! Math compatibility shims: delegates to `std` or `libm` depending on the feature.
//!
//! When the `no_std` feature is active, transcendental functions are not
//! available as inherent `f64` methods; `libm` provides them instead.
//! This module presents a uniform interface so the rest of the crate is
//! feature-agnostic.

#[cfg(not(feature = "no_std"))]
mod inner {
    /// Sine, via `std`.
    #[inline]
    pub fn sin(x: f64) -> f64 {
        x.sin()
    }
    /// Cosine, via `std`.
    #[inline]
    pub fn cos(x: f64) -> f64 {
        x.cos()
    }
    /// Tangent, via `std`.
    #[inline]
    pub fn tan(x: f64) -> f64 {
        x.tan()
    }
    /// Arcsine, via `std`.
    #[inline]
    pub fn asin(x: f64) -> f64 {
        x.asin()
    }
    /// Arccosine, via `std`.
    #[inline]
    pub fn acos(x: f64) -> f64 {
        x.acos()
    }
    /// Arctangent, via `std`.
    #[inline]
    pub fn atan(x: f64) -> f64 {
        x.atan()
    }
    /// Inverse hyperbolic tangent, via `std`.
    #[inline]
    pub fn atanh(x: f64) -> f64 {
        x.atanh()
    }
    /// Four-quadrant arctangent of `y / x`, via `std`.
    #[inline]
    pub fn atan2(y: f64, x: f64) -> f64 {
        y.atan2(x)
    }
    /// Square root, via `std`.
    #[inline]
    pub fn sqrt(x: f64) -> f64 {
        x.sqrt()
    }
    /// Cube root, via `std`.
    #[inline]
    pub fn cbrt(x: f64) -> f64 {
        x.cbrt()
    }
    /// Exponential function, via `std`.
    #[inline]
    pub fn exp(x: f64) -> f64 {
        x.exp()
    }
    /// Natural logarithm, via `std`.
    #[inline]
    pub fn ln(x: f64) -> f64 {
        x.ln()
    }
    /// Absolute value, via `std`.
    #[inline]
    pub fn abs(x: f64) -> f64 {
        x.abs()
    }
    /// Hyperbolic sine, via `std`.
    #[inline]
    pub fn sinh(x: f64) -> f64 {
        x.sinh()
    }
    /// Hyperbolic cosine, via `std`.
    #[inline]
    pub fn cosh(x: f64) -> f64 {
        x.cosh()
    }
    /// Hyperbolic tangent, via `std`.
    #[inline]
    pub fn tanh(x: f64) -> f64 {
        x.tanh()
    }
    /// Euclidean distance `sqrt(x^2 + y^2)` without intermediate
    /// overflow/underflow, via `std`.
    #[inline]
    pub fn hypot(x: f64, y: f64) -> f64 {
        x.hypot(y)
    }
    /// Raises `x` to an integer power, via `std`.
    #[inline]
    pub fn powi(x: f64, n: i32) -> f64 {
        x.powi(n)
    }
    /// Raises `x` to a floating-point power, via `std`.
    #[inline]
    pub fn powf(x: f64, y: f64) -> f64 {
        x.powf(y)
    }
    /// Largest integer less than or equal to `x`, via `std`.
    #[inline]
    pub fn floor(x: f64) -> f64 {
        x.floor()
    }
    /// Smallest integer greater than or equal to `x`, via `std`.
    #[inline]
    pub fn ceil(x: f64) -> f64 {
        x.ceil()
    }
    /// Rounds `x` to the nearest integer, ties away from zero, via `std`.
    #[inline]
    pub fn round(x: f64) -> f64 {
        x.round()
    }
    /// Sign of `x`: `1.0`, `-1.0`, or `NaN`/`0.0` preserved, via `std`.
    #[inline]
    pub fn signum(x: f64) -> f64 {
        x.signum()
    }
}

#[cfg(feature = "no_std")]
mod inner {
    /// Sine, via `libm`.
    #[inline]
    pub fn sin(x: f64) -> f64 {
        libm::sin(x)
    }
    /// Cosine, via `libm`.
    #[inline]
    pub fn cos(x: f64) -> f64 {
        libm::cos(x)
    }
    /// Tangent, via `libm`.
    #[inline]
    pub fn tan(x: f64) -> f64 {
        libm::tan(x)
    }
    /// Arcsine, via `libm`.
    #[inline]
    pub fn asin(x: f64) -> f64 {
        libm::asin(x)
    }
    /// Arccosine, via `libm`.
    #[inline]
    pub fn acos(x: f64) -> f64 {
        libm::acos(x)
    }
    /// Arctangent, via `libm`.
    #[inline]
    pub fn atan(x: f64) -> f64 {
        libm::atan(x)
    }
    /// Inverse hyperbolic tangent, via `libm`.
    #[inline]
    pub fn atanh(x: f64) -> f64 {
        libm::atanh(x)
    }
    /// Four-quadrant arctangent of `y / x`, via `libm`.
    #[inline]
    pub fn atan2(y: f64, x: f64) -> f64 {
        libm::atan2(y, x)
    }
    /// Square root, via `libm`.
    #[inline]
    pub fn sqrt(x: f64) -> f64 {
        libm::sqrt(x)
    }
    /// Cube root, via `libm`.
    #[inline]
    pub fn cbrt(x: f64) -> f64 {
        libm::cbrt(x)
    }
    /// Exponential function, via `libm`.
    #[inline]
    pub fn exp(x: f64) -> f64 {
        libm::exp(x)
    }
    /// Natural logarithm, via `libm`.
    #[inline]
    pub fn ln(x: f64) -> f64 {
        libm::log(x)
    }
    /// Absolute value, via `libm`.
    #[inline]
    pub fn abs(x: f64) -> f64 {
        libm::fabs(x)
    }
    /// Hyperbolic sine, via `libm`.
    #[inline]
    pub fn sinh(x: f64) -> f64 {
        libm::sinh(x)
    }
    /// Hyperbolic cosine, via `libm`.
    #[inline]
    pub fn cosh(x: f64) -> f64 {
        libm::cosh(x)
    }
    /// Hyperbolic tangent, via `libm`.
    #[inline]
    pub fn tanh(x: f64) -> f64 {
        libm::tanh(x)
    }
    /// Euclidean distance `sqrt(x^2 + y^2)` without intermediate
    /// overflow/underflow, via `libm`.
    #[inline]
    pub fn hypot(x: f64, y: f64) -> f64 {
        libm::hypot(x, y)
    }
    /// Raises `x` to an integer power, via `libm`.
    #[inline]
    pub fn powi(x: f64, n: i32) -> f64 {
        libm::pow(x, n as f64)
    }
    /// Raises `x` to a floating-point power, via `libm`.
    #[inline]
    pub fn powf(x: f64, y: f64) -> f64 {
        libm::pow(x, y)
    }
    /// Largest integer less than or equal to `x`, via `libm`.
    #[inline]
    pub fn floor(x: f64) -> f64 {
        libm::floor(x)
    }
    /// Smallest integer greater than or equal to `x`, via `libm`.
    #[inline]
    pub fn ceil(x: f64) -> f64 {
        libm::ceil(x)
    }
    /// Rounds `x` to the nearest integer, ties away from zero, via `libm`.
    #[inline]
    pub fn round(x: f64) -> f64 {
        libm::round(x)
    }
    /// Sign of `x`: `1.0` if positive, `-1.0` if negative, `0.0` otherwise
    /// (this `no_std` fallback does not special-case `NaN`/signed-zero the
    /// way `f64::signum` does).
    #[inline]
    pub fn signum(x: f64) -> f64 {
        if x > 0.0 {
            1.0
        } else if x < 0.0 {
            -1.0
        } else {
            0.0
        }
    }
}

pub use inner::*;