From ff3d85cabbc3df422ed68fd5b16217d4dcaba49d Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Wed, 8 Apr 2026 13:00:51 +0200 Subject: Add time module Co-Authored-By: Claude Sonnet 4.6 --- include/time.h | 20 ++++++++++++++++++++ src/time.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/test_time.c | 13 +++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 include/time.h create mode 100644 src/time.c create mode 100644 tests/test_time.c 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 + +#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; +} -- cgit v1.3