aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/time/stopwatch.v
blob: 569e10c25428367f71cd10dfef7ab1e9da475bd3 (plain)
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
// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module time

pub struct StopWatchOptions {
	auto_start bool = true
}

// StopWatch is used to measure elapsed time.
pub struct StopWatch {
mut:
	elapsed u64
pub mut:
	start u64
	end   u64
}

// new_stopwatch initializes a new StopWatch with the current time as start.
pub fn new_stopwatch(opts StopWatchOptions) StopWatch {
	mut initial := u64(0)
	if opts.auto_start {
		initial = sys_mono_now()
	}
	return StopWatch{
		elapsed: 0
		start: initial
		end: 0
	}
}

// start starts the stopwatch. If the timer was paused, restarts counting.
pub fn (mut t StopWatch) start() {
	t.start = sys_mono_now()
	t.end = 0
}

// restart restarts the stopwatch. If the timer was paused, restarts counting.
pub fn (mut t StopWatch) restart() {
	t.start = sys_mono_now()
	t.end = 0
	t.elapsed = 0
}

// stop stops the timer, by setting the end time to the current time.
pub fn (mut t StopWatch) stop() {
	t.end = sys_mono_now()
}

// pause resets the `start` time and adds the current elapsed time to `elapsed`.
pub fn (mut t StopWatch) pause() {
	if t.start > 0 {
		if t.end == 0 {
			t.elapsed += sys_mono_now() - t.start
		} else {
			t.elapsed += t.end - t.start
		}
	}
	t.start = 0
}

// elapsed returns the Duration since the last start call
pub fn (t StopWatch) elapsed() Duration {
	if t.start > 0 {
		if t.end == 0 {
			return Duration(i64(sys_mono_now() - t.start + t.elapsed))
		} else {
			return Duration(i64(t.end - t.start + t.elapsed))
		}
	}
	return Duration(i64(t.elapsed))
}