Units of measurement -- type-safe zero-cost dimensional analysis
APACHE-2.0 License
Published by iliekturtles over 5 years ago
This release adds display tools for quantities resolving another long-standing issue, #13.
Quantity
to be formatted with the standard library formatting traits: Binary
, Debug
, Display
, LowerExp
, LowerHex
, Octal
, UpperExp
, UpperHex
.clippy
and rustfmt
jobs to use the now stable non -preview
components.Published by iliekturtles about 6 years ago
This release resolves nightly rustc error E0659 in the base.rs example caused by rust-lang/rust pull request #52841 "resolve: Implement prelude search for macro paths, implement tool attributes."
Published by iliekturtles about 6 years ago
This release adds a number of additional quantities, configures uom
to use rustfmt
, and directly references num
sub-crates to better control feature selection.
Capacitance
quantity added.ElectricalCharge
quantity added.ElectricalConductance
quantity added.ElectricalResistance
quantity added.Inductance
quantity added.Luminance
quantity added.MagneticFluxDensity
quantity added.MagneticFlux
quantity added.num
sub-crates num-traits
, num-rational
, and num-bigint
are now directly referenced to control feature selection. std
, rational
, and bigint
support are only included based on uom
feature selection.rustfmt
so that uom
code can be automatically formatted and builds are gated on changes not breaking formatting conventions.Published by iliekturtles about 6 years ago
This release resolves long-standing issue #3 to implement thermodynamic temperature conversions (e.g. Celsius to Fahrenheit). Support is also added for multiple quantities of the same dimension (e.g. thermodynamic temperature and temperature interval, ratio and angle).
The release also contains a number of internal changes including a reorganization of tests into multiple files and updated CI setup to provide faster builds and more feature test coverage.
quantity!
macro to accept a coefficient and optional constant factor in the $conversion
parameter to support these conversions.FromStr
.Kind
associated type to Dimensions
.The new Kind
associated type, defaulting to uom::Kind
, allows for multiple quantities that have the same dimensions. Quantities of different kinds are not comparable. The marker traits implemented by a quantity's Kind
control which operations are automatically implemented.TemperatureInterval
quantity added. Includes Add
, AddAssign
, Sub
, and SubAssign
implementations between thermodynamic temperature and temperature interval._unit: N
parameters and require turbofish syntax for get
, floor
, ceil
, round
, trunc
, and fract
methods of Quantity
. This is a breaking change and can easily be resolved. e.g. l.get(meter)
becomes l.get::<meter>()
.uom
feature hygiene in macro generated code. Previously the system!
macro generated code that included #[cfg(feature = "...")]
attributes on code in the crate executing the system!
macro. With this fix these attributes will be eagerly evaluated and only generate code when the appropriate uom
feature is enabled.Published by iliekturtles over 6 years ago
This release contains a significant number of new quantities and units, compile time improvements, and a few bug fixes. See below for full details. Many thanks to Aehmlo for all of the new quantities and units. radix for the autoconvert
feature. Nemo157 for hygiene fixes in the storage_types!
macro.
autoconvert
feature, enabled by default, which allows for operations between quantities with different base units. autoconvert
enabled is the same functionality as prior versions of uom
. Disabling the feature only allows for quantities with the same base units to directly interact. The feature has been added to account for current compiler limitations where zero-cost code is not generated for non-floating point underlying storage types. With the feature disabled more optimal code will be generated for integral types. This feature will likely have no effect and subsequently be deprecated and removed once const fn
and specialization are stabilized.storage_types!
macro now always uses underlying storage type features from the uom
crate instead of the crate where the macro is executed.Mass
units added.Velocity
units added.Area
units added.Volume
units added.Force
units added.Acceleration
units added.Frequency
units added.Ratio
(dimensionless) quantity added. Includes From<Ratio> for V
and From<V> for Ratio
implementations to allow for easy conversions between Ratio
and the underlying storage type.Energy
quantity added.AvailableEnergy
quantity added.Density
quantity added.Power
quantity added.Pressure
quantity added.MassRate
quantity added.VolumeRate
quantity added.ElectricPotential
quantity added.ElectricCurrent
units added.storage_type!
macro are now public. e.g. pub type V = f32;
. This change drastically reduces compile times, especially when multiple underlying storage types are enabled.ElectricCurrent
corrected to no longer references AmountOfSubstance
and units smaller than milliampere
have corrected abbreviations and descriptions.Product
implementation for Quantity
. The product of a quantity is not that same quantity. e.g. Length * Length = Area
.Published by iliekturtles over 6 years ago
This release implements a number of common traits from the standard library, the num
crate, and the serde
crate.
Default
.PartialEq
.Eq
.PartialOrd
.Ord
.Sum
.Product
.num::Zero
.num::Saturating
.serde::Serialize
andserde::Deserialize
. Disabled by default. Enabled with the use_serde
feature.Published by iliekturtles almost 7 years ago
This release contains significant changes in order to support underlying storage types that implement the Num
trait beyond f32
and f64
. Many changes are breaking: marker traits are simplified and fewer macros are exported. New storage types are not enabled by default and can be used by including the corresponding feature. See the changes below for full details.
#[derive(Hash)]
attributes.storage_types!
, is now available to duplicate code on a per-storage type basis. See macro documentation for full details. The minimum supported rustc
version is now 1.20.0.Num
trait from the num
crate instead of fixed implementations for f32
and f64
. Features for all types implementing Num
have been added and control the availability of the type as an underlying storage type: usize
, u8
, u16
, u32
, u64
, isize
, i8
, i16
, i32
, i64
, bigint
, biguint
, rational
, rational32
, rational64
, bigrational
, f32
, and f64
. For compile time reasons only f32
and f64
are enabled by default. Tests are implemented for all underlying storage types but don't account for minimum or maximum values and will fail for non-float types where the conversion factor overflows the type's limits. A future release will correct this.system!
macro have been significantly changed in order to support non-float underlying storage types.
Dimension
changed to directly include associated types for quantity dimensions.Units<V>
is now only parameterized on V
and contains associated types for base units.Conversion<V>
has been removed and replaced with uom::Conversion<V>
.$quantities<...>
has been removed. Quantity dimensions are now directly in the Dimension
trait.BaseUnits<...>
has been removed. Base units are not directly in the Units<V>
trait.uom::Conversion<V>
added to replace Conversion<V>
and gives access to a unit's conversion factor.uom::ConversionFactor<V>
added to represent conversion factors for underlying storage types where the type can't be used (e.g. i32
's conversion factor is represented as Rational32
.)quantities!
, replace_ty!
, and unit!
have been consolidated as "private" match arms of their calling macro. In order to reduce the chance of macro name collisions $quantities!
is the only remaining generated exported macro (e.g. ISQ!
for the si
system). Generated macros for each quantity no longer exist. These changes make it easier to have multiple systems containing quantities with the same names. In order to support this change quantities in the units
block of the system!
macro must always be prefixed by the quantity's module (e.g. length::Length
). Prefixing the module with the mod
keyword instructs the system!
macro not to generate a #[macro_use] pub mod $module;
statement.Published by iliekturtles over 7 years ago
This release adds additional Time
units; Frequency
, Force
, and Volume
quantities; and numerous floating point methods such as min
, max
, and powi
.
Time
units added.giga
units. e.g. gigameter
.classify
, is_finite
, is_infinte
, is_nan
, and is_normal
for Quantity
.floor
, ceil
, round
, trunc
, and fract
for Quantity
.max
and min
for Quantity
.mul_add
method for Quantity
.powi
method for Quantity
.Volume
quantity added. Additional units still need to be added.Force
quantity added. Additional units still need to be added.Frequency
quantity added. Additional units still need to be added.std
, is now available and is enabled by default. uom
can still be compiled with no_std
by using --no-default-features
when compiling the crate or default-features = false
in the dependencies
section of Cargo.toml
cbrt
, recip
, and sqrt
are implemented for Quantity
.Quantity
fields made public in order to allow library users to create const
values and instances of non-named quantities. e.g. const TIME_STEP: Time = Quantity { dimension: PhantomData, units: PhantomData, value: 0.1 };
This functionality will be deprecated and subsequently removed once the const fn
feature is stabilized.f32
, f64
).Quantity
s with different base units.Published by iliekturtles over 7 years ago
This release adds numerous tests both for code generated by the quantity!
, system!
, and $quantities!
macros as well as derived quantities. Fixes for issues found during testing noted below. Quantity implementations for Area
and Acceleration
also added.
Area
quantity added. Additional units still need to be added.Acceleration
quantity added. Additional units still need to be added._unit
parameter from Quantity::new
and so summon the turbofish. e.g. Length::new(1.0, meter)
becomes Length::new::<meter>(1.0)
.impl Debug
for Quantity
to use precision information. Previously the implementation checked the alternate
flag which has no affect on printing raw floats.pulldown
in anticipation of upcomming rustdoc
changes.impl Sub
for Quantity
to be implemented in terms of -
instead of +
.Published by iliekturtles over 7 years ago
Continuous integration was setup to ensure that uom
builds on stable, beta, nightly, and 1.15.0
(the minimum rustc
version). Quantity descriptions, unit abbreviations, and unit descriptions
added. Additional length units added to demonstrate the simplicity of the process.
Length
units added.quantity!
macro accepts comments on units. To resolve macro parsing ambiguities each unit must be prefixed with an @
.quantity!
macro includes the quantity description. The description can be accessed using the description()
method in quantity submodules.quantity!
macro includes unit abbreviations as well as singular and plural descriptions. These values can be accessed from new abbreviation()
, singular()
, and plural()
methods on the Unit
trait. The original Unit<V>
trait has been renamed Conversion<V>
.Debug
manually implemented for Quantity<D, U, V>
to show the underlying value and associated units.Published by iliekturtles over 7 years ago
Proof-of-concept functionality for type-safe zero-cost dimensional analysis.
uom
0.11.0 allows for the creation of custom systems or the use of the
pre-built SI. Basic mathematical operations are implemented and a minimal set
of quantities (length, mass, time...) and units (meter, kilometer, foot, mile,
...) are included.