integer: tweak Time

This commit is contained in:
Quaternions 2024-09-11 14:30:03 -07:00
parent 5c059ed17d
commit aaad5d5c22
3 changed files with 29 additions and 17 deletions

1
Cargo.lock generated
View File

@ -92,6 +92,7 @@ dependencies = [
"glam",
"id",
"linear_ops",
"ratio_ops",
]
[[package]]

View File

@ -14,5 +14,6 @@ arrayvec = "0.7.4"
bitflags = "2.6.0"
fixed_wide = { path = "../fixed_wide_vectors/fixed_wide", features = ["deferred-division","zeroes","wide-mul"] }
linear_ops = { path = "../fixed_wide_vectors/linear_ops", features = ["deferred-division","named-fields"] }
ratio_ops = { path = "../fixed_wide_vectors/ratio_ops" }
glam = "0.28.0"
id = { version = "0.1.0", registry = "strafesnet" }

View File

@ -1,3 +1,6 @@
use fixed_wide::fixed::Fixed;
use ratio_ops::ratio::Ratio;
//integer units
#[derive(Clone,Copy,Hash,Eq,PartialEq,PartialOrd,Debug)]
pub struct Time(i64);
@ -63,25 +66,25 @@ impl std::ops::Neg for Time{
Time(-self.0)
}
}
impl std::ops::Add<Time> for Time{
type Output=Time;
#[inline]
fn add(self,rhs:Self)->Self::Output {
Time(self.0+rhs.0)
}
macro_rules! impl_time_additive_operator {
($trait:ty, $method:ident) => {
impl $trait for Time{
type Output=Time;
#[inline]
fn $method(self,rhs:Self)->Self::Output {
Time(self.0.$method(rhs.0))
}
}
};
}
impl std::ops::Sub<Time> for Time{
type Output=Time;
impl_time_additive_operator!(core::ops::Add,add);
impl_time_additive_operator!(core::ops::Sub,sub);
impl_time_additive_operator!(core::ops::Rem,rem);
impl std::ops::Mul for Time{
type Output=Ratio<fixed_wide::fixed::Fixed<2,64>,fixed_wide::fixed::Fixed<2,64>>;
#[inline]
fn sub(self,rhs:Self)->Self::Output {
Time(self.0-rhs.0)
}
}
impl std::ops::Mul<Time> for Time{
type Output=Time;
#[inline]
fn mul(self,rhs:Time)->Self::Output{
Self((((self.0 as i128)*(rhs.0 as i128))/1_000_000_000) as i64)
fn mul(self,rhs:Self)->Self::Output{
Ratio::new(Fixed::raw(self.0)*Fixed::raw(rhs.0),Fixed::raw_digit(1_000_000_000i64.pow(2)))
}
}
impl std::ops::Div<i64> for Time{
@ -92,6 +95,13 @@ impl std::ops::Div<i64> for Time{
}
}
impl core::ops::Mul<Time> for Planar64{
type Output=Ratio<Fixed<2,64>,Planar64>;
fn mul(self,rhs:Time)->Self::Output{
Ratio::new(self*Fixed::raw(rhs.0),Planar64::raw(1_000_000_000))
}
}
#[inline]
const fn gcd(mut a:u64,mut b:u64)->u64{
while b!=0{