1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::ops::{Add, Sub, Mul};
#[derive(Clone, PartialEq, Eq, Debug, Copy)]
pub struct Duration {
seconds: i64,
milliseconds: i16,
}
impl Duration {
pub fn zero() -> Duration {
Duration { seconds: 0, milliseconds: 0 }
}
pub fn of(seconds: i64) -> Duration {
Duration { seconds: seconds, milliseconds: 0 }
}
pub fn of_ms(seconds: i64, milliseconds: i16) -> Duration {
assert!(milliseconds >= 0 && milliseconds <= 999);
Duration { seconds: seconds, milliseconds: milliseconds }
}
pub fn lengths(&self) -> (i64, i16) {
(self.seconds, self.milliseconds)
}
}
impl Add<Duration> for Duration {
type Output = Duration;
fn add(self, rhs: Duration) -> Duration {
let ms = self.milliseconds + rhs.milliseconds;
if ms >= 1000 {
Duration::of_ms(self.seconds + rhs.seconds + 1, ms - 1000)
}
else {
Duration::of_ms(self.seconds + rhs.seconds, ms)
}
}
}
impl Sub<Duration> for Duration {
type Output = Duration;
fn sub(self, rhs: Duration) -> Duration {
let ms = self.milliseconds - rhs.milliseconds;
if ms < 0 {
Duration::of_ms(self.seconds - rhs.seconds - 1, ms + 1000)
}
else {
Duration::of_ms(self.seconds - rhs.seconds, ms)
}
}
}
impl Mul<i64> for Duration {
type Output = Duration;
fn mul(self, amount: i64) -> Duration {
let ms = self.milliseconds as i64 * amount;
Duration::of_ms(self.seconds * amount + ms / 1000, (ms % 1000) as i16)
}
}