typed-measurements

A library for handling physical measurements with units.


Licenses
MIT/Apache-2.0

Documentation

measurements

A Rust library for type-safe physical measurements, units, SI prefixes, and ranges.

Features

  • 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)

Example

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());

Units

  • Volt (Volt)
  • Ampere (Ampere)
  • Watt (Watt)
  • Second (Second)
  • Hertz (Hertz)
  • (Easily extensible via the Uom trait and derive macro)

Prefixes

Supports SI prefixes: Tera, Giga, Mega, Kilo, None, Milli, Micro, Nano, Femto.

Ranges

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));

Percentage

let p = percentage!(0.25);
assert_eq!(p.get_value(), 0.25);

Crate Structure

  • 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

Usage

Add to your Cargo.toml:

[dependencies]
measurements = { path = "." }
ndarray = { version = "0.15", features = ["serde", "rayon"] }
serde = { version = "1.0", features = ["derive"] }

License

MIT


See the documentation for more details and examples.