Skip to main content

veloxity_core/
math.rs

1use core::ops::{AddAssign, DivAssign, MulAssign, SubAssign};
2
3use nalgebra::RealField;
4
5pub trait FlightFloat:
6    RealField
7    + Copy
8    + PartialOrd
9    + Default
10    + AddAssign
11    + SubAssign
12    + MulAssign
13    + DivAssign
14    + core::fmt::Debug
15    + 'static
16{
17    fn from_f32(value: f32) -> Self;
18    fn from_f64(value: f64) -> Self;
19    fn from_usize(value: usize) -> Self;
20    fn from_u64(value: u64) -> Self;
21    fn from_i32(value: i32) -> Self;
22    fn from_flight_float<T: FlightFloat>(value: T) -> Self;
23    fn to_f32_lossy(self) -> f32;
24    fn to_f64_lossy(self) -> f64;
25    fn is_finite_value(self) -> bool;
26    fn infinity() -> Self;
27}
28
29impl FlightFloat for f32 {
30    fn from_f32(value: f32) -> Self {
31        value
32    }
33
34    fn from_f64(value: f64) -> Self {
35        value as f32
36    }
37
38    fn from_usize(value: usize) -> Self {
39        value as f32
40    }
41
42    fn from_u64(value: u64) -> Self {
43        value as f32
44    }
45
46    fn from_i32(value: i32) -> Self {
47        value as f32
48    }
49
50    fn from_flight_float<T: FlightFloat>(value: T) -> Self {
51        value.to_f32_lossy()
52    }
53
54    fn to_f32_lossy(self) -> f32 {
55        self
56    }
57
58    fn to_f64_lossy(self) -> f64 {
59        self as f64
60    }
61
62    fn is_finite_value(self) -> bool {
63        self.is_finite()
64    }
65
66    fn infinity() -> Self {
67        f32::INFINITY
68    }
69}
70
71impl FlightFloat for f64 {
72    fn from_f32(value: f32) -> Self {
73        value as f64
74    }
75
76    fn from_f64(value: f64) -> Self {
77        value
78    }
79
80    fn from_usize(value: usize) -> Self {
81        value as f64
82    }
83
84    fn from_u64(value: u64) -> Self {
85        value as f64
86    }
87
88    fn from_i32(value: i32) -> Self {
89        value as f64
90    }
91
92    fn from_flight_float<T: FlightFloat>(value: T) -> Self {
93        value.to_f64_lossy()
94    }
95
96    fn to_f32_lossy(self) -> f32 {
97        self as f32
98    }
99
100    fn to_f64_lossy(self) -> f64 {
101        self
102    }
103
104    fn is_finite_value(self) -> bool {
105        self.is_finite()
106    }
107
108    fn infinity() -> Self {
109        f64::INFINITY
110    }
111}
112
113pub fn zero<R: FlightFloat>() -> R {
114    <R as FlightFloat>::from_f32(0.0)
115}
116
117pub fn one<R: FlightFloat>() -> R {
118    <R as FlightFloat>::from_f32(1.0)
119}
120
121pub fn pi<R: FlightFloat>() -> R {
122    <R as FlightFloat>::from_f64(core::f64::consts::PI)
123}
124
125pub mod prelude {
126    pub use super::{FlightFloat, one, pi, zero};
127}