Added gallons and gallons per minute

This commit is contained in:
Zachary Levy
2026-06-17 10:38:14 -07:00
parent 61d94265dd
commit 3f39cc31a6
2 changed files with 104 additions and 10 deletions
+42
View File
@@ -2,6 +2,8 @@ package quantity
import "base:intrinsics"
LITERS_PER_GALLON :: 3.785411784
//----- Liters ----------------------------------
Liters :: struct($V: typeid) where intrinsics.type_is_numeric(V) {
v: V,
@@ -14,6 +16,13 @@ liters_to_milli_liters :: #force_inline proc "contextless" (
return Milli_Liters(V){liters.v * MILLI}
}
@(private = "file")
liters_to_gallons :: #force_inline proc "contextless" (
liters: Liters($V),
) -> Gallons(V) where intrinsics.type_is_float(V) {
return Gallons(V){liters.v / LITERS_PER_GALLON}
}
//----- Milliliters ----------------------------------
Milli_Liters :: struct($V: typeid) where intrinsics.type_is_numeric(V) {
v: V,
@@ -26,17 +35,34 @@ milli_liters_to_liters :: #force_inline proc "contextless" (
return Liters(V){milli_liters.v / MILLI}
}
//----- Gallons ----------------------------------
Gallons :: struct($V: typeid) where intrinsics.type_is_numeric(V) {
v: V,
}
@(private = "file")
gallons_to_liters :: #force_inline proc "contextless" (
gallons: Gallons($V),
) -> Liters(V) where intrinsics.type_is_float(V) {
return Liters(V){gallons.v * LITERS_PER_GALLON}
}
// ---------------------------------------------------------------------------------------------------------------------
// ----- Conversion Overloads ------------------------
// ---------------------------------------------------------------------------------------------------------------------
to_liters :: proc {
milli_liters_to_liters,
gallons_to_liters,
}
to_milli_liters :: proc {
liters_to_milli_liters,
}
to_gallons :: proc {
liters_to_gallons,
}
// ---------------------------------------------------------------------------------------------------------------------
// ----- Tests ------------------------
// ---------------------------------------------------------------------------------------------------------------------
@@ -57,3 +83,19 @@ test_milli_liters_to_liters :: proc(t: ^testing.T) {
testing.expect_value(t, liters, Liters(int){12})
}
@(test)
test_gallons_to_liters :: proc(t: ^testing.T) {
gallons := Gallons(f32){1}
liters := to_liters(gallons)
testing.expect(t, liters.v > 3.78 && liters.v < 3.79)
}
@(test)
test_liters_to_gallons :: proc(t: ^testing.T) {
liters := Liters(f32){3.785411784}
gallons := to_gallons(liters)
testing.expect(t, gallons.v > 0.99 && gallons.v < 1.01)
}
+52
View File
@@ -2,6 +2,58 @@ package quantity
import "base:intrinsics"
//----- Liters Per Minute ----------------------------------
Liters_Per_Minute :: struct($V: typeid) where intrinsics.type_is_numeric(V) {
v: V,
}
@(private = "file")
liters_per_minute_to_gallons_per_minute :: #force_inline proc "contextless" (
liters_per_minute: Liters_Per_Minute($V),
) -> Gallons_Per_Minute(V) where intrinsics.type_is_float(V) {
return Gallons_Per_Minute(V){liters_per_minute.v / LITERS_PER_GALLON}
}
//----- Gallons Per Minute ----------------------------------
Gallons_Per_Minute :: struct($V: typeid) where intrinsics.type_is_numeric(V) {
v: V,
}
@(private = "file")
gallons_per_minute_to_liters_per_minute :: #force_inline proc "contextless" (
gallons_per_minute: Gallons_Per_Minute($V),
) -> Liters_Per_Minute(V) where intrinsics.type_is_float(V) {
return Liters_Per_Minute(V){gallons_per_minute.v * LITERS_PER_GALLON}
}
// ---------------------------------------------------------------------------------------------------------------------
// ----- Conversion Overloads ------------------------
// ---------------------------------------------------------------------------------------------------------------------
to_liters_per_minute :: proc {
gallons_per_minute_to_liters_per_minute,
}
to_gallons_per_minute :: proc {
liters_per_minute_to_gallons_per_minute,
}
// ---------------------------------------------------------------------------------------------------------------------
// ----- Tests ------------------------
// ---------------------------------------------------------------------------------------------------------------------
import "core:testing"
@(test)
test_gallons_per_minute_to_liters_per_minute :: proc(t: ^testing.T) {
gallons_per_minute := Gallons_Per_Minute(f32){1}
liters_per_minute := to_liters_per_minute(gallons_per_minute)
testing.expect(t, liters_per_minute.v > 3.78 && liters_per_minute.v < 3.79)
}
@(test)
test_liters_per_minute_to_gallons_per_minute :: proc(t: ^testing.T) {
liters_per_minute := Liters_Per_Minute(f32){3.785411784}
gallons_per_minute := to_gallons_per_minute(liters_per_minute)
testing.expect(t, gallons_per_minute.v > 0.99 && gallons_per_minute.v < 1.01)
}