mp-units - A Units Library for C++
Summary
Units is a compile-time enabled Modern C++ library that provides compile-time dimensional
analysis and unit/quantity manipulation. The basic idea and design heavily bases on
std::chrono::duration and extends it to work properly with many dimensions.
Here is a small example of possible operations:
// simple numeric operations
static_assert(10_km / 2 == 5_km);
// unit conversions
static_assert(1_h == 3600_s);
static_assert(1_km + 1_m == 1001_m);
// dimension conversions
static_assert(1_km / 1_s == 1000_mps);
static_assert(2_kmph * 2_h == 4_km);
static_assert(2_km / 2_kmph == 1_h);
static_assert(1000 / 1_s == 1_kHz);
static_assert(10_km / 5_km == 2);
Repository structure
That repository contains the following independent cmake-based projects:
./src- header-only project forunits.- project used for development needs that wraps./srcproject together with usage examples and unit tests./test_package- library installation and Conan package verification
Please note that the projects depend on cmake git submodule in the ./cmake/common
subdirectory.
Building, testing, and installation
For a detailed information on project compilation, testing and reuse please refer to doc/INSTALL.md.
NOTE: This library as of now compiles correctly only with gcc-9.1 and newer.
Library design
units library design rationale and documentation can be found in
doc/DESIGN.md
Release notes
-
0.3.0 Sep 16, 2019 (CppCon 2019 release)
- Applied the feedback from the Cologne evening session
upcasting_traitsrenamed todowncasting_traitsDimensiontemplate parameter removed from quantity
unitsmoved to astd::experimentalnamespace- Leading underscore prefix removed from UDLs
- Added a few more derived dimensions
meterrenamed tometre- Missing
operator*added - Predefined dimensions moved to a dedicated directory
dimension_prefix removed from names of derived dimensions- cmcstl2 library updated to 2019.09.19
base_dimensionis a value provided asconst&to theexptype- integrated with Compiler Explorer
- gsl-lite deppendency removed
- Fractional dimension exponents support added
QuantityOfconcept introducedquantity_cast<U, Rep>()support added
- Applied the feedback from the Cologne evening session
-
0.2.0 July 18, 2019
- Added C++20 features supported by gcc-9.1 (std::remove_cvref_t, down with typename, std::type_identity)
- The design as described on C++Now 2019 talk (https://youtu.be/wKchCktZPHU)
- Compile-time performance optimisations (type_list, common_ratio, ratio, conditional_t)
-
0.1.0 May 18, 2019
- Initial library release
- Begin semantic versioning
- The last version to work with gcc-8