mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 18:18:03 +00:00
numeric types overhaul
This commit is contained in:
parent
fd2b274556
commit
f1ee92bf2d
9 changed files with 753 additions and 370 deletions
105
core/numeric/nonnan.rs
Normal file
105
core/numeric/nonnan.rs
Normal file
|
@ -0,0 +1,105 @@
|
|||
#[repr(transparent)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
pub struct NonNan(f64);
|
||||
|
||||
impl NonNan {
|
||||
pub fn new(value: f64) -> Option<Self> {
|
||||
if value.is_nan() {
|
||||
return None;
|
||||
}
|
||||
|
||||
Some(NonNan(value))
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<NonNan> for f64 {
|
||||
fn eq(&self, other: &NonNan) -> bool {
|
||||
*self == other.0
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<f64> for NonNan {
|
||||
fn eq(&self, other: &f64) -> bool {
|
||||
self.0 == *other
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd<f64> for NonNan {
|
||||
fn partial_cmp(&self, other: &f64) -> Option<std::cmp::Ordering> {
|
||||
self.0.partial_cmp(other)
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd<NonNan> for f64 {
|
||||
fn partial_cmp(&self, other: &NonNan) -> Option<std::cmp::Ordering> {
|
||||
self.partial_cmp(&other.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<i64> for NonNan {
|
||||
fn from(value: i64) -> Self {
|
||||
NonNan(value as f64)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<NonNan> for f64 {
|
||||
fn from(value: NonNan) -> Self {
|
||||
value.0
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Deref for NonNan {
|
||||
type Target = f64;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Add for NonNan {
|
||||
type Output = Option<NonNan>;
|
||||
|
||||
fn add(self, rhs: Self) -> Self::Output {
|
||||
Self::new(self.0 + rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Sub for NonNan {
|
||||
type Output = Option<NonNan>;
|
||||
|
||||
fn sub(self, rhs: Self) -> Self::Output {
|
||||
Self::new(self.0 - rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Mul for NonNan {
|
||||
type Output = Option<NonNan>;
|
||||
|
||||
fn mul(self, rhs: Self) -> Self::Output {
|
||||
Self::new(self.0 * rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Div for NonNan {
|
||||
type Output = Option<NonNan>;
|
||||
|
||||
fn div(self, rhs: Self) -> Self::Output {
|
||||
Self::new(self.0 / rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Rem for NonNan {
|
||||
type Output = Option<NonNan>;
|
||||
|
||||
fn rem(self, rhs: Self) -> Self::Output {
|
||||
Self::new(self.0 % rhs.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::Neg for NonNan {
|
||||
type Output = Self;
|
||||
|
||||
fn neg(self) -> Self::Output {
|
||||
Self(-self.0)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue