mirror of
https://github.com/mpusz/mp-units.git
synced 2025-07-29 18:07:16 +02:00
refactor: "expression templates" renamed to "symbolic expressions"
This commit is contained in:
@ -270,7 +270,7 @@
|
|||||||
[`derived dimension`](#derived-dimension){ #derived-dimension }
|
[`derived dimension`](#derived-dimension){ #derived-dimension }
|
||||||
|
|
||||||
: - A [dimension](#dimension) of a [derived quantity](#derived-quantity).
|
: - A [dimension](#dimension) of a [derived quantity](#derived-quantity).
|
||||||
- Implemented as an expression template being the result of the
|
- Implemented as an symbolic expression being the result of the
|
||||||
[dimension equation](#dimension-equation) on [base dimensions](#base-dimension).
|
[dimension equation](#dimension-equation) on [base dimensions](#base-dimension).
|
||||||
|
|
||||||
[`dimension equation`](#dimension-equation){ #dimension-equation }
|
[`dimension equation`](#dimension-equation){ #dimension-equation }
|
||||||
|
@ -159,7 +159,7 @@ The above prints:
|
|||||||
|
|
||||||
Some users could expect to see `42 kWh` or `42 kW h` in the output. It is not the case and for
|
Some users could expect to see `42 kWh` or `42 kW h` in the output. It is not the case and for
|
||||||
a very good reason. As stated in
|
a very good reason. As stated in
|
||||||
[Simplifying the resulting expression templates](../users_guide/framework_basics/interface_introduction.md#simplifying-the-resulting-expression-templates),
|
[Simplifying the resulting symbolic expressions](../users_guide/framework_basics/interface_introduction.md#simplifying-the-resulting-symbolic-expressions),
|
||||||
to be able to reason about and simplify units, the library needs to order them in an appropriate
|
to be able to reason about and simplify units, the library needs to order them in an appropriate
|
||||||
order.
|
order.
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ To achieve this goal, several techniques are applied:
|
|||||||
compile-times and the readability of error messages when compared to the traditional template
|
compile-times and the readability of error messages when compared to the traditional template
|
||||||
metaprogramming with [SFINAE](https://en.cppreference.com/w/cpp/language/sfinae),
|
metaprogramming with [SFINAE](https://en.cppreference.com/w/cpp/language/sfinae),
|
||||||
- [usage of strong types for framework entities](../users_guide/framework_basics/interface_introduction.md#strong-types-instead-of-aliases) (instead of type aliases),
|
- [usage of strong types for framework entities](../users_guide/framework_basics/interface_introduction.md#strong-types-instead-of-aliases) (instead of type aliases),
|
||||||
- [usage of expression templates](../users_guide/framework_basics/interface_introduction.md#expression-templates) to improve the readability of generated types,
|
- [usage of symbolic expressions](../users_guide/framework_basics/interface_introduction.md#symbolic-expressions) to improve the readability of generated types,
|
||||||
- limiting the number of template arguments to the bare minimum.
|
- limiting the number of template arguments to the bare minimum.
|
||||||
|
|
||||||
!!! important "Important: It is all about errors"
|
!!! important "Important: It is all about errors"
|
||||||
|
@ -141,7 +141,7 @@ ratio of `1` and does not output any textual symbol.
|
|||||||
!!! important "Important: `one` is an identity"
|
!!! important "Important: `one` is an identity"
|
||||||
|
|
||||||
A unit `one` is special in the entire type system of units as it is considered to be
|
A unit `one` is special in the entire type system of units as it is considered to be
|
||||||
[an identity operand in the unit expression templates](interface_introduction.md#identities).
|
[an identity operand in the unit symbolic expressions](interface_introduction.md#identities).
|
||||||
This means that, for example:
|
This means that, for example:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
@ -24,7 +24,7 @@ behind this is that:
|
|||||||
|
|
||||||
Also, to prevent possible issues in compile-time logic, all of the library's entities must be
|
Also, to prevent possible issues in compile-time logic, all of the library's entities must be
|
||||||
marked `final`. This prevents the users to derive own strong types from them, which would
|
marked `final`. This prevents the users to derive own strong types from them, which would
|
||||||
prevent expression template simplification of equivalent entities.
|
prevent symbolic expressions simplification of equivalent entities.
|
||||||
|
|
||||||
## Strong types instead of aliases
|
## Strong types instead of aliases
|
||||||
|
|
||||||
@ -103,14 +103,14 @@ inline constexpr struct joule final : named_unit<"J", newton * metre> {} joule;
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Expression templates
|
## Symbolic expressions
|
||||||
|
|
||||||
The previous chapter provided a rationale for not having predefined types for derived entities.
|
The previous chapter provided a rationale for not having predefined types for derived entities.
|
||||||
In many libraries, such an approach results in long and unreadable compilation errors, as
|
In many libraries, such an approach results in long and unreadable compilation errors, as
|
||||||
framework-generated types are typically far from being easy to read and understand.
|
framework-generated types are typically far from being easy to read and understand.
|
||||||
|
|
||||||
The **mp-units** library greatly improves the user experience by extensively using
|
The **mp-units** library greatly improves the user experience by extensively using
|
||||||
expression templates. Such expressions are used consistently throughout the entire library
|
symbolic expressions. Such expressions are used consistently throughout the entire library
|
||||||
to describe the results of:
|
to describe the results of:
|
||||||
|
|
||||||
- [dimension equation](../../appendix/glossary.md#dimension-equation) - the result is put into
|
- [dimension equation](../../appendix/glossary.md#dimension-equation) - the result is put into
|
||||||
@ -169,7 +169,7 @@ constexpr auto my_unit = one / second;
|
|||||||
constexpr auto my_unit = inverse(second);
|
constexpr auto my_unit = inverse(second);
|
||||||
```
|
```
|
||||||
|
|
||||||
Both cases will result in the same expression template being generated and put into the wrapper
|
Both cases will result in the same symbolic expression being generated and put into the wrapper
|
||||||
class template.
|
class template.
|
||||||
|
|
||||||
|
|
||||||
@ -195,10 +195,10 @@ its unique representation in the library:
|
|||||||
| `sqrt({identity})` or `pow<1, 2>({identity})` | `{identity}` |
|
| `sqrt({identity})` or `pow<1, 2>({identity})` | `{identity}` |
|
||||||
|
|
||||||
|
|
||||||
### Simplifying the resulting expression templates
|
### Simplifying the resulting symbolic expressions
|
||||||
|
|
||||||
To limit the length and improve the readability of generated types, there are many rules to simplify
|
To limit the length and improve the readability of generated types, there are many rules to simplify
|
||||||
the resulting expression template.
|
the resulting symbolic expression.
|
||||||
|
|
||||||
1. **Ordering**
|
1. **Ordering**
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ the resulting expression template.
|
|||||||
|
|
||||||
Also, to prevent possible issues in compile-time logic, all of the library's entities must be
|
Also, to prevent possible issues in compile-time logic, all of the library's entities must be
|
||||||
marked `final`. This prevents the users to derive own strong types from them, which would
|
marked `final`. This prevents the users to derive own strong types from them, which would
|
||||||
prevent expression template simplification of equivalent entities.
|
prevent symbolic expression simplification of equivalent entities.
|
||||||
|
|
||||||
4. **Repacking**
|
4. **Repacking**
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ All of the above quantities are equivalent and mean exactly the same.
|
|||||||
|
|
||||||
The above code example may give the impression that the order of components in a derived
|
The above code example may give the impression that the order of components in a derived
|
||||||
unit is determined by the multiplication order. This is not the case. As stated in
|
unit is determined by the multiplication order. This is not the case. As stated in
|
||||||
[Simplifying the resulting expression templates](interface_introduction.md#simplifying-the-resulting-expression-templates),
|
[Simplifying the resulting symbolic expressions](interface_introduction.md#simplifying-the-resulting-symbolic-expressions),
|
||||||
to be able to reason about and simplify units, the library needs to order them in an
|
to be able to reason about and simplify units, the library needs to order them in an
|
||||||
appropriate order. This will affect the order of components in a resulting type and
|
appropriate order. This will affect the order of components in a resulting type and
|
||||||
text output.
|
text output.
|
||||||
|
@ -55,7 +55,6 @@ add_mp_units_module(
|
|||||||
include/mp-units/framework/customization_points.h
|
include/mp-units/framework/customization_points.h
|
||||||
include/mp-units/framework/dimension.h
|
include/mp-units/framework/dimension.h
|
||||||
include/mp-units/framework/dimension_concepts.h
|
include/mp-units/framework/dimension_concepts.h
|
||||||
include/mp-units/framework/expression_template.h
|
|
||||||
include/mp-units/framework/quantity.h
|
include/mp-units/framework/quantity.h
|
||||||
include/mp-units/framework/quantity_cast.h
|
include/mp-units/framework/quantity_cast.h
|
||||||
include/mp-units/framework/quantity_concepts.h
|
include/mp-units/framework/quantity_concepts.h
|
||||||
@ -67,6 +66,7 @@ add_mp_units_module(
|
|||||||
include/mp-units/framework/reference_concepts.h
|
include/mp-units/framework/reference_concepts.h
|
||||||
include/mp-units/framework/representation_concepts.h
|
include/mp-units/framework/representation_concepts.h
|
||||||
include/mp-units/framework/symbol_text.h
|
include/mp-units/framework/symbol_text.h
|
||||||
|
include/mp-units/framework/symbolic_expression.h
|
||||||
include/mp-units/framework/system_reference.h
|
include/mp-units/framework/system_reference.h
|
||||||
include/mp-units/framework/unit.h
|
include/mp-units/framework/unit.h
|
||||||
include/mp-units/framework/unit_concepts.h
|
include/mp-units/framework/unit_concepts.h
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/quantity_spec.h>
|
#include <mp-units/framework/quantity_spec.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
#include <mp-units/framework/unit_concepts.h>
|
#include <mp-units/framework/unit_concepts.h>
|
||||||
|
|
||||||
namespace mp_units {
|
namespace mp_units {
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
#include <mp-units/ext/prime.h>
|
#include <mp-units/ext/prime.h>
|
||||||
#include <mp-units/ext/type_traits.h>
|
#include <mp-units/ext/type_traits.h>
|
||||||
#include <mp-units/framework/customization_points.h>
|
#include <mp-units/framework/customization_points.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
#include <mp-units/framework/unit_magnitude_concepts.h>
|
#include <mp-units/framework/unit_magnitude_concepts.h>
|
||||||
#include <mp-units/framework/unit_symbol_formatting.h>
|
#include <mp-units/framework/unit_symbol_formatting.h>
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#include <mp-units/framework/customization_points.h>
|
#include <mp-units/framework/customization_points.h>
|
||||||
#include <mp-units/framework/dimension.h>
|
#include <mp-units/framework/dimension.h>
|
||||||
#include <mp-units/framework/dimension_concepts.h>
|
#include <mp-units/framework/dimension_concepts.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/quantity.h>
|
#include <mp-units/framework/quantity.h>
|
||||||
#include <mp-units/framework/quantity_cast.h>
|
#include <mp-units/framework/quantity_cast.h>
|
||||||
#include <mp-units/framework/quantity_concepts.h>
|
#include <mp-units/framework/quantity_concepts.h>
|
||||||
@ -39,6 +38,7 @@
|
|||||||
#include <mp-units/framework/reference.h>
|
#include <mp-units/framework/reference.h>
|
||||||
#include <mp-units/framework/representation_concepts.h>
|
#include <mp-units/framework/representation_concepts.h>
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
#include <mp-units/framework/system_reference.h>
|
#include <mp-units/framework/system_reference.h>
|
||||||
#include <mp-units/framework/unit.h>
|
#include <mp-units/framework/unit.h>
|
||||||
#include <mp-units/framework/unit_concepts.h>
|
#include <mp-units/framework/unit_concepts.h>
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
#include <mp-units/ext/inplace_vector.h>
|
#include <mp-units/ext/inplace_vector.h>
|
||||||
#include <mp-units/ext/type_traits.h>
|
#include <mp-units/ext/type_traits.h>
|
||||||
#include <mp-units/framework/dimension_concepts.h>
|
#include <mp-units/framework/dimension_concepts.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
|
|
||||||
#ifndef MP_UNITS_IN_MODULE_INTERFACE
|
#ifndef MP_UNITS_IN_MODULE_INTERFACE
|
||||||
#include <mp-units/ext/contracts.h>
|
#include <mp-units/ext/contracts.h>
|
||||||
@ -122,7 +122,7 @@ struct base_dimension : detail::dimension_interface {
|
|||||||
* Derived dimension is an expression of the dependence of a quantity on the base quantities of a system of quantities
|
* Derived dimension is an expression of the dependence of a quantity on the base quantities of a system of quantities
|
||||||
* as a product of powers of factors corresponding to the base quantities, omitting any numerical factors.
|
* as a product of powers of factors corresponding to the base quantities, omitting any numerical factors.
|
||||||
*
|
*
|
||||||
* Instead of using a raw list of exponents this library decided to use expression template syntax to make types
|
* Instead of using a raw list of exponents this library decided to use symbolic expression syntax to make types
|
||||||
* more digestable for the user. The positive exponents are ordered first and all negative exponents are put as a list
|
* more digestable for the user. The positive exponents are ordered first and all negative exponents are put as a list
|
||||||
* into the `per<...>` class template. If a power of exponent is different than `1` the dimension type is enclosed in
|
* into the `per<...>` class template. If a power of exponent is different than `1` the dimension type is enclosed in
|
||||||
* `power<Dim, Num, Den>` class template. Otherwise, it is just put directly in the list without any wrapper. There
|
* `power<Dim, Num, Den>` class template. Otherwise, it is just put directly in the list without any wrapper. There
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
// IWYU pragma: private, include <mp-units/framework.h>
|
// IWYU pragma: private, include <mp-units/framework.h>
|
||||||
#include <mp-units/bits/module_macros.h>
|
#include <mp-units/bits/module_macros.h>
|
||||||
#include <mp-units/ext/type_traits.h>
|
#include <mp-units/ext/type_traits.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
|
|
||||||
namespace mp_units {
|
namespace mp_units {
|
||||||
|
|
||||||
|
@ -32,11 +32,11 @@
|
|||||||
#include <mp-units/ext/type_name.h>
|
#include <mp-units/ext/type_name.h>
|
||||||
#include <mp-units/ext/type_traits.h>
|
#include <mp-units/ext/type_traits.h>
|
||||||
#include <mp-units/framework/dimension.h>
|
#include <mp-units/framework/dimension.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/quantity_concepts.h>
|
#include <mp-units/framework/quantity_concepts.h>
|
||||||
#include <mp-units/framework/quantity_spec_concepts.h>
|
#include <mp-units/framework/quantity_spec_concepts.h>
|
||||||
#include <mp-units/framework/reference_concepts.h>
|
#include <mp-units/framework/reference_concepts.h>
|
||||||
#include <mp-units/framework/representation_concepts.h>
|
#include <mp-units/framework/representation_concepts.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
|
|
||||||
#ifndef MP_UNITS_IN_MODULE_INTERFACE
|
#ifndef MP_UNITS_IN_MODULE_INTERFACE
|
||||||
#ifdef MP_UNITS_IMPORT_STD
|
#ifdef MP_UNITS_IMPORT_STD
|
||||||
@ -439,7 +439,7 @@ struct derived_quantity_spec_impl :
|
|||||||
* Its dimension is an expression of the dependence of a quantity on the base quantities of a system of
|
* Its dimension is an expression of the dependence of a quantity on the base quantities of a system of
|
||||||
* quantities as a product of powers of factors corresponding to the base quantities, omitting any numerical factors.
|
* quantities as a product of powers of factors corresponding to the base quantities, omitting any numerical factors.
|
||||||
*
|
*
|
||||||
* Instead of using a raw list of exponents this library decided to use expression template syntax to make types
|
* Instead of using a raw list of exponents this library decided to use symbolic expression syntax to make types
|
||||||
* more digestable for the user both for quantity specification and its dimension. The positive exponents are ordered
|
* more digestable for the user both for quantity specification and its dimension. The positive exponents are ordered
|
||||||
* first and all negative exponents are put as a list into the `per<...>` class template. If a power of exponent
|
* first and all negative exponents are put as a list into the `per<...>` class template. If a power of exponent
|
||||||
* is different than `1` the quantity type is enclosed in `power<Q, Num, Den>` class template. Otherwise, it is
|
* is different than `1` the quantity type is enclosed in `power<Q, Num, Den>` class template. Otherwise, it is
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#include <mp-units/bits/hacks.h>
|
#include <mp-units/bits/hacks.h>
|
||||||
#include <mp-units/bits/module_macros.h>
|
#include <mp-units/bits/module_macros.h>
|
||||||
#include <mp-units/framework/dimension_concepts.h>
|
#include <mp-units/framework/dimension_concepts.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
|
|
||||||
namespace mp_units {
|
namespace mp_units {
|
||||||
|
|
||||||
|
@ -33,10 +33,10 @@
|
|||||||
#include <mp-units/ext/inplace_vector.h>
|
#include <mp-units/ext/inplace_vector.h>
|
||||||
#include <mp-units/ext/type_name.h>
|
#include <mp-units/ext/type_name.h>
|
||||||
#include <mp-units/ext/type_traits.h>
|
#include <mp-units/ext/type_traits.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/quantity_point_concepts.h>
|
#include <mp-units/framework/quantity_point_concepts.h>
|
||||||
#include <mp-units/framework/quantity_spec_concepts.h>
|
#include <mp-units/framework/quantity_spec_concepts.h>
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
#include <mp-units/framework/unit_concepts.h>
|
#include <mp-units/framework/unit_concepts.h>
|
||||||
#include <mp-units/framework/unit_magnitude.h>
|
#include <mp-units/framework/unit_magnitude.h>
|
||||||
#include <mp-units/framework/unit_symbol_formatting.h>
|
#include <mp-units/framework/unit_symbol_formatting.h>
|
||||||
|
@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
// IWYU pragma: private, include <mp-units/framework.h>
|
// IWYU pragma: private, include <mp-units/framework.h>
|
||||||
#include <mp-units/bits/module_macros.h>
|
#include <mp-units/bits/module_macros.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/quantity_spec_concepts.h>
|
#include <mp-units/framework/quantity_spec_concepts.h>
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
#include <mp-units/framework/unit_magnitude.h>
|
#include <mp-units/framework/unit_magnitude.h>
|
||||||
|
|
||||||
namespace mp_units {
|
namespace mp_units {
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
// IWYU pragma: private, include <mp-units/framework.h>
|
// IWYU pragma: private, include <mp-units/framework.h>
|
||||||
#include <mp-units/bits/module_macros.h>
|
#include <mp-units/bits/module_macros.h>
|
||||||
#include <mp-units/ext/type_traits.h>
|
#include <mp-units/ext/type_traits.h>
|
||||||
#include <mp-units/framework/expression_template.h>
|
|
||||||
#include <mp-units/framework/symbol_text.h>
|
#include <mp-units/framework/symbol_text.h>
|
||||||
|
#include <mp-units/framework/symbolic_expression.h>
|
||||||
|
|
||||||
#ifndef MP_UNITS_IN_MODULE_INTERFACE
|
#ifndef MP_UNITS_IN_MODULE_INTERFACE
|
||||||
#ifdef MP_UNITS_IMPORT_STD
|
#ifdef MP_UNITS_IMPORT_STD
|
||||||
|
Reference in New Issue
Block a user