1use crate::{Monotonic, Timestamp};
2use core::fmt;
3use std::time::Duration;
4
5macro_rules! impl_common {
6 ($t: ty) => {
7 impl $t {
8 #[inline]
9 pub fn abs_diff(self, other: $t) -> Duration {
10 if self.0 > other.0 {
11 self.0 - other.0
12 } else {
13 other.0 - self.0
14 }
15 }
16 #[inline]
17 pub fn as_secs(self) -> u64 {
18 self.0.as_secs()
19 }
20 #[inline]
21 pub fn from_secs(value: u64) -> Self {
22 Self(Duration::from_secs(value))
23 }
24 #[inline]
25 pub fn as_secs_f64(self) -> f64 {
26 self.0.as_secs_f64()
27 }
28 #[inline]
29 pub fn from_secs_f64(value: f64) -> Self {
30 Self(Duration::from_secs_f64(value))
31 }
32 #[inline]
33 pub fn as_secs_f32(self) -> f32 {
34 self.0.as_secs_f32()
35 }
36 #[inline]
37 pub fn from_secs_f32(value: f32) -> Self {
38 Self(Duration::from_secs_f32(value))
39 }
40 #[inline]
41 pub fn as_micros(self) -> u128 {
42 self.0.as_micros()
43 }
44 #[inline]
45 pub fn from_micros(value: u64) -> Self {
46 Self(Duration::from_micros(value))
47 }
48 #[inline]
49 pub fn as_millis(self) -> u128 {
50 self.0.as_millis()
51 }
52 #[inline]
53 pub fn from_millis(value: u64) -> Self {
54 Self(Duration::from_millis(value))
55 }
56 #[inline]
57 pub fn as_nanos(self) -> u128 {
58 self.0.as_nanos()
59 }
60 #[inline]
61 pub fn from_nanos(value: u64) -> Self {
62 Self(Duration::from_nanos(value))
63 }
64 #[inline]
65 pub fn as_duration(self) -> Duration {
66 self.into()
67 }
68 }
69 impl fmt::Display for $t {
70 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
71 write!(f, "{}", self.0.as_nanos())
72 }
73 }
74 };
75}
76
77impl_common!(Timestamp);
78impl_common!(Monotonic);