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
82
83
84
85
86
87
88
89
90
91
92
93
extern crate time;
extern crate num;
use std::default::Default;
use std::fmt;
use num::traits::ToPrimitive;
use time::Duration;
#[derive(Clone, Copy)]
pub struct Stopwatch {
start_time: Option<u64>,
elapsed: Duration,
}
impl Default for Stopwatch {
fn default () -> Stopwatch {
Stopwatch {
start_time: None,
elapsed: Duration::zero(),
}
}
}
impl fmt::Display for Stopwatch {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
return write!(f, "{}", self.elapsed());
}
}
fn current_time() -> u64 {
return time::precise_time_ns();
}
fn ns_times_to_duration(t1: u64, t2: u64) -> Duration {
let diff_u = t2 - t1;
let diff_i = match diff_u.to_i64() {
Some(i) => i,
None => {
debug_assert!(false, "Stopwatch saw a time of more than 292 years, this probably indicates a bug");
0
}
};
return Duration::nanoseconds(diff_i);
}
impl Stopwatch {
pub fn new() -> Stopwatch {
let sw: Stopwatch = Default::default();
return sw;
}
pub fn start_new() -> Stopwatch {
let mut sw = Stopwatch::new();
sw.start();
return sw;
}
pub fn start(&mut self) {
self.start_time = Some(current_time());
}
pub fn stop(&mut self) {
self.elapsed = self.elapsed();
self.start_time = None;
}
pub fn reset(&mut self) {
self.start_time = None;
self.elapsed = Duration::zero();
}
pub fn restart(&mut self) {
self.reset();
self.start();
}
pub fn is_running(&self) -> bool {
return self.start_time.is_some();
}
pub fn elapsed(&self) -> Duration {
match self.start_time {
Some(t1) => {
let t2 = current_time();
let new_duration = ns_times_to_duration(t1, t2);
return new_duration + self.elapsed;
},
None => {
return self.elapsed;
},
}
}
pub fn elapsed_ms(&self) -> i64 {
return self.elapsed().num_milliseconds();
}
}