aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-03-01 12:06:47 -0500
committerSam Anthony <sam@samanthony.xyz>2025-03-01 12:06:47 -0500
commit89fd08ec37e6b3d5191d20c2e3d219579255d934 (patch)
treee076db554245ed076861017fd009df2598154ed2
parent9f475d92d1eeebf5f2ad7d0db5d96d92d655d111 (diff)
downloadvolute-89fd08ec37e6b3d5191d20c2e3d219579255d934.zip
unit conversion interfaces
-rw-r--r--ui.c21
-rw-r--r--unit.h10
2 files changed, 22 insertions, 9 deletions
diff --git a/ui.c b/ui.c
index 6f31e35..3fca1ae 100644
--- a/ui.c
+++ b/ui.c
@@ -13,17 +13,17 @@
static const char *const volume_units[] = {"cc", "l", "ci"};
-static Volume (*volume_converters[nelem(volume_units)])(double) = {
+static const VolumeMaker volume_makers[nelem(volume_units)] = {
cubic_centimetre, litre, cubic_inch,
};
static const char *const pressure_units[] = {"mbar", "kPa", "bar", "psi"};
-static Pressure (*pressure_converters[nelem(pressure_units)])(double) = {
+static const PressureMaker pressure_makers[nelem(pressure_units)] = {
millibar, kilopascal, bar, psi,
};
static const char *const volume_flow_rate_units[] = {"m³/s", "CFM"};
-static double (*volume_flow_rate_converters[nelem(volume_flow_rate_units)])(VolumeFlowRate) = {
+static VolumeFlowRateReader volume_flow_rate_readers[nelem(volume_flow_rate_units)] = {
as_cubic_metre_per_sec, as_cubic_foot_per_min,
};
@@ -51,12 +51,13 @@ init_ui(UI *ui) {
void
set_displacement(UI *ui) {
int idx, i;
- Volume (*convert)(double), disp;
+ VolumeMaker convert;
+ Volume disp;
idx = ui->displacement_unit.idx;
assert(idx >= 0 && (long unsigned int) idx < nelem(volume_units));
- convert = volume_converters[idx];
+ convert = volume_makers[idx];
disp = convert(ui->displacement.value);
for (i = 0; i < ui->npoints; i++) {
@@ -67,12 +68,13 @@ set_displacement(UI *ui) {
void
set_map(UI *ui, int idx) {
int unit_idx;
- Pressure (*convert)(double), p;
+ PressureMaker convert;
+ Pressure p;
unit_idx = ui->map_unit.idx;
assert(unit_idx >= 0 && (long unsigned int) unit_idx < nelem(pressure_units));
- convert = pressure_converters[unit_idx];
+ convert = pressure_makers[unit_idx];
p = convert(ui->map[idx].value);
ui->points[idx].map = p;
}
@@ -85,12 +87,13 @@ set_ve(UI *ui, int idx) {
void
set_volume_flow_rate(UI *ui, int idx) {
int unit_idx;
- double (*convert)(VolumeFlowRate), v;
+ VolumeFlowRateReader convert;
+ VolumeFlowRate v;
unit_idx = ui->volume_flow_rate_unit.idx;
assert(unit_idx >= 0 && (long unsigned int) unit_idx < nelem(volume_flow_rate_units));
- convert = volume_flow_rate_converters[unit_idx];
+ convert = volume_flow_rate_readers[unit_idx];
v = convert(volume_flow_rate(&ui->points[idx]));
snprintf(ui->volume_flow_rate[idx], sizeof(ui->volume_flow_rate[idx]), "%lf", v);
}
diff --git a/unit.h b/unit.h
index 27998fd..5febcd1 100644
--- a/unit.h
+++ b/unit.h
@@ -1,4 +1,6 @@
typedef double AngularSpeed;
+typedef AngularSpeed (*AngularSpeedMaker)(double);
+typedef double (*AngularSpeedReader)(AngularSpeed);
AngularSpeed rad_per_sec(double x);
AngularSpeed deg_per_sec(double x);
@@ -9,12 +11,16 @@ double as_rpm(AngularSpeed x);
typedef double Fraction;
+typedef Fraction (*FractionMaker)(double);
+typedef double (*FractionReader)(Fraction);
Fraction percent(double x);
double as_percent(double x);
typedef double Pressure;
+typedef Pressure (*PressureMaker)(double);
+typedef double (*PressureReader)(Pressure);
Pressure pascal(double x);
Pressure millibar(double x);
@@ -29,6 +35,8 @@ double as_psi(Pressure x);
typedef double Volume;
+typedef Volume (*VolumeMaker)(double);
+typedef double (*VolumeReader)(Volume);
Volume cubic_centimetre(double x);
Volume litre(double x);
@@ -41,6 +49,8 @@ double as_cubic_inch(double x);
typedef double VolumeFlowRate;
+typedef VolumeFlowRate (*VolumeFlowRateMaker)(double);
+typedef double (*VolumeFlowRateReader)(VolumeFlowRate);
VolumeFlowRate cubic_metre_per_sec(double x);
VolumeFlowRate cubic_metre_per_min(double x);