deep_time/dt/
numbers_traits.rs1use crate::{
15 ATTOS_PER_FS_I128, ATTOS_PER_MS_I128, ATTOS_PER_NS_I128, ATTOS_PER_PS_I128, ATTOS_PER_SEC_I128,
16 ATTOS_PER_SECF, ATTOS_PER_US_I128, Dt, SEC_PER_DAY, SEC_PER_DAY_F, Scale,
17};
18
19pub trait AttosTraits: Copy + Sized {
38 fn attos_to_sec(self) -> i128;
40
41 fn attos_to_ms(self) -> i128;
43
44 fn attos_to_us(self) -> i128;
46
47 fn attos_to_ns(self) -> i128;
49
50 fn attos_to_ps(self) -> i128;
52
53 fn attos_to_fs(self) -> i128;
55
56 fn attos_to_sec_f(self) -> f64;
58
59 fn fs_to_attos(self) -> i128;
61
62 fn ps_to_attos(self) -> i128;
64
65 fn ns_to_attos(self) -> i128;
67
68 fn us_to_attos(self) -> i128;
70
71 fn ms_to_attos(self) -> i128;
73
74 fn sec_to_attos(self) -> i128;
76
77 fn mins_to_attos(self) -> i128;
79
80 fn hours_to_attos(self) -> i128;
82}
83
84impl AttosTraits for i128 {
85 #[inline]
86 fn attos_to_sec_f(self) -> f64 {
87 self as f64 / ATTOS_PER_SECF
88 }
89
90 #[inline]
91 fn attos_to_sec(self) -> i128 {
92 self / ATTOS_PER_SEC_I128
93 }
94
95 #[inline]
96 fn attos_to_ms(self) -> i128 {
97 self / ATTOS_PER_MS_I128
98 }
99
100 #[inline]
101 fn attos_to_us(self) -> i128 {
102 self / ATTOS_PER_US_I128
103 }
104
105 #[inline]
106 fn attos_to_ns(self) -> i128 {
107 self / ATTOS_PER_NS_I128
108 }
109
110 #[inline]
111 fn attos_to_ps(self) -> i128 {
112 self / ATTOS_PER_PS_I128
113 }
114
115 #[inline]
116 fn attos_to_fs(self) -> i128 {
117 self / ATTOS_PER_FS_I128
118 }
119
120 #[inline]
121 fn fs_to_attos(self) -> i128 {
122 Dt::fs_to_attos(self)
123 }
124
125 #[inline]
126 fn ps_to_attos(self) -> i128 {
127 Dt::ps_to_attos(self)
128 }
129
130 #[inline]
131 fn ns_to_attos(self) -> i128 {
132 Dt::ns_to_attos(self)
133 }
134
135 #[inline]
136 fn us_to_attos(self) -> i128 {
137 Dt::us_to_attos(self)
138 }
139
140 #[inline]
141 fn ms_to_attos(self) -> i128 {
142 Dt::ms_to_attos(self)
143 }
144
145 #[inline]
146 fn sec_to_attos(self) -> i128 {
147 Dt::sec_to_attos(self)
148 }
149
150 #[inline]
151 fn mins_to_attos(self) -> i128 {
152 Dt::mins_to_attos(self)
153 }
154
155 #[inline]
156 fn hours_to_attos(self) -> i128 {
157 Dt::hours_to_attos(self)
158 }
159}
160
161pub trait TimeTraits: Copy + Sized {
171 fn ns(self) -> Dt;
172 fn us(self) -> Dt;
173 fn ms(self) -> Dt;
174 fn sec(self) -> Dt;
175 fn mins(self) -> Dt;
176 fn hours(self) -> Dt;
177 fn days(self) -> Dt; fn weeks(self) -> Dt;
179 fn years(self) -> Dt; }
181
182macro_rules! impl_time_units_int {
184 ($($ty:ty),* $(,)?) => {
185 $(
186 impl TimeTraits for $ty {
187 #[inline]
188 fn ns(self) -> Dt { Dt::from_ns(self as i128, 0, Scale::TAI, Scale::TAI) }
189
190 #[inline]
191 fn us(self) -> Dt { Dt::from_us(self as i128, 0, Scale::TAI, Scale::TAI) }
192
193 #[inline]
194 fn ms(self) -> Dt { Dt::from_ms(self as i128, 0, Scale::TAI, Scale::TAI) }
195
196 #[inline]
197 fn sec(self) -> Dt { Dt::from_sec(self as i128, Scale::TAI, Scale::TAI) }
198
199 #[inline]
200 fn mins(self) -> Dt { Dt::from_mins(self as i128, 0, Scale::TAI, Scale::TAI) }
201
202 #[inline]
203 fn hours(self) -> Dt { Dt::from_hours(self as i128, 0, Scale::TAI, Scale::TAI) }
204
205 #[inline]
206 fn days(self) -> Dt { Dt::from_sec((self as i128).saturating_mul(SEC_PER_DAY), Scale::TAI, Scale::TAI) }
207
208 #[inline]
209 fn weeks(self) -> Dt { Dt::from_sec((self as i128).saturating_mul(604_800), Scale::TAI, Scale::TAI) }
210
211 #[inline]
212 fn years(self) -> Dt { Dt::from_sec((self as i128).saturating_mul(31_557_600), Scale::TAI, Scale::TAI) }
213 }
214 )*
215 };
216}
217
218impl_time_units_int!(i8, i16, i32, i64, i128, u8, u16, u32, u64);
219
220impl TimeTraits for u128 {
222 #[inline]
223 fn ns(self) -> Dt {
224 Dt::from_ns(Dt::to_i128(self), 0, Scale::TAI, Scale::TAI)
225 }
226
227 #[inline]
228 fn us(self) -> Dt {
229 Dt::from_us(Dt::to_i128(self), 0, Scale::TAI, Scale::TAI)
230 }
231
232 #[inline]
233 fn ms(self) -> Dt {
234 Dt::from_ms(Dt::to_i128(self), 0, Scale::TAI, Scale::TAI)
235 }
236
237 #[inline]
238 fn sec(self) -> Dt {
239 Dt::from_sec(Dt::to_i128(self), Scale::TAI, Scale::TAI)
240 }
241
242 #[inline]
243 fn mins(self) -> Dt {
244 Dt::from_mins(Dt::to_i128(self), 0, Scale::TAI, Scale::TAI)
245 }
246
247 #[inline]
248 fn hours(self) -> Dt {
249 Dt::from_hours(Dt::to_i128(self), 0, Scale::TAI, Scale::TAI)
250 }
251
252 #[inline]
253 fn days(self) -> Dt {
254 Dt::from_sec(
255 Dt::to_i128(self).saturating_mul(SEC_PER_DAY),
256 Scale::TAI,
257 Scale::TAI,
258 )
259 }
260
261 #[inline]
262 fn weeks(self) -> Dt {
263 Dt::from_sec(
264 Dt::to_i128(self).saturating_mul(604_800),
265 Scale::TAI,
266 Scale::TAI,
267 )
268 }
269
270 #[inline]
271 fn years(self) -> Dt {
272 Dt::from_sec(
273 Dt::to_i128(self).saturating_mul(31_557_600),
274 Scale::TAI,
275 Scale::TAI,
276 )
277 }
278}
279
280impl TimeTraits for f64 {
281 #[inline]
282 fn ns(self) -> Dt {
283 crate::from_sec_f!(self * 1e-9)
284 }
285
286 #[inline]
287 fn us(self) -> Dt {
288 crate::from_sec_f!(self * 1e-6)
289 }
290
291 #[inline]
292 fn ms(self) -> Dt {
293 crate::from_sec_f!(self * 1e-3)
294 }
295
296 #[inline]
297 fn sec(self) -> Dt {
298 crate::from_sec_f!(self)
299 }
300
301 #[inline]
302 fn mins(self) -> Dt {
303 (self * 60.0).sec()
304 }
305
306 #[inline]
307 fn hours(self) -> Dt {
308 (self * 3600.0).sec()
309 }
310
311 #[inline]
312 fn days(self) -> Dt {
313 (self * SEC_PER_DAY_F).sec()
314 }
315
316 #[inline]
317 fn weeks(self) -> Dt {
318 (self * 604_800.0).sec()
319 }
320
321 #[inline]
322 fn years(self) -> Dt {
323 (self * 31_557_600.0).sec()
324 }
325}
326
327impl TimeTraits for f32 {
328 #[inline]
329 fn ns(self) -> Dt {
330 crate::from_sec_f!(self as f64 * 1e-9)
331 }
332
333 #[inline]
334 fn us(self) -> Dt {
335 crate::from_sec_f!(self as f64 * 1e-6)
336 }
337
338 #[inline]
339 fn ms(self) -> Dt {
340 crate::from_sec_f!(self as f64 * 1e-3)
341 }
342
343 #[inline]
344 fn sec(self) -> Dt {
345 crate::from_sec_f!(self as f64)
346 }
347
348 #[inline]
349 fn mins(self) -> Dt {
350 (self * 60.0f32).sec()
351 }
352
353 #[inline]
354 fn hours(self) -> Dt {
355 (self * 3600.0f32).sec()
356 }
357
358 #[inline]
359 fn days(self) -> Dt {
360 (self * SEC_PER_DAY as f32).sec()
361 }
362
363 #[inline]
364 fn weeks(self) -> Dt {
365 (self * 604_800.0f32).sec()
366 }
367
368 #[inline]
369 fn years(self) -> Dt {
370 (self * 31_557_600.0f32).sec()
371 }
372}