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}