From 2a4e1e3d9555e2bfc3add0ae07458e99b8429331 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 5 Sep 2024 08:17:35 +0200 Subject: [PATCH 01/25] docs: Rework of "Getting Started" section Inspired by #603 --- CONTRIBUTING.md | 297 ++++++--- docs/getting_started/contributing.md | 1 + .../getting_started/installation_and_usage.md | 600 +++++------------- docs/getting_started/project_structure.md | 150 +++++ mkdocs.yml | 2 + 5 files changed, 530 insertions(+), 520 deletions(-) create mode 120000 docs/getting_started/contributing.md create mode 100644 docs/getting_started/project_structure.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34e78cdf..e8e5871d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,93 +1,220 @@ -# Contributing to `mp-units` +# Contributing 👍🎉 First off, thanks for taking the time to contribute! 🎉👍 -## Gitpod - -The easiest way to start coding is to jump straight into [Gitpod](https://www.gitpod.io). You can either click the button -below or prefix any `mp-units` URL (main branch, other branches, issues, PRs, ...) in your web browser with `gitpod.io/#` -(e.g., ). - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/mpusz/mp-units) - -The above environment provides you with: - -- all supported compilers for Linux development and the latest version of build tools like `cmake` and `conan` -- all Conan dependencies preinstalled on the machine -- all documentation generation tools ready to use -- completed prebuilds for all targets (Debug and Release builds for each compiler) -- VSCode preconfigured to benefit from all the above - -## Download, Build, Install - -Alternatively, please refer to our official docs for -[download, build, and install instructions](https://mpusz.github.io/mp-units/latest/getting_started/installation_and_usage) -if you want to setup a development environment on your local machine. - -## Before Committing git Changes - -There are a few steps recommended to check before committing and pushing your changes to the git repository. - -### Naming Conventions - -Here are the main rules for naming things in this repo: - -- types, functions, variables naming in a `standard_case` -- template parameters in a `PascalCase` -- C++20 concepts names for now in a `PascalCase` but we plan to change it (see - for more details) - -### Unified Code Formatting - -There is a formatting standard enforced with the `pre-commit` script. Before committing your changes please do the following: - -```bash -pip3 install -U pre-commit -pre-commit run --all-files -``` - -This will run `clang-format` for code formatting with the `.clang-format` file provided in the repo, `cmake-format` to format -the CMake files, and some other check as well. -The script will run on all the files in the repo and will apply the changes in-place when needed. -After the script is done please make sure to stage all those changes to git commit. - -### Build All CMake Targets And Run Unit Tests - -The simplest way to verify if all targets build correctly and all unit tests pass is to run: - -```bash -conan build . -pr -s compiler.cppstd=23 -o cxx_modules=True -c user.mp-units.build:all=True -b missing -``` - -as described in the -[Installation and Usage](https://mpusz.github.io/mp-units/latest/getting_started/installation_and_usage/#contributing-or-just-building-all-the-tests-and-examples) -chapter of our documentation. - -_Hint:_ To ensure that that we always build all the targets and to save some typing of the Conan commands, -it is a good practice to set the following in the `~/.conan2/global.conf`: - -```text -user.mp-units.build:all=True -``` - -Non-Conan users should: -- build `all` and `all_verify_interface_header_sets` CMake targets, -- run all unit tests. - -### Backward Compatibility - -Before submission, please remember to check if the code compiles fine on the supported compilers. -The CI will check it anyway but it is good to check at least some of the configurations before pushing changes. -Especially older compilers can be tricky as those do not support all the C++20 features well enough. The official -list of supported compilers can be always found in the -[Installation And Usage](https://mpusz.github.io/mp-units/latest/getting_started/cpp_compiler_support) -chapter of our documentation. - ## Where To Start? If you are looking for a good issue to start with, please check the following: -- [good first issue](https://github.com/mpusz/mp-units/labels/good%20first%20issue) - issues that should be pretty simple to implement. -- [help wanted](https://github.com/mpusz/mp-units/labels/help%20wanted) - issues that typically are a bit more involved than beginner issues. -- [high priority](https://github.com/mpusz/mp-units/labels/high%20priority) - things to fix ASAP but often of higher complexity. +- [good first issue](https://github.com/mpusz/mp-units/labels/good%20first%20issue) - issues that + should be pretty simple to implement, +- [help wanted](https://github.com/mpusz/mp-units/labels/help%20wanted) - issues that typically are + a bit more involved than beginner issues, +- [high priority](https://github.com/mpusz/mp-units/labels/high%20priority) - things to fix ASAP + but often of higher complexity. + + +## Gitpod + +The easiest way to start coding is to jump straight into [Gitpod](https://www.gitpod.io) +environment. You can either click the button below + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/mpusz/mp-units) + +or prefix any `mp-units` URL (main branch, other branches, issues, PRs, ...) in your web browser +with `gitpod.io/#` (e.g., ). + +The above environment provides you with: + +- all supported compilers for Linux development and the latest version of build tools like `cmake` + and `conan`, +- all Conan dependencies preinstalled on the machine, +- all documentation generation tools ready to use, +- completed prebuilds for all targets (Debug and Release builds for each compiler), +- VSCode preconfigured to benefit from all the above. + + +## Building, testing, and packaging + +Alternatively, please refer to our official docs for +[download, build, and install instructions](https://mpusz.github.io/mp-units/latest/getting_started/installation_and_usage) with the below changes +if you want to set up a development environment on your local machine. + + +### Conan configuration properties + +[`user.mp-units.build:all`](#user.mp-units.build-all){ #user.mp-units.build-all } + + Enables compilation of all the source code, including tests and examples. To support this, it requires some additional Conan build dependencies described in + [Repository directory tree and dependencies](https://mpusz.github.io/mp-units/latest/getting_started/project_structure#cmake-projects-and-dependencies). + It also runs unit tests during the Conan build (unless + [`tools.build:skip_test`](https://docs.conan.io/2/reference/commands/config.html?highlight=tools.build:skip_test#conan-config-list) + configuration property is set to `True`). + + [conan build all support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + +[`user.mp-units.build:skip_la`](#user-skip-la){ #user-skip-la } + + If `user.mp-units.build:all` is enabled, among others, Conan installs the external + [wg21-linear_algebra](https://conan.io/center/recipes/wg21-linear_algebra) + dependency and enables the compilation of linear algebra-based tests and usage examples. + Such behavior can be disabled with this option. + + [conan skip la support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + +[`user.mp-units.analyze:clang-tidy`](#user.mp-units.analyze-clang-tidy){ #user.mp-units.analyze-clang-tidy } + + Enables clang-tidy analysis. + + [conan clang-tidy support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + + +### CMake options for mp-units project developers + +[`MP_UNITS_DEV_BUILD_LA`](#MP_UNITS_DEV_BUILD_LA){ #MP_UNITS_DEV_BUILD_LA } + +:   [:octicons-tag-24: 2.2.0][cmake build la support] · :octicons-milestone-24: `ON`/`OFF` (Default: `ON`) + + Enables building code depending on the linear algebra library. + + [cmake build la support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + +[`MP_UNITS_DEV_IWYU`](#MP_UNITS_DEV_IWYU){ #MP_UNITS_DEV_IWYU } + +:   [:octicons-tag-24: 2.2.0][cmake iwyu support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) + + Enables include-what-you-use analysis. + + [cmake iwyu support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + +[`MP_UNITS_DEV_CLANG_TIDY`](#MP_UNITS_DEV_CLANG_TIDY){ #MP_UNITS_DEV_CLANG_TIDY } + +:   [:octicons-tag-24: 2.2.0][cmake clang-tidy support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) + + Enables clang-tidy analysis. + + [cmake clang-tidy support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + + +### Building the entire repository + +To build all the **mp-units** source code (with unit tests and examples), you should: + +1. Use the _CMakeLists.txt_ from the top-level directory. +2. Run Conan with [`user.mp-units.build:all`](#user.mp-units.build-all) = `True`. + +```shell +git clone https://github.com/mpusz/mp-units.git && cd units +conan build . -pr -s compiler.cppstd=23 -o '&:cxx_modules=True' -c user.mp-units.build:all=True -b missing +``` + +The above will download and install all of the dependencies needed for the development of the library, +build all of the source code, and run unit tests. + +If you prefer to build the project via CMake rather than Conan, then you should replace +the `conan build` with `conan install` command and then follow with a regular CMake build and testing: + +```shell +conan install . -pr -s compiler.cppstd=23 -o '&:cxx_modules=True' -c user.mp-units.build:all=True -b missing +cmake --preset conan-default +cmake --build --preset conan-release +cmake --build --preset conan-release --target all_verify_interface_header_sets +cmake --build --preset conan-release --target test +``` + +!!! hint + + To ensure that we always build all the targets and to save some typing of the Conan commands, + we can set the following in the `~/.conan2/global.conf`: + + ```text + user.mp-units.build:all=True + ``` + +### Packaging + +To test CMake installation and Conan packaging run: + +```shell +conan create . --user --channel -pr -s compiler.cppstd=20 -o '&:cxx_modules=True' -c user.mp-units.build:all=True -b missing +``` + +The above will create a Conan package and run tests provided in _./test_package_ directory. + +In case you would like to upload **mp-units** package to the Conan server do the following: + +```shell +conan upload -r --all mp-units/2.2.0@/ +``` + + +## Building documentation + +We are building our documentation using [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). The easiest way to install all the required dependencies is with `pip`: + +```shell +pip install -U mkdocs-material mkdocs-rss-plugin +``` + +Additionally, a [Cairo Graphics library](https://www.cairographics.org/) is required by +Material for MkDocs. Please follow the +[official MkDocs documentation to install it](https://squidfunk.github.io/mkdocs-material/plugins/requirements/image-processing/#cairo-graphics). + +After that, you can either: + +- easily [start a live server to preview the documentation as you write](https://squidfunk.github.io/mkdocs-material/creating-your-site/#previewing-as-you-write) + +```shell +mkdocs serve +``` + +- [build the documentation](https://squidfunk.github.io/mkdocs-material/creating-your-site/#building-your-site) + +```shell +mkdocs build +``` + + +## Before Committing git Changes + +There are a few steps recommended to check before committing and pushing your changes to the git +repository. + + +### Naming Conventions + +Here are the main rules for naming things in this repo: + +- types, functions, variables use `standard_case`, +- template parameters use `PascalCase`, +- C++ concept names, for now, use `PascalCase`, but we plan to change it + (see [GitHub Issue #93](https://github.com/mpusz/mp-units/issues/93) for more details). + +### Unified Code Formatting + +A formatting standard is enforced with the `pre-commit` script. Before committing your changes, please do the following: + +```bash +pip install -U pre-commit +pre-commit run --all-files +``` + +This will run: + +- `clang-format` for code formatting with the `.clang-format` file provided in the repo, +- `cmake-format` to format the CMake files, +- some other checks (e.g., python script checkers, whitespaces, etc.). + +The script will run on all the files in the repo and will apply the changes in place when needed. +After the script is done, please make sure to review and stage all those changes for the git commit. + + +### Backward Compatibility + +Before submission, please remember to check if the code compiles fine on the supported compilers. +The CI will check it anyway, but it is good to check at least some of the configurations before +pushing changes. +Especially older compilers can be tricky as those do not have full C++20 conformance. +The official list of supported compilers can be always found in the +[C++ compiler support (API/ABI)](https://mpusz.github.io/mp-units/latest/getting_started/cpp_compiler_support) chapter of our documentation. diff --git a/docs/getting_started/contributing.md b/docs/getting_started/contributing.md new file mode 120000 index 00000000..f939e75f --- /dev/null +++ b/docs/getting_started/contributing.md @@ -0,0 +1 @@ +../../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/getting_started/installation_and_usage.md b/docs/getting_started/installation_and_usage.md index 1433569c..3a59deac 100644 --- a/docs/getting_started/installation_and_usage.md +++ b/docs/getting_started/installation_and_usage.md @@ -1,155 +1,7 @@ # Installation And Usage -This chapter provides all the necessary information to obtain and build the code using **mp-units**. -It also describes how to build or distribute the library and generate its documentation. - - -## Project structure - -### Repository directory tree and dependencies - -The [GitHub repository](https://github.com/mpusz/mp-units) contains three independent CMake-based -projects: - -- **_./src_** - - - header-only project containing whole **mp-units** library - - _./src/CMakeList.txt_ file is intended as an **entry point for library users** - - in case this library becomes part of the C++ standard, it will have no external dependencies - but until then, it depends on the following: - - - [gsl-lite](https://github.com/gsl-lite/gsl-lite) or [ms-gsl](https://github.com/microsoft/GSL) - to verify runtime contracts (if contract checking is enabled), - - [{fmt}](https://github.com/fmtlib/fmt) to provide text formatting of quantities - (if `std::format` is not supported yet on a specific compiler). - -- **_._** - - - project used as an **entry point for library development and CI/CD** - - it wraps _./src_ project together with usage examples and tests - - additionally to the dependencies of _./src_ project, it uses: - - - [Catch2](https://github.com/catchorg/Catch2) library as a unit tests framework, - - [linear algebra](https://github.com/BobSteagall/wg21/tree/master/include) - library based on proposal [P1385](https://wg21.link/P1385) used in some examples - and tests. - -- **_./test_package_** - - - CMake library installation and Conan package verification. - - -!!! important "Important: Library users should not use the top-level CMake file" - - Top level _CMakeLists.txt_ file should only be used by **mp-units** developers and contributors - as an entry point for the project's development. We want to ensure that everyone will build **ALL** - the code correctly before pushing a commit. Having such options would allow unintended issues to - leak to PRs and CI. - - This is why our projects have two entry points: - - - _./CMakeLists.txt_ is **to be used by projects developers** to build **ALL** the project code - with really restrictive compilation flags, - - _./src/CMakeLists.txt_ contains only a pure library definition and **should be used by the - customers** that prefer to use CMake's - [`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) to - handle the dependencies. - - To learn more about the rationale, please check our - [FAQ](faq.md#why-dont-we-have-cmake-options-to-disable-the-building-of-tests-and-examples). - -### Modules - -The **mp-units** library provides the following C++ modules: - -```mermaid -flowchart TD - mp_units --- mp_units.systems --- mp_units.core -``` - -| C++ Module | CMake Target | Contents | -|--------------------|----------------------|----------------------------------------------------------| -| `mp_units.core` | `mp-units::core` | Core library framework and systems-independent utilities | -| `mp_units.systems` | `mp-units::systems` | All the systems of quantities and units | -| `mp_units` | `mp-units::mp-units` | Core + Systems | - -!!! note - - C++ modules are provided within the package only when: - - - [`cxx_modules`](#cxx_modules) Conan option is set to `True`, - - [`MP_UNITS_BUILD_CXX_MODULES`](#MP_UNITS_BUILD_CXX_MODULES) CMake option is set to `ON`. - -### Header files - -All of the project's header files can be found in the `mp-units/...` subdirectory. - -#### Core library - -- `mp-units/framework.h` contains the entire library's framework definitions, -- `mp-units/concepts.h` exposes only the library's concepts for generic code needs, -- `mp-units/format.h` provides text formatting support, -- `mp-units/ostream.h` enables streaming of the library's objects to the text output, -- `mp-units/math.h` provides overloads of common math functions for quantities, -- `mp-units/random.h` provides C++ pseudo-random number generators for quantities, -- `mp-units/compat_macros.h` provides macros for [wide compatibility](../users_guide/use_cases/wide_compatibility.md). - -??? info "More details" - - More detailed header files can be found in subfolders which typically should not be - included by the end users: - - - `mp-units/framework/...` provides all the public interfaces of the framework, - - `mp-units/bits/...` provides private implementation details only (no public definitions), - - `mp-units/ext/...` contains external dependencies that at some point in the future should - be replaced with C++ standard library facilities. - -#### Systems and associated utilities - -The systems definitions can be found in the `mp-units/systems/...` subdirectory: - -##### Systems of quantities - -- `mp-units/systems/isq.h` provides - [International System of Quantities (ISQ)](https://en.wikipedia.org/wiki/International_System_of_Quantities) - definitions, - -??? tip "Tip: Improving compile times" - - `mp-units/systems/isq.h` might be expensive to compile in every translation unit. There are - some smaller, domain targeted files available for explicit inclusion in the - `mp-units/systems/isq/...` subdirectory. - -##### Systems of units - -- `mp-units/systems/si.h` provides - [International System of Units (SI)](https://en.wikipedia.org/wiki/International_System_of_Units) - definitions and associated math functions, -- `mp-units/systems/angular.h` provides strong angular units and associated math functions, -- `mp-units/systems/international.h` provides - [international yard and pound](https://en.wikipedia.org/wiki/International_yard_and_pound) units, -- `mp-units/systems/imperial.h` includes `international.h` and extends it with - [imperial units](https://en.wikipedia.org/wiki/Imperial_units), -- `mp-units/systems/usc.h` includes `international.h` and extends it with - [United States customary system of units](https://en.wikipedia.org/wiki/United_States_customary_units), -- `mp-units/systems/cgs.h` provides - [centimetre-gram-second system of units](https://en.wikipedia.org/wiki/Centimetre%E2%80%93gram%E2%80%93second_system_of_units), -- `mp-units/systems/iau.h` provides - [astronomical system of units](https://en.wikipedia.org/wiki/Astronomical_system_of_units), -- `mp-units/systems/hep.h` provides units used in - [high-energy physics](https://en.wikipedia.org/wiki/Particle_physics), -- `mp-units/systems/typographic.h` provides units used in - [typography or typesetting](https://en.wikipedia.org/wiki/Typographic_unit), -- `mp-units/systems/natural.h` provides an example implementation of - [natural units](https://en.wikipedia.org/wiki/Natural_units). - -??? tip "Tip: Improving compile times" - - `mp-units/systems/si.h` might be expensive to compile in every translation unit. - There are some smaller files available for explicit inclusion in the - `mp-units/systems/si/...` subdirectory. - - `mp-units/systems/si/unit_symbols.h` is the most expensive to include. +This chapter provides all the necessary information to obtain **mp-units** and build the user's +source code using it. ## Obtaining dependencies @@ -157,66 +9,82 @@ The systems definitions can be found in the `mp-units/systems/...` subdirectory: This library assumes that most of the dependencies will be provided by the [Conan Package Manager](https://conan.io/). If you want to obtain required dependencies by other means, some modifications to the library's CMake files might be needed. -The rest of the dependencies responsible for documentation generation are provided by -`python3-pip`. -### Conan quick intro +??? info "Conan quick intro" -In case you are not familiar with Conan, to install it (or upgrade) just do: + In case you are not familiar with Conan, to install it (or upgrade) just do: -```shell -pip install -U conan -``` - -After that, you might need to add a custom profile file for your development environment -in _~/.conan2/profiles_ directory. An example profile can look as follows: - -```ini hl_lines="5" title="~/.conan2/profiles/gcc12" -[settings] -arch=x86_64 -build_type=Release -compiler=gcc -compiler.cppstd=20 -compiler.libcxx=libstdc++11 -compiler.version=12 -os=Linux - -[conf] -tools.build:compiler_executables={"c": "gcc-12", "cpp": "g++-12"} -``` - -!!! tip "Setting the language version" - - Please note that the **mp-units** library requires at least C++20 to be set in a Conan profile - or forced via the Conan command line. If we do the former, we will not need to provide - `-s compiler.cppstd=20` every time we run a Conan command line (as provided in the command - line instructions below). - -!!! tip "Using Ninja as a CMake generator for Conan" - - It is highly recommended to set Ninja as a CMake generator for Conan. To do so, we should - create a _~/.conan2/global.conf_ file that will set `tools.cmake.cmaketoolchain:generator` - to one of the Ninja generators. For example: - - ```text title="~/.conan2/global.conf" - tools.cmake.cmaketoolchain:generator="Ninja Multi-Config" + ```shell + pip install -U conan ``` -!!! tip "Separate build folders for different configurations" + After that, you might need to add a custom profile file for your development environment + in _~/.conan2/profiles_ directory. An example profile can look as follows: - _~/.conan2/global.conf_ file may also set `tools.cmake.cmake_layout:build_folder_vars` which - [makes working with several compilers or build configurations easier](https://docs.conan.io/2/reference/tools/cmake/cmake_layout.html#multi-setting-option-cmake-layout). - For example, the below line will force Conan to generate separate CMake presets and folders for - each compiler and C++ standard version: + ```ini hl_lines="5" title="~/.conan2/profiles/gcc12" + [settings] + arch=x86_64 + build_type=Release + compiler=gcc + compiler.cppstd=20 + compiler.libcxx=libstdc++11 + compiler.version=12 + os=Linux - ```text title="~/.conan2/global.conf" - tools.cmake.cmake_layout:build_folder_vars=["settings.compiler", "settings.compiler.version", "settings.compiler.cppstd"] + [conf] + tools.build:compiler_executables={"c": "gcc-12", "cpp": "g++-12"} ``` - In such a case, we will need to use a configuration-specific preset name in the Conan instructions - provided below rather than just `conan-default` and `conan-release` - (e.g. `conan-gcc-13-23` and `conan-gcc-13-23-release`) + !!! tip "Setting the language version" + + Please note that the **mp-units** library requires at least C++20 to be set in a Conan profile + or forced via the Conan command line. If we do the former, we will not need to provide + `-s compiler.cppstd=20` every time we run a Conan command line (as provided in the command + line instructions below). + + !!! tip "Using Ninja as a CMake generator for Conan" + + It is highly recommended to set Ninja as a CMake generator for Conan. To do so, we could + create a _~/.conan2/global.conf_ file that will set `tools.cmake.cmaketoolchain:generator` + to one of the Ninja generators. For example: + + ```text title="~/.conan2/global.conf" + tools.cmake.cmaketoolchain:generator="Ninja Multi-Config" + ``` + + !!! tip "Separate build folders for different configurations" + + _~/.conan2/global.conf_ file may also set `tools.cmake.cmake_layout:build_folder_vars` which + [makes working with several compilers or build configurations easier](https://docs.conan.io/2/reference/tools/cmake/cmake_layout.html#multi-setting-option-cmake-layout). + For example, the below line will force Conan to generate separate CMake presets and folders for + each compiler and C++ standard version: + + ```text title="~/.conan2/global.conf" + tools.cmake.cmake_layout:build_folder_vars=["settings.compiler", "settings.compiler.version", "settings.compiler.cppstd"] + ``` + + In such a case, we will need to use a configuration-specific preset name in the Conan instructions + provided below rather than just `conan-default` and `conan-release` + (e.g., `conan-gcc-13-23` and `conan-gcc-13-23-release`) + +??? info "CMake with presets support" + + It is recommended to use at least CMake 3.23 to build this project to benefit from CMake Presets + generated by Conan. All build instructions below assume that you have such support. If not, + your CMake invocations have to be replaced with something like: + + ```shell + mkdir build && cd build + cmake .. -G "Ninja Multi-Config" -DCMAKE_TOOLCHAIN_FILE=/conan_toolchain.cmake + cmake --build . --config Release + ``` + + !!! tip + + In case you can't use CMake 3.23 but you have access to CMake 3.20 or later, you can append + `-c tools.cmake.cmaketoolchain.presets:max_schema_version=2` to the `conan install` command + which will force Conan to use an older version of the CMake Presets schema. ## Build options @@ -225,7 +93,7 @@ tools.build:compiler_executables={"c": "gcc-12", "cpp": "g++-12"} Most of the below options are related to the C++ language features available in the compilers. Please refer to the [C++ compiler support](cpp_compiler_support.md) chapter to learn more - about which C++ features are required and which compiler support them. + about which C++ features are required for each option and which compilers support them. ### Conan options @@ -289,166 +157,92 @@ tools.build:compiler_executables={"c": "gcc-12", "cpp": "g++-12"} : [:octicons-tag-24: 2.2.0][conan freestanding] · :octicons-milestone-24: `True`/`False` (Default: `False`) Configures the library in the [freestanding](https://en.cppreference.com/w/cpp/freestanding) - mode. When enabled, the library's source code should build with the compiler's + mode. When enabled, the library's source code will build with the compiler's [`-ffreestanding`](https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html) compilation option without any issues. [conan freestanding]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 -### Conan configuration properties +??? info "CMake options to set when Conan is not being used" -[`user.mp-units.build:all`](#user.mp-units.build-all){ #user.mp-units.build-all } + ### CMake options -: [:octicons-tag-24: 2.2.0][conan build all support] · :octicons-milestone-24: `True`/`False` (Default: `False`) + Conan will automatically set all the below CMake options based on its configuration (described above). + Manual setting of the below CMake options is only needed when Conan is not being used. - Enables compilation of all the source code, including tests and examples. To support this, it requires some additional Conan build dependencies described in - [Repository directory tree and dependencies](#repository-directory-tree-and-dependencies). - It also runs unit tests during Conan build (unless - [`tools.build:skip_test`](https://docs.conan.io/2/reference/commands/config.html?highlight=tools.build:skip_test#conan-config-list) - configuration property is set to `True`). + [`MP_UNITS_BUILD_AS_SYSTEM_HEADERS`](#MP_UNITS_BUILD_AS_SYSTEM_HEADERS){ #MP_UNITS_BUILD_AS_SYSTEM_HEADERS } - [conan build all support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + : [:octicons-tag-24: 2.2.0][cmake as system headers support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) -[`user.mp-units.build:skip_la`](#user-skip-la){ #user-skip-la } + Exports library as system headers. -: [:octicons-tag-24: 2.2.0][conan skip la support] · :octicons-milestone-24: `True`/`False` (Default: `True`) + [cmake as system headers support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - If `user.mp-units.build:all` is enabled, among others, Conan installs the external - [wg21-linear_algebra](https://conan.io/center/recipes/wg21-linear_algebra) - dependency and enables the compilation of linear algebra-based tests and usage examples. - Such behavior can be disabled with this option. + [`MP_UNITS_BUILD_CXX_MODULES`](#MP_UNITS_BUILD_CXX_MODULES){ #MP_UNITS_BUILD_CXX_MODULES } - [conan skip la support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + : [:octicons-tag-24: 2.2.0][cmake build cxx modules support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) -[`user.mp-units.analyze:clang-tidy`](#user.mp-units.analyze-clang-tidy){ #user.mp-units.analyze-clang-tidy } + Adds C++ modules to the list of default targets. -: [:octicons-tag-24: 2.2.0][conan clang-tidy support] · :octicons-milestone-24: `True`/`False` (Default: `False`) + [cmake build cxx modules support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - Enables clang-tidy analysis. + [`MP_UNITS_BUILD_IMPORT_STD`](#MP_UNITS_BUILD_IMPORT_STD){ #MP_UNITS_BUILD_IMPORT_STD } - [conan clang-tidy support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + : [:octicons-tag-24: 2.3.0][cmake import std support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) -### CMake options + Enables `import std;` usage. -[`MP_UNITS_BUILD_AS_SYSTEM_HEADERS`](#MP_UNITS_BUILD_AS_SYSTEM_HEADERS){ #MP_UNITS_BUILD_AS_SYSTEM_HEADERS } + [cmake import std support]: https://github.com/mpusz/mp-units/releases/tag/v2.3.0 -: [:octicons-tag-24: 2.2.0][cmake as system headers support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) + [`MP_UNITS_API_STD_FORMAT`](#MP_UNITS_API_STD_FORMAT){ #MP_UNITS_API_STD_FORMAT } - Exports library as system headers. + : [:octicons-tag-24: 2.2.0][cmake std::format support] · :octicons-milestone-24: `ON`/`OFF` (Default: automatically determined) - [cmake as system headers support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + Enables the usage of [`std::format`](https://en.cppreference.com/w/cpp/utility/format/format) + and associated facilities for text formatting. If it is not supported, then + the [{fmt}](https://github.com/fmtlib/fmt) library is used instead. -[`MP_UNITS_BUILD_CXX_MODULES`](#MP_UNITS_BUILD_CXX_MODULES){ #MP_UNITS_BUILD_CXX_MODULES } + [cmake std::format support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 -: [:octicons-tag-24: 2.2.0][cmake build cxx modules support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) + [`MP_UNITS_API_STRING_VIEW_RET`](#MP_UNITS_API_STRING_VIEW_RET){ #MP_UNITS_API_STRING_VIEW_RET } - Adds C++ modules to the list of default targets. + : [:octicons-tag-24: 2.2.0][cmake returning string_view] · :octicons-milestone-24: `ON`/`OFF` (Default: automatically determined) - [cmake build cxx modules support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + Enables returning `std::string_view` from the + [`unit_symbol()`](../users_guide/framework_basics/text_output.md#unit_symbol) + and [`dimension_symbol()`](../users_guide/framework_basics/text_output.md#dimension_symbol) + functions. If this feature is not available, those functions will return + `mp_units::basic_fixed_string` instead. -[`MP_UNITS_BUILD_IMPORT_STD`](#MP_UNITS_BUILD_IMPORT_STD){ #MP_UNITS_BUILD_IMPORT_STD } + [cmake returning string_view]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 -: [:octicons-tag-24: 2.3.0][cmake import std support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) + [`MP_UNITS_API_NO_CRTP`](#MP_UNITS_API_NO_CRTP){ #MP_UNITS_API_NO_CRTP } - Enables `import std;` usage. + : [:octicons-tag-24: 2.2.0][cmake no crtp support] · :octicons-milestone-24: `ON`/`OFF` (Default: automatically determined) - [cmake import std support]: https://github.com/mpusz/mp-units/releases/tag/v2.3.0 + Removes the need for the usage of the CRTP idiom in the + [`quantity_spec` definitions](../users_guide/framework_basics/systems_of_quantities.md#defining-quantities). -[`MP_UNITS_API_STD_FORMAT`](#MP_UNITS_API_STD_FORMAT){ #MP_UNITS_API_STD_FORMAT } + [cmake no crtp support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 -: [:octicons-tag-24: 2.2.0][cmake std::format support] · :octicons-milestone-24: `ON`/`OFF` (Default: automatically determined) + [`MP_UNITS_API_CONTRACTS`](#MP_UNITS_API_CONTRACTS){ #MP_UNITS_API_CONTRACTS } - Enables the usage of [`std::format`](https://en.cppreference.com/w/cpp/utility/format/format) - and associated facilities for text formatting. If it is not supported, then - the [{fmt}](https://github.com/fmtlib/fmt) library is used instead. + : [:octicons-tag-24: 2.2.0][cmake contracts] · :octicons-milestone-24: `NONE`/`GSL-LITE`/`MS-GSL` (Default: `GSL-LITE`) - [cmake std::format support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + Enables checking of preconditions and additional asserts in the code. -[`MP_UNITS_API_STRING_VIEW_RET`](#MP_UNITS_API_STRING_VIEW_RET){ #MP_UNITS_API_STRING_VIEW_RET } + [cmake contracts]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 -: [:octicons-tag-24: 2.2.0][cmake returning string_view] · :octicons-milestone-24: `ON`/`OFF` (Default: automatically determined) + [`MP_UNITS_API_FREESTANDING`](#MP_UNITS_API_FREESTANDING){ #MP_UNITS_API_FREESTANDING } - Enables returning `std::string_view` from the - [`unit_symbol()`](../users_guide/framework_basics/text_output.md#unit_symbol) - and [`dimension_symbol()`](../users_guide/framework_basics/text_output.md#dimension_symbol) - functions. If this feature is not available, those functions will return - `mp_units::basic_fixed_string` instead. + : [:octicons-tag-24: 2.2.0][cmake freestanding] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) - [cmake returning string_view]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 + Configures the library in the [freestanding](https://en.cppreference.com/w/cpp/freestanding) + mode. When enabled, the library's source code should build with the compiler's + [`-ffreestanding`](https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html) compilation option + without any issues. -[`MP_UNITS_API_NO_CRTP`](#MP_UNITS_API_NO_CRTP){ #MP_UNITS_API_NO_CRTP } - -: [:octicons-tag-24: 2.2.0][cmake no crtp support] · :octicons-milestone-24: `ON`/`OFF` (Default: automatically determined) - - Removes the need for the usage of the CRTP idiom in the - [`quantity_spec` definitions](../users_guide/framework_basics/systems_of_quantities.md#defining-quantities). - - [cmake no crtp support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - -[`MP_UNITS_API_CONTRACTS`](#MP_UNITS_API_CONTRACTS){ #MP_UNITS_API_CONTRACTS } - -: [:octicons-tag-24: 2.2.0][cmake contracts] · :octicons-milestone-24: `NONE`/`GSL-LITE`/`MS-GSL` (Default: `GSL-LITE`) - - Enables checking of preconditions and additional asserts in the code. - - [cmake contracts]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - -[`MP_UNITS_API_FREESTANDING`](#MP_UNITS_API_FREESTANDING){ #MP_UNITS_API_FREESTANDING } - -: [:octicons-tag-24: 2.2.0][cmake freestanding] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) - - Configures the library in the [freestanding](https://en.cppreference.com/w/cpp/freestanding) - mode. When enabled, the library's source code should build with the compiler's - [`-ffreestanding`](https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html) compilation option - without any issues. - - [cmake freestanding]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - -#### Options for mp-units project developers - -[`MP_UNITS_DEV_BUILD_LA`](#MP_UNITS_DEV_BUILD_LA){ #MP_UNITS_DEV_BUILD_LA } - -: [:octicons-tag-24: 2.2.0][cmake build la support] · :octicons-milestone-24: `ON`/`OFF` (Default: `ON`) - - Enables building code depending on the linear algebra library. - - [cmake build la support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - -[`MP_UNITS_DEV_IWYU`](#MP_UNITS_DEV_IWYU){ #MP_UNITS_DEV_IWYU } - -: [:octicons-tag-24: 2.2.0][cmake iwyu support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) - - Enables include-what-you-use analysis. - - [cmake iwyu support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - -[`MP_UNITS_DEV_CLANG_TIDY`](#MP_UNITS_DEV_CLANG_TIDY){ #MP_UNITS_DEV_CLANG_TIDY } - -: [:octicons-tag-24: 2.2.0][cmake clang-tidy support] · :octicons-milestone-24: `ON`/`OFF` (Default: `OFF`) - - Enables clang-tidy analysis. - - [cmake clang-tidy support]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 - - -## CMake with presets support - -It is recommended to use at least CMake 3.23 to build this project as this version introduced support -for CMake Presets schema version 4, used now by Conan to generate presets files. All build instructions -below assume that you have such support. If not, your CMake invocations have to be replaced with something -like: - -```shell -mkdir build && cd build -cmake .. -G "Ninja Multi-Config" -DCMAKE_TOOLCHAIN_FILE=/conan_toolchain.cmake -cmake --build . --config Release -``` - -!!! tip - - In case you can't use CMake 3.23 but you have access to CMake 3.20 or later, you can append - `-c tools.cmake.cmaketoolchain.presets:max_schema_version=2` to the `conan install` command - which will force Conan to use an older version of the CMake Presets schema. + [cmake freestanding]: https://github.com/mpusz/mp-units/releases/tag/v2.2.0 ## Installation and reuse @@ -461,42 +255,12 @@ only a few of many options possible. The easiest and most recommended way to obtain **mp-units** is with the Conan package manager. See [Conan + CMake (release)](#conan-cmake-release) for a detailed instruction. - -### Copy - -As **mp-units** is a C++ header-only library you can simply copy all needed _src/*/include_ subdirectories -to your source tree. - -!!! note - - In such a case, you are on your own to ensure all the dependencies are installed and their header - files can be located during the build. Please also note that some compiler-specific flags are needed - to make the code compile without issues. - - -### Copy + CMake - -If you copy the whole **mp-units** repository to your project's file tree, you can reuse CMake targets -defined by the library. To do so, **you should use _CMakeLists.txt_ file from the _./src_ directory**: - -```cmake -add_subdirectory(/src) -# ... -target_link_libraries( mp-units::mp-units) -``` - -!!! note - - You are still on your own to make sure all the dependencies are installed and their header and CMake - configuration files can be located during the build. - - ### Conan + CMake (release) !!! tip - If you are new to the Conan package manager, it is highly recommended to read - [Obtaining Dependencies](#obtaining-dependencies) and refer to + If you are new to the Conan package manager you may want to read + [Obtaining Dependencies](#obtaining-dependencies) and refer to the [Consuming packages](https://docs.conan.io/2/tutorial/consuming_packages.html) chapter of the official Conan documentation for more information. @@ -512,7 +276,6 @@ The following steps may be performed to obtain an official library release: mp-units/2.2.0 [options] - mp-units:cxx_modules=True [layout] cmake_layout @@ -522,8 +285,7 @@ The following steps may be performed to obtain an official library release: CMakeDeps ``` -2. Import **mp-units** and its dependencies definitions to your project's build procedure - with `find_package`: +2. Import **mp-units** and its dependencies definitions with `find_package`: ```cmake find_package(mp-units REQUIRED) @@ -552,7 +314,7 @@ of **mp-units** all the time. Please note that even though the Conan packages that you will be using are generated **ONLY** for builds that are considered stable (passed our CI tests), some minor regressions may happen - (our CI and C++20 build environment is not perfect yet). Also, please expect that the library + (CI and C++ build environments are not perfect yet). Also, please expect that the library interface might, and probably will, change occasionally. Even though we do our best, such changes might not be reflected in the project's documentation right away. @@ -572,7 +334,6 @@ with the following differences: mp-units/2.3.0@mpusz/testing [options] - mp-units:cxx_modules=True [layout] cmake_layout @@ -594,91 +355,60 @@ with the following differences: conan install . -pr -s compiler.cppstd=20 -b=missing -u ``` +??? info "Alternative installation scenarios" -### Install + ### Copy -In case you don't want to use Conan in your project and just want to install the **mp-units** -library on your file system and use `find_package(mp-units)` from another repository to find it; -it is enough to perform the following steps: + As **mp-units** is a C++ header-only library you can simply copy all needed _src/*/include_ subdirectories + to your source tree. -```shell -conan install . -pr -s compiler.cppstd=20 -b=missing -mv CMakeUserPresets.json src -cd src -cmake --preset conan-default -DCMAKE_INSTALL_PREFIX= -cmake --build --preset conan-release --target install -``` + !!! note + + In such a case, you are on your own to ensure all the dependencies are installed and their header + files can be located during the build. Please also note that some compiler-specific flags are needed + to make the code compile without issues. -## Contributing (or just building all the tests and examples) + ### Copy + CMake -In case you would like to build all the **mp-units** source code (with unit tests and examples), -you should: + If you copy the **mp-units** library source code from **the project's _./src_ directory** + (not the entire repo from its root), you can reuse CMake targets defined by the library. + To do so, **you should use _CMakeLists.txt_ file from the _./src_ directory**: -1. Use the _CMakeLists.txt_ from the top-level directory. -2. Run Conan with [`user.mp-units.build:all`](#user.mp-units.build-all) = `True`. - -```shell -git clone https://github.com/mpusz/mp-units.git && cd units -conan build . -pr -s compiler.cppstd=23 -o '&:cxx_modules=True' -c user.mp-units.build:all=True -b missing -``` - -The above will download and install all of the dependencies needed for the development of the library, -build all of the source code, and run unit tests. - -If you prefer to build the project via CMake rather than Conan, then you should replace -the `conan build` with `conan install` command and then follow with a regular CMake build: - -```shell -cmake --preset conan-default -cmake --build --preset conan-release -cmake --build --preset conan-release --target all_verify_interface_header_sets -cmake --build --preset conan-release --target test -``` - - -## Building documentation - -Starting from **mp-units 2.0** we are using [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/) -to build our documentation. The easiest way to install all the required dependencies -is with `pip`: - -```shell -pip install -U mkdocs-material mkdocs-rss-plugin -``` - -Additionally, a [Cairo Graphics library](https://www.cairographics.org/) is required by -Material for MkDocs. Please follow the -[official MkDocs documentation to install it](https://squidfunk.github.io/mkdocs-material/plugins/requirements/image-processing/#cairo-graphics). - -After that, you can either: - -- easily [start a live server to preview the documentation as you write](https://squidfunk.github.io/mkdocs-material/creating-your-site/#previewing-as-you-write) - - ```shell - mkdocs serve + ```cmake + add_subdirectory() + # ... + target_link_libraries( mp-units::mp-units) ``` -- [build the documentation](https://squidfunk.github.io/mkdocs-material/creating-your-site/#building-your-site) + !!! note + + You are still on your own to make sure all the dependencies are installed and their header and CMake + configuration files can be located during the build. + + !!! important "Important: Library users should not use the top-level CMake file" + + Top level _CMakeLists.txt_ file should only be used by **mp-units developers and contributors** + as an entry point for the project's development. + _./src/CMakeLists.txt_ contains only a pure library definition and **should be used by the + customers** that prefer to use CMake's + [`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) to + handle the dependencies. + + To learn more about the rationale, please check our + [FAQ](faq.md#why-dont-we-have-cmake-options-to-disable-the-building-of-tests-and-examples). + + + ### Install + + If you don't want to use Conan in your project and just want to install the **mp-units** + library on your file system, and use `find_package(mp-units)` from another repository to find it; + it is enough to perform the following steps: ```shell - mkdocs build + conan install . -pr -s compiler.cppstd=20 -b=missing + mv CMakeUserPresets.json src + cd src + cmake --preset conan-default -DCMAKE_INSTALL_PREFIX= + cmake --build --preset conan-release --target install ``` - - -## Packaging - -To test CMake installation and Conan packaging or create a Conan package run: - -```shell -conan create . --user --channel -pr -s compiler.cppstd=20 -o '&:cxx_modules=True' -c user.mp-units.build:all=True -b missing -``` - -The above will create a Conan package and run tests provided in _./test_package_ directory. - - -## Uploading **mp-units** package to the Conan server - -```shell -conan upload -r --all mp-units/2.2.0@/ -``` diff --git a/docs/getting_started/project_structure.md b/docs/getting_started/project_structure.md new file mode 100644 index 00000000..9d6c04ae --- /dev/null +++ b/docs/getting_started/project_structure.md @@ -0,0 +1,150 @@ +# Project structure + +This chapter provides a high level overview of the project to make it easier to navigate, build, +and use. + + +## CMake projects and dependencies + +The [GitHub repository](https://github.com/mpusz/mp-units) contains three independent CMake-based +projects: + +- **_./src_** + + - header-only project containing whole **mp-units** library + - _./src/CMakeLists.txt_ file is intended as an **entry point for library users** + - in case this library becomes part of the C++ standard, it will have no external dependencies + but until then, it depends on the following: + + - [gsl-lite](https://github.com/gsl-lite/gsl-lite) or [ms-gsl](https://github.com/microsoft/GSL) + to verify runtime contracts (if contract checking is enabled), + - [{fmt}](https://github.com/fmtlib/fmt) to provide text formatting of quantities + (if `std::format` is not supported yet on a specific compiler). + +- **_._** + + - project used as an **entry point for library development and CI/CD** + - it wraps _./src_ project together with usage examples and tests + - additionally to the dependencies of _./src_ project, it uses: + + - [Catch2](https://github.com/catchorg/Catch2) library as a unit tests framework, + - [linear algebra](https://github.com/BobSteagall/wg21/tree/master/include) + library based on proposal [P1385](https://wg21.link/P1385) used in some examples + and tests. + +- **_./test_package_** + + - CMake library installation and Conan package verification. + + +!!! important "Important: Library users should not use the top-level CMake file" + + Top level _CMakeLists.txt_ file should only be used by **mp-units** developers and contributors + as an entry point for the project's development. We want to ensure that everyone will build **ALL** + the code correctly before pushing a commit. Having such options would allow unintended issues to + leak to PRs and CI. + + This is why our projects have two entry points: + + - _./CMakeLists.txt_ is **to be used by projects developers** to build **ALL** the project code + with really restrictive compilation flags, + - _./src/CMakeLists.txt_ contains only a pure library definition and **should be used by the + customers** that prefer to use CMake's + [`add_subdirectory()`](https://cmake.org/cmake/help/latest/command/add_subdirectory.html) to + handle the dependencies. + + To learn more about the rationale, please check our + [FAQ](faq.md#why-dont-we-have-cmake-options-to-disable-the-building-of-tests-and-examples). + +## Modules + +The **mp-units** library provides the following C++ modules: + +```mermaid +flowchart TD + mp_units --- mp_units.systems --- mp_units.core +``` + +| C++ Module | CMake Target | Contents | +|--------------------|----------------------|----------------------------------------------------------| +| `mp_units.core` | `mp-units::core` | Core library framework and systems-independent utilities | +| `mp_units.systems` | `mp-units::systems` | All the systems of quantities and units | +| `mp_units` | `mp-units::mp-units` | Core + Systems | + +!!! note + + C++ modules are provided within the package only when: + + - [`cxx_modules`](installation_and_usage.md#cxx_modules) Conan option is set to `True`, + - [`MP_UNITS_BUILD_CXX_MODULES`](installation_and_usage.md#MP_UNITS_BUILD_CXX_MODULES) CMake option is set to `ON`. + +## Header files + +All of the project's header files can be found in the `mp-units/...` subdirectory. + +### Core library + +- `mp-units/framework.h` contains the entire library's framework definitions, +- `mp-units/concepts.h` exposes only the library's concepts for generic code needs, +- `mp-units/format.h` provides text formatting support, +- `mp-units/ostream.h` enables streaming of the library's objects to the text output, +- `mp-units/math.h` provides overloads of common math functions for quantities, +- `mp-units/random.h` provides C++ pseudo-random number generators for quantities, +- `mp-units/compat_macros.h` provides macros for [wide compatibility](../users_guide/use_cases/wide_compatibility.md). + +??? info "More details" + + More detailed header files can be found in subfolders which typically should not be + included by the end users: + + - `mp-units/framework/...` provides all the public interfaces of the framework, + - `mp-units/bits/...` provides private implementation details only (no public definitions), + - `mp-units/ext/...` contains external dependencies that at some point in the future should + be replaced with C++ standard library facilities. + +### Systems and associated utilities + +The systems definitions can be found in the `mp-units/systems/...` subdirectory: + +#### Systems of quantities + +- `mp-units/systems/isq.h` provides + [International System of Quantities (ISQ)](https://en.wikipedia.org/wiki/International_System_of_Quantities) + definitions, + +??? tip "Tip: Improving compile times" + + `mp-units/systems/isq.h` might be expensive to compile in every translation unit. There are + some smaller, domain targeted files available for explicit inclusion in the + `mp-units/systems/isq/...` subdirectory. + +#### Systems of units + +- `mp-units/systems/si.h` provides + [International System of Units (SI)](https://en.wikipedia.org/wiki/International_System_of_Units) + definitions and associated math functions, +- `mp-units/systems/angular.h` provides strong angular units and associated math functions, +- `mp-units/systems/international.h` provides + [international yard and pound](https://en.wikipedia.org/wiki/International_yard_and_pound) units, +- `mp-units/systems/imperial.h` includes `international.h` and extends it with + [imperial units](https://en.wikipedia.org/wiki/Imperial_units), +- `mp-units/systems/usc.h` includes `international.h` and extends it with + [United States customary system of units](https://en.wikipedia.org/wiki/United_States_customary_units), +- `mp-units/systems/cgs.h` provides + [centimetre-gram-second system of units](https://en.wikipedia.org/wiki/Centimetre%E2%80%93gram%E2%80%93second_system_of_units), +- `mp-units/systems/iau.h` provides + [astronomical system of units](https://en.wikipedia.org/wiki/Astronomical_system_of_units), +- `mp-units/systems/hep.h` provides units used in + [high-energy physics](https://en.wikipedia.org/wiki/Particle_physics), +- `mp-units/systems/typographic.h` provides units used in + [typography or typesetting](https://en.wikipedia.org/wiki/Typographic_unit), +- `mp-units/systems/natural.h` provides an example implementation of + [natural units](https://en.wikipedia.org/wiki/Natural_units). + +??? tip "Tip: Improving compile times" + + `mp-units/systems/si.h` might be expensive to compile in every translation unit. + There are some smaller files available for explicit inclusion in the + `mp-units/systems/si/...` subdirectory. + + `mp-units/systems/si/unit_symbols.h` is the most expensive to include. diff --git a/mkdocs.yml b/mkdocs.yml index b3b12169..8372ece0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -130,8 +130,10 @@ nav: - Introduction: getting_started/introduction.md - Quick Start: getting_started/quick_start.md - Look and Feel: getting_started/look_and_feel.md + - Project Structure: getting_started/project_structure.md - C++ compiler support (API/ABI): getting_started/cpp_compiler_support.md - Installation and Usage: getting_started/installation_and_usage.md + - Contributing: getting_started/contributing.md - FAQ: getting_started/faq.md - User's Guide: - Terms and Definitions: users_guide/terms_and_definitions.md From 2e840cfdb4fabd49a8494952257afaad48bd9ce3 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 5 Sep 2024 08:43:36 +0200 Subject: [PATCH 02/25] refactor: Repetitive `inline constexpr` removed as no longer needed Not needed anymore as stated in cplusplus/draft#4601 --- docs/blog/posts/2.1.0-released.md | 18 +- docs/blog/posts/2.2.0-released.md | 46 +- docs/index.md | 4 +- .../character_of_a_quantity.md | 16 +- docs/users_guide/framework_basics/concepts.md | 4 +- .../framework_basics/design_overview.md | 46 +- .../dimensionless_quantities.md | 28 +- .../faster_than_lightspeed_constants.md | 4 +- .../interface_introduction.md | 10 +- .../simple_and_typed_quantities.md | 8 +- .../framework_basics/systems_of_quantities.md | 76 +- .../framework_basics/systems_of_units.md | 26 +- .../framework_basics/text_output.md | 54 +- .../framework_basics/the_affine_space.md | 30 +- .../framework_basics/value_conversions.md | 34 +- .../interoperability_with_other_libraries.md | 4 +- .../use_cases/wide_compatibility.md | 8 +- example/currency.cpp | 18 +- example/include/geographic.h | 6 +- example/include/ranged_representation.h | 6 +- example/include/validated_type.h | 7 +- example/kalman_filter/kalman.h | 6 +- .../kalman_filter/kalman_filter-example_2.cpp | 2 +- .../kalman_filter/kalman_filter-example_3.cpp | 2 +- .../kalman_filter/kalman_filter-example_4.cpp | 2 +- example/measurement.cpp | 6 +- example/si_constants.cpp | 2 +- example/storage_tank.cpp | 6 +- example/strong_angular_quantities.cpp | 2 +- example/total_energy.cpp | 2 +- example/unmanned_aerial_vehicle.cpp | 4 +- src/core/include/mp-units/bits/fmt.h | 2 +- src/core/include/mp-units/bits/hacks.h | 2 +- src/core/include/mp-units/bits/text_tools.h | 26 +- src/core/include/mp-units/bits/type_list.h | 6 +- src/core/include/mp-units/compat_macros.h | 8 +- src/core/include/mp-units/ext/type_traits.h | 15 +- .../mp-units/framework/construction_helpers.h | 4 +- .../mp-units/framework/customization_points.h | 12 +- .../include/mp-units/framework/dimension.h | 10 +- .../mp-units/framework/dimension_concepts.h | 8 +- .../mp-units/framework/expression_template.h | 30 +- .../include/mp-units/framework/magnitude.h | 41 +- .../mp-units/framework/quantity_concepts.h | 3 +- .../mp-units/framework/quantity_point.h | 6 +- .../framework/quantity_point_concepts.h | 10 +- .../mp-units/framework/quantity_spec.h | 44 +- .../framework/quantity_spec_concepts.h | 12 +- .../mp-units/framework/system_reference.h | 16 +- src/core/include/mp-units/framework/unit.h | 42 +- .../mp-units/framework/unit_concepts.h | 9 +- .../include/mp-units/framework/value_cast.h | 6 +- .../include/mp-units/systems/angular/units.h | 30 +- src/systems/include/mp-units/systems/cgs.h | 46 +- src/systems/include/mp-units/systems/hep.h | 92 +- src/systems/include/mp-units/systems/iau.h | 56 +- .../systems/iec80000/binary_prefixes.h | 16 +- .../mp-units/systems/iec80000/quantities.h | 18 +- .../mp-units/systems/iec80000/unit_symbols.h | 124 +- .../include/mp-units/systems/iec80000/units.h | 10 +- .../include/mp-units/systems/imperial.h | 82 +- .../include/mp-units/systems/international.h | 76 +- .../mp-units/systems/isq/base_quantities.h | 16 +- .../mp-units/systems/isq/electromagnetism.h | 38 +- .../systems/isq/light_and_radiation.h | 4 +- .../include/mp-units/systems/isq/mechanics.h | 32 +- .../mp-units/systems/isq/si_quantities.h | 6 +- .../mp-units/systems/isq/space_and_time.h | 16 +- .../mp-units/systems/isq/thermodynamics.h | 18 +- .../include/mp-units/systems/isq_angle.h | 6 +- .../include/mp-units/systems/natural.h | 28 +- .../include/mp-units/systems/si/chrono.h | 2 +- .../include/mp-units/systems/si/constants.h | 18 +- .../include/mp-units/systems/si/prefixes.h | 48 +- .../mp-units/systems/si/unit_symbols.h | 1436 ++++++++--------- .../include/mp-units/systems/si/units.h | 100 +- .../include/mp-units/systems/typographic.h | 8 +- src/systems/include/mp-units/systems/usc.h | 168 +- test/runtime/fmt_test.cpp | 2 +- test/runtime/linear_algebra_test.cpp | 6 +- test/runtime/truncation_test.cpp | 4 +- test/static/cgs_test.cpp | 2 +- test/static/concepts_test.cpp | 10 +- test/static/custom_rep_test_min_impl.cpp | 2 +- test/static/dimension_test.cpp | 42 +- test/static/hep_test.cpp | 2 +- test/static/international_test.cpp | 2 +- test/static/magnitude_test.cpp | 8 +- test/static/natural_test.cpp | 2 +- test/static/quantity_point_test.cpp | 36 +- test/static/quantity_spec_test.cpp | 10 +- test/static/quantity_test.cpp | 4 +- test/static/reference_test.cpp | 46 +- test/static/test_tools.h | 10 +- test/static/unit_test.cpp | 56 +- 95 files changed, 1765 insertions(+), 1772 deletions(-) diff --git a/docs/blog/posts/2.1.0-released.md b/docs/blog/posts/2.1.0-released.md index 3138e833..e8a675f0 100644 --- a/docs/blog/posts/2.1.0-released.md +++ b/docs/blog/posts/2.1.0-released.md @@ -49,19 +49,19 @@ As a side effect, we introduced a :boom: **breaking change** :boom:. We can't us hertz anymore: ```cpp -inline constexpr struct hertz : named_unit<"Hz", 1 / second, kind_of> {} hertz; +constexpr struct hertz : named_unit<"Hz", 1 / second, kind_of> {} hertz; ``` and have to type either: ```cpp -inline constexpr struct hertz : named_unit<"Hz", one / second, kind_of> {} hertz; +constexpr struct hertz : named_unit<"Hz", one / second, kind_of> {} hertz; ``` or ```cpp -inline constexpr struct hertz : named_unit<"Hz", inverse(second), kind_of> {} hertz; +constexpr struct hertz : named_unit<"Hz", inverse(second), kind_of> {} hertz; ``` To be consistent, we applied the same change to the dimensions and quantity @@ -70,13 +70,13 @@ specifications definitions. Now, to define a _frequency_ we have to type: === "C++23" ```cpp - inline constexpr struct frequency : quantity_spec {} frequency; + constexpr struct frequency : quantity_spec {} frequency; ``` === "C++20" ```cpp - inline constexpr struct frequency : quantity_spec {} frequency; + constexpr struct frequency : quantity_spec {} frequency; ``` === "Portable" @@ -145,11 +145,11 @@ If we derive from the same instantiation of `absolute_point_origin` we end up wi point origin. This change allows us to provide different names for the same temperature points: ```cpp -inline constexpr struct absolute_zero : absolute_point_origin {} absolute_zero; -inline constexpr struct zeroth_kelvin : decltype(absolute_zero) {} zeroth_kelvin; +constexpr struct absolute_zero : absolute_point_origin {} absolute_zero; +constexpr struct zeroth_kelvin : decltype(absolute_zero) {} zeroth_kelvin; -inline constexpr struct ice_point : relative_point_origin {} ice_point; -inline constexpr struct zeroth_degree_Celsius : decltype(ice_point) {} zeroth_degree_Celsius; +constexpr struct ice_point : relative_point_origin {} ice_point; +constexpr struct zeroth_degree_Celsius : decltype(ice_point) {} zeroth_degree_Celsius; ``` Please note that this is a :boom: **breaking change** :boom: as well. diff --git a/docs/blog/posts/2.2.0-released.md b/docs/blog/posts/2.2.0-released.md index 451a1f53..55b8edd4 100644 --- a/docs/blog/posts/2.2.0-released.md +++ b/docs/blog/posts/2.2.0-released.md @@ -281,13 +281,13 @@ is why it was renamed to `symbol_text` (:boom: **breaking change** :boom:). === "Now" ```cpp - inline constexpr struct ohm final : named_unit {} ohm; + constexpr struct ohm final : named_unit {} ohm; ``` === "Before" ```cpp - inline constexpr struct ohm : named_unit {} ohm; + constexpr struct ohm : named_unit {} ohm; ``` !!! note @@ -295,7 +295,7 @@ is why it was renamed to `symbol_text` (:boom: **breaking change** :boom:). On C++20-compliant compilers it should be enough to type the following in the unit's definition: ```cpp - inline constexpr struct ohm final : named_unit<{u8"Ω", "ohm"}, volt / ampere> {} ohm; + constexpr struct ohm final : named_unit<{u8"Ω", "ohm"}, volt / ampere> {} ohm; ``` @@ -307,31 +307,31 @@ marked `final` (:boom: **breaking change** :boom:). === "Now" ```cpp - inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; - inline constexpr struct length final : quantity_spec {} length; + constexpr struct dim_length final : base_dimension<"L"> {} dim_length; + constexpr struct length final : quantity_spec {} length; - inline constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; - inline constexpr auto zeroth_kelvin = absolute_zero; - inline constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; + constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; + constexpr auto zeroth_kelvin = absolute_zero; + constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; - inline constexpr struct ice_point final : relative_point_origin}> {} ice_point; - inline constexpr auto zeroth_degree_Celsius = ice_point; - inline constexpr struct degree_Celsius final : named_unit {} degree_Celsius; + constexpr struct ice_point final : relative_point_origin}> {} ice_point; + constexpr auto zeroth_degree_Celsius = ice_point; + constexpr struct degree_Celsius final : named_unit {} degree_Celsius; ``` === "Before" ```cpp - inline constexpr struct dim_length : base_dimension<"L"> {} dim_length; - inline constexpr struct length : quantity_spec {} length; + constexpr struct dim_length : base_dimension<"L"> {} dim_length; + constexpr struct length : quantity_spec {} length; - inline constexpr struct absolute_zero : absolute_point_origin {} absolute_zero; - inline constexpr struct zeroth_kelvin : decltype(absolute_zero) {} zeroth_kelvin; - inline constexpr struct kelvin : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; + constexpr struct absolute_zero : absolute_point_origin {} absolute_zero; + constexpr struct zeroth_kelvin : decltype(absolute_zero) {} zeroth_kelvin; + constexpr struct kelvin : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; - inline constexpr struct ice_point : relative_point_origin}> {} ice_point; - inline constexpr struct zeroth_degree_Celsius : decltype(ice_point) {} zeroth_degree_Celsius; - inline constexpr struct degree_Celsius : named_unit {} degree_Celsius; + constexpr struct ice_point : relative_point_origin}> {} ice_point; + constexpr struct zeroth_degree_Celsius : decltype(ice_point) {} zeroth_degree_Celsius; + constexpr struct degree_Celsius : named_unit {} degree_Celsius; ``` Please also note, that the `absolute_point_origin` does not use CRTP idiom anymore (:boom: **breaking change** :boom:). @@ -509,13 +509,13 @@ conversion factor. Here is a comparison of the code with previous and current de === "Now" ```cpp - inline constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; - inline constexpr struct foot final : named_unit<"ft", mag_ratio<1, 3> * yard> {} foot; + constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; + constexpr struct foot final : named_unit<"ft", mag_ratio<1, 3> * yard> {} foot; ``` === "Before" ```cpp - inline constexpr struct yard : named_unit<"yd", mag * si::metre> {} yard; - inline constexpr struct foot : named_unit<"ft", mag * yard> {} foot; + constexpr struct yard : named_unit<"yd", mag * si::metre> {} yard; + constexpr struct foot : named_unit<"ft", mag * yard> {} foot; ``` diff --git a/docs/index.md b/docs/index.md index 260316e1..bfd1a221 100644 --- a/docs/index.md +++ b/docs/index.md @@ -33,7 +33,7 @@ The library source code is hosted on [GitHub](https://github.com/mpusz/mp-units) using namespace mp_units; - inline constexpr struct smoot final : named_unit<"smoot", mag<67> * usc::inch> {} smoot; + constexpr struct smoot final : named_unit<"smoot", mag<67> * usc::inch> {} smoot; int main() { @@ -53,7 +53,7 @@ The library source code is hosted on [GitHub](https://github.com/mpusz/mp-units) using namespace mp_units; - inline constexpr struct smoot final : named_unit<"smoot", mag<67> * usc::inch> {} smoot; + constexpr struct smoot final : named_unit<"smoot", mag<67> * usc::inch> {} smoot; int main() { diff --git a/docs/users_guide/framework_basics/character_of_a_quantity.md b/docs/users_guide/framework_basics/character_of_a_quantity.md index 26b358af..3934cfda 100644 --- a/docs/users_guide/framework_basics/character_of_a_quantity.md +++ b/docs/users_guide/framework_basics/character_of_a_quantity.md @@ -97,15 +97,15 @@ enumeration can be appended to the `quantity_spec` describing such a quantity ty === "C++23" ```cpp - inline constexpr struct position_vector final : quantity_spec {} position_vector; - inline constexpr struct displacement final : quantity_spec {} displacement; + constexpr struct position_vector final : quantity_spec {} position_vector; + constexpr struct displacement final : quantity_spec {} displacement; ``` === "C++20" ```cpp - inline constexpr struct position_vector final : quantity_spec {} position_vector; - inline constexpr struct displacement final : quantity_spec {} displacement; + constexpr struct position_vector final : quantity_spec {} position_vector; + constexpr struct displacement final : quantity_spec {} displacement; ``` === "Portable" @@ -126,13 +126,13 @@ character override is needed): === "C++23" ```cpp - inline constexpr struct velocity final : quantity_spec {} velocity; + constexpr struct velocity final : quantity_spec {} velocity; ``` === "C++20" ```cpp - inline constexpr struct velocity final : quantity_spec {} velocity; + constexpr struct velocity final : quantity_spec {} velocity; ``` === "Portable" @@ -179,7 +179,7 @@ For example, here is how it can be done for the [P1385](https://wg21.link/p1385) using la_vector = STD_LA::fixed_size_column_vector; template<> -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; ``` With the above, we can use `la_vector` as a representation type for our quantity: @@ -233,7 +233,7 @@ For example, we can do the following: ```cpp template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; ``` which says that every type that can be used as a scalar representation is also allowed for vector diff --git a/docs/users_guide/framework_basics/concepts.md b/docs/users_guide/framework_basics/concepts.md index dd09e673..1fce6016 100644 --- a/docs/users_guide/framework_basics/concepts.md +++ b/docs/users_guide/framework_basics/concepts.md @@ -180,7 +180,7 @@ with `true` for one or more of the following variable templates: ```cpp template requires mp_units::is_scalar - inline constexpr bool mp_units::is_vector = true; + constexpr bool mp_units::is_vector = true; ``` @@ -219,7 +219,7 @@ implicitly convertible from quantity specification `V`, which means that `V` mus However, if we define `mean_sea_level` in the following way: ```cpp - inline constexpr struct mean_sea_level final : absolute_point_origin {} mean_sea_level; + constexpr struct mean_sea_level final : absolute_point_origin {} mean_sea_level; ``` then it can't be used as a point origin for _points_ of `isq::length` or `isq::width` as none of them diff --git a/docs/users_guide/framework_basics/design_overview.md b/docs/users_guide/framework_basics/design_overview.md index 4d2f9850..c820c1a6 100644 --- a/docs/users_guide/framework_basics/design_overview.md +++ b/docs/users_guide/framework_basics/design_overview.md @@ -60,8 +60,8 @@ For example: the following way: ```cpp -inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; -inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; +constexpr struct dim_length final : base_dimension<"L"> {} dim_length; +constexpr struct dim_time final : base_dimension<"T"> {} dim_time; ``` [Derived dimensions](../../appendix/glossary.md#derived-dimension) are implicitly created @@ -71,9 +71,9 @@ provided in the [quantity specification](../../appendix/glossary.md#quantity_spe === "C++23" ```cpp - inline constexpr struct length final : quantity_spec {} length; - inline constexpr struct time final : quantity_spec {} time; - inline constexpr struct speed final : quantity_spec {} speed; + constexpr struct length final : quantity_spec {} length; + constexpr struct time final : quantity_spec {} time; + constexpr struct speed final : quantity_spec {} speed; static_assert(speed.dimension == dim_length / dim_time); ``` @@ -81,9 +81,9 @@ provided in the [quantity specification](../../appendix/glossary.md#quantity_spe === "C++20" ```cpp - inline constexpr struct length final : quantity_spec {} length; - inline constexpr struct time final : quantity_spec {} time; - inline constexpr struct speed final : quantity_spec {} speed; + constexpr struct length final : quantity_spec {} length; + constexpr struct time final : quantity_spec {} time; + constexpr struct speed final : quantity_spec {} speed; static_assert(speed.dimension == dim_length / dim_time); ``` @@ -183,17 +183,17 @@ Quantity specification can be defined by the user in one of the following ways: === "C++23" ```cpp - inline constexpr struct length final : quantity_spec {} length; - inline constexpr struct height final : quantity_spec {} height; - inline constexpr struct speed final : quantity_spec {} speed; + constexpr struct length final : quantity_spec {} length; + constexpr struct height final : quantity_spec {} height; + constexpr struct speed final : quantity_spec {} speed; ``` === "C++20" ```cpp - inline constexpr struct length final : quantity_spec {} length; - inline constexpr struct height final : quantity_spec {} height; - inline constexpr struct speed final : quantity_spec {} speed; + constexpr struct length final : quantity_spec {} length; + constexpr struct height final : quantity_spec {} height; + constexpr struct speed final : quantity_spec {} speed; ``` === "Portable" @@ -232,15 +232,15 @@ A unit can be defined by the user in one of the following ways: ```cpp template struct kilo_ : prefixed_unit<"k", mag_power<10, 3>, U{}> {}; -template inline constexpr kilo_ kilo; +template constexpr kilo_ kilo; -inline constexpr struct second final : named_unit<"s", kind_of> {} second; -inline constexpr struct minute final : named_unit<"min", mag<60> * second> {} minute; -inline constexpr struct gram final : named_unit<"g", kind_of> {} gram; -inline constexpr auto kilogram = kilo; -inline constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; +constexpr struct second final : named_unit<"s", kind_of> {} second; +constexpr struct minute final : named_unit<"min", mag<60> * second> {} minute; +constexpr struct gram final : named_unit<"g", kind_of> {} gram; +constexpr auto kilogram = kilo; +constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; -inline constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; +constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; ``` The [unit equation](../../appendix/glossary.md#unit-equation) of `si::metre / si::second` results @@ -346,13 +346,13 @@ For example: - the absolute point origin can be defined in the following way: ```cpp - inline constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; + constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; ``` - the relative point origin can be defined in the following way: ```cpp - inline constexpr struct ice_point final : relative_point_origin> {} ice_point; + constexpr struct ice_point final : relative_point_origin> {} ice_point; ``` diff --git a/docs/users_guide/framework_basics/dimensionless_quantities.md b/docs/users_guide/framework_basics/dimensionless_quantities.md index 3cb3d089..2c997222 100644 --- a/docs/users_guide/framework_basics/dimensionless_quantities.md +++ b/docs/users_guide/framework_basics/dimensionless_quantities.md @@ -113,7 +113,7 @@ that uses a unit that is proportional to the ratio of kilometers per megaparsecs units of _length_: ```cpp -inline constexpr struct hubble_constant final : +constexpr struct hubble_constant final : named_unit<{u8"H₀", "H_0"}, mag_ratio<701, 10> * si::kilo / si::second / si::mega> {} hubble_constant; ``` @@ -158,10 +158,10 @@ Besides the unit `one`, there are a few other scaled units predefined in the lib with dimensionless quantities: ```cpp -inline constexpr struct percent final : named_unit<"%", mag_ratio<1, 100> * one> {} percent; -inline constexpr struct per_mille final : named_unit<{u8"‰", "%o"}, mag_ratio<1, 1000> * one> {} per_mille; -inline constexpr struct parts_per_million final : named_unit<"ppm", mag_ratio<1, 1'000'000> * one> {} parts_per_million; -inline constexpr auto ppm = parts_per_million; +constexpr struct percent final : named_unit<"%", mag_ratio<1, 100> * one> {} percent; +constexpr struct per_mille final : named_unit<{u8"‰", "%o"}, mag_ratio<1, 1000> * one> {} per_mille; +constexpr struct parts_per_million final : named_unit<"ppm", mag_ratio<1, 1'000'000> * one> {} parts_per_million; +constexpr auto ppm = parts_per_million; ``` ### Superpowers of the unit `one` @@ -271,17 +271,17 @@ to the quantity specification: === "C++23" ```cpp - inline constexpr struct angular_measure final : quantity_spec {} angular_measure; - inline constexpr struct solid_angular_measure final : quantity_spec(radius), is_kind> {} solid_angular_measure; - inline constexpr struct storage_capacity final : quantity_spec {} storage_capacity; + constexpr struct angular_measure final : quantity_spec {} angular_measure; + constexpr struct solid_angular_measure final : quantity_spec(radius), is_kind> {} solid_angular_measure; + constexpr struct storage_capacity final : quantity_spec {} storage_capacity; ``` === "C++20" ```cpp - inline constexpr struct angular_measure final : quantity_spec {} angular_measure; - inline constexpr struct solid_angular_measure final : quantity_spec(radius), is_kind> {} solid_angular_measure; - inline constexpr struct storage_capacity final : quantity_spec {} storage_capacity; + constexpr struct angular_measure final : quantity_spec {} angular_measure; + constexpr struct solid_angular_measure final : quantity_spec(radius), is_kind> {} solid_angular_measure; + constexpr struct storage_capacity final : quantity_spec {} storage_capacity; ``` === "Portable" @@ -296,9 +296,9 @@ With the above, we can constrain `radian`, `steradian`, and `bit` to be allowed specific quantity kinds only: ```cpp -inline constexpr struct radian final : named_unit<"rad", metre / metre, kind_of> {} radian; -inline constexpr struct steradian final : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; -inline constexpr struct bit final : named_unit<"bit", one, kind_of> {} bit; +constexpr struct radian final : named_unit<"rad", metre / metre, kind_of> {} radian; +constexpr struct steradian final : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; +constexpr struct bit final : named_unit<"bit", one, kind_of> {} bit; ``` but still allow the usage of `one` and its scaled versions for such quantities. diff --git a/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md b/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md index cef490db..5dd8c3eb 100644 --- a/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md +++ b/docs/users_guide/framework_basics/faster_than_lightspeed_constants.md @@ -39,12 +39,12 @@ namespace si { namespace si2019 { -inline constexpr struct speed_of_light_in_vacuum final : +constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; } // namespace si2019 -inline constexpr struct magnetic_constant final : +constexpr struct magnetic_constant final : named_unit<{u8"μ₀", "u_0"}, mag<4> * mag_pi * mag_power<10, -7> * henry / metre> {} magnetic_constant; } // namespace mp_units::si diff --git a/docs/users_guide/framework_basics/interface_introduction.md b/docs/users_guide/framework_basics/interface_introduction.md index 31ebef0a..b7c6a2e5 100644 --- a/docs/users_guide/framework_basics/interface_introduction.md +++ b/docs/users_guide/framework_basics/interface_introduction.md @@ -6,8 +6,8 @@ The **mp-units** library decided to use a rather unusual pattern to define entit Here is how we define `metre` and `second` [SI](../../appendix/glossary.md#si) base units: ```cpp -inline constexpr struct metre final : named_unit<"m", kind_of> {} metre; -inline constexpr struct second final : named_unit<"s", kind_of> {} second; +constexpr struct metre final : named_unit<"m", kind_of> {} metre; +constexpr struct second final : named_unit<"s", kind_of> {} second; ``` Please note that the above reuses the same identifier for a type and its value. The rationale @@ -97,9 +97,9 @@ the value-based [unit equation](../../appendix/glossary.md#unit-equation) to a c definition: ```cpp -inline constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; -inline constexpr struct pascal final : named_unit<"Pa", newton / square(metre)> {} pascal; -inline constexpr struct joule final : named_unit<"J", newton * metre> {} joule; +constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; +constexpr struct pascal final : named_unit<"Pa", newton / square(metre)> {} pascal; +constexpr struct joule final : named_unit<"J", newton * metre> {} joule; ``` diff --git a/docs/users_guide/framework_basics/simple_and_typed_quantities.md b/docs/users_guide/framework_basics/simple_and_typed_quantities.md index 178c36e2..7dcf645d 100644 --- a/docs/users_guide/framework_basics/simple_and_typed_quantities.md +++ b/docs/users_guide/framework_basics/simple_and_typed_quantities.md @@ -316,12 +316,12 @@ Let's see another example: using namespace mp_units; // add a custom quantity type of kind isq::length - inline constexpr struct horizontal_length final : + constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // add a custom derived quantity type of kind isq::area // with a constrained quantity equation - inline constexpr struct horizontal_area final : + constexpr struct horizontal_area final : quantity_spec {} horizontal_area; class StorageTank { @@ -429,12 +429,12 @@ Let's see another example: using namespace mp_units; // add a custom quantity type of kind isq::length - inline constexpr struct horizontal_length final : + constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // add a custom derived quantity type of kind isq::area // with a constrained quantity equation - inline constexpr struct horizontal_area final : + constexpr struct horizontal_area final : quantity_spec {} horizontal_area; class StorageTank { diff --git a/docs/users_guide/framework_basics/systems_of_quantities.md b/docs/users_guide/framework_basics/systems_of_quantities.md index 438de213..fb9ee547 100644 --- a/docs/users_guide/framework_basics/systems_of_quantities.md +++ b/docs/users_guide/framework_basics/systems_of_quantities.md @@ -148,45 +148,45 @@ For example, here is how the above quantity kind tree can be modeled in the libr === "C++23" ```cpp - inline constexpr struct length final : quantity_spec {} length; - inline constexpr struct width final : quantity_spec {} width; - inline constexpr auto breadth = width; - inline constexpr struct height final : quantity_spec {} height; - inline constexpr auto depth = height; - inline constexpr auto altitude = height; - inline constexpr struct thickness final : quantity_spec {} thickness; - inline constexpr struct diameter final : quantity_spec {} diameter; - inline constexpr struct radius final : quantity_spec {} radius; - inline constexpr struct radius_of_curvature final : quantity_spec {} radius_of_curvature; - inline constexpr struct path_length final : quantity_spec {} path_length; - inline constexpr auto arc_length = path_length; - inline constexpr struct distance final : quantity_spec {} distance; - inline constexpr struct radial_distance final : quantity_spec {} radial_distance; - inline constexpr struct wavelength final : quantity_spec {} wavelength; - inline constexpr struct position_vector final : quantity_spec {} position_vector; - inline constexpr struct displacement final : quantity_spec {} displacement; + constexpr struct length final : quantity_spec {} length; + constexpr struct width final : quantity_spec {} width; + constexpr auto breadth = width; + constexpr struct height final : quantity_spec {} height; + constexpr auto depth = height; + constexpr auto altitude = height; + constexpr struct thickness final : quantity_spec {} thickness; + constexpr struct diameter final : quantity_spec {} diameter; + constexpr struct radius final : quantity_spec {} radius; + constexpr struct radius_of_curvature final : quantity_spec {} radius_of_curvature; + constexpr struct path_length final : quantity_spec {} path_length; + constexpr auto arc_length = path_length; + constexpr struct distance final : quantity_spec {} distance; + constexpr struct radial_distance final : quantity_spec {} radial_distance; + constexpr struct wavelength final : quantity_spec {} wavelength; + constexpr struct position_vector final : quantity_spec {} position_vector; + constexpr struct displacement final : quantity_spec {} displacement; ``` === "C++20" ```cpp - inline constexpr struct length final : quantity_spec {} length; - inline constexpr struct width final : quantity_spec {} width; - inline constexpr auto breadth = width; - inline constexpr struct height final : quantity_spec {} height; - inline constexpr auto depth = height; - inline constexpr auto altitude = height; - inline constexpr struct thickness final : quantity_spec {} thickness; - inline constexpr struct diameter final : quantity_spec {} diameter; - inline constexpr struct radius final : quantity_spec {} radius; - inline constexpr struct radius_of_curvature final : quantity_spec {} radius_of_curvature; - inline constexpr struct path_length final : quantity_spec {} path_length; - inline constexpr auto arc_length = path_length; - inline constexpr struct distance final : quantity_spec {} distance; - inline constexpr struct radial_distance final : quantity_spec {} radial_distance; - inline constexpr struct wavelength final : quantity_spec {} wavelength; - inline constexpr struct position_vector final : quantity_spec {} position_vector; - inline constexpr struct displacement final : quantity_spec {} displacement; + constexpr struct length final : quantity_spec {} length; + constexpr struct width final : quantity_spec {} width; + constexpr auto breadth = width; + constexpr struct height final : quantity_spec {} height; + constexpr auto depth = height; + constexpr auto altitude = height; + constexpr struct thickness final : quantity_spec {} thickness; + constexpr struct diameter final : quantity_spec {} diameter; + constexpr struct radius final : quantity_spec {} radius; + constexpr struct radius_of_curvature final : quantity_spec {} radius_of_curvature; + constexpr struct path_length final : quantity_spec {} path_length; + constexpr auto arc_length = path_length; + constexpr struct distance final : quantity_spec {} distance; + constexpr struct radial_distance final : quantity_spec {} radial_distance; + constexpr struct wavelength final : quantity_spec {} wavelength; + constexpr struct position_vector final : quantity_spec {} position_vector; + constexpr struct displacement final : quantity_spec {} displacement; ``` === "Portable" @@ -194,16 +194,16 @@ For example, here is how the above quantity kind tree can be modeled in the libr ```cpp QUANTITY_SPEC(length, dim_length); QUANTITY_SPEC(width, length); - inline constexpr auto breadth = width; + constexpr auto breadth = width; QUANTITY_SPEC(height, length); - inline constexpr auto depth = height; - inline constexpr auto altitude = height; + constexpr auto depth = height; + constexpr auto altitude = height; QUANTITY_SPEC(thickness, width); QUANTITY_SPEC(diameter, width); QUANTITY_SPEC(radius, width); QUANTITY_SPEC(radius_of_curvature, radius); QUANTITY_SPEC(path_length, length); - inline constexpr auto arc_length = path_length; + constexpr auto arc_length = path_length; QUANTITY_SPEC(distance, path_length); QUANTITY_SPEC(radial_distance, distance); QUANTITY_SPEC(wavelength, length); diff --git a/docs/users_guide/framework_basics/systems_of_units.md b/docs/users_guide/framework_basics/systems_of_units.md index df37b6bf..a5573ddc 100644 --- a/docs/users_guide/framework_basics/systems_of_units.md +++ b/docs/users_guide/framework_basics/systems_of_units.md @@ -26,7 +26,7 @@ this is expressed by associating a quantity kind (that we discussed in detail in previous chapter) with a unit that is used to express it: ```cpp -inline constexpr struct metre final : named_unit<"m", kind_of> {} metre; +constexpr struct metre final : named_unit<"m", kind_of> {} metre; ``` !!! important @@ -67,7 +67,7 @@ of a specific predefined [unit equation](../../appendix/glossary.md#unit-equatio For example, a unit of _power_ quantity is defined in the library as: ```cpp -inline constexpr struct watt final : named_unit<"W", joule / second> {} watt; +constexpr struct watt final : named_unit<"W", joule / second> {} watt; ``` However, a _power_ quantity can be expressed in other units as well. For example, @@ -110,8 +110,8 @@ The library allows constraining such units to work only with quantities of a spe the following way: ```cpp -inline constexpr struct hertz final : named_unit<"Hz", one / second, kind_of> {} hertz; -inline constexpr struct becquerel final : named_unit<"Bq", one / second, kind_of> {} becquerel; +constexpr struct hertz final : named_unit<"Hz", one / second, kind_of> {} hertz; +constexpr struct becquerel final : named_unit<"Bq", one / second, kind_of> {} becquerel; ``` With the above, `hertz` can only be used with _frequencies_, while `becquerel` should only be used with @@ -138,14 +138,14 @@ Each prefix is implemented similarly to the following: ```cpp template struct quecto_ : prefixed_unit<"q", mag_power<10, -30>, U{}> {}; -template inline constexpr quecto_ quecto; +template constexpr quecto_ quecto; ``` and then a [PrefixableUnit](concepts.md#PrefixableUnit) can be prefixed in the following way: ```cpp -inline constexpr auto qm = quecto; +constexpr auto qm = quecto; ``` The usage of `mag_power` not only enables providing support for SI prefixes, but it can also @@ -154,7 +154,7 @@ IT industry can be implemented as: ```cpp template struct yobi_ : prefixed_unit<"Yi", mag_power<2, 80>, U{}> {}; -template inline constexpr yobi_ yobi; +template constexpr yobi_ yobi; ``` ## Scaled units @@ -168,25 +168,25 @@ be explicitly expressed with predefined SI prefixes. Those include units like mi electronvolt: ```cpp -inline constexpr struct minute final : named_unit<"min", mag<60> * si::second> {} minute; -inline constexpr struct hour final : named_unit<"h", mag<60> * minute> {} hour; -inline constexpr struct electronvolt final : named_unit<"eV", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * si::joule> {} electronvolt; +constexpr struct minute final : named_unit<"min", mag<60> * si::second> {} minute; +constexpr struct hour final : named_unit<"h", mag<60> * minute> {} hour; +constexpr struct electronvolt final : named_unit<"eV", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * si::joule> {} electronvolt; ``` Also, units of other [systems of units](../../appendix/glossary.md#system-of-units) are often defined in terms of scaled versions of the SI units. For example, the international yard is defined as: ```cpp -inline constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; +constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; ``` For some units, a magnitude might also be irrational. The best example here is a `degree` which is defined using a floating-point magnitude having a factor of the number π (Pi): ```cpp -inline constexpr struct mag_pi final : magnitude> {} mag_pi; +constexpr struct mag_pi final : magnitude> {} mag_pi; ``` ```cpp -inline constexpr struct degree final : named_unit<{u8"°", "deg"}, mag_pi / mag<180> * si::radian> {} degree; +constexpr struct degree final : named_unit<{u8"°", "deg"}, mag_pi / mag<180> * si::radian> {} degree; ``` diff --git a/docs/users_guide/framework_basics/text_output.md b/docs/users_guide/framework_basics/text_output.md index cc6c347d..0a7d7981 100644 --- a/docs/users_guide/framework_basics/text_output.md +++ b/docs/users_guide/framework_basics/text_output.md @@ -33,30 +33,30 @@ and units of derived quantities. === "Dimensions" ```cpp - inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; - inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; - inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; - inline constexpr struct dim_electric_current final : base_dimension<"I"> {} dim_electric_current; - inline constexpr struct dim_thermodynamic_temperature final : base_dimension<{u8"Θ", "O"}> {} dim_thermodynamic_temperature; - inline constexpr struct dim_amount_of_substance final : base_dimension<"N"> {} dim_amount_of_substance; - inline constexpr struct dim_luminous_intensity final : base_dimension<"J"> {} dim_luminous_intensity; + constexpr struct dim_length final : base_dimension<"L"> {} dim_length; + constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; + constexpr struct dim_time final : base_dimension<"T"> {} dim_time; + constexpr struct dim_electric_current final : base_dimension<"I"> {} dim_electric_current; + constexpr struct dim_thermodynamic_temperature final : base_dimension<{u8"Θ", "O"}> {} dim_thermodynamic_temperature; + constexpr struct dim_amount_of_substance final : base_dimension<"N"> {} dim_amount_of_substance; + constexpr struct dim_luminous_intensity final : base_dimension<"J"> {} dim_luminous_intensity; ``` === "Units" ```cpp - inline constexpr struct second final : named_unit<"s", kind_of> {} second; - inline constexpr struct metre final : named_unit<"m", kind_of> {} metre; - inline constexpr struct gram final : named_unit<"g", kind_of> {} gram; - inline constexpr auto kilogram = kilo; + constexpr struct second final : named_unit<"s", kind_of> {} second; + constexpr struct metre final : named_unit<"m", kind_of> {} metre; + constexpr struct gram final : named_unit<"g", kind_of> {} gram; + constexpr auto kilogram = kilo; - inline constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; - inline constexpr struct joule final : named_unit<"J", newton * metre> {} joule; - inline constexpr struct watt final : named_unit<"W", joule / second> {} watt; - inline constexpr struct coulomb final : named_unit<"C", ampere * second> {} coulomb; - inline constexpr struct volt final : named_unit<"V", watt / ampere> {} volt; - inline constexpr struct farad final : named_unit<"F", coulomb / volt> {} farad; - inline constexpr struct ohm final : named_unit<{u8"Ω", "ohm"}, volt / ampere> {} ohm; + constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; + constexpr struct joule final : named_unit<"J", newton * metre> {} joule; + constexpr struct watt final : named_unit<"W", joule / second> {} watt; + constexpr struct coulomb final : named_unit<"C", ampere * second> {} coulomb; + constexpr struct volt final : named_unit<"V", watt / ampere> {} volt; + constexpr struct farad final : named_unit<"F", coulomb / volt> {} farad; + constexpr struct ohm final : named_unit<{u8"Ω", "ohm"}, volt / ampere> {} ohm; ``` === "Prefixes" @@ -75,13 +75,13 @@ and units of derived quantities. === "Constants" ```cpp - inline constexpr struct hyperfine_structure_transition_frequency_of_cs final : named_unit<{u8"Δν_Cs", "dv_Cs"}, mag<9'192'631'770> * hertz> {} hyperfine_structure_transition_frequency_of_cs; - inline constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; - inline constexpr struct planck_constant final : named_unit<"h", mag_ratio<662'607'015, 100'000'000> * mag_power<10, -34> * joule * second> {} planck_constant; - inline constexpr struct elementary_charge final : named_unit<"e", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * coulomb> {} elementary_charge; - inline constexpr struct boltzmann_constant final : named_unit<"k", mag_ratio<1'380'649, 1'000'000> * mag_power<10, -23> * joule / kelvin> {} boltzmann_constant; - inline constexpr struct avogadro_constant final : named_unit<"N_A", mag_ratio<602'214'076, 100'000'000> * mag_power<10, 23> / mole> {} avogadro_constant; - inline constexpr struct luminous_efficacy final : named_unit<"K_cd", mag<683> * lumen / watt> {} luminous_efficacy; + constexpr struct hyperfine_structure_transition_frequency_of_cs final : named_unit<{u8"Δν_Cs", "dv_Cs"}, mag<9'192'631'770> * hertz> {} hyperfine_structure_transition_frequency_of_cs; + constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; + constexpr struct planck_constant final : named_unit<"h", mag_ratio<662'607'015, 100'000'000> * mag_power<10, -34> * joule * second> {} planck_constant; + constexpr struct elementary_charge final : named_unit<"e", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * coulomb> {} elementary_charge; + constexpr struct boltzmann_constant final : named_unit<"k", mag_ratio<1'380'649, 1'000'000> * mag_power<10, -23> * joule / kelvin> {} boltzmann_constant; + constexpr struct avogadro_constant final : named_unit<"N_A", mag_ratio<602'214'076, 100'000'000> * mag_power<10, 23> / mole> {} avogadro_constant; + constexpr struct luminous_efficacy final : named_unit<"K_cd", mag<683> * lumen / watt> {} luminous_efficacy; ``` !!! important @@ -105,7 +105,7 @@ and units of derived quantities. template name to initialize it with two symbols: ```cpp - inline constexpr struct ohm final : named_unit {} ohm; + constexpr struct ohm final : named_unit {} ohm; ``` @@ -288,7 +288,7 @@ specialization for a specific unit: ```cpp template<> -inline constexpr bool space_before_unit_symbol = false; +constexpr bool space_before_unit_symbol = false; ``` !!! note diff --git a/docs/users_guide/framework_basics/the_affine_space.md b/docs/users_guide/framework_basics/the_affine_space.md index 688c4379..7e760aca 100644 --- a/docs/users_guide/framework_basics/the_affine_space.md +++ b/docs/users_guide/framework_basics/the_affine_space.md @@ -196,7 +196,7 @@ origin. ![affine_space_2](affine_space_2.svg){style="width:80%;display: block;margin: 0 auto;"} ```cpp -inline constexpr struct origin final : absolute_point_origin {} origin; +constexpr struct origin final : absolute_point_origin {} origin; // quantity_point qp1{100 * m}; // Compile-time error // quantity_point qp2{delta(120)}; // Compile-time error @@ -265,8 +265,8 @@ type and unit is being used: ![affine_space_3](affine_space_3.svg){style="width:80%;display: block;margin: 0 auto;"} ```cpp -inline constexpr struct origin1 final : absolute_point_origin {} origin1; -inline constexpr struct origin2 final : absolute_point_origin {} origin2; +constexpr struct origin1 final : absolute_point_origin {} origin1; +constexpr struct origin2 final : absolute_point_origin {} origin2; quantity_point qp1 = origin1 + 100 * m; quantity_point qp2 = origin2 + 120 * m; @@ -300,10 +300,10 @@ For such cases, relative point origins should be used: ![affine_space_4](affine_space_4.svg){style="width:80%;display: block;margin: 0 auto;"} ```cpp -inline constexpr struct A final : absolute_point_origin {} A; -inline constexpr struct B final : relative_point_origin {} B; -inline constexpr struct C final : relative_point_origin {} C; -inline constexpr struct D final : relative_point_origin {} D; +constexpr struct A final : absolute_point_origin {} A; +constexpr struct B final : relative_point_origin {} B; +constexpr struct C final : relative_point_origin {} C; +constexpr struct D final : relative_point_origin {} D; quantity_point qp1 = C + 100 * m; quantity_point qp2 = D + 120 * m; @@ -408,17 +408,17 @@ point origins for this purpose: ```cpp namespace si { -inline constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; -inline constexpr auto zeroth_kelvin = absolute_zero; +constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; +constexpr auto zeroth_kelvin = absolute_zero; -inline constexpr struct ice_point final : relative_point_origin>(273'150)}> {} ice_point; -inline constexpr auto zeroth_degree_Celsius = ice_point; +constexpr struct ice_point final : relative_point_origin>(273'150)}> {} ice_point; +constexpr auto zeroth_degree_Celsius = ice_point; } namespace usc { -inline constexpr struct zeroth_degree_Fahrenheit final : +constexpr struct zeroth_degree_Fahrenheit final : relative_point_origin * si::degree_Celsius>(-32)> {} zeroth_degree_Fahrenheit; } @@ -442,16 +442,16 @@ definitions: ```cpp namespace si { -inline constexpr struct kelvin final : +constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; -inline constexpr struct degree_Celsius final : +constexpr struct degree_Celsius final : named_unit<{u8"℃", "`C"}, kelvin, zeroth_degree_Celsius> {} degree_Celsius; } namespace usc { -inline constexpr struct degree_Fahrenheit final : +constexpr struct degree_Fahrenheit final : named_unit<{u8"℉", "`F"}, mag_ratio<5, 9> * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; diff --git a/docs/users_guide/framework_basics/value_conversions.md b/docs/users_guide/framework_basics/value_conversions.md index 1ec7e340..f22ad6aa 100644 --- a/docs/users_guide/framework_basics/value_conversions.md +++ b/docs/users_guide/framework_basics/value_conversions.md @@ -85,16 +85,16 @@ the `value_cast(q)` which always returns the most precise result: === "C++23" ```cpp - inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; - inline constexpr struct currency final : quantity_spec {} currency; + constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; + constexpr struct currency final : quantity_spec {} currency; - inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; - inline constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; + constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; + constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; namespace unit_symbols { - inline constexpr auto USD = us_dollar; - inline constexpr auto USD_s = scaled_us_dollar; + constexpr auto USD = us_dollar; + constexpr auto USD_s = scaled_us_dollar; } // namespace unit_symbols @@ -105,16 +105,16 @@ the `value_cast(q)` which always returns the most precise result: === "C++20" ```cpp - inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; - inline constexpr struct currency final : quantity_spec {} currency; + constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; + constexpr struct currency final : quantity_spec {} currency; - inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; - inline constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; + constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; + constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; namespace unit_symbols { - inline constexpr auto USD = us_dollar; - inline constexpr auto USD_s = scaled_us_dollar; + constexpr auto USD = us_dollar; + constexpr auto USD_s = scaled_us_dollar; } // namespace unit_symbols @@ -125,16 +125,16 @@ the `value_cast(q)` which always returns the most precise result: === "Portable" ```cpp - inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; + constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; QUANTITY_SPEC(currency, dim_currency); - inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; - inline constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; + constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; + constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; namespace unit_symbols { - inline constexpr auto USD = us_dollar; - inline constexpr auto USD_s = scaled_us_dollar; + constexpr auto USD = us_dollar; + constexpr auto USD_s = scaled_us_dollar; } // namespace unit_symbols diff --git a/docs/users_guide/use_cases/interoperability_with_other_libraries.md b/docs/users_guide/use_cases/interoperability_with_other_libraries.md index 07da96af..b449b02f 100644 --- a/docs/users_guide/use_cases/interoperability_with_other_libraries.md +++ b/docs/users_guide/use_cases/interoperability_with_other_libraries.md @@ -249,8 +249,8 @@ include the _mp-units/systems/si/chrono.h_ file to benefit from it. This file pr to the `std::chrono` abstractions: ```cpp - inline constexpr struct ts_origin final : relative_point_origin + 1 * h> {} ts_origin; - inline constexpr struct my_origin final : absolute_point_origin {} my_origin; + constexpr struct ts_origin final : relative_point_origin + 1 * h> {} ts_origin; + constexpr struct my_origin final : absolute_point_origin {} my_origin; quantity_point qp1 = sys_seconds{1s}; auto tp1 = to_chrono_time_point(qp1); // OK diff --git a/docs/users_guide/use_cases/wide_compatibility.md b/docs/users_guide/use_cases/wide_compatibility.md index b3420d12..22c968c1 100644 --- a/docs/users_guide/use_cases/wide_compatibility.md +++ b/docs/users_guide/use_cases/wide_compatibility.md @@ -29,7 +29,7 @@ your code using **mp-units**: // ... - inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... @@ -45,7 +45,7 @@ your code using **mp-units**: // ... - inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... @@ -65,7 +65,7 @@ your code using **mp-units**: // ... - inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... @@ -85,7 +85,7 @@ your code using **mp-units**: // ... - inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... diff --git a/example/currency.cpp b/example/currency.cpp index 6f280659..fcc0e0d5 100644 --- a/example/currency.cpp +++ b/example/currency.cpp @@ -40,22 +40,22 @@ import mp_units.core; using namespace mp_units; // clang-format off -inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; +constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; QUANTITY_SPEC(currency, dim_currency); -inline constexpr struct euro final : named_unit<"EUR", kind_of> {} euro; -inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; -inline constexpr struct great_british_pound final : named_unit<"GBP", kind_of> {} great_british_pound; -inline constexpr struct japanese_jen final : named_unit<"JPY", kind_of> {} japanese_jen; +constexpr struct euro final : named_unit<"EUR", kind_of> {} euro; +constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; +constexpr struct great_british_pound final : named_unit<"GBP", kind_of> {} great_british_pound; +constexpr struct japanese_jen final : named_unit<"JPY", kind_of> {} japanese_jen; // clang-format on namespace unit_symbols { -inline constexpr auto EUR = euro; -inline constexpr auto USD = us_dollar; -inline constexpr auto GBP = great_british_pound; -inline constexpr auto JPY = japanese_jen; +constexpr auto EUR = euro; +constexpr auto USD = us_dollar; +constexpr auto GBP = great_british_pound; +constexpr auto JPY = japanese_jen; } // namespace unit_symbols diff --git a/example/include/geographic.h b/example/include/geographic.h index ba26b3f1..9cbaaee1 100644 --- a/example/include/geographic.h +++ b/example/include/geographic.h @@ -44,7 +44,7 @@ import mp_units; namespace geographic { -inline constexpr struct mean_sea_level final : mp_units::absolute_point_origin { +constexpr struct mean_sea_level final : mp_units::absolute_point_origin { } mean_sea_level; using msl_altitude = mp_units::quantity_point; @@ -72,9 +72,9 @@ struct MP_UNITS_STD_FMT::formatter : namespace geographic { -inline constexpr struct equator final : mp_units::absolute_point_origin { +constexpr struct equator final : mp_units::absolute_point_origin { } equator; -inline constexpr struct prime_meridian final : mp_units::absolute_point_origin { +constexpr struct prime_meridian final : mp_units::absolute_point_origin { } prime_meridian; diff --git a/example/include/ranged_representation.h b/example/include/ranged_representation.h index 67557624..335f22dd 100644 --- a/example/include/ranged_representation.h +++ b/example/include/ranged_representation.h @@ -42,7 +42,7 @@ import mp_units.core; template) auto Min, MP_UNITS_CONSTRAINED_NTTP_WORKAROUND(std::convertible_to) auto Max> -inline constexpr auto is_in_range = [](const auto& v) { return std::clamp(v, T{Min}, T{Max}) == v; }; +constexpr auto is_in_range = [](const auto& v) { return std::clamp(v, T{Min}, T{Max}) == v; }; template) auto Min, MP_UNITS_CONSTRAINED_NTTP_WORKAROUND(std::convertible_to) auto Max> @@ -63,10 +63,10 @@ public: }; template -inline constexpr bool mp_units::is_scalar> = mp_units::is_scalar; +constexpr bool mp_units::is_scalar> = mp_units::is_scalar; template -inline constexpr bool mp_units::treat_as_floating_point> = +constexpr bool mp_units::treat_as_floating_point> = mp_units::treat_as_floating_point; template diff --git a/example/include/validated_type.h b/example/include/validated_type.h index efc1d946..0150c118 100644 --- a/example/include/validated_type.h +++ b/example/include/validated_type.h @@ -40,7 +40,7 @@ import mp_units.core; #include #endif -inline constexpr struct validated_tag { +constexpr struct validated_tag { } validated; template Validator> @@ -114,11 +114,10 @@ public: }; template -inline constexpr bool mp_units::is_scalar> = mp_units::is_scalar; +constexpr bool mp_units::is_scalar> = mp_units::is_scalar; template -inline constexpr bool mp_units::treat_as_floating_point> = - mp_units::treat_as_floating_point; +constexpr bool mp_units::treat_as_floating_point> = mp_units::treat_as_floating_point; template diff --git a/example/kalman_filter/kalman.h b/example/kalman_filter/kalman.h index 6e629477..90d0d506 100644 --- a/example/kalman_filter/kalman.h +++ b/example/kalman_filter/kalman.h @@ -47,13 +47,13 @@ namespace kalman { namespace detail { template -inline constexpr bool are_time_derivatives = false; +constexpr bool are_time_derivatives = false; template -inline constexpr bool are_time_derivatives = true; +constexpr bool are_time_derivatives = true; template -inline constexpr bool are_time_derivatives = +constexpr bool are_time_derivatives = (D1 / D2 == mp_units::isq::dim_time) && are_time_derivatives; } // namespace detail diff --git a/example/kalman_filter/kalman_filter-example_2.cpp b/example/kalman_filter/kalman_filter-example_2.cpp index daec350c..b03f8724 100644 --- a/example/kalman_filter/kalman_filter-example_2.cpp +++ b/example/kalman_filter/kalman_filter-example_2.cpp @@ -40,7 +40,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; using namespace mp_units; diff --git a/example/kalman_filter/kalman_filter-example_3.cpp b/example/kalman_filter/kalman_filter-example_3.cpp index 2e51cba1..9c2ca7d4 100644 --- a/example/kalman_filter/kalman_filter-example_3.cpp +++ b/example/kalman_filter/kalman_filter-example_3.cpp @@ -40,7 +40,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; using namespace mp_units; diff --git a/example/kalman_filter/kalman_filter-example_4.cpp b/example/kalman_filter/kalman_filter-example_4.cpp index f4df77a5..20813ad8 100644 --- a/example/kalman_filter/kalman_filter-example_4.cpp +++ b/example/kalman_filter/kalman_filter-example_4.cpp @@ -40,7 +40,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; using namespace mp_units; diff --git a/example/measurement.cpp b/example/measurement.cpp index 5e1e5419..d61c8d2e 100644 --- a/example/measurement.cpp +++ b/example/measurement.cpp @@ -132,12 +132,12 @@ private: } // namespace template -inline constexpr bool mp_units::treat_as_floating_point> = mp_units::treat_as_floating_point; +constexpr bool mp_units::treat_as_floating_point> = mp_units::treat_as_floating_point; template -inline constexpr bool mp_units::is_scalar> = true; +constexpr bool mp_units::is_scalar> = true; template -inline constexpr bool mp_units::is_vector> = true; +constexpr bool mp_units::is_vector> = true; static_assert(mp_units::RepresentationOf, mp_units::quantity_character::scalar>); diff --git a/example/si_constants.cpp b/example/si_constants.cpp index 022003f9..e09588c4 100644 --- a/example/si_constants.cpp +++ b/example/si_constants.cpp @@ -41,7 +41,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; int main() { diff --git a/example/storage_tank.cpp b/example/storage_tank.cpp index ad9f7580..2bb4f237 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -44,7 +44,7 @@ import mp_units; // types instead of requiring the usage of Linear Algebra library for this simple example template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; namespace { @@ -58,8 +58,8 @@ QUANTITY_SPEC(horizontal_length, isq::length); // with a constrained quantity equation QUANTITY_SPEC(horizontal_area, isq::area, horizontal_length* isq::width); -inline constexpr auto g = 1 * si::standard_gravity; -inline constexpr auto air_density = isq::mass_density(1.225 * kg / m3); +constexpr auto g = 1 * si::standard_gravity; +constexpr auto air_density = isq::mass_density(1.225 * kg / m3); class StorageTank { quantity base_; diff --git a/example/strong_angular_quantities.cpp b/example/strong_angular_quantities.cpp index 6487860d..9c03b36c 100644 --- a/example/strong_angular_quantities.cpp +++ b/example/strong_angular_quantities.cpp @@ -35,7 +35,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; int main() { diff --git a/example/total_energy.cpp b/example/total_energy.cpp index bcd149d6..75416bb7 100644 --- a/example/total_energy.cpp +++ b/example/total_energy.cpp @@ -39,7 +39,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; namespace { diff --git a/example/unmanned_aerial_vehicle.cpp b/example/unmanned_aerial_vehicle.cpp index 3e26ac08..2551110d 100644 --- a/example/unmanned_aerial_vehicle.cpp +++ b/example/unmanned_aerial_vehicle.cpp @@ -53,7 +53,7 @@ struct height_above_ellipsoid_t final : absolute_point_origin { static constexpr earth_gravity_model egm = M; }; template -inline constexpr height_above_ellipsoid_t height_above_ellipsoid; // NOLINT(google-readability-casting) +constexpr height_above_ellipsoid_t height_above_ellipsoid; // NOLINT(google-readability-casting) template using hae_altitude = quantity_point>; @@ -119,7 +119,7 @@ hae_altitude to_hae(msl_altitude msl, position pos) // **** HAL **** // clang-format off -inline constexpr struct height_above_launch final : absolute_point_origin {} height_above_launch; +constexpr struct height_above_launch final : absolute_point_origin {} height_above_launch; // clang-format on using hal_altitude = quantity_point; diff --git a/src/core/include/mp-units/bits/fmt.h b/src/core/include/mp-units/bits/fmt.h index c4572a9c..9889b971 100644 --- a/src/core/include/mp-units/bits/fmt.h +++ b/src/core/include/mp-units/bits/fmt.h @@ -122,7 +122,7 @@ public: MP_UNITS_EXPORT_END template -inline constexpr bool is_integer = +constexpr bool is_integer = std::is_integral_v && !std::is_same_v && !std::is_same_v && !std::is_same_v; // Converts a character to ASCII. Returns a number > 127 on conversion failure. diff --git a/src/core/include/mp-units/bits/hacks.h b/src/core/include/mp-units/bits/hacks.h index 5030debb..2c66f296 100644 --- a/src/core/include/mp-units/bits/hacks.h +++ b/src/core/include/mp-units/bits/hacks.h @@ -104,7 +104,7 @@ namespace std { struct from_range_t { explicit from_range_t() = default; }; -inline constexpr from_range_t from_range{}; +constexpr from_range_t from_range{}; } // namespace std diff --git a/src/core/include/mp-units/bits/text_tools.h b/src/core/include/mp-units/bits/text_tools.h index a01eb4a7..123ad858 100644 --- a/src/core/include/mp-units/bits/text_tools.h +++ b/src/core/include/mp-units/bits/text_tools.h @@ -40,32 +40,32 @@ namespace mp_units::detail { template requires(0 <= Value) && (Value < 10) -inline constexpr basic_fixed_string superscript_number = u8""; +constexpr basic_fixed_string superscript_number = u8""; template<> -inline constexpr basic_fixed_string superscript_number<0> = u8"\u2070"; +constexpr basic_fixed_string superscript_number<0> = u8"\u2070"; template<> -inline constexpr basic_fixed_string superscript_number<1> = u8"\u00b9"; +constexpr basic_fixed_string superscript_number<1> = u8"\u00b9"; template<> -inline constexpr basic_fixed_string superscript_number<2> = u8"\u00b2"; +constexpr basic_fixed_string superscript_number<2> = u8"\u00b2"; template<> -inline constexpr basic_fixed_string superscript_number<3> = u8"\u00b3"; +constexpr basic_fixed_string superscript_number<3> = u8"\u00b3"; template<> -inline constexpr basic_fixed_string superscript_number<4> = u8"\u2074"; +constexpr basic_fixed_string superscript_number<4> = u8"\u2074"; template<> -inline constexpr basic_fixed_string superscript_number<5> = u8"\u2075"; +constexpr basic_fixed_string superscript_number<5> = u8"\u2075"; template<> -inline constexpr basic_fixed_string superscript_number<6> = u8"\u2076"; +constexpr basic_fixed_string superscript_number<6> = u8"\u2076"; template<> -inline constexpr basic_fixed_string superscript_number<7> = u8"\u2077"; +constexpr basic_fixed_string superscript_number<7> = u8"\u2077"; template<> -inline constexpr basic_fixed_string superscript_number<8> = u8"\u2078"; +constexpr basic_fixed_string superscript_number<8> = u8"\u2078"; template<> -inline constexpr basic_fixed_string superscript_number<9> = u8"\u2079"; +constexpr basic_fixed_string superscript_number<9> = u8"\u2079"; -inline constexpr symbol_text superscript_minus(u8"\u207b", "-"); +constexpr symbol_text superscript_minus(u8"\u207b", "-"); -inline constexpr symbol_text superscript_prefix(u8"", "^"); +constexpr symbol_text superscript_prefix(u8"", "^"); template [[nodiscard]] consteval auto superscript_helper() diff --git a/src/core/include/mp-units/bits/type_list.h b/src/core/include/mp-units/bits/type_list.h index 203326c6..913a7a94 100644 --- a/src/core/include/mp-units/bits/type_list.h +++ b/src/core/include/mp-units/bits/type_list.h @@ -40,10 +40,10 @@ MP_UNITS_DIAGNOSTIC_IGNORE_EXPR_ALWAYS_TF namespace mp_units::detail { template -inline constexpr bool is_type_list = false; +constexpr bool is_type_list = false; template typename T, typename... Types> -inline constexpr bool is_type_list> = true; +constexpr bool is_type_list> = true; template concept TypeList = is_type_list; @@ -56,7 +56,7 @@ template typename List, typename... Types> struct type_list_size_impl> : std::integral_constant {}; template -inline constexpr std::size_t type_list_size = type_list_size_impl::value; +constexpr std::size_t type_list_size = type_list_size_impl::value; // map template typename To> diff --git a/src/core/include/mp-units/compat_macros.h b/src/core/include/mp-units/compat_macros.h index 4add3e12..f221bbbf 100644 --- a/src/core/include/mp-units/compat_macros.h +++ b/src/core/include/mp-units/compat_macros.h @@ -28,14 +28,14 @@ #if MP_UNITS_API_NO_CRTP -#define QUANTITY_SPEC(name, ...) \ - inline constexpr struct name final : ::mp_units::quantity_spec<__VA_ARGS__> { \ +#define QUANTITY_SPEC(name, ...) \ + constexpr struct name final : ::mp_units::quantity_spec<__VA_ARGS__> { \ } name #else -#define QUANTITY_SPEC(name, ...) \ - inline constexpr struct name final : ::mp_units::quantity_spec { \ +#define QUANTITY_SPEC(name, ...) \ + constexpr struct name final : ::mp_units::quantity_spec { \ } name #endif diff --git a/src/core/include/mp-units/ext/type_traits.h b/src/core/include/mp-units/ext/type_traits.h index 62e39f09..11b2b97b 100644 --- a/src/core/include/mp-units/ext/type_traits.h +++ b/src/core/include/mp-units/ext/type_traits.h @@ -60,26 +60,26 @@ using conditional = MP_UNITS_TYPENAME detail::conditional_impl::template type // is_same template -inline constexpr bool is_same_v = false; +constexpr bool is_same_v = false; template -inline constexpr bool is_same_v = true; +constexpr bool is_same_v = true; template using is_same = std::bool_constant>; // is_specialization_of template typename Type> -inline constexpr bool is_specialization_of = false; +constexpr bool is_specialization_of = false; template typename Type> -inline constexpr bool is_specialization_of, Type> = true; +constexpr bool is_specialization_of, Type> = true; template typename Type> -inline constexpr bool is_specialization_of_v = false; +constexpr bool is_specialization_of_v = false; template typename Type> -inline constexpr bool is_specialization_of_v, Type> = true; +constexpr bool is_specialization_of_v, Type> = true; MP_UNITS_EXPORT_END @@ -92,8 +92,7 @@ void to_base_specialization_of(const volatile Type*); } // namespace detail template typename Type> -inline constexpr bool is_derived_from_specialization_of = - requires(T* t) { detail::to_base_specialization_of(t); }; +constexpr bool is_derived_from_specialization_of = requires(T* t) { detail::to_base_specialization_of(t); }; namespace detail { diff --git a/src/core/include/mp-units/framework/construction_helpers.h b/src/core/include/mp-units/framework/construction_helpers.h index 6e20ebcc..3ad048d8 100644 --- a/src/core/include/mp-units/framework/construction_helpers.h +++ b/src/core/include/mp-units/framework/construction_helpers.h @@ -61,10 +61,10 @@ struct absolute_ { MP_UNITS_EXPORT_BEGIN template -inline constexpr delta_ delta{}; +constexpr delta_ delta{}; template -inline constexpr absolute_ absolute{}; +constexpr absolute_ absolute{}; MP_UNITS_EXPORT_END diff --git a/src/core/include/mp-units/framework/customization_points.h b/src/core/include/mp-units/framework/customization_points.h index 15fbf807..8d7add3f 100644 --- a/src/core/include/mp-units/framework/customization_points.h +++ b/src/core/include/mp-units/framework/customization_points.h @@ -50,11 +50,11 @@ MP_UNITS_EXPORT_BEGIN * @tparam Rep a representation type for which a type trait is defined */ template -inline constexpr bool treat_as_floating_point = std::is_floating_point_v; +constexpr bool treat_as_floating_point = std::is_floating_point_v; template requires requires { typename wrapped_type_t; } -inline constexpr bool treat_as_floating_point = treat_as_floating_point>; +constexpr bool treat_as_floating_point = treat_as_floating_point>; /** * @brief Specifies a type to have a scalar character @@ -62,7 +62,7 @@ inline constexpr bool treat_as_floating_point = treat_as_floating_point -inline constexpr bool is_scalar = std::is_floating_point_v || (std::is_integral_v && !is_same_v); +constexpr bool is_scalar = std::is_floating_point_v || (std::is_integral_v && !is_same_v); /** * @brief Specifies a type to have a vector character @@ -76,11 +76,11 @@ inline constexpr bool is_scalar = std::is_floating_point_v || (std::is_inte * @code{.cpp} * template * requires mp_units::is_scalar - * inline constexpr bool mp_units::is_vector = true; + * constexpr bool mp_units::is_vector = true; * @endcode */ template -inline constexpr bool is_vector = false; +constexpr bool is_vector = false; /** * @brief Specifies a type to have a tensor character @@ -91,7 +91,7 @@ inline constexpr bool is_vector = false; * Similarly to `is_vector` a partial specialization is needed in such cases. */ template -inline constexpr bool is_tensor = false; +constexpr bool is_tensor = false; /** * @brief A type trait that defines zero, one, min, and max for a representation type diff --git a/src/core/include/mp-units/framework/dimension.h b/src/core/include/mp-units/framework/dimension.h index 6b2cb360..71b63036 100644 --- a/src/core/include/mp-units/framework/dimension.h +++ b/src/core/include/mp-units/framework/dimension.h @@ -115,9 +115,9 @@ struct dimension_interface { * For example: * * @code{.cpp} - * inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; - * inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; - * inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; + * constexpr struct dim_length final : base_dimension<"L"> {} dim_length; + * constexpr struct dim_time final : base_dimension<"T"> {} dim_time; + * constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -184,9 +184,7 @@ struct derived_dimension final : detail::dimension_interface, detail::derived_di * dimensions are zero. It is a dimension of a quantity of dimension one also known as * "dimensionless". */ -MP_UNITS_EXPORT inline constexpr struct dimension_one final : - detail::dimension_interface, - detail::derived_dimension_impl<> { +MP_UNITS_EXPORT constexpr struct dimension_one final : detail::dimension_interface, detail::derived_dimension_impl<> { } dimension_one; namespace detail { diff --git a/src/core/include/mp-units/framework/dimension_concepts.h b/src/core/include/mp-units/framework/dimension_concepts.h index 7517ea7f..9bf7b3b1 100644 --- a/src/core/include/mp-units/framework/dimension_concepts.h +++ b/src/core/include/mp-units/framework/dimension_concepts.h @@ -53,7 +53,7 @@ template void to_base_specialization_of_base_dimension(const volatile base_dimension*); template -inline constexpr bool is_derived_from_specialization_of_base_dimension = +constexpr bool is_derived_from_specialization_of_base_dimension = requires(T* t) { to_base_specialization_of_base_dimension(t); }; /** @@ -68,16 +68,16 @@ template struct is_dimension_one : std::false_type {}; template -inline constexpr bool is_power_of_dim = requires { +constexpr bool is_power_of_dim = requires { requires is_specialization_of_power && (BaseDimension || is_dimension_one::value); }; template -inline constexpr bool is_per_of_dims = false; +constexpr bool is_per_of_dims = false; template -inline constexpr bool is_per_of_dims> = +constexpr bool is_per_of_dims> = (... && (BaseDimension || is_dimension_one::value || is_power_of_dim)); template diff --git a/src/core/include/mp-units/framework/expression_template.h b/src/core/include/mp-units/framework/expression_template.h index 72a2db0e..51522f58 100644 --- a/src/core/include/mp-units/framework/expression_template.h +++ b/src/core/include/mp-units/framework/expression_template.h @@ -57,37 +57,37 @@ struct per {}; namespace detail { template -inline constexpr bool is_specialization_of_per = false; +constexpr bool is_specialization_of_per = false; template -inline constexpr bool is_specialization_of_per> = true; +constexpr bool is_specialization_of_per> = true; template -inline constexpr bool valid_ratio = true; +constexpr bool valid_ratio = true; template -inline constexpr bool valid_ratio<0, Den...> = false; +constexpr bool valid_ratio<0, Den...> = false; template -inline constexpr bool valid_ratio = false; +constexpr bool valid_ratio = false; template<> -inline constexpr bool valid_ratio<0, 0> = false; +constexpr bool valid_ratio<0, 0> = false; template -inline constexpr bool positive_ratio = gt_zero; +constexpr bool positive_ratio = gt_zero; template -inline constexpr bool positive_ratio = gt_zero; +constexpr bool positive_ratio = gt_zero; template -inline constexpr bool ratio_one = false; +constexpr bool ratio_one = false; template<> -inline constexpr bool ratio_one<1> = true; +constexpr bool ratio_one<1> = true; template -inline constexpr bool ratio_one = true; +constexpr bool ratio_one = true; } // namespace detail @@ -127,10 +127,10 @@ using expr_type = MP_UNITS_TYPENAME detail::expr_type_impl::type; namespace detail { template -inline constexpr bool is_specialization_of_power = false; +constexpr bool is_specialization_of_power = false; template -inline constexpr bool is_specialization_of_power> = true; +constexpr bool is_specialization_of_power> = true; template consteval auto power_or_T_impl() @@ -509,10 +509,10 @@ concept expr_type_projectable = (requires { typename Proj; } || (is_specialization_of_power && requires { typename Proj; })); template typename Proj> -inline constexpr bool expr_projectable_impl = false; +constexpr bool expr_projectable_impl = false; template typename Proj> -inline constexpr bool expr_projectable_impl, Proj> = (... && expr_type_projectable); +constexpr bool expr_projectable_impl, Proj> = (... && expr_type_projectable); template typename Proj> concept expr_projectable = requires { diff --git a/src/core/include/mp-units/framework/magnitude.h b/src/core/include/mp-units/framework/magnitude.h index d1632528..84312fd3 100644 --- a/src/core/include/mp-units/framework/magnitude.h +++ b/src/core/include/mp-units/framework/magnitude.h @@ -59,10 +59,10 @@ using factorizer = wheel_factorizer<4>; namespace detail { template -inline constexpr bool is_magnitude = false; +constexpr bool is_magnitude = false; template -inline constexpr bool is_specialization_of_magnitude = false; +constexpr bool is_specialization_of_magnitude = false; } // namespace detail @@ -87,7 +87,7 @@ concept Magnitude = detail::is_magnitude; // void to_base_specialization_of_constant(const volatile constant*); // template -// inline constexpr bool is_derived_from_specialization_of_constant = +// constexpr bool is_derived_from_specialization_of_constant = // requires(T * t) { to_base_specialization_of_constant(t); }; // } // namespace detail @@ -142,7 +142,7 @@ concept Magnitude = detail::is_magnitude; namespace detail { template -inline constexpr bool is_named_magnitude = Magnitude && !detail::is_specialization_of_magnitude; +constexpr bool is_named_magnitude = Magnitude && !detail::is_specialization_of_magnitude; } @@ -178,10 +178,10 @@ struct power_v { namespace detail { template -inline constexpr bool is_specialization_of_power_v = false; +constexpr bool is_specialization_of_power_v = false; template -inline constexpr bool is_specialization_of_power_v> = true; +constexpr bool is_specialization_of_power_v> = true; } // namespace detail @@ -572,13 +572,13 @@ namespace detail { // } // template -// inline constexpr bool all_elements_valid = (is_valid_element(Elements) && ...); +// constexpr bool all_elements_valid = (is_valid_element(Elements) && ...); // template -// inline constexpr bool all_elements_in_order = strictly_increasing(get_base_value(Elements)...); +// constexpr bool all_elements_in_order = strictly_increasing(get_base_value(Elements)...); // template -// inline constexpr bool is_element_pack_valid = all_elements_valid && all_elements_in_order; +// constexpr bool is_element_pack_valid = all_elements_valid && all_elements_in_order; [[nodiscard]] consteval bool is_rational(MagnitudeSpec auto element) { @@ -707,15 +707,14 @@ template void to_base_specialization_of_magnitude(const volatile magnitude*); template -inline constexpr bool is_derived_from_specialization_of_magnitude = - requires(T* t) { to_base_specialization_of_magnitude(t); }; +constexpr bool is_derived_from_specialization_of_magnitude = requires(T* t) { to_base_specialization_of_magnitude(t); }; template requires is_derived_from_specialization_of_magnitude -inline constexpr bool is_magnitude = true; +constexpr bool is_magnitude = true; template -inline constexpr bool is_specialization_of_magnitude> = true; +constexpr bool is_specialization_of_magnitude> = true; } // namespace detail @@ -726,12 +725,12 @@ MP_UNITS_EXPORT_BEGIN */ #if MP_UNITS_COMP_CLANG -inline constexpr struct mag_pi : magnitude}> { +constexpr struct mag_pi : magnitude}> { } mag_pi; #else -inline constexpr struct mag_pi : magnitude> { +constexpr struct mag_pi : magnitude> { } mag_pi; #endif @@ -882,7 +881,7 @@ using common_magnitude_type = decltype(common_magnitude_type_impl(M)); // // WARNING: The program behaviour will be undefined if you provide a wrong answer, so check your math! MP_UNITS_EXPORT template -inline constexpr std::optional known_first_factor = std::nullopt; +constexpr std::optional known_first_factor = std::nullopt; namespace detail { @@ -915,7 +914,7 @@ struct prime_factorization<1> { }; template -inline constexpr auto prime_factorization_v = prime_factorization::value; +constexpr auto prime_factorization_v = prime_factorization::value; } // namespace detail @@ -927,18 +926,18 @@ inline constexpr auto prime_factorization_v = prime_factorization::value; */ MP_UNITS_EXPORT template requires detail::gt_zero -inline constexpr Magnitude auto mag = detail::prime_factorization_v; +constexpr Magnitude auto mag = detail::prime_factorization_v; MP_UNITS_EXPORT template requires detail::gt_zero -inline constexpr Magnitude auto mag_ratio = detail::prime_factorization_v / detail::prime_factorization_v; +constexpr Magnitude auto mag_ratio = detail::prime_factorization_v / detail::prime_factorization_v; /** * @brief Create a Magnitude which is some rational number raised to a rational power. */ MP_UNITS_EXPORT template requires detail::gt_zero -inline constexpr Magnitude auto mag_power = pow(mag); +constexpr Magnitude auto mag_power = pow(mag); namespace detail { @@ -960,7 +959,7 @@ template return integer_part((detail::abs(power_of_2) < detail::abs(power_of_5)) ? power_of_2 : power_of_5); } -inline constexpr symbol_text base_multiplier(u8"× 10", "x 10"); +constexpr symbol_text base_multiplier(u8"× 10", "x 10"); template [[nodiscard]] consteval auto magnitude_text() diff --git a/src/core/include/mp-units/framework/quantity_concepts.h b/src/core/include/mp-units/framework/quantity_concepts.h index 37929f19..66b03efe 100644 --- a/src/core/include/mp-units/framework/quantity_concepts.h +++ b/src/core/include/mp-units/framework/quantity_concepts.h @@ -40,8 +40,7 @@ template void to_base_specialization_of_quantity(const volatile quantity*); template -inline constexpr bool is_derived_from_specialization_of_quantity = - requires(T* t) { to_base_specialization_of_quantity(t); }; +constexpr bool is_derived_from_specialization_of_quantity = requires(T* t) { to_base_specialization_of_quantity(t); }; } // namespace detail diff --git a/src/core/include/mp-units/framework/quantity_point.h b/src/core/include/mp-units/framework/quantity_point.h index aa4763d6..a3d07fed 100644 --- a/src/core/include/mp-units/framework/quantity_point.h +++ b/src/core/include/mp-units/framework/quantity_point.h @@ -43,7 +43,7 @@ namespace mp_units { namespace detail { template -inline constexpr bool is_specialization_of_zeroth_point_origin = false; +constexpr bool is_specialization_of_zeroth_point_origin = false; template [[nodiscard]] consteval bool is_zeroth_point_origin(PO) @@ -130,12 +130,12 @@ template struct zeroth_point_origin_ final : absolute_point_origin {}; MP_UNITS_EXPORT template -inline constexpr zeroth_point_origin_ zeroth_point_origin; +constexpr zeroth_point_origin_ zeroth_point_origin; namespace detail { template -inline constexpr bool is_specialization_of_zeroth_point_origin> = true; +constexpr bool is_specialization_of_zeroth_point_origin> = true; } // namespace detail diff --git a/src/core/include/mp-units/framework/quantity_point_concepts.h b/src/core/include/mp-units/framework/quantity_point_concepts.h index a262ea7d..8176f6a7 100644 --- a/src/core/include/mp-units/framework/quantity_point_concepts.h +++ b/src/core/include/mp-units/framework/quantity_point_concepts.h @@ -38,13 +38,13 @@ struct absolute_point_origin; namespace detail { template -inline constexpr bool is_quantity_point = false; +constexpr bool is_quantity_point = false; template void to_base_specialization_of_absolute_point_origin(const volatile absolute_point_origin*); template -inline constexpr bool is_derived_from_specialization_of_absolute_point_origin = +constexpr bool is_derived_from_specialization_of_absolute_point_origin = requires(T* t) { to_base_specialization_of_absolute_point_origin(t); }; } // namespace detail @@ -66,7 +66,7 @@ template void to_base_specialization_of_relative_point_origin(const volatile relative_point_origin*); template -inline constexpr bool is_derived_from_specialization_of_relative_point_origin = +constexpr bool is_derived_from_specialization_of_relative_point_origin = requires(T* t) { to_base_specialization_of_relative_point_origin(t); }; struct point_origin_interface; @@ -99,12 +99,12 @@ template void to_base_specialization_of_quantity_point(const volatile quantity_point*); template -inline constexpr bool is_derived_from_specialization_of_quantity_point = +constexpr bool is_derived_from_specialization_of_quantity_point = requires(T* t) { to_base_specialization_of_quantity_point(t); }; template requires is_derived_from_specialization_of_quantity_point -inline constexpr bool is_quantity_point = true; +constexpr bool is_quantity_point = true; template [[nodiscard]] consteval bool same_absolute_point_origins(PO1 po1, PO2 po2) diff --git a/src/core/include/mp-units/framework/quantity_spec.h b/src/core/include/mp-units/framework/quantity_spec.h index 88eec204..a58a73e1 100644 --- a/src/core/include/mp-units/framework/quantity_spec.h +++ b/src/core/include/mp-units/framework/quantity_spec.h @@ -189,7 +189,7 @@ struct quantity_spec_interface : quantity_spec_interface_base { MP_UNITS_EXPORT_BEGIN -inline constexpr struct is_kind { +constexpr struct is_kind { } is_kind; /** @@ -235,13 +235,13 @@ MP_UNITS_EXPORT_END * For example: * * @code{.cpp} - * inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; - * inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; - * inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; + * constexpr struct dim_length final : base_dimension<"L"> {} dim_length; + * constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; + * constexpr struct dim_time final : base_dimension<"T"> {} dim_time; * - * inline constexpr struct length final : quantity_spec {} length; - * inline constexpr struct mass final : quantity_spec {} mass; - * inline constexpr struct time final : quantity_spec {} time; + * constexpr struct length final : quantity_spec {} length; + * constexpr struct mass final : quantity_spec {} mass; + * constexpr struct time final : quantity_spec {} time; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -280,12 +280,12 @@ struct quantity_spec : detail::quantity_spec_interface * For example: * * @code{.cpp} - * inline constexpr struct area final : quantity_spec(length)> {} area; - * inline constexpr struct volume final : quantity_spec(length)> {} volume; - * inline constexpr struct velocity final : quantity_spec {} velocity; - * inline constexpr struct speed final : quantity_spec {} speed; - * inline constexpr struct force final : quantity_spec {} force; - * inline constexpr struct power final : quantity_spec {} power; + * constexpr struct area final : quantity_spec(length)> {} area; + * constexpr struct volume final : quantity_spec(length)> {} volume; + * constexpr struct velocity final : quantity_spec {} velocity; + * constexpr struct speed final : quantity_spec {} speed; + * constexpr struct force final : quantity_spec {} force; + * constexpr struct power final : quantity_spec {} power; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -335,10 +335,10 @@ struct propagate_equation { * For example: * * @code{.cpp} - * inline constexpr struct width final : quantity_spec {} width; - * inline constexpr struct height final : quantity_spec {} height; - * inline constexpr struct diameter final : quantity_spec {} diameter; - * inline constexpr struct position_vector final : quantity_spec {} position_vector; + * constexpr struct width final : quantity_spec {} width; + * constexpr struct height final : quantity_spec {} height; + * constexpr struct diameter final : quantity_spec {} diameter; + * constexpr struct position_vector final : quantity_spec {} position_vector; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -396,10 +396,10 @@ struct quantity_spec : detail::propagate_equation, detail * For example: * * @code{.cpp} - * inline constexpr struct angular_measure final : quantity_spec {} angular_measure; - * inline constexpr struct velocity final : quantity_spec {} velocity; - * inline constexpr struct weight final : quantity_spec {} weight; - * inline constexpr struct kinetic_energy final : quantity_spec(speed)> {} kinetic_energy; + * constexpr struct angular_measure final : quantity_spec {} angular_measure; + * constexpr struct velocity final : quantity_spec {} velocity; + * constexpr struct weight final : quantity_spec {} weight; + * constexpr struct kinetic_energy final : quantity_spec(speed)> {} kinetic_energy; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -556,7 +556,7 @@ struct kind_of_ final : quantity_spec, Q{}>::_base_type_ { MP_UNITS_EXPORT template requires detail::SameQuantitySpec -inline constexpr kind_of_ kind_of; +constexpr kind_of_ kind_of; namespace detail { diff --git a/src/core/include/mp-units/framework/quantity_spec_concepts.h b/src/core/include/mp-units/framework/quantity_spec_concepts.h index 9eac9f2d..296e7e9d 100644 --- a/src/core/include/mp-units/framework/quantity_spec_concepts.h +++ b/src/core/include/mp-units/framework/quantity_spec_concepts.h @@ -53,10 +53,10 @@ struct kind_of_; namespace detail { template -inline constexpr bool is_specialization_of_kind_of = false; +constexpr bool is_specialization_of_kind_of = false; template -inline constexpr bool is_specialization_of_kind_of> = true; +constexpr bool is_specialization_of_kind_of> = true; template concept QuantityKindSpec = is_specialization_of_kind_of; @@ -70,7 +70,7 @@ void to_base_specialization_of_quantity_spec(const volatile quantity_spec -inline constexpr bool is_derived_from_specialization_of_quantity_spec = +constexpr bool is_derived_from_specialization_of_quantity_spec = requires(T* t) { to_base_specialization_of_quantity_spec(t); }; /** @@ -86,16 +86,16 @@ template struct is_dimensionless : std::false_type {}; template -inline constexpr bool is_power_of_quantity_spec = requires { +constexpr bool is_power_of_quantity_spec = requires { requires is_specialization_of_power && (NamedQuantitySpec || is_dimensionless::value); }; template -inline constexpr bool is_per_of_quantity_specs = false; +constexpr bool is_per_of_quantity_specs = false; template -inline constexpr bool is_per_of_quantity_specs> = +constexpr bool is_per_of_quantity_specs> = (... && (NamedQuantitySpec || is_dimensionless::value || is_power_of_quantity_spec)); template diff --git a/src/core/include/mp-units/framework/system_reference.h b/src/core/include/mp-units/framework/system_reference.h index 3df21be2..6bac8d79 100644 --- a/src/core/include/mp-units/framework/system_reference.h +++ b/src/core/include/mp-units/framework/system_reference.h @@ -45,15 +45,15 @@ namespace mp_units { * @code{.cpp} * // hypothetical natural system of units for c=1 * - * inline constexpr struct second final : named_unit<"s"> {} second; - * inline constexpr struct minute final : named_unit<"min", mag<60> * second> {} minute; - * inline constexpr struct gram final : named_unit<"g"> {} gram; - * inline constexpr auto kilogram = si::kilo; + * constexpr struct second final : named_unit<"s"> {} second; + * constexpr struct minute final : named_unit<"min", mag<60> * second> {} minute; + * constexpr struct gram final : named_unit<"g"> {} gram; + * constexpr auto kilogram = si::kilo; * - * inline constexpr struct time : system_reference {} time; - * inline constexpr struct length : system_reference {} length; - * inline constexpr struct speed : system_reference {} speed; - * inline constexpr struct force : system_reference {} force; + * constexpr struct time : system_reference {} time; + * constexpr struct length : system_reference {} length; + * constexpr struct speed : system_reference {} speed; + * constexpr struct force : system_reference {} force; * @endcode * * @tparam Q quantity for which a unit is being assigned diff --git a/src/core/include/mp-units/framework/unit.h b/src/core/include/mp-units/framework/unit.h index 411f3256..1e564107 100644 --- a/src/core/include/mp-units/framework/unit.h +++ b/src/core/include/mp-units/framework/unit.h @@ -64,7 +64,7 @@ template struct scaled_unit_impl; template -inline constexpr bool is_specialization_of_scaled_unit = false; +constexpr bool is_specialization_of_scaled_unit = false; template struct derived_unit_impl; @@ -241,7 +241,7 @@ struct scaled_unit final : detail::scaled_unit_impl {}; namespace detail { template -inline constexpr bool is_specialization_of_scaled_unit> = true; +constexpr bool is_specialization_of_scaled_unit> = true; } // namespace detail @@ -256,12 +256,12 @@ inline constexpr bool is_specialization_of_scaled_unit> = true * For example: * * @code{.cpp} - * inline constexpr struct second final : named_unit<"s", kind_of B; + * constexpr struct A : absolute_point_origin A; + * constexpr struct B : relative_point_origin B; * * using ToQP = quantity_point; * auto qp = value_cast(quantity_point{1.23 * m}); diff --git a/src/systems/include/mp-units/systems/angular/units.h b/src/systems/include/mp-units/systems/angular/units.h index b8ebdfd9..75e5eaea 100644 --- a/src/systems/include/mp-units/systems/angular/units.h +++ b/src/systems/include/mp-units/systems/angular/units.h @@ -36,34 +36,34 @@ namespace mp_units { namespace angular { // clang-format off -inline constexpr struct dim_angle final : base_dimension<"A"> {} dim_angle; +constexpr struct dim_angle final : base_dimension<"A"> {} dim_angle; QUANTITY_SPEC(angle, dim_angle); QUANTITY_SPEC(solid_angle, pow<2>(angle)); -inline constexpr struct radian final : named_unit<"rad", kind_of> {} radian; -inline constexpr struct revolution final : named_unit<"rev", mag<2> * mag_pi * radian> {} revolution; -inline constexpr struct degree final : named_unit * revolution> {} degree; -inline constexpr struct gradian final : named_unit * revolution> {} gradian; -inline constexpr struct steradian final : named_unit<"sr", square(radian)> {} steradian; +constexpr struct radian final : named_unit<"rad", kind_of> {} radian; +constexpr struct revolution final : named_unit<"rev", mag<2> * mag_pi * radian> {} revolution; +constexpr struct degree final : named_unit * revolution> {} degree; +constexpr struct gradian final : named_unit * revolution> {} gradian; +constexpr struct steradian final : named_unit<"sr", square(radian)> {} steradian; // clang-format on namespace unit_symbols { -inline constexpr auto rad = radian; -inline constexpr auto rev = revolution; -inline constexpr auto deg = degree; -inline constexpr auto grad = gradian; -inline constexpr auto sr = steradian; -inline constexpr auto rad2 = square(radian); -inline constexpr auto deg2 = square(degree); +constexpr auto rad = radian; +constexpr auto rev = revolution; +constexpr auto deg = degree; +constexpr auto grad = gradian; +constexpr auto sr = steradian; +constexpr auto rad2 = square(radian); +constexpr auto deg2 = square(degree); } // namespace unit_symbols } // namespace angular template<> -inline constexpr bool space_before_unit_symbol = false; +constexpr bool space_before_unit_symbol = false; template<> -inline constexpr bool space_before_unit_symbol = false; +constexpr bool space_before_unit_symbol = false; } // namespace mp_units diff --git a/src/systems/include/mp-units/systems/cgs.h b/src/systems/include/mp-units/systems/cgs.h index 9ae0d265..ad65a7fa 100644 --- a/src/systems/include/mp-units/systems/cgs.h +++ b/src/systems/include/mp-units/systems/cgs.h @@ -35,35 +35,35 @@ MP_UNITS_EXPORT namespace mp_units::cgs { // clang-format off -inline constexpr auto centimetre = si::centi; -inline constexpr auto gram = si::gram; -inline constexpr auto second = si::second; -inline constexpr struct gal final : named_unit<"Gal", centimetre / square(second)> {} gal; -inline constexpr struct dyne final : named_unit<"dyn", gram * centimetre / square(second)> {} dyne; -inline constexpr struct erg final : named_unit<"erg", dyne * centimetre> {} erg; -inline constexpr struct barye final : named_unit<"Ba", gram / (centimetre * square(second))> {} barye; -inline constexpr struct poise final : named_unit<"P", gram / (centimetre * second)> {} poise; -inline constexpr struct stokes final : named_unit<"St", square(centimetre) / second> {} stokes; -inline constexpr struct kayser final : named_unit<"K", one / centimetre> {} kayser; +constexpr auto centimetre = si::centi; +constexpr auto gram = si::gram; +constexpr auto second = si::second; +constexpr struct gal final : named_unit<"Gal", centimetre / square(second)> {} gal; +constexpr struct dyne final : named_unit<"dyn", gram * centimetre / square(second)> {} dyne; +constexpr struct erg final : named_unit<"erg", dyne * centimetre> {} erg; +constexpr struct barye final : named_unit<"Ba", gram / (centimetre * square(second))> {} barye; +constexpr struct poise final : named_unit<"P", gram / (centimetre * second)> {} poise; +constexpr struct stokes final : named_unit<"St", square(centimetre) / second> {} stokes; +constexpr struct kayser final : named_unit<"K", one / centimetre> {} kayser; // clang-format on namespace unit_symbols { -inline constexpr auto cm = centimetre; -inline constexpr auto g = gram; -inline constexpr auto s = second; -inline constexpr auto Gal = gal; -inline constexpr auto dyn = dyne; -inline constexpr auto Ba = barye; -inline constexpr auto P = poise; -inline constexpr auto St = stokes; -inline constexpr auto K = kayser; +constexpr auto cm = centimetre; +constexpr auto g = gram; +constexpr auto s = second; +constexpr auto Gal = gal; +constexpr auto dyn = dyne; +constexpr auto Ba = barye; +constexpr auto P = poise; +constexpr auto St = stokes; +constexpr auto K = kayser; // commonly used squared and cubic units -inline constexpr auto cm2 = square(centimetre); -inline constexpr auto cm3 = cubic(centimetre); -inline constexpr auto s2 = square(second); -inline constexpr auto s3 = cubic(second); +constexpr auto cm2 = square(centimetre); +constexpr auto cm3 = cubic(centimetre); +constexpr auto s2 = square(second); +constexpr auto s3 = cubic(second); } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/hep.h b/src/systems/include/mp-units/systems/hep.h index 77f6a516..8ea81cc3 100644 --- a/src/systems/include/mp-units/systems/hep.h +++ b/src/systems/include/mp-units/systems/hep.h @@ -36,7 +36,7 @@ MP_UNITS_EXPORT namespace mp_units { template<> -inline constexpr std::optional known_first_factor<334'524'384'739> = 334'524'384'739; +constexpr std::optional known_first_factor<334'524'384'739> = 334'524'384'739; namespace hep { @@ -49,64 +49,64 @@ using si::electronvolt; // effective cross-sectional area according to EU council directive 80/181/EEC // https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:01980L0181-20090527#page=10 // https://www.fedlex.admin.ch/eli/cc/1994/3109_3109_3109/de -inline constexpr struct barn final : named_unit<"b", mag_power<10, -28> * square(si::metre)> {} barn; +constexpr struct barn final : named_unit<"b", mag_power<10, -28> * square(si::metre)> {} barn; // mass -inline constexpr struct electron_mass final : named_unit<"m_e", mag_ratio<9'109'383'701'528, 1'000'000'000'000> * mag_power<10, -31> * si::kilogram> {} electron_mass; -inline constexpr struct proton_mass final : named_unit<"m_p", mag_ratio<1'672'621'923'695, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} proton_mass; -inline constexpr struct neutron_mass final : named_unit<"m_n", mag_ratio<1'674'927'498'049, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} neutron_mass; +constexpr struct electron_mass final : named_unit<"m_e", mag_ratio<9'109'383'701'528, 1'000'000'000'000> * mag_power<10, -31> * si::kilogram> {} electron_mass; +constexpr struct proton_mass final : named_unit<"m_p", mag_ratio<1'672'621'923'695, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} proton_mass; +constexpr struct neutron_mass final : named_unit<"m_n", mag_ratio<1'674'927'498'049, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} neutron_mass; // speed -inline constexpr auto speed_of_light = si::si2019::speed_of_light_in_vacuum; +constexpr auto speed_of_light = si::si2019::speed_of_light_in_vacuum; // clang-format on namespace unit_symbols { using si::unit_symbols::eV; -inline constexpr auto qeV = si::quecto; -inline constexpr auto reV = si::ronto; -inline constexpr auto yeV = si::yocto; -inline constexpr auto zeV = si::zepto; -inline constexpr auto aeV = si::atto; -inline constexpr auto feV = si::femto; -inline constexpr auto peV = si::pico; -inline constexpr auto neV = si::nano; -inline constexpr auto ueV = si::micro; -inline constexpr auto meV = si::milli; -inline constexpr auto ceV = si::centi; -inline constexpr auto deV = si::deci; -inline constexpr auto daeV = si::deca; -inline constexpr auto heV = si::hecto; -inline constexpr auto keV = si::kilo; -inline constexpr auto MeV = si::mega; -inline constexpr auto GeV = si::giga; -inline constexpr auto TeV = si::tera; -inline constexpr auto PeV = si::peta; -inline constexpr auto EeV = si::exa; -inline constexpr auto ZeV = si::zetta; -inline constexpr auto YeV = si::yotta; -inline constexpr auto ReV = si::ronna; -inline constexpr auto QeV = si::quetta; +constexpr auto qeV = si::quecto; +constexpr auto reV = si::ronto; +constexpr auto yeV = si::yocto; +constexpr auto zeV = si::zepto; +constexpr auto aeV = si::atto; +constexpr auto feV = si::femto; +constexpr auto peV = si::pico; +constexpr auto neV = si::nano; +constexpr auto ueV = si::micro; +constexpr auto meV = si::milli; +constexpr auto ceV = si::centi; +constexpr auto deV = si::deci; +constexpr auto daeV = si::deca; +constexpr auto heV = si::hecto; +constexpr auto keV = si::kilo; +constexpr auto MeV = si::mega; +constexpr auto GeV = si::giga; +constexpr auto TeV = si::tera; +constexpr auto PeV = si::peta; +constexpr auto EeV = si::exa; +constexpr auto ZeV = si::zetta; +constexpr auto YeV = si::yotta; +constexpr auto ReV = si::ronna; +constexpr auto QeV = si::quetta; -inline constexpr auto qb = si::quecto; -inline constexpr auto rb = si::ronto; -inline constexpr auto yb = si::yocto; -inline constexpr auto zb = si::zepto; -inline constexpr auto ab = si::atto; -inline constexpr auto fb = si::femto; -inline constexpr auto pb = si::pico; -inline constexpr auto nb = si::nano; -inline constexpr auto ub = si::micro; -inline constexpr auto mb = si::milli; -inline constexpr auto b = barn; +constexpr auto qb = si::quecto; +constexpr auto rb = si::ronto; +constexpr auto yb = si::yocto; +constexpr auto zb = si::zepto; +constexpr auto ab = si::atto; +constexpr auto fb = si::femto; +constexpr auto pb = si::pico; +constexpr auto nb = si::nano; +constexpr auto ub = si::micro; +constexpr auto mb = si::milli; +constexpr auto b = barn; -inline constexpr auto m_e = electron_mass; -inline constexpr auto m_p = proton_mass; -inline constexpr auto m_n = neutron_mass; +constexpr auto m_e = electron_mass; +constexpr auto m_p = proton_mass; +constexpr auto m_n = neutron_mass; -inline constexpr auto c = speed_of_light; -inline constexpr auto c2 = square(speed_of_light); +constexpr auto c = speed_of_light; +constexpr auto c2 = square(speed_of_light); } // namespace unit_symbols } // namespace hep diff --git a/src/systems/include/mp-units/systems/iau.h b/src/systems/include/mp-units/systems/iau.h index c81777aa..d08c0c73 100644 --- a/src/systems/include/mp-units/systems/iau.h +++ b/src/systems/include/mp-units/systems/iau.h @@ -39,65 +39,65 @@ namespace mp_units::iau { // clang-format off // time -inline constexpr struct day final : named_unit<"D", si::day> {} day; -inline constexpr struct Julian_year final : named_unit<"a", mag_ratio<365'25, 100> * day> {} Julian_year; +constexpr struct day final : named_unit<"D", si::day> {} day; +constexpr struct Julian_year final : named_unit<"a", mag_ratio<365'25, 100> * day> {} Julian_year; // mass // https://en.wikipedia.org/wiki/Solar_mass // TODO What is the official mass of sun (every source in the Internet provides a different value) -inline constexpr struct solar_mass final : named_unit * mag_power<10, 30> * si::kilogram> {} solar_mass; -inline constexpr struct Jupiter_mass final : named_unit<"M_JUP", mag_ratio<1'898, 1'000> * mag_power<10, 27> * si::kilogram> {} Jupiter_mass; -inline constexpr struct Earth_mass final : named_unit<"M_EARTH", mag_ratio<59'742, 10'000> * mag_power<10, 24> * si::kilogram> {} Earth_mass; +constexpr struct solar_mass final : named_unit * mag_power<10, 30> * si::kilogram> {} solar_mass; +constexpr struct Jupiter_mass final : named_unit<"M_JUP", mag_ratio<1'898, 1'000> * mag_power<10, 27> * si::kilogram> {} Jupiter_mass; +constexpr struct Earth_mass final : named_unit<"M_EARTH", mag_ratio<59'742, 10'000> * mag_power<10, 24> * si::kilogram> {} Earth_mass; // length -inline constexpr auto astronomical_unit = si::astronomical_unit; +constexpr auto astronomical_unit = si::astronomical_unit; // https://en.wikipedia.org/wiki/Lunar_distance_(astronomy) -inline constexpr struct lunar_distance final : named_unit<"LD", mag<384'399> * si::kilo> {} lunar_distance; +constexpr struct lunar_distance final : named_unit<"LD", mag<384'399> * si::kilo> {} lunar_distance; // https://en.wikipedia.org/wiki/Light-year -inline constexpr struct light_year final : named_unit<"ly", mag<9'460'730'472'580'800> * si::metre> {} light_year; +constexpr struct light_year final : named_unit<"ly", mag<9'460'730'472'580'800> * si::metre> {} light_year; // https://en.wikipedia.org/wiki/Parsec -inline constexpr struct parsec final : named_unit<"pc", astronomical_unit / (mag_ratio<1, 3600> * si::degree)> {} parsec; +constexpr struct parsec final : named_unit<"pc", astronomical_unit / (mag_ratio<1, 3600> * si::degree)> {} parsec; // https://en.wikipedia.org/wiki/Angstrom -inline constexpr struct angstrom final : named_unit * si::metre> {} angstrom; +constexpr struct angstrom final : named_unit * si::metre> {} angstrom; // selected constants // https://en.wikipedia.org/wiki/Astronomical_constant -inline constexpr struct gaussian_gravitational_constant final : +constexpr struct gaussian_gravitational_constant final : named_unit<"k", mag_ratio<1'720'209'895, 100'000'000'000> * pow<3, 2>(astronomical_unit) / pow<1,2>(solar_mass) / day> {} gaussian_gravitational_constant; -inline constexpr struct speed_of_light final : +constexpr struct speed_of_light final : named_unit {} speed_of_light; -inline constexpr struct constant_of_gravitation final : +constexpr struct constant_of_gravitation final : named_unit<"G", mag_ratio<667'430, 100'000> * mag_power<10, -11> * cubic(si::metre) / si::kilogram / square(si::second)> {} constant_of_gravitation; -inline constexpr struct hubble_constant final : +constexpr struct hubble_constant final : named_unit * si::kilo / si::second / si::mega> {} hubble_constant; // clang-format on namespace unit_symbols { -inline constexpr auto D = day; -inline constexpr auto a = Julian_year; +constexpr auto D = day; +constexpr auto a = Julian_year; -inline constexpr auto M_SUN = solar_mass; -inline constexpr auto M_JUP = Jupiter_mass; -inline constexpr auto M_EARTH = Earth_mass; +constexpr auto M_SUN = solar_mass; +constexpr auto M_JUP = Jupiter_mass; +constexpr auto M_EARTH = Earth_mass; -inline constexpr auto au = astronomical_unit; -inline constexpr auto LD = lunar_distance; -inline constexpr auto ly = light_year; -inline constexpr auto pc = parsec; -inline constexpr auto A = angstrom; +constexpr auto au = astronomical_unit; +constexpr auto LD = lunar_distance; +constexpr auto ly = light_year; +constexpr auto pc = parsec; +constexpr auto A = angstrom; -inline constexpr auto k = gaussian_gravitational_constant; -inline constexpr auto c_0 = speed_of_light; -inline constexpr auto G = constant_of_gravitation; -inline constexpr auto H_0 = hubble_constant; +constexpr auto k = gaussian_gravitational_constant; +constexpr auto c_0 = speed_of_light; +constexpr auto G = constant_of_gravitation; +constexpr auto H_0 = hubble_constant; } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/iec80000/binary_prefixes.h b/src/systems/include/mp-units/systems/iec80000/binary_prefixes.h index 5eb39132..e09a218d 100644 --- a/src/systems/include/mp-units/systems/iec80000/binary_prefixes.h +++ b/src/systems/include/mp-units/systems/iec80000/binary_prefixes.h @@ -42,14 +42,14 @@ template struct yobi_ final : prefixed_unit<"Yi", mag_power<2, MP_UNITS_EXPORT_BEGIN -template inline constexpr kibi_ kibi; -template inline constexpr mebi_ mebi; -template inline constexpr gibi_ gibi; -template inline constexpr tebi_ tebi; -template inline constexpr pebi_ pebi; -template inline constexpr exbi_ exbi; -template inline constexpr zebi_ zebi; -template inline constexpr yobi_ yobi; +template constexpr kibi_ kibi; +template constexpr mebi_ mebi; +template constexpr gibi_ gibi; +template constexpr tebi_ tebi; +template constexpr pebi_ pebi; +template constexpr exbi_ exbi; +template constexpr zebi_ zebi; +template constexpr yobi_ yobi; // clang-format on MP_UNITS_EXPORT_END diff --git a/src/systems/include/mp-units/systems/iec80000/quantities.h b/src/systems/include/mp-units/systems/iec80000/quantities.h index f9b23547..f4717308 100644 --- a/src/systems/include/mp-units/systems/iec80000/quantities.h +++ b/src/systems/include/mp-units/systems/iec80000/quantities.h @@ -36,40 +36,40 @@ namespace mp_units::iec80000 { // dimensions of base quantities // clang-format off -inline constexpr struct dim_traffic_intensity final : base_dimension<"A"> {} dim_traffic_intensity; +constexpr struct dim_traffic_intensity final : base_dimension<"A"> {} dim_traffic_intensity; // clang-format on // quantities QUANTITY_SPEC(traffic_intensity, dim_traffic_intensity); QUANTITY_SPEC(traffic_offered_intensity, traffic_intensity); QUANTITY_SPEC(traffic_carried_intensity, traffic_intensity); -inline constexpr auto traffic_load = traffic_carried_intensity; +constexpr auto traffic_load = traffic_carried_intensity; QUANTITY_SPEC(mean_queue_length, dimensionless); QUANTITY_SPEC(loss_probability, dimensionless); QUANTITY_SPEC(waiting_probability, dimensionless); QUANTITY_SPEC(call_intensity, inverse(isq::duration)); -inline constexpr auto calling_rate = call_intensity; +constexpr auto calling_rate = call_intensity; QUANTITY_SPEC(completed_call_intensity, call_intensity); QUANTITY_SPEC(storage_capacity, dimensionless, is_kind); -inline constexpr auto storage_size = storage_capacity; +constexpr auto storage_size = storage_capacity; QUANTITY_SPEC(equivalent_binary_storage_capacity, storage_capacity); QUANTITY_SPEC(transfer_rate, storage_capacity / isq::duration); QUANTITY_SPEC(period_of_data_elements, isq::period, inverse(transfer_rate)); QUANTITY_SPEC(binary_digit_rate, transfer_rate); -inline constexpr auto bit_rate = binary_digit_rate; +constexpr auto bit_rate = binary_digit_rate; QUANTITY_SPEC(period_of_binary_digits, isq::period, inverse(binary_digit_rate)); -inline constexpr auto bit_period = period_of_binary_digits; +constexpr auto bit_period = period_of_binary_digits; QUANTITY_SPEC(equivalent_binary_digit_rate, binary_digit_rate); -inline constexpr auto equivalent_bit_rate = bit_rate; +constexpr auto equivalent_bit_rate = bit_rate; QUANTITY_SPEC(modulation_rate, inverse(isq::duration)); -inline constexpr auto line_digit_rate = modulation_rate; +constexpr auto line_digit_rate = modulation_rate; QUANTITY_SPEC(quantizing_distortion_power, isq::power); QUANTITY_SPEC(carrier_power, isq::power); QUANTITY_SPEC(signal_energy_per_binary_digit, carrier_power* period_of_binary_digits); QUANTITY_SPEC(error_probability, dimensionless); QUANTITY_SPEC(Hamming_distance, dimensionless); QUANTITY_SPEC(clock_frequency, isq::frequency); -inline constexpr auto clock_rate = clock_frequency; +constexpr auto clock_rate = clock_frequency; QUANTITY_SPEC(decision_content, dimensionless); // TODO how to model information_content and the following quantities??? diff --git a/src/systems/include/mp-units/systems/iec80000/unit_symbols.h b/src/systems/include/mp-units/systems/iec80000/unit_symbols.h index 53d423a8..873d731f 100644 --- a/src/systems/include/mp-units/systems/iec80000/unit_symbols.h +++ b/src/systems/include/mp-units/systems/iec80000/unit_symbols.h @@ -31,81 +31,81 @@ MP_UNITS_EXPORT namespace mp_units::iec80000::unit_symbols { // bit -inline constexpr auto kbit = si::kilo; -inline constexpr auto Mbit = si::mega; -inline constexpr auto Gbit = si::giga; -inline constexpr auto Tbit = si::tera; -inline constexpr auto Pbit = si::peta; -inline constexpr auto Ebit = si::exa; -inline constexpr auto Zbit = si::zetta; -inline constexpr auto Ybit = si::yotta; -inline constexpr auto Rbit = si::ronna; -inline constexpr auto Qbit = si::quetta; +constexpr auto kbit = si::kilo; +constexpr auto Mbit = si::mega; +constexpr auto Gbit = si::giga; +constexpr auto Tbit = si::tera; +constexpr auto Pbit = si::peta; +constexpr auto Ebit = si::exa; +constexpr auto Zbit = si::zetta; +constexpr auto Ybit = si::yotta; +constexpr auto Rbit = si::ronna; +constexpr auto Qbit = si::quetta; -inline constexpr auto Kibit = kibi; -inline constexpr auto Mibit = mebi; -inline constexpr auto Gibit = gibi; -inline constexpr auto Tibit = tebi; -inline constexpr auto Pibit = pebi; -inline constexpr auto Eibit = exbi; +constexpr auto Kibit = kibi; +constexpr auto Mibit = mebi; +constexpr auto Gibit = gibi; +constexpr auto Tibit = tebi; +constexpr auto Pibit = pebi; +constexpr auto Eibit = exbi; // octet -inline constexpr auto o = octet; +constexpr auto o = octet; -inline constexpr auto ko = si::kilo; -inline constexpr auto Mo = si::mega; -inline constexpr auto Go = si::giga; -inline constexpr auto To = si::tera; -inline constexpr auto Po = si::peta; -inline constexpr auto Eo = si::exa; -inline constexpr auto Zo = si::zetta; -inline constexpr auto Yo = si::yotta; -inline constexpr auto Ro = si::ronna; -inline constexpr auto Qo = si::quetta; +constexpr auto ko = si::kilo; +constexpr auto Mo = si::mega; +constexpr auto Go = si::giga; +constexpr auto To = si::tera; +constexpr auto Po = si::peta; +constexpr auto Eo = si::exa; +constexpr auto Zo = si::zetta; +constexpr auto Yo = si::yotta; +constexpr auto Ro = si::ronna; +constexpr auto Qo = si::quetta; -inline constexpr auto Kio = kibi; -inline constexpr auto Mio = mebi; -inline constexpr auto Gio = gibi; -inline constexpr auto Tio = tebi; -inline constexpr auto Pio = pebi; -inline constexpr auto Eio = exbi; +constexpr auto Kio = kibi; +constexpr auto Mio = mebi; +constexpr auto Gio = gibi; +constexpr auto Tio = tebi; +constexpr auto Pio = pebi; +constexpr auto Eio = exbi; // byte -inline constexpr auto B = byte; +constexpr auto B = byte; -inline constexpr auto kB = si::kilo; -inline constexpr auto MB = si::mega; -inline constexpr auto GB = si::giga; -inline constexpr auto TB = si::tera; -inline constexpr auto PB = si::peta; -inline constexpr auto EB = si::exa; -inline constexpr auto ZB = si::zetta; -inline constexpr auto YB = si::yotta; -inline constexpr auto RB = si::ronna; -inline constexpr auto QB = si::quetta; +constexpr auto kB = si::kilo; +constexpr auto MB = si::mega; +constexpr auto GB = si::giga; +constexpr auto TB = si::tera; +constexpr auto PB = si::peta; +constexpr auto EB = si::exa; +constexpr auto ZB = si::zetta; +constexpr auto YB = si::yotta; +constexpr auto RB = si::ronna; +constexpr auto QB = si::quetta; -inline constexpr auto KiB = kibi; -inline constexpr auto MiB = mebi; -inline constexpr auto GiB = gibi; -inline constexpr auto TiB = tebi; -inline constexpr auto PiB = pebi; -inline constexpr auto EiB = exbi; +constexpr auto KiB = kibi; +constexpr auto MiB = mebi; +constexpr auto GiB = gibi; +constexpr auto TiB = tebi; +constexpr auto PiB = pebi; +constexpr auto EiB = exbi; // baud -inline constexpr auto Bd = baud; -inline constexpr auto kBd = si::kilo; -inline constexpr auto MBd = si::mega; -inline constexpr auto GBd = si::giga; -inline constexpr auto TBd = si::tera; -inline constexpr auto PBd = si::peta; -inline constexpr auto EBd = si::exa; -inline constexpr auto ZBd = si::zetta; -inline constexpr auto YBd = si::yotta; -inline constexpr auto RBd = si::ronna; -inline constexpr auto QBd = si::quetta; +constexpr auto Bd = baud; +constexpr auto kBd = si::kilo; +constexpr auto MBd = si::mega; +constexpr auto GBd = si::giga; +constexpr auto TBd = si::tera; +constexpr auto PBd = si::peta; +constexpr auto EBd = si::exa; +constexpr auto ZBd = si::zetta; +constexpr auto YBd = si::yotta; +constexpr auto RBd = si::ronna; +constexpr auto QBd = si::quetta; // erlang // TODO do we need prefixed versions of Erlang? -inline constexpr auto E = erlang; +constexpr auto E = erlang; } // namespace mp_units::iec80000::unit_symbols diff --git a/src/systems/include/mp-units/systems/iec80000/units.h b/src/systems/include/mp-units/systems/iec80000/units.h index 4d1ee098..41f28c5f 100644 --- a/src/systems/include/mp-units/systems/iec80000/units.h +++ b/src/systems/include/mp-units/systems/iec80000/units.h @@ -34,11 +34,11 @@ MP_UNITS_EXPORT namespace mp_units::iec80000 { // clang-format off -inline constexpr struct erlang final : named_unit<"E", kind_of> {} erlang; -inline constexpr struct bit final : named_unit<"bit", one, kind_of> {} bit; -inline constexpr struct octet final : named_unit<"o", mag<8> * bit> {} octet; -inline constexpr struct byte final : named_unit<"B", mag<8> * bit> {} byte; -inline constexpr struct baud final : named_unit<"Bd", one / si::second, kind_of> {} baud; +constexpr struct erlang final : named_unit<"E", kind_of> {} erlang; +constexpr struct bit final : named_unit<"bit", one, kind_of> {} bit; +constexpr struct octet final : named_unit<"o", mag<8> * bit> {} octet; +constexpr struct byte final : named_unit<"B", mag<8> * bit> {} byte; +constexpr struct baud final : named_unit<"Bd", one / si::second, kind_of> {} baud; // clang-format on } // namespace mp_units::iec80000 diff --git a/src/systems/include/mp-units/systems/imperial.h b/src/systems/include/mp-units/systems/imperial.h index 8ba61e05..8c80ce56 100644 --- a/src/systems/include/mp-units/systems/imperial.h +++ b/src/systems/include/mp-units/systems/imperial.h @@ -39,67 +39,67 @@ using namespace international; // clang-format off // https://en.wikipedia.org/wiki/Imperial_units#Length -inline constexpr struct hand final : named_unit<"hh", mag_ratio<1, 3> * foot> {} hand; -inline constexpr struct barleycorn final : named_unit<"Bc", mag_ratio<1, 3> * inch> {} barleycorn; -inline constexpr struct thou final : named_unit<"th", mag_ratio<1, 12'000> * foot> {} thou; -inline constexpr struct chain final : named_unit<"ch", mag<22> * yard> {} chain; -inline constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; +constexpr struct hand final : named_unit<"hh", mag_ratio<1, 3> * foot> {} hand; +constexpr struct barleycorn final : named_unit<"Bc", mag_ratio<1, 3> * inch> {} barleycorn; +constexpr struct thou final : named_unit<"th", mag_ratio<1, 12'000> * foot> {} thou; +constexpr struct chain final : named_unit<"ch", mag<22> * yard> {} chain; +constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; // maritime units -inline constexpr struct cable final : named_unit<"cb", mag_ratio<1, 10> * nautical_mile> {} cable; -inline constexpr struct fathom final : named_unit<"ftm", mag_ratio<1, 1000> * nautical_mile> {} fathom; +constexpr struct cable final : named_unit<"cb", mag_ratio<1, 10> * nautical_mile> {} cable; +constexpr struct fathom final : named_unit<"ftm", mag_ratio<1, 1000> * nautical_mile> {} fathom; // survey -inline constexpr struct link final : named_unit<"li", mag_ratio<1, 100> * chain> {} link; -inline constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; +constexpr struct link final : named_unit<"li", mag_ratio<1, 100> * chain> {} link; +constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; // https://en.wikipedia.org/wiki/Imperial_units#Area -inline constexpr struct perch final : named_unit<"perch", square(rod)> {} perch; -inline constexpr struct rood final : named_unit<"rood", mag<40> * perch> {} rood; -inline constexpr struct acre final : named_unit<"acre", mag<4> * rood> {} acre; +constexpr struct perch final : named_unit<"perch", square(rod)> {} perch; +constexpr struct rood final : named_unit<"rood", mag<40> * perch> {} rood; +constexpr struct acre final : named_unit<"acre", mag<4> * rood> {} acre; // https://en.wikipedia.org/wiki/Imperial_units#Volume -inline constexpr struct gallon final : named_unit<"gal", mag_ratio<454'609, 100'000> * si::litre> {} gallon; -inline constexpr struct quart final : named_unit<"qt", mag_ratio<1, 4> * gallon> {} quart; -inline constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; -inline constexpr struct gill final : named_unit<"gi", mag_ratio<1, 4> * pint> {} gill; -inline constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 5> * gill> {} fluid_ounce; +constexpr struct gallon final : named_unit<"gal", mag_ratio<454'609, 100'000> * si::litre> {} gallon; +constexpr struct quart final : named_unit<"qt", mag_ratio<1, 4> * gallon> {} quart; +constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; +constexpr struct gill final : named_unit<"gi", mag_ratio<1, 4> * pint> {} gill; +constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 5> * gill> {} fluid_ounce; // https://en.wikipedia.org/wiki/Avoirdupois_system#Post-Elizabethan_units -inline constexpr auto drachm = dram; -inline constexpr struct stone final : named_unit<"st", mag<14> * pound> {} stone; -inline constexpr struct quarter final : named_unit<"qr", mag<2> * stone> {} quarter; -inline constexpr struct long_hundredweight final : named_unit<"cwt", mag<8> * stone> {} long_hundredweight; -inline constexpr struct ton final : named_unit<"t", mag<2'240> * pound> {} ton; -inline constexpr auto long_ton = ton; +constexpr auto drachm = dram; +constexpr struct stone final : named_unit<"st", mag<14> * pound> {} stone; +constexpr struct quarter final : named_unit<"qr", mag<2> * stone> {} quarter; +constexpr struct long_hundredweight final : named_unit<"cwt", mag<8> * stone> {} long_hundredweight; +constexpr struct ton final : named_unit<"t", mag<2'240> * pound> {} ton; +constexpr auto long_ton = ton; // clang-format on namespace unit_symbols { using namespace international::unit_symbols; -inline constexpr auto hh = hand; -inline constexpr auto Bc = barleycorn; -inline constexpr auto th = thou; -inline constexpr auto ch = chain; -inline constexpr auto fur = furlong; +constexpr auto hh = hand; +constexpr auto Bc = barleycorn; +constexpr auto th = thou; +constexpr auto ch = chain; +constexpr auto fur = furlong; -inline constexpr auto cb = cable; -inline constexpr auto ftm = fathom; +constexpr auto cb = cable; +constexpr auto ftm = fathom; -inline constexpr auto li = link; -inline constexpr auto rd = rod; +constexpr auto li = link; +constexpr auto rd = rod; -inline constexpr auto gal = gallon; -inline constexpr auto qt = quart; -inline constexpr auto pt = pint; -inline constexpr auto gi = gill; -inline constexpr auto fl_oz = fluid_ounce; +constexpr auto gal = gallon; +constexpr auto qt = quart; +constexpr auto pt = pint; +constexpr auto gi = gill; +constexpr auto fl_oz = fluid_ounce; -inline constexpr auto st = stone; -inline constexpr auto qr = quarter; -inline constexpr auto cwt = long_hundredweight; -inline constexpr auto t = ton; +constexpr auto st = stone; +constexpr auto qr = quarter; +constexpr auto cwt = long_hundredweight; +constexpr auto t = ton; } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/international.h b/src/systems/include/mp-units/systems/international.h index 1d5141f6..206e3c7e 100644 --- a/src/systems/include/mp-units/systems/international.h +++ b/src/systems/include/mp-units/systems/international.h @@ -37,72 +37,72 @@ namespace mp_units::international { // clang-format off // mass -inline constexpr struct pound final : named_unit<"lb", mag_ratio<45'359'237, 100'000'000> * si::kilogram> {} pound; -inline constexpr struct ounce final : named_unit<"oz", mag_ratio<1, 16> * pound> {} ounce; -inline constexpr struct dram final : named_unit<"dr", mag_ratio<1, 16> * ounce> {} dram; -inline constexpr struct grain final : named_unit<"gr", mag_ratio<1, 7'000> * pound> {} grain; +constexpr struct pound final : named_unit<"lb", mag_ratio<45'359'237, 100'000'000> * si::kilogram> {} pound; +constexpr struct ounce final : named_unit<"oz", mag_ratio<1, 16> * pound> {} ounce; +constexpr struct dram final : named_unit<"dr", mag_ratio<1, 16> * ounce> {} dram; +constexpr struct grain final : named_unit<"gr", mag_ratio<1, 7'000> * pound> {} grain; // length // https://en.wikipedia.org/wiki/United_States_customary_units#Length -inline constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; -inline constexpr struct foot final : named_unit<"ft", mag_ratio<1, 3> * yard> {} foot; -inline constexpr struct inch final : named_unit<"in", mag_ratio<1, 12> * foot> {} inch; -inline constexpr struct pica final : named_unit<"P", mag_ratio<1, 6> * inch> {} pica; -inline constexpr struct point final : named_unit<"p", mag_ratio<1, 12> * pica> {} point; -inline constexpr struct mil final : named_unit<"mil", mag_ratio<1, 1'000> * inch> {} mil; -inline constexpr struct twip final : named_unit<"twip", mag_ratio<1, 20> * point> {} twip; -inline constexpr struct mile final : named_unit<"mi", mag<1760> * yard> {} mile; -inline constexpr struct league final : named_unit<"le", mag<3> * mile> {} league; +constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; +constexpr struct foot final : named_unit<"ft", mag_ratio<1, 3> * yard> {} foot; +constexpr struct inch final : named_unit<"in", mag_ratio<1, 12> * foot> {} inch; +constexpr struct pica final : named_unit<"P", mag_ratio<1, 6> * inch> {} pica; +constexpr struct point final : named_unit<"p", mag_ratio<1, 12> * pica> {} point; +constexpr struct mil final : named_unit<"mil", mag_ratio<1, 1'000> * inch> {} mil; +constexpr struct twip final : named_unit<"twip", mag_ratio<1, 20> * point> {} twip; +constexpr struct mile final : named_unit<"mi", mag<1760> * yard> {} mile; +constexpr struct league final : named_unit<"le", mag<3> * mile> {} league; -inline constexpr struct nautical_mile final : named_unit<"nmi", mag<1852> * si::metre> {} nautical_mile; +constexpr struct nautical_mile final : named_unit<"nmi", mag<1852> * si::metre> {} nautical_mile; // speed -inline constexpr struct knot final : named_unit<"kn", nautical_mile / si::hour> {} knot; +constexpr struct knot final : named_unit<"kn", nautical_mile / si::hour> {} knot; // force // https://en.wikipedia.org/wiki/Poundal -inline constexpr struct poundal final : named_unit<"pdl", pound * foot / square(si::second)> {} poundal; +constexpr struct poundal final : named_unit<"pdl", pound * foot / square(si::second)> {} poundal; // https://en.wikipedia.org/wiki/Pound_(force) -inline constexpr struct pound_force final : named_unit<"lbf", pound * si::standard_gravity> {} pound_force; +constexpr struct pound_force final : named_unit<"lbf", pound * si::standard_gravity> {} pound_force; // https://en.wikipedia.org/wiki/Kip_(unit), -inline constexpr auto kip = si::kilo; +constexpr auto kip = si::kilo; // pressure -inline constexpr struct psi final : named_unit<"psi", pound_force / square(inch)> {} psi; +constexpr struct psi final : named_unit<"psi", pound_force / square(inch)> {} psi; // power // https://en.wikipedia.org/wiki/Horsepower#Definitions -inline constexpr struct mechanical_horsepower final : named_unit<"hp(I)", mag<33'000> * foot * pound_force / si::minute> {} mechanical_horsepower; +constexpr struct mechanical_horsepower final : named_unit<"hp(I)", mag<33'000> * foot * pound_force / si::minute> {} mechanical_horsepower; // clang-format on namespace unit_symbols { -inline constexpr auto lb = pound; -inline constexpr auto oz = ounce; -inline constexpr auto dr = dram; -inline constexpr auto gr = grain; +constexpr auto lb = pound; +constexpr auto oz = ounce; +constexpr auto dr = dram; +constexpr auto gr = grain; -inline constexpr auto yd = yard; -inline constexpr auto ft = foot; -inline constexpr auto in = inch; -inline constexpr auto P = pica; -inline constexpr auto p = point; -inline constexpr auto mi = mile; -inline constexpr auto le = league; +constexpr auto yd = yard; +constexpr auto ft = foot; +constexpr auto in = inch; +constexpr auto P = pica; +constexpr auto p = point; +constexpr auto mi = mile; +constexpr auto le = league; -inline constexpr auto nmi = nautical_mile; +constexpr auto nmi = nautical_mile; -inline constexpr auto kn = knot; -inline constexpr auto kt = knot; -inline constexpr auto mph = mile / si::hour; +constexpr auto kn = knot; +constexpr auto kt = knot; +constexpr auto mph = mile / si::hour; -inline constexpr auto pdl = poundal; -inline constexpr auto lbf = pound_force; +constexpr auto pdl = poundal; +constexpr auto lbf = pound_force; -inline constexpr auto hp = mechanical_horsepower; +constexpr auto hp = mechanical_horsepower; } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/isq/base_quantities.h b/src/systems/include/mp-units/systems/isq/base_quantities.h index c7f4f337..7e9ea017 100644 --- a/src/systems/include/mp-units/systems/isq/base_quantities.h +++ b/src/systems/include/mp-units/systems/isq/base_quantities.h @@ -35,20 +35,20 @@ namespace mp_units::isq { // clang-format off // dimensions of base quantities -inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; -inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; -inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; -inline constexpr struct dim_electric_current final : base_dimension<"I"> {} dim_electric_current; -inline constexpr struct dim_thermodynamic_temperature final : base_dimension {} dim_thermodynamic_temperature; -inline constexpr struct dim_amount_of_substance final : base_dimension<"N"> {} dim_amount_of_substance; -inline constexpr struct dim_luminous_intensity final : base_dimension<"J"> {} dim_luminous_intensity; +constexpr struct dim_length final : base_dimension<"L"> {} dim_length; +constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; +constexpr struct dim_time final : base_dimension<"T"> {} dim_time; +constexpr struct dim_electric_current final : base_dimension<"I"> {} dim_electric_current; +constexpr struct dim_thermodynamic_temperature final : base_dimension {} dim_thermodynamic_temperature; +constexpr struct dim_amount_of_substance final : base_dimension<"N"> {} dim_amount_of_substance; +constexpr struct dim_luminous_intensity final : base_dimension<"J"> {} dim_luminous_intensity; // clang-format on // base quantities QUANTITY_SPEC(length, dim_length); QUANTITY_SPEC(mass, dim_mass); QUANTITY_SPEC(time, dim_time); -inline constexpr auto duration = time; +constexpr auto duration = time; QUANTITY_SPEC(electric_current, dim_electric_current); QUANTITY_SPEC(thermodynamic_temperature, dim_thermodynamic_temperature); QUANTITY_SPEC(amount_of_substance, dim_amount_of_substance); diff --git a/src/systems/include/mp-units/systems/isq/electromagnetism.h b/src/systems/include/mp-units/systems/isq/electromagnetism.h index bdb5bc8b..84f556ba 100644 --- a/src/systems/include/mp-units/systems/isq/electromagnetism.h +++ b/src/systems/include/mp-units/systems/isq/electromagnetism.h @@ -39,25 +39,25 @@ namespace mp_units::isq { QUANTITY_SPEC(electric_charge, electric_current* time); QUANTITY_SPEC(electric_charge_density, electric_charge / volume); -inline constexpr auto volume_electric_charge = electric_charge_density; +constexpr auto volume_electric_charge = electric_charge_density; QUANTITY_SPEC(surface_density_of_electric_charge, electric_charge / area); -inline constexpr auto areic_electric_charge = surface_density_of_electric_charge; +constexpr auto areic_electric_charge = surface_density_of_electric_charge; QUANTITY_SPEC(linear_density_of_electric_charge, electric_charge / length); -inline constexpr auto lineic_electric_charge = linear_density_of_electric_charge; +constexpr auto lineic_electric_charge = linear_density_of_electric_charge; QUANTITY_SPEC(electric_dipole_moment, electric_charge* position_vector); // vector QUANTITY_SPEC(electric_polarization, electric_dipole_moment / volume); // vector QUANTITY_SPEC(electric_current_density, electric_charge_density* velocity); // vector -inline constexpr auto areic_electric_current = electric_current_density; +constexpr auto areic_electric_current = electric_current_density; QUANTITY_SPEC(linear_electric_current_density, surface_density_of_electric_charge* velocity); // vector -inline constexpr auto lineic_electric_current = linear_electric_current_density; +constexpr auto lineic_electric_current = linear_electric_current_density; QUANTITY_SPEC(electric_field_strength, force / electric_charge); // vector QUANTITY_SPEC(electric_potential, electric_field_strength* length, quantity_character::scalar); // TODO what is a correct equation here? QUANTITY_SPEC(electric_potential_difference, electric_potential, quantity_character::scalar); QUANTITY_SPEC(voltage, electric_potential); -inline constexpr auto electric_tension = voltage; +constexpr auto electric_tension = voltage; QUANTITY_SPEC(electric_flux_density, electric_polarization); // vector -inline constexpr auto electric_displacement = electric_flux_density; +constexpr auto electric_displacement = electric_flux_density; QUANTITY_SPEC(capacitance, electric_charge / voltage); // TODO how to calculate an argument of a vector product? QUANTITY_SPEC(magnetic_flux_density, force / (electric_charge * velocity), quantity_character::vector); @@ -66,13 +66,13 @@ QUANTITY_SPEC(magnetic_vector_potential, QUANTITY_SPEC(linked_flux, magnetic_vector_potential* displacement, quantity_character::scalar); QUANTITY_SPEC(magnetic_constant, electric_potential* time / (electric_current * length)); // TODO what is a correct equation here? -inline constexpr auto permeability_of_vacuum = magnetic_constant; +constexpr auto permeability_of_vacuum = magnetic_constant; QUANTITY_SPEC(phase_speed_of_electromagnetic_waves, angular_frequency / angular_wavenumber); QUANTITY_SPEC(speed_of_light_in_vacuum, speed); -inline constexpr auto light_speed_in_vacuum = speed_of_light_in_vacuum; -inline constexpr auto luminal_speed = speed_of_light_in_vacuum; +constexpr auto light_speed_in_vacuum = speed_of_light_in_vacuum; +constexpr auto luminal_speed = speed_of_light_in_vacuum; QUANTITY_SPEC(electric_constant, inverse(magnetic_constant* pow<2>(speed_of_light_in_vacuum))); -inline constexpr auto permittivity_of_vacuum = electric_constant; +constexpr auto permittivity_of_vacuum = electric_constant; QUANTITY_SPEC(permittivity, electric_flux_density / electric_field_strength, quantity_character::scalar); QUANTITY_SPEC(relative_permittivity, dimensionless, permittivity / electric_constant); QUANTITY_SPEC(electric_susceptibility, dimensionless, @@ -84,10 +84,10 @@ QUANTITY_SPEC(total_current, electric_current); QUANTITY_SPEC(total_current_density, electric_current_density); // vector QUANTITY_SPEC(magnetic_flux, magnetic_flux_density* area, quantity_character::scalar); QUANTITY_SPEC(magnetic_moment, electric_current* area, quantity_character::vector); -inline constexpr auto magnetic_area_moment = magnetic_moment; +constexpr auto magnetic_area_moment = magnetic_moment; QUANTITY_SPEC(magnetization, magnetic_moment / volume); // vector QUANTITY_SPEC(magnetic_field_strength, magnetization); // vector -inline constexpr auto magnetizing_field = magnetic_field_strength; +constexpr auto magnetizing_field = magnetic_field_strength; QUANTITY_SPEC(permeability, magnetic_flux_density / magnetic_field_strength, quantity_character::scalar); QUANTITY_SPEC(relative_permeability, dimensionless, permeability / magnetic_constant); QUANTITY_SPEC(magnetic_susceptibility, dimensionless, magnetization / magnetic_field_strength, @@ -97,10 +97,10 @@ QUANTITY_SPEC(magnetic_dipole_moment, magnetic_constant* magnetic_moment); // v QUANTITY_SPEC(coercivity, magnetic_field_strength, quantity_character::scalar); QUANTITY_SPEC(electromagnetic_energy_density, electric_field_strength* electric_flux_density, quantity_character::scalar); -inline constexpr auto volumic_electromagnetic_energy = electromagnetic_energy_density; +constexpr auto volumic_electromagnetic_energy = electromagnetic_energy_density; QUANTITY_SPEC(Poynting_vector, electric_field_strength* magnetic_field_strength); // vector QUANTITY_SPEC(source_voltage, voltage); -inline constexpr auto source_tension = source_voltage; +constexpr auto source_tension = source_voltage; QUANTITY_SPEC(scalar_magnetic_potential, electric_current, magnetic_field_strength* length, quantity_character::scalar); // TODO what is a correct equation here? QUANTITY_SPEC(magnetic_tension, electric_current, magnetic_field_strength* position_vector, quantity_character::scalar); @@ -111,26 +111,26 @@ QUANTITY_SPEC(number_of_turns_in_a_winding, dimensionless); QUANTITY_SPEC(reluctance, magnetic_tension / magnetic_flux); QUANTITY_SPEC(permeance, inverse(reluctance)); QUANTITY_SPEC(inductance, linked_flux / electric_current); -inline constexpr auto self_inductance = inductance; +constexpr auto self_inductance = inductance; QUANTITY_SPEC(mutual_inductance, linked_flux / electric_current); QUANTITY_SPEC(coupling_factor, dimensionless, mutual_inductance / pow<1, 2>(pow<2>(self_inductance))); QUANTITY_SPEC(leakage_factor, dimensionless, pow<2>(coupling_factor)); QUANTITY_SPEC(conductivity, electric_current_density / electric_field_strength, quantity_character::scalar); QUANTITY_SPEC(resistivity, inverse(conductivity)); QUANTITY_SPEC(electromagnetism_power, power, voltage* electric_current); -inline constexpr auto instantaneous_power = electromagnetism_power; +constexpr auto instantaneous_power = electromagnetism_power; QUANTITY_SPEC(resistance, voltage / electric_current); QUANTITY_SPEC(conductance, inverse(resistance)); QUANTITY_SPEC(phase_difference, phase_angle); QUANTITY_SPEC(electric_current_phasor, electric_current); QUANTITY_SPEC(voltage_phasor, voltage); QUANTITY_SPEC(impedance, voltage_phasor / electric_current_phasor); -inline constexpr auto complex_impedance = impedance; +constexpr auto complex_impedance = impedance; QUANTITY_SPEC(resistance_to_alternating_current, impedance); QUANTITY_SPEC(reactance, impedance); QUANTITY_SPEC(modulus_of_impedance, impedance); QUANTITY_SPEC(admittance, inverse(impedance)); -inline constexpr auto complex_admittance = admittance; +constexpr auto complex_admittance = admittance; QUANTITY_SPEC(conductance_for_alternating_current, admittance); QUANTITY_SPEC(susceptance, admittance); QUANTITY_SPEC(modulus_of_admittance, admittance); diff --git a/src/systems/include/mp-units/systems/isq/light_and_radiation.h b/src/systems/include/mp-units/systems/isq/light_and_radiation.h index bfca2dbf..bb5b772d 100644 --- a/src/systems/include/mp-units/systems/isq/light_and_radiation.h +++ b/src/systems/include/mp-units/systems/isq/light_and_radiation.h @@ -45,9 +45,9 @@ QUANTITY_SPEC(radiant_energy_density, radiant_energy / volume); QUANTITY_SPEC(spectral_radiant_energy_density_in_terms_of_wavelength, radiant_energy_density / wavelength); QUANTITY_SPEC(spectral_radiant_energy_density_in_terms_of_wavenumber, radiant_energy_density / wavenumber); QUANTITY_SPEC(radiant_flux, power, radiant_energy / time); -inline constexpr auto radiant_power = radiant_flux; +constexpr auto radiant_power = radiant_flux; QUANTITY_SPEC(spectral_radiant_flux, radiant_flux / wavelength); -inline constexpr auto spectral_radiant_power = spectral_radiant_flux; +constexpr auto spectral_radiant_power = spectral_radiant_flux; QUANTITY_SPEC(radiant_intensity, radiant_flux / solid_angular_measure); QUANTITY_SPEC(spectral_radiant_intensity, radiant_intensity / wavelength); QUANTITY_SPEC(radiance, radiant_intensity / area); diff --git a/src/systems/include/mp-units/systems/isq/mechanics.h b/src/systems/include/mp-units/systems/isq/mechanics.h index 41157143..4de54232 100644 --- a/src/systems/include/mp-units/systems/isq/mechanics.h +++ b/src/systems/include/mp-units/systems/isq/mechanics.h @@ -37,24 +37,24 @@ MP_UNITS_EXPORT namespace mp_units::isq { QUANTITY_SPEC(mass_density, mass / volume); -inline constexpr auto density = mass_density; +constexpr auto density = mass_density; QUANTITY_SPEC(specific_volume, inverse(mass_density)); QUANTITY_SPEC(relative_mass_density, mass_density / mass_density); -inline constexpr auto relative_density = relative_mass_density; +constexpr auto relative_density = relative_mass_density; QUANTITY_SPEC(surface_mass_density, mass / area); -inline constexpr auto surface_density = surface_mass_density; +constexpr auto surface_density = surface_mass_density; QUANTITY_SPEC(linear_mass_density, mass / length); -inline constexpr auto linear_density = linear_mass_density; +constexpr auto linear_density = linear_mass_density; QUANTITY_SPEC(momentum, mass* velocity); // vector QUANTITY_SPEC(force, mass* acceleration); // vector // TODO what is a correct equation here? QUANTITY_SPEC(weight, force, mass* acceleration_of_free_fall); // vector // differs from ISO 80000 QUANTITY_SPEC(static_friction_force, force); // vector -inline constexpr auto static_friction = static_friction_force; +constexpr auto static_friction = static_friction_force; QUANTITY_SPEC(kinetic_friction_force, force); // vector -inline constexpr auto dynamic_friction_force = kinetic_friction_force; +constexpr auto dynamic_friction_force = kinetic_friction_force; QUANTITY_SPEC(rolling_resistance, force); // vector -inline constexpr auto rolling_drag = rolling_resistance; -inline constexpr auto rolling_friction_force = rolling_resistance; +constexpr auto rolling_drag = rolling_resistance; +constexpr auto rolling_friction_force = rolling_resistance; QUANTITY_SPEC(drag_force, force); // vector QUANTITY_SPEC(impulse, force* time); // vector QUANTITY_SPEC(angular_momentum, position_vector* momentum); // vector @@ -73,24 +73,24 @@ QUANTITY_SPEC(shear_strain, dimensionless, displacement / thickness, quantity_ch QUANTITY_SPEC(relative_volume_strain, volume / volume); QUANTITY_SPEC(Poisson_number, dimensionless, width / length); QUANTITY_SPEC(modulus_of_elasticity, normal_stress / relative_linear_strain); -inline constexpr auto Young_modulus = modulus_of_elasticity; +constexpr auto Young_modulus = modulus_of_elasticity; QUANTITY_SPEC(modulus_of_rigidity, shear_stress / shear_strain); -inline constexpr auto shear_modulus = modulus_of_rigidity; +constexpr auto shear_modulus = modulus_of_rigidity; QUANTITY_SPEC(modulus_of_compression, pressure / relative_volume_strain); -inline constexpr auto bulk_modulus = modulus_of_compression; +constexpr auto bulk_modulus = modulus_of_compression; QUANTITY_SPEC(compressibility, inverse(volume) * (volume / pressure)); QUANTITY_SPEC(second_axial_moment_of_area, pow<2>(radial_distance) * area); QUANTITY_SPEC(second_polar_moment_of_area, pow<2>(radial_distance) * area); QUANTITY_SPEC(section_modulus, second_axial_moment_of_area / radial_distance); QUANTITY_SPEC(static_friction_coefficient, dimensionless, static_friction_force / force, quantity_character::scalar); -inline constexpr auto static_friction_factor = static_friction_coefficient; -inline constexpr auto coefficient_of_static_friction = static_friction_coefficient; +constexpr auto static_friction_factor = static_friction_coefficient; +constexpr auto coefficient_of_static_friction = static_friction_coefficient; QUANTITY_SPEC(kinetic_friction_factor, dimensionless, kinetic_friction_force / force, quantity_character::scalar); -inline constexpr auto dynamic_friction_factor = kinetic_friction_factor; +constexpr auto dynamic_friction_factor = kinetic_friction_factor; QUANTITY_SPEC(rolling_resistance_factor, force / force, quantity_character::scalar); QUANTITY_SPEC(drag_coefficient, dimensionless, drag_force / (mass_density * pow<2>(speed) * area), quantity_character::scalar); -inline constexpr auto drag_factor = drag_coefficient; +constexpr auto drag_factor = drag_coefficient; QUANTITY_SPEC(dynamic_viscosity, shear_stress* length / velocity, quantity_character::scalar); QUANTITY_SPEC(kinematic_viscosity, dynamic_viscosity / mass_density); QUANTITY_SPEC(surface_tension, force / length, quantity_character::scalar); // TODO what is a correct equation here? @@ -100,7 +100,7 @@ QUANTITY_SPEC(mechanical_energy, energy); // diffe QUANTITY_SPEC(potential_energy, mechanical_energy); // differs from ISO 80000 QUANTITY_SPEC(kinetic_energy, mechanical_energy, mass* pow<2>(speed)); // differs from ISO 80000 QUANTITY_SPEC(mechanical_work, force* displacement, quantity_character::scalar); -inline constexpr auto work = mechanical_work; +constexpr auto work = mechanical_work; QUANTITY_SPEC(mechanical_efficiency, mechanical_power / mechanical_power); QUANTITY_SPEC(mass_flow, mass_density* velocity); // vector QUANTITY_SPEC(mass_flow_rate, mass_flow* area, quantity_character::scalar); diff --git a/src/systems/include/mp-units/systems/isq/si_quantities.h b/src/systems/include/mp-units/systems/isq/si_quantities.h index 9486c3e3..a8b66c27 100644 --- a/src/systems/include/mp-units/systems/isq/si_quantities.h +++ b/src/systems/include/mp-units/systems/isq/si_quantities.h @@ -37,15 +37,15 @@ namespace mp_units::isq { // space and time QUANTITY_SPEC(width, length); -inline constexpr auto breadth = width; +constexpr auto breadth = width; QUANTITY_SPEC(radius, width); // differs from ISO 80000 QUANTITY_SPEC(path_length, length); -inline constexpr auto arc_length = path_length; +constexpr auto arc_length = path_length; QUANTITY_SPEC(area, pow<2>(length)); QUANTITY_SPEC(angular_measure, dimensionless, arc_length / radius, is_kind); QUANTITY_SPEC(solid_angular_measure, dimensionless, area / pow<2>(radius), is_kind); QUANTITY_SPEC(period_duration, duration); -inline constexpr auto period = period_duration; +constexpr auto period = period_duration; QUANTITY_SPEC(frequency, inverse(period_duration)); // mechanics diff --git a/src/systems/include/mp-units/systems/isq/space_and_time.h b/src/systems/include/mp-units/systems/isq/space_and_time.h index 2157a299..d24db136 100644 --- a/src/systems/include/mp-units/systems/isq/space_and_time.h +++ b/src/systems/include/mp-units/systems/isq/space_and_time.h @@ -36,8 +36,8 @@ MP_UNITS_EXPORT namespace mp_units::isq { QUANTITY_SPEC(height, length); -inline constexpr auto depth = height; -inline constexpr auto altitude = height; +constexpr auto depth = height; +constexpr auto altitude = height; QUANTITY_SPEC(thickness, width); QUANTITY_SPEC(diameter, width); QUANTITY_SPEC(distance, path_length); @@ -48,7 +48,7 @@ QUANTITY_SPEC(radius_of_curvature, radius); QUANTITY_SPEC(curvature, inverse(radius_of_curvature)); QUANTITY_SPEC(volume, pow<3>(length)); QUANTITY_SPEC(rotational_displacement, angular_measure, path_length / radius); -inline constexpr auto angular_displacement = rotational_displacement; +constexpr auto angular_displacement = rotational_displacement; QUANTITY_SPEC(phase_angle, angular_measure); QUANTITY_SPEC(speed, length / time); // differs from ISO 80000 QUANTITY_SPEC(velocity, speed, position_vector / duration); // vector // differs from ISO 80000 @@ -62,18 +62,18 @@ QUANTITY_SPEC(rotational_frequency, rotation / duration); QUANTITY_SPEC(angular_frequency, phase_angle / duration); QUANTITY_SPEC(wavelength, length); QUANTITY_SPEC(repetency, inverse(wavelength)); -inline constexpr auto wavenumber = repetency; +constexpr auto wavenumber = repetency; QUANTITY_SPEC(wave_vector, repetency, quantity_character::vector); QUANTITY_SPEC(angular_repetency, inverse(wavelength)); -inline constexpr auto angular_wavenumber = angular_repetency; +constexpr auto angular_wavenumber = angular_repetency; QUANTITY_SPEC(phase_velocity, angular_frequency / angular_repetency); -inline constexpr auto phase_speed = phase_velocity; +constexpr auto phase_speed = phase_velocity; QUANTITY_SPEC(group_velocity, angular_frequency / angular_repetency); -inline constexpr auto group_speed = group_velocity; +constexpr auto group_speed = group_velocity; QUANTITY_SPEC(damping_coefficient, inverse(time_constant)); QUANTITY_SPEC(logarithmic_decrement, dimensionless, damping_coefficient* period_duration); QUANTITY_SPEC(attenuation, inverse(distance)); -inline constexpr auto extinction = attenuation; +constexpr auto extinction = attenuation; QUANTITY_SPEC(phase_coefficient, phase_angle / path_length); QUANTITY_SPEC(propagation_coefficient, inverse(length)); // γ = α + iβ where α denotes attenuation // and β the phase coefficient of a plane wave diff --git a/src/systems/include/mp-units/systems/isq/thermodynamics.h b/src/systems/include/mp-units/systems/isq/thermodynamics.h index aed8edf9..f5b72d90 100644 --- a/src/systems/include/mp-units/systems/isq/thermodynamics.h +++ b/src/systems/include/mp-units/systems/isq/thermodynamics.h @@ -46,7 +46,7 @@ QUANTITY_SPEC(isothermal_compressibility, inverse(volume) * (volume / pressure)) QUANTITY_SPEC(isentropic_compressibility, inverse(volume) * (volume / pressure)); // TODO how to handle "negative" part // energy definition moved to mechanics QUANTITY_SPEC(heat, energy); -inline constexpr auto amount_of_heat = heat; +constexpr auto amount_of_heat = heat; QUANTITY_SPEC(latent_heat, heat); // TODO what is a correct equation here? QUANTITY_SPEC(heat_flow_rate, heat / time); QUANTITY_SPEC(density_of_heat_flow_rate, heat_flow_rate / area); @@ -54,7 +54,7 @@ QUANTITY_SPEC(thermal_conductivity, density_of_heat_flow_rate*(length / thermody QUANTITY_SPEC(coefficient_of_heat_transfer, density_of_heat_flow_rate / thermodynamic_temperature); QUANTITY_SPEC(surface_coefficient_of_heat_transfer, density_of_heat_flow_rate / thermodynamic_temperature); QUANTITY_SPEC(thermal_insulance, inverse(coefficient_of_heat_transfer)); -inline constexpr auto coefficient_of_thermal_insulance = thermal_insulance; +constexpr auto coefficient_of_thermal_insulance = thermal_insulance; QUANTITY_SPEC(thermal_resistance, thermodynamic_temperature / heat_flow_rate); QUANTITY_SPEC(thermal_conductance, inverse(thermal_resistance)); QUANTITY_SPEC(heat_capacity, heat / thermodynamic_temperature); @@ -67,24 +67,24 @@ QUANTITY_SPEC(ratio_of_specific_heat_capacities, dimensionless, specific_heat_capacity_at_constant_pressure / specific_heat_capacity_at_constant_volume); QUANTITY_SPEC(isentropic_exponent, volume / pressure * (pressure / volume)); // TODO how to handle "negative" part -inline constexpr auto isentropic_expansion_factor = isentropic_exponent; +constexpr auto isentropic_expansion_factor = isentropic_exponent; QUANTITY_SPEC(entropy, kinetic_energy / thermodynamic_temperature); QUANTITY_SPEC(specific_entropy, entropy / mass); QUANTITY_SPEC(enthalpy, energy); // differs from ISO 80000 QUANTITY_SPEC(internal_energy, enthalpy); // differs from ISO 80000 -inline constexpr auto thermodynamic_energy = internal_energy; +constexpr auto thermodynamic_energy = internal_energy; QUANTITY_SPEC(Helmholtz_energy, internal_energy); -inline constexpr auto Helmholtz_function = Helmholtz_energy; +constexpr auto Helmholtz_function = Helmholtz_energy; QUANTITY_SPEC(Gibbs_energy, enthalpy); -inline constexpr auto Gibbs_function = Gibbs_energy; +constexpr auto Gibbs_function = Gibbs_energy; QUANTITY_SPEC(specific_energy, energy / mass); QUANTITY_SPEC(specific_internal_energy, internal_energy / mass); -inline constexpr auto specific_thermodynamic_energy = specific_internal_energy; +constexpr auto specific_thermodynamic_energy = specific_internal_energy; QUANTITY_SPEC(specific_enthalpy, enthalpy / mass); QUANTITY_SPEC(specific_Helmholtz_energy, Helmholtz_energy / mass); -inline constexpr auto specific_Helmholtz_function = specific_Helmholtz_energy; +constexpr auto specific_Helmholtz_function = specific_Helmholtz_energy; QUANTITY_SPEC(specific_Gibbs_energy, Gibbs_energy / mass); -inline constexpr auto specific_Gibbs_function = specific_Gibbs_energy; +constexpr auto specific_Gibbs_function = specific_Gibbs_energy; QUANTITY_SPEC(Massieu_function, Helmholtz_energy / thermodynamic_temperature); // TODO how to handle "negative" part QUANTITY_SPEC(Planck_function, Gibbs_energy / thermodynamic_temperature); // TODO how to handle "negative" part QUANTITY_SPEC(Joule_Thomson_coefficient, thermodynamic_temperature / pressure); diff --git a/src/systems/include/mp-units/systems/isq_angle.h b/src/systems/include/mp-units/systems/isq_angle.h index bf306d93..69584b94 100644 --- a/src/systems/include/mp-units/systems/isq_angle.h +++ b/src/systems/include/mp-units/systems/isq_angle.h @@ -43,7 +43,7 @@ using namespace isq; QUANTITY_SPEC(cotes_angle_constant, angular::angle); // 1 rad QUANTITY_SPEC(angular_measure, angular::angle, cotes_angle_constant* arc_length / radius); QUANTITY_SPEC(rotational_displacement, angular::angle, cotes_angle_constant* path_length / radius); -inline constexpr auto angular_displacement = rotational_displacement; +constexpr auto angular_displacement = rotational_displacement; QUANTITY_SPEC(phase_angle, angular_measure); QUANTITY_SPEC(solid_angular_measure, pow<2>(cotes_angle_constant) * area / pow<2>(radius)); QUANTITY_SPEC(angular_velocity, angular_displacement / duration, quantity_character::vector); @@ -51,7 +51,7 @@ QUANTITY_SPEC(angular_acceleration, angular_velocity / duration); QUANTITY_SPEC(rotation, rotational_displacement); QUANTITY_SPEC(angular_frequency, phase_angle / duration); QUANTITY_SPEC(angular_repetency, cotes_angle_constant / wavelength); -inline constexpr auto angular_wavenumber = angular_repetency; +constexpr auto angular_wavenumber = angular_repetency; QUANTITY_SPEC(phase_coefficient, phase_angle / path_length); QUANTITY_SPEC(propagation_coefficient, cotes_angle_constant / length); QUANTITY_SPEC(angular_momentum, position_vector* momentum / cotes_angle_constant); // vector @@ -62,6 +62,6 @@ QUANTITY_SPEC(angular_impulse, moment_of_force* time); // vector QUANTITY_SPEC(loss_angle, angular_measure); // constants -inline constexpr auto cotes_angle = cotes_angle_constant[angular::radian]; +constexpr auto cotes_angle = cotes_angle_constant[angular::radian]; } // namespace mp_units::isq_angle diff --git a/src/systems/include/mp-units/systems/natural.h b/src/systems/include/mp-units/systems/natural.h index b5a65b63..23faf2db 100644 --- a/src/systems/include/mp-units/systems/natural.h +++ b/src/systems/include/mp-units/systems/natural.h @@ -38,28 +38,28 @@ namespace mp_units::natural { // clang-format off // units -inline constexpr struct electronvolt final : named_unit<"eV"> {} electronvolt; -inline constexpr auto gigaelectronvolt = si::giga; +constexpr struct electronvolt final : named_unit<"eV"> {} electronvolt; +constexpr auto gigaelectronvolt = si::giga; // system references -inline constexpr struct time : system_reference {} time; -inline constexpr struct length : system_reference {} length; -inline constexpr struct mass : system_reference {} mass; -inline constexpr struct velocity : system_reference {} velocity; -inline constexpr struct speed : system_reference {} speed; -inline constexpr struct acceleration : system_reference {} acceleration; -inline constexpr struct momentum : system_reference {} momentum; -inline constexpr struct force : system_reference {} force; -inline constexpr struct energy : system_reference {} energy; +constexpr struct time : system_reference {} time; +constexpr struct length : system_reference {} length; +constexpr struct mass : system_reference {} mass; +constexpr struct velocity : system_reference {} velocity; +constexpr struct speed : system_reference {} speed; +constexpr struct acceleration : system_reference {} acceleration; +constexpr struct momentum : system_reference {} momentum; +constexpr struct force : system_reference {} force; +constexpr struct energy : system_reference {} energy; // clang-format on // constants -inline constexpr auto speed_of_light = speed[one]; +constexpr auto speed_of_light = speed[one]; namespace unit_symbols { -inline constexpr auto GeV = gigaelectronvolt; -inline constexpr auto GeV2 = square(gigaelectronvolt); +constexpr auto GeV = gigaelectronvolt; +constexpr auto GeV2 = square(gigaelectronvolt); } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/si/chrono.h b/src/systems/include/mp-units/systems/si/chrono.h index fa878269..abf15b51 100644 --- a/src/systems/include/mp-units/systems/si/chrono.h +++ b/src/systems/include/mp-units/systems/si/chrono.h @@ -93,7 +93,7 @@ struct chrono_point_origin_ final : absolute_point_origin { using clock = C; }; MP_UNITS_EXPORT template -inline constexpr chrono_point_origin_ chrono_point_origin; +constexpr chrono_point_origin_ chrono_point_origin; MP_UNITS_EXPORT_BEGIN diff --git a/src/systems/include/mp-units/systems/si/constants.h b/src/systems/include/mp-units/systems/si/constants.h index a43c871c..0e47105a 100644 --- a/src/systems/include/mp-units/systems/si/constants.h +++ b/src/systems/include/mp-units/systems/si/constants.h @@ -35,28 +35,28 @@ namespace mp_units::si { namespace si2019 { // clang-format off -inline constexpr struct hyperfine_structure_transition_frequency_of_cs final : +constexpr struct hyperfine_structure_transition_frequency_of_cs final : named_unit * hertz> {} hyperfine_structure_transition_frequency_of_cs; -inline constexpr struct speed_of_light_in_vacuum final : +constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; -inline constexpr struct planck_constant final : +constexpr struct planck_constant final : named_unit<"h", mag_ratio<662'607'015, 100'000'000> * mag_power<10, -34> * joule * second> {} planck_constant; -inline constexpr struct elementary_charge final : +constexpr struct elementary_charge final : named_unit<"e", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * coulomb> {} elementary_charge; -inline constexpr struct boltzmann_constant final : +constexpr struct boltzmann_constant final : named_unit<"k", mag_ratio<1'380'649, 1'000'000> * mag_power<10, -23> * joule / kelvin> {} boltzmann_constant; -inline constexpr struct avogadro_constant final : +constexpr struct avogadro_constant final : named_unit<"N_A", mag_ratio<602'214'076, 100'000'000> * mag_power<10, 23> / mole> {} avogadro_constant; -inline constexpr struct luminous_efficacy final : +constexpr struct luminous_efficacy final : named_unit<"K_cd", mag<683> * lumen / watt> {} luminous_efficacy; // clang-format on } // namespace si2019 // clang-format off -inline constexpr struct standard_gravity final : +constexpr struct standard_gravity final : named_unit * metre / square(second)> {} standard_gravity; -inline constexpr struct magnetic_constant final : +constexpr struct magnetic_constant final : named_unit * mag_pi * mag_power<10, -7> * henry / metre> {} magnetic_constant; // clang-format on diff --git a/src/systems/include/mp-units/systems/si/prefixes.h b/src/systems/include/mp-units/systems/si/prefixes.h index 3ee39e13..a0efa949 100644 --- a/src/systems/include/mp-units/systems/si/prefixes.h +++ b/src/systems/include/mp-units/systems/si/prefixes.h @@ -58,30 +58,30 @@ template struct quetta_ final : prefixed_unit<"Q", mag_power<1 MP_UNITS_EXPORT_BEGIN -template inline constexpr quecto_ quecto; -template inline constexpr ronto_ ronto; -template inline constexpr yocto_ yocto; -template inline constexpr zepto_ zepto; -template inline constexpr atto_ atto; -template inline constexpr femto_ femto; -template inline constexpr pico_ pico; -template inline constexpr nano_ nano; -template inline constexpr micro_ micro; -template inline constexpr milli_ milli; -template inline constexpr centi_ centi; -template inline constexpr deci_ deci; -template inline constexpr deca_ deca; -template inline constexpr hecto_ hecto; -template inline constexpr kilo_ kilo; -template inline constexpr mega_ mega; -template inline constexpr giga_ giga; -template inline constexpr tera_ tera; -template inline constexpr peta_ peta; -template inline constexpr exa_ exa; -template inline constexpr zetta_ zetta; -template inline constexpr yotta_ yotta; -template inline constexpr ronna_ ronna; -template inline constexpr quetta_ quetta; +template constexpr quecto_ quecto; +template constexpr ronto_ ronto; +template constexpr yocto_ yocto; +template constexpr zepto_ zepto; +template constexpr atto_ atto; +template constexpr femto_ femto; +template constexpr pico_ pico; +template constexpr nano_ nano; +template constexpr micro_ micro; +template constexpr milli_ milli; +template constexpr centi_ centi; +template constexpr deci_ deci; +template constexpr deca_ deca; +template constexpr hecto_ hecto; +template constexpr kilo_ kilo; +template constexpr mega_ mega; +template constexpr giga_ giga; +template constexpr tera_ tera; +template constexpr peta_ peta; +template constexpr exa_ exa; +template constexpr zetta_ zetta; +template constexpr yotta_ yotta; +template constexpr ronna_ ronna; +template constexpr quetta_ quetta; // clang-format on MP_UNITS_EXPORT_END diff --git a/src/systems/include/mp-units/systems/si/unit_symbols.h b/src/systems/include/mp-units/systems/si/unit_symbols.h index 466c956c..ce5e68d8 100644 --- a/src/systems/include/mp-units/systems/si/unit_symbols.h +++ b/src/systems/include/mp-units/systems/si/unit_symbols.h @@ -31,774 +31,774 @@ namespace mp_units { namespace si::unit_symbols { -inline constexpr auto qm = quecto; -inline constexpr auto rm = ronto; -inline constexpr auto ym = yocto; -inline constexpr auto zm = zepto; -inline constexpr auto am = atto; -inline constexpr auto fm = femto; -inline constexpr auto pm = pico; -inline constexpr auto nm = nano; -inline constexpr auto um = micro; -inline constexpr auto mm = milli; -inline constexpr auto cm = centi; -inline constexpr auto dm = deci; -inline constexpr auto m = metre; -inline constexpr auto dam = deca; -inline constexpr auto hm = hecto; -inline constexpr auto km = kilo; -inline constexpr auto Mm = mega; -inline constexpr auto Gm = giga; -inline constexpr auto Tm = tera; -inline constexpr auto Pm = peta; -inline constexpr auto Em = exa; -inline constexpr auto Zm = zetta; -inline constexpr auto Ym = yotta; -inline constexpr auto Rm = ronna; -inline constexpr auto Qm = quetta; +constexpr auto qm = quecto; +constexpr auto rm = ronto; +constexpr auto ym = yocto; +constexpr auto zm = zepto; +constexpr auto am = atto; +constexpr auto fm = femto; +constexpr auto pm = pico; +constexpr auto nm = nano; +constexpr auto um = micro; +constexpr auto mm = milli; +constexpr auto cm = centi; +constexpr auto dm = deci; +constexpr auto m = metre; +constexpr auto dam = deca; +constexpr auto hm = hecto; +constexpr auto km = kilo; +constexpr auto Mm = mega; +constexpr auto Gm = giga; +constexpr auto Tm = tera; +constexpr auto Pm = peta; +constexpr auto Em = exa; +constexpr auto Zm = zetta; +constexpr auto Ym = yotta; +constexpr auto Rm = ronna; +constexpr auto Qm = quetta; -inline constexpr auto qs = quecto; -inline constexpr auto rs = ronto; -inline constexpr auto ys = yocto; -inline constexpr auto zs = zepto; -inline constexpr auto as = atto; -inline constexpr auto fs = femto; -inline constexpr auto ps = pico; -inline constexpr auto ns = nano; -inline constexpr auto us = micro; -inline constexpr auto ms = milli; -inline constexpr auto cs = centi; -inline constexpr auto ds = deci; -inline constexpr auto s = second; +constexpr auto qs = quecto; +constexpr auto rs = ronto; +constexpr auto ys = yocto; +constexpr auto zs = zepto; +constexpr auto as = atto; +constexpr auto fs = femto; +constexpr auto ps = pico; +constexpr auto ns = nano; +constexpr auto us = micro; +constexpr auto ms = milli; +constexpr auto cs = centi; +constexpr auto ds = deci; +constexpr auto s = second; // TODO Should the below multiples of second be provided? -inline constexpr auto das = deca; -inline constexpr auto hs = hecto; -inline constexpr auto ks = kilo; -inline constexpr auto Ms = mega; -inline constexpr auto Gs = giga; -inline constexpr auto Ts = tera; -inline constexpr auto Ps = peta; -inline constexpr auto Es = exa; -inline constexpr auto Zs = zetta; -inline constexpr auto Ys = yotta; -inline constexpr auto Rs = ronna; -inline constexpr auto Qs = quetta; +constexpr auto das = deca; +constexpr auto hs = hecto; +constexpr auto ks = kilo; +constexpr auto Ms = mega; +constexpr auto Gs = giga; +constexpr auto Ts = tera; +constexpr auto Ps = peta; +constexpr auto Es = exa; +constexpr auto Zs = zetta; +constexpr auto Ys = yotta; +constexpr auto Rs = ronna; +constexpr auto Qs = quetta; -inline constexpr auto qg = quecto; -inline constexpr auto rg = ronto; -inline constexpr auto yg = yocto; -inline constexpr auto zg = zepto; -inline constexpr auto ag = atto; -inline constexpr auto fg = femto; -inline constexpr auto pg = pico; -inline constexpr auto ng = nano; -inline constexpr auto ug = micro; -inline constexpr auto mg = milli; -inline constexpr auto cg = centi; -inline constexpr auto dg = deci; -inline constexpr auto g = gram; -inline constexpr auto dag = deca; -inline constexpr auto hg = hecto; -inline constexpr auto kg = kilogram; -inline constexpr auto Mg = mega; -inline constexpr auto Gg = giga; -inline constexpr auto Tg = tera; -inline constexpr auto Pg = peta; -inline constexpr auto Eg = exa; -inline constexpr auto Zg = zetta; -inline constexpr auto Yg = yotta; -inline constexpr auto Rg = ronna; -inline constexpr auto Qg = quetta; +constexpr auto qg = quecto; +constexpr auto rg = ronto; +constexpr auto yg = yocto; +constexpr auto zg = zepto; +constexpr auto ag = atto; +constexpr auto fg = femto; +constexpr auto pg = pico; +constexpr auto ng = nano; +constexpr auto ug = micro; +constexpr auto mg = milli; +constexpr auto cg = centi; +constexpr auto dg = deci; +constexpr auto g = gram; +constexpr auto dag = deca; +constexpr auto hg = hecto; +constexpr auto kg = kilogram; +constexpr auto Mg = mega; +constexpr auto Gg = giga; +constexpr auto Tg = tera; +constexpr auto Pg = peta; +constexpr auto Eg = exa; +constexpr auto Zg = zetta; +constexpr auto Yg = yotta; +constexpr auto Rg = ronna; +constexpr auto Qg = quetta; -inline constexpr auto qA = quecto; -inline constexpr auto rA = ronto; -inline constexpr auto yA = yocto; -inline constexpr auto zA = zepto; -inline constexpr auto aA = atto; -inline constexpr auto fA = femto; -inline constexpr auto pA = pico; -inline constexpr auto nA = nano; -inline constexpr auto uA = micro; -inline constexpr auto mA = milli; -inline constexpr auto cA = centi; -inline constexpr auto dA = deci; -inline constexpr auto A = ampere; -inline constexpr auto daA = deca; -inline constexpr auto hA = hecto; -inline constexpr auto kA = kilo; -inline constexpr auto MA = mega; -inline constexpr auto GA = giga; -inline constexpr auto TA = tera; -inline constexpr auto PA = peta; -inline constexpr auto EA = exa; -inline constexpr auto ZA = zetta; -inline constexpr auto YA = yotta; -inline constexpr auto RA = ronna; -inline constexpr auto QA = quetta; +constexpr auto qA = quecto; +constexpr auto rA = ronto; +constexpr auto yA = yocto; +constexpr auto zA = zepto; +constexpr auto aA = atto; +constexpr auto fA = femto; +constexpr auto pA = pico; +constexpr auto nA = nano; +constexpr auto uA = micro; +constexpr auto mA = milli; +constexpr auto cA = centi; +constexpr auto dA = deci; +constexpr auto A = ampere; +constexpr auto daA = deca; +constexpr auto hA = hecto; +constexpr auto kA = kilo; +constexpr auto MA = mega; +constexpr auto GA = giga; +constexpr auto TA = tera; +constexpr auto PA = peta; +constexpr auto EA = exa; +constexpr auto ZA = zetta; +constexpr auto YA = yotta; +constexpr auto RA = ronna; +constexpr auto QA = quetta; -inline constexpr auto qK = quecto; -inline constexpr auto rK = ronto; -inline constexpr auto yK = yocto; -inline constexpr auto zK = zepto; -inline constexpr auto aK = atto; -inline constexpr auto fK = femto; -inline constexpr auto pK = pico; -inline constexpr auto nK = nano; -inline constexpr auto uK = micro; -inline constexpr auto mK = milli; -inline constexpr auto cK = centi; -inline constexpr auto dK = deci; -inline constexpr auto K = kelvin; -inline constexpr auto daK = deca; -inline constexpr auto hK = hecto; -inline constexpr auto kK = kilo; -inline constexpr auto MK = mega; -inline constexpr auto GK = giga; -inline constexpr auto TK = tera; -inline constexpr auto PK = peta; -inline constexpr auto EK = exa; -inline constexpr auto ZK = zetta; -inline constexpr auto YK = yotta; -inline constexpr auto RK = ronna; -inline constexpr auto QK = quetta; +constexpr auto qK = quecto; +constexpr auto rK = ronto; +constexpr auto yK = yocto; +constexpr auto zK = zepto; +constexpr auto aK = atto; +constexpr auto fK = femto; +constexpr auto pK = pico; +constexpr auto nK = nano; +constexpr auto uK = micro; +constexpr auto mK = milli; +constexpr auto cK = centi; +constexpr auto dK = deci; +constexpr auto K = kelvin; +constexpr auto daK = deca; +constexpr auto hK = hecto; +constexpr auto kK = kilo; +constexpr auto MK = mega; +constexpr auto GK = giga; +constexpr auto TK = tera; +constexpr auto PK = peta; +constexpr auto EK = exa; +constexpr auto ZK = zetta; +constexpr auto YK = yotta; +constexpr auto RK = ronna; +constexpr auto QK = quetta; -inline constexpr auto qmol = quecto; -inline constexpr auto rmol = ronto; -inline constexpr auto ymol = yocto; -inline constexpr auto zmol = zepto; -inline constexpr auto amol = atto; -inline constexpr auto fmol = femto; -inline constexpr auto pmol = pico; -inline constexpr auto nmol = nano; -inline constexpr auto umol = micro; -inline constexpr auto mmol = milli; -inline constexpr auto cmol = centi; -inline constexpr auto dmol = deci; -inline constexpr auto mol = mole; -inline constexpr auto damol = deca; -inline constexpr auto hmol = hecto; -inline constexpr auto kmol = kilo; -inline constexpr auto Mmol = mega; -inline constexpr auto Gmol = giga; -inline constexpr auto Tmol = tera; -inline constexpr auto Pmol = peta; -inline constexpr auto Emol = exa; -inline constexpr auto Zmol = zetta; -inline constexpr auto Ymol = yotta; -inline constexpr auto Rmol = ronna; -inline constexpr auto Qmol = quetta; +constexpr auto qmol = quecto; +constexpr auto rmol = ronto; +constexpr auto ymol = yocto; +constexpr auto zmol = zepto; +constexpr auto amol = atto; +constexpr auto fmol = femto; +constexpr auto pmol = pico; +constexpr auto nmol = nano; +constexpr auto umol = micro; +constexpr auto mmol = milli; +constexpr auto cmol = centi; +constexpr auto dmol = deci; +constexpr auto mol = mole; +constexpr auto damol = deca; +constexpr auto hmol = hecto; +constexpr auto kmol = kilo; +constexpr auto Mmol = mega; +constexpr auto Gmol = giga; +constexpr auto Tmol = tera; +constexpr auto Pmol = peta; +constexpr auto Emol = exa; +constexpr auto Zmol = zetta; +constexpr auto Ymol = yotta; +constexpr auto Rmol = ronna; +constexpr auto Qmol = quetta; -inline constexpr auto qcd = quecto; -inline constexpr auto rcd = ronto; -inline constexpr auto ycd = yocto; -inline constexpr auto zcd = zepto; -inline constexpr auto acd = atto; -inline constexpr auto fcd = femto; -inline constexpr auto pcd = pico; -inline constexpr auto ncd = nano; -inline constexpr auto ucd = micro; -inline constexpr auto mcd = milli; -inline constexpr auto ccd = centi; -inline constexpr auto dcd = deci; -inline constexpr auto cd = candela; -inline constexpr auto dacd = deca; -inline constexpr auto hcd = hecto; -inline constexpr auto kcd = kilo; -inline constexpr auto Mcd = mega; -inline constexpr auto Gcd = giga; -inline constexpr auto Tcd = tera; -inline constexpr auto Pcd = peta; -inline constexpr auto Ecd = exa; -inline constexpr auto Zcd = zetta; -inline constexpr auto Ycd = yotta; -inline constexpr auto Rcd = ronna; -inline constexpr auto Qcd = quetta; +constexpr auto qcd = quecto; +constexpr auto rcd = ronto; +constexpr auto ycd = yocto; +constexpr auto zcd = zepto; +constexpr auto acd = atto; +constexpr auto fcd = femto; +constexpr auto pcd = pico; +constexpr auto ncd = nano; +constexpr auto ucd = micro; +constexpr auto mcd = milli; +constexpr auto ccd = centi; +constexpr auto dcd = deci; +constexpr auto cd = candela; +constexpr auto dacd = deca; +constexpr auto hcd = hecto; +constexpr auto kcd = kilo; +constexpr auto Mcd = mega; +constexpr auto Gcd = giga; +constexpr auto Tcd = tera; +constexpr auto Pcd = peta; +constexpr auto Ecd = exa; +constexpr auto Zcd = zetta; +constexpr auto Ycd = yotta; +constexpr auto Rcd = ronna; +constexpr auto Qcd = quetta; -inline constexpr auto qrad = quecto; -inline constexpr auto rrad = ronto; -inline constexpr auto yrad = yocto; -inline constexpr auto zrad = zepto; -inline constexpr auto arad = atto; -inline constexpr auto frad = femto; -inline constexpr auto prad = pico; -inline constexpr auto nrad = nano; -inline constexpr auto urad = micro; -inline constexpr auto mrad = milli; -inline constexpr auto crad = centi; -inline constexpr auto drad = deci; -inline constexpr auto rad = radian; -inline constexpr auto darad = deca; -inline constexpr auto hrad = hecto; -inline constexpr auto krad = kilo; -inline constexpr auto Mrad = mega; -inline constexpr auto Grad = giga; -inline constexpr auto Trad = tera; -inline constexpr auto Prad = peta; -inline constexpr auto Erad = exa; -inline constexpr auto Zrad = zetta; -inline constexpr auto Yrad = yotta; -inline constexpr auto Rrad = ronna; -inline constexpr auto Qrad = quetta; +constexpr auto qrad = quecto; +constexpr auto rrad = ronto; +constexpr auto yrad = yocto; +constexpr auto zrad = zepto; +constexpr auto arad = atto; +constexpr auto frad = femto; +constexpr auto prad = pico; +constexpr auto nrad = nano; +constexpr auto urad = micro; +constexpr auto mrad = milli; +constexpr auto crad = centi; +constexpr auto drad = deci; +constexpr auto rad = radian; +constexpr auto darad = deca; +constexpr auto hrad = hecto; +constexpr auto krad = kilo; +constexpr auto Mrad = mega; +constexpr auto Grad = giga; +constexpr auto Trad = tera; +constexpr auto Prad = peta; +constexpr auto Erad = exa; +constexpr auto Zrad = zetta; +constexpr auto Yrad = yotta; +constexpr auto Rrad = ronna; +constexpr auto Qrad = quetta; -inline constexpr auto qsr = quecto; -inline constexpr auto rsr = ronto; -inline constexpr auto ysr = yocto; -inline constexpr auto zsr = zepto; -inline constexpr auto asr = atto; -inline constexpr auto fsr = femto; -inline constexpr auto psr = pico; -inline constexpr auto nsr = nano; -inline constexpr auto usr = micro; -inline constexpr auto msr = milli; -inline constexpr auto csr = centi; -inline constexpr auto dsr = deci; -inline constexpr auto sr = steradian; -inline constexpr auto dasr = deca; -inline constexpr auto hsr = hecto; -inline constexpr auto ksr = kilo; -inline constexpr auto Msr = mega; -inline constexpr auto Gsr = giga; -inline constexpr auto Tsr = tera; -inline constexpr auto Psr = peta; -inline constexpr auto Esr = exa; -inline constexpr auto Zsr = zetta; -inline constexpr auto Ysr = yotta; -inline constexpr auto Rsr = ronna; -inline constexpr auto Qsr = quetta; +constexpr auto qsr = quecto; +constexpr auto rsr = ronto; +constexpr auto ysr = yocto; +constexpr auto zsr = zepto; +constexpr auto asr = atto; +constexpr auto fsr = femto; +constexpr auto psr = pico; +constexpr auto nsr = nano; +constexpr auto usr = micro; +constexpr auto msr = milli; +constexpr auto csr = centi; +constexpr auto dsr = deci; +constexpr auto sr = steradian; +constexpr auto dasr = deca; +constexpr auto hsr = hecto; +constexpr auto ksr = kilo; +constexpr auto Msr = mega; +constexpr auto Gsr = giga; +constexpr auto Tsr = tera; +constexpr auto Psr = peta; +constexpr auto Esr = exa; +constexpr auto Zsr = zetta; +constexpr auto Ysr = yotta; +constexpr auto Rsr = ronna; +constexpr auto Qsr = quetta; -inline constexpr auto qHz = quecto; -inline constexpr auto rHz = ronto; -inline constexpr auto yHz = yocto; -inline constexpr auto zHz = zepto; -inline constexpr auto aHz = atto; -inline constexpr auto fHz = femto; -inline constexpr auto pHz = pico; -inline constexpr auto nHz = nano; -inline constexpr auto uHz = micro; -inline constexpr auto mHz = milli; -inline constexpr auto cHz = centi; -inline constexpr auto dHz = deci; -inline constexpr auto Hz = hertz; -inline constexpr auto daHz = deca; -inline constexpr auto hHz = hecto; -inline constexpr auto kHz = kilo; -inline constexpr auto MHz = mega; -inline constexpr auto GHz = giga; -inline constexpr auto THz = tera; -inline constexpr auto PHz = peta; -inline constexpr auto EHz = exa; -inline constexpr auto ZHz = zetta; -inline constexpr auto YHz = yotta; -inline constexpr auto RHz = ronna; -inline constexpr auto QHz = quetta; +constexpr auto qHz = quecto; +constexpr auto rHz = ronto; +constexpr auto yHz = yocto; +constexpr auto zHz = zepto; +constexpr auto aHz = atto; +constexpr auto fHz = femto; +constexpr auto pHz = pico; +constexpr auto nHz = nano; +constexpr auto uHz = micro; +constexpr auto mHz = milli; +constexpr auto cHz = centi; +constexpr auto dHz = deci; +constexpr auto Hz = hertz; +constexpr auto daHz = deca; +constexpr auto hHz = hecto; +constexpr auto kHz = kilo; +constexpr auto MHz = mega; +constexpr auto GHz = giga; +constexpr auto THz = tera; +constexpr auto PHz = peta; +constexpr auto EHz = exa; +constexpr auto ZHz = zetta; +constexpr auto YHz = yotta; +constexpr auto RHz = ronna; +constexpr auto QHz = quetta; -inline constexpr auto qN = quecto; -inline constexpr auto rN = ronto; -inline constexpr auto yN = yocto; -inline constexpr auto zN = zepto; -inline constexpr auto aN = atto; -inline constexpr auto fN = femto; -inline constexpr auto pN = pico; -inline constexpr auto nN = nano; -inline constexpr auto uN = micro; -inline constexpr auto mN = milli; -inline constexpr auto cN = centi; -inline constexpr auto dN = deci; -inline constexpr auto N = newton; -inline constexpr auto daN = deca; -inline constexpr auto hN = hecto; -inline constexpr auto kN = kilo; -inline constexpr auto MN = mega; -inline constexpr auto GN = giga; -inline constexpr auto TN = tera; -inline constexpr auto PN = peta; -inline constexpr auto EN = exa; -inline constexpr auto ZN = zetta; -inline constexpr auto YN = yotta; -inline constexpr auto RN = ronna; -inline constexpr auto QN = quetta; +constexpr auto qN = quecto; +constexpr auto rN = ronto; +constexpr auto yN = yocto; +constexpr auto zN = zepto; +constexpr auto aN = atto; +constexpr auto fN = femto; +constexpr auto pN = pico; +constexpr auto nN = nano; +constexpr auto uN = micro; +constexpr auto mN = milli; +constexpr auto cN = centi; +constexpr auto dN = deci; +constexpr auto N = newton; +constexpr auto daN = deca; +constexpr auto hN = hecto; +constexpr auto kN = kilo; +constexpr auto MN = mega; +constexpr auto GN = giga; +constexpr auto TN = tera; +constexpr auto PN = peta; +constexpr auto EN = exa; +constexpr auto ZN = zetta; +constexpr auto YN = yotta; +constexpr auto RN = ronna; +constexpr auto QN = quetta; #ifdef pascal #pragma push_macro("pascal") #undef pascal #define MP_UNITS_REDEFINE_PASCAL #endif -inline constexpr auto qPa = quecto; -inline constexpr auto rPa = ronto; -inline constexpr auto yPa = yocto; -inline constexpr auto zPa = zepto; -inline constexpr auto aPa = atto; -inline constexpr auto fPa = femto; -inline constexpr auto pPa = pico; -inline constexpr auto nPa = nano; -inline constexpr auto uPa = micro; -inline constexpr auto mPa = milli; -inline constexpr auto cPa = centi; -inline constexpr auto dPa = deci; -inline constexpr auto Pa = pascal; -inline constexpr auto daPa = deca; -inline constexpr auto hPa = hecto; -inline constexpr auto kPa = kilo; -inline constexpr auto MPa = mega; -inline constexpr auto GPa = giga; -inline constexpr auto TPa = tera; -inline constexpr auto PPa = peta; -inline constexpr auto EPa = exa; -inline constexpr auto ZPa = zetta; -inline constexpr auto YPa = yotta; -inline constexpr auto RPa = ronna; -inline constexpr auto QPa = quetta; +constexpr auto qPa = quecto; +constexpr auto rPa = ronto; +constexpr auto yPa = yocto; +constexpr auto zPa = zepto; +constexpr auto aPa = atto; +constexpr auto fPa = femto; +constexpr auto pPa = pico; +constexpr auto nPa = nano; +constexpr auto uPa = micro; +constexpr auto mPa = milli; +constexpr auto cPa = centi; +constexpr auto dPa = deci; +constexpr auto Pa = pascal; +constexpr auto daPa = deca; +constexpr auto hPa = hecto; +constexpr auto kPa = kilo; +constexpr auto MPa = mega; +constexpr auto GPa = giga; +constexpr auto TPa = tera; +constexpr auto PPa = peta; +constexpr auto EPa = exa; +constexpr auto ZPa = zetta; +constexpr auto YPa = yotta; +constexpr auto RPa = ronna; +constexpr auto QPa = quetta; #ifdef MP_UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef MP_UNITS_REDEFINE_PASCAL #endif -inline constexpr auto qJ = quecto; -inline constexpr auto rJ = ronto; -inline constexpr auto yJ = yocto; -inline constexpr auto zJ = zepto; -inline constexpr auto aJ = atto; -inline constexpr auto fJ = femto; -inline constexpr auto pJ = pico; -inline constexpr auto nJ = nano; -inline constexpr auto uJ = micro; -inline constexpr auto mJ = milli; -inline constexpr auto cJ = centi; -inline constexpr auto dJ = deci; -inline constexpr auto J = joule; -inline constexpr auto daJ = deca; -inline constexpr auto hJ = hecto; -inline constexpr auto kJ = kilo; -inline constexpr auto MJ = mega; -inline constexpr auto GJ = giga; -inline constexpr auto TJ = tera; -inline constexpr auto PJ = peta; -inline constexpr auto EJ = exa; -inline constexpr auto ZJ = zetta; -inline constexpr auto YJ = yotta; -inline constexpr auto RJ = ronna; -inline constexpr auto QJ = quetta; +constexpr auto qJ = quecto; +constexpr auto rJ = ronto; +constexpr auto yJ = yocto; +constexpr auto zJ = zepto; +constexpr auto aJ = atto; +constexpr auto fJ = femto; +constexpr auto pJ = pico; +constexpr auto nJ = nano; +constexpr auto uJ = micro; +constexpr auto mJ = milli; +constexpr auto cJ = centi; +constexpr auto dJ = deci; +constexpr auto J = joule; +constexpr auto daJ = deca; +constexpr auto hJ = hecto; +constexpr auto kJ = kilo; +constexpr auto MJ = mega; +constexpr auto GJ = giga; +constexpr auto TJ = tera; +constexpr auto PJ = peta; +constexpr auto EJ = exa; +constexpr auto ZJ = zetta; +constexpr auto YJ = yotta; +constexpr auto RJ = ronna; +constexpr auto QJ = quetta; -inline constexpr auto qW = quecto; -inline constexpr auto rW = ronto; -inline constexpr auto yW = yocto; -inline constexpr auto zW = zepto; -inline constexpr auto aW = atto; -inline constexpr auto fW = femto; -inline constexpr auto pW = pico; -inline constexpr auto nW = nano; -inline constexpr auto uW = micro; -inline constexpr auto mW = milli; -inline constexpr auto cW = centi; -inline constexpr auto dW = deci; -inline constexpr auto W = watt; -inline constexpr auto daW = deca; -inline constexpr auto hW = hecto; -inline constexpr auto kW = kilo; -inline constexpr auto MW = mega; -inline constexpr auto GW = giga; -inline constexpr auto TW = tera; -inline constexpr auto PW = peta; -inline constexpr auto EW = exa; -inline constexpr auto ZW = zetta; -inline constexpr auto YW = yotta; -inline constexpr auto RW = ronna; -inline constexpr auto QW = quetta; +constexpr auto qW = quecto; +constexpr auto rW = ronto; +constexpr auto yW = yocto; +constexpr auto zW = zepto; +constexpr auto aW = atto; +constexpr auto fW = femto; +constexpr auto pW = pico; +constexpr auto nW = nano; +constexpr auto uW = micro; +constexpr auto mW = milli; +constexpr auto cW = centi; +constexpr auto dW = deci; +constexpr auto W = watt; +constexpr auto daW = deca; +constexpr auto hW = hecto; +constexpr auto kW = kilo; +constexpr auto MW = mega; +constexpr auto GW = giga; +constexpr auto TW = tera; +constexpr auto PW = peta; +constexpr auto EW = exa; +constexpr auto ZW = zetta; +constexpr auto YW = yotta; +constexpr auto RW = ronna; +constexpr auto QW = quetta; -inline constexpr auto qC = quecto; -inline constexpr auto rC = ronto; -inline constexpr auto yC = yocto; -inline constexpr auto zC = zepto; -inline constexpr auto aC = atto; -inline constexpr auto fC = femto; -inline constexpr auto pC = pico; -inline constexpr auto nC = nano; -inline constexpr auto uC = micro; -inline constexpr auto mC = milli; -inline constexpr auto cC = centi; -inline constexpr auto dC = deci; -inline constexpr auto C = coulomb; -inline constexpr auto daC = deca; -inline constexpr auto hC = hecto; -inline constexpr auto kC = kilo; -inline constexpr auto MC = mega; -inline constexpr auto GC = giga; -inline constexpr auto TC = tera; -inline constexpr auto PC = peta; -inline constexpr auto EC = exa; -inline constexpr auto ZC = zetta; -inline constexpr auto YC = yotta; -inline constexpr auto RC = ronna; -inline constexpr auto QC = quetta; +constexpr auto qC = quecto; +constexpr auto rC = ronto; +constexpr auto yC = yocto; +constexpr auto zC = zepto; +constexpr auto aC = atto; +constexpr auto fC = femto; +constexpr auto pC = pico; +constexpr auto nC = nano; +constexpr auto uC = micro; +constexpr auto mC = milli; +constexpr auto cC = centi; +constexpr auto dC = deci; +constexpr auto C = coulomb; +constexpr auto daC = deca; +constexpr auto hC = hecto; +constexpr auto kC = kilo; +constexpr auto MC = mega; +constexpr auto GC = giga; +constexpr auto TC = tera; +constexpr auto PC = peta; +constexpr auto EC = exa; +constexpr auto ZC = zetta; +constexpr auto YC = yotta; +constexpr auto RC = ronna; +constexpr auto QC = quetta; -inline constexpr auto qV = quecto; -inline constexpr auto rV = ronto; -inline constexpr auto yV = yocto; -inline constexpr auto zV = zepto; -inline constexpr auto aV = atto; -inline constexpr auto fV = femto; -inline constexpr auto pV = pico; -inline constexpr auto nV = nano; -inline constexpr auto uV = micro; -inline constexpr auto mV = milli; -inline constexpr auto cV = centi; -inline constexpr auto dV = deci; -inline constexpr auto V = volt; -inline constexpr auto daV = deca; -inline constexpr auto hV = hecto; -inline constexpr auto kV = kilo; -inline constexpr auto MV = mega; -inline constexpr auto GV = giga; -inline constexpr auto TV = tera; -inline constexpr auto PV = peta; -inline constexpr auto EV = exa; -inline constexpr auto ZV = zetta; -inline constexpr auto YV = yotta; -inline constexpr auto RV = ronna; -inline constexpr auto QV = quetta; +constexpr auto qV = quecto; +constexpr auto rV = ronto; +constexpr auto yV = yocto; +constexpr auto zV = zepto; +constexpr auto aV = atto; +constexpr auto fV = femto; +constexpr auto pV = pico; +constexpr auto nV = nano; +constexpr auto uV = micro; +constexpr auto mV = milli; +constexpr auto cV = centi; +constexpr auto dV = deci; +constexpr auto V = volt; +constexpr auto daV = deca; +constexpr auto hV = hecto; +constexpr auto kV = kilo; +constexpr auto MV = mega; +constexpr auto GV = giga; +constexpr auto TV = tera; +constexpr auto PV = peta; +constexpr auto EV = exa; +constexpr auto ZV = zetta; +constexpr auto YV = yotta; +constexpr auto RV = ronna; +constexpr auto QV = quetta; -inline constexpr auto qF = quecto; -inline constexpr auto rF = ronto; -inline constexpr auto yF = yocto; -inline constexpr auto zF = zepto; -inline constexpr auto aF = atto; -inline constexpr auto fF = femto; -inline constexpr auto pF = pico; -inline constexpr auto nF = nano; -inline constexpr auto uF = micro; -inline constexpr auto mF = milli; -inline constexpr auto cF = centi; -inline constexpr auto dF = deci; -inline constexpr auto F = farad; -inline constexpr auto daF = deca; -inline constexpr auto hF = hecto; -inline constexpr auto kF = kilo; -inline constexpr auto MF = mega; -inline constexpr auto GF = giga; -inline constexpr auto TF = tera; -inline constexpr auto PF = peta; -inline constexpr auto EF = exa; -inline constexpr auto ZF = zetta; -inline constexpr auto YF = yotta; -inline constexpr auto RF = ronna; -inline constexpr auto QF = quetta; +constexpr auto qF = quecto; +constexpr auto rF = ronto; +constexpr auto yF = yocto; +constexpr auto zF = zepto; +constexpr auto aF = atto; +constexpr auto fF = femto; +constexpr auto pF = pico; +constexpr auto nF = nano; +constexpr auto uF = micro; +constexpr auto mF = milli; +constexpr auto cF = centi; +constexpr auto dF = deci; +constexpr auto F = farad; +constexpr auto daF = deca; +constexpr auto hF = hecto; +constexpr auto kF = kilo; +constexpr auto MF = mega; +constexpr auto GF = giga; +constexpr auto TF = tera; +constexpr auto PF = peta; +constexpr auto EF = exa; +constexpr auto ZF = zetta; +constexpr auto YF = yotta; +constexpr auto RF = ronna; +constexpr auto QF = quetta; -inline constexpr auto qohm = quecto; -inline constexpr auto rohm = ronto; -inline constexpr auto yohm = yocto; -inline constexpr auto zohm = zepto; -inline constexpr auto aohm = atto; -inline constexpr auto fohm = femto; -inline constexpr auto pohm = pico; -inline constexpr auto nohm = nano; -inline constexpr auto uohm = micro; -inline constexpr auto mohm = milli; -inline constexpr auto cohm = centi; -inline constexpr auto dohm = deci; +constexpr auto qohm = quecto; +constexpr auto rohm = ronto; +constexpr auto yohm = yocto; +constexpr auto zohm = zepto; +constexpr auto aohm = atto; +constexpr auto fohm = femto; +constexpr auto pohm = pico; +constexpr auto nohm = nano; +constexpr auto uohm = micro; +constexpr auto mohm = milli; +constexpr auto cohm = centi; +constexpr auto dohm = deci; using si::ohm; -inline constexpr auto daohm = deca; -inline constexpr auto hohm = hecto; -inline constexpr auto kohm = kilo; -inline constexpr auto Mohm = mega; -inline constexpr auto Gohm = giga; -inline constexpr auto Tohm = tera; -inline constexpr auto Pohm = peta; -inline constexpr auto Eohm = exa; -inline constexpr auto Zohm = zetta; -inline constexpr auto Yohm = yotta; -inline constexpr auto Rohm = ronna; -inline constexpr auto Qohm = quetta; +constexpr auto daohm = deca; +constexpr auto hohm = hecto; +constexpr auto kohm = kilo; +constexpr auto Mohm = mega; +constexpr auto Gohm = giga; +constexpr auto Tohm = tera; +constexpr auto Pohm = peta; +constexpr auto Eohm = exa; +constexpr auto Zohm = zetta; +constexpr auto Yohm = yotta; +constexpr auto Rohm = ronna; +constexpr auto Qohm = quetta; -inline constexpr auto qS = quecto; -inline constexpr auto rS = ronto; -inline constexpr auto yS = yocto; -inline constexpr auto zS = zepto; -inline constexpr auto aS = atto; -inline constexpr auto fS = femto; -inline constexpr auto pS = pico; -inline constexpr auto nS = nano; -inline constexpr auto uS = micro; -inline constexpr auto mS = milli; -inline constexpr auto cS = centi; -inline constexpr auto dS = deci; -inline constexpr auto S = siemens; -inline constexpr auto daS = deca; -inline constexpr auto hS = hecto; -inline constexpr auto kS = kilo; -inline constexpr auto MS = mega; -inline constexpr auto GS = giga; -inline constexpr auto TS = tera; -inline constexpr auto PS = peta; -inline constexpr auto ES = exa; -inline constexpr auto ZS = zetta; -inline constexpr auto YS = yotta; -inline constexpr auto RS = ronna; -inline constexpr auto QS = quetta; +constexpr auto qS = quecto; +constexpr auto rS = ronto; +constexpr auto yS = yocto; +constexpr auto zS = zepto; +constexpr auto aS = atto; +constexpr auto fS = femto; +constexpr auto pS = pico; +constexpr auto nS = nano; +constexpr auto uS = micro; +constexpr auto mS = milli; +constexpr auto cS = centi; +constexpr auto dS = deci; +constexpr auto S = siemens; +constexpr auto daS = deca; +constexpr auto hS = hecto; +constexpr auto kS = kilo; +constexpr auto MS = mega; +constexpr auto GS = giga; +constexpr auto TS = tera; +constexpr auto PS = peta; +constexpr auto ES = exa; +constexpr auto ZS = zetta; +constexpr auto YS = yotta; +constexpr auto RS = ronna; +constexpr auto QS = quetta; -inline constexpr auto qWb = quecto; -inline constexpr auto rWb = ronto; -inline constexpr auto yWb = yocto; -inline constexpr auto zWb = zepto; -inline constexpr auto aWb = atto; -inline constexpr auto fWb = femto; -inline constexpr auto pWb = pico; -inline constexpr auto nWb = nano; -inline constexpr auto uWb = micro; -inline constexpr auto mWb = milli; -inline constexpr auto cWb = centi; -inline constexpr auto dWb = deci; -inline constexpr auto Wb = weber; -inline constexpr auto daWb = deca; -inline constexpr auto hWb = hecto; -inline constexpr auto kWb = kilo; -inline constexpr auto MWb = mega; -inline constexpr auto GWb = giga; -inline constexpr auto TWb = tera; -inline constexpr auto PWb = peta; -inline constexpr auto EWb = exa; -inline constexpr auto ZWb = zetta; -inline constexpr auto YWb = yotta; -inline constexpr auto RWb = ronna; -inline constexpr auto QWb = quetta; +constexpr auto qWb = quecto; +constexpr auto rWb = ronto; +constexpr auto yWb = yocto; +constexpr auto zWb = zepto; +constexpr auto aWb = atto; +constexpr auto fWb = femto; +constexpr auto pWb = pico; +constexpr auto nWb = nano; +constexpr auto uWb = micro; +constexpr auto mWb = milli; +constexpr auto cWb = centi; +constexpr auto dWb = deci; +constexpr auto Wb = weber; +constexpr auto daWb = deca; +constexpr auto hWb = hecto; +constexpr auto kWb = kilo; +constexpr auto MWb = mega; +constexpr auto GWb = giga; +constexpr auto TWb = tera; +constexpr auto PWb = peta; +constexpr auto EWb = exa; +constexpr auto ZWb = zetta; +constexpr auto YWb = yotta; +constexpr auto RWb = ronna; +constexpr auto QWb = quetta; -inline constexpr auto qT = quecto; -inline constexpr auto rT = ronto; -inline constexpr auto yT = yocto; -inline constexpr auto zT = zepto; -inline constexpr auto aT = atto; -inline constexpr auto fT = femto; -inline constexpr auto pT = pico; -inline constexpr auto nT = nano; -inline constexpr auto uT = micro; -inline constexpr auto mT = milli; -inline constexpr auto cT = centi; -inline constexpr auto dT = deci; -inline constexpr auto T = tesla; -inline constexpr auto daT = deca; -inline constexpr auto hT = hecto; -inline constexpr auto kT = kilo; -inline constexpr auto MT = mega; -inline constexpr auto GT = giga; -inline constexpr auto TT = tera; -inline constexpr auto PT = peta; -inline constexpr auto ET = exa; -inline constexpr auto ZT = zetta; -inline constexpr auto YT = yotta; -inline constexpr auto RT = ronna; -inline constexpr auto QT = quetta; +constexpr auto qT = quecto; +constexpr auto rT = ronto; +constexpr auto yT = yocto; +constexpr auto zT = zepto; +constexpr auto aT = atto; +constexpr auto fT = femto; +constexpr auto pT = pico; +constexpr auto nT = nano; +constexpr auto uT = micro; +constexpr auto mT = milli; +constexpr auto cT = centi; +constexpr auto dT = deci; +constexpr auto T = tesla; +constexpr auto daT = deca; +constexpr auto hT = hecto; +constexpr auto kT = kilo; +constexpr auto MT = mega; +constexpr auto GT = giga; +constexpr auto TT = tera; +constexpr auto PT = peta; +constexpr auto ET = exa; +constexpr auto ZT = zetta; +constexpr auto YT = yotta; +constexpr auto RT = ronna; +constexpr auto QT = quetta; -inline constexpr auto qH = quecto; -inline constexpr auto rH = ronto; -inline constexpr auto yH = yocto; -inline constexpr auto zH = zepto; -inline constexpr auto aH = atto; -inline constexpr auto fH = femto; -inline constexpr auto pH = pico; -inline constexpr auto nH = nano; -inline constexpr auto uH = micro; -inline constexpr auto mH = milli; -inline constexpr auto cH = centi; -inline constexpr auto dH = deci; -inline constexpr auto H = henry; -inline constexpr auto daH = deca; -inline constexpr auto hH = hecto; -inline constexpr auto kH = kilo; -inline constexpr auto MH = mega; -inline constexpr auto GH = giga; -inline constexpr auto TH = tera; -inline constexpr auto PH = peta; -inline constexpr auto EH = exa; -inline constexpr auto ZH = zetta; -inline constexpr auto YH = yotta; -inline constexpr auto RH = ronna; -inline constexpr auto QH = quetta; +constexpr auto qH = quecto; +constexpr auto rH = ronto; +constexpr auto yH = yocto; +constexpr auto zH = zepto; +constexpr auto aH = atto; +constexpr auto fH = femto; +constexpr auto pH = pico; +constexpr auto nH = nano; +constexpr auto uH = micro; +constexpr auto mH = milli; +constexpr auto cH = centi; +constexpr auto dH = deci; +constexpr auto H = henry; +constexpr auto daH = deca; +constexpr auto hH = hecto; +constexpr auto kH = kilo; +constexpr auto MH = mega; +constexpr auto GH = giga; +constexpr auto TH = tera; +constexpr auto PH = peta; +constexpr auto EH = exa; +constexpr auto ZH = zetta; +constexpr auto YH = yotta; +constexpr auto RH = ronna; +constexpr auto QH = quetta; -inline constexpr auto qlm = quecto; -inline constexpr auto rlm = ronto; -inline constexpr auto ylm = yocto; -inline constexpr auto zlm = zepto; -inline constexpr auto alm = atto; -inline constexpr auto flm = femto; -inline constexpr auto plm = pico; -inline constexpr auto nlm = nano; -inline constexpr auto ulm = micro; -inline constexpr auto mlm = milli; -inline constexpr auto clm = centi; -inline constexpr auto dlm = deci; -inline constexpr auto lm = lumen; -inline constexpr auto dalm = deca; -inline constexpr auto hlm = hecto; -inline constexpr auto klm = kilo; -inline constexpr auto Mlm = mega; -inline constexpr auto Glm = giga; -inline constexpr auto Tlm = tera; -inline constexpr auto Plm = peta; -inline constexpr auto Elm = exa; -inline constexpr auto Zlm = zetta; -inline constexpr auto Ylm = yotta; -inline constexpr auto Rlm = ronna; -inline constexpr auto Qlm = quetta; +constexpr auto qlm = quecto; +constexpr auto rlm = ronto; +constexpr auto ylm = yocto; +constexpr auto zlm = zepto; +constexpr auto alm = atto; +constexpr auto flm = femto; +constexpr auto plm = pico; +constexpr auto nlm = nano; +constexpr auto ulm = micro; +constexpr auto mlm = milli; +constexpr auto clm = centi; +constexpr auto dlm = deci; +constexpr auto lm = lumen; +constexpr auto dalm = deca; +constexpr auto hlm = hecto; +constexpr auto klm = kilo; +constexpr auto Mlm = mega; +constexpr auto Glm = giga; +constexpr auto Tlm = tera; +constexpr auto Plm = peta; +constexpr auto Elm = exa; +constexpr auto Zlm = zetta; +constexpr auto Ylm = yotta; +constexpr auto Rlm = ronna; +constexpr auto Qlm = quetta; -inline constexpr auto qlx = quecto; -inline constexpr auto rlx = ronto; -inline constexpr auto ylx = yocto; -inline constexpr auto zlx = zepto; -inline constexpr auto alx = atto; -inline constexpr auto flx = femto; -inline constexpr auto plx = pico; -inline constexpr auto nlx = nano; -inline constexpr auto ulx = micro; -inline constexpr auto mlx = milli; -inline constexpr auto clx = centi; -inline constexpr auto dlx = deci; -inline constexpr auto lx = lux; -inline constexpr auto dalx = deca; -inline constexpr auto hlx = hecto; -inline constexpr auto klx = kilo; -inline constexpr auto Mlx = mega; -inline constexpr auto Glx = giga; -inline constexpr auto Tlx = tera; -inline constexpr auto Plx = peta; -inline constexpr auto Elx = exa; -inline constexpr auto Zlx = zetta; -inline constexpr auto Ylx = yotta; -inline constexpr auto Rlx = ronna; -inline constexpr auto Qlx = quetta; +constexpr auto qlx = quecto; +constexpr auto rlx = ronto; +constexpr auto ylx = yocto; +constexpr auto zlx = zepto; +constexpr auto alx = atto; +constexpr auto flx = femto; +constexpr auto plx = pico; +constexpr auto nlx = nano; +constexpr auto ulx = micro; +constexpr auto mlx = milli; +constexpr auto clx = centi; +constexpr auto dlx = deci; +constexpr auto lx = lux; +constexpr auto dalx = deca; +constexpr auto hlx = hecto; +constexpr auto klx = kilo; +constexpr auto Mlx = mega; +constexpr auto Glx = giga; +constexpr auto Tlx = tera; +constexpr auto Plx = peta; +constexpr auto Elx = exa; +constexpr auto Zlx = zetta; +constexpr auto Ylx = yotta; +constexpr auto Rlx = ronna; +constexpr auto Qlx = quetta; -inline constexpr auto qBq = quecto; -inline constexpr auto rBq = ronto; -inline constexpr auto yBq = yocto; -inline constexpr auto zBq = zepto; -inline constexpr auto aBq = atto; -inline constexpr auto fBq = femto; -inline constexpr auto pBq = pico; -inline constexpr auto nBq = nano; -inline constexpr auto uBq = micro; -inline constexpr auto mBq = milli; -inline constexpr auto cBq = centi; -inline constexpr auto dBq = deci; -inline constexpr auto Bq = becquerel; -inline constexpr auto daBq = deca; -inline constexpr auto hBq = hecto; -inline constexpr auto kBq = kilo; -inline constexpr auto MBq = mega; -inline constexpr auto GBq = giga; -inline constexpr auto TBq = tera; -inline constexpr auto PBq = peta; -inline constexpr auto EBq = exa; -inline constexpr auto ZBq = zetta; -inline constexpr auto YBq = yotta; -inline constexpr auto RBq = ronna; -inline constexpr auto QBq = quetta; +constexpr auto qBq = quecto; +constexpr auto rBq = ronto; +constexpr auto yBq = yocto; +constexpr auto zBq = zepto; +constexpr auto aBq = atto; +constexpr auto fBq = femto; +constexpr auto pBq = pico; +constexpr auto nBq = nano; +constexpr auto uBq = micro; +constexpr auto mBq = milli; +constexpr auto cBq = centi; +constexpr auto dBq = deci; +constexpr auto Bq = becquerel; +constexpr auto daBq = deca; +constexpr auto hBq = hecto; +constexpr auto kBq = kilo; +constexpr auto MBq = mega; +constexpr auto GBq = giga; +constexpr auto TBq = tera; +constexpr auto PBq = peta; +constexpr auto EBq = exa; +constexpr auto ZBq = zetta; +constexpr auto YBq = yotta; +constexpr auto RBq = ronna; +constexpr auto QBq = quetta; -inline constexpr auto qGy = quecto; -inline constexpr auto rGy = ronto; -inline constexpr auto yGy = yocto; -inline constexpr auto zGy = zepto; -inline constexpr auto aGy = atto; -inline constexpr auto fGy = femto; -inline constexpr auto pGy = pico; -inline constexpr auto nGy = nano; -inline constexpr auto uGy = micro; -inline constexpr auto mGy = milli; -inline constexpr auto cGy = centi; -inline constexpr auto dGy = deci; -inline constexpr auto Gy = gray; -inline constexpr auto daGy = deca; -inline constexpr auto hGy = hecto; -inline constexpr auto kGy = kilo; -inline constexpr auto MGy = mega; -inline constexpr auto GGy = giga; -inline constexpr auto TGy = tera; -inline constexpr auto PGy = peta; -inline constexpr auto EGy = exa; -inline constexpr auto ZGy = zetta; -inline constexpr auto YGy = yotta; -inline constexpr auto RGy = ronna; -inline constexpr auto QGy = quetta; +constexpr auto qGy = quecto; +constexpr auto rGy = ronto; +constexpr auto yGy = yocto; +constexpr auto zGy = zepto; +constexpr auto aGy = atto; +constexpr auto fGy = femto; +constexpr auto pGy = pico; +constexpr auto nGy = nano; +constexpr auto uGy = micro; +constexpr auto mGy = milli; +constexpr auto cGy = centi; +constexpr auto dGy = deci; +constexpr auto Gy = gray; +constexpr auto daGy = deca; +constexpr auto hGy = hecto; +constexpr auto kGy = kilo; +constexpr auto MGy = mega; +constexpr auto GGy = giga; +constexpr auto TGy = tera; +constexpr auto PGy = peta; +constexpr auto EGy = exa; +constexpr auto ZGy = zetta; +constexpr auto YGy = yotta; +constexpr auto RGy = ronna; +constexpr auto QGy = quetta; -inline constexpr auto qSv = quecto; -inline constexpr auto rSv = ronto; -inline constexpr auto ySv = yocto; -inline constexpr auto zSv = zepto; -inline constexpr auto aSv = atto; -inline constexpr auto fSv = femto; -inline constexpr auto pSv = pico; -inline constexpr auto nSv = nano; -inline constexpr auto uSv = micro; -inline constexpr auto mSv = milli; -inline constexpr auto cSv = centi; -inline constexpr auto dSv = deci; -inline constexpr auto Sv = sievert; -inline constexpr auto daSv = deca; -inline constexpr auto hSv = hecto; -inline constexpr auto kSv = kilo; -inline constexpr auto MSv = mega; -inline constexpr auto GSv = giga; -inline constexpr auto TSv = tera; -inline constexpr auto PSv = peta; -inline constexpr auto ESv = exa; -inline constexpr auto ZSv = zetta; -inline constexpr auto YSv = yotta; -inline constexpr auto RSv = ronna; -inline constexpr auto QSv = quetta; +constexpr auto qSv = quecto; +constexpr auto rSv = ronto; +constexpr auto ySv = yocto; +constexpr auto zSv = zepto; +constexpr auto aSv = atto; +constexpr auto fSv = femto; +constexpr auto pSv = pico; +constexpr auto nSv = nano; +constexpr auto uSv = micro; +constexpr auto mSv = milli; +constexpr auto cSv = centi; +constexpr auto dSv = deci; +constexpr auto Sv = sievert; +constexpr auto daSv = deca; +constexpr auto hSv = hecto; +constexpr auto kSv = kilo; +constexpr auto MSv = mega; +constexpr auto GSv = giga; +constexpr auto TSv = tera; +constexpr auto PSv = peta; +constexpr auto ESv = exa; +constexpr auto ZSv = zetta; +constexpr auto YSv = yotta; +constexpr auto RSv = ronna; +constexpr auto QSv = quetta; -inline constexpr auto qkat = quecto; -inline constexpr auto rkat = ronto; -inline constexpr auto ykat = yocto; -inline constexpr auto zkat = zepto; -inline constexpr auto akat = atto; -inline constexpr auto fkat = femto; -inline constexpr auto pkat = pico; -inline constexpr auto nkat = nano; -inline constexpr auto ukat = micro; -inline constexpr auto mkat = milli; -inline constexpr auto ckat = centi; -inline constexpr auto dkat = deci; -inline constexpr auto kat = katal; -inline constexpr auto dakat = deca; -inline constexpr auto hkat = hecto; -inline constexpr auto kkat = kilo; -inline constexpr auto Mkat = mega; -inline constexpr auto Gkat = giga; -inline constexpr auto Tkat = tera; -inline constexpr auto Pkat = peta; -inline constexpr auto Ekat = exa; -inline constexpr auto Zkat = zetta; -inline constexpr auto Ykat = yotta; -inline constexpr auto Rkat = ronna; -inline constexpr auto Qkat = quetta; +constexpr auto qkat = quecto; +constexpr auto rkat = ronto; +constexpr auto ykat = yocto; +constexpr auto zkat = zepto; +constexpr auto akat = atto; +constexpr auto fkat = femto; +constexpr auto pkat = pico; +constexpr auto nkat = nano; +constexpr auto ukat = micro; +constexpr auto mkat = milli; +constexpr auto ckat = centi; +constexpr auto dkat = deci; +constexpr auto kat = katal; +constexpr auto dakat = deca; +constexpr auto hkat = hecto; +constexpr auto kkat = kilo; +constexpr auto Mkat = mega; +constexpr auto Gkat = giga; +constexpr auto Tkat = tera; +constexpr auto Pkat = peta; +constexpr auto Ekat = exa; +constexpr auto Zkat = zetta; +constexpr auto Ykat = yotta; +constexpr auto Rkat = ronna; +constexpr auto Qkat = quetta; // no prefixes should be provided for the below units -inline constexpr auto deg_C = degree_Celsius; +constexpr auto deg_C = degree_Celsius; // commonly used squared and cubic units -inline constexpr auto m2 = square(metre); -inline constexpr auto m3 = cubic(metre); -inline constexpr auto m4 = pow<4>(metre); -inline constexpr auto s2 = square(second); -inline constexpr auto s3 = cubic(second); +constexpr auto m2 = square(metre); +constexpr auto m3 = cubic(metre); +constexpr auto m4 = pow<4>(metre); +constexpr auto s2 = square(second); +constexpr auto s3 = cubic(second); } // namespace si::unit_symbols namespace non_si::unit_symbols { // TODO Should the following non-SI units have prefixed symbols predefiend as well? -inline constexpr auto au = astronomical_unit; -inline constexpr auto deg = degree; -inline constexpr auto arcmin = arcminute; -inline constexpr auto arcsec = arcsecond; -inline constexpr auto a = are; -inline constexpr auto ha = hectare; -inline constexpr auto l = litre; -inline constexpr auto t = tonne; -inline constexpr auto Da = dalton; -inline constexpr auto eV = electronvolt; +constexpr auto au = astronomical_unit; +constexpr auto deg = degree; +constexpr auto arcmin = arcminute; +constexpr auto arcsec = arcsecond; +constexpr auto a = are; +constexpr auto ha = hectare; +constexpr auto l = litre; +constexpr auto t = tonne; +constexpr auto Da = dalton; +constexpr auto eV = electronvolt; // no prefixes should be provided for the below units -inline constexpr auto min = minute; -inline constexpr auto h = hour; -inline constexpr auto d = day; +constexpr auto min = minute; +constexpr auto h = hour; +constexpr auto d = day; } // namespace non_si::unit_symbols diff --git a/src/systems/include/mp-units/systems/si/units.h b/src/systems/include/mp-units/systems/si/units.h index 4f5efe52..9b464c98 100644 --- a/src/systems/include/mp-units/systems/si/units.h +++ b/src/systems/include/mp-units/systems/si/units.h @@ -39,55 +39,55 @@ namespace si { // clang-format off // base units -inline constexpr struct second final : named_unit<"s", kind_of> {} second; -inline constexpr struct metre final : named_unit<"m", kind_of> {} metre; -inline constexpr struct gram final : named_unit<"g", kind_of> {} gram; -inline constexpr auto kilogram = kilo; -inline constexpr struct ampere final : named_unit<"A", kind_of> {} ampere; +constexpr struct second final : named_unit<"s", kind_of> {} second; +constexpr struct metre final : named_unit<"m", kind_of> {} metre; +constexpr struct gram final : named_unit<"g", kind_of> {} gram; +constexpr auto kilogram = kilo; +constexpr struct ampere final : named_unit<"A", kind_of> {} ampere; -inline constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; -inline constexpr auto zeroth_kelvin = absolute_zero; -inline constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; +constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; +constexpr auto zeroth_kelvin = absolute_zero; +constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; -inline constexpr struct mole final : named_unit<"mol", kind_of> {} mole; -inline constexpr struct candela final : named_unit<"cd", kind_of> {} candela; +constexpr struct mole final : named_unit<"mol", kind_of> {} mole; +constexpr struct candela final : named_unit<"cd", kind_of> {} candela; // derived named units -inline constexpr struct radian final : named_unit<"rad", metre / metre, kind_of> {} radian; -inline constexpr struct steradian final : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; -inline constexpr struct hertz final : named_unit<"Hz", one / second, kind_of> {} hertz; -inline constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; +constexpr struct radian final : named_unit<"rad", metre / metre, kind_of> {} radian; +constexpr struct steradian final : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; +constexpr struct hertz final : named_unit<"Hz", one / second, kind_of> {} hertz; +constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; #ifdef pascal #pragma push_macro("pascal") #undef pascal #define MP_UNITS_REDEFINE_PASCAL #endif -inline constexpr struct pascal final : named_unit<"Pa", newton / square(metre)> {} pascal; +constexpr struct pascal final : named_unit<"Pa", newton / square(metre)> {} pascal; #ifdef MP_UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef MP_UNITS_REDEFINE_PASCAL #endif -inline constexpr struct joule final : named_unit<"J", newton * metre> {} joule; -inline constexpr struct watt final : named_unit<"W", joule / second> {} watt; -inline constexpr struct coulomb final : named_unit<"C", ampere * second> {} coulomb; -inline constexpr struct volt final : named_unit<"V", watt / ampere> {} volt; -inline constexpr struct farad final : named_unit<"F", coulomb / volt> {} farad; -inline constexpr struct ohm final : named_unit {} ohm; -inline constexpr struct siemens final : named_unit<"S", one / ohm> {} siemens; -inline constexpr struct weber final : named_unit<"Wb", volt * second> {} weber; -inline constexpr struct tesla final : named_unit<"T", weber / square(metre)> {} tesla; -inline constexpr struct henry final : named_unit<"H", weber / ampere> {} henry; +constexpr struct joule final : named_unit<"J", newton * metre> {} joule; +constexpr struct watt final : named_unit<"W", joule / second> {} watt; +constexpr struct coulomb final : named_unit<"C", ampere * second> {} coulomb; +constexpr struct volt final : named_unit<"V", watt / ampere> {} volt; +constexpr struct farad final : named_unit<"F", coulomb / volt> {} farad; +constexpr struct ohm final : named_unit {} ohm; +constexpr struct siemens final : named_unit<"S", one / ohm> {} siemens; +constexpr struct weber final : named_unit<"Wb", volt * second> {} weber; +constexpr struct tesla final : named_unit<"T", weber / square(metre)> {} tesla; +constexpr struct henry final : named_unit<"H", weber / ampere> {} henry; -inline constexpr struct ice_point final : relative_point_origin>(273'150)> {} ice_point; -inline constexpr auto zeroth_degree_Celsius = ice_point; -inline constexpr struct degree_Celsius final : named_unit {} degree_Celsius; +constexpr struct ice_point final : relative_point_origin>(273'150)> {} ice_point; +constexpr auto zeroth_degree_Celsius = ice_point; +constexpr struct degree_Celsius final : named_unit {} degree_Celsius; -inline constexpr struct lumen final : named_unit<"lm", candela * steradian> {} lumen; -inline constexpr struct lux final : named_unit<"lx", lumen / square(metre)> {} lux; -inline constexpr struct becquerel final : named_unit<"Bq", one / second, kind_of> {} becquerel; -inline constexpr struct gray final : named_unit<"Gy", joule / kilogram, kind_of> {} gray; -inline constexpr struct sievert final : named_unit<"Sv", joule / kilogram, kind_of> {} sievert; -inline constexpr struct katal final : named_unit<"kat", mole / second> {} katal; +constexpr struct lumen final : named_unit<"lm", candela * steradian> {} lumen; +constexpr struct lux final : named_unit<"lx", lumen / square(metre)> {} lux; +constexpr struct becquerel final : named_unit<"Bq", one / second, kind_of> {} becquerel; +constexpr struct gray final : named_unit<"Gy", joule / kilogram, kind_of> {} gray; +constexpr struct sievert final : named_unit<"Sv", joule / kilogram, kind_of> {} sievert; +constexpr struct katal final : named_unit<"kat", mole / second> {} katal; // clang-format on } // namespace si @@ -96,20 +96,20 @@ namespace non_si { // clang-format off // non-SI units accepted for use with the SI -inline constexpr struct minute final : named_unit<"min", mag<60> * si::second> {} minute; -inline constexpr struct hour final : named_unit<"h", mag<60> * minute> {} hour; -inline constexpr struct day final : named_unit<"d", mag<24> * hour> {} day; -inline constexpr struct astronomical_unit final : named_unit<"au", mag<149'597'870'700> * si::metre> {} astronomical_unit; -inline constexpr struct degree final : named_unit * si::radian> {} degree; -inline constexpr struct arcminute final : named_unit * degree> {} arcminute; -inline constexpr struct arcsecond final : named_unit * arcminute> {} arcsecond; -inline constexpr struct are final : named_unit<"a", square(si::deca)> {} are; -inline constexpr auto hectare = si::hecto; -inline constexpr struct litre final : named_unit<"l", cubic(si::deci)> {} litre; -inline constexpr struct tonne final : named_unit<"t", mag<1000> * si::kilogram> {} tonne; -inline constexpr struct dalton final : named_unit<"Da", mag_ratio<16'605'390'666'050, 10'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} dalton; +constexpr struct minute final : named_unit<"min", mag<60> * si::second> {} minute; +constexpr struct hour final : named_unit<"h", mag<60> * minute> {} hour; +constexpr struct day final : named_unit<"d", mag<24> * hour> {} day; +constexpr struct astronomical_unit final : named_unit<"au", mag<149'597'870'700> * si::metre> {} astronomical_unit; +constexpr struct degree final : named_unit * si::radian> {} degree; +constexpr struct arcminute final : named_unit * degree> {} arcminute; +constexpr struct arcsecond final : named_unit * arcminute> {} arcsecond; +constexpr struct are final : named_unit<"a", square(si::deca)> {} are; +constexpr auto hectare = si::hecto; +constexpr struct litre final : named_unit<"l", cubic(si::deci)> {} litre; +constexpr struct tonne final : named_unit<"t", mag<1000> * si::kilogram> {} tonne; +constexpr struct dalton final : named_unit<"Da", mag_ratio<16'605'390'666'050, 10'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} dalton; // TODO A different value is provided in the SI Brochure and different in the ISO 80000 -inline constexpr struct electronvolt final : named_unit<"eV", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * si::joule> {} electronvolt; +constexpr struct electronvolt final : named_unit<"eV", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * si::joule> {} electronvolt; // TODO the below are logarithmic units - how to support those? // neper // bel @@ -126,10 +126,10 @@ using namespace non_si; } // namespace si template<> -inline constexpr bool space_before_unit_symbol = false; +constexpr bool space_before_unit_symbol = false; template<> -inline constexpr bool space_before_unit_symbol = false; +constexpr bool space_before_unit_symbol = false; template<> -inline constexpr bool space_before_unit_symbol = false; +constexpr bool space_before_unit_symbol = false; } // namespace mp_units diff --git a/src/systems/include/mp-units/systems/typographic.h b/src/systems/include/mp-units/systems/typographic.h index f368d350..6969d594 100644 --- a/src/systems/include/mp-units/systems/typographic.h +++ b/src/systems/include/mp-units/systems/typographic.h @@ -36,11 +36,11 @@ namespace mp_units::typographic { // clang-format off // https://en.wikipedia.org/wiki/Point_(typography) -inline constexpr struct pica_us final : named_unit<"pica(us)", mag_ratio<166'044, 1'000'000> * international::inch> {} pica_us; -inline constexpr struct point_us final : named_unit<"point(us)", mag_ratio<1, 12> * pica_us> {} point_us; +constexpr struct pica_us final : named_unit<"pica(us)", mag_ratio<166'044, 1'000'000> * international::inch> {} pica_us; +constexpr struct point_us final : named_unit<"point(us)", mag_ratio<1, 12> * pica_us> {} point_us; -inline constexpr struct point_dtp final : named_unit<"point(dtp)", mag_ratio<1, 72> * international::inch> {} point_dtp; -inline constexpr struct pica_dtp final : named_unit<"pica(dtp)", mag<12> * point_dtp> {} pica_dtp; +constexpr struct point_dtp final : named_unit<"point(dtp)", mag_ratio<1, 72> * international::inch> {} point_dtp; +constexpr struct pica_dtp final : named_unit<"pica(dtp)", mag<12> * point_dtp> {} pica_dtp; // clang-format on } // namespace mp_units::typographic diff --git a/src/systems/include/mp-units/systems/usc.h b/src/systems/include/mp-units/systems/usc.h index cca91973..8214d7c4 100644 --- a/src/systems/include/mp-units/systems/usc.h +++ b/src/systems/include/mp-units/systems/usc.h @@ -41,78 +41,78 @@ using namespace international; // https://en.wikipedia.org/wiki/United_States_customary_units#Length // nautical -inline constexpr struct fathom final : named_unit<"ftm(us)", mag<2> * yard> {} fathom; -inline constexpr struct cable final : named_unit<"cb(us)", mag<120> * fathom> {} cable; +constexpr struct fathom final : named_unit<"ftm(us)", mag<2> * yard> {} fathom; +constexpr struct cable final : named_unit<"cb(us)", mag<120> * fathom> {} cable; // survey struct us_survey_foot final : named_unit<"ft(us)", mag_ratio<1'200, 3'937> * si::metre> {}; struct us_survey_mile final : named_unit<"mi(us)", mag<5280> * us_survey_foot{}> {}; [[deprecated("In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is deprecated.")]] -inline constexpr us_survey_foot us_survey_foot; +constexpr us_survey_foot us_survey_foot; [[deprecated("In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is deprecated.")]] -inline constexpr us_survey_mile us_survey_mile; +constexpr us_survey_mile us_survey_mile; -inline constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * foot> {} link; -inline constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; -inline constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; -inline constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; +constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * foot> {} link; +constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; +constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; +constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; // clang-format on namespace survey1893 { // clang-format off -inline constexpr struct us_survey_foot final : named_unit<"ft(us)", mag_ratio<1'200, 3'937> * si::metre> {} us_survey_foot; -inline constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * us_survey_foot> {} link; -inline constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; -inline constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; -inline constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; -inline constexpr struct us_survey_mile final : named_unit<"mi(us)", mag<8> * furlong> {} us_survey_mile; -inline constexpr struct league final : named_unit<"lea", mag<3> * us_survey_mile> {} league; +constexpr struct us_survey_foot final : named_unit<"ft(us)", mag_ratio<1'200, 3'937> * si::metre> {} us_survey_foot; +constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * us_survey_foot> {} link; +constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; +constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; +constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; +constexpr struct us_survey_mile final : named_unit<"mi(us)", mag<8> * furlong> {} us_survey_mile; +constexpr struct league final : named_unit<"lea", mag<3> * us_survey_mile> {} league; // clang-format on } // namespace survey1893 // clang-format off // https://en.wikipedia.org/wiki/United_States_customary_units#Area -inline constexpr struct acre final : named_unit<"acre", mag<10> * square(survey1893::chain)> {} acre; -inline constexpr struct section final : named_unit<"section", mag<640> * acre> {} section; +constexpr struct acre final : named_unit<"acre", mag<10> * square(survey1893::chain)> {} acre; +constexpr struct section final : named_unit<"section", mag<640> * acre> {} section; // https://en.wikipedia.org/wiki/United_States_customary_units#Fluid_volume -inline constexpr struct gallon final : named_unit<"gal", mag<231> * cubic(inch)> {} gallon; -inline constexpr struct pottle final : named_unit<"pot", mag_ratio<1, 2> * gallon> {} pottle; -inline constexpr struct quart final : named_unit<"qt", mag_ratio<1, 2> * pottle> {} quart; -inline constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; -inline constexpr struct cup final : named_unit<"c", mag_ratio<1, 2> * pint> {} cup; -inline constexpr struct gill final : named_unit<"gi", mag_ratio<1, 2> * cup> {} gill; -inline constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 4> * gill> {} fluid_ounce; -inline constexpr struct tablespoon final : named_unit<"tbsp", mag_ratio<1, 2> * fluid_ounce> {} tablespoon; -inline constexpr struct shot final : named_unit<"jig", mag<3> * tablespoon> {} shot; -inline constexpr struct teaspoon final : named_unit<"tsp", mag_ratio<1, 3> * tablespoon> {} teaspoon; -inline constexpr struct minim final : named_unit<"min", mag_ratio<1, 80> * teaspoon> {} minim; -inline constexpr struct fluid_dram final : named_unit<"fl dr", mag<60> * minim> {} fluid_dram; -inline constexpr struct barrel final : named_unit<"bbl", mag_ratio<315, 10> * gallon> {} barrel; -inline constexpr struct oil_barrel final : named_unit<"bbl", mag_ratio<4, 3> * barrel> {} oil_barrel; -inline constexpr struct hogshead final : named_unit<"hogshead", mag<63> * gallon> {} hogshead; +constexpr struct gallon final : named_unit<"gal", mag<231> * cubic(inch)> {} gallon; +constexpr struct pottle final : named_unit<"pot", mag_ratio<1, 2> * gallon> {} pottle; +constexpr struct quart final : named_unit<"qt", mag_ratio<1, 2> * pottle> {} quart; +constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; +constexpr struct cup final : named_unit<"c", mag_ratio<1, 2> * pint> {} cup; +constexpr struct gill final : named_unit<"gi", mag_ratio<1, 2> * cup> {} gill; +constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 4> * gill> {} fluid_ounce; +constexpr struct tablespoon final : named_unit<"tbsp", mag_ratio<1, 2> * fluid_ounce> {} tablespoon; +constexpr struct shot final : named_unit<"jig", mag<3> * tablespoon> {} shot; +constexpr struct teaspoon final : named_unit<"tsp", mag_ratio<1, 3> * tablespoon> {} teaspoon; +constexpr struct minim final : named_unit<"min", mag_ratio<1, 80> * teaspoon> {} minim; +constexpr struct fluid_dram final : named_unit<"fl dr", mag<60> * minim> {} fluid_dram; +constexpr struct barrel final : named_unit<"bbl", mag_ratio<315, 10> * gallon> {} barrel; +constexpr struct oil_barrel final : named_unit<"bbl", mag_ratio<4, 3> * barrel> {} oil_barrel; +constexpr struct hogshead final : named_unit<"hogshead", mag<63> * gallon> {} hogshead; // https://en.wikipedia.org/wiki/United_States_customary_units#Dry_volume -inline constexpr struct dry_barrel final : named_unit<"bbl", mag<7056> * cubic(inch)> {} dry_barrel; -inline constexpr struct bushel final : named_unit<"bu", mag_ratio<3'523'907'016'688, 100'000'000'000> * si::litre> {} bushel; -inline constexpr struct peck final : named_unit<"pk", mag_ratio<1, 4> * bushel> {} peck; -inline constexpr struct dry_gallon final : named_unit<"gal", mag_ratio<1, 2> * peck> {} dry_gallon; -inline constexpr struct dry_quart final : named_unit<"qt", mag_ratio<1, 4> * dry_gallon> {} dry_quart; -inline constexpr struct dry_pint final : named_unit<"pt", mag_ratio<1, 2> * dry_quart> {} dry_pint; +constexpr struct dry_barrel final : named_unit<"bbl", mag<7056> * cubic(inch)> {} dry_barrel; +constexpr struct bushel final : named_unit<"bu", mag_ratio<3'523'907'016'688, 100'000'000'000> * si::litre> {} bushel; +constexpr struct peck final : named_unit<"pk", mag_ratio<1, 4> * bushel> {} peck; +constexpr struct dry_gallon final : named_unit<"gal", mag_ratio<1, 2> * peck> {} dry_gallon; +constexpr struct dry_quart final : named_unit<"qt", mag_ratio<1, 4> * dry_gallon> {} dry_quart; +constexpr struct dry_pint final : named_unit<"pt", mag_ratio<1, 2> * dry_quart> {} dry_pint; // https://en.wikipedia.org/wiki/United_States_customary_units#Mass_and_Weight // https://en.wikipedia.org/wiki/Avoirdupois_system#American_customary_system -inline constexpr struct quarter final : named_unit<"qr", mag<25> * pound> {} quarter; -inline constexpr struct short_hundredweight final : named_unit<"cwt", mag<100> * pound> {} short_hundredweight; -inline constexpr struct ton final : named_unit<"t", mag<2'000> * pound> {} ton; -inline constexpr auto short_ton = ton; -inline constexpr struct pennyweight final : named_unit<"dwt", mag<24> * grain> {} pennyweight; -inline constexpr struct troy_once final : named_unit<"oz t", mag<20> * pennyweight> {} troy_once; -inline constexpr struct troy_pound final : named_unit<"lb t", mag<12> * troy_once> {} troy_pound; +constexpr struct quarter final : named_unit<"qr", mag<25> * pound> {} quarter; +constexpr struct short_hundredweight final : named_unit<"cwt", mag<100> * pound> {} short_hundredweight; +constexpr struct ton final : named_unit<"t", mag<2'000> * pound> {} ton; +constexpr auto short_ton = ton; +constexpr struct pennyweight final : named_unit<"dwt", mag<24> * grain> {} pennyweight; +constexpr struct troy_once final : named_unit<"oz t", mag<20> * pennyweight> {} troy_once; +constexpr struct troy_pound final : named_unit<"lb t", mag<12> * troy_once> {} troy_pound; // https://en.wikipedia.org/wiki/Inch_of_mercury #ifdef pascal @@ -120,15 +120,15 @@ inline constexpr struct troy_pound final : named_unit<"lb t", mag<12> * troy_onc #undef pascal #define MP_UNITS_REDEFINE_PASCAL #endif -inline constexpr struct inch_of_mercury final : named_unit<"inHg", mag_ratio<3'386'389, 1'000> * si::pascal> {} inch_of_mercury; +constexpr struct inch_of_mercury final : named_unit<"inHg", mag_ratio<3'386'389, 1'000> * si::pascal> {} inch_of_mercury; #ifdef MP_UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef MP_UNITS_REDEFINE_PASCAL #endif // https://en.wikipedia.org/wiki/United_States_customary_units#Temperature -inline constexpr struct zeroth_degree_Fahrenheit final : relative_point_origin * si::degree_Celsius>(-32)> {} zeroth_degree_Fahrenheit; -inline constexpr struct degree_Fahrenheit final : named_unit * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; +constexpr struct zeroth_degree_Fahrenheit final : relative_point_origin * si::degree_Celsius>(-32)> {} zeroth_degree_Fahrenheit; +constexpr struct degree_Fahrenheit final : named_unit * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; // clang-format on @@ -136,51 +136,51 @@ namespace unit_symbols { using namespace international::unit_symbols; -inline constexpr auto ftm = fathom; -inline constexpr auto cb = cable; +constexpr auto ftm = fathom; +constexpr auto cb = cable; [[deprecated( "In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is " - "deprecated.")]] inline constexpr struct us_survey_foot us_ft; + "deprecated.")]] constexpr struct us_survey_foot us_ft; [[deprecated( "In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is " - "deprecated.")]] inline constexpr struct us_survey_mile us_mi; -inline constexpr auto li = link; -inline constexpr auto rd = rod; -inline constexpr auto ch = chain; -inline constexpr auto fur = furlong; -inline constexpr auto lea = league; + "deprecated.")]] constexpr struct us_survey_mile us_mi; +constexpr auto li = link; +constexpr auto rd = rod; +constexpr auto ch = chain; +constexpr auto fur = furlong; +constexpr auto lea = league; -inline constexpr auto gal = gallon; -inline constexpr auto pot = pottle; -inline constexpr auto qt = quart; -inline constexpr auto pt = pint; -inline constexpr auto c = cup; -inline constexpr auto gi = gill; -inline constexpr auto fl_oz = fluid_ounce; -inline constexpr auto tbsp = tablespoon; -inline constexpr auto jig = shot; -inline constexpr auto tsp = teaspoon; -inline constexpr auto min = minim; -inline constexpr auto fl_dr = fluid_dram; -inline constexpr auto bbl = barrel; +constexpr auto gal = gallon; +constexpr auto pot = pottle; +constexpr auto qt = quart; +constexpr auto pt = pint; +constexpr auto c = cup; +constexpr auto gi = gill; +constexpr auto fl_oz = fluid_ounce; +constexpr auto tbsp = tablespoon; +constexpr auto jig = shot; +constexpr auto tsp = teaspoon; +constexpr auto min = minim; +constexpr auto fl_dr = fluid_dram; +constexpr auto bbl = barrel; -inline constexpr auto dry_bbl = dry_barrel; -inline constexpr auto bu = bushel; -inline constexpr auto pk = peck; -inline constexpr auto dry_gal = dry_gallon; -inline constexpr auto dry_qt = dry_quart; -inline constexpr auto dry_pt = dry_pint; +constexpr auto dry_bbl = dry_barrel; +constexpr auto bu = bushel; +constexpr auto pk = peck; +constexpr auto dry_gal = dry_gallon; +constexpr auto dry_qt = dry_quart; +constexpr auto dry_pt = dry_pint; -inline constexpr auto qr = quarter; -inline constexpr auto cwt = short_hundredweight; -inline constexpr auto t = ton; -inline constexpr auto dwt = pennyweight; -inline constexpr auto oz_t = troy_once; -inline constexpr auto lb_t = troy_pound; +constexpr auto qr = quarter; +constexpr auto cwt = short_hundredweight; +constexpr auto t = ton; +constexpr auto dwt = pennyweight; +constexpr auto oz_t = troy_once; +constexpr auto lb_t = troy_pound; -inline constexpr auto inHg = inch_of_mercury; +constexpr auto inHg = inch_of_mercury; -inline constexpr auto deg_F = degree_Fahrenheit; +constexpr auto deg_F = degree_Fahrenheit; } // namespace unit_symbols diff --git a/test/runtime/fmt_test.cpp b/test/runtime/fmt_test.cpp index 7df94d90..5cf76786 100644 --- a/test/runtime/fmt_test.cpp +++ b/test/runtime/fmt_test.cpp @@ -50,7 +50,7 @@ import mp_units; template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; using namespace mp_units; using namespace mp_units::si::unit_symbols; diff --git a/test/runtime/linear_algebra_test.cpp b/test/runtime/linear_algebra_test.cpp index 0a8e8ef7..4799decd 100644 --- a/test/runtime/linear_algebra_test.cpp +++ b/test/runtime/linear_algebra_test.cpp @@ -44,10 +44,10 @@ template using vector = STD_LA::fixed_size_column_vector; template -inline constexpr bool mp_units::treat_as_floating_point> = mp_units::treat_as_floating_point; +constexpr bool mp_units::treat_as_floating_point> = mp_units::treat_as_floating_point; template -inline constexpr bool mp_units::is_vector> = true; +constexpr bool mp_units::is_vector> = true; template std::ostream& operator<<(std::ostream& os, const vector& v) @@ -301,7 +301,7 @@ TEST_CASE("vector quantity", "[la]") template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; TEST_CASE("vector of quantities", "[la]") { diff --git a/test/runtime/truncation_test.cpp b/test/runtime/truncation_test.cpp index 3ff10046..2626c583 100644 --- a/test/runtime/truncation_test.cpp +++ b/test/runtime/truncation_test.cpp @@ -42,9 +42,9 @@ using namespace mp_units; using namespace mp_units::angular; using namespace mp_units::angular::unit_symbols; -inline constexpr struct half_revolution final : named_unit<"hrev", mag_pi * radian> { +constexpr struct half_revolution final : named_unit<"hrev", mag_pi * radian> { } half_revolution; -inline constexpr auto hrev = half_revolution; +constexpr auto hrev = half_revolution; // constexpr auto revb6 = mag_ratio<1,3> * mag_pi * rad; diff --git a/test/static/cgs_test.cpp b/test/static/cgs_test.cpp index 557a8f7a..c027b601 100644 --- a/test/static/cgs_test.cpp +++ b/test/static/cgs_test.cpp @@ -28,7 +28,7 @@ template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; namespace { diff --git a/test/static/concepts_test.cpp b/test/static/concepts_test.cpp index 06b20699..937776eb 100644 --- a/test/static/concepts_test.cpp +++ b/test/static/concepts_test.cpp @@ -37,19 +37,19 @@ import std; #if MP_UNITS_HOSTED template -inline constexpr bool mp_units::is_scalar> = true; +constexpr bool mp_units::is_scalar> = true; #endif namespace { using namespace mp_units; -inline constexpr struct my_origin final : absolute_point_origin { +constexpr struct my_origin final : absolute_point_origin { } my_origin; -inline constexpr struct my_relative_origin final : relative_point_origin { +constexpr struct my_relative_origin final : relative_point_origin { } my_relative_origin; -inline constexpr auto dim_speed = isq::dim_length / isq::dim_time; +constexpr auto dim_speed = isq::dim_length / isq::dim_time; // BaseDimension static_assert(detail::BaseDimension); @@ -78,7 +78,7 @@ static_assert(!Dimension); // TODO add tests // QuantitySpec -inline constexpr auto speed = isq::length / isq::time; +constexpr auto speed = isq::length / isq::time; static_assert(QuantitySpec); static_assert(QuantitySpec); diff --git a/test/static/custom_rep_test_min_impl.cpp b/test/static/custom_rep_test_min_impl.cpp index 8e8c3b7c..4fb2537b 100644 --- a/test/static/custom_rep_test_min_impl.cpp +++ b/test/static/custom_rep_test_min_impl.cpp @@ -61,7 +61,7 @@ public: } // namespace template -inline constexpr bool mp_units::is_scalar> = true; +constexpr bool mp_units::is_scalar> = true; template struct std::common_type, min_impl> : std::type_identity>> {}; diff --git a/test/static/dimension_test.cpp b/test/static/dimension_test.cpp index 8064831e..6d4aa96f 100644 --- a/test/static/dimension_test.cpp +++ b/test/static/dimension_test.cpp @@ -36,31 +36,31 @@ using namespace mp_units; using dimension_one_ = struct dimension_one; // clang-format off -inline constexpr struct length_ final : base_dimension<"L"> {} length; -inline constexpr struct mass_ final : base_dimension<"M"> {} mass; -inline constexpr struct time_ final : base_dimension<"T"> {} time; +constexpr struct length_ final : base_dimension<"L"> {} length; +constexpr struct mass_ final : base_dimension<"M"> {} mass; +constexpr struct time_ final : base_dimension<"T"> {} time; -inline constexpr auto my_length1 = length; -inline constexpr auto my_length2 = length; +constexpr auto my_length1 = length; +constexpr auto my_length2 = length; QUANTITY_SPEC_(q_time, time); -inline constexpr struct second_ final : named_unit<"s", kind_of> {} second; +constexpr struct second_ final : named_unit<"s", kind_of> {} second; -inline constexpr auto frequency = inverse(time); -inline constexpr auto action = inverse(time); -inline constexpr auto area = length * length; -inline constexpr auto volume = area * length; -inline constexpr auto speed = length / time; -inline constexpr auto acceleration = speed / time; -inline constexpr auto force = mass * acceleration; -inline constexpr auto moment_of_force = length * force; -inline constexpr auto torque = moment_of_force; -inline constexpr auto pressure = force / area; -inline constexpr auto stress = pressure; -inline constexpr auto strain = stress / stress; -inline constexpr auto power = force * speed; -inline constexpr auto efficiency = power / power; -inline constexpr auto energy = force * length; +constexpr auto frequency = inverse(time); +constexpr auto action = inverse(time); +constexpr auto area = length * length; +constexpr auto volume = area * length; +constexpr auto speed = length / time; +constexpr auto acceleration = speed / time; +constexpr auto force = mass * acceleration; +constexpr auto moment_of_force = length * force; +constexpr auto torque = moment_of_force; +constexpr auto pressure = force / area; +constexpr auto stress = pressure; +constexpr auto strain = stress / stress; +constexpr auto power = force * speed; +constexpr auto efficiency = power / power; +constexpr auto energy = force * length; // clang-format on // concepts verification diff --git a/test/static/hep_test.cpp b/test/static/hep_test.cpp index 20316774..62407bd4 100644 --- a/test/static/hep_test.cpp +++ b/test/static/hep_test.cpp @@ -26,7 +26,7 @@ template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; namespace { diff --git a/test/static/international_test.cpp b/test/static/international_test.cpp index 8dc41168..755eea73 100644 --- a/test/static/international_test.cpp +++ b/test/static/international_test.cpp @@ -28,7 +28,7 @@ template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; namespace { diff --git a/test/static/magnitude_test.cpp b/test/static/magnitude_test.cpp index f245b0b8..da2dd5cb 100644 --- a/test/static/magnitude_test.cpp +++ b/test/static/magnitude_test.cpp @@ -32,7 +32,7 @@ using namespace units; using namespace units::detail; template<> -inline constexpr std::optional units::known_first_factor<9223372036854775783> = 9223372036854775783; +constexpr std::optional units::known_first_factor<9223372036854775783> = 9223372036854775783; namespace { @@ -71,11 +71,11 @@ namespace { // CHECK(round_trip == R); // } -inline constexpr struct mag_2_ : magnitude<2> { +constexpr struct mag_2_ : magnitude<2> { } mag_2; -// inline constexpr struct mag_2_other : magnitude<2> { +// constexpr struct mag_2_other : magnitude<2> { // } mag_2_other; -// inline constexpr struct mag_3 : magnitude<2> { +// constexpr struct mag_3 : magnitude<2> { // } mag_3; // concepts verification diff --git a/test/static/natural_test.cpp b/test/static/natural_test.cpp index 84e61e9e..9986149a 100644 --- a/test/static/natural_test.cpp +++ b/test/static/natural_test.cpp @@ -24,7 +24,7 @@ template requires mp_units::is_scalar -inline constexpr bool mp_units::is_vector = true; +constexpr bool mp_units::is_vector = true; namespace { diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 06ad1f16..80a35127 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -50,38 +50,38 @@ using namespace std::chrono_literals; using sys_seconds = std::chrono::time_point; #endif -inline constexpr struct zeroth_length final : absolute_point_origin { +constexpr struct zeroth_length final : absolute_point_origin { } zeroth_length; -inline constexpr struct mean_sea_level final : absolute_point_origin { +constexpr struct mean_sea_level final : absolute_point_origin { } mean_sea_level; -inline constexpr auto my_mean_sea_level = mean_sea_level; +constexpr auto my_mean_sea_level = mean_sea_level; -inline constexpr struct same_mean_sea_level final : relative_point_origin { +constexpr struct same_mean_sea_level final : relative_point_origin { } same_mean_sea_level; -inline constexpr struct ground_level final : relative_point_origin { +constexpr struct ground_level final : relative_point_origin { } ground_level; -inline constexpr auto my_ground_level = ground_level; +constexpr auto my_ground_level = ground_level; -inline constexpr struct same_ground_level1 final : relative_point_origin { +constexpr struct same_ground_level1 final : relative_point_origin { } same_ground_level1; -inline constexpr struct same_ground_level2 final : relative_point_origin { +constexpr struct same_ground_level2 final : relative_point_origin { } same_ground_level2; -inline constexpr struct tower_peak final : relative_point_origin { +constexpr struct tower_peak final : relative_point_origin { } tower_peak; -inline constexpr struct other_ground_level final : relative_point_origin { +constexpr struct other_ground_level final : relative_point_origin { } other_ground_level; -inline constexpr struct other_absolute_level final : absolute_point_origin { +constexpr struct other_absolute_level final : absolute_point_origin { } other_absolute_level; -inline constexpr struct zero final : absolute_point_origin { +constexpr struct zero final : absolute_point_origin { } zero; QUANTITY_SPEC(special_height, isq::height); @@ -111,18 +111,18 @@ static_assert(ground_level != other_ground_level); template struct absolute_po_ final : absolute_point_origin {}; template -inline constexpr absolute_po_ absolute_po; +constexpr absolute_po_ absolute_po; template struct relative_po_ final : relative_point_origin {}; template -inline constexpr relative_po_ relative_po; +constexpr relative_po_ relative_po; static_assert(relative_po + isq::height(42 * m)>.quantity_spec == isq::height); static_assert(relative_po> + isq::height(42 * m)>.quantity_spec == isq::height); static_assert(relative_po + 42 * m>.quantity_spec == isq::height); -inline constexpr struct my_kelvin final : named_unit<"my_K", mag<10> * si::kelvin> { +constexpr struct my_kelvin final : named_unit<"my_K", mag<10> * si::kelvin> { } my_kelvin; static_assert(default_point_origin(si::kelvin) == si::absolute_zero); @@ -1516,7 +1516,7 @@ static_assert(ground_level - other_ground_level == -81 * m); static_assert(other_ground_level - tower_peak == 39 * m); static_assert(tower_peak - other_ground_level == -39 * m); -inline constexpr struct zero_m_per_s final : absolute_point_origin> { +constexpr struct zero_m_per_s final : absolute_point_origin> { } zero_m_per_s; // commutativity and associativity @@ -1604,7 +1604,7 @@ static_assert( is_of_type, int>>); -inline constexpr struct zero_Hz final : absolute_point_origin> { +constexpr struct zero_Hz final : absolute_point_origin> { } zero_Hz; static_assert(((zero_Hz + 10 / (2 * isq::period_duration[s])) + 5 * isq::frequency[Hz]).quantity_from(zero_Hz) == @@ -1688,7 +1688,7 @@ consteval bool invalid_subtraction(Ts... ts) return !requires { (... - ts); }; } -inline constexpr struct zero_Bq final : absolute_point_origin> { +constexpr struct zero_Bq final : absolute_point_origin> { } zero_Bq; static_assert(invalid_addition(zero_Bq + 5 * isq::activity[Bq], 5 * isq::frequency[Hz])); diff --git a/test/static/quantity_spec_test.cpp b/test/static/quantity_spec_test.cpp index ee4e86a8..8b5dc990 100644 --- a/test/static/quantity_spec_test.cpp +++ b/test/static/quantity_spec_test.cpp @@ -37,22 +37,22 @@ using dimensionless_ = struct dimensionless; using dim_one_ = struct dimension_one; // clang-format off -inline constexpr struct dim_length_ final : base_dimension<"L"> {} dim_length; -inline constexpr struct dim_mass_ final : base_dimension<"M"> {} dim_mass; -inline constexpr struct dim_time_ final : base_dimension<"T"> {} dim_time; +constexpr struct dim_length_ final : base_dimension<"L"> {} dim_length; +constexpr struct dim_mass_ final : base_dimension<"M"> {} dim_mass; +constexpr struct dim_time_ final : base_dimension<"T"> {} dim_time; // quantities specification QUANTITY_SPEC_(length, dim_length); QUANTITY_SPEC_(mass, dim_mass); QUANTITY_SPEC_(time, dim_time); -inline constexpr struct second_ final : named_unit<"s", kind_of {} B; -constexpr struct C final : relative_point_origin {} C; -constexpr struct D final : relative_point_origin {} D; +inline constexpr struct A final : absolute_point_origin {} A; +inline constexpr struct B final : relative_point_origin {} B; +inline constexpr struct C final : relative_point_origin {} C; +inline constexpr struct D final : relative_point_origin {} D; quantity_point qp1 = C + 100 * m; quantity_point qp2 = D + 120 * m; @@ -408,17 +408,17 @@ point origins for this purpose: ```cpp namespace si { -constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; -constexpr auto zeroth_kelvin = absolute_zero; +inline constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; +inline constexpr auto zeroth_kelvin = absolute_zero; -constexpr struct ice_point final : relative_point_origin>(273'150)}> {} ice_point; -constexpr auto zeroth_degree_Celsius = ice_point; +inline constexpr struct ice_point final : relative_point_origin>(273'150)}> {} ice_point; +inline constexpr auto zeroth_degree_Celsius = ice_point; } namespace usc { -constexpr struct zeroth_degree_Fahrenheit final : +inline constexpr struct zeroth_degree_Fahrenheit final : relative_point_origin * si::degree_Celsius>(-32)> {} zeroth_degree_Fahrenheit; } @@ -442,16 +442,16 @@ definitions: ```cpp namespace si { -constexpr struct kelvin final : +inline constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; -constexpr struct degree_Celsius final : +inline constexpr struct degree_Celsius final : named_unit<{u8"℃", "`C"}, kelvin, zeroth_degree_Celsius> {} degree_Celsius; } namespace usc { -constexpr struct degree_Fahrenheit final : +inline constexpr struct degree_Fahrenheit final : named_unit<{u8"℉", "`F"}, mag_ratio<5, 9> * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; diff --git a/docs/users_guide/framework_basics/value_conversions.md b/docs/users_guide/framework_basics/value_conversions.md index f22ad6aa..1ec7e340 100644 --- a/docs/users_guide/framework_basics/value_conversions.md +++ b/docs/users_guide/framework_basics/value_conversions.md @@ -85,16 +85,16 @@ the `value_cast(q)` which always returns the most precise result: === "C++23" ```cpp - constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; - constexpr struct currency final : quantity_spec {} currency; + inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; + inline constexpr struct currency final : quantity_spec {} currency; - constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; - constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; + inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; + inline constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; namespace unit_symbols { - constexpr auto USD = us_dollar; - constexpr auto USD_s = scaled_us_dollar; + inline constexpr auto USD = us_dollar; + inline constexpr auto USD_s = scaled_us_dollar; } // namespace unit_symbols @@ -105,16 +105,16 @@ the `value_cast(q)` which always returns the most precise result: === "C++20" ```cpp - constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; - constexpr struct currency final : quantity_spec {} currency; + inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; + inline constexpr struct currency final : quantity_spec {} currency; - constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; - constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; + inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; + inline constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; namespace unit_symbols { - constexpr auto USD = us_dollar; - constexpr auto USD_s = scaled_us_dollar; + inline constexpr auto USD = us_dollar; + inline constexpr auto USD_s = scaled_us_dollar; } // namespace unit_symbols @@ -125,16 +125,16 @@ the `value_cast(q)` which always returns the most precise result: === "Portable" ```cpp - constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; + inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; QUANTITY_SPEC(currency, dim_currency); - constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; - constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; + inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; + inline constexpr struct scaled_us_dollar final : named_unit<"USD_s", mag_power<10, -8> * us_dollar> {} scaled_us_dollar; namespace unit_symbols { - constexpr auto USD = us_dollar; - constexpr auto USD_s = scaled_us_dollar; + inline constexpr auto USD = us_dollar; + inline constexpr auto USD_s = scaled_us_dollar; } // namespace unit_symbols diff --git a/docs/users_guide/use_cases/interoperability_with_other_libraries.md b/docs/users_guide/use_cases/interoperability_with_other_libraries.md index b449b02f..07da96af 100644 --- a/docs/users_guide/use_cases/interoperability_with_other_libraries.md +++ b/docs/users_guide/use_cases/interoperability_with_other_libraries.md @@ -249,8 +249,8 @@ include the _mp-units/systems/si/chrono.h_ file to benefit from it. This file pr to the `std::chrono` abstractions: ```cpp - constexpr struct ts_origin final : relative_point_origin + 1 * h> {} ts_origin; - constexpr struct my_origin final : absolute_point_origin {} my_origin; + inline constexpr struct ts_origin final : relative_point_origin + 1 * h> {} ts_origin; + inline constexpr struct my_origin final : absolute_point_origin {} my_origin; quantity_point qp1 = sys_seconds{1s}; auto tp1 = to_chrono_time_point(qp1); // OK diff --git a/docs/users_guide/use_cases/wide_compatibility.md b/docs/users_guide/use_cases/wide_compatibility.md index 22c968c1..b3420d12 100644 --- a/docs/users_guide/use_cases/wide_compatibility.md +++ b/docs/users_guide/use_cases/wide_compatibility.md @@ -29,7 +29,7 @@ your code using **mp-units**: // ... - constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... @@ -45,7 +45,7 @@ your code using **mp-units**: // ... - constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... @@ -65,7 +65,7 @@ your code using **mp-units**: // ... - constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... @@ -85,7 +85,7 @@ your code using **mp-units**: // ... - constexpr struct horizontal_length final : quantity_spec {} horizontal_length; + inline constexpr struct horizontal_length final : quantity_spec {} horizontal_length; // ... diff --git a/example/currency.cpp b/example/currency.cpp index fcc0e0d5..6f280659 100644 --- a/example/currency.cpp +++ b/example/currency.cpp @@ -40,22 +40,22 @@ import mp_units.core; using namespace mp_units; // clang-format off -constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; +inline constexpr struct dim_currency final : base_dimension<"$"> {} dim_currency; QUANTITY_SPEC(currency, dim_currency); -constexpr struct euro final : named_unit<"EUR", kind_of> {} euro; -constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; -constexpr struct great_british_pound final : named_unit<"GBP", kind_of> {} great_british_pound; -constexpr struct japanese_jen final : named_unit<"JPY", kind_of> {} japanese_jen; +inline constexpr struct euro final : named_unit<"EUR", kind_of> {} euro; +inline constexpr struct us_dollar final : named_unit<"USD", kind_of> {} us_dollar; +inline constexpr struct great_british_pound final : named_unit<"GBP", kind_of> {} great_british_pound; +inline constexpr struct japanese_jen final : named_unit<"JPY", kind_of> {} japanese_jen; // clang-format on namespace unit_symbols { -constexpr auto EUR = euro; -constexpr auto USD = us_dollar; -constexpr auto GBP = great_british_pound; -constexpr auto JPY = japanese_jen; +inline constexpr auto EUR = euro; +inline constexpr auto USD = us_dollar; +inline constexpr auto GBP = great_british_pound; +inline constexpr auto JPY = japanese_jen; } // namespace unit_symbols diff --git a/example/include/geographic.h b/example/include/geographic.h index 9cbaaee1..ba26b3f1 100644 --- a/example/include/geographic.h +++ b/example/include/geographic.h @@ -44,7 +44,7 @@ import mp_units; namespace geographic { -constexpr struct mean_sea_level final : mp_units::absolute_point_origin { +inline constexpr struct mean_sea_level final : mp_units::absolute_point_origin { } mean_sea_level; using msl_altitude = mp_units::quantity_point; @@ -72,9 +72,9 @@ struct MP_UNITS_STD_FMT::formatter : namespace geographic { -constexpr struct equator final : mp_units::absolute_point_origin { +inline constexpr struct equator final : mp_units::absolute_point_origin { } equator; -constexpr struct prime_meridian final : mp_units::absolute_point_origin { +inline constexpr struct prime_meridian final : mp_units::absolute_point_origin { } prime_meridian; diff --git a/example/include/validated_type.h b/example/include/validated_type.h index 0150c118..ec42f893 100644 --- a/example/include/validated_type.h +++ b/example/include/validated_type.h @@ -40,7 +40,7 @@ import mp_units.core; #include #endif -constexpr struct validated_tag { +inline constexpr struct validated_tag { } validated; template Validator> diff --git a/example/storage_tank.cpp b/example/storage_tank.cpp index 2bb4f237..86bc32ff 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -58,8 +58,8 @@ QUANTITY_SPEC(horizontal_length, isq::length); // with a constrained quantity equation QUANTITY_SPEC(horizontal_area, isq::area, horizontal_length* isq::width); -constexpr auto g = 1 * si::standard_gravity; -constexpr auto air_density = isq::mass_density(1.225 * kg / m3); +inline constexpr auto g = 1 * si::standard_gravity; +inline constexpr auto air_density = isq::mass_density(1.225 * kg / m3); class StorageTank { quantity base_; diff --git a/example/unmanned_aerial_vehicle.cpp b/example/unmanned_aerial_vehicle.cpp index 2551110d..064e8055 100644 --- a/example/unmanned_aerial_vehicle.cpp +++ b/example/unmanned_aerial_vehicle.cpp @@ -119,7 +119,7 @@ hae_altitude to_hae(msl_altitude msl, position pos) // **** HAL **** // clang-format off -constexpr struct height_above_launch final : absolute_point_origin {} height_above_launch; +inline constexpr struct height_above_launch final : absolute_point_origin {} height_above_launch; // clang-format on using hal_altitude = quantity_point; diff --git a/src/core/include/mp-units/bits/hacks.h b/src/core/include/mp-units/bits/hacks.h index 2c66f296..5030debb 100644 --- a/src/core/include/mp-units/bits/hacks.h +++ b/src/core/include/mp-units/bits/hacks.h @@ -104,7 +104,7 @@ namespace std { struct from_range_t { explicit from_range_t() = default; }; -constexpr from_range_t from_range{}; +inline constexpr from_range_t from_range{}; } // namespace std diff --git a/src/core/include/mp-units/bits/text_tools.h b/src/core/include/mp-units/bits/text_tools.h index 123ad858..dc5bfed3 100644 --- a/src/core/include/mp-units/bits/text_tools.h +++ b/src/core/include/mp-units/bits/text_tools.h @@ -63,9 +63,9 @@ constexpr basic_fixed_string superscript_number<8> = u8"\u2078"; template<> constexpr basic_fixed_string superscript_number<9> = u8"\u2079"; -constexpr symbol_text superscript_minus(u8"\u207b", "-"); +inline constexpr symbol_text superscript_minus(u8"\u207b", "-"); -constexpr symbol_text superscript_prefix(u8"", "^"); +inline constexpr symbol_text superscript_prefix(u8"", "^"); template [[nodiscard]] consteval auto superscript_helper() diff --git a/src/core/include/mp-units/compat_macros.h b/src/core/include/mp-units/compat_macros.h index f221bbbf..4add3e12 100644 --- a/src/core/include/mp-units/compat_macros.h +++ b/src/core/include/mp-units/compat_macros.h @@ -28,14 +28,14 @@ #if MP_UNITS_API_NO_CRTP -#define QUANTITY_SPEC(name, ...) \ - constexpr struct name final : ::mp_units::quantity_spec<__VA_ARGS__> { \ +#define QUANTITY_SPEC(name, ...) \ + inline constexpr struct name final : ::mp_units::quantity_spec<__VA_ARGS__> { \ } name #else -#define QUANTITY_SPEC(name, ...) \ - constexpr struct name final : ::mp_units::quantity_spec { \ +#define QUANTITY_SPEC(name, ...) \ + inline constexpr struct name final : ::mp_units::quantity_spec { \ } name #endif diff --git a/src/core/include/mp-units/framework/dimension.h b/src/core/include/mp-units/framework/dimension.h index 71b63036..6b2cb360 100644 --- a/src/core/include/mp-units/framework/dimension.h +++ b/src/core/include/mp-units/framework/dimension.h @@ -115,9 +115,9 @@ struct dimension_interface { * For example: * * @code{.cpp} - * constexpr struct dim_length final : base_dimension<"L"> {} dim_length; - * constexpr struct dim_time final : base_dimension<"T"> {} dim_time; - * constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; + * inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; + * inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; + * inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -184,7 +184,9 @@ struct derived_dimension final : detail::dimension_interface, detail::derived_di * dimensions are zero. It is a dimension of a quantity of dimension one also known as * "dimensionless". */ -MP_UNITS_EXPORT constexpr struct dimension_one final : detail::dimension_interface, detail::derived_dimension_impl<> { +MP_UNITS_EXPORT inline constexpr struct dimension_one final : + detail::dimension_interface, + detail::derived_dimension_impl<> { } dimension_one; namespace detail { diff --git a/src/core/include/mp-units/framework/magnitude.h b/src/core/include/mp-units/framework/magnitude.h index 84312fd3..afe91564 100644 --- a/src/core/include/mp-units/framework/magnitude.h +++ b/src/core/include/mp-units/framework/magnitude.h @@ -725,12 +725,12 @@ MP_UNITS_EXPORT_BEGIN */ #if MP_UNITS_COMP_CLANG -constexpr struct mag_pi : magnitude}> { +inline constexpr struct mag_pi : magnitude}> { } mag_pi; #else -constexpr struct mag_pi : magnitude> { +inline constexpr struct mag_pi : magnitude> { } mag_pi; #endif @@ -959,7 +959,7 @@ template return integer_part((detail::abs(power_of_2) < detail::abs(power_of_5)) ? power_of_2 : power_of_5); } -constexpr symbol_text base_multiplier(u8"× 10", "x 10"); +inline constexpr symbol_text base_multiplier(u8"× 10", "x 10"); template [[nodiscard]] consteval auto magnitude_text() diff --git a/src/core/include/mp-units/framework/quantity_spec.h b/src/core/include/mp-units/framework/quantity_spec.h index a58a73e1..d813b2a6 100644 --- a/src/core/include/mp-units/framework/quantity_spec.h +++ b/src/core/include/mp-units/framework/quantity_spec.h @@ -189,7 +189,7 @@ struct quantity_spec_interface : quantity_spec_interface_base { MP_UNITS_EXPORT_BEGIN -constexpr struct is_kind { +inline constexpr struct is_kind { } is_kind; /** @@ -235,13 +235,13 @@ MP_UNITS_EXPORT_END * For example: * * @code{.cpp} - * constexpr struct dim_length final : base_dimension<"L"> {} dim_length; - * constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; - * constexpr struct dim_time final : base_dimension<"T"> {} dim_time; + * inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; + * inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; + * inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; * - * constexpr struct length final : quantity_spec {} length; - * constexpr struct mass final : quantity_spec {} mass; - * constexpr struct time final : quantity_spec {} time; + * inline constexpr struct length final : quantity_spec {} length; + * inline constexpr struct mass final : quantity_spec {} mass; + * inline constexpr struct time final : quantity_spec {} time; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -280,12 +280,12 @@ struct quantity_spec : detail::quantity_spec_interface * For example: * * @code{.cpp} - * constexpr struct area final : quantity_spec(length)> {} area; - * constexpr struct volume final : quantity_spec(length)> {} volume; - * constexpr struct velocity final : quantity_spec {} velocity; - * constexpr struct speed final : quantity_spec {} speed; - * constexpr struct force final : quantity_spec {} force; - * constexpr struct power final : quantity_spec {} power; + * inline constexpr struct area final : quantity_spec(length)> {} area; + * inline constexpr struct volume final : quantity_spec(length)> {} volume; + * inline constexpr struct velocity final : quantity_spec {} velocity; + * inline constexpr struct speed final : quantity_spec {} speed; + * inline constexpr struct force final : quantity_spec {} force; + * inline constexpr struct power final : quantity_spec {} power; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -335,10 +335,10 @@ struct propagate_equation { * For example: * * @code{.cpp} - * constexpr struct width final : quantity_spec {} width; - * constexpr struct height final : quantity_spec {} height; - * constexpr struct diameter final : quantity_spec {} diameter; - * constexpr struct position_vector final : quantity_spec {} position_vector; + * inline constexpr struct width final : quantity_spec {} width; + * inline constexpr struct height final : quantity_spec {} height; + * inline constexpr struct diameter final : quantity_spec {} diameter; + * inline constexpr struct position_vector final : quantity_spec {} position_vector; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -396,10 +396,10 @@ struct quantity_spec : detail::propagate_equation, detail * For example: * * @code{.cpp} - * constexpr struct angular_measure final : quantity_spec {} angular_measure; - * constexpr struct velocity final : quantity_spec {} velocity; - * constexpr struct weight final : quantity_spec {} weight; - * constexpr struct kinetic_energy final : quantity_spec(speed)> {} kinetic_energy; + * inline constexpr struct angular_measure final : quantity_spec {} angular_measure; + * inline constexpr struct velocity final : quantity_spec {} velocity; + * inline constexpr struct weight final : quantity_spec {} weight; + * inline constexpr struct kinetic_energy final : quantity_spec(speed)> {} kinetic_energy; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. diff --git a/src/core/include/mp-units/framework/system_reference.h b/src/core/include/mp-units/framework/system_reference.h index 6bac8d79..3df21be2 100644 --- a/src/core/include/mp-units/framework/system_reference.h +++ b/src/core/include/mp-units/framework/system_reference.h @@ -45,15 +45,15 @@ namespace mp_units { * @code{.cpp} * // hypothetical natural system of units for c=1 * - * constexpr struct second final : named_unit<"s"> {} second; - * constexpr struct minute final : named_unit<"min", mag<60> * second> {} minute; - * constexpr struct gram final : named_unit<"g"> {} gram; - * constexpr auto kilogram = si::kilo; + * inline constexpr struct second final : named_unit<"s"> {} second; + * inline constexpr struct minute final : named_unit<"min", mag<60> * second> {} minute; + * inline constexpr struct gram final : named_unit<"g"> {} gram; + * inline constexpr auto kilogram = si::kilo; * - * constexpr struct time : system_reference {} time; - * constexpr struct length : system_reference {} length; - * constexpr struct speed : system_reference {} speed; - * constexpr struct force : system_reference {} force; + * inline constexpr struct time : system_reference {} time; + * inline constexpr struct length : system_reference {} length; + * inline constexpr struct speed : system_reference {} speed; + * inline constexpr struct force : system_reference {} force; * @endcode * * @tparam Q quantity for which a unit is being assigned diff --git a/src/core/include/mp-units/framework/unit.h b/src/core/include/mp-units/framework/unit.h index 1e564107..269ef4d0 100644 --- a/src/core/include/mp-units/framework/unit.h +++ b/src/core/include/mp-units/framework/unit.h @@ -256,12 +256,12 @@ constexpr bool is_specialization_of_scaled_unit> = true; * For example: * * @code{.cpp} - * constexpr struct second final : named_unit<"s", kind_of B; + * inline constexpr struct A : absolute_point_origin A; + * inline constexpr struct B : relative_point_origin B; * * using ToQP = quantity_point; * auto qp = value_cast(quantity_point{1.23 * m}); diff --git a/src/systems/include/mp-units/systems/angular/units.h b/src/systems/include/mp-units/systems/angular/units.h index 75e5eaea..a8e6e01d 100644 --- a/src/systems/include/mp-units/systems/angular/units.h +++ b/src/systems/include/mp-units/systems/angular/units.h @@ -36,26 +36,26 @@ namespace mp_units { namespace angular { // clang-format off -constexpr struct dim_angle final : base_dimension<"A"> {} dim_angle; +inline constexpr struct dim_angle final : base_dimension<"A"> {} dim_angle; QUANTITY_SPEC(angle, dim_angle); QUANTITY_SPEC(solid_angle, pow<2>(angle)); -constexpr struct radian final : named_unit<"rad", kind_of> {} radian; -constexpr struct revolution final : named_unit<"rev", mag<2> * mag_pi * radian> {} revolution; -constexpr struct degree final : named_unit * revolution> {} degree; -constexpr struct gradian final : named_unit * revolution> {} gradian; -constexpr struct steradian final : named_unit<"sr", square(radian)> {} steradian; +inline constexpr struct radian final : named_unit<"rad", kind_of> {} radian; +inline constexpr struct revolution final : named_unit<"rev", mag<2> * mag_pi * radian> {} revolution; +inline constexpr struct degree final : named_unit * revolution> {} degree; +inline constexpr struct gradian final : named_unit * revolution> {} gradian; +inline constexpr struct steradian final : named_unit<"sr", square(radian)> {} steradian; // clang-format on namespace unit_symbols { -constexpr auto rad = radian; -constexpr auto rev = revolution; -constexpr auto deg = degree; -constexpr auto grad = gradian; -constexpr auto sr = steradian; -constexpr auto rad2 = square(radian); -constexpr auto deg2 = square(degree); +inline constexpr auto rad = radian; +inline constexpr auto rev = revolution; +inline constexpr auto deg = degree; +inline constexpr auto grad = gradian; +inline constexpr auto sr = steradian; +inline constexpr auto rad2 = square(radian); +inline constexpr auto deg2 = square(degree); } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/cgs.h b/src/systems/include/mp-units/systems/cgs.h index ad65a7fa..9ae0d265 100644 --- a/src/systems/include/mp-units/systems/cgs.h +++ b/src/systems/include/mp-units/systems/cgs.h @@ -35,35 +35,35 @@ MP_UNITS_EXPORT namespace mp_units::cgs { // clang-format off -constexpr auto centimetre = si::centi; -constexpr auto gram = si::gram; -constexpr auto second = si::second; -constexpr struct gal final : named_unit<"Gal", centimetre / square(second)> {} gal; -constexpr struct dyne final : named_unit<"dyn", gram * centimetre / square(second)> {} dyne; -constexpr struct erg final : named_unit<"erg", dyne * centimetre> {} erg; -constexpr struct barye final : named_unit<"Ba", gram / (centimetre * square(second))> {} barye; -constexpr struct poise final : named_unit<"P", gram / (centimetre * second)> {} poise; -constexpr struct stokes final : named_unit<"St", square(centimetre) / second> {} stokes; -constexpr struct kayser final : named_unit<"K", one / centimetre> {} kayser; +inline constexpr auto centimetre = si::centi; +inline constexpr auto gram = si::gram; +inline constexpr auto second = si::second; +inline constexpr struct gal final : named_unit<"Gal", centimetre / square(second)> {} gal; +inline constexpr struct dyne final : named_unit<"dyn", gram * centimetre / square(second)> {} dyne; +inline constexpr struct erg final : named_unit<"erg", dyne * centimetre> {} erg; +inline constexpr struct barye final : named_unit<"Ba", gram / (centimetre * square(second))> {} barye; +inline constexpr struct poise final : named_unit<"P", gram / (centimetre * second)> {} poise; +inline constexpr struct stokes final : named_unit<"St", square(centimetre) / second> {} stokes; +inline constexpr struct kayser final : named_unit<"K", one / centimetre> {} kayser; // clang-format on namespace unit_symbols { -constexpr auto cm = centimetre; -constexpr auto g = gram; -constexpr auto s = second; -constexpr auto Gal = gal; -constexpr auto dyn = dyne; -constexpr auto Ba = barye; -constexpr auto P = poise; -constexpr auto St = stokes; -constexpr auto K = kayser; +inline constexpr auto cm = centimetre; +inline constexpr auto g = gram; +inline constexpr auto s = second; +inline constexpr auto Gal = gal; +inline constexpr auto dyn = dyne; +inline constexpr auto Ba = barye; +inline constexpr auto P = poise; +inline constexpr auto St = stokes; +inline constexpr auto K = kayser; // commonly used squared and cubic units -constexpr auto cm2 = square(centimetre); -constexpr auto cm3 = cubic(centimetre); -constexpr auto s2 = square(second); -constexpr auto s3 = cubic(second); +inline constexpr auto cm2 = square(centimetre); +inline constexpr auto cm3 = cubic(centimetre); +inline constexpr auto s2 = square(second); +inline constexpr auto s3 = cubic(second); } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/hep.h b/src/systems/include/mp-units/systems/hep.h index 8ea81cc3..c64844f8 100644 --- a/src/systems/include/mp-units/systems/hep.h +++ b/src/systems/include/mp-units/systems/hep.h @@ -49,64 +49,64 @@ using si::electronvolt; // effective cross-sectional area according to EU council directive 80/181/EEC // https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:01980L0181-20090527#page=10 // https://www.fedlex.admin.ch/eli/cc/1994/3109_3109_3109/de -constexpr struct barn final : named_unit<"b", mag_power<10, -28> * square(si::metre)> {} barn; +inline constexpr struct barn final : named_unit<"b", mag_power<10, -28> * square(si::metre)> {} barn; // mass -constexpr struct electron_mass final : named_unit<"m_e", mag_ratio<9'109'383'701'528, 1'000'000'000'000> * mag_power<10, -31> * si::kilogram> {} electron_mass; -constexpr struct proton_mass final : named_unit<"m_p", mag_ratio<1'672'621'923'695, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} proton_mass; -constexpr struct neutron_mass final : named_unit<"m_n", mag_ratio<1'674'927'498'049, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} neutron_mass; +inline constexpr struct electron_mass final : named_unit<"m_e", mag_ratio<9'109'383'701'528, 1'000'000'000'000> * mag_power<10, -31> * si::kilogram> {} electron_mass; +inline constexpr struct proton_mass final : named_unit<"m_p", mag_ratio<1'672'621'923'695, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} proton_mass; +inline constexpr struct neutron_mass final : named_unit<"m_n", mag_ratio<1'674'927'498'049, 1'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} neutron_mass; // speed -constexpr auto speed_of_light = si::si2019::speed_of_light_in_vacuum; +inline constexpr auto speed_of_light = si::si2019::speed_of_light_in_vacuum; // clang-format on namespace unit_symbols { using si::unit_symbols::eV; -constexpr auto qeV = si::quecto; -constexpr auto reV = si::ronto; -constexpr auto yeV = si::yocto; -constexpr auto zeV = si::zepto; -constexpr auto aeV = si::atto; -constexpr auto feV = si::femto; -constexpr auto peV = si::pico; -constexpr auto neV = si::nano; -constexpr auto ueV = si::micro; -constexpr auto meV = si::milli; -constexpr auto ceV = si::centi; -constexpr auto deV = si::deci; -constexpr auto daeV = si::deca; -constexpr auto heV = si::hecto; -constexpr auto keV = si::kilo; -constexpr auto MeV = si::mega; -constexpr auto GeV = si::giga; -constexpr auto TeV = si::tera; -constexpr auto PeV = si::peta; -constexpr auto EeV = si::exa; -constexpr auto ZeV = si::zetta; -constexpr auto YeV = si::yotta; -constexpr auto ReV = si::ronna; -constexpr auto QeV = si::quetta; +inline constexpr auto qeV = si::quecto; +inline constexpr auto reV = si::ronto; +inline constexpr auto yeV = si::yocto; +inline constexpr auto zeV = si::zepto; +inline constexpr auto aeV = si::atto; +inline constexpr auto feV = si::femto; +inline constexpr auto peV = si::pico; +inline constexpr auto neV = si::nano; +inline constexpr auto ueV = si::micro; +inline constexpr auto meV = si::milli; +inline constexpr auto ceV = si::centi; +inline constexpr auto deV = si::deci; +inline constexpr auto daeV = si::deca; +inline constexpr auto heV = si::hecto; +inline constexpr auto keV = si::kilo; +inline constexpr auto MeV = si::mega; +inline constexpr auto GeV = si::giga; +inline constexpr auto TeV = si::tera; +inline constexpr auto PeV = si::peta; +inline constexpr auto EeV = si::exa; +inline constexpr auto ZeV = si::zetta; +inline constexpr auto YeV = si::yotta; +inline constexpr auto ReV = si::ronna; +inline constexpr auto QeV = si::quetta; -constexpr auto qb = si::quecto; -constexpr auto rb = si::ronto; -constexpr auto yb = si::yocto; -constexpr auto zb = si::zepto; -constexpr auto ab = si::atto; -constexpr auto fb = si::femto; -constexpr auto pb = si::pico; -constexpr auto nb = si::nano; -constexpr auto ub = si::micro; -constexpr auto mb = si::milli; -constexpr auto b = barn; +inline constexpr auto qb = si::quecto; +inline constexpr auto rb = si::ronto; +inline constexpr auto yb = si::yocto; +inline constexpr auto zb = si::zepto; +inline constexpr auto ab = si::atto; +inline constexpr auto fb = si::femto; +inline constexpr auto pb = si::pico; +inline constexpr auto nb = si::nano; +inline constexpr auto ub = si::micro; +inline constexpr auto mb = si::milli; +inline constexpr auto b = barn; -constexpr auto m_e = electron_mass; -constexpr auto m_p = proton_mass; -constexpr auto m_n = neutron_mass; +inline constexpr auto m_e = electron_mass; +inline constexpr auto m_p = proton_mass; +inline constexpr auto m_n = neutron_mass; -constexpr auto c = speed_of_light; -constexpr auto c2 = square(speed_of_light); +inline constexpr auto c = speed_of_light; +inline constexpr auto c2 = square(speed_of_light); } // namespace unit_symbols } // namespace hep diff --git a/src/systems/include/mp-units/systems/iau.h b/src/systems/include/mp-units/systems/iau.h index d08c0c73..c81777aa 100644 --- a/src/systems/include/mp-units/systems/iau.h +++ b/src/systems/include/mp-units/systems/iau.h @@ -39,65 +39,65 @@ namespace mp_units::iau { // clang-format off // time -constexpr struct day final : named_unit<"D", si::day> {} day; -constexpr struct Julian_year final : named_unit<"a", mag_ratio<365'25, 100> * day> {} Julian_year; +inline constexpr struct day final : named_unit<"D", si::day> {} day; +inline constexpr struct Julian_year final : named_unit<"a", mag_ratio<365'25, 100> * day> {} Julian_year; // mass // https://en.wikipedia.org/wiki/Solar_mass // TODO What is the official mass of sun (every source in the Internet provides a different value) -constexpr struct solar_mass final : named_unit * mag_power<10, 30> * si::kilogram> {} solar_mass; -constexpr struct Jupiter_mass final : named_unit<"M_JUP", mag_ratio<1'898, 1'000> * mag_power<10, 27> * si::kilogram> {} Jupiter_mass; -constexpr struct Earth_mass final : named_unit<"M_EARTH", mag_ratio<59'742, 10'000> * mag_power<10, 24> * si::kilogram> {} Earth_mass; +inline constexpr struct solar_mass final : named_unit * mag_power<10, 30> * si::kilogram> {} solar_mass; +inline constexpr struct Jupiter_mass final : named_unit<"M_JUP", mag_ratio<1'898, 1'000> * mag_power<10, 27> * si::kilogram> {} Jupiter_mass; +inline constexpr struct Earth_mass final : named_unit<"M_EARTH", mag_ratio<59'742, 10'000> * mag_power<10, 24> * si::kilogram> {} Earth_mass; // length -constexpr auto astronomical_unit = si::astronomical_unit; +inline constexpr auto astronomical_unit = si::astronomical_unit; // https://en.wikipedia.org/wiki/Lunar_distance_(astronomy) -constexpr struct lunar_distance final : named_unit<"LD", mag<384'399> * si::kilo> {} lunar_distance; +inline constexpr struct lunar_distance final : named_unit<"LD", mag<384'399> * si::kilo> {} lunar_distance; // https://en.wikipedia.org/wiki/Light-year -constexpr struct light_year final : named_unit<"ly", mag<9'460'730'472'580'800> * si::metre> {} light_year; +inline constexpr struct light_year final : named_unit<"ly", mag<9'460'730'472'580'800> * si::metre> {} light_year; // https://en.wikipedia.org/wiki/Parsec -constexpr struct parsec final : named_unit<"pc", astronomical_unit / (mag_ratio<1, 3600> * si::degree)> {} parsec; +inline constexpr struct parsec final : named_unit<"pc", astronomical_unit / (mag_ratio<1, 3600> * si::degree)> {} parsec; // https://en.wikipedia.org/wiki/Angstrom -constexpr struct angstrom final : named_unit * si::metre> {} angstrom; +inline constexpr struct angstrom final : named_unit * si::metre> {} angstrom; // selected constants // https://en.wikipedia.org/wiki/Astronomical_constant -constexpr struct gaussian_gravitational_constant final : +inline constexpr struct gaussian_gravitational_constant final : named_unit<"k", mag_ratio<1'720'209'895, 100'000'000'000> * pow<3, 2>(astronomical_unit) / pow<1,2>(solar_mass) / day> {} gaussian_gravitational_constant; -constexpr struct speed_of_light final : +inline constexpr struct speed_of_light final : named_unit {} speed_of_light; -constexpr struct constant_of_gravitation final : +inline constexpr struct constant_of_gravitation final : named_unit<"G", mag_ratio<667'430, 100'000> * mag_power<10, -11> * cubic(si::metre) / si::kilogram / square(si::second)> {} constant_of_gravitation; -constexpr struct hubble_constant final : +inline constexpr struct hubble_constant final : named_unit * si::kilo / si::second / si::mega> {} hubble_constant; // clang-format on namespace unit_symbols { -constexpr auto D = day; -constexpr auto a = Julian_year; +inline constexpr auto D = day; +inline constexpr auto a = Julian_year; -constexpr auto M_SUN = solar_mass; -constexpr auto M_JUP = Jupiter_mass; -constexpr auto M_EARTH = Earth_mass; +inline constexpr auto M_SUN = solar_mass; +inline constexpr auto M_JUP = Jupiter_mass; +inline constexpr auto M_EARTH = Earth_mass; -constexpr auto au = astronomical_unit; -constexpr auto LD = lunar_distance; -constexpr auto ly = light_year; -constexpr auto pc = parsec; -constexpr auto A = angstrom; +inline constexpr auto au = astronomical_unit; +inline constexpr auto LD = lunar_distance; +inline constexpr auto ly = light_year; +inline constexpr auto pc = parsec; +inline constexpr auto A = angstrom; -constexpr auto k = gaussian_gravitational_constant; -constexpr auto c_0 = speed_of_light; -constexpr auto G = constant_of_gravitation; -constexpr auto H_0 = hubble_constant; +inline constexpr auto k = gaussian_gravitational_constant; +inline constexpr auto c_0 = speed_of_light; +inline constexpr auto G = constant_of_gravitation; +inline constexpr auto H_0 = hubble_constant; } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/iec80000/quantities.h b/src/systems/include/mp-units/systems/iec80000/quantities.h index f4717308..f9b23547 100644 --- a/src/systems/include/mp-units/systems/iec80000/quantities.h +++ b/src/systems/include/mp-units/systems/iec80000/quantities.h @@ -36,40 +36,40 @@ namespace mp_units::iec80000 { // dimensions of base quantities // clang-format off -constexpr struct dim_traffic_intensity final : base_dimension<"A"> {} dim_traffic_intensity; +inline constexpr struct dim_traffic_intensity final : base_dimension<"A"> {} dim_traffic_intensity; // clang-format on // quantities QUANTITY_SPEC(traffic_intensity, dim_traffic_intensity); QUANTITY_SPEC(traffic_offered_intensity, traffic_intensity); QUANTITY_SPEC(traffic_carried_intensity, traffic_intensity); -constexpr auto traffic_load = traffic_carried_intensity; +inline constexpr auto traffic_load = traffic_carried_intensity; QUANTITY_SPEC(mean_queue_length, dimensionless); QUANTITY_SPEC(loss_probability, dimensionless); QUANTITY_SPEC(waiting_probability, dimensionless); QUANTITY_SPEC(call_intensity, inverse(isq::duration)); -constexpr auto calling_rate = call_intensity; +inline constexpr auto calling_rate = call_intensity; QUANTITY_SPEC(completed_call_intensity, call_intensity); QUANTITY_SPEC(storage_capacity, dimensionless, is_kind); -constexpr auto storage_size = storage_capacity; +inline constexpr auto storage_size = storage_capacity; QUANTITY_SPEC(equivalent_binary_storage_capacity, storage_capacity); QUANTITY_SPEC(transfer_rate, storage_capacity / isq::duration); QUANTITY_SPEC(period_of_data_elements, isq::period, inverse(transfer_rate)); QUANTITY_SPEC(binary_digit_rate, transfer_rate); -constexpr auto bit_rate = binary_digit_rate; +inline constexpr auto bit_rate = binary_digit_rate; QUANTITY_SPEC(period_of_binary_digits, isq::period, inverse(binary_digit_rate)); -constexpr auto bit_period = period_of_binary_digits; +inline constexpr auto bit_period = period_of_binary_digits; QUANTITY_SPEC(equivalent_binary_digit_rate, binary_digit_rate); -constexpr auto equivalent_bit_rate = bit_rate; +inline constexpr auto equivalent_bit_rate = bit_rate; QUANTITY_SPEC(modulation_rate, inverse(isq::duration)); -constexpr auto line_digit_rate = modulation_rate; +inline constexpr auto line_digit_rate = modulation_rate; QUANTITY_SPEC(quantizing_distortion_power, isq::power); QUANTITY_SPEC(carrier_power, isq::power); QUANTITY_SPEC(signal_energy_per_binary_digit, carrier_power* period_of_binary_digits); QUANTITY_SPEC(error_probability, dimensionless); QUANTITY_SPEC(Hamming_distance, dimensionless); QUANTITY_SPEC(clock_frequency, isq::frequency); -constexpr auto clock_rate = clock_frequency; +inline constexpr auto clock_rate = clock_frequency; QUANTITY_SPEC(decision_content, dimensionless); // TODO how to model information_content and the following quantities??? diff --git a/src/systems/include/mp-units/systems/iec80000/unit_symbols.h b/src/systems/include/mp-units/systems/iec80000/unit_symbols.h index 873d731f..53d423a8 100644 --- a/src/systems/include/mp-units/systems/iec80000/unit_symbols.h +++ b/src/systems/include/mp-units/systems/iec80000/unit_symbols.h @@ -31,81 +31,81 @@ MP_UNITS_EXPORT namespace mp_units::iec80000::unit_symbols { // bit -constexpr auto kbit = si::kilo; -constexpr auto Mbit = si::mega; -constexpr auto Gbit = si::giga; -constexpr auto Tbit = si::tera; -constexpr auto Pbit = si::peta; -constexpr auto Ebit = si::exa; -constexpr auto Zbit = si::zetta; -constexpr auto Ybit = si::yotta; -constexpr auto Rbit = si::ronna; -constexpr auto Qbit = si::quetta; +inline constexpr auto kbit = si::kilo; +inline constexpr auto Mbit = si::mega; +inline constexpr auto Gbit = si::giga; +inline constexpr auto Tbit = si::tera; +inline constexpr auto Pbit = si::peta; +inline constexpr auto Ebit = si::exa; +inline constexpr auto Zbit = si::zetta; +inline constexpr auto Ybit = si::yotta; +inline constexpr auto Rbit = si::ronna; +inline constexpr auto Qbit = si::quetta; -constexpr auto Kibit = kibi; -constexpr auto Mibit = mebi; -constexpr auto Gibit = gibi; -constexpr auto Tibit = tebi; -constexpr auto Pibit = pebi; -constexpr auto Eibit = exbi; +inline constexpr auto Kibit = kibi; +inline constexpr auto Mibit = mebi; +inline constexpr auto Gibit = gibi; +inline constexpr auto Tibit = tebi; +inline constexpr auto Pibit = pebi; +inline constexpr auto Eibit = exbi; // octet -constexpr auto o = octet; +inline constexpr auto o = octet; -constexpr auto ko = si::kilo; -constexpr auto Mo = si::mega; -constexpr auto Go = si::giga; -constexpr auto To = si::tera; -constexpr auto Po = si::peta; -constexpr auto Eo = si::exa; -constexpr auto Zo = si::zetta; -constexpr auto Yo = si::yotta; -constexpr auto Ro = si::ronna; -constexpr auto Qo = si::quetta; +inline constexpr auto ko = si::kilo; +inline constexpr auto Mo = si::mega; +inline constexpr auto Go = si::giga; +inline constexpr auto To = si::tera; +inline constexpr auto Po = si::peta; +inline constexpr auto Eo = si::exa; +inline constexpr auto Zo = si::zetta; +inline constexpr auto Yo = si::yotta; +inline constexpr auto Ro = si::ronna; +inline constexpr auto Qo = si::quetta; -constexpr auto Kio = kibi; -constexpr auto Mio = mebi; -constexpr auto Gio = gibi; -constexpr auto Tio = tebi; -constexpr auto Pio = pebi; -constexpr auto Eio = exbi; +inline constexpr auto Kio = kibi; +inline constexpr auto Mio = mebi; +inline constexpr auto Gio = gibi; +inline constexpr auto Tio = tebi; +inline constexpr auto Pio = pebi; +inline constexpr auto Eio = exbi; // byte -constexpr auto B = byte; +inline constexpr auto B = byte; -constexpr auto kB = si::kilo; -constexpr auto MB = si::mega; -constexpr auto GB = si::giga; -constexpr auto TB = si::tera; -constexpr auto PB = si::peta; -constexpr auto EB = si::exa; -constexpr auto ZB = si::zetta; -constexpr auto YB = si::yotta; -constexpr auto RB = si::ronna; -constexpr auto QB = si::quetta; +inline constexpr auto kB = si::kilo; +inline constexpr auto MB = si::mega; +inline constexpr auto GB = si::giga; +inline constexpr auto TB = si::tera; +inline constexpr auto PB = si::peta; +inline constexpr auto EB = si::exa; +inline constexpr auto ZB = si::zetta; +inline constexpr auto YB = si::yotta; +inline constexpr auto RB = si::ronna; +inline constexpr auto QB = si::quetta; -constexpr auto KiB = kibi; -constexpr auto MiB = mebi; -constexpr auto GiB = gibi; -constexpr auto TiB = tebi; -constexpr auto PiB = pebi; -constexpr auto EiB = exbi; +inline constexpr auto KiB = kibi; +inline constexpr auto MiB = mebi; +inline constexpr auto GiB = gibi; +inline constexpr auto TiB = tebi; +inline constexpr auto PiB = pebi; +inline constexpr auto EiB = exbi; // baud -constexpr auto Bd = baud; -constexpr auto kBd = si::kilo; -constexpr auto MBd = si::mega; -constexpr auto GBd = si::giga; -constexpr auto TBd = si::tera; -constexpr auto PBd = si::peta; -constexpr auto EBd = si::exa; -constexpr auto ZBd = si::zetta; -constexpr auto YBd = si::yotta; -constexpr auto RBd = si::ronna; -constexpr auto QBd = si::quetta; +inline constexpr auto Bd = baud; +inline constexpr auto kBd = si::kilo; +inline constexpr auto MBd = si::mega; +inline constexpr auto GBd = si::giga; +inline constexpr auto TBd = si::tera; +inline constexpr auto PBd = si::peta; +inline constexpr auto EBd = si::exa; +inline constexpr auto ZBd = si::zetta; +inline constexpr auto YBd = si::yotta; +inline constexpr auto RBd = si::ronna; +inline constexpr auto QBd = si::quetta; // erlang // TODO do we need prefixed versions of Erlang? -constexpr auto E = erlang; +inline constexpr auto E = erlang; } // namespace mp_units::iec80000::unit_symbols diff --git a/src/systems/include/mp-units/systems/iec80000/units.h b/src/systems/include/mp-units/systems/iec80000/units.h index 41f28c5f..4d1ee098 100644 --- a/src/systems/include/mp-units/systems/iec80000/units.h +++ b/src/systems/include/mp-units/systems/iec80000/units.h @@ -34,11 +34,11 @@ MP_UNITS_EXPORT namespace mp_units::iec80000 { // clang-format off -constexpr struct erlang final : named_unit<"E", kind_of> {} erlang; -constexpr struct bit final : named_unit<"bit", one, kind_of> {} bit; -constexpr struct octet final : named_unit<"o", mag<8> * bit> {} octet; -constexpr struct byte final : named_unit<"B", mag<8> * bit> {} byte; -constexpr struct baud final : named_unit<"Bd", one / si::second, kind_of> {} baud; +inline constexpr struct erlang final : named_unit<"E", kind_of> {} erlang; +inline constexpr struct bit final : named_unit<"bit", one, kind_of> {} bit; +inline constexpr struct octet final : named_unit<"o", mag<8> * bit> {} octet; +inline constexpr struct byte final : named_unit<"B", mag<8> * bit> {} byte; +inline constexpr struct baud final : named_unit<"Bd", one / si::second, kind_of> {} baud; // clang-format on } // namespace mp_units::iec80000 diff --git a/src/systems/include/mp-units/systems/imperial.h b/src/systems/include/mp-units/systems/imperial.h index 8c80ce56..8ba61e05 100644 --- a/src/systems/include/mp-units/systems/imperial.h +++ b/src/systems/include/mp-units/systems/imperial.h @@ -39,67 +39,67 @@ using namespace international; // clang-format off // https://en.wikipedia.org/wiki/Imperial_units#Length -constexpr struct hand final : named_unit<"hh", mag_ratio<1, 3> * foot> {} hand; -constexpr struct barleycorn final : named_unit<"Bc", mag_ratio<1, 3> * inch> {} barleycorn; -constexpr struct thou final : named_unit<"th", mag_ratio<1, 12'000> * foot> {} thou; -constexpr struct chain final : named_unit<"ch", mag<22> * yard> {} chain; -constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; +inline constexpr struct hand final : named_unit<"hh", mag_ratio<1, 3> * foot> {} hand; +inline constexpr struct barleycorn final : named_unit<"Bc", mag_ratio<1, 3> * inch> {} barleycorn; +inline constexpr struct thou final : named_unit<"th", mag_ratio<1, 12'000> * foot> {} thou; +inline constexpr struct chain final : named_unit<"ch", mag<22> * yard> {} chain; +inline constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; // maritime units -constexpr struct cable final : named_unit<"cb", mag_ratio<1, 10> * nautical_mile> {} cable; -constexpr struct fathom final : named_unit<"ftm", mag_ratio<1, 1000> * nautical_mile> {} fathom; +inline constexpr struct cable final : named_unit<"cb", mag_ratio<1, 10> * nautical_mile> {} cable; +inline constexpr struct fathom final : named_unit<"ftm", mag_ratio<1, 1000> * nautical_mile> {} fathom; // survey -constexpr struct link final : named_unit<"li", mag_ratio<1, 100> * chain> {} link; -constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; +inline constexpr struct link final : named_unit<"li", mag_ratio<1, 100> * chain> {} link; +inline constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; // https://en.wikipedia.org/wiki/Imperial_units#Area -constexpr struct perch final : named_unit<"perch", square(rod)> {} perch; -constexpr struct rood final : named_unit<"rood", mag<40> * perch> {} rood; -constexpr struct acre final : named_unit<"acre", mag<4> * rood> {} acre; +inline constexpr struct perch final : named_unit<"perch", square(rod)> {} perch; +inline constexpr struct rood final : named_unit<"rood", mag<40> * perch> {} rood; +inline constexpr struct acre final : named_unit<"acre", mag<4> * rood> {} acre; // https://en.wikipedia.org/wiki/Imperial_units#Volume -constexpr struct gallon final : named_unit<"gal", mag_ratio<454'609, 100'000> * si::litre> {} gallon; -constexpr struct quart final : named_unit<"qt", mag_ratio<1, 4> * gallon> {} quart; -constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; -constexpr struct gill final : named_unit<"gi", mag_ratio<1, 4> * pint> {} gill; -constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 5> * gill> {} fluid_ounce; +inline constexpr struct gallon final : named_unit<"gal", mag_ratio<454'609, 100'000> * si::litre> {} gallon; +inline constexpr struct quart final : named_unit<"qt", mag_ratio<1, 4> * gallon> {} quart; +inline constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; +inline constexpr struct gill final : named_unit<"gi", mag_ratio<1, 4> * pint> {} gill; +inline constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 5> * gill> {} fluid_ounce; // https://en.wikipedia.org/wiki/Avoirdupois_system#Post-Elizabethan_units -constexpr auto drachm = dram; -constexpr struct stone final : named_unit<"st", mag<14> * pound> {} stone; -constexpr struct quarter final : named_unit<"qr", mag<2> * stone> {} quarter; -constexpr struct long_hundredweight final : named_unit<"cwt", mag<8> * stone> {} long_hundredweight; -constexpr struct ton final : named_unit<"t", mag<2'240> * pound> {} ton; -constexpr auto long_ton = ton; +inline constexpr auto drachm = dram; +inline constexpr struct stone final : named_unit<"st", mag<14> * pound> {} stone; +inline constexpr struct quarter final : named_unit<"qr", mag<2> * stone> {} quarter; +inline constexpr struct long_hundredweight final : named_unit<"cwt", mag<8> * stone> {} long_hundredweight; +inline constexpr struct ton final : named_unit<"t", mag<2'240> * pound> {} ton; +inline constexpr auto long_ton = ton; // clang-format on namespace unit_symbols { using namespace international::unit_symbols; -constexpr auto hh = hand; -constexpr auto Bc = barleycorn; -constexpr auto th = thou; -constexpr auto ch = chain; -constexpr auto fur = furlong; +inline constexpr auto hh = hand; +inline constexpr auto Bc = barleycorn; +inline constexpr auto th = thou; +inline constexpr auto ch = chain; +inline constexpr auto fur = furlong; -constexpr auto cb = cable; -constexpr auto ftm = fathom; +inline constexpr auto cb = cable; +inline constexpr auto ftm = fathom; -constexpr auto li = link; -constexpr auto rd = rod; +inline constexpr auto li = link; +inline constexpr auto rd = rod; -constexpr auto gal = gallon; -constexpr auto qt = quart; -constexpr auto pt = pint; -constexpr auto gi = gill; -constexpr auto fl_oz = fluid_ounce; +inline constexpr auto gal = gallon; +inline constexpr auto qt = quart; +inline constexpr auto pt = pint; +inline constexpr auto gi = gill; +inline constexpr auto fl_oz = fluid_ounce; -constexpr auto st = stone; -constexpr auto qr = quarter; -constexpr auto cwt = long_hundredweight; -constexpr auto t = ton; +inline constexpr auto st = stone; +inline constexpr auto qr = quarter; +inline constexpr auto cwt = long_hundredweight; +inline constexpr auto t = ton; } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/international.h b/src/systems/include/mp-units/systems/international.h index 206e3c7e..1d5141f6 100644 --- a/src/systems/include/mp-units/systems/international.h +++ b/src/systems/include/mp-units/systems/international.h @@ -37,72 +37,72 @@ namespace mp_units::international { // clang-format off // mass -constexpr struct pound final : named_unit<"lb", mag_ratio<45'359'237, 100'000'000> * si::kilogram> {} pound; -constexpr struct ounce final : named_unit<"oz", mag_ratio<1, 16> * pound> {} ounce; -constexpr struct dram final : named_unit<"dr", mag_ratio<1, 16> * ounce> {} dram; -constexpr struct grain final : named_unit<"gr", mag_ratio<1, 7'000> * pound> {} grain; +inline constexpr struct pound final : named_unit<"lb", mag_ratio<45'359'237, 100'000'000> * si::kilogram> {} pound; +inline constexpr struct ounce final : named_unit<"oz", mag_ratio<1, 16> * pound> {} ounce; +inline constexpr struct dram final : named_unit<"dr", mag_ratio<1, 16> * ounce> {} dram; +inline constexpr struct grain final : named_unit<"gr", mag_ratio<1, 7'000> * pound> {} grain; // length // https://en.wikipedia.org/wiki/United_States_customary_units#Length -constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; -constexpr struct foot final : named_unit<"ft", mag_ratio<1, 3> * yard> {} foot; -constexpr struct inch final : named_unit<"in", mag_ratio<1, 12> * foot> {} inch; -constexpr struct pica final : named_unit<"P", mag_ratio<1, 6> * inch> {} pica; -constexpr struct point final : named_unit<"p", mag_ratio<1, 12> * pica> {} point; -constexpr struct mil final : named_unit<"mil", mag_ratio<1, 1'000> * inch> {} mil; -constexpr struct twip final : named_unit<"twip", mag_ratio<1, 20> * point> {} twip; -constexpr struct mile final : named_unit<"mi", mag<1760> * yard> {} mile; -constexpr struct league final : named_unit<"le", mag<3> * mile> {} league; +inline constexpr struct yard final : named_unit<"yd", mag_ratio<9'144, 10'000> * si::metre> {} yard; +inline constexpr struct foot final : named_unit<"ft", mag_ratio<1, 3> * yard> {} foot; +inline constexpr struct inch final : named_unit<"in", mag_ratio<1, 12> * foot> {} inch; +inline constexpr struct pica final : named_unit<"P", mag_ratio<1, 6> * inch> {} pica; +inline constexpr struct point final : named_unit<"p", mag_ratio<1, 12> * pica> {} point; +inline constexpr struct mil final : named_unit<"mil", mag_ratio<1, 1'000> * inch> {} mil; +inline constexpr struct twip final : named_unit<"twip", mag_ratio<1, 20> * point> {} twip; +inline constexpr struct mile final : named_unit<"mi", mag<1760> * yard> {} mile; +inline constexpr struct league final : named_unit<"le", mag<3> * mile> {} league; -constexpr struct nautical_mile final : named_unit<"nmi", mag<1852> * si::metre> {} nautical_mile; +inline constexpr struct nautical_mile final : named_unit<"nmi", mag<1852> * si::metre> {} nautical_mile; // speed -constexpr struct knot final : named_unit<"kn", nautical_mile / si::hour> {} knot; +inline constexpr struct knot final : named_unit<"kn", nautical_mile / si::hour> {} knot; // force // https://en.wikipedia.org/wiki/Poundal -constexpr struct poundal final : named_unit<"pdl", pound * foot / square(si::second)> {} poundal; +inline constexpr struct poundal final : named_unit<"pdl", pound * foot / square(si::second)> {} poundal; // https://en.wikipedia.org/wiki/Pound_(force) -constexpr struct pound_force final : named_unit<"lbf", pound * si::standard_gravity> {} pound_force; +inline constexpr struct pound_force final : named_unit<"lbf", pound * si::standard_gravity> {} pound_force; // https://en.wikipedia.org/wiki/Kip_(unit), -constexpr auto kip = si::kilo; +inline constexpr auto kip = si::kilo; // pressure -constexpr struct psi final : named_unit<"psi", pound_force / square(inch)> {} psi; +inline constexpr struct psi final : named_unit<"psi", pound_force / square(inch)> {} psi; // power // https://en.wikipedia.org/wiki/Horsepower#Definitions -constexpr struct mechanical_horsepower final : named_unit<"hp(I)", mag<33'000> * foot * pound_force / si::minute> {} mechanical_horsepower; +inline constexpr struct mechanical_horsepower final : named_unit<"hp(I)", mag<33'000> * foot * pound_force / si::minute> {} mechanical_horsepower; // clang-format on namespace unit_symbols { -constexpr auto lb = pound; -constexpr auto oz = ounce; -constexpr auto dr = dram; -constexpr auto gr = grain; +inline constexpr auto lb = pound; +inline constexpr auto oz = ounce; +inline constexpr auto dr = dram; +inline constexpr auto gr = grain; -constexpr auto yd = yard; -constexpr auto ft = foot; -constexpr auto in = inch; -constexpr auto P = pica; -constexpr auto p = point; -constexpr auto mi = mile; -constexpr auto le = league; +inline constexpr auto yd = yard; +inline constexpr auto ft = foot; +inline constexpr auto in = inch; +inline constexpr auto P = pica; +inline constexpr auto p = point; +inline constexpr auto mi = mile; +inline constexpr auto le = league; -constexpr auto nmi = nautical_mile; +inline constexpr auto nmi = nautical_mile; -constexpr auto kn = knot; -constexpr auto kt = knot; -constexpr auto mph = mile / si::hour; +inline constexpr auto kn = knot; +inline constexpr auto kt = knot; +inline constexpr auto mph = mile / si::hour; -constexpr auto pdl = poundal; -constexpr auto lbf = pound_force; +inline constexpr auto pdl = poundal; +inline constexpr auto lbf = pound_force; -constexpr auto hp = mechanical_horsepower; +inline constexpr auto hp = mechanical_horsepower; } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/isq/base_quantities.h b/src/systems/include/mp-units/systems/isq/base_quantities.h index 7e9ea017..c7f4f337 100644 --- a/src/systems/include/mp-units/systems/isq/base_quantities.h +++ b/src/systems/include/mp-units/systems/isq/base_quantities.h @@ -35,20 +35,20 @@ namespace mp_units::isq { // clang-format off // dimensions of base quantities -constexpr struct dim_length final : base_dimension<"L"> {} dim_length; -constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; -constexpr struct dim_time final : base_dimension<"T"> {} dim_time; -constexpr struct dim_electric_current final : base_dimension<"I"> {} dim_electric_current; -constexpr struct dim_thermodynamic_temperature final : base_dimension {} dim_thermodynamic_temperature; -constexpr struct dim_amount_of_substance final : base_dimension<"N"> {} dim_amount_of_substance; -constexpr struct dim_luminous_intensity final : base_dimension<"J"> {} dim_luminous_intensity; +inline constexpr struct dim_length final : base_dimension<"L"> {} dim_length; +inline constexpr struct dim_mass final : base_dimension<"M"> {} dim_mass; +inline constexpr struct dim_time final : base_dimension<"T"> {} dim_time; +inline constexpr struct dim_electric_current final : base_dimension<"I"> {} dim_electric_current; +inline constexpr struct dim_thermodynamic_temperature final : base_dimension {} dim_thermodynamic_temperature; +inline constexpr struct dim_amount_of_substance final : base_dimension<"N"> {} dim_amount_of_substance; +inline constexpr struct dim_luminous_intensity final : base_dimension<"J"> {} dim_luminous_intensity; // clang-format on // base quantities QUANTITY_SPEC(length, dim_length); QUANTITY_SPEC(mass, dim_mass); QUANTITY_SPEC(time, dim_time); -constexpr auto duration = time; +inline constexpr auto duration = time; QUANTITY_SPEC(electric_current, dim_electric_current); QUANTITY_SPEC(thermodynamic_temperature, dim_thermodynamic_temperature); QUANTITY_SPEC(amount_of_substance, dim_amount_of_substance); diff --git a/src/systems/include/mp-units/systems/isq/electromagnetism.h b/src/systems/include/mp-units/systems/isq/electromagnetism.h index 84f556ba..bdb5bc8b 100644 --- a/src/systems/include/mp-units/systems/isq/electromagnetism.h +++ b/src/systems/include/mp-units/systems/isq/electromagnetism.h @@ -39,25 +39,25 @@ namespace mp_units::isq { QUANTITY_SPEC(electric_charge, electric_current* time); QUANTITY_SPEC(electric_charge_density, electric_charge / volume); -constexpr auto volume_electric_charge = electric_charge_density; +inline constexpr auto volume_electric_charge = electric_charge_density; QUANTITY_SPEC(surface_density_of_electric_charge, electric_charge / area); -constexpr auto areic_electric_charge = surface_density_of_electric_charge; +inline constexpr auto areic_electric_charge = surface_density_of_electric_charge; QUANTITY_SPEC(linear_density_of_electric_charge, electric_charge / length); -constexpr auto lineic_electric_charge = linear_density_of_electric_charge; +inline constexpr auto lineic_electric_charge = linear_density_of_electric_charge; QUANTITY_SPEC(electric_dipole_moment, electric_charge* position_vector); // vector QUANTITY_SPEC(electric_polarization, electric_dipole_moment / volume); // vector QUANTITY_SPEC(electric_current_density, electric_charge_density* velocity); // vector -constexpr auto areic_electric_current = electric_current_density; +inline constexpr auto areic_electric_current = electric_current_density; QUANTITY_SPEC(linear_electric_current_density, surface_density_of_electric_charge* velocity); // vector -constexpr auto lineic_electric_current = linear_electric_current_density; +inline constexpr auto lineic_electric_current = linear_electric_current_density; QUANTITY_SPEC(electric_field_strength, force / electric_charge); // vector QUANTITY_SPEC(electric_potential, electric_field_strength* length, quantity_character::scalar); // TODO what is a correct equation here? QUANTITY_SPEC(electric_potential_difference, electric_potential, quantity_character::scalar); QUANTITY_SPEC(voltage, electric_potential); -constexpr auto electric_tension = voltage; +inline constexpr auto electric_tension = voltage; QUANTITY_SPEC(electric_flux_density, electric_polarization); // vector -constexpr auto electric_displacement = electric_flux_density; +inline constexpr auto electric_displacement = electric_flux_density; QUANTITY_SPEC(capacitance, electric_charge / voltage); // TODO how to calculate an argument of a vector product? QUANTITY_SPEC(magnetic_flux_density, force / (electric_charge * velocity), quantity_character::vector); @@ -66,13 +66,13 @@ QUANTITY_SPEC(magnetic_vector_potential, QUANTITY_SPEC(linked_flux, magnetic_vector_potential* displacement, quantity_character::scalar); QUANTITY_SPEC(magnetic_constant, electric_potential* time / (electric_current * length)); // TODO what is a correct equation here? -constexpr auto permeability_of_vacuum = magnetic_constant; +inline constexpr auto permeability_of_vacuum = magnetic_constant; QUANTITY_SPEC(phase_speed_of_electromagnetic_waves, angular_frequency / angular_wavenumber); QUANTITY_SPEC(speed_of_light_in_vacuum, speed); -constexpr auto light_speed_in_vacuum = speed_of_light_in_vacuum; -constexpr auto luminal_speed = speed_of_light_in_vacuum; +inline constexpr auto light_speed_in_vacuum = speed_of_light_in_vacuum; +inline constexpr auto luminal_speed = speed_of_light_in_vacuum; QUANTITY_SPEC(electric_constant, inverse(magnetic_constant* pow<2>(speed_of_light_in_vacuum))); -constexpr auto permittivity_of_vacuum = electric_constant; +inline constexpr auto permittivity_of_vacuum = electric_constant; QUANTITY_SPEC(permittivity, electric_flux_density / electric_field_strength, quantity_character::scalar); QUANTITY_SPEC(relative_permittivity, dimensionless, permittivity / electric_constant); QUANTITY_SPEC(electric_susceptibility, dimensionless, @@ -84,10 +84,10 @@ QUANTITY_SPEC(total_current, electric_current); QUANTITY_SPEC(total_current_density, electric_current_density); // vector QUANTITY_SPEC(magnetic_flux, magnetic_flux_density* area, quantity_character::scalar); QUANTITY_SPEC(magnetic_moment, electric_current* area, quantity_character::vector); -constexpr auto magnetic_area_moment = magnetic_moment; +inline constexpr auto magnetic_area_moment = magnetic_moment; QUANTITY_SPEC(magnetization, magnetic_moment / volume); // vector QUANTITY_SPEC(magnetic_field_strength, magnetization); // vector -constexpr auto magnetizing_field = magnetic_field_strength; +inline constexpr auto magnetizing_field = magnetic_field_strength; QUANTITY_SPEC(permeability, magnetic_flux_density / magnetic_field_strength, quantity_character::scalar); QUANTITY_SPEC(relative_permeability, dimensionless, permeability / magnetic_constant); QUANTITY_SPEC(magnetic_susceptibility, dimensionless, magnetization / magnetic_field_strength, @@ -97,10 +97,10 @@ QUANTITY_SPEC(magnetic_dipole_moment, magnetic_constant* magnetic_moment); // v QUANTITY_SPEC(coercivity, magnetic_field_strength, quantity_character::scalar); QUANTITY_SPEC(electromagnetic_energy_density, electric_field_strength* electric_flux_density, quantity_character::scalar); -constexpr auto volumic_electromagnetic_energy = electromagnetic_energy_density; +inline constexpr auto volumic_electromagnetic_energy = electromagnetic_energy_density; QUANTITY_SPEC(Poynting_vector, electric_field_strength* magnetic_field_strength); // vector QUANTITY_SPEC(source_voltage, voltage); -constexpr auto source_tension = source_voltage; +inline constexpr auto source_tension = source_voltage; QUANTITY_SPEC(scalar_magnetic_potential, electric_current, magnetic_field_strength* length, quantity_character::scalar); // TODO what is a correct equation here? QUANTITY_SPEC(magnetic_tension, electric_current, magnetic_field_strength* position_vector, quantity_character::scalar); @@ -111,26 +111,26 @@ QUANTITY_SPEC(number_of_turns_in_a_winding, dimensionless); QUANTITY_SPEC(reluctance, magnetic_tension / magnetic_flux); QUANTITY_SPEC(permeance, inverse(reluctance)); QUANTITY_SPEC(inductance, linked_flux / electric_current); -constexpr auto self_inductance = inductance; +inline constexpr auto self_inductance = inductance; QUANTITY_SPEC(mutual_inductance, linked_flux / electric_current); QUANTITY_SPEC(coupling_factor, dimensionless, mutual_inductance / pow<1, 2>(pow<2>(self_inductance))); QUANTITY_SPEC(leakage_factor, dimensionless, pow<2>(coupling_factor)); QUANTITY_SPEC(conductivity, electric_current_density / electric_field_strength, quantity_character::scalar); QUANTITY_SPEC(resistivity, inverse(conductivity)); QUANTITY_SPEC(electromagnetism_power, power, voltage* electric_current); -constexpr auto instantaneous_power = electromagnetism_power; +inline constexpr auto instantaneous_power = electromagnetism_power; QUANTITY_SPEC(resistance, voltage / electric_current); QUANTITY_SPEC(conductance, inverse(resistance)); QUANTITY_SPEC(phase_difference, phase_angle); QUANTITY_SPEC(electric_current_phasor, electric_current); QUANTITY_SPEC(voltage_phasor, voltage); QUANTITY_SPEC(impedance, voltage_phasor / electric_current_phasor); -constexpr auto complex_impedance = impedance; +inline constexpr auto complex_impedance = impedance; QUANTITY_SPEC(resistance_to_alternating_current, impedance); QUANTITY_SPEC(reactance, impedance); QUANTITY_SPEC(modulus_of_impedance, impedance); QUANTITY_SPEC(admittance, inverse(impedance)); -constexpr auto complex_admittance = admittance; +inline constexpr auto complex_admittance = admittance; QUANTITY_SPEC(conductance_for_alternating_current, admittance); QUANTITY_SPEC(susceptance, admittance); QUANTITY_SPEC(modulus_of_admittance, admittance); diff --git a/src/systems/include/mp-units/systems/isq/light_and_radiation.h b/src/systems/include/mp-units/systems/isq/light_and_radiation.h index bb5b772d..bfca2dbf 100644 --- a/src/systems/include/mp-units/systems/isq/light_and_radiation.h +++ b/src/systems/include/mp-units/systems/isq/light_and_radiation.h @@ -45,9 +45,9 @@ QUANTITY_SPEC(radiant_energy_density, radiant_energy / volume); QUANTITY_SPEC(spectral_radiant_energy_density_in_terms_of_wavelength, radiant_energy_density / wavelength); QUANTITY_SPEC(spectral_radiant_energy_density_in_terms_of_wavenumber, radiant_energy_density / wavenumber); QUANTITY_SPEC(radiant_flux, power, radiant_energy / time); -constexpr auto radiant_power = radiant_flux; +inline constexpr auto radiant_power = radiant_flux; QUANTITY_SPEC(spectral_radiant_flux, radiant_flux / wavelength); -constexpr auto spectral_radiant_power = spectral_radiant_flux; +inline constexpr auto spectral_radiant_power = spectral_radiant_flux; QUANTITY_SPEC(radiant_intensity, radiant_flux / solid_angular_measure); QUANTITY_SPEC(spectral_radiant_intensity, radiant_intensity / wavelength); QUANTITY_SPEC(radiance, radiant_intensity / area); diff --git a/src/systems/include/mp-units/systems/isq/mechanics.h b/src/systems/include/mp-units/systems/isq/mechanics.h index 4de54232..41157143 100644 --- a/src/systems/include/mp-units/systems/isq/mechanics.h +++ b/src/systems/include/mp-units/systems/isq/mechanics.h @@ -37,24 +37,24 @@ MP_UNITS_EXPORT namespace mp_units::isq { QUANTITY_SPEC(mass_density, mass / volume); -constexpr auto density = mass_density; +inline constexpr auto density = mass_density; QUANTITY_SPEC(specific_volume, inverse(mass_density)); QUANTITY_SPEC(relative_mass_density, mass_density / mass_density); -constexpr auto relative_density = relative_mass_density; +inline constexpr auto relative_density = relative_mass_density; QUANTITY_SPEC(surface_mass_density, mass / area); -constexpr auto surface_density = surface_mass_density; +inline constexpr auto surface_density = surface_mass_density; QUANTITY_SPEC(linear_mass_density, mass / length); -constexpr auto linear_density = linear_mass_density; +inline constexpr auto linear_density = linear_mass_density; QUANTITY_SPEC(momentum, mass* velocity); // vector QUANTITY_SPEC(force, mass* acceleration); // vector // TODO what is a correct equation here? QUANTITY_SPEC(weight, force, mass* acceleration_of_free_fall); // vector // differs from ISO 80000 QUANTITY_SPEC(static_friction_force, force); // vector -constexpr auto static_friction = static_friction_force; +inline constexpr auto static_friction = static_friction_force; QUANTITY_SPEC(kinetic_friction_force, force); // vector -constexpr auto dynamic_friction_force = kinetic_friction_force; +inline constexpr auto dynamic_friction_force = kinetic_friction_force; QUANTITY_SPEC(rolling_resistance, force); // vector -constexpr auto rolling_drag = rolling_resistance; -constexpr auto rolling_friction_force = rolling_resistance; +inline constexpr auto rolling_drag = rolling_resistance; +inline constexpr auto rolling_friction_force = rolling_resistance; QUANTITY_SPEC(drag_force, force); // vector QUANTITY_SPEC(impulse, force* time); // vector QUANTITY_SPEC(angular_momentum, position_vector* momentum); // vector @@ -73,24 +73,24 @@ QUANTITY_SPEC(shear_strain, dimensionless, displacement / thickness, quantity_ch QUANTITY_SPEC(relative_volume_strain, volume / volume); QUANTITY_SPEC(Poisson_number, dimensionless, width / length); QUANTITY_SPEC(modulus_of_elasticity, normal_stress / relative_linear_strain); -constexpr auto Young_modulus = modulus_of_elasticity; +inline constexpr auto Young_modulus = modulus_of_elasticity; QUANTITY_SPEC(modulus_of_rigidity, shear_stress / shear_strain); -constexpr auto shear_modulus = modulus_of_rigidity; +inline constexpr auto shear_modulus = modulus_of_rigidity; QUANTITY_SPEC(modulus_of_compression, pressure / relative_volume_strain); -constexpr auto bulk_modulus = modulus_of_compression; +inline constexpr auto bulk_modulus = modulus_of_compression; QUANTITY_SPEC(compressibility, inverse(volume) * (volume / pressure)); QUANTITY_SPEC(second_axial_moment_of_area, pow<2>(radial_distance) * area); QUANTITY_SPEC(second_polar_moment_of_area, pow<2>(radial_distance) * area); QUANTITY_SPEC(section_modulus, second_axial_moment_of_area / radial_distance); QUANTITY_SPEC(static_friction_coefficient, dimensionless, static_friction_force / force, quantity_character::scalar); -constexpr auto static_friction_factor = static_friction_coefficient; -constexpr auto coefficient_of_static_friction = static_friction_coefficient; +inline constexpr auto static_friction_factor = static_friction_coefficient; +inline constexpr auto coefficient_of_static_friction = static_friction_coefficient; QUANTITY_SPEC(kinetic_friction_factor, dimensionless, kinetic_friction_force / force, quantity_character::scalar); -constexpr auto dynamic_friction_factor = kinetic_friction_factor; +inline constexpr auto dynamic_friction_factor = kinetic_friction_factor; QUANTITY_SPEC(rolling_resistance_factor, force / force, quantity_character::scalar); QUANTITY_SPEC(drag_coefficient, dimensionless, drag_force / (mass_density * pow<2>(speed) * area), quantity_character::scalar); -constexpr auto drag_factor = drag_coefficient; +inline constexpr auto drag_factor = drag_coefficient; QUANTITY_SPEC(dynamic_viscosity, shear_stress* length / velocity, quantity_character::scalar); QUANTITY_SPEC(kinematic_viscosity, dynamic_viscosity / mass_density); QUANTITY_SPEC(surface_tension, force / length, quantity_character::scalar); // TODO what is a correct equation here? @@ -100,7 +100,7 @@ QUANTITY_SPEC(mechanical_energy, energy); // diffe QUANTITY_SPEC(potential_energy, mechanical_energy); // differs from ISO 80000 QUANTITY_SPEC(kinetic_energy, mechanical_energy, mass* pow<2>(speed)); // differs from ISO 80000 QUANTITY_SPEC(mechanical_work, force* displacement, quantity_character::scalar); -constexpr auto work = mechanical_work; +inline constexpr auto work = mechanical_work; QUANTITY_SPEC(mechanical_efficiency, mechanical_power / mechanical_power); QUANTITY_SPEC(mass_flow, mass_density* velocity); // vector QUANTITY_SPEC(mass_flow_rate, mass_flow* area, quantity_character::scalar); diff --git a/src/systems/include/mp-units/systems/isq/si_quantities.h b/src/systems/include/mp-units/systems/isq/si_quantities.h index a8b66c27..9486c3e3 100644 --- a/src/systems/include/mp-units/systems/isq/si_quantities.h +++ b/src/systems/include/mp-units/systems/isq/si_quantities.h @@ -37,15 +37,15 @@ namespace mp_units::isq { // space and time QUANTITY_SPEC(width, length); -constexpr auto breadth = width; +inline constexpr auto breadth = width; QUANTITY_SPEC(radius, width); // differs from ISO 80000 QUANTITY_SPEC(path_length, length); -constexpr auto arc_length = path_length; +inline constexpr auto arc_length = path_length; QUANTITY_SPEC(area, pow<2>(length)); QUANTITY_SPEC(angular_measure, dimensionless, arc_length / radius, is_kind); QUANTITY_SPEC(solid_angular_measure, dimensionless, area / pow<2>(radius), is_kind); QUANTITY_SPEC(period_duration, duration); -constexpr auto period = period_duration; +inline constexpr auto period = period_duration; QUANTITY_SPEC(frequency, inverse(period_duration)); // mechanics diff --git a/src/systems/include/mp-units/systems/isq/space_and_time.h b/src/systems/include/mp-units/systems/isq/space_and_time.h index d24db136..2157a299 100644 --- a/src/systems/include/mp-units/systems/isq/space_and_time.h +++ b/src/systems/include/mp-units/systems/isq/space_and_time.h @@ -36,8 +36,8 @@ MP_UNITS_EXPORT namespace mp_units::isq { QUANTITY_SPEC(height, length); -constexpr auto depth = height; -constexpr auto altitude = height; +inline constexpr auto depth = height; +inline constexpr auto altitude = height; QUANTITY_SPEC(thickness, width); QUANTITY_SPEC(diameter, width); QUANTITY_SPEC(distance, path_length); @@ -48,7 +48,7 @@ QUANTITY_SPEC(radius_of_curvature, radius); QUANTITY_SPEC(curvature, inverse(radius_of_curvature)); QUANTITY_SPEC(volume, pow<3>(length)); QUANTITY_SPEC(rotational_displacement, angular_measure, path_length / radius); -constexpr auto angular_displacement = rotational_displacement; +inline constexpr auto angular_displacement = rotational_displacement; QUANTITY_SPEC(phase_angle, angular_measure); QUANTITY_SPEC(speed, length / time); // differs from ISO 80000 QUANTITY_SPEC(velocity, speed, position_vector / duration); // vector // differs from ISO 80000 @@ -62,18 +62,18 @@ QUANTITY_SPEC(rotational_frequency, rotation / duration); QUANTITY_SPEC(angular_frequency, phase_angle / duration); QUANTITY_SPEC(wavelength, length); QUANTITY_SPEC(repetency, inverse(wavelength)); -constexpr auto wavenumber = repetency; +inline constexpr auto wavenumber = repetency; QUANTITY_SPEC(wave_vector, repetency, quantity_character::vector); QUANTITY_SPEC(angular_repetency, inverse(wavelength)); -constexpr auto angular_wavenumber = angular_repetency; +inline constexpr auto angular_wavenumber = angular_repetency; QUANTITY_SPEC(phase_velocity, angular_frequency / angular_repetency); -constexpr auto phase_speed = phase_velocity; +inline constexpr auto phase_speed = phase_velocity; QUANTITY_SPEC(group_velocity, angular_frequency / angular_repetency); -constexpr auto group_speed = group_velocity; +inline constexpr auto group_speed = group_velocity; QUANTITY_SPEC(damping_coefficient, inverse(time_constant)); QUANTITY_SPEC(logarithmic_decrement, dimensionless, damping_coefficient* period_duration); QUANTITY_SPEC(attenuation, inverse(distance)); -constexpr auto extinction = attenuation; +inline constexpr auto extinction = attenuation; QUANTITY_SPEC(phase_coefficient, phase_angle / path_length); QUANTITY_SPEC(propagation_coefficient, inverse(length)); // γ = α + iβ where α denotes attenuation // and β the phase coefficient of a plane wave diff --git a/src/systems/include/mp-units/systems/isq/thermodynamics.h b/src/systems/include/mp-units/systems/isq/thermodynamics.h index f5b72d90..aed8edf9 100644 --- a/src/systems/include/mp-units/systems/isq/thermodynamics.h +++ b/src/systems/include/mp-units/systems/isq/thermodynamics.h @@ -46,7 +46,7 @@ QUANTITY_SPEC(isothermal_compressibility, inverse(volume) * (volume / pressure)) QUANTITY_SPEC(isentropic_compressibility, inverse(volume) * (volume / pressure)); // TODO how to handle "negative" part // energy definition moved to mechanics QUANTITY_SPEC(heat, energy); -constexpr auto amount_of_heat = heat; +inline constexpr auto amount_of_heat = heat; QUANTITY_SPEC(latent_heat, heat); // TODO what is a correct equation here? QUANTITY_SPEC(heat_flow_rate, heat / time); QUANTITY_SPEC(density_of_heat_flow_rate, heat_flow_rate / area); @@ -54,7 +54,7 @@ QUANTITY_SPEC(thermal_conductivity, density_of_heat_flow_rate*(length / thermody QUANTITY_SPEC(coefficient_of_heat_transfer, density_of_heat_flow_rate / thermodynamic_temperature); QUANTITY_SPEC(surface_coefficient_of_heat_transfer, density_of_heat_flow_rate / thermodynamic_temperature); QUANTITY_SPEC(thermal_insulance, inverse(coefficient_of_heat_transfer)); -constexpr auto coefficient_of_thermal_insulance = thermal_insulance; +inline constexpr auto coefficient_of_thermal_insulance = thermal_insulance; QUANTITY_SPEC(thermal_resistance, thermodynamic_temperature / heat_flow_rate); QUANTITY_SPEC(thermal_conductance, inverse(thermal_resistance)); QUANTITY_SPEC(heat_capacity, heat / thermodynamic_temperature); @@ -67,24 +67,24 @@ QUANTITY_SPEC(ratio_of_specific_heat_capacities, dimensionless, specific_heat_capacity_at_constant_pressure / specific_heat_capacity_at_constant_volume); QUANTITY_SPEC(isentropic_exponent, volume / pressure * (pressure / volume)); // TODO how to handle "negative" part -constexpr auto isentropic_expansion_factor = isentropic_exponent; +inline constexpr auto isentropic_expansion_factor = isentropic_exponent; QUANTITY_SPEC(entropy, kinetic_energy / thermodynamic_temperature); QUANTITY_SPEC(specific_entropy, entropy / mass); QUANTITY_SPEC(enthalpy, energy); // differs from ISO 80000 QUANTITY_SPEC(internal_energy, enthalpy); // differs from ISO 80000 -constexpr auto thermodynamic_energy = internal_energy; +inline constexpr auto thermodynamic_energy = internal_energy; QUANTITY_SPEC(Helmholtz_energy, internal_energy); -constexpr auto Helmholtz_function = Helmholtz_energy; +inline constexpr auto Helmholtz_function = Helmholtz_energy; QUANTITY_SPEC(Gibbs_energy, enthalpy); -constexpr auto Gibbs_function = Gibbs_energy; +inline constexpr auto Gibbs_function = Gibbs_energy; QUANTITY_SPEC(specific_energy, energy / mass); QUANTITY_SPEC(specific_internal_energy, internal_energy / mass); -constexpr auto specific_thermodynamic_energy = specific_internal_energy; +inline constexpr auto specific_thermodynamic_energy = specific_internal_energy; QUANTITY_SPEC(specific_enthalpy, enthalpy / mass); QUANTITY_SPEC(specific_Helmholtz_energy, Helmholtz_energy / mass); -constexpr auto specific_Helmholtz_function = specific_Helmholtz_energy; +inline constexpr auto specific_Helmholtz_function = specific_Helmholtz_energy; QUANTITY_SPEC(specific_Gibbs_energy, Gibbs_energy / mass); -constexpr auto specific_Gibbs_function = specific_Gibbs_energy; +inline constexpr auto specific_Gibbs_function = specific_Gibbs_energy; QUANTITY_SPEC(Massieu_function, Helmholtz_energy / thermodynamic_temperature); // TODO how to handle "negative" part QUANTITY_SPEC(Planck_function, Gibbs_energy / thermodynamic_temperature); // TODO how to handle "negative" part QUANTITY_SPEC(Joule_Thomson_coefficient, thermodynamic_temperature / pressure); diff --git a/src/systems/include/mp-units/systems/isq_angle.h b/src/systems/include/mp-units/systems/isq_angle.h index 69584b94..bf306d93 100644 --- a/src/systems/include/mp-units/systems/isq_angle.h +++ b/src/systems/include/mp-units/systems/isq_angle.h @@ -43,7 +43,7 @@ using namespace isq; QUANTITY_SPEC(cotes_angle_constant, angular::angle); // 1 rad QUANTITY_SPEC(angular_measure, angular::angle, cotes_angle_constant* arc_length / radius); QUANTITY_SPEC(rotational_displacement, angular::angle, cotes_angle_constant* path_length / radius); -constexpr auto angular_displacement = rotational_displacement; +inline constexpr auto angular_displacement = rotational_displacement; QUANTITY_SPEC(phase_angle, angular_measure); QUANTITY_SPEC(solid_angular_measure, pow<2>(cotes_angle_constant) * area / pow<2>(radius)); QUANTITY_SPEC(angular_velocity, angular_displacement / duration, quantity_character::vector); @@ -51,7 +51,7 @@ QUANTITY_SPEC(angular_acceleration, angular_velocity / duration); QUANTITY_SPEC(rotation, rotational_displacement); QUANTITY_SPEC(angular_frequency, phase_angle / duration); QUANTITY_SPEC(angular_repetency, cotes_angle_constant / wavelength); -constexpr auto angular_wavenumber = angular_repetency; +inline constexpr auto angular_wavenumber = angular_repetency; QUANTITY_SPEC(phase_coefficient, phase_angle / path_length); QUANTITY_SPEC(propagation_coefficient, cotes_angle_constant / length); QUANTITY_SPEC(angular_momentum, position_vector* momentum / cotes_angle_constant); // vector @@ -62,6 +62,6 @@ QUANTITY_SPEC(angular_impulse, moment_of_force* time); // vector QUANTITY_SPEC(loss_angle, angular_measure); // constants -constexpr auto cotes_angle = cotes_angle_constant[angular::radian]; +inline constexpr auto cotes_angle = cotes_angle_constant[angular::radian]; } // namespace mp_units::isq_angle diff --git a/src/systems/include/mp-units/systems/natural.h b/src/systems/include/mp-units/systems/natural.h index 23faf2db..b5a65b63 100644 --- a/src/systems/include/mp-units/systems/natural.h +++ b/src/systems/include/mp-units/systems/natural.h @@ -38,28 +38,28 @@ namespace mp_units::natural { // clang-format off // units -constexpr struct electronvolt final : named_unit<"eV"> {} electronvolt; -constexpr auto gigaelectronvolt = si::giga; +inline constexpr struct electronvolt final : named_unit<"eV"> {} electronvolt; +inline constexpr auto gigaelectronvolt = si::giga; // system references -constexpr struct time : system_reference {} time; -constexpr struct length : system_reference {} length; -constexpr struct mass : system_reference {} mass; -constexpr struct velocity : system_reference {} velocity; -constexpr struct speed : system_reference {} speed; -constexpr struct acceleration : system_reference {} acceleration; -constexpr struct momentum : system_reference {} momentum; -constexpr struct force : system_reference {} force; -constexpr struct energy : system_reference {} energy; +inline constexpr struct time : system_reference {} time; +inline constexpr struct length : system_reference {} length; +inline constexpr struct mass : system_reference {} mass; +inline constexpr struct velocity : system_reference {} velocity; +inline constexpr struct speed : system_reference {} speed; +inline constexpr struct acceleration : system_reference {} acceleration; +inline constexpr struct momentum : system_reference {} momentum; +inline constexpr struct force : system_reference {} force; +inline constexpr struct energy : system_reference {} energy; // clang-format on // constants -constexpr auto speed_of_light = speed[one]; +inline constexpr auto speed_of_light = speed[one]; namespace unit_symbols { -constexpr auto GeV = gigaelectronvolt; -constexpr auto GeV2 = square(gigaelectronvolt); +inline constexpr auto GeV = gigaelectronvolt; +inline constexpr auto GeV2 = square(gigaelectronvolt); } // namespace unit_symbols diff --git a/src/systems/include/mp-units/systems/si/constants.h b/src/systems/include/mp-units/systems/si/constants.h index 0e47105a..a43c871c 100644 --- a/src/systems/include/mp-units/systems/si/constants.h +++ b/src/systems/include/mp-units/systems/si/constants.h @@ -35,28 +35,28 @@ namespace mp_units::si { namespace si2019 { // clang-format off -constexpr struct hyperfine_structure_transition_frequency_of_cs final : +inline constexpr struct hyperfine_structure_transition_frequency_of_cs final : named_unit * hertz> {} hyperfine_structure_transition_frequency_of_cs; -constexpr struct speed_of_light_in_vacuum final : +inline constexpr struct speed_of_light_in_vacuum final : named_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum; -constexpr struct planck_constant final : +inline constexpr struct planck_constant final : named_unit<"h", mag_ratio<662'607'015, 100'000'000> * mag_power<10, -34> * joule * second> {} planck_constant; -constexpr struct elementary_charge final : +inline constexpr struct elementary_charge final : named_unit<"e", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * coulomb> {} elementary_charge; -constexpr struct boltzmann_constant final : +inline constexpr struct boltzmann_constant final : named_unit<"k", mag_ratio<1'380'649, 1'000'000> * mag_power<10, -23> * joule / kelvin> {} boltzmann_constant; -constexpr struct avogadro_constant final : +inline constexpr struct avogadro_constant final : named_unit<"N_A", mag_ratio<602'214'076, 100'000'000> * mag_power<10, 23> / mole> {} avogadro_constant; -constexpr struct luminous_efficacy final : +inline constexpr struct luminous_efficacy final : named_unit<"K_cd", mag<683> * lumen / watt> {} luminous_efficacy; // clang-format on } // namespace si2019 // clang-format off -constexpr struct standard_gravity final : +inline constexpr struct standard_gravity final : named_unit * metre / square(second)> {} standard_gravity; -constexpr struct magnetic_constant final : +inline constexpr struct magnetic_constant final : named_unit * mag_pi * mag_power<10, -7> * henry / metre> {} magnetic_constant; // clang-format on diff --git a/src/systems/include/mp-units/systems/si/unit_symbols.h b/src/systems/include/mp-units/systems/si/unit_symbols.h index ce5e68d8..466c956c 100644 --- a/src/systems/include/mp-units/systems/si/unit_symbols.h +++ b/src/systems/include/mp-units/systems/si/unit_symbols.h @@ -31,774 +31,774 @@ namespace mp_units { namespace si::unit_symbols { -constexpr auto qm = quecto; -constexpr auto rm = ronto; -constexpr auto ym = yocto; -constexpr auto zm = zepto; -constexpr auto am = atto; -constexpr auto fm = femto; -constexpr auto pm = pico; -constexpr auto nm = nano; -constexpr auto um = micro; -constexpr auto mm = milli; -constexpr auto cm = centi; -constexpr auto dm = deci; -constexpr auto m = metre; -constexpr auto dam = deca; -constexpr auto hm = hecto; -constexpr auto km = kilo; -constexpr auto Mm = mega; -constexpr auto Gm = giga; -constexpr auto Tm = tera; -constexpr auto Pm = peta; -constexpr auto Em = exa; -constexpr auto Zm = zetta; -constexpr auto Ym = yotta; -constexpr auto Rm = ronna; -constexpr auto Qm = quetta; +inline constexpr auto qm = quecto; +inline constexpr auto rm = ronto; +inline constexpr auto ym = yocto; +inline constexpr auto zm = zepto; +inline constexpr auto am = atto; +inline constexpr auto fm = femto; +inline constexpr auto pm = pico; +inline constexpr auto nm = nano; +inline constexpr auto um = micro; +inline constexpr auto mm = milli; +inline constexpr auto cm = centi; +inline constexpr auto dm = deci; +inline constexpr auto m = metre; +inline constexpr auto dam = deca; +inline constexpr auto hm = hecto; +inline constexpr auto km = kilo; +inline constexpr auto Mm = mega; +inline constexpr auto Gm = giga; +inline constexpr auto Tm = tera; +inline constexpr auto Pm = peta; +inline constexpr auto Em = exa; +inline constexpr auto Zm = zetta; +inline constexpr auto Ym = yotta; +inline constexpr auto Rm = ronna; +inline constexpr auto Qm = quetta; -constexpr auto qs = quecto; -constexpr auto rs = ronto; -constexpr auto ys = yocto; -constexpr auto zs = zepto; -constexpr auto as = atto; -constexpr auto fs = femto; -constexpr auto ps = pico; -constexpr auto ns = nano; -constexpr auto us = micro; -constexpr auto ms = milli; -constexpr auto cs = centi; -constexpr auto ds = deci; -constexpr auto s = second; +inline constexpr auto qs = quecto; +inline constexpr auto rs = ronto; +inline constexpr auto ys = yocto; +inline constexpr auto zs = zepto; +inline constexpr auto as = atto; +inline constexpr auto fs = femto; +inline constexpr auto ps = pico; +inline constexpr auto ns = nano; +inline constexpr auto us = micro; +inline constexpr auto ms = milli; +inline constexpr auto cs = centi; +inline constexpr auto ds = deci; +inline constexpr auto s = second; // TODO Should the below multiples of second be provided? -constexpr auto das = deca; -constexpr auto hs = hecto; -constexpr auto ks = kilo; -constexpr auto Ms = mega; -constexpr auto Gs = giga; -constexpr auto Ts = tera; -constexpr auto Ps = peta; -constexpr auto Es = exa; -constexpr auto Zs = zetta; -constexpr auto Ys = yotta; -constexpr auto Rs = ronna; -constexpr auto Qs = quetta; +inline constexpr auto das = deca; +inline constexpr auto hs = hecto; +inline constexpr auto ks = kilo; +inline constexpr auto Ms = mega; +inline constexpr auto Gs = giga; +inline constexpr auto Ts = tera; +inline constexpr auto Ps = peta; +inline constexpr auto Es = exa; +inline constexpr auto Zs = zetta; +inline constexpr auto Ys = yotta; +inline constexpr auto Rs = ronna; +inline constexpr auto Qs = quetta; -constexpr auto qg = quecto; -constexpr auto rg = ronto; -constexpr auto yg = yocto; -constexpr auto zg = zepto; -constexpr auto ag = atto; -constexpr auto fg = femto; -constexpr auto pg = pico; -constexpr auto ng = nano; -constexpr auto ug = micro; -constexpr auto mg = milli; -constexpr auto cg = centi; -constexpr auto dg = deci; -constexpr auto g = gram; -constexpr auto dag = deca; -constexpr auto hg = hecto; -constexpr auto kg = kilogram; -constexpr auto Mg = mega; -constexpr auto Gg = giga; -constexpr auto Tg = tera; -constexpr auto Pg = peta; -constexpr auto Eg = exa; -constexpr auto Zg = zetta; -constexpr auto Yg = yotta; -constexpr auto Rg = ronna; -constexpr auto Qg = quetta; +inline constexpr auto qg = quecto; +inline constexpr auto rg = ronto; +inline constexpr auto yg = yocto; +inline constexpr auto zg = zepto; +inline constexpr auto ag = atto; +inline constexpr auto fg = femto; +inline constexpr auto pg = pico; +inline constexpr auto ng = nano; +inline constexpr auto ug = micro; +inline constexpr auto mg = milli; +inline constexpr auto cg = centi; +inline constexpr auto dg = deci; +inline constexpr auto g = gram; +inline constexpr auto dag = deca; +inline constexpr auto hg = hecto; +inline constexpr auto kg = kilogram; +inline constexpr auto Mg = mega; +inline constexpr auto Gg = giga; +inline constexpr auto Tg = tera; +inline constexpr auto Pg = peta; +inline constexpr auto Eg = exa; +inline constexpr auto Zg = zetta; +inline constexpr auto Yg = yotta; +inline constexpr auto Rg = ronna; +inline constexpr auto Qg = quetta; -constexpr auto qA = quecto; -constexpr auto rA = ronto; -constexpr auto yA = yocto; -constexpr auto zA = zepto; -constexpr auto aA = atto; -constexpr auto fA = femto; -constexpr auto pA = pico; -constexpr auto nA = nano; -constexpr auto uA = micro; -constexpr auto mA = milli; -constexpr auto cA = centi; -constexpr auto dA = deci; -constexpr auto A = ampere; -constexpr auto daA = deca; -constexpr auto hA = hecto; -constexpr auto kA = kilo; -constexpr auto MA = mega; -constexpr auto GA = giga; -constexpr auto TA = tera; -constexpr auto PA = peta; -constexpr auto EA = exa; -constexpr auto ZA = zetta; -constexpr auto YA = yotta; -constexpr auto RA = ronna; -constexpr auto QA = quetta; +inline constexpr auto qA = quecto; +inline constexpr auto rA = ronto; +inline constexpr auto yA = yocto; +inline constexpr auto zA = zepto; +inline constexpr auto aA = atto; +inline constexpr auto fA = femto; +inline constexpr auto pA = pico; +inline constexpr auto nA = nano; +inline constexpr auto uA = micro; +inline constexpr auto mA = milli; +inline constexpr auto cA = centi; +inline constexpr auto dA = deci; +inline constexpr auto A = ampere; +inline constexpr auto daA = deca; +inline constexpr auto hA = hecto; +inline constexpr auto kA = kilo; +inline constexpr auto MA = mega; +inline constexpr auto GA = giga; +inline constexpr auto TA = tera; +inline constexpr auto PA = peta; +inline constexpr auto EA = exa; +inline constexpr auto ZA = zetta; +inline constexpr auto YA = yotta; +inline constexpr auto RA = ronna; +inline constexpr auto QA = quetta; -constexpr auto qK = quecto; -constexpr auto rK = ronto; -constexpr auto yK = yocto; -constexpr auto zK = zepto; -constexpr auto aK = atto; -constexpr auto fK = femto; -constexpr auto pK = pico; -constexpr auto nK = nano; -constexpr auto uK = micro; -constexpr auto mK = milli; -constexpr auto cK = centi; -constexpr auto dK = deci; -constexpr auto K = kelvin; -constexpr auto daK = deca; -constexpr auto hK = hecto; -constexpr auto kK = kilo; -constexpr auto MK = mega; -constexpr auto GK = giga; -constexpr auto TK = tera; -constexpr auto PK = peta; -constexpr auto EK = exa; -constexpr auto ZK = zetta; -constexpr auto YK = yotta; -constexpr auto RK = ronna; -constexpr auto QK = quetta; +inline constexpr auto qK = quecto; +inline constexpr auto rK = ronto; +inline constexpr auto yK = yocto; +inline constexpr auto zK = zepto; +inline constexpr auto aK = atto; +inline constexpr auto fK = femto; +inline constexpr auto pK = pico; +inline constexpr auto nK = nano; +inline constexpr auto uK = micro; +inline constexpr auto mK = milli; +inline constexpr auto cK = centi; +inline constexpr auto dK = deci; +inline constexpr auto K = kelvin; +inline constexpr auto daK = deca; +inline constexpr auto hK = hecto; +inline constexpr auto kK = kilo; +inline constexpr auto MK = mega; +inline constexpr auto GK = giga; +inline constexpr auto TK = tera; +inline constexpr auto PK = peta; +inline constexpr auto EK = exa; +inline constexpr auto ZK = zetta; +inline constexpr auto YK = yotta; +inline constexpr auto RK = ronna; +inline constexpr auto QK = quetta; -constexpr auto qmol = quecto; -constexpr auto rmol = ronto; -constexpr auto ymol = yocto; -constexpr auto zmol = zepto; -constexpr auto amol = atto; -constexpr auto fmol = femto; -constexpr auto pmol = pico; -constexpr auto nmol = nano; -constexpr auto umol = micro; -constexpr auto mmol = milli; -constexpr auto cmol = centi; -constexpr auto dmol = deci; -constexpr auto mol = mole; -constexpr auto damol = deca; -constexpr auto hmol = hecto; -constexpr auto kmol = kilo; -constexpr auto Mmol = mega; -constexpr auto Gmol = giga; -constexpr auto Tmol = tera; -constexpr auto Pmol = peta; -constexpr auto Emol = exa; -constexpr auto Zmol = zetta; -constexpr auto Ymol = yotta; -constexpr auto Rmol = ronna; -constexpr auto Qmol = quetta; +inline constexpr auto qmol = quecto; +inline constexpr auto rmol = ronto; +inline constexpr auto ymol = yocto; +inline constexpr auto zmol = zepto; +inline constexpr auto amol = atto; +inline constexpr auto fmol = femto; +inline constexpr auto pmol = pico; +inline constexpr auto nmol = nano; +inline constexpr auto umol = micro; +inline constexpr auto mmol = milli; +inline constexpr auto cmol = centi; +inline constexpr auto dmol = deci; +inline constexpr auto mol = mole; +inline constexpr auto damol = deca; +inline constexpr auto hmol = hecto; +inline constexpr auto kmol = kilo; +inline constexpr auto Mmol = mega; +inline constexpr auto Gmol = giga; +inline constexpr auto Tmol = tera; +inline constexpr auto Pmol = peta; +inline constexpr auto Emol = exa; +inline constexpr auto Zmol = zetta; +inline constexpr auto Ymol = yotta; +inline constexpr auto Rmol = ronna; +inline constexpr auto Qmol = quetta; -constexpr auto qcd = quecto; -constexpr auto rcd = ronto; -constexpr auto ycd = yocto; -constexpr auto zcd = zepto; -constexpr auto acd = atto; -constexpr auto fcd = femto; -constexpr auto pcd = pico; -constexpr auto ncd = nano; -constexpr auto ucd = micro; -constexpr auto mcd = milli; -constexpr auto ccd = centi; -constexpr auto dcd = deci; -constexpr auto cd = candela; -constexpr auto dacd = deca; -constexpr auto hcd = hecto; -constexpr auto kcd = kilo; -constexpr auto Mcd = mega; -constexpr auto Gcd = giga; -constexpr auto Tcd = tera; -constexpr auto Pcd = peta; -constexpr auto Ecd = exa; -constexpr auto Zcd = zetta; -constexpr auto Ycd = yotta; -constexpr auto Rcd = ronna; -constexpr auto Qcd = quetta; +inline constexpr auto qcd = quecto; +inline constexpr auto rcd = ronto; +inline constexpr auto ycd = yocto; +inline constexpr auto zcd = zepto; +inline constexpr auto acd = atto; +inline constexpr auto fcd = femto; +inline constexpr auto pcd = pico; +inline constexpr auto ncd = nano; +inline constexpr auto ucd = micro; +inline constexpr auto mcd = milli; +inline constexpr auto ccd = centi; +inline constexpr auto dcd = deci; +inline constexpr auto cd = candela; +inline constexpr auto dacd = deca; +inline constexpr auto hcd = hecto; +inline constexpr auto kcd = kilo; +inline constexpr auto Mcd = mega; +inline constexpr auto Gcd = giga; +inline constexpr auto Tcd = tera; +inline constexpr auto Pcd = peta; +inline constexpr auto Ecd = exa; +inline constexpr auto Zcd = zetta; +inline constexpr auto Ycd = yotta; +inline constexpr auto Rcd = ronna; +inline constexpr auto Qcd = quetta; -constexpr auto qrad = quecto; -constexpr auto rrad = ronto; -constexpr auto yrad = yocto; -constexpr auto zrad = zepto; -constexpr auto arad = atto; -constexpr auto frad = femto; -constexpr auto prad = pico; -constexpr auto nrad = nano; -constexpr auto urad = micro; -constexpr auto mrad = milli; -constexpr auto crad = centi; -constexpr auto drad = deci; -constexpr auto rad = radian; -constexpr auto darad = deca; -constexpr auto hrad = hecto; -constexpr auto krad = kilo; -constexpr auto Mrad = mega; -constexpr auto Grad = giga; -constexpr auto Trad = tera; -constexpr auto Prad = peta; -constexpr auto Erad = exa; -constexpr auto Zrad = zetta; -constexpr auto Yrad = yotta; -constexpr auto Rrad = ronna; -constexpr auto Qrad = quetta; +inline constexpr auto qrad = quecto; +inline constexpr auto rrad = ronto; +inline constexpr auto yrad = yocto; +inline constexpr auto zrad = zepto; +inline constexpr auto arad = atto; +inline constexpr auto frad = femto; +inline constexpr auto prad = pico; +inline constexpr auto nrad = nano; +inline constexpr auto urad = micro; +inline constexpr auto mrad = milli; +inline constexpr auto crad = centi; +inline constexpr auto drad = deci; +inline constexpr auto rad = radian; +inline constexpr auto darad = deca; +inline constexpr auto hrad = hecto; +inline constexpr auto krad = kilo; +inline constexpr auto Mrad = mega; +inline constexpr auto Grad = giga; +inline constexpr auto Trad = tera; +inline constexpr auto Prad = peta; +inline constexpr auto Erad = exa; +inline constexpr auto Zrad = zetta; +inline constexpr auto Yrad = yotta; +inline constexpr auto Rrad = ronna; +inline constexpr auto Qrad = quetta; -constexpr auto qsr = quecto; -constexpr auto rsr = ronto; -constexpr auto ysr = yocto; -constexpr auto zsr = zepto; -constexpr auto asr = atto; -constexpr auto fsr = femto; -constexpr auto psr = pico; -constexpr auto nsr = nano; -constexpr auto usr = micro; -constexpr auto msr = milli; -constexpr auto csr = centi; -constexpr auto dsr = deci; -constexpr auto sr = steradian; -constexpr auto dasr = deca; -constexpr auto hsr = hecto; -constexpr auto ksr = kilo; -constexpr auto Msr = mega; -constexpr auto Gsr = giga; -constexpr auto Tsr = tera; -constexpr auto Psr = peta; -constexpr auto Esr = exa; -constexpr auto Zsr = zetta; -constexpr auto Ysr = yotta; -constexpr auto Rsr = ronna; -constexpr auto Qsr = quetta; +inline constexpr auto qsr = quecto; +inline constexpr auto rsr = ronto; +inline constexpr auto ysr = yocto; +inline constexpr auto zsr = zepto; +inline constexpr auto asr = atto; +inline constexpr auto fsr = femto; +inline constexpr auto psr = pico; +inline constexpr auto nsr = nano; +inline constexpr auto usr = micro; +inline constexpr auto msr = milli; +inline constexpr auto csr = centi; +inline constexpr auto dsr = deci; +inline constexpr auto sr = steradian; +inline constexpr auto dasr = deca; +inline constexpr auto hsr = hecto; +inline constexpr auto ksr = kilo; +inline constexpr auto Msr = mega; +inline constexpr auto Gsr = giga; +inline constexpr auto Tsr = tera; +inline constexpr auto Psr = peta; +inline constexpr auto Esr = exa; +inline constexpr auto Zsr = zetta; +inline constexpr auto Ysr = yotta; +inline constexpr auto Rsr = ronna; +inline constexpr auto Qsr = quetta; -constexpr auto qHz = quecto; -constexpr auto rHz = ronto; -constexpr auto yHz = yocto; -constexpr auto zHz = zepto; -constexpr auto aHz = atto; -constexpr auto fHz = femto; -constexpr auto pHz = pico; -constexpr auto nHz = nano; -constexpr auto uHz = micro; -constexpr auto mHz = milli; -constexpr auto cHz = centi; -constexpr auto dHz = deci; -constexpr auto Hz = hertz; -constexpr auto daHz = deca; -constexpr auto hHz = hecto; -constexpr auto kHz = kilo; -constexpr auto MHz = mega; -constexpr auto GHz = giga; -constexpr auto THz = tera; -constexpr auto PHz = peta; -constexpr auto EHz = exa; -constexpr auto ZHz = zetta; -constexpr auto YHz = yotta; -constexpr auto RHz = ronna; -constexpr auto QHz = quetta; +inline constexpr auto qHz = quecto; +inline constexpr auto rHz = ronto; +inline constexpr auto yHz = yocto; +inline constexpr auto zHz = zepto; +inline constexpr auto aHz = atto; +inline constexpr auto fHz = femto; +inline constexpr auto pHz = pico; +inline constexpr auto nHz = nano; +inline constexpr auto uHz = micro; +inline constexpr auto mHz = milli; +inline constexpr auto cHz = centi; +inline constexpr auto dHz = deci; +inline constexpr auto Hz = hertz; +inline constexpr auto daHz = deca; +inline constexpr auto hHz = hecto; +inline constexpr auto kHz = kilo; +inline constexpr auto MHz = mega; +inline constexpr auto GHz = giga; +inline constexpr auto THz = tera; +inline constexpr auto PHz = peta; +inline constexpr auto EHz = exa; +inline constexpr auto ZHz = zetta; +inline constexpr auto YHz = yotta; +inline constexpr auto RHz = ronna; +inline constexpr auto QHz = quetta; -constexpr auto qN = quecto; -constexpr auto rN = ronto; -constexpr auto yN = yocto; -constexpr auto zN = zepto; -constexpr auto aN = atto; -constexpr auto fN = femto; -constexpr auto pN = pico; -constexpr auto nN = nano; -constexpr auto uN = micro; -constexpr auto mN = milli; -constexpr auto cN = centi; -constexpr auto dN = deci; -constexpr auto N = newton; -constexpr auto daN = deca; -constexpr auto hN = hecto; -constexpr auto kN = kilo; -constexpr auto MN = mega; -constexpr auto GN = giga; -constexpr auto TN = tera; -constexpr auto PN = peta; -constexpr auto EN = exa; -constexpr auto ZN = zetta; -constexpr auto YN = yotta; -constexpr auto RN = ronna; -constexpr auto QN = quetta; +inline constexpr auto qN = quecto; +inline constexpr auto rN = ronto; +inline constexpr auto yN = yocto; +inline constexpr auto zN = zepto; +inline constexpr auto aN = atto; +inline constexpr auto fN = femto; +inline constexpr auto pN = pico; +inline constexpr auto nN = nano; +inline constexpr auto uN = micro; +inline constexpr auto mN = milli; +inline constexpr auto cN = centi; +inline constexpr auto dN = deci; +inline constexpr auto N = newton; +inline constexpr auto daN = deca; +inline constexpr auto hN = hecto; +inline constexpr auto kN = kilo; +inline constexpr auto MN = mega; +inline constexpr auto GN = giga; +inline constexpr auto TN = tera; +inline constexpr auto PN = peta; +inline constexpr auto EN = exa; +inline constexpr auto ZN = zetta; +inline constexpr auto YN = yotta; +inline constexpr auto RN = ronna; +inline constexpr auto QN = quetta; #ifdef pascal #pragma push_macro("pascal") #undef pascal #define MP_UNITS_REDEFINE_PASCAL #endif -constexpr auto qPa = quecto; -constexpr auto rPa = ronto; -constexpr auto yPa = yocto; -constexpr auto zPa = zepto; -constexpr auto aPa = atto; -constexpr auto fPa = femto; -constexpr auto pPa = pico; -constexpr auto nPa = nano; -constexpr auto uPa = micro; -constexpr auto mPa = milli; -constexpr auto cPa = centi; -constexpr auto dPa = deci; -constexpr auto Pa = pascal; -constexpr auto daPa = deca; -constexpr auto hPa = hecto; -constexpr auto kPa = kilo; -constexpr auto MPa = mega; -constexpr auto GPa = giga; -constexpr auto TPa = tera; -constexpr auto PPa = peta; -constexpr auto EPa = exa; -constexpr auto ZPa = zetta; -constexpr auto YPa = yotta; -constexpr auto RPa = ronna; -constexpr auto QPa = quetta; +inline constexpr auto qPa = quecto; +inline constexpr auto rPa = ronto; +inline constexpr auto yPa = yocto; +inline constexpr auto zPa = zepto; +inline constexpr auto aPa = atto; +inline constexpr auto fPa = femto; +inline constexpr auto pPa = pico; +inline constexpr auto nPa = nano; +inline constexpr auto uPa = micro; +inline constexpr auto mPa = milli; +inline constexpr auto cPa = centi; +inline constexpr auto dPa = deci; +inline constexpr auto Pa = pascal; +inline constexpr auto daPa = deca; +inline constexpr auto hPa = hecto; +inline constexpr auto kPa = kilo; +inline constexpr auto MPa = mega; +inline constexpr auto GPa = giga; +inline constexpr auto TPa = tera; +inline constexpr auto PPa = peta; +inline constexpr auto EPa = exa; +inline constexpr auto ZPa = zetta; +inline constexpr auto YPa = yotta; +inline constexpr auto RPa = ronna; +inline constexpr auto QPa = quetta; #ifdef MP_UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef MP_UNITS_REDEFINE_PASCAL #endif -constexpr auto qJ = quecto; -constexpr auto rJ = ronto; -constexpr auto yJ = yocto; -constexpr auto zJ = zepto; -constexpr auto aJ = atto; -constexpr auto fJ = femto; -constexpr auto pJ = pico; -constexpr auto nJ = nano; -constexpr auto uJ = micro; -constexpr auto mJ = milli; -constexpr auto cJ = centi; -constexpr auto dJ = deci; -constexpr auto J = joule; -constexpr auto daJ = deca; -constexpr auto hJ = hecto; -constexpr auto kJ = kilo; -constexpr auto MJ = mega; -constexpr auto GJ = giga; -constexpr auto TJ = tera; -constexpr auto PJ = peta; -constexpr auto EJ = exa; -constexpr auto ZJ = zetta; -constexpr auto YJ = yotta; -constexpr auto RJ = ronna; -constexpr auto QJ = quetta; +inline constexpr auto qJ = quecto; +inline constexpr auto rJ = ronto; +inline constexpr auto yJ = yocto; +inline constexpr auto zJ = zepto; +inline constexpr auto aJ = atto; +inline constexpr auto fJ = femto; +inline constexpr auto pJ = pico; +inline constexpr auto nJ = nano; +inline constexpr auto uJ = micro; +inline constexpr auto mJ = milli; +inline constexpr auto cJ = centi; +inline constexpr auto dJ = deci; +inline constexpr auto J = joule; +inline constexpr auto daJ = deca; +inline constexpr auto hJ = hecto; +inline constexpr auto kJ = kilo; +inline constexpr auto MJ = mega; +inline constexpr auto GJ = giga; +inline constexpr auto TJ = tera; +inline constexpr auto PJ = peta; +inline constexpr auto EJ = exa; +inline constexpr auto ZJ = zetta; +inline constexpr auto YJ = yotta; +inline constexpr auto RJ = ronna; +inline constexpr auto QJ = quetta; -constexpr auto qW = quecto; -constexpr auto rW = ronto; -constexpr auto yW = yocto; -constexpr auto zW = zepto; -constexpr auto aW = atto; -constexpr auto fW = femto; -constexpr auto pW = pico; -constexpr auto nW = nano; -constexpr auto uW = micro; -constexpr auto mW = milli; -constexpr auto cW = centi; -constexpr auto dW = deci; -constexpr auto W = watt; -constexpr auto daW = deca; -constexpr auto hW = hecto; -constexpr auto kW = kilo; -constexpr auto MW = mega; -constexpr auto GW = giga; -constexpr auto TW = tera; -constexpr auto PW = peta; -constexpr auto EW = exa; -constexpr auto ZW = zetta; -constexpr auto YW = yotta; -constexpr auto RW = ronna; -constexpr auto QW = quetta; +inline constexpr auto qW = quecto; +inline constexpr auto rW = ronto; +inline constexpr auto yW = yocto; +inline constexpr auto zW = zepto; +inline constexpr auto aW = atto; +inline constexpr auto fW = femto; +inline constexpr auto pW = pico; +inline constexpr auto nW = nano; +inline constexpr auto uW = micro; +inline constexpr auto mW = milli; +inline constexpr auto cW = centi; +inline constexpr auto dW = deci; +inline constexpr auto W = watt; +inline constexpr auto daW = deca; +inline constexpr auto hW = hecto; +inline constexpr auto kW = kilo; +inline constexpr auto MW = mega; +inline constexpr auto GW = giga; +inline constexpr auto TW = tera; +inline constexpr auto PW = peta; +inline constexpr auto EW = exa; +inline constexpr auto ZW = zetta; +inline constexpr auto YW = yotta; +inline constexpr auto RW = ronna; +inline constexpr auto QW = quetta; -constexpr auto qC = quecto; -constexpr auto rC = ronto; -constexpr auto yC = yocto; -constexpr auto zC = zepto; -constexpr auto aC = atto; -constexpr auto fC = femto; -constexpr auto pC = pico; -constexpr auto nC = nano; -constexpr auto uC = micro; -constexpr auto mC = milli; -constexpr auto cC = centi; -constexpr auto dC = deci; -constexpr auto C = coulomb; -constexpr auto daC = deca; -constexpr auto hC = hecto; -constexpr auto kC = kilo; -constexpr auto MC = mega; -constexpr auto GC = giga; -constexpr auto TC = tera; -constexpr auto PC = peta; -constexpr auto EC = exa; -constexpr auto ZC = zetta; -constexpr auto YC = yotta; -constexpr auto RC = ronna; -constexpr auto QC = quetta; +inline constexpr auto qC = quecto; +inline constexpr auto rC = ronto; +inline constexpr auto yC = yocto; +inline constexpr auto zC = zepto; +inline constexpr auto aC = atto; +inline constexpr auto fC = femto; +inline constexpr auto pC = pico; +inline constexpr auto nC = nano; +inline constexpr auto uC = micro; +inline constexpr auto mC = milli; +inline constexpr auto cC = centi; +inline constexpr auto dC = deci; +inline constexpr auto C = coulomb; +inline constexpr auto daC = deca; +inline constexpr auto hC = hecto; +inline constexpr auto kC = kilo; +inline constexpr auto MC = mega; +inline constexpr auto GC = giga; +inline constexpr auto TC = tera; +inline constexpr auto PC = peta; +inline constexpr auto EC = exa; +inline constexpr auto ZC = zetta; +inline constexpr auto YC = yotta; +inline constexpr auto RC = ronna; +inline constexpr auto QC = quetta; -constexpr auto qV = quecto; -constexpr auto rV = ronto; -constexpr auto yV = yocto; -constexpr auto zV = zepto; -constexpr auto aV = atto; -constexpr auto fV = femto; -constexpr auto pV = pico; -constexpr auto nV = nano; -constexpr auto uV = micro; -constexpr auto mV = milli; -constexpr auto cV = centi; -constexpr auto dV = deci; -constexpr auto V = volt; -constexpr auto daV = deca; -constexpr auto hV = hecto; -constexpr auto kV = kilo; -constexpr auto MV = mega; -constexpr auto GV = giga; -constexpr auto TV = tera; -constexpr auto PV = peta; -constexpr auto EV = exa; -constexpr auto ZV = zetta; -constexpr auto YV = yotta; -constexpr auto RV = ronna; -constexpr auto QV = quetta; +inline constexpr auto qV = quecto; +inline constexpr auto rV = ronto; +inline constexpr auto yV = yocto; +inline constexpr auto zV = zepto; +inline constexpr auto aV = atto; +inline constexpr auto fV = femto; +inline constexpr auto pV = pico; +inline constexpr auto nV = nano; +inline constexpr auto uV = micro; +inline constexpr auto mV = milli; +inline constexpr auto cV = centi; +inline constexpr auto dV = deci; +inline constexpr auto V = volt; +inline constexpr auto daV = deca; +inline constexpr auto hV = hecto; +inline constexpr auto kV = kilo; +inline constexpr auto MV = mega; +inline constexpr auto GV = giga; +inline constexpr auto TV = tera; +inline constexpr auto PV = peta; +inline constexpr auto EV = exa; +inline constexpr auto ZV = zetta; +inline constexpr auto YV = yotta; +inline constexpr auto RV = ronna; +inline constexpr auto QV = quetta; -constexpr auto qF = quecto; -constexpr auto rF = ronto; -constexpr auto yF = yocto; -constexpr auto zF = zepto; -constexpr auto aF = atto; -constexpr auto fF = femto; -constexpr auto pF = pico; -constexpr auto nF = nano; -constexpr auto uF = micro; -constexpr auto mF = milli; -constexpr auto cF = centi; -constexpr auto dF = deci; -constexpr auto F = farad; -constexpr auto daF = deca; -constexpr auto hF = hecto; -constexpr auto kF = kilo; -constexpr auto MF = mega; -constexpr auto GF = giga; -constexpr auto TF = tera; -constexpr auto PF = peta; -constexpr auto EF = exa; -constexpr auto ZF = zetta; -constexpr auto YF = yotta; -constexpr auto RF = ronna; -constexpr auto QF = quetta; +inline constexpr auto qF = quecto; +inline constexpr auto rF = ronto; +inline constexpr auto yF = yocto; +inline constexpr auto zF = zepto; +inline constexpr auto aF = atto; +inline constexpr auto fF = femto; +inline constexpr auto pF = pico; +inline constexpr auto nF = nano; +inline constexpr auto uF = micro; +inline constexpr auto mF = milli; +inline constexpr auto cF = centi; +inline constexpr auto dF = deci; +inline constexpr auto F = farad; +inline constexpr auto daF = deca; +inline constexpr auto hF = hecto; +inline constexpr auto kF = kilo; +inline constexpr auto MF = mega; +inline constexpr auto GF = giga; +inline constexpr auto TF = tera; +inline constexpr auto PF = peta; +inline constexpr auto EF = exa; +inline constexpr auto ZF = zetta; +inline constexpr auto YF = yotta; +inline constexpr auto RF = ronna; +inline constexpr auto QF = quetta; -constexpr auto qohm = quecto; -constexpr auto rohm = ronto; -constexpr auto yohm = yocto; -constexpr auto zohm = zepto; -constexpr auto aohm = atto; -constexpr auto fohm = femto; -constexpr auto pohm = pico; -constexpr auto nohm = nano; -constexpr auto uohm = micro; -constexpr auto mohm = milli; -constexpr auto cohm = centi; -constexpr auto dohm = deci; +inline constexpr auto qohm = quecto; +inline constexpr auto rohm = ronto; +inline constexpr auto yohm = yocto; +inline constexpr auto zohm = zepto; +inline constexpr auto aohm = atto; +inline constexpr auto fohm = femto; +inline constexpr auto pohm = pico; +inline constexpr auto nohm = nano; +inline constexpr auto uohm = micro; +inline constexpr auto mohm = milli; +inline constexpr auto cohm = centi; +inline constexpr auto dohm = deci; using si::ohm; -constexpr auto daohm = deca; -constexpr auto hohm = hecto; -constexpr auto kohm = kilo; -constexpr auto Mohm = mega; -constexpr auto Gohm = giga; -constexpr auto Tohm = tera; -constexpr auto Pohm = peta; -constexpr auto Eohm = exa; -constexpr auto Zohm = zetta; -constexpr auto Yohm = yotta; -constexpr auto Rohm = ronna; -constexpr auto Qohm = quetta; +inline constexpr auto daohm = deca; +inline constexpr auto hohm = hecto; +inline constexpr auto kohm = kilo; +inline constexpr auto Mohm = mega; +inline constexpr auto Gohm = giga; +inline constexpr auto Tohm = tera; +inline constexpr auto Pohm = peta; +inline constexpr auto Eohm = exa; +inline constexpr auto Zohm = zetta; +inline constexpr auto Yohm = yotta; +inline constexpr auto Rohm = ronna; +inline constexpr auto Qohm = quetta; -constexpr auto qS = quecto; -constexpr auto rS = ronto; -constexpr auto yS = yocto; -constexpr auto zS = zepto; -constexpr auto aS = atto; -constexpr auto fS = femto; -constexpr auto pS = pico; -constexpr auto nS = nano; -constexpr auto uS = micro; -constexpr auto mS = milli; -constexpr auto cS = centi; -constexpr auto dS = deci; -constexpr auto S = siemens; -constexpr auto daS = deca; -constexpr auto hS = hecto; -constexpr auto kS = kilo; -constexpr auto MS = mega; -constexpr auto GS = giga; -constexpr auto TS = tera; -constexpr auto PS = peta; -constexpr auto ES = exa; -constexpr auto ZS = zetta; -constexpr auto YS = yotta; -constexpr auto RS = ronna; -constexpr auto QS = quetta; +inline constexpr auto qS = quecto; +inline constexpr auto rS = ronto; +inline constexpr auto yS = yocto; +inline constexpr auto zS = zepto; +inline constexpr auto aS = atto; +inline constexpr auto fS = femto; +inline constexpr auto pS = pico; +inline constexpr auto nS = nano; +inline constexpr auto uS = micro; +inline constexpr auto mS = milli; +inline constexpr auto cS = centi; +inline constexpr auto dS = deci; +inline constexpr auto S = siemens; +inline constexpr auto daS = deca; +inline constexpr auto hS = hecto; +inline constexpr auto kS = kilo; +inline constexpr auto MS = mega; +inline constexpr auto GS = giga; +inline constexpr auto TS = tera; +inline constexpr auto PS = peta; +inline constexpr auto ES = exa; +inline constexpr auto ZS = zetta; +inline constexpr auto YS = yotta; +inline constexpr auto RS = ronna; +inline constexpr auto QS = quetta; -constexpr auto qWb = quecto; -constexpr auto rWb = ronto; -constexpr auto yWb = yocto; -constexpr auto zWb = zepto; -constexpr auto aWb = atto; -constexpr auto fWb = femto; -constexpr auto pWb = pico; -constexpr auto nWb = nano; -constexpr auto uWb = micro; -constexpr auto mWb = milli; -constexpr auto cWb = centi; -constexpr auto dWb = deci; -constexpr auto Wb = weber; -constexpr auto daWb = deca; -constexpr auto hWb = hecto; -constexpr auto kWb = kilo; -constexpr auto MWb = mega; -constexpr auto GWb = giga; -constexpr auto TWb = tera; -constexpr auto PWb = peta; -constexpr auto EWb = exa; -constexpr auto ZWb = zetta; -constexpr auto YWb = yotta; -constexpr auto RWb = ronna; -constexpr auto QWb = quetta; +inline constexpr auto qWb = quecto; +inline constexpr auto rWb = ronto; +inline constexpr auto yWb = yocto; +inline constexpr auto zWb = zepto; +inline constexpr auto aWb = atto; +inline constexpr auto fWb = femto; +inline constexpr auto pWb = pico; +inline constexpr auto nWb = nano; +inline constexpr auto uWb = micro; +inline constexpr auto mWb = milli; +inline constexpr auto cWb = centi; +inline constexpr auto dWb = deci; +inline constexpr auto Wb = weber; +inline constexpr auto daWb = deca; +inline constexpr auto hWb = hecto; +inline constexpr auto kWb = kilo; +inline constexpr auto MWb = mega; +inline constexpr auto GWb = giga; +inline constexpr auto TWb = tera; +inline constexpr auto PWb = peta; +inline constexpr auto EWb = exa; +inline constexpr auto ZWb = zetta; +inline constexpr auto YWb = yotta; +inline constexpr auto RWb = ronna; +inline constexpr auto QWb = quetta; -constexpr auto qT = quecto; -constexpr auto rT = ronto; -constexpr auto yT = yocto; -constexpr auto zT = zepto; -constexpr auto aT = atto; -constexpr auto fT = femto; -constexpr auto pT = pico; -constexpr auto nT = nano; -constexpr auto uT = micro; -constexpr auto mT = milli; -constexpr auto cT = centi; -constexpr auto dT = deci; -constexpr auto T = tesla; -constexpr auto daT = deca; -constexpr auto hT = hecto; -constexpr auto kT = kilo; -constexpr auto MT = mega; -constexpr auto GT = giga; -constexpr auto TT = tera; -constexpr auto PT = peta; -constexpr auto ET = exa; -constexpr auto ZT = zetta; -constexpr auto YT = yotta; -constexpr auto RT = ronna; -constexpr auto QT = quetta; +inline constexpr auto qT = quecto; +inline constexpr auto rT = ronto; +inline constexpr auto yT = yocto; +inline constexpr auto zT = zepto; +inline constexpr auto aT = atto; +inline constexpr auto fT = femto; +inline constexpr auto pT = pico; +inline constexpr auto nT = nano; +inline constexpr auto uT = micro; +inline constexpr auto mT = milli; +inline constexpr auto cT = centi; +inline constexpr auto dT = deci; +inline constexpr auto T = tesla; +inline constexpr auto daT = deca; +inline constexpr auto hT = hecto; +inline constexpr auto kT = kilo; +inline constexpr auto MT = mega; +inline constexpr auto GT = giga; +inline constexpr auto TT = tera; +inline constexpr auto PT = peta; +inline constexpr auto ET = exa; +inline constexpr auto ZT = zetta; +inline constexpr auto YT = yotta; +inline constexpr auto RT = ronna; +inline constexpr auto QT = quetta; -constexpr auto qH = quecto; -constexpr auto rH = ronto; -constexpr auto yH = yocto; -constexpr auto zH = zepto; -constexpr auto aH = atto; -constexpr auto fH = femto; -constexpr auto pH = pico; -constexpr auto nH = nano; -constexpr auto uH = micro; -constexpr auto mH = milli; -constexpr auto cH = centi; -constexpr auto dH = deci; -constexpr auto H = henry; -constexpr auto daH = deca; -constexpr auto hH = hecto; -constexpr auto kH = kilo; -constexpr auto MH = mega; -constexpr auto GH = giga; -constexpr auto TH = tera; -constexpr auto PH = peta; -constexpr auto EH = exa; -constexpr auto ZH = zetta; -constexpr auto YH = yotta; -constexpr auto RH = ronna; -constexpr auto QH = quetta; +inline constexpr auto qH = quecto; +inline constexpr auto rH = ronto; +inline constexpr auto yH = yocto; +inline constexpr auto zH = zepto; +inline constexpr auto aH = atto; +inline constexpr auto fH = femto; +inline constexpr auto pH = pico; +inline constexpr auto nH = nano; +inline constexpr auto uH = micro; +inline constexpr auto mH = milli; +inline constexpr auto cH = centi; +inline constexpr auto dH = deci; +inline constexpr auto H = henry; +inline constexpr auto daH = deca; +inline constexpr auto hH = hecto; +inline constexpr auto kH = kilo; +inline constexpr auto MH = mega; +inline constexpr auto GH = giga; +inline constexpr auto TH = tera; +inline constexpr auto PH = peta; +inline constexpr auto EH = exa; +inline constexpr auto ZH = zetta; +inline constexpr auto YH = yotta; +inline constexpr auto RH = ronna; +inline constexpr auto QH = quetta; -constexpr auto qlm = quecto; -constexpr auto rlm = ronto; -constexpr auto ylm = yocto; -constexpr auto zlm = zepto; -constexpr auto alm = atto; -constexpr auto flm = femto; -constexpr auto plm = pico; -constexpr auto nlm = nano; -constexpr auto ulm = micro; -constexpr auto mlm = milli; -constexpr auto clm = centi; -constexpr auto dlm = deci; -constexpr auto lm = lumen; -constexpr auto dalm = deca; -constexpr auto hlm = hecto; -constexpr auto klm = kilo; -constexpr auto Mlm = mega; -constexpr auto Glm = giga; -constexpr auto Tlm = tera; -constexpr auto Plm = peta; -constexpr auto Elm = exa; -constexpr auto Zlm = zetta; -constexpr auto Ylm = yotta; -constexpr auto Rlm = ronna; -constexpr auto Qlm = quetta; +inline constexpr auto qlm = quecto; +inline constexpr auto rlm = ronto; +inline constexpr auto ylm = yocto; +inline constexpr auto zlm = zepto; +inline constexpr auto alm = atto; +inline constexpr auto flm = femto; +inline constexpr auto plm = pico; +inline constexpr auto nlm = nano; +inline constexpr auto ulm = micro; +inline constexpr auto mlm = milli; +inline constexpr auto clm = centi; +inline constexpr auto dlm = deci; +inline constexpr auto lm = lumen; +inline constexpr auto dalm = deca; +inline constexpr auto hlm = hecto; +inline constexpr auto klm = kilo; +inline constexpr auto Mlm = mega; +inline constexpr auto Glm = giga; +inline constexpr auto Tlm = tera; +inline constexpr auto Plm = peta; +inline constexpr auto Elm = exa; +inline constexpr auto Zlm = zetta; +inline constexpr auto Ylm = yotta; +inline constexpr auto Rlm = ronna; +inline constexpr auto Qlm = quetta; -constexpr auto qlx = quecto; -constexpr auto rlx = ronto; -constexpr auto ylx = yocto; -constexpr auto zlx = zepto; -constexpr auto alx = atto; -constexpr auto flx = femto; -constexpr auto plx = pico; -constexpr auto nlx = nano; -constexpr auto ulx = micro; -constexpr auto mlx = milli; -constexpr auto clx = centi; -constexpr auto dlx = deci; -constexpr auto lx = lux; -constexpr auto dalx = deca; -constexpr auto hlx = hecto; -constexpr auto klx = kilo; -constexpr auto Mlx = mega; -constexpr auto Glx = giga; -constexpr auto Tlx = tera; -constexpr auto Plx = peta; -constexpr auto Elx = exa; -constexpr auto Zlx = zetta; -constexpr auto Ylx = yotta; -constexpr auto Rlx = ronna; -constexpr auto Qlx = quetta; +inline constexpr auto qlx = quecto; +inline constexpr auto rlx = ronto; +inline constexpr auto ylx = yocto; +inline constexpr auto zlx = zepto; +inline constexpr auto alx = atto; +inline constexpr auto flx = femto; +inline constexpr auto plx = pico; +inline constexpr auto nlx = nano; +inline constexpr auto ulx = micro; +inline constexpr auto mlx = milli; +inline constexpr auto clx = centi; +inline constexpr auto dlx = deci; +inline constexpr auto lx = lux; +inline constexpr auto dalx = deca; +inline constexpr auto hlx = hecto; +inline constexpr auto klx = kilo; +inline constexpr auto Mlx = mega; +inline constexpr auto Glx = giga; +inline constexpr auto Tlx = tera; +inline constexpr auto Plx = peta; +inline constexpr auto Elx = exa; +inline constexpr auto Zlx = zetta; +inline constexpr auto Ylx = yotta; +inline constexpr auto Rlx = ronna; +inline constexpr auto Qlx = quetta; -constexpr auto qBq = quecto; -constexpr auto rBq = ronto; -constexpr auto yBq = yocto; -constexpr auto zBq = zepto; -constexpr auto aBq = atto; -constexpr auto fBq = femto; -constexpr auto pBq = pico; -constexpr auto nBq = nano; -constexpr auto uBq = micro; -constexpr auto mBq = milli; -constexpr auto cBq = centi; -constexpr auto dBq = deci; -constexpr auto Bq = becquerel; -constexpr auto daBq = deca; -constexpr auto hBq = hecto; -constexpr auto kBq = kilo; -constexpr auto MBq = mega; -constexpr auto GBq = giga; -constexpr auto TBq = tera; -constexpr auto PBq = peta; -constexpr auto EBq = exa; -constexpr auto ZBq = zetta; -constexpr auto YBq = yotta; -constexpr auto RBq = ronna; -constexpr auto QBq = quetta; +inline constexpr auto qBq = quecto; +inline constexpr auto rBq = ronto; +inline constexpr auto yBq = yocto; +inline constexpr auto zBq = zepto; +inline constexpr auto aBq = atto; +inline constexpr auto fBq = femto; +inline constexpr auto pBq = pico; +inline constexpr auto nBq = nano; +inline constexpr auto uBq = micro; +inline constexpr auto mBq = milli; +inline constexpr auto cBq = centi; +inline constexpr auto dBq = deci; +inline constexpr auto Bq = becquerel; +inline constexpr auto daBq = deca; +inline constexpr auto hBq = hecto; +inline constexpr auto kBq = kilo; +inline constexpr auto MBq = mega; +inline constexpr auto GBq = giga; +inline constexpr auto TBq = tera; +inline constexpr auto PBq = peta; +inline constexpr auto EBq = exa; +inline constexpr auto ZBq = zetta; +inline constexpr auto YBq = yotta; +inline constexpr auto RBq = ronna; +inline constexpr auto QBq = quetta; -constexpr auto qGy = quecto; -constexpr auto rGy = ronto; -constexpr auto yGy = yocto; -constexpr auto zGy = zepto; -constexpr auto aGy = atto; -constexpr auto fGy = femto; -constexpr auto pGy = pico; -constexpr auto nGy = nano; -constexpr auto uGy = micro; -constexpr auto mGy = milli; -constexpr auto cGy = centi; -constexpr auto dGy = deci; -constexpr auto Gy = gray; -constexpr auto daGy = deca; -constexpr auto hGy = hecto; -constexpr auto kGy = kilo; -constexpr auto MGy = mega; -constexpr auto GGy = giga; -constexpr auto TGy = tera; -constexpr auto PGy = peta; -constexpr auto EGy = exa; -constexpr auto ZGy = zetta; -constexpr auto YGy = yotta; -constexpr auto RGy = ronna; -constexpr auto QGy = quetta; +inline constexpr auto qGy = quecto; +inline constexpr auto rGy = ronto; +inline constexpr auto yGy = yocto; +inline constexpr auto zGy = zepto; +inline constexpr auto aGy = atto; +inline constexpr auto fGy = femto; +inline constexpr auto pGy = pico; +inline constexpr auto nGy = nano; +inline constexpr auto uGy = micro; +inline constexpr auto mGy = milli; +inline constexpr auto cGy = centi; +inline constexpr auto dGy = deci; +inline constexpr auto Gy = gray; +inline constexpr auto daGy = deca; +inline constexpr auto hGy = hecto; +inline constexpr auto kGy = kilo; +inline constexpr auto MGy = mega; +inline constexpr auto GGy = giga; +inline constexpr auto TGy = tera; +inline constexpr auto PGy = peta; +inline constexpr auto EGy = exa; +inline constexpr auto ZGy = zetta; +inline constexpr auto YGy = yotta; +inline constexpr auto RGy = ronna; +inline constexpr auto QGy = quetta; -constexpr auto qSv = quecto; -constexpr auto rSv = ronto; -constexpr auto ySv = yocto; -constexpr auto zSv = zepto; -constexpr auto aSv = atto; -constexpr auto fSv = femto; -constexpr auto pSv = pico; -constexpr auto nSv = nano; -constexpr auto uSv = micro; -constexpr auto mSv = milli; -constexpr auto cSv = centi; -constexpr auto dSv = deci; -constexpr auto Sv = sievert; -constexpr auto daSv = deca; -constexpr auto hSv = hecto; -constexpr auto kSv = kilo; -constexpr auto MSv = mega; -constexpr auto GSv = giga; -constexpr auto TSv = tera; -constexpr auto PSv = peta; -constexpr auto ESv = exa; -constexpr auto ZSv = zetta; -constexpr auto YSv = yotta; -constexpr auto RSv = ronna; -constexpr auto QSv = quetta; +inline constexpr auto qSv = quecto; +inline constexpr auto rSv = ronto; +inline constexpr auto ySv = yocto; +inline constexpr auto zSv = zepto; +inline constexpr auto aSv = atto; +inline constexpr auto fSv = femto; +inline constexpr auto pSv = pico; +inline constexpr auto nSv = nano; +inline constexpr auto uSv = micro; +inline constexpr auto mSv = milli; +inline constexpr auto cSv = centi; +inline constexpr auto dSv = deci; +inline constexpr auto Sv = sievert; +inline constexpr auto daSv = deca; +inline constexpr auto hSv = hecto; +inline constexpr auto kSv = kilo; +inline constexpr auto MSv = mega; +inline constexpr auto GSv = giga; +inline constexpr auto TSv = tera; +inline constexpr auto PSv = peta; +inline constexpr auto ESv = exa; +inline constexpr auto ZSv = zetta; +inline constexpr auto YSv = yotta; +inline constexpr auto RSv = ronna; +inline constexpr auto QSv = quetta; -constexpr auto qkat = quecto; -constexpr auto rkat = ronto; -constexpr auto ykat = yocto; -constexpr auto zkat = zepto; -constexpr auto akat = atto; -constexpr auto fkat = femto; -constexpr auto pkat = pico; -constexpr auto nkat = nano; -constexpr auto ukat = micro; -constexpr auto mkat = milli; -constexpr auto ckat = centi; -constexpr auto dkat = deci; -constexpr auto kat = katal; -constexpr auto dakat = deca; -constexpr auto hkat = hecto; -constexpr auto kkat = kilo; -constexpr auto Mkat = mega; -constexpr auto Gkat = giga; -constexpr auto Tkat = tera; -constexpr auto Pkat = peta; -constexpr auto Ekat = exa; -constexpr auto Zkat = zetta; -constexpr auto Ykat = yotta; -constexpr auto Rkat = ronna; -constexpr auto Qkat = quetta; +inline constexpr auto qkat = quecto; +inline constexpr auto rkat = ronto; +inline constexpr auto ykat = yocto; +inline constexpr auto zkat = zepto; +inline constexpr auto akat = atto; +inline constexpr auto fkat = femto; +inline constexpr auto pkat = pico; +inline constexpr auto nkat = nano; +inline constexpr auto ukat = micro; +inline constexpr auto mkat = milli; +inline constexpr auto ckat = centi; +inline constexpr auto dkat = deci; +inline constexpr auto kat = katal; +inline constexpr auto dakat = deca; +inline constexpr auto hkat = hecto; +inline constexpr auto kkat = kilo; +inline constexpr auto Mkat = mega; +inline constexpr auto Gkat = giga; +inline constexpr auto Tkat = tera; +inline constexpr auto Pkat = peta; +inline constexpr auto Ekat = exa; +inline constexpr auto Zkat = zetta; +inline constexpr auto Ykat = yotta; +inline constexpr auto Rkat = ronna; +inline constexpr auto Qkat = quetta; // no prefixes should be provided for the below units -constexpr auto deg_C = degree_Celsius; +inline constexpr auto deg_C = degree_Celsius; // commonly used squared and cubic units -constexpr auto m2 = square(metre); -constexpr auto m3 = cubic(metre); -constexpr auto m4 = pow<4>(metre); -constexpr auto s2 = square(second); -constexpr auto s3 = cubic(second); +inline constexpr auto m2 = square(metre); +inline constexpr auto m3 = cubic(metre); +inline constexpr auto m4 = pow<4>(metre); +inline constexpr auto s2 = square(second); +inline constexpr auto s3 = cubic(second); } // namespace si::unit_symbols namespace non_si::unit_symbols { // TODO Should the following non-SI units have prefixed symbols predefiend as well? -constexpr auto au = astronomical_unit; -constexpr auto deg = degree; -constexpr auto arcmin = arcminute; -constexpr auto arcsec = arcsecond; -constexpr auto a = are; -constexpr auto ha = hectare; -constexpr auto l = litre; -constexpr auto t = tonne; -constexpr auto Da = dalton; -constexpr auto eV = electronvolt; +inline constexpr auto au = astronomical_unit; +inline constexpr auto deg = degree; +inline constexpr auto arcmin = arcminute; +inline constexpr auto arcsec = arcsecond; +inline constexpr auto a = are; +inline constexpr auto ha = hectare; +inline constexpr auto l = litre; +inline constexpr auto t = tonne; +inline constexpr auto Da = dalton; +inline constexpr auto eV = electronvolt; // no prefixes should be provided for the below units -constexpr auto min = minute; -constexpr auto h = hour; -constexpr auto d = day; +inline constexpr auto min = minute; +inline constexpr auto h = hour; +inline constexpr auto d = day; } // namespace non_si::unit_symbols diff --git a/src/systems/include/mp-units/systems/si/units.h b/src/systems/include/mp-units/systems/si/units.h index 9b464c98..85680878 100644 --- a/src/systems/include/mp-units/systems/si/units.h +++ b/src/systems/include/mp-units/systems/si/units.h @@ -39,55 +39,55 @@ namespace si { // clang-format off // base units -constexpr struct second final : named_unit<"s", kind_of> {} second; -constexpr struct metre final : named_unit<"m", kind_of> {} metre; -constexpr struct gram final : named_unit<"g", kind_of> {} gram; -constexpr auto kilogram = kilo; -constexpr struct ampere final : named_unit<"A", kind_of> {} ampere; +inline constexpr struct second final : named_unit<"s", kind_of> {} second; +inline constexpr struct metre final : named_unit<"m", kind_of> {} metre; +inline constexpr struct gram final : named_unit<"g", kind_of> {} gram; +inline constexpr auto kilogram = kilo; +inline constexpr struct ampere final : named_unit<"A", kind_of> {} ampere; -constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; -constexpr auto zeroth_kelvin = absolute_zero; -constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; +inline constexpr struct absolute_zero final : absolute_point_origin {} absolute_zero; +inline constexpr auto zeroth_kelvin = absolute_zero; +inline constexpr struct kelvin final : named_unit<"K", kind_of, zeroth_kelvin> {} kelvin; -constexpr struct mole final : named_unit<"mol", kind_of> {} mole; -constexpr struct candela final : named_unit<"cd", kind_of> {} candela; +inline constexpr struct mole final : named_unit<"mol", kind_of> {} mole; +inline constexpr struct candela final : named_unit<"cd", kind_of> {} candela; // derived named units -constexpr struct radian final : named_unit<"rad", metre / metre, kind_of> {} radian; -constexpr struct steradian final : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; -constexpr struct hertz final : named_unit<"Hz", one / second, kind_of> {} hertz; -constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; +inline constexpr struct radian final : named_unit<"rad", metre / metre, kind_of> {} radian; +inline constexpr struct steradian final : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; +inline constexpr struct hertz final : named_unit<"Hz", one / second, kind_of> {} hertz; +inline constexpr struct newton final : named_unit<"N", kilogram * metre / square(second)> {} newton; #ifdef pascal #pragma push_macro("pascal") #undef pascal #define MP_UNITS_REDEFINE_PASCAL #endif -constexpr struct pascal final : named_unit<"Pa", newton / square(metre)> {} pascal; +inline constexpr struct pascal final : named_unit<"Pa", newton / square(metre)> {} pascal; #ifdef MP_UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef MP_UNITS_REDEFINE_PASCAL #endif -constexpr struct joule final : named_unit<"J", newton * metre> {} joule; -constexpr struct watt final : named_unit<"W", joule / second> {} watt; -constexpr struct coulomb final : named_unit<"C", ampere * second> {} coulomb; -constexpr struct volt final : named_unit<"V", watt / ampere> {} volt; -constexpr struct farad final : named_unit<"F", coulomb / volt> {} farad; -constexpr struct ohm final : named_unit {} ohm; -constexpr struct siemens final : named_unit<"S", one / ohm> {} siemens; -constexpr struct weber final : named_unit<"Wb", volt * second> {} weber; -constexpr struct tesla final : named_unit<"T", weber / square(metre)> {} tesla; -constexpr struct henry final : named_unit<"H", weber / ampere> {} henry; +inline constexpr struct joule final : named_unit<"J", newton * metre> {} joule; +inline constexpr struct watt final : named_unit<"W", joule / second> {} watt; +inline constexpr struct coulomb final : named_unit<"C", ampere * second> {} coulomb; +inline constexpr struct volt final : named_unit<"V", watt / ampere> {} volt; +inline constexpr struct farad final : named_unit<"F", coulomb / volt> {} farad; +inline constexpr struct ohm final : named_unit {} ohm; +inline constexpr struct siemens final : named_unit<"S", one / ohm> {} siemens; +inline constexpr struct weber final : named_unit<"Wb", volt * second> {} weber; +inline constexpr struct tesla final : named_unit<"T", weber / square(metre)> {} tesla; +inline constexpr struct henry final : named_unit<"H", weber / ampere> {} henry; -constexpr struct ice_point final : relative_point_origin>(273'150)> {} ice_point; -constexpr auto zeroth_degree_Celsius = ice_point; -constexpr struct degree_Celsius final : named_unit {} degree_Celsius; +inline constexpr struct ice_point final : relative_point_origin>(273'150)> {} ice_point; +inline constexpr auto zeroth_degree_Celsius = ice_point; +inline constexpr struct degree_Celsius final : named_unit {} degree_Celsius; -constexpr struct lumen final : named_unit<"lm", candela * steradian> {} lumen; -constexpr struct lux final : named_unit<"lx", lumen / square(metre)> {} lux; -constexpr struct becquerel final : named_unit<"Bq", one / second, kind_of> {} becquerel; -constexpr struct gray final : named_unit<"Gy", joule / kilogram, kind_of> {} gray; -constexpr struct sievert final : named_unit<"Sv", joule / kilogram, kind_of> {} sievert; -constexpr struct katal final : named_unit<"kat", mole / second> {} katal; +inline constexpr struct lumen final : named_unit<"lm", candela * steradian> {} lumen; +inline constexpr struct lux final : named_unit<"lx", lumen / square(metre)> {} lux; +inline constexpr struct becquerel final : named_unit<"Bq", one / second, kind_of> {} becquerel; +inline constexpr struct gray final : named_unit<"Gy", joule / kilogram, kind_of> {} gray; +inline constexpr struct sievert final : named_unit<"Sv", joule / kilogram, kind_of> {} sievert; +inline constexpr struct katal final : named_unit<"kat", mole / second> {} katal; // clang-format on } // namespace si @@ -96,20 +96,20 @@ namespace non_si { // clang-format off // non-SI units accepted for use with the SI -constexpr struct minute final : named_unit<"min", mag<60> * si::second> {} minute; -constexpr struct hour final : named_unit<"h", mag<60> * minute> {} hour; -constexpr struct day final : named_unit<"d", mag<24> * hour> {} day; -constexpr struct astronomical_unit final : named_unit<"au", mag<149'597'870'700> * si::metre> {} astronomical_unit; -constexpr struct degree final : named_unit * si::radian> {} degree; -constexpr struct arcminute final : named_unit * degree> {} arcminute; -constexpr struct arcsecond final : named_unit * arcminute> {} arcsecond; -constexpr struct are final : named_unit<"a", square(si::deca)> {} are; -constexpr auto hectare = si::hecto; -constexpr struct litre final : named_unit<"l", cubic(si::deci)> {} litre; -constexpr struct tonne final : named_unit<"t", mag<1000> * si::kilogram> {} tonne; -constexpr struct dalton final : named_unit<"Da", mag_ratio<16'605'390'666'050, 10'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} dalton; +inline constexpr struct minute final : named_unit<"min", mag<60> * si::second> {} minute; +inline constexpr struct hour final : named_unit<"h", mag<60> * minute> {} hour; +inline constexpr struct day final : named_unit<"d", mag<24> * hour> {} day; +inline constexpr struct astronomical_unit final : named_unit<"au", mag<149'597'870'700> * si::metre> {} astronomical_unit; +inline constexpr struct degree final : named_unit * si::radian> {} degree; +inline constexpr struct arcminute final : named_unit * degree> {} arcminute; +inline constexpr struct arcsecond final : named_unit * arcminute> {} arcsecond; +inline constexpr struct are final : named_unit<"a", square(si::deca)> {} are; +inline constexpr auto hectare = si::hecto; +inline constexpr struct litre final : named_unit<"l", cubic(si::deci)> {} litre; +inline constexpr struct tonne final : named_unit<"t", mag<1000> * si::kilogram> {} tonne; +inline constexpr struct dalton final : named_unit<"Da", mag_ratio<16'605'390'666'050, 10'000'000'000'000> * mag_power<10, -27> * si::kilogram> {} dalton; // TODO A different value is provided in the SI Brochure and different in the ISO 80000 -constexpr struct electronvolt final : named_unit<"eV", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * si::joule> {} electronvolt; +inline constexpr struct electronvolt final : named_unit<"eV", mag_ratio<1'602'176'634, 1'000'000'000> * mag_power<10, -19> * si::joule> {} electronvolt; // TODO the below are logarithmic units - how to support those? // neper // bel diff --git a/src/systems/include/mp-units/systems/typographic.h b/src/systems/include/mp-units/systems/typographic.h index 6969d594..f368d350 100644 --- a/src/systems/include/mp-units/systems/typographic.h +++ b/src/systems/include/mp-units/systems/typographic.h @@ -36,11 +36,11 @@ namespace mp_units::typographic { // clang-format off // https://en.wikipedia.org/wiki/Point_(typography) -constexpr struct pica_us final : named_unit<"pica(us)", mag_ratio<166'044, 1'000'000> * international::inch> {} pica_us; -constexpr struct point_us final : named_unit<"point(us)", mag_ratio<1, 12> * pica_us> {} point_us; +inline constexpr struct pica_us final : named_unit<"pica(us)", mag_ratio<166'044, 1'000'000> * international::inch> {} pica_us; +inline constexpr struct point_us final : named_unit<"point(us)", mag_ratio<1, 12> * pica_us> {} point_us; -constexpr struct point_dtp final : named_unit<"point(dtp)", mag_ratio<1, 72> * international::inch> {} point_dtp; -constexpr struct pica_dtp final : named_unit<"pica(dtp)", mag<12> * point_dtp> {} pica_dtp; +inline constexpr struct point_dtp final : named_unit<"point(dtp)", mag_ratio<1, 72> * international::inch> {} point_dtp; +inline constexpr struct pica_dtp final : named_unit<"pica(dtp)", mag<12> * point_dtp> {} pica_dtp; // clang-format on } // namespace mp_units::typographic diff --git a/src/systems/include/mp-units/systems/usc.h b/src/systems/include/mp-units/systems/usc.h index 8214d7c4..cca91973 100644 --- a/src/systems/include/mp-units/systems/usc.h +++ b/src/systems/include/mp-units/systems/usc.h @@ -41,78 +41,78 @@ using namespace international; // https://en.wikipedia.org/wiki/United_States_customary_units#Length // nautical -constexpr struct fathom final : named_unit<"ftm(us)", mag<2> * yard> {} fathom; -constexpr struct cable final : named_unit<"cb(us)", mag<120> * fathom> {} cable; +inline constexpr struct fathom final : named_unit<"ftm(us)", mag<2> * yard> {} fathom; +inline constexpr struct cable final : named_unit<"cb(us)", mag<120> * fathom> {} cable; // survey struct us_survey_foot final : named_unit<"ft(us)", mag_ratio<1'200, 3'937> * si::metre> {}; struct us_survey_mile final : named_unit<"mi(us)", mag<5280> * us_survey_foot{}> {}; [[deprecated("In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is deprecated.")]] -constexpr us_survey_foot us_survey_foot; +inline constexpr us_survey_foot us_survey_foot; [[deprecated("In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is deprecated.")]] -constexpr us_survey_mile us_survey_mile; +inline constexpr us_survey_mile us_survey_mile; -constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * foot> {} link; -constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; -constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; -constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; +inline constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * foot> {} link; +inline constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; +inline constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; +inline constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; // clang-format on namespace survey1893 { // clang-format off -constexpr struct us_survey_foot final : named_unit<"ft(us)", mag_ratio<1'200, 3'937> * si::metre> {} us_survey_foot; -constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * us_survey_foot> {} link; -constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; -constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; -constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; -constexpr struct us_survey_mile final : named_unit<"mi(us)", mag<8> * furlong> {} us_survey_mile; -constexpr struct league final : named_unit<"lea", mag<3> * us_survey_mile> {} league; +inline constexpr struct us_survey_foot final : named_unit<"ft(us)", mag_ratio<1'200, 3'937> * si::metre> {} us_survey_foot; +inline constexpr struct link final : named_unit<"li", mag_ratio<33, 50> * us_survey_foot> {} link; +inline constexpr struct rod final : named_unit<"rd", mag<25> * link> {} rod; +inline constexpr struct chain final : named_unit<"ch", mag<4> * rod> {} chain; +inline constexpr struct furlong final : named_unit<"fur", mag<10> * chain> {} furlong; +inline constexpr struct us_survey_mile final : named_unit<"mi(us)", mag<8> * furlong> {} us_survey_mile; +inline constexpr struct league final : named_unit<"lea", mag<3> * us_survey_mile> {} league; // clang-format on } // namespace survey1893 // clang-format off // https://en.wikipedia.org/wiki/United_States_customary_units#Area -constexpr struct acre final : named_unit<"acre", mag<10> * square(survey1893::chain)> {} acre; -constexpr struct section final : named_unit<"section", mag<640> * acre> {} section; +inline constexpr struct acre final : named_unit<"acre", mag<10> * square(survey1893::chain)> {} acre; +inline constexpr struct section final : named_unit<"section", mag<640> * acre> {} section; // https://en.wikipedia.org/wiki/United_States_customary_units#Fluid_volume -constexpr struct gallon final : named_unit<"gal", mag<231> * cubic(inch)> {} gallon; -constexpr struct pottle final : named_unit<"pot", mag_ratio<1, 2> * gallon> {} pottle; -constexpr struct quart final : named_unit<"qt", mag_ratio<1, 2> * pottle> {} quart; -constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; -constexpr struct cup final : named_unit<"c", mag_ratio<1, 2> * pint> {} cup; -constexpr struct gill final : named_unit<"gi", mag_ratio<1, 2> * cup> {} gill; -constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 4> * gill> {} fluid_ounce; -constexpr struct tablespoon final : named_unit<"tbsp", mag_ratio<1, 2> * fluid_ounce> {} tablespoon; -constexpr struct shot final : named_unit<"jig", mag<3> * tablespoon> {} shot; -constexpr struct teaspoon final : named_unit<"tsp", mag_ratio<1, 3> * tablespoon> {} teaspoon; -constexpr struct minim final : named_unit<"min", mag_ratio<1, 80> * teaspoon> {} minim; -constexpr struct fluid_dram final : named_unit<"fl dr", mag<60> * minim> {} fluid_dram; -constexpr struct barrel final : named_unit<"bbl", mag_ratio<315, 10> * gallon> {} barrel; -constexpr struct oil_barrel final : named_unit<"bbl", mag_ratio<4, 3> * barrel> {} oil_barrel; -constexpr struct hogshead final : named_unit<"hogshead", mag<63> * gallon> {} hogshead; +inline constexpr struct gallon final : named_unit<"gal", mag<231> * cubic(inch)> {} gallon; +inline constexpr struct pottle final : named_unit<"pot", mag_ratio<1, 2> * gallon> {} pottle; +inline constexpr struct quart final : named_unit<"qt", mag_ratio<1, 2> * pottle> {} quart; +inline constexpr struct pint final : named_unit<"pt", mag_ratio<1, 2> * quart> {} pint; +inline constexpr struct cup final : named_unit<"c", mag_ratio<1, 2> * pint> {} cup; +inline constexpr struct gill final : named_unit<"gi", mag_ratio<1, 2> * cup> {} gill; +inline constexpr struct fluid_ounce final : named_unit<"fl oz", mag_ratio<1, 4> * gill> {} fluid_ounce; +inline constexpr struct tablespoon final : named_unit<"tbsp", mag_ratio<1, 2> * fluid_ounce> {} tablespoon; +inline constexpr struct shot final : named_unit<"jig", mag<3> * tablespoon> {} shot; +inline constexpr struct teaspoon final : named_unit<"tsp", mag_ratio<1, 3> * tablespoon> {} teaspoon; +inline constexpr struct minim final : named_unit<"min", mag_ratio<1, 80> * teaspoon> {} minim; +inline constexpr struct fluid_dram final : named_unit<"fl dr", mag<60> * minim> {} fluid_dram; +inline constexpr struct barrel final : named_unit<"bbl", mag_ratio<315, 10> * gallon> {} barrel; +inline constexpr struct oil_barrel final : named_unit<"bbl", mag_ratio<4, 3> * barrel> {} oil_barrel; +inline constexpr struct hogshead final : named_unit<"hogshead", mag<63> * gallon> {} hogshead; // https://en.wikipedia.org/wiki/United_States_customary_units#Dry_volume -constexpr struct dry_barrel final : named_unit<"bbl", mag<7056> * cubic(inch)> {} dry_barrel; -constexpr struct bushel final : named_unit<"bu", mag_ratio<3'523'907'016'688, 100'000'000'000> * si::litre> {} bushel; -constexpr struct peck final : named_unit<"pk", mag_ratio<1, 4> * bushel> {} peck; -constexpr struct dry_gallon final : named_unit<"gal", mag_ratio<1, 2> * peck> {} dry_gallon; -constexpr struct dry_quart final : named_unit<"qt", mag_ratio<1, 4> * dry_gallon> {} dry_quart; -constexpr struct dry_pint final : named_unit<"pt", mag_ratio<1, 2> * dry_quart> {} dry_pint; +inline constexpr struct dry_barrel final : named_unit<"bbl", mag<7056> * cubic(inch)> {} dry_barrel; +inline constexpr struct bushel final : named_unit<"bu", mag_ratio<3'523'907'016'688, 100'000'000'000> * si::litre> {} bushel; +inline constexpr struct peck final : named_unit<"pk", mag_ratio<1, 4> * bushel> {} peck; +inline constexpr struct dry_gallon final : named_unit<"gal", mag_ratio<1, 2> * peck> {} dry_gallon; +inline constexpr struct dry_quart final : named_unit<"qt", mag_ratio<1, 4> * dry_gallon> {} dry_quart; +inline constexpr struct dry_pint final : named_unit<"pt", mag_ratio<1, 2> * dry_quart> {} dry_pint; // https://en.wikipedia.org/wiki/United_States_customary_units#Mass_and_Weight // https://en.wikipedia.org/wiki/Avoirdupois_system#American_customary_system -constexpr struct quarter final : named_unit<"qr", mag<25> * pound> {} quarter; -constexpr struct short_hundredweight final : named_unit<"cwt", mag<100> * pound> {} short_hundredweight; -constexpr struct ton final : named_unit<"t", mag<2'000> * pound> {} ton; -constexpr auto short_ton = ton; -constexpr struct pennyweight final : named_unit<"dwt", mag<24> * grain> {} pennyweight; -constexpr struct troy_once final : named_unit<"oz t", mag<20> * pennyweight> {} troy_once; -constexpr struct troy_pound final : named_unit<"lb t", mag<12> * troy_once> {} troy_pound; +inline constexpr struct quarter final : named_unit<"qr", mag<25> * pound> {} quarter; +inline constexpr struct short_hundredweight final : named_unit<"cwt", mag<100> * pound> {} short_hundredweight; +inline constexpr struct ton final : named_unit<"t", mag<2'000> * pound> {} ton; +inline constexpr auto short_ton = ton; +inline constexpr struct pennyweight final : named_unit<"dwt", mag<24> * grain> {} pennyweight; +inline constexpr struct troy_once final : named_unit<"oz t", mag<20> * pennyweight> {} troy_once; +inline constexpr struct troy_pound final : named_unit<"lb t", mag<12> * troy_once> {} troy_pound; // https://en.wikipedia.org/wiki/Inch_of_mercury #ifdef pascal @@ -120,15 +120,15 @@ constexpr struct troy_pound final : named_unit<"lb t", mag<12> * troy_once> {} t #undef pascal #define MP_UNITS_REDEFINE_PASCAL #endif -constexpr struct inch_of_mercury final : named_unit<"inHg", mag_ratio<3'386'389, 1'000> * si::pascal> {} inch_of_mercury; +inline constexpr struct inch_of_mercury final : named_unit<"inHg", mag_ratio<3'386'389, 1'000> * si::pascal> {} inch_of_mercury; #ifdef MP_UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef MP_UNITS_REDEFINE_PASCAL #endif // https://en.wikipedia.org/wiki/United_States_customary_units#Temperature -constexpr struct zeroth_degree_Fahrenheit final : relative_point_origin * si::degree_Celsius>(-32)> {} zeroth_degree_Fahrenheit; -constexpr struct degree_Fahrenheit final : named_unit * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; +inline constexpr struct zeroth_degree_Fahrenheit final : relative_point_origin * si::degree_Celsius>(-32)> {} zeroth_degree_Fahrenheit; +inline constexpr struct degree_Fahrenheit final : named_unit * si::degree_Celsius, zeroth_degree_Fahrenheit> {} degree_Fahrenheit; // clang-format on @@ -136,51 +136,51 @@ namespace unit_symbols { using namespace international::unit_symbols; -constexpr auto ftm = fathom; -constexpr auto cb = cable; +inline constexpr auto ftm = fathom; +inline constexpr auto cb = cable; [[deprecated( "In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is " - "deprecated.")]] constexpr struct us_survey_foot us_ft; + "deprecated.")]] inline constexpr struct us_survey_foot us_ft; [[deprecated( "In accordance with NIST SP 811, as of January 1, 2023, the use of the U.S. survey foot and U.S. survey mile is " - "deprecated.")]] constexpr struct us_survey_mile us_mi; -constexpr auto li = link; -constexpr auto rd = rod; -constexpr auto ch = chain; -constexpr auto fur = furlong; -constexpr auto lea = league; + "deprecated.")]] inline constexpr struct us_survey_mile us_mi; +inline constexpr auto li = link; +inline constexpr auto rd = rod; +inline constexpr auto ch = chain; +inline constexpr auto fur = furlong; +inline constexpr auto lea = league; -constexpr auto gal = gallon; -constexpr auto pot = pottle; -constexpr auto qt = quart; -constexpr auto pt = pint; -constexpr auto c = cup; -constexpr auto gi = gill; -constexpr auto fl_oz = fluid_ounce; -constexpr auto tbsp = tablespoon; -constexpr auto jig = shot; -constexpr auto tsp = teaspoon; -constexpr auto min = minim; -constexpr auto fl_dr = fluid_dram; -constexpr auto bbl = barrel; +inline constexpr auto gal = gallon; +inline constexpr auto pot = pottle; +inline constexpr auto qt = quart; +inline constexpr auto pt = pint; +inline constexpr auto c = cup; +inline constexpr auto gi = gill; +inline constexpr auto fl_oz = fluid_ounce; +inline constexpr auto tbsp = tablespoon; +inline constexpr auto jig = shot; +inline constexpr auto tsp = teaspoon; +inline constexpr auto min = minim; +inline constexpr auto fl_dr = fluid_dram; +inline constexpr auto bbl = barrel; -constexpr auto dry_bbl = dry_barrel; -constexpr auto bu = bushel; -constexpr auto pk = peck; -constexpr auto dry_gal = dry_gallon; -constexpr auto dry_qt = dry_quart; -constexpr auto dry_pt = dry_pint; +inline constexpr auto dry_bbl = dry_barrel; +inline constexpr auto bu = bushel; +inline constexpr auto pk = peck; +inline constexpr auto dry_gal = dry_gallon; +inline constexpr auto dry_qt = dry_quart; +inline constexpr auto dry_pt = dry_pint; -constexpr auto qr = quarter; -constexpr auto cwt = short_hundredweight; -constexpr auto t = ton; -constexpr auto dwt = pennyweight; -constexpr auto oz_t = troy_once; -constexpr auto lb_t = troy_pound; +inline constexpr auto qr = quarter; +inline constexpr auto cwt = short_hundredweight; +inline constexpr auto t = ton; +inline constexpr auto dwt = pennyweight; +inline constexpr auto oz_t = troy_once; +inline constexpr auto lb_t = troy_pound; -constexpr auto inHg = inch_of_mercury; +inline constexpr auto inHg = inch_of_mercury; -constexpr auto deg_F = degree_Fahrenheit; +inline constexpr auto deg_F = degree_Fahrenheit; } // namespace unit_symbols diff --git a/test/runtime/truncation_test.cpp b/test/runtime/truncation_test.cpp index 2626c583..3ff10046 100644 --- a/test/runtime/truncation_test.cpp +++ b/test/runtime/truncation_test.cpp @@ -42,9 +42,9 @@ using namespace mp_units; using namespace mp_units::angular; using namespace mp_units::angular::unit_symbols; -constexpr struct half_revolution final : named_unit<"hrev", mag_pi * radian> { +inline constexpr struct half_revolution final : named_unit<"hrev", mag_pi * radian> { } half_revolution; -constexpr auto hrev = half_revolution; +inline constexpr auto hrev = half_revolution; // constexpr auto revb6 = mag_ratio<1,3> * mag_pi * rad; diff --git a/test/static/concepts_test.cpp b/test/static/concepts_test.cpp index 937776eb..c67ff710 100644 --- a/test/static/concepts_test.cpp +++ b/test/static/concepts_test.cpp @@ -44,12 +44,12 @@ namespace { using namespace mp_units; -constexpr struct my_origin final : absolute_point_origin { +inline constexpr struct my_origin final : absolute_point_origin { } my_origin; -constexpr struct my_relative_origin final : relative_point_origin { +inline constexpr struct my_relative_origin final : relative_point_origin { } my_relative_origin; -constexpr auto dim_speed = isq::dim_length / isq::dim_time; +inline constexpr auto dim_speed = isq::dim_length / isq::dim_time; // BaseDimension static_assert(detail::BaseDimension); @@ -78,7 +78,7 @@ static_assert(!Dimension); // TODO add tests // QuantitySpec -constexpr auto speed = isq::length / isq::time; +inline constexpr auto speed = isq::length / isq::time; static_assert(QuantitySpec); static_assert(QuantitySpec); diff --git a/test/static/dimension_test.cpp b/test/static/dimension_test.cpp index 6d4aa96f..8064831e 100644 --- a/test/static/dimension_test.cpp +++ b/test/static/dimension_test.cpp @@ -36,31 +36,31 @@ using namespace mp_units; using dimension_one_ = struct dimension_one; // clang-format off -constexpr struct length_ final : base_dimension<"L"> {} length; -constexpr struct mass_ final : base_dimension<"M"> {} mass; -constexpr struct time_ final : base_dimension<"T"> {} time; +inline constexpr struct length_ final : base_dimension<"L"> {} length; +inline constexpr struct mass_ final : base_dimension<"M"> {} mass; +inline constexpr struct time_ final : base_dimension<"T"> {} time; -constexpr auto my_length1 = length; -constexpr auto my_length2 = length; +inline constexpr auto my_length1 = length; +inline constexpr auto my_length2 = length; QUANTITY_SPEC_(q_time, time); -constexpr struct second_ final : named_unit<"s", kind_of> {} second; +inline constexpr struct second_ final : named_unit<"s", kind_of> {} second; -constexpr auto frequency = inverse(time); -constexpr auto action = inverse(time); -constexpr auto area = length * length; -constexpr auto volume = area * length; -constexpr auto speed = length / time; -constexpr auto acceleration = speed / time; -constexpr auto force = mass * acceleration; -constexpr auto moment_of_force = length * force; -constexpr auto torque = moment_of_force; -constexpr auto pressure = force / area; -constexpr auto stress = pressure; -constexpr auto strain = stress / stress; -constexpr auto power = force * speed; -constexpr auto efficiency = power / power; -constexpr auto energy = force * length; +inline constexpr auto frequency = inverse(time); +inline constexpr auto action = inverse(time); +inline constexpr auto area = length * length; +inline constexpr auto volume = area * length; +inline constexpr auto speed = length / time; +inline constexpr auto acceleration = speed / time; +inline constexpr auto force = mass * acceleration; +inline constexpr auto moment_of_force = length * force; +inline constexpr auto torque = moment_of_force; +inline constexpr auto pressure = force / area; +inline constexpr auto stress = pressure; +inline constexpr auto strain = stress / stress; +inline constexpr auto power = force * speed; +inline constexpr auto efficiency = power / power; +inline constexpr auto energy = force * length; // clang-format on // concepts verification diff --git a/test/static/magnitude_test.cpp b/test/static/magnitude_test.cpp index da2dd5cb..ab82cbfc 100644 --- a/test/static/magnitude_test.cpp +++ b/test/static/magnitude_test.cpp @@ -71,11 +71,11 @@ namespace { // CHECK(round_trip == R); // } -constexpr struct mag_2_ : magnitude<2> { +inline constexpr struct mag_2_ : magnitude<2> { } mag_2; -// constexpr struct mag_2_other : magnitude<2> { +// inline constexpr struct mag_2_other : magnitude<2> { // } mag_2_other; -// constexpr struct mag_3 : magnitude<2> { +// inline constexpr struct mag_3 : magnitude<2> { // } mag_3; // concepts verification diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 80a35127..f04e9c1a 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -50,38 +50,38 @@ using namespace std::chrono_literals; using sys_seconds = std::chrono::time_point; #endif -constexpr struct zeroth_length final : absolute_point_origin { +inline constexpr struct zeroth_length final : absolute_point_origin { } zeroth_length; -constexpr struct mean_sea_level final : absolute_point_origin { +inline constexpr struct mean_sea_level final : absolute_point_origin { } mean_sea_level; -constexpr auto my_mean_sea_level = mean_sea_level; +inline constexpr auto my_mean_sea_level = mean_sea_level; -constexpr struct same_mean_sea_level final : relative_point_origin { +inline constexpr struct same_mean_sea_level final : relative_point_origin { } same_mean_sea_level; -constexpr struct ground_level final : relative_point_origin { +inline constexpr struct ground_level final : relative_point_origin { } ground_level; -constexpr auto my_ground_level = ground_level; +inline constexpr auto my_ground_level = ground_level; -constexpr struct same_ground_level1 final : relative_point_origin { +inline constexpr struct same_ground_level1 final : relative_point_origin { } same_ground_level1; -constexpr struct same_ground_level2 final : relative_point_origin { +inline constexpr struct same_ground_level2 final : relative_point_origin { } same_ground_level2; -constexpr struct tower_peak final : relative_point_origin { +inline constexpr struct tower_peak final : relative_point_origin { } tower_peak; -constexpr struct other_ground_level final : relative_point_origin { +inline constexpr struct other_ground_level final : relative_point_origin { } other_ground_level; -constexpr struct other_absolute_level final : absolute_point_origin { +inline constexpr struct other_absolute_level final : absolute_point_origin { } other_absolute_level; -constexpr struct zero final : absolute_point_origin { +inline constexpr struct zero final : absolute_point_origin { } zero; QUANTITY_SPEC(special_height, isq::height); @@ -122,7 +122,7 @@ static_assert(relative_po + isq::height(42 * m)>.quanti static_assert(relative_po> + isq::height(42 * m)>.quantity_spec == isq::height); static_assert(relative_po + 42 * m>.quantity_spec == isq::height); -constexpr struct my_kelvin final : named_unit<"my_K", mag<10> * si::kelvin> { +inline constexpr struct my_kelvin final : named_unit<"my_K", mag<10> * si::kelvin> { } my_kelvin; static_assert(default_point_origin(si::kelvin) == si::absolute_zero); @@ -1516,7 +1516,7 @@ static_assert(ground_level - other_ground_level == -81 * m); static_assert(other_ground_level - tower_peak == 39 * m); static_assert(tower_peak - other_ground_level == -39 * m); -constexpr struct zero_m_per_s final : absolute_point_origin> { +inline constexpr struct zero_m_per_s final : absolute_point_origin> { } zero_m_per_s; // commutativity and associativity @@ -1604,7 +1604,7 @@ static_assert( is_of_type, int>>); -constexpr struct zero_Hz final : absolute_point_origin> { +inline constexpr struct zero_Hz final : absolute_point_origin> { } zero_Hz; static_assert(((zero_Hz + 10 / (2 * isq::period_duration[s])) + 5 * isq::frequency[Hz]).quantity_from(zero_Hz) == @@ -1688,7 +1688,7 @@ consteval bool invalid_subtraction(Ts... ts) return !requires { (... - ts); }; } -constexpr struct zero_Bq final : absolute_point_origin> { +inline constexpr struct zero_Bq final : absolute_point_origin> { } zero_Bq; static_assert(invalid_addition(zero_Bq + 5 * isq::activity[Bq], 5 * isq::frequency[Hz])); diff --git a/test/static/quantity_spec_test.cpp b/test/static/quantity_spec_test.cpp index 8b5dc990..ee4e86a8 100644 --- a/test/static/quantity_spec_test.cpp +++ b/test/static/quantity_spec_test.cpp @@ -37,22 +37,22 @@ using dimensionless_ = struct dimensionless; using dim_one_ = struct dimension_one; // clang-format off -constexpr struct dim_length_ final : base_dimension<"L"> {} dim_length; -constexpr struct dim_mass_ final : base_dimension<"M"> {} dim_mass; -constexpr struct dim_time_ final : base_dimension<"T"> {} dim_time; +inline constexpr struct dim_length_ final : base_dimension<"L"> {} dim_length; +inline constexpr struct dim_mass_ final : base_dimension<"M"> {} dim_mass; +inline constexpr struct dim_time_ final : base_dimension<"T"> {} dim_time; // quantities specification QUANTITY_SPEC_(length, dim_length); QUANTITY_SPEC_(mass, dim_mass); QUANTITY_SPEC_(time, dim_time); -constexpr struct second_ final : named_unit<"s", kind_of

3 Introduction [intro]

3.2 Library-wide requirements [requirements]

3.2.1 Library contents [contents]

Whenever a name is qualified with X​::​, ​::​X​::​ is meant.
[ Example
:
When std​::​Y is mentioned, ​::​std​::​Y is meant.
— end example
 ]
\ No newline at end of file diff --git a/docs/api/gen/expanded.css b/docs/api/gen/expanded.css new file mode 100644 index 00000000..f4f3bf47 --- /dev/null +++ b/docs/api/gen/expanded.css @@ -0,0 +1,8 @@ +div.example { display: inline; } +div.note { display: inline; } + +div.exampleBody { display: inline; } +div.noteBody { display: inline; } + +a.example_link { text-decoration: none; color: inherit; } +a.note_link { text-decoration: none; color: inherit; } diff --git a/docs/api/gen/fig.html b/docs/api/gen/fig.html new file mode 100644 index 00000000..d9944ece --- /dev/null +++ b/docs/api/gen/fig.html @@ -0,0 +1 @@ +JEGP Library: Figures

List of Figures [fig]

\ No newline at end of file diff --git a/docs/api/gen/footnotes.html b/docs/api/gen/footnotes.html new file mode 100644 index 00000000..2093d27f --- /dev/null +++ b/docs/api/gen/footnotes.html @@ -0,0 +1 @@ +JEGP Library: Footnotes

List of Footnotes

\ No newline at end of file diff --git a/docs/api/gen/full.html b/docs/api/gen/full.html new file mode 100644 index 00000000..ea9d8c37 --- /dev/null +++ b/docs/api/gen/full.html @@ -0,0 +1,476 @@ + + + + + JEGP Library + + + + + + + + +
+
+

1 Scope [scope]

+
+ +
# +
+
This document describes the contents of the JEGP library.
+
+
+
+

2 References [refs]

+
+ +
# +
+
The following documents are referred to in the text + in such a way that some or all of their content + constitutes requirements of this document.
+
    +
  • + +
    ISO/IEC 14882:2020, Programming + Languages — C++
    +
  • +
+
+
+ +
# +
+
ISO/IEC 14882 is herein called the C++ Standard.
+
+
+
+

3 Introduction [intro] +

+
+

3.1 General [intro.general]

+
+ +
# +
+
The library specification subsumes the C++ Standard's [library], + assumingly amended to the context of this library.
+
[ Example +
: +
    +
  • +
    Per C++ Standard's [namespace.future], ​::​jegp2 is reserved.
    +
  • +
  • +
    Per C++ Standard's [contents]#3, a name x means + ​::​jegp​::​x. +
    +
  • +
— end example +
 ] +
+
+ The following subclauses describe additions to it.
+
Table 1: Library + categories   [tab:library.categories]
+ + + + + + + + + +
+
Clause
+
+
Category
+
+ + +
General utilities library
+
+
+
+
+
+

3.2 Library-wide requirements [requirements]

+
+

3.2.1 Library contents [contents]

+
+ +
# +
+
Whenever a name is qualified with X​::​, ​::​X​::​ is + meant.
+
[ Example +
: +
When std​::​Y is mentioned, ​::​std​::​Y is meant.
— end example +
 ] +
+
+
+
+

3.2.2 Reserved names [reserved.names]

+
+ +
# +
+
The JEGP library reserves macro names starting with + JEGP_­. +
+
+
+
+
+
+

4 General utilities library [utilities]

+
+

4.1 General [utilities.general]

+
+ +
# +
+
This clause describes generally useful utilities.
+
These utilities are summarized in Table 2. +
+
Table 2: General + utilities library summary   [tab:utilities.summary]
+ + + + + + + + + + + +
+
Subclause
+
+
Header
+
+ + +
Utility components
+
+
<jegp/utility.hpp>
+
+
+
+
+
+

4.2 Utility components [utility]

+
+

4.2.1 Header <jegp/utility.hpp> synopsis [utility.syn]

+
+ +
# +
+
The header <jegp/utility.hpp> + contains some basic constructs.
+
+namespace jegp
+{
+// [utility.underlying], underlying
+template <class Enum>
+constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept;
+
+// [static.downcast], static_­downcast
+template <class DerivedRef, class Base>
+constexpr DerivedRef static_downcast(Base&& base) noexcept;
+
+// [hash.combine], hash_­combine
+template <class... Args>
+constexpr std::size_t hash_combine(const Args&... args) noexcept(see below);
+
+} // namespace jegp
+
+
+
+
+

4.2.2 underlying [utility.underlying]

+
+ + template <class Enum> +constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept; + +
+
+
+ +
+
# +
+
Constraints: + std​::​is_­enum_­v<Enum> is true. +
+
+
+
+ +
+
# +
+
Returns: + static_­cast<std​::​underlying_­type_­t<Enum>>(e). +
+
+
+
+
+

4.2.3 static_­downcast [static.downcast]

+
+ +
# +
+
A static_­cast that performs a downcast.
+
+
+ template <class DerivedRef, class Base> +constexpr DerivedRef static_downcast(Base&& base) noexcept; + +
+
+
+ +
+
# +
+
Let derived-ref be + static_­cast<DerivedRef>(std​::​forward<Base>(base)). +
+
+
+
+ +
+
# +
+
Constraints: +
    +
  • + DerivedRef is a reference + type, +
  • +
  • + std​::​remove_­cvref_­t<DerivedRef> is + derived from + std​::​remove_­cvref_­t<Base>, and +
  • +
  • + derived-ref is well-formed. +
  • +
+
+
+
+
+ +
+
# +
+
Preconditions: + derived-ref has well-defined behavior. +
+
+
+
+ +
+
# +
+
Returns: + derived-ref. +
+
+
+
+
+

4.2.4 hash_­combine [hash.combine]

+
+ +
# +
+
Insipred by Boost.ContainerHash.
+
Useful in the specializations of std​::​hash + whose Key's salient parts consist of two or more objects.
+
+
+ template <class... Args> +constexpr std::size_t hash_combine(const Args&... args) noexcept(see below); + +
+
+
+ +
+
# +
+
Constraints: +
    +
  • + + and +
  • +
  • + std​::​hash<T> is enabled (C++ Standard's [unord.hash]) + for all T in Args. +
  • +
+
+
+
+
+ +
+
# +
+
Effects: + Equivalent to: +
+std::size_t seed{0};
+return (..., (seed ^= std::hash<Args>{}(args) + (seed << 6) + (seed >> 2)));
+
+
+
+
+
+ +
+
# +
+
Remarks: + The expression inside noexcept is equivalent to +
+(noexcept(std::hash<Args>{}(args)) && ...)
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/api/gen/generalindex.html b/docs/api/gen/generalindex.html new file mode 100644 index 00000000..80dbbf87 --- /dev/null +++ b/docs/api/gen/generalindex.html @@ -0,0 +1 @@ +JEGP Library: Index

Index

C++ Standard, [refs]
JEGP library, [scope]
<jegp/utility.hpp>, [utility.syn]
\ No newline at end of file diff --git a/docs/api/gen/hash.combine.html b/docs/api/gen/hash.combine.html new file mode 100644 index 00000000..b89b054a --- /dev/null +++ b/docs/api/gen/hash.combine.html @@ -0,0 +1,15 @@ +[hash.combine]

4 General utilities library [utilities]

4.2 Utility components [utility]

4.2.4 hash_­combine [hash.combine]

Insipred by Boost.ContainerHash.
Useful in the specializations of std​::​hash +whose Key's salient parts consist of two or more objects.
template <class... Args> +constexpr std::size_t hash_combine(const Args&... args) noexcept(see below); +
Constraints: +
Effects: +Equivalent to: +
+std::size_t seed{0};
+return (..., (seed ^= std::hash<Args>{}(args) + (seed << 6) + (seed >> 2)));
+
Remarks: +The expression inside noexcept is equivalent to +
+(noexcept(std::hash<Args>{}(args)) && ...)
+
\ No newline at end of file diff --git a/docs/api/gen/headerindex.html b/docs/api/gen/headerindex.html new file mode 100644 index 00000000..e7955fb8 --- /dev/null +++ b/docs/api/gen/headerindex.html @@ -0,0 +1 @@ +JEGP Library: Index of library headers

Index of library headers

<jegp/utility.hpp>, [utility.syn]
\ No newline at end of file diff --git a/docs/api/gen/icon.png b/docs/api/gen/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3acaef02536a9ff1d816c3971c3fd2a580bab333 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7Sc;uILpV4%IBGajIv5xj zI14-?iy0XBd>I({<}lv-HYc2cfkDmF#WBR9H#tFqHH7{D!WkKrYF@c1E=DtTD!XDE i_+H4fEpFgqV3-rb#gO7ZuZn?zfx*+&&t;ucLK6Tl(jbBW literal 0 HcmV?d00001 diff --git a/docs/api/gen/index.html b/docs/api/gen/index.html new file mode 100644 index 00000000..e0fe1140 --- /dev/null +++ b/docs/api/gen/index.html @@ -0,0 +1,9 @@ +JEGP Library: Contents

JEGP Library


(Generated on 2020-05-20 from the LaTeX sources by cxxdraft-htmlgen.)

Contents

2 References [refs][refs]

3 Introduction [intro][intro]

3.2 Library-wide requirements [requirements]

3.2.1 Library contents [contents]

3.2.2 Reserved names [reserved.names]

4 General utilities library [utilities][utilities]

4.2 Utility components [utility]

4.2.1 Header <jegp/utility.hpp> synopsis [utility.syn]

4.2.3 static_­downcast [static.downcast]

4.2.4 hash_­combine [hash.combine]

Index

Index of library headers

Index of library names

\ No newline at end of file diff --git a/docs/api/gen/intro.general.html b/docs/api/gen/intro.general.html new file mode 100644 index 00000000..741e9c9e --- /dev/null +++ b/docs/api/gen/intro.general.html @@ -0,0 +1,3 @@ +[intro.general]

3 Introduction [intro]

3.1 General [intro.general]

The library specification subsumes the C++ Standard's [library], +assumingly amended to the context of this library.
[ Example
: — end example
 ]
+The following subclauses describe additions to it.
Table 1: Library categories   [tab:library.categories]
Clause
Category
General utilities library
\ No newline at end of file diff --git a/docs/api/gen/intro.html b/docs/api/gen/intro.html new file mode 100644 index 00000000..e4025a2a --- /dev/null +++ b/docs/api/gen/intro.html @@ -0,0 +1,3 @@ +[intro]

3 Introduction [intro]

3.1 General [intro.general]

The library specification subsumes the C++ Standard's [library], +assumingly amended to the context of this library.
[ Example
: — end example
 ]
+The following subclauses describe additions to it.
Table 1: Library categories   [tab:library.categories]
Clause
Category
General utilities library

3.2 Library-wide requirements [requirements]

3.2.1 Library contents [contents]

Whenever a name is qualified with X​::​, ​::​X​::​ is meant.
[ Example
:
When std​::​Y is mentioned, ​::​std​::​Y is meant.
— end example
 ]

3.2.2 Reserved names [reserved.names]

The JEGP library reserves macro names starting with JEGP_­.
\ No newline at end of file diff --git a/docs/api/gen/jegp.pdf b/docs/api/gen/jegp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aca4b6c4fdc8d599a0129719f0785d8912f718fd GIT binary patch literal 290778 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 z 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š&4dR`cP-dL8E4nYdWEj9 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 literal 0 HcmV?d00001 diff --git a/docs/api/gen/libraryindex.html b/docs/api/gen/libraryindex.html new file mode 100644 index 00000000..d0db186a --- /dev/null +++ b/docs/api/gen/libraryindex.html @@ -0,0 +1 @@ +JEGP Library: Index of library names \ No newline at end of file diff --git a/docs/api/gen/refs.html b/docs/api/gen/refs.html new file mode 100644 index 00000000..d2f2ab8d --- /dev/null +++ b/docs/api/gen/refs.html @@ -0,0 +1,3 @@ +[refs]

2 References [refs]

The following documents are referred to in the text +in such a way that some or all of their content +constitutes requirements of this document.
  • ISO/IEC 14882:2020, Programming Languages — C++
ISO/IEC 14882 is herein called the C++ Standard.
\ No newline at end of file diff --git a/docs/api/gen/requirements.html b/docs/api/gen/requirements.html new file mode 100644 index 00000000..f63e9968 --- /dev/null +++ b/docs/api/gen/requirements.html @@ -0,0 +1 @@ +[requirements]

3 Introduction [intro]

3.2 Library-wide requirements [requirements]

3.2.1 Library contents [contents]

Whenever a name is qualified with X​::​, ​::​X​::​ is meant.
[ Example
:
When std​::​Y is mentioned, ​::​std​::​Y is meant.
— end example
 ]

3.2.2 Reserved names [reserved.names]

The JEGP library reserves macro names starting with JEGP_­.
\ No newline at end of file diff --git a/docs/api/gen/reserved.names.html b/docs/api/gen/reserved.names.html new file mode 100644 index 00000000..dbb2ae4c --- /dev/null +++ b/docs/api/gen/reserved.names.html @@ -0,0 +1 @@ +[reserved.names]

3 Introduction [intro]

3.2 Library-wide requirements [requirements]

3.2.2 Reserved names [reserved.names]

The JEGP library reserves macro names starting with JEGP_­.
\ No newline at end of file diff --git a/docs/api/gen/scope.html b/docs/api/gen/scope.html new file mode 100644 index 00000000..0df45c8f --- /dev/null +++ b/docs/api/gen/scope.html @@ -0,0 +1 @@ +[scope]

1 Scope [scope]

This document describes the contents of the JEGP library.
\ No newline at end of file diff --git a/docs/api/gen/static.downcast.html b/docs/api/gen/static.downcast.html new file mode 100644 index 00000000..6d2c8f47 --- /dev/null +++ b/docs/api/gen/static.downcast.html @@ -0,0 +1,8 @@ +[static.downcast]

4 General utilities library [utilities]

4.2 Utility components [utility]

4.2.3 static_­downcast [static.downcast]

A static_­cast that performs a downcast.
template <class DerivedRef, class Base> +constexpr DerivedRef static_downcast(Base&& base) noexcept; +
Let derived-ref be +static_­cast<DerivedRef>(std​::​forward<Base>(base)).
Constraints: +
  • DerivedRef is a reference type,
  • std​::​remove_­cvref_­t<DerivedRef> is derived from + std​::​remove_­cvref_­t<Base>, and
  • derived-ref is well-formed.
Preconditions: +derived-ref has well-defined behavior.
Returns: +derived-ref.
\ No newline at end of file diff --git a/docs/api/gen/tab.html b/docs/api/gen/tab.html new file mode 100644 index 00000000..128feff8 --- /dev/null +++ b/docs/api/gen/tab.html @@ -0,0 +1 @@ +JEGP Library: Tables

List of Tables [tab]


3.1 General [intro.general]

Table 1: Library categories   [tab:library.categories]
Clause
Category
General utilities library

4.1 General [utilities.general]

Table 2: General utilities library summary   [tab:utilities.summary]
Subclause
Header
Utility components
<jegp/utility.hpp>
\ No newline at end of file diff --git a/docs/api/gen/utilities.general.html b/docs/api/gen/utilities.general.html new file mode 100644 index 00000000..de8d14b6 --- /dev/null +++ b/docs/api/gen/utilities.general.html @@ -0,0 +1 @@ +[utilities.general]

4 General utilities library [utilities]

4.1 General [utilities.general]

This clause describes generally useful utilities.
These utilities are summarized in Table 2.
Table 2: General utilities library summary   [tab:utilities.summary]
Subclause
Header
Utility components
<jegp/utility.hpp>
\ No newline at end of file diff --git a/docs/api/gen/utilities.html b/docs/api/gen/utilities.html new file mode 100644 index 00000000..3212627c --- /dev/null +++ b/docs/api/gen/utilities.html @@ -0,0 +1,43 @@ +[utilities]

4 General utilities library [utilities]

4.1 General [utilities.general]

This clause describes generally useful utilities.
These utilities are summarized in Table 2.
Table 2: General utilities library summary   [tab:utilities.summary]
Subclause
Header
Utility components
<jegp/utility.hpp>

4.2 Utility components [utility]

4.2.1 Header <jegp/utility.hpp> synopsis [utility.syn]

The header <jegp/utility.hpp> +contains some basic constructs.
+namespace jegp
+{
+// [utility.underlying], underlying
+template <class Enum>
+constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept;
+
+// [static.downcast], static_­downcast
+template <class DerivedRef, class Base>
+constexpr DerivedRef static_downcast(Base&& base) noexcept;
+
+// [hash.combine], hash_­combine
+template <class... Args>
+constexpr std::size_t hash_combine(const Args&... args) noexcept(see below);
+
+} // namespace jegp
+

4.2.2 underlying [utility.underlying]

template <class Enum> +constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept; +
Constraints: +std​::​is_­enum_­v<Enum> is true.
Returns: +static_­cast<std​::​underlying_­type_­t<Enum>>(e).

4.2.3 static_­downcast [static.downcast]

A static_­cast that performs a downcast.
template <class DerivedRef, class Base> +constexpr DerivedRef static_downcast(Base&& base) noexcept; +
Let derived-ref be +static_­cast<DerivedRef>(std​::​forward<Base>(base)).
Constraints: +
  • DerivedRef is a reference type,
  • std​::​remove_­cvref_­t<DerivedRef> is derived from + std​::​remove_­cvref_­t<Base>, and
  • derived-ref is well-formed.
Preconditions: +derived-ref has well-defined behavior.
Returns: +derived-ref.

4.2.4 hash_­combine [hash.combine]

Insipred by Boost.ContainerHash.
Useful in the specializations of std​::​hash +whose Key's salient parts consist of two or more objects.
template <class... Args> +constexpr std::size_t hash_combine(const Args&... args) noexcept(see below); +
Constraints: +
Effects: +Equivalent to: +
+std::size_t seed{0};
+return (..., (seed ^= std::hash<Args>{}(args) + (seed << 6) + (seed >> 2)));
+
Remarks: +The expression inside noexcept is equivalent to +
+(noexcept(std::hash<Args>{}(args)) && ...)
+
\ No newline at end of file diff --git a/docs/api/gen/utility.html b/docs/api/gen/utility.html new file mode 100644 index 00000000..41ec9542 --- /dev/null +++ b/docs/api/gen/utility.html @@ -0,0 +1,43 @@ +[utility]

4 General utilities library [utilities]

4.2 Utility components [utility]

4.2.1 Header <jegp/utility.hpp> synopsis [utility.syn]

The header <jegp/utility.hpp> +contains some basic constructs.
+namespace jegp
+{
+// [utility.underlying], underlying
+template <class Enum>
+constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept;
+
+// [static.downcast], static_­downcast
+template <class DerivedRef, class Base>
+constexpr DerivedRef static_downcast(Base&& base) noexcept;
+
+// [hash.combine], hash_­combine
+template <class... Args>
+constexpr std::size_t hash_combine(const Args&... args) noexcept(see below);
+
+} // namespace jegp
+

4.2.2 underlying [utility.underlying]

template <class Enum> +constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept; +
Constraints: +std​::​is_­enum_­v<Enum> is true.
Returns: +static_­cast<std​::​underlying_­type_­t<Enum>>(e).

4.2.3 static_­downcast [static.downcast]

A static_­cast that performs a downcast.
template <class DerivedRef, class Base> +constexpr DerivedRef static_downcast(Base&& base) noexcept; +
Let derived-ref be +static_­cast<DerivedRef>(std​::​forward<Base>(base)).
Constraints: +
  • DerivedRef is a reference type,
  • std​::​remove_­cvref_­t<DerivedRef> is derived from + std​::​remove_­cvref_­t<Base>, and
  • derived-ref is well-formed.
Preconditions: +derived-ref has well-defined behavior.
Returns: +derived-ref.

4.2.4 hash_­combine [hash.combine]

Insipred by Boost.ContainerHash.
Useful in the specializations of std​::​hash +whose Key's salient parts consist of two or more objects.
template <class... Args> +constexpr std::size_t hash_combine(const Args&... args) noexcept(see below); +
Constraints: +
Effects: +Equivalent to: +
+std::size_t seed{0};
+return (..., (seed ^= std::hash<Args>{}(args) + (seed << 6) + (seed >> 2)));
+
Remarks: +The expression inside noexcept is equivalent to +
+(noexcept(std::hash<Args>{}(args)) && ...)
+
\ No newline at end of file diff --git a/docs/api/gen/utility.syn.html b/docs/api/gen/utility.syn.html new file mode 100644 index 00000000..681cf352 --- /dev/null +++ b/docs/api/gen/utility.syn.html @@ -0,0 +1,18 @@ +[utility.syn]

4 General utilities library [utilities]

4.2 Utility components [utility]

4.2.1 Header <jegp/utility.hpp> synopsis [utility.syn]

The header <jegp/utility.hpp> +contains some basic constructs.
+namespace jegp
+{
+// [utility.underlying], underlying
+template <class Enum>
+constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept;
+
+// [static.downcast], static_­downcast
+template <class DerivedRef, class Base>
+constexpr DerivedRef static_downcast(Base&& base) noexcept;
+
+// [hash.combine], hash_­combine
+template <class... Args>
+constexpr std::size_t hash_combine(const Args&... args) noexcept(see below);
+
+} // namespace jegp
+
\ No newline at end of file diff --git a/docs/api/gen/utility.underlying.html b/docs/api/gen/utility.underlying.html new file mode 100644 index 00000000..999c3299 --- /dev/null +++ b/docs/api/gen/utility.underlying.html @@ -0,0 +1,5 @@ +[utility.underlying]

4 General utilities library [utilities]

4.2 Utility components [utility]

4.2.2 underlying [utility.underlying]

template <class Enum> +constexpr std::underlying_type_t<Enum> underlying(Enum e) noexcept; +
Constraints: +std​::​is_­enum_­v<Enum> is true.
Returns: +static_­cast<std​::​underlying_­type_­t<Enum>>(e).
\ No newline at end of file diff --git a/docs/javascripts/iframeResizer.contentWindow.min.js b/docs/javascripts/iframeResizer.contentWindow.min.js new file mode 100644 index 00000000..3961366c --- /dev/null +++ b/docs/javascripts/iframeResizer.contentWindow.min.js @@ -0,0 +1,9 @@ +/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v4.3.9 - 2023-11-10 + * Desc: Include this file in any page being loaded into an iframe + * to force the iframe to resize to the content size. + * Requires: iframeResizer.min.js on host page. + * Copyright: (c) 2023 David J. Bradshaw - dave@bradshaw.net + * License: MIT + */ +!function(a){if("undefined"!=typeof window){var r=!0,P="",u=0,c="",s=null,D="",d=!1,j={resize:1,click:1},l=128,q=!0,f=1,n="bodyOffset",m=n,H=!0,W="",h={},g=32,B=null,p=!1,v=!1,y="[iFrameSizer]",J=y.length,w="",U={max:1,min:1,bodyScroll:1,documentElementScroll:1},b="child",V=!0,X=window.parent,T="*",E=0,i=!1,Y=null,O=16,S=1,K="scroll",M=K,Q=window,G=function(){x("onMessage function not defined")},Z=function(){},$=function(){},_={height:function(){return x("Custom height calculation function not defined"),document.documentElement.offsetHeight},width:function(){return x("Custom width calculation function not defined"),document.body.scrollWidth}},ee={},te=!1;try{var ne=Object.create({},{passive:{get:function(){te=!0}}});window.addEventListener("test",ae,ne),window.removeEventListener("test",ae,ne)}catch(e){}var oe,o,I,ie,N,A,C={bodyOffset:function(){return document.body.offsetHeight+ye("marginTop")+ye("marginBottom")},offset:function(){return C.bodyOffset()},bodyScroll:function(){return document.body.scrollHeight},custom:function(){return _.height()},documentElementOffset:function(){return document.documentElement.offsetHeight},documentElementScroll:function(){return document.documentElement.scrollHeight},max:function(){return Math.max.apply(null,e(C))},min:function(){return Math.min.apply(null,e(C))},grow:function(){return C.max()},lowestElement:function(){return Math.max(C.bodyOffset()||C.documentElementOffset(),we("bottom",Te()))},taggedElement:function(){return be("bottom","data-iframe-height")}},z={bodyScroll:function(){return document.body.scrollWidth},bodyOffset:function(){return document.body.offsetWidth},custom:function(){return _.width()},documentElementScroll:function(){return document.documentElement.scrollWidth},documentElementOffset:function(){return document.documentElement.offsetWidth},scroll:function(){return Math.max(z.bodyScroll(),z.documentElementScroll())},max:function(){return Math.max.apply(null,e(z))},min:function(){return Math.min.apply(null,e(z))},rightMostElement:function(){return we("right",Te())},taggedElement:function(){return be("right","data-iframe-width")}},re=(oe=Ee,N=null,A=0,function(){var e=Date.now(),t=O-(e-(A=A||e));return o=this,I=arguments,t<=0||Ok[r]["max"+e])throw new Error("Value for min"+e+" can not be greater than max"+e)}}function h(e,n){null===i&&(i=setTimeout(function(){i=null,e()},n))}function e(){"hidden"!==document.visibilityState&&(O("document","Trigger event: Visibility change"),h(function(){b("Tab Visible","resize")},16))}function b(i,t){Object.keys(k).forEach(function(e){var n;k[n=e]&&"parent"===k[n].resizeFrom&&k[n].autoResize&&!k[n].firstRun&&A(i,t,k[e].iframe,e)})}function y(){F(window,"message",w),F(window,"resize",function(){var e;O("window","Trigger event: "+(e="resize")),h(function(){b("Window "+e,"resize")},16)}),F(document,"visibilitychange",e),F(document,"-webkit-visibilitychange",e)}function n(){function t(e,n){if(n){if(!n.tagName)throw new TypeError("Object is not a valid DOM element");if("IFRAME"!==n.tagName.toUpperCase())throw new TypeError("Expected