This release adds one new quantity, MolarHeatCapacity
, a new trait, ConstZero
, and many internal
improvements. The quickcheck
1.0 update uncovered a number of issues with floating point precision
that were able to be resolved while still maintaining zero-cost guarantees.
Many thanks to adamreichold, B-Reif, remilauzier, and T-Bakker for pull requests included and issues resolved in this release.
- #258 Use
RUSTFLAGS="-D warnings"
in CI to ensure thatrustc
warnings and caught and fail their respective workflows. - [Breaking] Rename
Conversion::into_conversion
toConversion::conversion
. Name change resolvesClippy
wrong_self_convention
warnings. - #260 Increase minimum supported
rustc
version to 1.43.0. Required to supportquickcheck
1.0. - #260 Update to
quickcheck
1.0. Change required the MSRV update as well as refactoringfrom_base
,to_base
, and multiple tests. Thefrom_base
andto_base
changes provide better floating point precision while still maintaining zero-cost guarantees. The test changes better handle floating point precision issues as well as the wider range of values generated byquickcheck
1.0'sArbitrary
implementation. - #268 Clarify
powi
documentation.
- #260 Deprecate
try-from
feature. The feature will be removed in a future release ofuom
. Functionality previously exposed by the feature is now enabled by default.
- #252 Fix links within the documentation to use https. Many previously used http and were broken.
- #260 Fix
TryFrom<Duration> for Time<U, V>
. Previously the conversion used theDuration
's subsecond microseconds as nanoseconds. The conversion now correct uses the subsecond nanoseconds.
v0.31.1 — 2021-03-01
This release corrects documentation issues and documents fewer underlying storage types on docs.rs so that container time and memory limits are not exceeded.
- #241 Run
rustdoc
as part of tool checks and resolve previously ignored warnings.
- #241 Document fewer underlying storage types on docs.rs so that container time and memory limits are not exceeded. Previous releases documented all features and caused documentation to fail to build.
v0.31.0 — 2021-01-05
This release adds a new macro, unit!
, to allow for units to be defined outside of the
quantity!
macro as well as a Units
enum for each quantity. A number of standard library
traits are implemented. Build regressions caused by issues with the CI system and changes in
Rust are now fixed.
Many thanks to bheisler, CreepySkeleton, DusterTheFirst, Lucretiel, and neoeinstein for pull requests included and issues resolved in this release.
- #173 Allow new units to be defined using
unit!
outside ofquantity!
. When using the pre-built SI system included withuom
this macro allows for new units to quickly be defined without requiring a release. Pull requests to add new units upstream area always greatly appreciated. - #215 Add
Units
enum andfn units() -> impl Iterator<Item = Units>
function for each quantity. - #227 Ensure
UnwindSafe
andRefUnwindSafe
are implemented. - #217 Add trait implementations for
Display
andError
toParseQuantityError
.
- #214 The
FromStr
implementation for quantities now supports the unit singular and plural descriptions in addition to the unit abbreviation. - #225 Convert CI to use Github Actions. This change fixes a number of problems with the old system and greatly improves build times.
- #223 Correct build regressions introduced while no test job was run with the old CI system.
v0.30.0 — 2020-10-17
This release adds a new quantity, RadiantExposure
, implements Unpin
for Quantity
and
upgrades uom
to the 2018 edition. These changes also include an increase of the minimum
supported rustc
to 1.37.0. Many thanks to nicodemus26 and
(Michael-F-Bryan)[https://github.com/Michael-F-Bryan] for pull requests included and issues
resolved in this release.
- #206 Upgrade
uom
to compile using the 2018 edition. Generated code still supports both the 2015 and 2018 edition. - #207 Increase minimum supported
rustc
version to 1.37.0. Required to support upgrading to the latest dependencies and to allow for the Kleene?
"at most one" repetition operator.
v0.29.0 — 2020-08-06
This release includes a number of changes for Angle
, the addition of SolidAngle
, and a new
units for Energy
and Luminance
. Many thanks to
adamreichold, AnickaBurova,
and Atmelfan for pull requests included and issues resolved in
this release.
- #196
SolidAngle
quantity added. - #191 Add constants to
Angle
andSolidAngle
representing half and full turns. - #194 Add
foot-candle
unit toLuminance
. - #200
electronvolt
-basedEnergy
units added.
- #192 Use
f{32|64}::powi
instead ofTypenum::Pow::powi
. - #123 Change examples to use
Display
instead ofDebug
.
- #188 [Breaking] Remove
From
/Into
impls forAngle
andSolidAngle
.
v0.28.0 — 2020-05-21
This release includes a number of trigonometric improvements as well as new units for Time
.
Many thanks to adamreichold and
Aehmlo for pull requests included and issues resolved in this
release.
- #182 Add inverse trigonometric functions to
Ratio
(acos
,acosh
,asin
,asinh
,atan
,atanh
) andAngle
(atan2
). - #184 Tropical and sidereal units added to
Time
.
- #186 Make
hypot
available for all quantities, not justLength
. - #187 [Breaking] Change trigonometric functions to
return
Ratio
instead of the underlying storage type so that identities likex.sin().asin() == x
are well-typed.
v0.27.0 — 2020-02-14
This release adds a number of quantities.
- #167
CatalyticActivity
,CatalyticActivityConcentration
,MassConcentration
, andMolarConcentration
quantities added. - #175
Curvature
quantity added.
v0.26.0 — 2019-11-04
This release adds a number of thermodynamic quantities in addition to TryFrom
implementations for
Time
and trigonometric functions on Angle
.
- #164
HeatFluxDensity
quantity added. - #155
HeatCapacity
,HeatTransfer
,MolarEnergy
,MolarMass
,SpecificHeatCapacity
,ThermalConductivity
quantities added. - #150
TryFrom
implemented betweenstd::time::Duration
anduom::si::Time
. - #151 Trigonometric functions added to
Angle
.
- Increase minimum supported
rustc
version to 1.31.0. Required to because of backwards incompatibilities withCargo.toml
edition
keyword.cfg-if
introducted the keyword in a minor version update and other issues with the keyword prompted the update.
v0.25.0 — 2019-08-12
This release includes the long-requested Information
and InformationRate
quantities as well as
support for i128
/u128
as underlying storage types. A number of documentation updates, including
for the 9th edition of the SI, are also included.
- #31
Information
(bit
,byte
, ...) andInformationRate
(bit/s
,byte/s
, ...) quantities added. Units for both SI (kilo
,mega
, ...) and binary (kibi
,mebi
, ...) prefixes are included. - #85 Add support for
i128
andu128
as underlying storage types. - #160
AngularJerk
quantity added.
- #20 Document generic parameters.
- #21 Move links inline for trait methods to work around documentation generation bug.
- #111 Update documentation for SI base units for the 9th edition of the SI.
- #127 Remove superscripts for power 1 to keep all SI documentation consistent.
v0.24.0 — 2019-06-20
This release fixes two separate issues to ensure that zero-cost code is generated. Many thanks to raimundomartins, apopiak, and gnzlbg for pull requests included and issues resolved in this release.
- #145 Add
#[repr(transparent)]
toQuantity
to ensure that the ABI of the underlying storage type is used instead of struct ABI in FFI contexts.
- #148 Increase minimum supported
rustc
version to 1.28.0. Required to support#[repr(transparent)]
.
- #143 Correct
to_base
andfrom_base
to be zero-cost for float storage types. - #147 Correct typos in README and crate-level documentation.
v0.23.1 — 2019-05-29
This release fixes an issue with the autoconvert
feature introduced in v0.23.0. Many thanks to
dmit for pull requests included in this release.
- #141
From
implementations to convert between quantities of different kinds now correctly use theautoconvert
feature and no longer cause a compile error when the feature is disabled.
v0.23.0 — 2019-05-13
This release adds three new quantities, AngularAcceleration
, AngularVelocity
, and Torque
.
Changes to make Kind
s more ergonomic to use are also included along with documentation changes.
Many thanks to dunmatt and Aehmlo for
pull requests included in this release.
- #136
AngularAcceleration
quantity added. - #135
AngularVelocity
quantity added. - #117
Torque
quantity added. - Introduce
AngleKind
andsi::marker
to hold SI specific marker traits.From
implementations forAngleKind
added to more easily convert betweenuom::Kind
andsi::marker::AngleKind
. - Allow documentation to be specified for base quantities in the
system!
macro. Documentation for the seven base SI quantities added.
- #138 Maintain kind when multiplying a number by a quantity. Multiplying a quantity by a number already maintains kind.
- #130 Rename
Density
toMassDensity
. A type alias forDensity
is available for backwards compatibility. - #127 Make all SI quantity documentation follow a single, consistent format.
- #130
Density
has been renamed toMassDensity
and is deprecated.Density
will be removed in some future release.
v0.22.2 — 2019-04-28
This release adds Angle
and Jerk
quantities along with unit additions and conversion precision
improvements to Acceleration
and Velocity
. Many thanks to dunmatt
and nicodemus26 respectively.
- #89
Angle
quantity added. - #128
Jerk
quantity added.Acceleration
andVelocity
units added and precision for some existing units improved.
- Continuous integration setup updated and improved.
- Rust 1.34.0 is now used for
rustfmt
,clippy
, andtarpaulin
jobs. rustfmt
configuration updated.clippy
configuration corrected to run for all packages.
- Rust 1.34.0 is now used for
v0.22.1 — 2019-04-02
This release adds additional liter
-based VolumeRate
units.
- #121
Liter
-basedVolumeRate
units added.
v0.22.0 — 2019-03-30
This release adds the Momentum
quantity and additional liter
-based volume
units.
- Continuous integration setup updated and improved.
- Rust 1.33.0 is now used for
rustfmt
,clippy
, andtarpaulin
jobs. - The deny warnings job is joined into the
clippy
job. - The stable + tests job has been updated to catch errors with non-default underlying storage types in SI quantity tests.
- Rust 1.33.0 is now used for
- #119 Macros corrected to generate valid code
for both 2015 and 2018 editions. Previously the doc test on the
$quantities!
macro would fail in a Rust 2018 crate. A new test crate,edition_check
, was added to ensureuom
remains usable in Rust 2018 code.
v0.21.1 — 2019-03-03
This release adds a few new units for ElectricCharge
and Energy
.
- #112 Additional
ElectricCharge
andEnergy
units added.
v0.21.0 — 2019-01-13
This release adds display tools for quantities resolving another long-standing issue, #13.
- #13 Add display tools for quantities. Allows
Quantity
to be formatted with the standard library formatting traits:Binary
,Debug
,Display
,LowerExp
,LowerHex
,Octal
,UpperExp
,UpperHex
.
- Improve continuous integration setup.
- Update
clippy
andrustfmt
jobs to use the now stable non-preview
components. - Run OSX and Windows builds on TravisCI.
- Improve individual job build time by reducing unnecessary cached data.
- Update
v0.20.1 — 2018-09-13
This release resolves nightly rustc error E0659 the base.rs example caused by rust-lang/rust pull request #52841 "resolve: Implement prelude search for macro paths, implement tool attributes."
v0.20.0 — 2018-09-06
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.
- #3 Implement thermodynamic temperature
conversions (e.g. Celsius to Fahrenheit). Extend the
quantity!
macro to accept a coefficient and optional constant factor in the$conversion
parameter to support these conversions. - #14 Implement
FromStr
. - #78 Add a
Kind
associated type toDimensions
.The newKind
associated type, defaulting touom::Kind
, allows for multiple quantities that have the same dimensions. Quantities of different kinds are not comparable. The marker traits implemented by a quantity'sKind
control which operations are automatically implemented. - #95
TemperatureInterval
quantity added. IncludesAdd
,AddAssign
,Sub
, andSubAssign
implementations between thermodynamic temperature and temperature interval.
- [Breaking] Remove unused
_unit: N
parameters and require turbofish syntax forget
,floor
,ceil
,round
,trunc
, andfract
methods ofQuantity
. This is a breaking change and can easily be resolved. e.g.l.get(meter)
becomesl.get::<meter>()
. - #98,
#100 Correct
uom
feature hygiene in macro generated code. Previously thesystem!
macro generated code that included#[cfg(feature = "...")]
attributes on code in the crate executing thesystem!
macro. With this fix these attributes will be eagerly evaluated and only generate code when the appropriateuom
feature is enabled. - Spelling corrections for a number of documentation comments and unit abbreviations.
v0.19.0 — 2018-06-21
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.ElectricCharge
quantity added.ElectricalConductance
quantity added.ElectricalResistance
quantity added.Inductance
quantity added.Luminance
quantity added.MagneticFluxDensity
quantity added.MagneticFlux
quantity added.
- #57
num
sub-cratesnum-traits
,num-rational
, andnum-bigint
are now directly referenced to control feature selection.std
,rational
, andbigint
support are only included based onuom
feature selection. - #80 Setup
rustfmt
so thatuom
code can be automatically formatted and builds are gated on changes not breaking formatting conventions.
v0.18.0 — 2018-05-10
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.
- #54 [Breaking] Add an
autoconvert
feature, enabled by default, which allows for operations between quantities with different base units.autoconvert
enabled is the same functionality as prior versions ofuom
. 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 onceconst fn
and specialization are stabilized. - #61 [Breaking] The
storage_types!
macro now always uses underlying storage type features from theuom
crate instead of the crate where the macro is executed. - #2 Additional
Mass
units added. - #5 Additional
Velocity
units added. - #6 Additional
Area
units added. - #7 Additional
Volume
units added. - #8 Additional
Force
units added. - #9 Additional
Acceleration
units added. - #30 Additional
Frequency
units added. - #64
Ratio
(dimensionless) quantity added. IncludesFrom<Ratio> for V
andFrom<V> for Ratio
implementations to allow for easy conversions betweenRatio
and the underlying storage type. - #66
Energy
quantity added. - #67
AvailableEnergy
quantity added. - #68
Density
quantity added. - #69
Power
quantity added. - #70
Pressure
quantity added. - #71
MassRate
quantity added. - #72
VolumeRate
quantity added. - #74
ElectricPotential
quantity added. - #75 Additional
ElectricCurrent
units added.
- #52 Type aliases generated by the
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. - Dimension documentation for
ElectricCurrent
corrected to no longer referencesAmountOfSubstance
and units smaller thanmilliampere
have corrected abbreviations and descriptions.
- #15 [Breaking] Remove
Product
implementation forQuantity
. The product of a quantity is not that same quantity. e.g.Length * Length = Area
.
v0.17.0 — 2018-03-14
This release implements a number of common traits from the standard library, the
num
crate, and the
serde
crate.
- #16 Implement
Default
. - #17 Implement
PartialEq
. - #50 Implement
Eq
. - #18 Implement
PartialOrd
. - #51 Implement
Ord
. - #56 Implement
Sum
. - #15 Implement
Product
. - #26 Implement
num::Zero
. - #35 Implement
num::Saturating
. - #37 Implement
serde::Serialize
andserde::Deserialize
. Disabled by default. Enabled with theuse_serde
feature.
v0.16.0 — 2017-12-21
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.
- Add missing
#[derive(Hash)]
attributes. - #29 A new macro,
storage_types!
, is now available to duplicate code on a per-storage type basis. See macro documentation for full details. The minimum supportedrustc
version is now 1.20.0.
- #29 Underlying storage type now uses the
Num
trait from thenum
crate instead of fixed implementations forf32
andf64
. Features for all types implementingNum
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
, andf64
. For compile time reasons onlyf32
andf64
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. - #29 [Breaking] Traits and structs generated by
the
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 onV
and contains associated types for base units.Conversion<V>
has been removed and replaced withuom::Conversion<V>
.$quantities<...>
has been removed. Quantity dimensions are now directly in theDimension
trait.BaseUnits<...>
has been removed. Base units are not directly in theUnits<V>
trait.uom::Conversion<V>
added to replaceConversion<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 asRational32
.)
- [Breaking] Macro usage and definitions have been simplified and consolidated.
quantities!
,replace_ty!
, andunit!
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 thesi
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 theunits
block of thesystem!
macro must always be prefixed by the quantity's module (e.g.length::Length
). Prefixing the module with themod
keyword instructs thesystem!
macro not to generate a#[macro_use] pub mod $module;
statement.
v0.15.0 — 2017-07-05
This release adds additional Time
units; Frequency
, Force
, and Volume
quantities; and
numerous floating point methods such as min
, max
, and powi
.
- #4 Additional
Time
units added. - Add missing
giga
units. e.g.gigameter
. - #11 Add floating point classification methods
classify
,is_finite
,is_infinte
,is_nan
, andis_normal
forQuantity
. - #11 Add floating point fractional methods
floor
,ceil
,round
,trunc
, andfract
forQuantity
. - #11 Add floating point comparison methods
max
andmin
forQuantity
. - #11 Add floating point
mul_add
method forQuantity
. - #11 Add floating point
powi
method forQuantity
. - #7
Volume
quantity added. Additional units still need to be added. - #8
Force
quantity added. Additional units still need to be added. - #30
Frequency
quantity added. Additional units still need to be added.
v0.14.0 — 2017-05-30
- [Breaking] A new feature,
std
, is now available and is enabled by default.uom
can still be compiled withno_std
by using--no-default-features
when compiling the crate ordefault-features = false
in thedependencies
section ofCargo.toml
- #11
cbrt
,recip
, andsqrt
are implemented forQuantity
.
- #28
Quantity
fields made public in order to allow library users to createconst
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 theconst fn
feature is stabilized. - Tests now run for all enabled underlying storage types (
f32
,f64
).
- Fixed incorrect conversion factor when multiplying or dividing
Quantity
s with different base units.
v0.13.0 — 2017-04-20
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.
- #6
Area
quantity added. Additional units still need to be added. - #9
Acceleration
quantity added. Additional units still need to be added.
- [Breaking] Remove the unused
_unit
parameter fromQuantity::new
and so summon the turbofish. e.g.Length::new(1.0, meter)
becomesLength::new::<meter>(1.0)
. - #22 Change
impl Debug
forQuantity
to use precision information. Previously the implementation checked thealternate
flag which has no affect on printing raw floats. - #27 Change superscripts in documentation to the
format supported by
pulldown
in anticipation of upcommingrustdoc
changes.
- #22 Fix
impl Sub
forQuantity
to be implemented in terms of-
instead of+
.
v0.12.0 — 2017-04-01
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.
- #1 Additional
Length
units added. - [Breaking] The
quantity!
macro accepts comments on units. To resolve macro parsing ambiguities each unit must be prefixed with an@
. - #19 [Breaking] The
quantity!
macro includes the quantity description. The description can be accessed using thedescription()
method in quantity submodules. - #19 [Breaking] The
quantity!
macro includes unit abbreviations as well as singular and plural descriptions. These values can be accessed from newabbreviation()
,singular()
, andplural()
methods on theUnit
trait. The originalUnit<V>
trait has been renamedConversion<V>
. - #12
Debug
manually implemented forQuantity<D, U, V>
to show the underlying value and associated units. - Test and compile-fail test modules setup. compile-fail tests for mismatched quantities and units added.
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.