diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-04-08 13:00:51 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-04-08 13:00:51 +0200 |
| commit | ff3d85cabbc3df422ed68fd5b16217d4dcaba49d (patch) | |
| tree | 12d792c07ad9d779f1b4ecf4ac785ad1a1082973 | |
| parent | 5babc34721e5f587ecae5bd4432fd57bf8c401fe (diff) | |
Add time module
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| -rw-r--r-- | include/time.h | 20 | ||||
| -rw-r--r-- | src/time.c | 48 | ||||
| -rw-r--r-- | tests/test_time.c | 13 |
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; +} |
