15static constexpr float PI_F = 3.1415926535f;
18#define UNIT_FUNC_MODIFIERS [[nodiscard, gnu::always_inline]] static inline
24static_assert(
sizeof(
celsius_t) ==
sizeof(float));
29 return (
fahrenheit_t){ .value = (c.value * 9.0f / 5.0f) + 32.0f };
34 return (
celsius_t){ .value = (f.value - 32.0f) * 5.0f / 9.0f };
42typedef struct {
float value; }
feet_t;
45static_assert(
sizeof(
meters_t) ==
sizeof(float));
48static_assert(
sizeof(
inches_t) ==
sizeof(float));
49static_assert(
sizeof(
feet_t) ==
sizeof(float));
50static_assert(
sizeof(
miles_t) ==
sizeof(float));
54 return (
meters_t){ .value = cm.value / 100.0f };
59 return (
meters_t){ .value = mm.value / 1000.0f };
64 return (
meters_t){ .value = in.value * 0.0254f };
69 return (
meters_t){ .value = ft.value * 0.3048f };
74 return (
meters_t){ .value = mi.value * 1609.34f };
77#define meters_from(x) _Generic((x), \
78 centimeters_t: meters_from_centimeters, \
79 millimeters_t: meters_from_millimeters, \
80 inches_t: meters_from_inches, \
81 feet_t: meters_from_feet, \
82 miles_t: meters_from_miles \
90typedef struct {
float value; }
days_t;
93static_assert(
sizeof(
seconds_t) ==
sizeof(float));
94static_assert(
sizeof(
minutes_t) ==
sizeof(float));
95static_assert(
sizeof(
hours_t) ==
sizeof(float));
96static_assert(
sizeof(
days_t) ==
sizeof(float));
100 return (
seconds_t){ .value = ms.value / 1000.0f };
105 return (
seconds_t){ .value = min.value * 60.0f };
110 return (
seconds_t){ .value = hr.value * 3600.0f };
115 return (
seconds_t){ .value = d.value * 86400.0f };
118#define seconds_from(x) _Generic((x), \
119 milliseconds_t: seconds_from_milliseconds, \
120 minutes_t: seconds_from_minutes, \
121 hours_t: seconds_from_hours, \
122 days_t: seconds_from_days \
129static_assert(
sizeof(
degrees_t) ==
sizeof(float));
130static_assert(
sizeof(
radians_t) ==
sizeof(float));
134 return (
radians_t){ .value = deg.value * PI_F / 180.0f };
139 return (
degrees_t){ .value = rad.value * 180.0f / PI_F };
147static_assert(
sizeof(
grams_t) ==
sizeof(float));
148static_assert(
sizeof(
kilograms_t) ==
sizeof(float));
149static_assert(
sizeof(
pounds_t) ==
sizeof(float));
153 return (
kilograms_t){ .value = g.value / 1000.0f };
158 return (
kilograms_t){ .value = lb.value * 0.453592f };
161#define kilograms_from(x) _Generic((x), \
162 grams_t: kilograms_from_grams, \
163 pounds_t: kilograms_from_pounds \
168typedef struct {
float value; }
psi_t;
169typedef struct {
float value; }
bar_t;
171static_assert(
sizeof(
pascals_t) ==
sizeof(float));
172static_assert(
sizeof(
psi_t) ==
sizeof(float));
173static_assert(
sizeof(
bar_t) ==
sizeof(float));
177 return (
pascals_t){ .value = p.value * 6894.75729f };
182 return (
pascals_t){ .value = b.value * 100000.0f };
187 return (
psi_t){ .value = p.value / 6894.75729f };
192 return (
bar_t){ .value = p.value / 100000.0f };
196typedef struct {
float value; }
mps_t;
197typedef struct {
float value; }
kph_t;
198typedef struct {
float value; }
mph_t;
200static_assert(
sizeof(
mps_t) ==
sizeof(float));
201static_assert(
sizeof(
kph_t) ==
sizeof(float));
202static_assert(
sizeof(
mph_t) ==
sizeof(float));
206 return (
mps_t){ .value = k.value / 3.6f };
211 return (
mps_t){ .value = m.value * 0.44704f };
216 return (
kph_t){ .value = m.value * 3.6f };
221 return (
mph_t){ .value = m.value / 0.44704f };