Files
mp-units/head/users_guide/framework_basics/design_overview/index.html
T

2733 lines
92 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="The quantities and units library for C++">
<meta name="author" content="mp-units Team">
<link rel="canonical" href="https://mpusz.github.io/mp-units/head/users_guide/framework_basics/design_overview/">
<link rel="prev" href="../interface_introduction/">
<link rel="next" href="../systems_of_quantities/">
<link rel="alternate" type="application/rss+xml" title="RSS feed" href="../../../feed_rss_created.xml">
<link rel="alternate" type="application/rss+xml" title="RSS feed of updated content" href="../../../feed_rss_updated.xml">
<link rel="icon" href="../../../assets/images/mp-units-color.svg">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
<title>Design Overview - mp-units</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.0253249f.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../../stylesheets/extra.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="Design Overview - mp-units" >
<meta property="og:description" content="The quantities and units library for C++" >
<meta property="og:image" content="https://mpusz.github.io/mp-units/head/assets/images/social/users_guide/framework_basics/design_overview.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://mpusz.github.io/mp-units/head/users_guide/framework_basics/design_overview/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Design Overview - mp-units" >
<meta name="twitter:description" content="The quantities and units library for C++" >
<meta name="twitter:image" content="https://mpusz.github.io/mp-units/head/assets/images/social/users_guide/framework_basics/design_overview.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#design-overview" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
<aside class="md-banner md-banner--warning">
<div class="md-banner__inner md-grid md-typeset">
You're not viewing the latest version.
<a href="../../../..">
<strong>Click here to go to latest.</strong>
</a>
</div>
<script>var el=document.querySelector("[data-md-component=outdated]"),outdated=__md_get("__outdated",sessionStorage);!0===outdated&&el&&(el.hidden=!1)</script>
</aside>
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="mp-units" class="md-header__button md-logo" aria-label="mp-units" data-md-component="logo">
<img src="../../../assets/images/mp-units-transparent-white.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
mp-units
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Design Overview
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1M8 13h8v-2H8zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4a5 5 0 0 0 5-5 5 5 0 0 0-5-5"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="custom" aria-label="Switch to system preference" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/mpusz/mp-units" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
mpusz/mp-units
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../../getting_started/introduction/" class="md-tabs__link">
Getting Started
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../terms_and_definitions/" class="md-tabs__link">
User's Guide
</a>
</li>
<li class="md-tabs__item">
<a href="../../../api_reference/" class="md-tabs__link">
API Reference
</a>
</li>
<li class="md-tabs__item">
<a href="../../../blog/" class="md-tabs__link">
Blog
</a>
</li>
<li class="md-tabs__item">
<a href="../../../release_notes/" class="md-tabs__link">
Release Notes
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted md-nav--integrated" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="mp-units" class="md-nav__button md-logo" aria-label="mp-units" data-md-component="logo">
<img src="../../../assets/images/mp-units-transparent-white.svg" alt="logo">
</a>
mp-units
</label>
<div class="md-nav__source">
<a href="https://github.com/mpusz/mp-units" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
mpusz/mp-units
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
Getting Started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../getting_started/introduction/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/quick_start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/look_and_feel/" class="md-nav__link">
<span class="md-ellipsis">
Look and Feel
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/project_structure/" class="md-nav__link">
<span class="md-ellipsis">
Project Structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/cpp_compiler_support/" class="md-nav__link">
<span class="md-ellipsis">
C++ compiler support (API/ABI)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/installation_and_usage/" class="md-nav__link">
<span class="md-ellipsis">
Installation and Usage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/contributing/" class="md-nav__link">
<span class="md-ellipsis">
Contributing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../getting_started/faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
User's Guide
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
User's Guide
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../terms_and_definitions/" class="md-nav__link">
<span class="md-ellipsis">
Terms and Definitions
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" checked>
<label class="md-nav__link" for="__nav_3_2" id="__nav_3_2_label" tabindex="0">
<span class="md-ellipsis">
Framework Basics
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Framework Basics
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../interface_introduction/" class="md-nav__link">
<span class="md-ellipsis">
Interface Introduction
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Design Overview
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Design Overview
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#dimension" class="md-nav__link">
<span class="md-ellipsis">
Dimension
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#quantity-character" class="md-nav__link">
<span class="md-ellipsis">
Quantity character
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#quantity-specification" class="md-nav__link">
<span class="md-ellipsis">
Quantity specification
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unit" class="md-nav__link">
<span class="md-ellipsis">
Unit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#quantity-reference" class="md-nav__link">
<span class="md-ellipsis">
Quantity reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#quantity-representation" class="md-nav__link">
<span class="md-ellipsis">
Quantity representation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#quantity" class="md-nav__link">
<span class="md-ellipsis">
Quantity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#point-origin" class="md-nav__link">
<span class="md-ellipsis">
Point origin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#quantity-point" class="md-nav__link">
<span class="md-ellipsis">
Quantity point
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../systems_of_quantities/" class="md-nav__link">
<span class="md-ellipsis">
Systems of Quantities
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../systems_of_units/" class="md-nav__link">
<span class="md-ellipsis">
Systems of Units
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../simple_and_typed_quantities/" class="md-nav__link">
<span class="md-ellipsis">
Simple and Typed Quantities
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../value_conversions/" class="md-nav__link">
<span class="md-ellipsis">
Value Conversions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../character_of_a_quantity/" class="md-nav__link">
<span class="md-ellipsis">
Character of a Quantity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../dimensionless_quantities/" class="md-nav__link">
<span class="md-ellipsis">
Dimensionless Quantities
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../quantity_arithmetics/" class="md-nav__link">
<span class="md-ellipsis">
Quantity Arithmetics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../generic_interfaces/" class="md-nav__link">
<span class="md-ellipsis">
Generic Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../faster_than_lightspeed_constants/" class="md-nav__link">
<span class="md-ellipsis">
Faster-than-lightspeed Constants
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../the_affine_space/" class="md-nav__link">
<span class="md-ellipsis">
The Affine Space
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../obtaining_metadata/" class="md-nav__link">
<span class="md-ellipsis">
Obtaining Metadata
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../concepts/" class="md-nav__link">
<span class="md-ellipsis">
Concepts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../text_output/" class="md-nav__link">
<span class="md-ellipsis">
Text Output
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" >
<label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0">
<span class="md-ellipsis">
Systems
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Systems
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../systems/introduction/" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../systems/isq/" class="md-nav__link">
<span class="md-ellipsis">
International System of Quantities (ISQ)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../systems/si/" class="md-nav__link">
<span class="md-ellipsis">
International System of Units (SI)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../systems/strong_angular_system/" class="md-nav__link">
<span class="md-ellipsis">
Strong Angular System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../systems/natural_units/" class="md-nav__link">
<span class="md-ellipsis">
Natural Units
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_4" >
<label class="md-nav__link" for="__nav_3_4" id="__nav_3_4_label" tabindex="0">
<span class="md-ellipsis">
Use Cases
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_4">
<span class="md-nav__icon md-icon"></span>
Use Cases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../use_cases/pure_dimensional_analysis/" class="md-nav__link">
<span class="md-ellipsis">
Pure Dimensional Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../use_cases/working_with_legacy_interfaces/" class="md-nav__link">
<span class="md-ellipsis">
Working with Legacy Interfaces
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../use_cases/using_custom_representation_types/" class="md-nav__link">
<span class="md-ellipsis">
Using Custom Representation Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../use_cases/interoperability_with_other_libraries/" class="md-nav__link">
<span class="md-ellipsis">
Interoperability with Other Libraries
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../use_cases/extending_the_library/" class="md-nav__link">
<span class="md-ellipsis">
Extending the Library
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../use_cases/wide_compatibility/" class="md-nav__link">
<span class="md-ellipsis">
Wide Compatibility
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_5" >
<label class="md-nav__link" for="__nav_3_5" id="__nav_3_5_label" tabindex="0">
<span class="md-ellipsis">
Examples
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_5">
<span class="md-nav__icon md-icon"></span>
Examples
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../examples/tags_index/" class="md-nav__link">
<span class="md-ellipsis">
Tags Index
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_5_2" >
<label class="md-nav__link" for="__nav_3_5_2" id="__nav_3_5_2_label" tabindex="0">
<span class="md-ellipsis">
All Examples
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_5_2">
<span class="md-nav__icon md-icon"></span>
All Examples
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../examples/hello_units/" class="md-nav__link">
<span class="md-ellipsis">
hello_units
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../examples/avg_speed/" class="md-nav__link">
<span class="md-ellipsis">
avg_speed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../examples/si_constants/" class="md-nav__link">
<span class="md-ellipsis">
si_constants
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../examples/hw_voltage/" class="md-nav__link">
<span class="md-ellipsis">
hw_voltage
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_6" >
<label class="md-nav__link" for="__nav_3_6" id="__nav_3_6_label" tabindex="0">
<span class="md-ellipsis">
Appendix
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_6">
<span class="md-nav__icon md-icon"></span>
Appendix
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../appendix/glossary/" class="md-nav__link">
<span class="md-ellipsis">
Glossary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../appendix/references/" class="md-nav__link">
<span class="md-ellipsis">
References
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../../api_reference/" class="md-nav__link">
<span class="md-ellipsis">
API Reference
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<div class="md-nav__link md-nav__container">
<a href="../../../blog/" class="md-nav__link ">
<span class="md-ellipsis">
Blog
</span>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Blog
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-ellipsis">
Archive
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Archive
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../blog/archive/2024/" class="md-nav__link">
<span class="md-ellipsis">
2024
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../blog/archive/2023/" class="md-nav__link">
<span class="md-ellipsis">
2023
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_3" >
<label class="md-nav__link" for="__nav_5_3" id="__nav_5_3_label" tabindex="0">
<span class="md-ellipsis">
Categories
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_3">
<span class="md-nav__icon md-icon"></span>
Categories
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../blog/category/metrology/" class="md-nav__link">
<span class="md-ellipsis">
Metrology
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../blog/category/releases/" class="md-nav__link">
<span class="md-ellipsis">
Releases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../blog/category/wg21-updates/" class="md-nav__link">
<span class="md-ellipsis">
WG21 Updates
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../../release_notes/" class="md-nav__link">
<span class="md-ellipsis">
Release Notes
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/mpusz/mp-units/edit/master/docs/users_guide/framework_basics/design_overview.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="https://github.com/mpusz/mp-units/raw/master/docs/users_guide/framework_basics/design_overview.md" title="View source of this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<h1 id="design-overview">Design Overview<a class="headerlink" href="#design-overview" title="Permanent link">&para;</a></h1>
<p>The most important entities in the <strong>mp-units</strong> library are:</p>
<ul>
<li><a href="#quantity">quantity</a>,</li>
<li><a href="#quantity-point">quantity point</a>,</li>
<li><a href="#unit">unit</a>,</li>
<li><a href="#dimension">dimension</a>,</li>
<li><a href="#quantity-specification">quantity specification</a></li>
<li><a href="#quantity-reference">quantity reference</a>,</li>
<li><a href="#quantity-representation">quantity representation</a>.</li>
</ul>
<p>The graph provided below presents how those and a few other entities depend on each other:</p>
<pre class="mermaid"><code>flowchart TD
Unit --- Reference
Dimension --- QuantitySpec["Quantity specification"]
quantity_character["Quantity character"] --- QuantitySpec
QuantitySpec --- Reference["Quantity reference"]
Reference --- Quantity
quantity_character -.- Representation
Representation --- Quantity
Quantity --- QuantityPoint["Quantity point"]
PointOrigin["Point origin"] --- QuantityPoint
click Dimension "#dimension"
click quantity_character "#quantity-character"
click QuantitySpec "#quantity-specification"
click Unit "#unit"
click Reference "#quantity-reference"
click Representation "#quantity-representation"
click Quantity "#quantity"
click PointOrigin "#point-origin"
click QuantityPoint "#quantity-point"</code></pre>
<h2 id="dimension">Dimension<a class="headerlink" href="#dimension" title="Permanent link">&para;</a></h2>
<p><a href="../../../appendix/glossary/#dimension">Dimension</a> specifies the dependence of a quantity on the base
quantities of a particular system of quantities. It is represented as a product of powers of factors
corresponding to the base quantities, omitting any numerical factor.</p>
<p>In the <strong>mp-units</strong> library, we use the terms:</p>
<ul>
<li><strong>base dimension</strong> to refer to the dimension of a <a href="../../../appendix/glossary/#base-quantity">base quantity</a>,</li>
<li><strong>derived dimension</strong> to refer to the dimension of a <a href="../../../appendix/glossary/#derived-quantity">derived quantity</a>.</li>
</ul>
<p>For example:</p>
<ul>
<li><em>length</em> (<span class="arithmatex">\(\mathsf{L}\)</span>), <em>mass</em> (<span class="arithmatex">\(\mathsf{M}\)</span>), <em>time</em> (<span class="arithmatex">\(\mathsf{T}\)</span>), <em>electric current</em> (<span class="arithmatex">\(\mathsf{I}\)</span>),
<em>thermodynamic temperature</em> (<span class="arithmatex">\(\mathsf{Θ}\)</span>), <em>amount of substance</em> (<span class="arithmatex">\(\mathsf{N}\)</span>), and
<em>luminous intensity</em> (<span class="arithmatex">\(\mathsf{J}\)</span>) are the base dimensions of the <a href="../../../appendix/glossary/#isq">ISQ</a>.</li>
<li>A derived dimension of <em>force</em> in the <a href="../../../appendix/glossary/#isq">ISQ</a> is denoted by
<span class="arithmatex">\(\textsf{dim }F = \mathsf{LMT}^{–2}\)</span>.</li>
<li>The implementation of IEC 80000 in this library provides <code>iec::dim_traffic_intensity</code>
base dimension to extend ISQ with strong information technology quantities.</li>
</ul>
<p><a href="../../../appendix/glossary/#base-dimension">Base dimensions</a> can be defined by the user in
the following way:</p>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">dim_length</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">base_dimension</span><span class="o">&lt;</span><span class="s">&quot;L&quot;</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">dim_length</span><span class="p">;</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">dim_time</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">base_dimension</span><span class="o">&lt;</span><span class="s">&quot;T&quot;</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">dim_time</span><span class="p">;</span>
</span></code></pre></div>
<p><a href="../../../appendix/glossary/#derived-dimension">Derived dimensions</a> are implicitly created
by the library's framework based on the <a href="../../../appendix/glossary/#quantity-equation">quantity equation</a>
provided in the <a href="../../../appendix/glossary/#quantity_spec">quantity specification</a>:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="1:3"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">C++23</label><label for="__tabbed_1_2">C++20</label><label for="__tabbed_1_3">Portable</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">length</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">dim_length</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">length</span><span class="p">;</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">time</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">dim_time</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">time</span><span class="p">;</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">speed</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">speed</span><span class="p">;</span>
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="k">static_assert</span><span class="p">(</span><span class="n">speed</span><span class="p">.</span><span class="n">dimension</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">dim_length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">dim_time</span><span class="p">);</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">length</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">length</span><span class="p">,</span><span class="w"> </span><span class="n">dim_length</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">length</span><span class="p">;</span>
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">time</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">time</span><span class="p">,</span><span class="w"> </span><span class="n">dim_time</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">time</span><span class="p">;</span>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">speed</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">speed</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">speed</span><span class="p">;</span>
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="k">static_assert</span><span class="p">(</span><span class="n">speed</span><span class="p">.</span><span class="n">dimension</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">dim_length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">dim_time</span><span class="p">);</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="n">QUANTITY_SPEC</span><span class="p">(</span><span class="n">length</span><span class="p">,</span><span class="w"> </span><span class="n">dim_length</span><span class="p">);</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="n">QUANTITY_SPEC</span><span class="p">(</span><span class="n">time</span><span class="p">,</span><span class="w"> </span><span class="n">dim_time</span><span class="p">);</span>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="n">QUANTITY_SPEC</span><span class="p">(</span><span class="n">speed</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="p">);</span>
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="k">static_assert</span><span class="p">(</span><span class="n">speed</span><span class="p">.</span><span class="n">dimension</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">dim_length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">dim_time</span><span class="p">);</span>
</span></code></pre></div>
</div>
</div>
</div>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>Users should not explicitly define any derived dimensions. Those should always be implicitly
created by the framework.</p>
</div>
<p>The multiplication/division on quantity specifications also multiplies/divides their dimensions:</p>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="k">static_assert</span><span class="p">((</span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="p">).</span><span class="n">dimension</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">dim_length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">dim_time</span><span class="p">);</span>
</span></code></pre></div>
<p>The <a href="../../../appendix/glossary/#dimension-equation">dimension equation</a> of <code>isq::dim_length / isq::dim_time</code>
results in the <code>derived_dimension&lt;isq::dim_length, per&lt;isq::dim_time&gt;&gt;</code> type.</p>
<h2 id="quantity-character">Quantity character<a class="headerlink" href="#quantity-character" title="Permanent link">&para;</a></h2>
<p><a href="../../../appendix/references/#ISO80000">ISO 80000</a> explicitly states that quantities (even of the same kind) may have
different <a href="../../../appendix/glossary/#character">characters</a>:</p>
<ul>
<li>scalar,</li>
<li>vector,</li>
<li>tensor.</li>
</ul>
<p>The quantity character in the <strong>mp-units</strong> library is implemented with the <code>quantity_character</code> enumeration:</p>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="k">enum</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">quantity_character</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">scalar</span><span class="p">,</span><span class="w"> </span><span class="n">vector</span><span class="p">,</span><span class="w"> </span><span class="n">tensor</span><span class="w"> </span><span class="p">};</span>
</span></code></pre></div>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>You can read more on quantity characters in the <a href="../character_of_a_quantity/">"Character of a Quantity"</a>
chapter.</p>
</div>
<h2 id="quantity-specification">Quantity specification<a class="headerlink" href="#quantity-specification" title="Permanent link">&para;</a></h2>
<p><a href="../systems_of_quantities/#dimension-is-not-enough-to-describe-a-quantity">Dimension is not enough to describe a quantity</a>.
This is why the <a href="../../../appendix/references/#ISO80000">ISO 80000</a> provides hundreds of named quantity
types. It turns out that there are many more quantity types in the <a href="../../../appendix/glossary/#isq">ISQ</a>
than the named units in the <a href="../../../appendix/glossary/#si">SI</a>.</p>
<p>This is why the <strong>mp-units</strong> library introduces a quantity specification entity that stores:</p>
<ul>
<li><a href="../../../appendix/glossary/#dimension">dimension</a>,</li>
<li>quantity type/name,</li>
<li><a href="../../../appendix/glossary/#character">quantity character</a>,</li>
<li>the <a href="../../../appendix/glossary/#quantity-equation">quantity equation</a> being the recipe to create this quantity
(only for derived quantities that specify such a recipe).</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>We know that it might be sometimes confusing to talk about quantities, quantity types/names, and quantity
specifications. However, it might be important to notice here that even the
<a href="../../../appendix/references/#ISO80000">ISO 80000</a> admits that:</p>
<blockquote>
<p>It is customary to use the same term, "quantity", to refer to both general quantities, such as length,
mass, etc., and their instances, such as given lengths, given masses, etc. Accordingly, we are used to
saying both that length is a quantity and that a given length is a quantity by maintaining the specification
– "general quantity, <span class="arithmatex">\(Q\)</span>" or "individual quantity, <span class="arithmatex">\(Q_\textsf{a}\)</span>" – implicit and exploiting the linguistic
context to remove the ambiguity.</p>
</blockquote>
<p>In the <strong>mp-units</strong> library, we have a:</p>
<ul>
<li><strong>quantity</strong> - implemented as a <code>quantity</code> class template,</li>
<li><strong>quantity specification</strong> - implemented with a <code>quantity_spec</code> class template that among others identifies
a specific <strong>quantity type/name</strong>.</li>
</ul>
</div>
<p>For example:</p>
<ul>
<li><code>isq::length</code>, <code>isq::mass</code>, <code>isq::time</code>, <code>isq::electric_current</code>, <code>isq::thermodynamic_temperature</code>,
<code>isq::amount_of_substance</code>, and <code>isq::luminous_intensity</code> are the specifications of base quantities
in the <a href="../../../appendix/glossary/#isq">ISQ</a>.</li>
<li><code>isq::width</code>, <code>isq::height</code>, <code>isq::radius</code>, and <code>isq::position_vector</code> are only a few of many
quantities of a kind length specified in the <a href="../../../appendix/glossary/#isq">ISQ</a>.</li>
<li><code>isq::area</code>, <code>isq::speed</code>, <code>isq::moment_of_force</code> are only a few of many derived quantities provided
in the <a href="../../../appendix/glossary/#isq">ISQ</a>.</li>
</ul>
<p>Quantity specification can be defined by the user in one of the following ways:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="2:3"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">C++23</label><label for="__tabbed_2_2">C++20</label><label for="__tabbed_2_3">Portable</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">length</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">dim_length</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">length</span><span class="p">;</span>
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">height</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">length</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">height</span><span class="p">;</span>
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">speed</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">speed</span><span class="p">;</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">length</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">length</span><span class="p">,</span><span class="w"> </span><span class="n">dim_length</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">length</span><span class="p">;</span>
</span><span id="__span-7-2"><a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">height</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">height</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">height</span><span class="p">;</span>
</span><span id="__span-7-3"><a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">speed</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">quantity_spec</span><span class="o">&lt;</span><span class="n">speed</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">speed</span><span class="p">;</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="n">QUANTITY_SPEC</span><span class="p">(</span><span class="n">length</span><span class="p">,</span><span class="w"> </span><span class="n">dim_length</span><span class="p">);</span>
</span><span id="__span-8-2"><a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="n">QUANTITY_SPEC</span><span class="p">(</span><span class="n">height</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="p">);</span>
</span><span id="__span-8-3"><a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="n">QUANTITY_SPEC</span><span class="p">(</span><span class="n">speed</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">time</span><span class="p">);</span>
</span></code></pre></div>
</div>
</div>
</div>
<p>The <a href="../../../appendix/glossary/#quantity-equation">quantity equation</a> of <code>isq::length / isq::time</code> results
in the <code>derived_quantity_spec&lt;isq::length, per&lt;isq::time&gt;&gt;</code> type.</p>
<h2 id="unit">Unit<a class="headerlink" href="#unit" title="Permanent link">&para;</a></h2>
<p>A <a href="../../../appendix/glossary/#unit">unit</a> is a concrete amount of a quantity that allows us to
measure the values of <a href="../systems_of_quantities/#quantities-of-the-same-kind">quantities of the same kind</a>
and represent the result as a number being the ratio of the two quantities.</p>
<p>For example:</p>
<ul>
<li><code>si::second</code>, <code>si::metre</code>, <code>si::kilogram</code>, <code>si::ampere</code>, <code>si::kelvin</code>, <code>si::mole</code>, and <code>si::candela</code>
are the base units of the <a href="../../../appendix/glossary/#si">SI</a>.</li>
<li><code>si::kilo&lt;si::metre&gt;</code> is a prefixed unit of length.</li>
<li><code>si::radian</code>, <code>si::newton</code>, and <code>si::watt</code> are examples of named derived units within the
<a href="../../../appendix/glossary/#si">SI</a>.</li>
<li><code>non_si::minute</code> is an example of a scaled unit of time.</li>
<li><code>si::si2019::speed_of_light_in_vacuum</code> is a physical constant standardized by the SI in 2019.</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>In the <strong>mp-units</strong> library, <a href="../faster_than_lightspeed_constants/">physical constants are also implemented as units</a>.</p>
</div>
<p>A unit can be defined by the user in one of the following ways:</p>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="k">template</span><span class="o">&lt;</span><span class="n">PrefixableUnit</span><span class="w"> </span><span class="n">U</span><span class="o">&gt;</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">kilo_</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">prefixed_unit</span><span class="o">&lt;</span><span class="s">&quot;k&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mag_power</span><span class="o">&lt;</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="o">&gt;</span><span class="p">,</span><span class="w"> </span><span class="n">U</span><span class="p">{}</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{};</span>
</span><span id="__span-9-2"><a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="k">template</span><span class="o">&lt;</span><span class="n">PrefixableUnit</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">U</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="n">kilo_</span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">U</span><span class="p">)</span><span class="o">&gt;</span><span class="w"> </span><span class="n">kilo</span><span class="p">;</span>
</span><span id="__span-9-3"><a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>
</span><span id="__span-9-4"><a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">second</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">named_unit</span><span class="o">&lt;</span><span class="s">&quot;s&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">kind_of</span><span class="o">&lt;</span><span class="n">isq</span><span class="o">::</span><span class="n">time</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">second</span><span class="p">;</span>
</span><span id="__span-9-5"><a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">minute</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">named_unit</span><span class="o">&lt;</span><span class="s">&quot;min&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mag</span><span class="o">&lt;</span><span class="mi">60</span><span class="o">&gt;</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">second</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">minute</span><span class="p">;</span>
</span><span id="__span-9-6"><a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">gram</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">named_unit</span><span class="o">&lt;</span><span class="s">&quot;g&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">kind_of</span><span class="o">&lt;</span><span class="n">isq</span><span class="o">::</span><span class="n">mass</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">gram</span><span class="p">;</span>
</span><span id="__span-9-7"><a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">kilogram</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">kilo</span><span class="o">&lt;</span><span class="n">gram</span><span class="o">&gt;</span><span class="p">;</span>
</span><span id="__span-9-8"><a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">newton</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">named_unit</span><span class="o">&lt;</span><span class="s">&quot;N&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">kilogram</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">metre</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">square</span><span class="p">(</span><span class="n">second</span><span class="p">)</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">newton</span><span class="p">;</span>
</span><span id="__span-9-9"><a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a>
</span><span id="__span-9-10"><a id="__codelineno-9-10" name="__codelineno-9-10" href="#__codelineno-9-10"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">speed_of_light_in_vacuum</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">named_unit</span><span class="o">&lt;</span><span class="s">&quot;c&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mag</span><span class="o">&lt;</span><span class="mi">299&#39;792&#39;458</span><span class="o">&gt;</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">metre</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">second</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">speed_of_light_in_vacuum</span><span class="p">;</span>
</span></code></pre></div>
<p>The <a href="../../../appendix/glossary/#unit-equation">unit equation</a> of <code>si::metre / si::second</code> results
in the <code>derived_unit&lt;si::metre, per&lt;si::second&gt;&gt;</code> type.</p>
<h2 id="quantity-reference">Quantity reference<a class="headerlink" href="#quantity-reference" title="Permanent link">&para;</a></h2>
<p>ISO defines a quantity as:</p>
<div class="admonition quote">
<p class="admonition-title">Quote</p>
<p>property of a phenomenon, body, or substance, where the property has a magnitude
that can be expressed as a number and a <strong><em>reference</em></strong></p>
</div>
<p>After that, it says:</p>
<div class="admonition quote">
<p class="admonition-title">Quote</p>
<p>A reference can be a <strong><em>measurement unit</em></strong>, a measurement procedure, a reference material,
or a combination of such.</p>
</div>
<p>In the <strong>mp-units</strong> library, a quantity reference provides all the domain-specific metadata for the quantity
besides its <a href="../../../appendix/glossary/#numerical-value">numerical value</a>:</p>
<ul>
<li>all the data stored in the <a href="#quantity-specification">quantity specification</a>,</li>
<li><a href="#unit">unit</a>.</li>
</ul>
<p>Together with the value of a <a href="#quantity-representation">representation type</a>, it forms a quantity.</p>
<p>In the library, we have two different ways to provide a reference:</p>
<ul>
<li>every unit with the associated <a href="../systems_of_quantities/#quantities-of-the-same-kind">quantity kind</a>
is a valid reference,</li>
<li>providing a unit to an indexing operator of a quantity specification explicitly instantiates
a <code>reference</code> class template with this quantity spec and a unit passed as arguments.</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>All the units of the <a href="../../../appendix/glossary/#si">SI</a> have associated quantity kinds
and may serve as a reference.</p>
</div>
<p>For example:</p>
<ul>
<li><code>si::metre</code> is defined in the <a href="../../../appendix/glossary/#si">SI</a> as a unit of <code>isq::length</code>
and thus can be used as a reference to instantiate a quantity of length (e.g., <code>42 * m</code>).</li>
<li>The expression <code>isq::height[m]</code> results with <code>reference&lt;isq::height, si::metre&gt;</code>, which can be used to
instantiate a quantity of <code>isq::height</code> with a unit of <code>si::metre</code> (e.g., <code>42 * isq::height[m]</code>).</li>
</ul>
<h2 id="quantity-representation">Quantity representation<a class="headerlink" href="#quantity-representation" title="Permanent link">&para;</a></h2>
<p>Quantity representation defines the type used to store the
<a href="../../../appendix/glossary/#quantity-value">numerical value of a quantity</a>. Such a type should be of
a specific <a href="#quantity-character">quantity character</a> provided in the
<a href="#quantity-specification">quantity specification</a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>By default, all floating-point and integral (besides <code>bool</code>) types are treated as scalars.</p>
</div>
<h2 id="quantity">Quantity<a class="headerlink" href="#quantity" title="Permanent link">&para;</a></h2>
<p>ISO defines a quantity as:</p>
<div class="admonition quote">
<p class="admonition-title">Quote</p>
<p>property of a phenomenon, body, or substance, where the property has a magnitude
that can be expressed as a <strong><em>number</em></strong> and a <strong><em>reference</em></strong></p>
</div>
<p>This is why a <code>quantity</code> class template is defined in the library as:</p>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="k">template</span><span class="o">&lt;</span><span class="n">Reference</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">R</span><span class="p">,</span>
</span><span id="__span-10-2"><a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="w"> </span><span class="n">RepresentationOf</span><span class="o">&lt;</span><span class="n">get_quantity_spec</span><span class="p">(</span><span class="n">R</span><span class="p">).</span><span class="n">character</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Rep</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">double</span><span class="o">&gt;</span>
</span><span id="__span-10-3"><a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="k">class</span><span class="w"> </span><span class="nc">quantity</span><span class="p">;</span>
</span></code></pre></div>
<p>Its value can be easily created by multiplying/dividing the <a href="#quantity-representation">numerical value</a>
and a <a href="#quantity-reference">reference</a>.</p>
<p>For example:</p>
<ul>
<li>All of <code>42 * m</code>, <code>42 * si::metre</code>, <code>42 * isq::height[m]</code>, and <code>isq::height(42 * m)</code> create a quantity.</li>
<li>A quantity type can also be specified explicitly (e.g., <code>quantity&lt;si::metre, int&gt;</code>,
<code>quantity&lt;isq::height[m]&gt;</code>).</li>
</ul>
<h2 id="point-origin">Point origin<a class="headerlink" href="#point-origin" title="Permanent link">&para;</a></h2>
<p>In <a href="../the_affine_space/">the affine space theory</a>, the point origin specifies where the "zero" of our
measurement's scale is.</p>
<p>In the <strong>mp-units</strong> library, we have two types of point origins:</p>
<ul>
<li><a href="../the_affine_space/#absolute-point-origin">absolute</a> - defines an absolute "zero" for our point,</li>
<li><a href="../the_affine_space/#relative-point-origin">relative</a> - defines an origin that has some "offset" relative
to an absolute point.</li>
</ul>
<p>For example:</p>
<ul>
<li>the absolute point origin can be defined in the following way:</li>
</ul>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">absolute_zero</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">absolute_point_origin</span><span class="o">&lt;</span><span class="n">isq</span><span class="o">::</span><span class="n">thermodynamic_temperature</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">absolute_zero</span><span class="p">;</span>
</span></code></pre></div>
<ul>
<li>the relative point origin can be defined in the following way:</li>
</ul>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="kr">inline</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">ice_point</span><span class="w"> </span><span class="k">final</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">relative_point_origin</span><span class="o">&lt;</span><span class="n">absolute_zero</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">273&#39;150</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">milli</span><span class="o">&lt;</span><span class="n">kelvin</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="n">ice_point</span><span class="p">;</span>
</span></code></pre></div>
<h2 id="quantity-point">Quantity point<a class="headerlink" href="#quantity-point" title="Permanent link">&para;</a></h2>
<p>Quantity point implements a <em>point</em> in <a href="../the_affine_space/">the affine space theory</a>.</p>
<p>In the <strong>mp-units</strong> library, the quantity point is implemented as:</p>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="k">template</span><span class="o">&lt;</span><span class="n">Reference</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">R</span><span class="p">,</span>
</span><span id="__span-13-2"><a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="w"> </span><span class="n">PointOriginFor</span><span class="o">&lt;</span><span class="n">get_quantity_spec</span><span class="p">(</span><span class="n">R</span><span class="p">)</span><span class="o">&gt;</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">PO</span><span class="p">,</span>
</span><span id="__span-13-3"><a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="w"> </span><span class="n">RepresentationOf</span><span class="o">&lt;</span><span class="n">get_quantity_spec</span><span class="p">(</span><span class="n">R</span><span class="p">).</span><span class="n">character</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Rep</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">double</span><span class="o">&gt;</span>
</span><span id="__span-13-4"><a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a><span class="k">class</span><span class="w"> </span><span class="nc">quantity_point</span><span class="p">;</span>
</span></code></pre></div>
<p>Its value can be easily created by adding/subtracting the <a href="#quantity">quantity</a> with
a <a href="#point-origin">point origin</a>.</p>
<p>For example:</p>
<ul>
<li>The following specifies a quantity point defined in terms of an <code>ice_point</code> provided in
the previous example:</li>
</ul>
<div class="language-cpp highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">room_reference_temperature</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ice_point</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">delta</span><span class="o">&lt;</span><span class="n">isq</span><span class="o">::</span><span class="n">Celsius_temperature</span><span class="p">[</span><span class="n">deg_C</span><span class="p">]</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">21</span><span class="p">);</span>
</span></code></pre></div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../interface_introduction/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Interface Introduction">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Interface Introduction
</div>
</div>
</a>
<a href="../systems_of_quantities/" class="md-footer__link md-footer__link--next" aria-label="Next: Systems of Quantities">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Systems of Quantities
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2018-2023 Mateusz Pusz
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "navigation.indexes", "navigation.tabs", "navigation.footer", "navigation.top", "search.highlight", "search.share", "search.suggest", "toc.follow", "toc.integrate"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
<script src="../../../assets/javascripts/bundle.83f73b43.min.js"></script>
<script src="../../../javascripts/mathjax.js"></script>
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>