2024-01-05 12:48:46 +01:00
<img align="right" height=135px src="docs/assets/images/mp-units-color.svg">
2024-01-05 12:40:25 +01:00
2023-06-16 10:16:05 +03:00
[](./LICENSE.md)
2024-05-30 20:42:20 +02:00
[](https://en.cppreference.com/w/cpp/compiler_support#cpp20 )
2023-03-22 16:20:12 +01:00
2024-05-30 20:14:30 +02:00
[](https://github.com/mpusz/mp-units/actions/workflows/ci-conan.yml)
[](https://github.com/mpusz/mp-units/actions/workflows/ci-test-package-cmake.yml)
[](https://github.com/mpusz/mp-units/actions/workflows/ci-clang-tidy.yml)
[](https://github.com/mpusz/mp-units/actions/workflows/ci-freestanding.yml)
[](https://github.com/mpusz/mp-units/actions/workflows/ci-formatting.yml)
2023-06-16 10:16:05 +03:00
[](https://github.com/mpusz/mp-units/actions?query=workflow%3ADocumentation+branch%3Amaster)
2023-03-22 16:20:12 +01:00
2023-03-22 10:15:43 +01:00
[](https://conan.io/center/mp-units)
2024-11-05 18:37:06 +01:00
[](https://mpusz.jfrog.io/ui/packages/conan:%2F%2Fmp-units/2.5.0)
2019-12-23 13:25:49 +01:00
2023-03-22 16:20:12 +01:00
2024-01-03 17:54:57 +01:00
# `mp-units` - The quantities and units library for C++
2018-08-22 12:11:19 +02:00
2023-10-25 14:13:00 +02:00
**The mp-units library might be the subject of ISO standardization for C++29. More on this can
be found in the following ISO C++ proposals:**
- [P1935: A C++ Approach to Physical Units ](https://wg21.link/p1935 ),
2023-12-09 20:10:06 +01:00
- [P2980: A motivation, scope, and plan for a quantities and units library ](https://wg21.link/p2980 ),
2024-04-19 23:33:32 +01:00
- [P3045: Quantities and units library ](https://wg21.link/p3045 ).
2023-10-25 14:13:00 +02:00
**We are actively looking for parties interested in field-trialing the library.**
2020-03-10 13:33:11 +01:00
2023-06-16 10:16:05 +03:00
[](https://gitpod.io/#https://github .com/mpusz/mp-units)
2021-10-01 11:27:01 +02:00
2023-08-16 06:41:54 +02:00
## Video Introduction
A brief introduction to the library's interfaces and the rationale for changes in the version 2.0
2023-08-28 21:04:33 +02:00
of **mp-units** were provided in detail by [Mateusz Pusz ](https://github.com/mpusz ) in the
2023-10-18 17:40:33 +02:00
["The Power of C++ Templates With mp-units: Lessons Learned & a New Library Design" talk at the C++ on Sea 2023 conference ](https://www.youtube.com/watch?v=eUdz0WvOMm0 ).
2023-08-16 06:41:54 +02:00
2020-03-10 13:33:11 +01:00
## Documentation
2023-06-21 10:55:18 +02:00
An extensive project documentation can be found on [mp-units GitHub Pages ](https://mpusz.github.io/mp-units ).
It includes installation instructions and a detailed user's guide.
2020-03-10 13:33:11 +01:00
2023-02-04 08:28:29 +01:00
## Terms and Definitions
This project uses the official metrology vocabulary defined by the ISO and BIPM.
Please familiarize yourself with those terms to better understand the documentation
and improve domain-related communication and discussions. You can find essential
2023-06-21 22:46:50 +02:00
project-related definitions in [our documentation's "Glossary" chapter ](https://mpusz.github.io/mp-units/latest/appendix/glossary ).
2023-02-04 08:28:29 +01:00
Even more terms are provided in the official vocabulary of the [ISO ](https://www.iso.org/obp/ui#iso:std:iso-iec:guide:99:ed-1:v2:en )
and [BIPM ](https://jcgm.bipm.org/vim/en ).
2023-08-16 06:41:54 +02:00
2019-12-17 09:15:31 +01:00
## TL;DR
2020-03-09 18:55:41 +01:00
`mp-units` is a compile-time enabled Modern C++ library that provides compile-time dimensional
2023-06-16 10:16:05 +03:00
analysis and unit/quantity manipulation.
2020-03-09 18:55:41 +01:00
Here is a small example of possible operations:
```cpp
2024-05-09 15:51:33 +02:00
#include <mp-units/systems/si.h>
2020-09-11 23:32:41 +02:00
2023-09-13 08:58:17 +02:00
using namespace mp_units ;
2023-06-16 10:16:05 +03:00
using namespace mp_units :: si :: unit_symbols ;
2020-09-11 23:32:41 +02:00
2020-03-09 18:55:41 +01:00
// simple numeric operations
2021-04-01 14:04:07 +02:00
static_assert ( 10 * km / 2 == 5 * km );
2020-03-09 18:55:41 +01:00
2024-01-23 21:49:17 +01:00
// conversions to common units
2021-04-01 14:04:07 +02:00
static_assert ( 1 * h == 3600 * s );
static_assert ( 1 * km + 1 * m == 1001 * m );
2020-03-09 18:55:41 +01:00
2023-09-13 08:58:17 +02:00
// derived quantities
2023-09-29 21:40:24 -06:00
static_assert ( 1 * km / ( 1 * s ) == 1000 * m / s );
static_assert ( 2 * km / h * ( 2 * h ) == 4 * km );
static_assert ( 2 * km / ( 2 * km / h ) == 1 * h );
2020-06-25 17:45:11 +02:00
2021-04-01 14:04:07 +02:00
static_assert ( 2 * m * ( 3 * m ) == 6 * m2 );
2020-06-25 17:45:11 +02:00
2023-09-13 08:58:17 +02:00
static_assert ( 10 * km / ( 5 * km ) == 2 * one );
2020-06-25 17:45:11 +02:00
2021-04-01 14:04:07 +02:00
static_assert ( 1000 / ( 1 * s ) == 1 * kHz );
2020-03-09 18:55:41 +01:00
```
2024-09-13 10:48:46 +02:00
_Try it on the [Compiler Explorer](https://godbolt.org/z/fT1r4sohs)._
2020-03-09 18:55:41 +01:00
2023-06-16 10:16:05 +03:00
This library heavily uses C++20 features (concepts, classes as NTTPs, ...). Thanks to
them the user gets a powerful but still easy to use interfaces and all unit conversions
and dimensional analysis can be performed without sacrificing on runtime performance or
accuracy. Please see the below example for a quick preview of basic library features:
2020-02-15 21:17:52 +00:00
2019-12-17 09:15:31 +01:00
```cpp
2024-05-09 15:51:33 +02:00
#include <mp-units/format.h>
#include <mp-units/ostream.h>
#include <mp-units/systems/international.h>
#include <mp-units/systems/isq.h>
#include <mp-units/systems/si.h>
2024-01-27 22:47:33 +01:00
#include <format>
2024-01-23 21:49:17 +01:00
#include <iomanip>
2019-12-17 10:12:17 +01:00
#include <iostream>
2024-01-27 22:47:33 +01:00
#include <print>
2019-12-17 10:12:17 +01:00
2023-06-16 10:16:05 +03:00
using namespace mp_units ;
2019-12-17 10:12:17 +01:00
2023-06-16 13:55:27 +03:00
constexpr QuantityOf < isq :: speed > auto avg_speed ( QuantityOf < isq :: length > auto d ,
QuantityOf < isq :: time > auto t )
2019-12-17 09:15:31 +01:00
{
return d / t ;
}
int main ()
{
2023-06-16 10:16:05 +03:00
using namespace mp_units :: si :: unit_symbols ;
using namespace mp_units :: international :: unit_symbols ;
2019-12-17 09:15:31 +01:00
2023-09-29 21:40:24 -06:00
constexpr quantity v1 = 110 * km / h ;
2023-09-13 08:58:17 +02:00
constexpr quantity v2 = 70 * mph ;
constexpr quantity v3 = avg_speed ( 220. * isq :: distance [ km ], 2 * h );
constexpr quantity v4 = avg_speed ( isq :: distance ( 140. * mi ), 2 * h );
constexpr quantity v5 = v3 . in ( m / s );
constexpr quantity v6 = value_cast < m / s > ( v4 );
constexpr quantity v7 = value_cast < int > ( v6 );
2020-12-29 11:45:38 +01:00
2024-01-23 21:49:17 +01:00
std :: cout << v1 << '\n' ; // 110 km/h
std :: cout << std :: setw ( 10 ) << std :: setfill ( '*' ) << v2 << '\n' ; // ***70 mi/h
std :: cout << std :: format ( "{:*^10} \n " , v3 ); // *110 km/h*
2024-02-26 14:36:49 +01:00
std :: println ( "{:%N in %U of %D}" , v4 ); // 70 in mi/h of LT⁻¹
2024-04-17 14:20:15 +01:00
std :: println ( "{::N[.2f]}" , v5 ); // 30.56 m/s
std :: println ( "{::N[.2f]U[dn]}" , v6 ); // 31.29 m⋅s⁻¹
2024-01-27 22:47:33 +01:00
std :: println ( "{:%N}" , v7 ); // 31
2019-12-17 09:15:31 +01:00
}
```
2024-05-16 12:35:49 +02:00
_Try it on the [Compiler Explorer](https://godbolt.org/z/nhqhT8Mzb)._