aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/time.h20
-rw-r--r--src/time.c48
-rw-r--r--tests/test_time.c13
3 files changed, 81 insertions, 0 deletions
diff --git a/include/time.h b/include/time.h
new file mode 100644
index 0000000..26bbf20
--- /dev/null
+++ b/include/time.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "types.h"
+
+typedef struct {
+ u64 s;
+ u64 ns;
+} Time;
+
+typedef struct {
+ u64 s;
+ u64 ns;
+} Duration;
+
+Time Time_get();
+f32 Time_ms(Time time);
+Duration Time_diff(Time end, Time start);
+f32 Duration_ms(Duration duration);
+Duration Duration_from_ms(f32 ms);
+Duration Duration_diff(Duration a, Duration b);
diff --git a/src/time.c b/src/time.c
new file mode 100644
index 0000000..cbabf96
--- /dev/null
+++ b/src/time.c
@@ -0,0 +1,48 @@
+#include <time.h>
+
+#include "../include/assert.h"
+#include "../include/time.h"
+#include "../include/types.h"
+
+Time Time_get() {
+ struct timespec system_time;
+ assert(clock_gettime(CLOCK_MONOTONIC, &system_time) == 0, "clock_gettime failed");
+ return (Time){system_time.tv_sec, system_time.tv_nsec};
+}
+
+f32 Time_ms(Time time) {
+ return time.s * 1e3 + time.ns / 1e6;
+}
+
+Duration Time_diff(Time end, Time start) {
+ Duration d;
+ d.s = end.s - start.s;
+ d.ns = end.ns - start.ns;
+ if (d.ns >= (u64)1e9) {
+ d.s += d.ns / (u64)1e9;
+ d.ns = d.ns % (u64)1e9;
+ }
+ return d;
+}
+
+f32 Duration_ms(Duration d) {
+ return d.s * 1e3 + d.ns / 1e6;
+}
+
+Duration Duration_from_ms(f32 ms) {
+ Duration d;
+ d.s = (u64)(ms / 1e3);
+ d.ns = (u64)((ms - d.s * 1e3) * 1e6);
+ return d;
+}
+
+Duration Duration_diff(Duration a, Duration b) {
+ Duration d;
+ d.s = a.s - b.s;
+ d.ns = a.ns - b.ns;
+ if (d.ns >= (u64)1e9) {
+ d.s += d.ns / (u64)1e9;
+ d.ns = d.ns % (u64)1e9;
+ }
+ return d;
+}
diff --git a/tests/test_time.c b/tests/test_time.c
new file mode 100644
index 0000000..3ab4d3e
--- /dev/null
+++ b/tests/test_time.c
@@ -0,0 +1,13 @@
+#include "../include/testing.h"
+#include "../include/time.h"
+#include "../include/types.h"
+
+i32 test_time_diff() {
+ Time start = Time_get();
+ Time end = Time_get();
+
+ Duration diff = Time_diff(end, start);
+ t_assert_equal(diff.s, 0);
+
+ return 0;
+}