aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-04-08 13:00:51 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-04-08 13:00:51 +0200
commitff3d85cabbc3df422ed68fd5b16217d4dcaba49d (patch)
tree12d792c07ad9d779f1b4ecf4ac785ad1a1082973
parent5babc34721e5f587ecae5bd4432fd57bf8c401fe (diff)
Add time module
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-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;
+}