Files
mp-units/docs/getting_started/quick_start.md

238 lines
6.0 KiB
Markdown
Raw Normal View History

2023-06-21 10:55:18 +02:00
# Quick Start
This chapter provides a quick introduction to get you started with **mp-units**.
Much more details can be found in our [User's Guide](../users_guide/terms_and_definitions.md).
2023-06-21 10:55:18 +02:00
## Quantities
2023-06-21 10:55:18 +02:00
A **quantity** is a concrete amount of a unit representing a quantity type of a specified dimension with a
specific representation. It is represented in the library with a `quantity` class template.
2023-06-21 10:55:18 +02:00
The [SI Brochure](../appendix/references.md#SIBrochure) says:
!!! quote "SI Brochure"
The value of the quantity is the product of the number and the unit. The space between the number
and the unit is regarded as a multiplication sign (just as a space between units implies
multiplication).
Following the above, the value of a quantity in the **mp-units** library is created by multiplying
a number with a predefined unit:
2023-06-21 10:55:18 +02:00
=== "C++ modules"
2023-06-21 10:55:18 +02:00
```cpp
import mp_units;
2023-06-21 10:55:18 +02:00
using namespace mp_units;
quantity q = 42 * si::metre / si::second;
```
=== "Header files"
```cpp
#include <mp-units/systems/si/si.h>
using namespace mp_units;
quantity q = 42 * si::metre / si::second;
```
2023-06-21 10:55:18 +02:00
!!! info
In case someone doesn't like the multiply syntax or there is an ambiguity between `operator*`
provided by this and other libraries, a quantity can also be created with a two-parameter
constructor:
2023-06-21 10:55:18 +02:00
=== "C++ modules"
```cpp
import mp_units;
using namespace mp_units;
quantity q{42, si::metre / si::second};
```
=== "Header files"
```cpp
#include <mp-units/systems/si/si.h>
using namespace mp_units;
quantity q{42, si::metre / si::second};
```
The above creates an instance of `quantity<derived_unit<si::metre, per<si::second>>{}, int>`.
The same can be obtained using optional unit symbols:
=== "C++ modules"
```cpp
import mp_units;
2023-06-21 10:55:18 +02:00
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
quantity q = 42 * m / s;
```
=== "Header files"
2023-06-21 10:55:18 +02:00
```cpp
#include <mp-units/systems/si/si.h>
2023-06-21 10:55:18 +02:00
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
2023-06-21 10:55:18 +02:00
quantity q = 42 * m / s;
```
2023-06-21 10:55:18 +02:00
!!! important
Unit symbols introduce a lot of short identifiers into the current scope, which may cause
naming collisions with unrelated but already existing identifiers in the code base.
This is why unit symbols are opt-in.
A user has several options here to choose from depending on the required scenario and possible
naming conflicts:
- explicitly "import" all of them from a dedicated `unit_symbols` namespace with a
[using-directive](https://en.cppreference.com/w/cpp/language/namespace#Using-directives):
```cpp
import mp_units;
using namespace mp_units;
using namespace mp_units::si::unit_symbols; // imports all the SI symbols at once
quantity q = 42 * m / s;
```
2023-06-21 10:55:18 +02:00
- selectively select only the required and not-conflicting ones with
[using-declarations](https://en.cppreference.com/w/cpp/language/using_declaration):
```cpp
import mp_units;
using namespace mp_units;
using si::unit_symbols::m;
using si::unit_symbols::s;
quantity q = 42 * m / s;
```
- specify a custom not conflicting unit identifier for a unit:
```cpp
import mp_units;
using namespace mp_units;
constexpr Unit auto mps = si::metre / si::second;
quantity q = 42 * mps;
```
2023-06-21 10:55:18 +02:00
Quantities of the same kind can be added, subtracted, and compared to each other:
=== "C++ modules"
```cpp
import mp_units;
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
static_assert(1 * km + 50 * m == 1050 * m);
```
=== "Header files"
```cpp
#include <mp-units/systems/si/si.h>
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
static_assert(1 * km + 50 * m == 1050 * m);
```
Various quantities can be multiplied or divided by each other:
2023-06-21 10:55:18 +02:00
```cpp
static_assert(140 * km / (2 * h) == 70 * km / h);
2023-06-21 10:55:18 +02:00
```
!!! note
In case you wonder why this library does not use UDLs to create quantities, please check
our [FAQ](faq.md#why-dont-we-use-udls-to-create-quantities).
## Quantity points
The quantity point specifies an absolute quantity with respect to an origin.
If no origin is provided explicitly, an implicit one will be provided by the library.
Together with quantities, they model [The Affine Space](../users_guide/framework_basics/the_affine_space.md).
Quantity points should be used in all places where adding two values is meaningless
(e.g., temperature points, timestamps, altitudes, readouts from the car's odometer, etc.).
The set of operations that can be done on quantity points is limited compared to quantities.
This introduces an additional type-safety.
2023-06-21 10:55:18 +02:00
=== "C++ modules"
```cpp
2024-01-27 22:47:33 +01:00
#include <print>
import mp_units;
int main()
{
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
using namespace mp_units::usc::unit_symbols;
quantity_point temp{20. * deg_C};
2024-01-27 22:47:33 +01:00
std::println("Temperature: {} ({})",
temp.quantity_from_zero(),
temp.in(deg_F).quantity_from_zero());
}
```
=== "Header files"
```cpp
2024-01-27 22:47:33 +01:00
#include <mp-units/format.h>
#include <mp-units/systems/si/si.h>
#include <mp-units/systems/usc/usc.h>
2024-01-27 22:47:33 +01:00
#include <print>
int main()
{
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
using namespace mp_units::usc::unit_symbols;
quantity_point temp{20. * deg_C};
2024-01-27 22:47:33 +01:00
std::println("Temperature: {} ({})",
temp.quantity_from_zero(),
temp.in(deg_F).quantity_from_zero());
}
```
2023-06-21 10:55:18 +02:00
The above outputs:
2023-06-21 10:55:18 +02:00
```text
Temperature: 20 °C (68 °F)
```
!!! info
Check [The Affine Space](../users_guide/framework_basics/the_affine_space.md) chapter to learn
more about quantity points.