real: remove the remaining decorum dependencies
This commit is contained in:
29
Cargo.lock
generated
29
Cargo.lock
generated
@@ -49,15 +49,6 @@ dependencies = [
|
|||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "approx"
|
|
||||||
version = "0.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3"
|
|
||||||
dependencies = [
|
|
||||||
"num-traits",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "approx"
|
name = "approx"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
@@ -371,7 +362,7 @@ dependencies = [
|
|||||||
name = "coremem_types"
|
name = "coremem_types"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"decorum",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -556,18 +547,6 @@ dependencies = [
|
|||||||
"parking_lot_core 0.9.3",
|
"parking_lot_core 0.9.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "decorum"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "281759d3c8a14f5c3f0c49363be56810fcd7f910422f97f2db850c2920fde5cf"
|
|
||||||
dependencies = [
|
|
||||||
"approx 0.3.2",
|
|
||||||
"num-traits",
|
|
||||||
"serde",
|
|
||||||
"serde_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deflate"
|
name = "deflate"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -1005,7 +984,7 @@ version = "0.23.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b6aee993351d466301a29655d628bfc6f5a35a0d062b6160ca0808f425805fd7"
|
checksum = "b6aee993351d466301a29655d628bfc6f5a35a0d062b6160ca0808f425805fd7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"approx 0.5.1",
|
"approx",
|
||||||
"conv",
|
"conv",
|
||||||
"image",
|
"image",
|
||||||
"itertools",
|
"itertools",
|
||||||
@@ -1289,7 +1268,7 @@ version = "0.30.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4fb2d0de08694bed883320212c18ee3008576bfe8c306f4c3c4a58b4876998be"
|
checksum = "4fb2d0de08694bed883320212c18ee3008576bfe8c306f4c3c4a58b4876998be"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"approx 0.5.1",
|
"approx",
|
||||||
"matrixmultiply",
|
"matrixmultiply",
|
||||||
"num-complex",
|
"num-complex",
|
||||||
"num-rational",
|
"num-rational",
|
||||||
@@ -2006,7 +1985,7 @@ version = "0.7.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "13a2609e876d4f77f6ab7ff5254fc39b4f1927ba8e6db3d18be7c32534d3725e"
|
checksum = "13a2609e876d4f77f6ab7ff5254fc39b4f1927ba8e6db3d18be7c32534d3725e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"approx 0.5.1",
|
"approx",
|
||||||
"num-complex",
|
"num-complex",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"paste",
|
"paste",
|
||||||
|
@@ -5,4 +5,4 @@ authors = ["Colin <colin@uninsane.org>"]
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
decorum = "0.3" # MIT
|
serde = "1.0" # MIT or Apache 2.0
|
||||||
|
@@ -1,14 +1,12 @@
|
|||||||
use std::fmt;
|
use core::fmt;
|
||||||
use core::ops::{
|
use core::ops::{
|
||||||
Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign,
|
Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign,
|
||||||
};
|
};
|
||||||
use core::cmp::{Ordering, PartialOrd};
|
use core::cmp::{Ordering, PartialOrd};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
// finite. non-nan, non-inf
|
|
||||||
pub type R32 = decorum::R32;
|
|
||||||
pub type R64 = decorum::R64;
|
|
||||||
|
|
||||||
pub trait ToFloat {
|
pub trait ToFloat {
|
||||||
|
// TODO: make these by-value
|
||||||
fn to_f32(&self) -> f32 {
|
fn to_f32(&self) -> f32 {
|
||||||
self.to_f64() as _
|
self.to_f64() as _
|
||||||
}
|
}
|
||||||
@@ -58,10 +56,12 @@ pub trait Real:
|
|||||||
Self::from_primitive(u)
|
Self::from_primitive(u)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: make this by-value
|
||||||
fn cast<R: Real>(&self) -> R {
|
fn cast<R: Real>(&self) -> R {
|
||||||
R::from_primitive(*self)
|
R::from_primitive(*self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_finite(self) -> bool;
|
||||||
fn floor(self) -> Self;
|
fn floor(self) -> Self;
|
||||||
fn ceil(self) -> Self;
|
fn ceil(self) -> Self;
|
||||||
fn round(self) -> Self;
|
fn round(self) -> Self;
|
||||||
@@ -154,6 +154,9 @@ impl Real for f32 {
|
|||||||
fn from_f32(f: f32) -> Self {
|
fn from_f32(f: f32) -> Self {
|
||||||
f
|
f
|
||||||
}
|
}
|
||||||
|
fn is_finite(self) -> bool {
|
||||||
|
f32::is_finite(self)
|
||||||
|
}
|
||||||
fn floor(self) -> Self {
|
fn floor(self) -> Self {
|
||||||
f32::floor(self)
|
f32::floor(self)
|
||||||
}
|
}
|
||||||
@@ -190,6 +193,9 @@ impl Real for f64 {
|
|||||||
fn from_f64(f: f64) -> Self {
|
fn from_f64(f: f64) -> Self {
|
||||||
f
|
f
|
||||||
}
|
}
|
||||||
|
fn is_finite(self) -> bool {
|
||||||
|
f64::is_finite(self)
|
||||||
|
}
|
||||||
fn floor(self) -> Self {
|
fn floor(self) -> Self {
|
||||||
f64::floor(self)
|
f64::floor(self)
|
||||||
}
|
}
|
||||||
@@ -216,80 +222,125 @@ impl Real for f64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToFloat for R32 {
|
#[derive(Default, Copy, Clone, Debug, PartialEq, PartialOrd, Serialize, Deserialize)]
|
||||||
|
pub struct Finite<T>(T);
|
||||||
|
|
||||||
|
pub type R32 = Finite<f32>;
|
||||||
|
pub type R64 = Finite<f64>;
|
||||||
|
|
||||||
|
impl<T: Real> Finite<T> {
|
||||||
|
fn new(inner: T) -> Self {
|
||||||
|
assert!(inner.is_finite(), "{:} is not finite", inner);
|
||||||
|
Self(inner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: fmt::Display> fmt::Display for Finite<T> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
self.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: fmt::LowerExp> fmt::LowerExp for Finite<T> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
self.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Real> Neg for Finite<T> {
|
||||||
|
type Output = Self;
|
||||||
|
fn neg(self) -> Self {
|
||||||
|
Self::new(self.0.neg())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Real> AddAssign for Finite<T> {
|
||||||
|
fn add_assign(&mut self, other: Self) {
|
||||||
|
*self = Self::new(self.0.add(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Real> SubAssign for Finite<T> {
|
||||||
|
fn sub_assign(&mut self, other: Self) {
|
||||||
|
*self = Self::new(self.0.sub(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Real> MulAssign for Finite<T> {
|
||||||
|
fn mul_assign(&mut self, other: Self) {
|
||||||
|
*self = Self::new(self.0.mul(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Real> DivAssign for Finite<T> {
|
||||||
|
fn div_assign(&mut self, other: Self) {
|
||||||
|
*self = Self::new(self.0.div(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Real> Add for Finite<T> {
|
||||||
|
type Output = Self;
|
||||||
|
fn add(self, other: Self) -> Self {
|
||||||
|
Self::new(self.0.add(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Real> Sub for Finite<T> {
|
||||||
|
type Output = Self;
|
||||||
|
fn sub(self, other: Self) -> Self {
|
||||||
|
Self::new(self.0.sub(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Real> Mul for Finite<T> {
|
||||||
|
type Output = Self;
|
||||||
|
fn mul(self, other: Self) -> Self {
|
||||||
|
Self::new(self.0.mul(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Real> Div for Finite<T> {
|
||||||
|
type Output = Self;
|
||||||
|
fn div(self, other: Self) -> Self {
|
||||||
|
Self::new(self.0.div(other.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<T: ToFloat> ToFloat for Finite<T> {
|
||||||
fn to_f32(&self) -> f32 {
|
fn to_f32(&self) -> f32 {
|
||||||
self.into_inner()
|
self.0.to_f32()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl Real for R32 {
|
|
||||||
fn from_primitive<P: ToFloat>(p: P) -> Self {
|
|
||||||
Self::from_f32(p.to_f32())
|
|
||||||
}
|
|
||||||
fn from_f32(f: f32) -> Self {
|
|
||||||
Self::from_inner(f)
|
|
||||||
}
|
|
||||||
fn floor(self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().floor())
|
|
||||||
}
|
|
||||||
fn ceil(self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().ceil())
|
|
||||||
}
|
|
||||||
fn round(self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().round())
|
|
||||||
}
|
|
||||||
fn exp(self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().exp())
|
|
||||||
}
|
|
||||||
fn powf(self, p: Self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().powf(p.into_inner()))
|
|
||||||
}
|
|
||||||
fn sqrt(self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().sqrt())
|
|
||||||
}
|
|
||||||
fn sin_cos(self) -> (Self, Self) {
|
|
||||||
let (s, c) = self.into_inner().sin_cos();
|
|
||||||
(Self::from_primitive(s), Self::from_primitive(c))
|
|
||||||
}
|
|
||||||
fn atan2(self, p: Self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().atan2(p.into_inner()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToFloat for R64 {
|
|
||||||
fn to_f64(&self) -> f64 {
|
fn to_f64(&self) -> f64 {
|
||||||
self.into_inner()
|
self.0.to_f64()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Real for R64 {
|
impl<T: Real> Real for Finite<T> {
|
||||||
fn from_f64(f: f64) -> Self {
|
fn from_primitive<P: ToFloat>(p: P) -> Self {
|
||||||
Self::from_inner(f)
|
Self::new(T::from_primitive(p))
|
||||||
|
}
|
||||||
|
fn is_finite(self) -> bool {
|
||||||
|
true
|
||||||
}
|
}
|
||||||
fn floor(self) -> Self {
|
fn floor(self) -> Self {
|
||||||
Self::from_primitive(self.into_inner().floor())
|
Self::new(self.0.floor())
|
||||||
}
|
}
|
||||||
fn ceil(self) -> Self {
|
fn ceil(self) -> Self {
|
||||||
Self::from_primitive(self.into_inner().ceil())
|
Self::new(self.0.ceil())
|
||||||
}
|
}
|
||||||
fn round(self) -> Self {
|
fn round(self) -> Self {
|
||||||
Self::from_primitive(self.into_inner().round())
|
Self::new(self.0.round())
|
||||||
}
|
}
|
||||||
fn exp(self) -> Self {
|
fn exp(self) -> Self {
|
||||||
Self::from_primitive(self.into_inner().exp())
|
Self::new(self.0.exp())
|
||||||
}
|
|
||||||
fn powf(self, p: Self) -> Self {
|
|
||||||
Self::from_primitive(self.into_inner().powf(p.into_inner()))
|
|
||||||
}
|
}
|
||||||
fn sqrt(self) -> Self {
|
fn sqrt(self) -> Self {
|
||||||
Self::from_primitive(self.into_inner().sqrt())
|
Self::new(self.0.sqrt())
|
||||||
}
|
}
|
||||||
fn sin_cos(self) -> (Self, Self) {
|
fn powf(self, p: Self) -> Self {
|
||||||
let (s, c) = self.into_inner().sin_cos();
|
Self::new(self.0.powf(p.0))
|
||||||
(Self::from_primitive(s), Self::from_primitive(c))
|
|
||||||
}
|
}
|
||||||
fn atan2(self, p: Self) -> Self {
|
fn atan2(self, p: Self) -> Self {
|
||||||
Self::from_primitive(self.into_inner().atan2(p.into_inner()))
|
Self::new(self.0.atan2(p.0))
|
||||||
|
}
|
||||||
|
fn sin_cos(self) -> (Self, Self) {
|
||||||
|
let (s, c) = self.0.sin_cos();
|
||||||
|
(Self::new(s), Self::new(c))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user