aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-10-28 23:28:22 +0200
committerGitHub <noreply@github.com>2021-10-28 23:28:22 +0200
commit729e721b400a86840fc7f463e548b9865619974c (patch)
treefbcd351488351a8041af66d8eff2ee22246c84ef
parentef29ffeb21bbe7f84e5c0e71cdef546ccf292432 (diff)
parente4ce0171834c6b4b5e35a7f26ac512698769775b (diff)
Merge pull request #1203 from thePHTest/stopwatch
Add a stopwatch to time.odin
-rw-r--r--core/time/time.odin54
1 files changed, 49 insertions, 5 deletions
diff --git a/core/time/time.odin b/core/time/time.odin
index 1fcb20cf8..fddb09d85 100644
--- a/core/time/time.odin
+++ b/core/time/time.odin
@@ -43,6 +43,36 @@ Weekday :: enum int {
Saturday,
}
+Stopwatch :: struct {
+ running: bool,
+ _start_time: Tick,
+ _accumulation: Duration,
+}
+
+stopwatch_start :: proc(using stopwatch: ^Stopwatch) {
+ if !running {
+ _start_time = tick_now()
+ running = true
+ }
+}
+
+stopwatch_stop :: proc(using stopwatch: ^Stopwatch) {
+ if running {
+ _accumulation += tick_diff(_start_time, tick_now())
+ running = false
+ }
+}
+
+stopwatch_reset :: proc(using stopwatch: ^Stopwatch) {
+ _accumulation = {}
+ running = false
+}
+
+stopwatch_duration :: proc(using stopwatch: Stopwatch) -> Duration {
+ if !running { return _accumulation }
+ return _accumulation + tick_diff(_start_time, tick_now())
+}
+
diff :: proc(start, end: Time) -> Duration {
d := end._nsec - start._nsec
return Duration(d)
@@ -52,7 +82,6 @@ since :: proc(start: Time) -> Duration {
return diff(start, now())
}
-
duration_nanoseconds :: proc(d: Duration) -> i64 {
return i64(d)
}
@@ -106,6 +135,7 @@ duration_round :: proc(d, m: Duration) -> Duration {
}
return MAX_DURATION
}
+
duration_truncate :: proc(d, m: Duration) -> Duration {
return d if m <= 0 else d - d%m
}
@@ -119,17 +149,33 @@ year :: proc(t: Time) -> (year: int) {
year, _, _, _ = _date(t, true)
return
}
+
month :: proc(t: Time) -> (month: Month) {
_, month, _, _ = _date(t, true)
return
}
+
day :: proc(t: Time) -> (day: int) {
_, _, day, _ = _date(t, true)
return
}
-clock :: proc(t: Time) -> (hour, min, sec: int) {
- sec = int(_time_abs(t) % SECONDS_PER_DAY)
+clock :: proc { clock_from_time, clock_from_duration, clock_from_stopwatch }
+
+clock_from_time :: proc(t: Time) -> (hour, min, sec: int) {
+ return clock_from_seconds(_time_abs(t))
+}
+
+clock_from_duration :: proc(d: Duration) -> (hour, min, sec: int) {
+ return clock_from_seconds(u64(d/1e9))
+}
+
+clock_from_stopwatch :: proc(s: Stopwatch) -> (hour, min, sec: int) {
+ return clock_from_duration(stopwatch_duration(s))
+}
+
+clock_from_seconds :: proc(nsec: u64) -> (hour, min, sec: int) {
+ sec = int(nsec % SECONDS_PER_DAY)
hour = sec / SECONDS_PER_HOUR
sec -= hour * SECONDS_PER_HOUR
min = sec / SECONDS_PER_MINUTE
@@ -137,12 +183,10 @@ clock :: proc(t: Time) -> (hour, min, sec: int) {
return
}
-
read_cycle_counter :: proc() -> u64 {
return u64(intrinsics.read_cycle_counter())
}
-
unix :: proc(sec: i64, nsec: i64) -> Time {
sec, nsec := sec, nsec
if nsec < 0 || nsec >= 1e9 {