real: remove the remaining decorum dependencies

This commit is contained in:
2022-07-17 18:46:25 -07:00
parent 866aa2882b
commit 253eb65f8f
3 changed files with 116 additions and 86 deletions

29
Cargo.lock generated
View File

@@ -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",

View File

@@ -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

View File

@@ -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))
} }
} }