Skip to main content

lust/
number.rs

1#![allow(dead_code)]
2
3#[cfg(feature = "std")]
4pub type LustInt = i64;
5#[cfg(not(feature = "std"))]
6pub type LustInt = i32;
7
8#[cfg(feature = "std")]
9pub type LustFloat = f64;
10#[cfg(not(feature = "std"))]
11pub type LustFloat = f32;
12
13#[cfg(feature = "std")]
14pub type FloatBits = u64;
15#[cfg(not(feature = "std"))]
16pub type FloatBits = u32;
17
18#[inline]
19pub const fn int_zero() -> LustInt {
20    0
21}
22
23#[inline]
24pub fn int_from_usize(value: usize) -> LustInt {
25    value as LustInt
26}
27
28#[inline]
29pub fn float_from_int(value: LustInt) -> LustFloat {
30    value as LustFloat
31}
32
33#[inline]
34pub fn int_from_float(value: LustFloat) -> LustInt {
35    value as LustInt
36}
37
38#[inline]
39pub fn float_to_hash_bits(value: LustFloat) -> u64 {
40    #[cfg(feature = "std")]
41    {
42        value.to_bits()
43    }
44    #[cfg(not(feature = "std"))]
45    {
46        value.to_bits() as u64
47    }
48}
49
50#[inline]
51pub fn float_is_nan(value: LustFloat) -> bool {
52    value.is_nan()
53}
54
55#[inline]
56pub fn parse_float(input: &str) -> Result<LustFloat, core::num::ParseFloatError> {
57    input.parse::<LustFloat>()
58}
59
60#[inline]
61pub fn float_abs(value: LustFloat) -> LustFloat {
62    value.abs()
63}
64
65#[inline]
66pub fn float_floor(value: LustFloat) -> LustFloat {
67    #[cfg(feature = "std")]
68    {
69        value.floor()
70    }
71    #[cfg(not(feature = "std"))]
72    {
73        libm::floorf(value)
74    }
75}
76
77#[inline]
78pub fn float_ceil(value: LustFloat) -> LustFloat {
79    #[cfg(feature = "std")]
80    {
81        value.ceil()
82    }
83    #[cfg(not(feature = "std"))]
84    {
85        libm::ceilf(value)
86    }
87}
88
89#[inline]
90pub fn float_round(value: LustFloat) -> LustFloat {
91    #[cfg(feature = "std")]
92    {
93        value.round()
94    }
95    #[cfg(not(feature = "std"))]
96    {
97        libm::roundf(value)
98    }
99}
100
101#[inline]
102pub fn float_sqrt(value: LustFloat) -> LustFloat {
103    #[cfg(feature = "std")]
104    {
105        value.sqrt()
106    }
107    #[cfg(not(feature = "std"))]
108    {
109        libm::sqrtf(value)
110    }
111}
112
113#[inline]
114pub fn float_sin(value: LustFloat) -> LustFloat {
115    #[cfg(feature = "std")]
116    {
117        value.sin()
118    }
119    #[cfg(not(feature = "std"))]
120    {
121        libm::sinf(value)
122    }
123}
124
125#[inline]
126pub fn float_cos(value: LustFloat) -> LustFloat {
127    #[cfg(feature = "std")]
128    {
129        value.cos()
130    }
131    #[cfg(not(feature = "std"))]
132    {
133        libm::cosf(value)
134    }
135}
136
137#[inline]
138pub fn float_tan(value: LustFloat) -> LustFloat {
139    #[cfg(feature = "std")]
140    {
141        value.tan()
142    }
143    #[cfg(not(feature = "std"))]
144    {
145        libm::tanf(value)
146    }
147}
148
149#[inline]
150pub fn float_asin(value: LustFloat) -> LustFloat {
151    #[cfg(feature = "std")]
152    {
153        value.asin()
154    }
155    #[cfg(not(feature = "std"))]
156    {
157        libm::asinf(value)
158    }
159}
160
161#[inline]
162pub fn float_acos(value: LustFloat) -> LustFloat {
163    #[cfg(feature = "std")]
164    {
165        value.acos()
166    }
167    #[cfg(not(feature = "std"))]
168    {
169        libm::acosf(value)
170    }
171}
172
173#[inline]
174pub fn float_atan(value: LustFloat) -> LustFloat {
175    #[cfg(feature = "std")]
176    {
177        value.atan()
178    }
179    #[cfg(not(feature = "std"))]
180    {
181        libm::atanf(value)
182    }
183}
184
185#[inline]
186pub fn float_atan2(y: LustFloat, x: LustFloat) -> LustFloat {
187    #[cfg(feature = "std")]
188    {
189        y.atan2(x)
190    }
191    #[cfg(not(feature = "std"))]
192    {
193        libm::atan2f(y, x)
194    }
195}
196
197#[inline]
198pub fn float_clamp(value: LustFloat, min: LustFloat, max: LustFloat) -> LustFloat {
199    if value < min {
200        min
201    } else if value > max {
202        max
203    } else {
204        value
205    }
206}