A Rust library for type-safe physical measurements, units, SI prefixes, and ranges.
- Type-safe measurements with units and SI prefixes
-
One- and two-dimensional arrays of measurements (
M1d
,M2d
) -
Range types for measurements with min, max, and step (
RangedMeasurement
) - Percentage type for expressing proportions
- Prefix arithmetic and conversions
-
Custom derive macro for units of measurement (
Uom
) - Serde support for serialization/deserialization
-
Parallel operations on arrays (with
ndarray
+rayon
)
use typed_measurements::prelude::*;
let voltage = Measurement::<Volt>::new(5.0, Prefix::Milli); // 5 mV
let current = Measurement::<Ampere>::new(2.0, Prefix::None); // 2 A
let arr = M1d::<Volt>::new(vec![1.0, 2.0, 3.0], Prefix::Milli);
println!("{:?}", arr.values());
- Volt (
Volt
) - Ampere (
Ampere
) - Watt (
Watt
) - Second (
Second
) - Hertz (
Hertz
) - (Easily extensible via the
Uom
trait and derive macro)
Supports SI prefixes: Tera, Giga, Mega, Kilo, None, Milli, Micro, Nano, Femto.
let range = RangedMeasurement::<Volt>::new(0.0, 10.0, 0.5, Prefix::None);
assert!(range.is_in_range(Measurement::new(5.0, Prefix::None), None));
let p = percentage!(0.25);
assert_eq!(p.get_value(), 0.25);
-
measurement.rs
— Scalar measurements -
m1d.rs
,m2d.rs
— 1D and 2D arrays of measurements -
ranged_measurement.rs
— Ranges for measurements -
percentage.rs
— Percentage type and macro -
prefix.rs
— SI prefix enum and arithmetic -
uom.rs
— Units of measurement trait and types -
prelude.rs
— Convenient re-exports
Add to your Cargo.toml
:
[dependencies]
measurements = { path = "." }
ndarray = { version = "0.15", features = ["serde", "rayon"] }
serde = { version = "1.0", features = ["derive"] }
MIT
See the documentation for more details and examples.