Files
mp-units/HEAD/api_reference/gen/qty.sym.expr.html
T

123 lines
70 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'><head><title>[qty.sym.expr]</title><meta charset='UTF-8'/><link rel='stylesheet' type='text/css' href='14882.css'/><link rel='stylesheet' type='text/css' href='https://fonts.googleapis.com/css2?family=Noto+Serif'/><link rel='stylesheet' type='text/css' href='https://fonts.googleapis.com/css2?family=Noto+Sans'/><link rel='stylesheet' type='text/css' href='https://fonts.googleapis.com/css2?family=Noto+Sans+Mono'/><link rel='icon' href='icon.png'/><link rel='stylesheet' type='text/css' href='expanded.css' title='Normal'/><link rel='alternate stylesheet' type='text/css' href='colored.css' title='Notes and examples colored'/><link rel='alternate stylesheet' type='text/css' href='normative-only.css' title='Notes and examples hidden'/></head><body><div class='wrapper'><h1 ><a class='secnum' style='min-width:50pt'>5</a> Quantities and units library <a class='abbr_ref' href='index.html#quantities'>[quantities]</a></h1><h2 ><a class='secnum' style='min-width:65pt'>5.3</a> Utilities <a class='abbr_ref' href='qty.utils.html#qty.sym.expr'>[qty.utils]</a></h2><h3 ><a class='secnum' style='min-width:80pt'>5.3.4</a> Symbolic expressions <a class='abbr_ref'>[qty.sym.expr]</a></h3><div id='general' class='section'><h4 ><a class='secnum' href='#general' style='min-width:95pt'>5.3.4.1</a> General <a class='abbr_ref' href='qty.sym.expr.general.html'>[qty.sym.expr.general]</a></h4><div class='para' id='general-1'><div class='marginalizedparent'><a class='marginalized' href='#general-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L981'>#</a></div><div class='texpara'><div id='general-1.sentence-1' class='sentence'>Subclause [qty.<span class='shy'></span>sym.<span class='shy'></span>expr] specifies the components
used to maintain ordered, simplified, and readable
argument lists in the names of specializations<a class='hidden_link' href='#general-1.sentence-1'>.</a></div> <div id='general-example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#general-example-1'>1</a></i>:&ensp;<span class='codeblock'><span class='keyword'>using</span> <span class='keyword'>namespace</span> si<span class='operator'>::</span>unit_symbols;
<span class='keyword'>int</span> x <span class='operator'>=</span> kg <span class='operator'>*</span> km <span class='operator'>/</span> square<span class='parenthesis'>(</span>h<span class='parenthesis'>)</span>; <span class='comment'>// error: cannot construct from</span>
<span class='comment'>// <span class='tcode_in_codeblock'>derived_<span class='shy'></span>unit&lt;si&#x200b;::&#x200b;kilo_<span class='shy'></span>&lt;si&#x200b;::&#x200b;gram&gt;, si&#x200b;::&#x200b;kilo_<span class='shy'></span>&lt;si&#x200b;::&#x200b;metre&gt;, per&lt;power&lt;non_<span class='shy'></span>si&#x200b;::&#x200b;hour, 2&gt;&gt;&gt;</span></span>
</span> <div id='general-1.sentence-2' class='sentence'>
The library ensures <span class='texttt'><span class='keyword'>decltype</span><span class='parenthesis'>(</span>kg <span class='operator'>*</span> km <span class='operator'>/</span> square<span class='parenthesis'>(</span>h<span class='parenthesis'>)</span><span class='parenthesis'>)</span></span> is styled-like as commented in diagnostics,
provided that, in the implementation-defined total order of types,
<span class='texttt'><span class='keyword'>decltype</span><span class='parenthesis'>(</span>kg<span class='parenthesis'>)</span></span> is less than <span class='texttt'><span class='keyword'>decltype</span><span class='parenthesis'>(</span>km<span class='parenthesis'>)</span></span><a class='hidden_link' href='#general-1.sentence-2'>.</a></div>&nbsp;<i>end example</i>]</div></div></div></div></div><div id='concepts' class='section'><h4 ><a class='secnum' href='#concepts' style='min-width:95pt'>5.3.4.2</a> Concept <span class='texttt'><i >SymbolicConstant</i></span> <a class='abbr_ref' href='qty.sym.expr.concepts.html'>[qty.sym.expr.concepts]</a></h4><div class='texpara'><div class='itemdecl' id='concept:SymbolicConstant'><div class='marginalizedparent'><a class='itemDeclLink' href='#concept:SymbolicConstant'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>concept</span> <span class='texttt'><i >SymbolicConstant</i></span><a class='index' id='concept:SymbolicConstant'></a> <span class='operator'>=</span> <span class='comment'>// <i >exposition only</i></span>
std<span class='operator'>::</span>is_empty_v<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> std<span class='operator'>::</span>is_final_v<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> std<span class='operator'>::</span>is_trivially_default_constructible_v<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span>
std<span class='operator'>::</span>is_trivially_copy_constructible_v<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> std<span class='operator'>::</span>is_trivially_move_constructible_v<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span>
std<span class='operator'>::</span>is_trivially_destructible_v<span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span>;
</code></div></div><div class='para' id='concepts-1'><div class='marginalizedparent'><a class='marginalized' href='#concepts-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1006'>#</a></div><div class='texpara'><div id='concepts-1.sentence-1' class='sentence'>The concept <a href='#concept:SymbolicConstant' title='5.3.4.2&emsp;Concept SymbolicConstant&emsp;[qty.sym.expr.concepts]'><span id='conceptref:SymbolicConstant'><span class='texttt'><i >SymbolicConstant</i></span></span></a>
is used to constrain the types
that are used in symbolic expressions<a class='hidden_link' href='#concepts-1.sentence-1'>.</a></div></div></div></div><div id='types' class='section'><h4 ><a class='secnum' href='#types' style='min-width:95pt'>5.3.4.3</a> Types <a class='abbr_ref' href='qty.sym.expr.types.html'>[qty.sym.expr.types]</a></h4><div class='texpara'><span id='lib:per'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:per'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> mp_units <span class='curlybracket'>{</span>
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> T, <span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Ts<span class='anglebracket'>&gt;</span>
<span class='keyword'>struct</span> per <span class='keyword'>final</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></div><div class='para' id='types-1'><div class='marginalizedparent'><a class='marginalized' href='#types-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1023'>#</a></div><div class='texpara'><div id='types-1.sentence-1' class='sentence'><span class='texttt'>per</span> is used to store arguments with negative exponents<a class='hidden_link' href='#types-1.sentence-1'>.</a></div> <div id='types-1.sentence-2' class='sentence'>A specialization of <span class='texttt'>per</span>
represents the product of the inverse of its template arguments<a class='hidden_link' href='#types-1.sentence-2'>.</a></div> <div id='types-1.sentence-3' class='sentence'>A program that instantiates a specialization of <span class='texttt'>per</span>
that is not a possible result of the library specifications
is ill-formed, no diagnostic required<a class='hidden_link' href='#types-1.sentence-3'>.</a></div></div><div class='texpara'><span id='lib:power'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:power'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> mp_units <span class='curlybracket'>{</span>
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> F, <span class='keyword'>int</span> Num, <span class='keyword'>int</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Den<span class='anglebracket'>&gt;</span>
<span class='keyword'>requires</span> <i ><span class='texttt'>see below</span></i>
<span class='keyword'>struct</span> power <span class='keyword'>final</span> <span class='curlybracket'>{</span>
<span class='keyword'>using</span> <i >factor</i> <span class='operator'>=</span> F; <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>static</span> <span class='keyword'>constexpr</span> <i >ratio</i> <i >exponent</i><span class='curlybracket'>{</span>Num, Den<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='curlybracket'>}</span>; <span class='comment'>// <i >exposition only</i></span>
<span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></span></div></div><div class='para' id='types-2'><div class='marginalizedparent'><a class='marginalized' href='#types-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1045'>#</a></div><div class='texpara'><div id='types-2.sentence-1' class='sentence'><span class='texttt'>power</span> represents a power (<a href="https://www.electropedia.org/iev/iev.nsf/display?openform&ievref=102-02-08">IEC 60050, 102-02-08</a>)
of the form <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.225em;">F</span></span></span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Num</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Den</span></span></span></span></span></span></span></span></span></span></span><a class='hidden_link' href='#types-2.sentence-1'>.</a></div> <div id='types-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#types-note-1'>1</a></i>:&ensp;<div id='types-2.sentence-2' class='sentence'><span class='texttt'>Den</span> is optional to shorten the type name when <span class='texttt'>Den</span> is <span class='texttt'><span class='literal'>1</span></span><a class='hidden_link' href='#types-2.sentence-2'>.</a></div>&nbsp;<i>end note</i>]</div></div> <div id='types-2.sentence-3' class='sentence'>
A program that instantiates a specialization of <span class='texttt'>power</span>
that is not a possible result of the library specifications
is ill-formed, no diagnostic required<a class='hidden_link' href='#types-2.sentence-3'>.</a></div></div></div><div class='para' id='types-3'><div class='marginalizedparent'><a class='marginalized' href='#types-3'>3</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1055'>#</a></div><div class='texpara'><div id='types-3.sentence-1' class='sentence'>Let <span class='texttt'>r</span> be <span class='texttt'><span class='texttt'><i >ratio</i></span><span class='curlybracket'>{</span>Num, Den<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='curlybracket'>}</span></span><a class='hidden_link' href='#types-3.sentence-1'>.</a></div> <div id='types-3.sentence-2' class='sentence'>Let <span class='texttt'><i >is-valid-ratio</i></span> be
<span class='texttt'><span class='literal'>true</span></span> if <span class='texttt'>r</span> is a valid constant expression, and
<span class='texttt'><span class='literal'>false</span></span> otherwise<a class='hidden_link' href='#types-3.sentence-2'>.</a></div> <div id='types-3.sentence-3' class='sentence'>The expression in the <span class='textsf'><i >requires-clause</i></span> is equivalent to:
<span class='codeblock'><i >is-valid-ratio</i> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> <span class='parenthesis'>(</span>r <span class='anglebracket'>&gt;</span> <i >ratio</i><span class='curlybracket'>{</span><span class='literal'>0</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span> <span class='parenthesis'>(</span>r <span class='operator'>!</span><span class='operator'>=</span> <i >ratio</i><span class='curlybracket'>{</span><span class='literal'>1</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span>
</span></div></div></div></div><div id='algos' class='section'><h4 ><a class='secnum' href='#algos' style='min-width:95pt'>5.3.4.4</a> Algorithms <a class='abbr_ref' href='qty.sym.expr.algos.html'>[qty.sym.expr.algos]</a></h4><div class='texpara'><span id='lib:expr-type'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:expr-type'>🔗</a></div><span class='codeblock'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>using</span> <i >expr-type</i> <span class='operator'>=</span> <i ><span class='texttt'>see below</span></i>; <span class='comment'>// <i >exposition only</i></span>
</span></span></div><div class='para' id='algos-1'><div class='marginalizedparent'><a class='marginalized' href='#algos-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1073'>#</a></div><div class='texpara'><div id='algos-1.sentence-1' class='sentence'><span class='texttt'><span class='texttt'><i >expr-type</i></span><span class='anglebracket'>&lt;</span>T<span class='anglebracket'>&gt;</span></span> denotes
<span class='texttt'>U</span> if <span class='texttt'>T</span> is of the form <span class='texttt'>power<span class='anglebracket'>&lt;</span>U, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span>, and
<span class='texttt'>T</span> otherwise<a class='hidden_link' href='#algos-1.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:type-less-impl'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:type-less-impl'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> T, <span class='keyword'>typename</span> U<span class='anglebracket'>&gt;</span>
<span class='keyword'>consteval</span> <span class='keyword'>bool</span> <span class='texttt'><i >type-less-impl</i></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
</code></div></div></div><div class='para' id='algos-2'><div class='marginalizedparent'><a class='marginalized' href='#algos-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1085'>#</a></div><div class='texpara'><div id='algos-2.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='literal'>true</span></span> if <span class='texttt'>T</span> is less than <span class='texttt'>U</span>
in an implementation-defined total order for types, and
<span class='texttt'><span class='literal'>false</span></span> otherwise<a class='hidden_link' href='#algos-2.sentence-1'>.</a></div></div></div></div><div class='texpara'><span id='lib:type-less'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:type-less'>🔗</a></div><span class='codeblock'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> Lhs, <span class='keyword'>typename</span> Rhs<span class='anglebracket'>&gt;</span>
<span class='keyword'>struct</span> <i >type-less</i> <span class='operator'>:</span> <span class='comment'>// <i >exposition only</i></span>
std<span class='operator'>::</span>bool_constant<span class='anglebracket'>&lt;</span><i >is-specialization-of</i><span class='anglebracket'>&lt;</span>Rhs, power<span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>|</span><span class='operator'>|</span>
<i >type-less-impl</i><span class='anglebracket'>&lt;</span><i >expr-type</i><span class='anglebracket'>&lt;</span>Lhs<span class='anglebracket'>&gt;</span>, <i >expr-type</i><span class='anglebracket'>&lt;</span>Rhs<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='anglebracket'>&gt;</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>;
</span></span></div><div class='para' id='algos-3'><div class='marginalizedparent'><a class='marginalized' href='#algos-3'>3</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1100'>#</a></div><div class='texpara'><div id='algos-3.sentence-1' class='sentence'><span class='texttt'><i >type-less</i></span> meets the requirements of
the <span class='texttt'>Pred</span> parameter of the symbolic expression algorithms below<a class='hidden_link' href='#algos-3.sentence-1'>.</a></div></div><div class='texpara'><span id='lib:expr-fractions'><span id='lib:type-list'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:type-list'>🔗</a></div><span class='codeblock'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Ts<span class='anglebracket'>&gt;</span>
<span class='keyword'>struct</span> <i >type-list</i> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>; <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> OneType, <span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Ts<span class='anglebracket'>&gt;</span>
<span class='keyword'>struct</span> <i >expr-fractions</i> <span class='curlybracket'>{</span> <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>using</span> <i >num</i> <span class='operator'>=</span> <i ><span class='texttt'>see below</span></i>; <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>using</span> <i >den</i> <span class='operator'>=</span> <i ><span class='texttt'>see below</span></i>; <span class='comment'>// <i >exposition only</i></span>
<span class='curlybracket'>}</span>
</span></span></span></div></div><div class='para' id='algos-4'><div class='marginalizedparent'><a class='marginalized' href='#algos-4'>4</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1117'>#</a></div><div class='texpara'><div id='algos-4.sentence-1' class='sentence'><span class='texttt'><i >expr-fractions</i></span> divides a symbolic expression to numerator and denominator parts<a class='hidden_link' href='#algos-4.sentence-1'>.</a></div> <div id='algos-4.sentence-2' class='sentence'>Let <span class='texttt'>EF</span> be a specialization of <span class='texttt'><i >expr-fractions</i></span><a class='hidden_link' href='#algos-4.sentence-2'>.</a></div> <ul class='itemize'><li id='algos-4.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#algos-4.1'>(4.1)</a></div><div class='texpara'><div id='algos-4.1.sentence-1' class='sentence'>If <span class='texttt'>EF</span> is of the form <span class='texttt'><span class='texttt'><i >expr-fractions</i></span><span class='anglebracket'>&lt;</span>OneType, Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span>, per<span class='anglebracket'>&lt;</span>Us<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span></span>,
then
<ul class='itemize'><li id='algos-4.1.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#algos-4.1.1'>(4.1.1)</a></div><span class='texttt'>EF<span class='operator'>&#x200b;::&#x200b;</span><span class='texttt'><i >num</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'>&lt;</span>Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span>, and</li><li id='algos-4.1.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#algos-4.1.2'>(4.1.2)</a></div><span class='texttt'>EF<span class='operator'>&#x200b;::&#x200b;</span><span class='texttt'><i >den</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'>&lt;</span>Us<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span><a class='hidden_link' href='#algos-4.1.sentence-1'>.</a></li></ul></div></div></li><li id='algos-4.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#algos-4.2'>(4.2)</a></div><div class='texpara'><div id='algos-4.2.sentence-1' class='sentence'>Otherwise, <span class='texttt'>EF</span> is of the form <span class='texttt'><span class='texttt'><i >expr-fractions</i></span><span class='anglebracket'>&lt;</span>OneType, Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span>, and
<ul class='itemize'><li id='algos-4.2.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#algos-4.2.1'>(4.2.1)</a></div><span class='texttt'>EF<span class='operator'>&#x200b;::&#x200b;</span><span class='texttt'><i >num</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'>&lt;</span>Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span>, and</li><li id='algos-4.2.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#algos-4.2.2'>(4.2.2)</a></div><span class='texttt'>EF<span class='operator'>&#x200b;::&#x200b;</span><span class='texttt'><i >den</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span></span><a class='hidden_link' href='#algos-4.2.sentence-1'>.</a></li></ul></div></div></li></ul></div></div><div class='para' id='algos-5'><div class='marginalizedparent'><a class='marginalized' href='#algos-5'>5</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1140'>#</a></div><div class='texpara'><div id='algos-5.sentence-1' class='sentence'>The symbolic expression algorithms perform operations on symbolic constants<a class='hidden_link' href='#algos-5.sentence-1'>.</a></div> <div id='algos-5.sentence-2' class='sentence'>A symbolic constant is a type that is a model of <a href='#concept:SymbolicConstant' title='5.3.4.2&emsp;Concept SymbolicConstant&emsp;[qty.sym.expr.concepts]'><span id='conceptref:SymbolicConstant_'><span class='texttt'><i >SymbolicConstant</i></span></span></a><a class='hidden_link' href='#algos-5.sentence-2'>.</a></div> <div id='algos-example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#algos-example-1'>1</a></i>:&ensp;<div id='algos-5.sentence-3' class='sentence'>The dimension <span class='texttt'>dim_<span class='shy'></span>length</span>, the quantity <span class='texttt'>time</span>, and the unit <span class='texttt'>one</span> are symbolic constants<a class='hidden_link' href='#algos-5.sentence-3'>.</a></div>&nbsp;<i>end example</i>]</div></div> <div id='algos-5.sentence-4' class='sentence'>
The algorithms also support
powers with a symbolic constant base and a rational exponent,
products thereof, and
fractions thereof<a class='hidden_link' href='#algos-5.sentence-4'>.</a></div></div></div><div class='texpara'><div id='lib:expr-pow'><div id='lib:expr-invert'><div id='lib:expr-divide'><div id='lib:expr-multiply'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:expr-multiply'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType,
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> Pred <span class='operator'>=</span> <span class='texttt'><i >type-less</i></span>, <span class='keyword'>typename</span> Lhs, <span class='keyword'>typename</span> Rhs<span class='anglebracket'>&gt;</span>
<span class='keyword'>consteval</span> <span class='keyword'>auto</span> <span class='texttt'><i >expr-multiply</i></span><span class='parenthesis'>(</span>Lhs, Rhs<span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType,
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> Pred <span class='operator'>=</span> <span class='texttt'><i >type-less</i></span>, <span class='keyword'>typename</span> Lhs, <span class='keyword'>typename</span> Rhs<span class='anglebracket'>&gt;</span>
<span class='keyword'>consteval</span> <span class='keyword'>auto</span> <span class='texttt'><i >expr-divide</i></span><span class='parenthesis'>(</span>Lhs lhs, Rhs rhs<span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType, <span class='keyword'>typename</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>consteval</span> <span class='keyword'>auto</span> <span class='texttt'><i >expr-invert</i></span><span class='parenthesis'>(</span>T<span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span>std<span class='operator'>::</span>intmax_t Num, std<span class='operator'>::</span>intmax_t Den, <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> To,
<span class='keyword'>typename</span> OneType, <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> Pred <span class='operator'>=</span> <span class='texttt'><i >type-less</i></span>, <span class='keyword'>typename</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>requires</span><span class='parenthesis'>(</span>Den <span class='operator'>!</span><span class='operator'>=</span> <span class='literal'>0</span><span class='parenthesis'>)</span>
<span class='keyword'>consteval</span> <span class='keyword'>auto</span> <span class='texttt'><i >expr-pow</i></span><span class='parenthesis'>(</span>T<span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
</code></div></div></div></div></div></div><div class='para' id='algos-6'><div class='marginalizedparent'><a class='marginalized' href='#algos-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1174'>#</a></div><div class='texpara'><div id='algos-6.sentence-1' class='sentence'><i >Mandates</i>: <ul class='itemize'><li id='algos-6.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-6.1'>(6.1)</a></div><span class='texttt'>OneType</span> is the neutral element (<a href="https://www.electropedia.org/iev/iev.nsf/display?openform&ievref=102-01-19">IEC 60050, 102-01-19</a>) of the operation, and</li><li id='algos-6.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-6.2'>(6.2)</a></div><span class='texttt'>Pred</span> is a <i >Cpp17BinaryTypeTrait</i> (<a href="https://wg21.link/meta.rqmts">N4971, [meta.rqmts]</a>)
with a base characteristic of <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>bool_<span class='shy'></span>constant<span class='anglebracket'>&lt;</span>B<span class='anglebracket'>&gt;</span></span><a class='hidden_link' href='#algos-6.sentence-1'>.</a> <div class='texpara'><div id='algos-6.2.sentence-2' class='sentence'><span class='texttt'>Pred<span class='anglebracket'>&lt;</span>T, U<span class='anglebracket'>&gt;</span></span> implements a total order for types;
<span class='texttt'>B</span> is <span class='texttt'><span class='literal'>true</span></span> if <span class='texttt'>T</span> is ordered before <span class='texttt'>U</span>, and <span class='texttt'><span class='literal'>false</span></span> otherwise<a class='hidden_link' href='#algos-6.2.sentence-2'>.</a></div></div></li></ul></div></div></div></div><div class='para' id='algos-7'><div class='marginalizedparent'><a class='marginalized' href='#algos-7'>7</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1186'>#</a></div><div class='texpara'><div id='algos-7.sentence-1' class='sentence'><i >Effects</i>: </div></div></div></div><div class='para' id='algos-8'><div class='marginalizedparent'><a class='marginalized' href='#algos-8'>8</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1188'>#</a></div><div class='texpara'><div id='algos-8.sentence-1' class='sentence'>First, inputs to the operations are obtained from the types of the function parameters<a class='hidden_link' href='#algos-8.sentence-1'>.</a></div> <div id='algos-8.sentence-2' class='sentence'>If the type of a function parameter is:
<ul class='itemize'><li id='algos-8.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.1'>(8.1)</a></div><div class='texpara'><div id='algos-8.1.sentence-1' class='sentence'>A specialization of <span class='texttt'>To</span>,
then its input is the product of its template arguments, and
the following also apply<a class='hidden_link' href='#algos-8.1.sentence-1'>.</a></div></div></li><li id='algos-8.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.2'>(8.2)</a></div><div class='texpara'><div id='algos-8.2.sentence-1' class='sentence'>A specialization of <span class='texttt'>per</span>,
then its input is the product of the inverse of its template arguments, and
the following also apply<a class='hidden_link' href='#algos-8.2.sentence-1'>.</a></div></div></li><li id='algos-8.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.3'>(8.3)</a></div><div class='texpara'><div id='algos-8.3.sentence-1' class='sentence'>A specialization of the form <span class='texttt'>power<span class='anglebracket'>&lt;</span>F, Num<span class='anglebracket'>&gt;</span></span>,
then its input is <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.225em;">F</span></span></span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Num</span></span></span></span></span></span></span></span></span>, or
a specialization of the form <span class='texttt'>power<span class='anglebracket'>&lt;</span>F, Num, Den<span class='anglebracket'>&gt;</span></span>,
then its input is <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.225em;">F</span></span></span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Num</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Den</span></span></span></span></span></span></span></span></span></span></span>, and
the following also applies<a class='hidden_link' href='#algos-8.3.sentence-1'>.</a></div></div></li><li id='algos-8.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.4'>(8.4)</a></div><div class='texpara'><div id='algos-8.4.sentence-1' class='sentence'>Otherwise, the input is the symbolic constant itself<a class='hidden_link' href='#algos-8.4.sentence-1'>.</a></div></div></li></ul></div> <div id='algos-example-2' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#algos-example-2'>2</a></i>:&ensp;<div id='algos-8.sentence-3' class='sentence'>Item by item, this algorithm step goes from the C++ parameter type
<span class='texttt'><span class='keyword'>decltype</span><span class='parenthesis'>(</span>km <span class='operator'>/</span> square<span class='parenthesis'>(</span>h<span class='parenthesis'>)</span><span class='parenthesis'>)</span></span>,
styled in diagnostics like
<span class='texttt'>derived_<span class='shy'></span>unit<span class='anglebracket'>&lt;</span>si<span class='operator'>&#x200b;::&#x200b;</span>kilo_<span class='shy'></span><span class='anglebracket'>&lt;</span>si<span class='operator'>&#x200b;::&#x200b;</span>metre<span class='anglebracket'>&gt;</span>, per<span class='anglebracket'>&lt;</span>power<span class='anglebracket'>&lt;</span>non_<span class='shy'></span>si<span class='operator'>&#x200b;::&#x200b;</span>hour, <span class='literal'>2</span><span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span></span>,
<ul class='itemize'><li id='algos-8.5'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.5'>(8.5)</a></div>to <span class='math'><span class='texttt'><span class='keyword'>decltype</span><span class='parenthesis'>(</span>km<span class='parenthesis'>)</span></span> &times;<span class='texttt'>per<span class='anglebracket'>&lt;</span>power<span class='anglebracket'>&lt;</span><span class='keyword'>decltype</span><span class='parenthesis'>(</span>h<span class='parenthesis'>)</span>, <span class='literal'>2</span><span class='anglebracket'>&gt;</span></span></span> (product of <span class='texttt'>To</span>'s arguments),</li><li id='algos-8.6'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.6'>(8.6)</a></div>to <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.519em; padding-bottom: 0.519em;"><span class='keyword'>decltype</span><span class='parenthesis'>(</span>km<span class='parenthesis'>)</span></span></span></span></span><span class="mjx-mo MJXc-space2"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.225em; padding-bottom: 0.298em;">×</span></span><span class="mjx-texatom MJXc-space2"><span class="mjx-mrow"></span></span><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char" style="padding-top: 0.519em; padding-bottom: 0.225em;"><span class="mjx-charbox MJXc-TeX-type-R" style="padding-bottom: 0.233em; margin-right: 0.275em;">power<span class='anglebracket'>&lt;</span><span class='keyword'>decltype</span><span class='parenthesis'>(</span>h<span class='parenthesis'>)</span>, </span><span class="mjx-charbox MJXc-TeX-type-R" style="padding-bottom: 0.233em;"><span class='literal'>2</span><span class='anglebracket'>&gt;</span></span></span></span></span></span></span></span></span> (product of inverse of <span class='texttt'>per</span>'s arguments),</li><li id='algos-8.7'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.7'>(8.7)</a></div>to <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.519em; padding-bottom: 0.519em;"><span class='keyword'>decltype</span><span class='parenthesis'>(</span>km<span class='parenthesis'>)</span></span></span></span></span><span class="mjx-mo MJXc-space2"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.225em; padding-bottom: 0.298em;">×</span></span><span class="mjx-texatom MJXc-space2"><span class="mjx-mrow"></span></span><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.519em; padding-bottom: 0.519em;"><span class='keyword'>decltype</span><span class='parenthesis'>(</span>h<span class='parenthesis'>)</span></span></span></span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.631em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">2</span></span></span></span></span></span></span> (<span class='texttt'>power</span>s as powers),</li><li id='algos-8.8'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-8.8'>(8.8)</a></div>to <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.151em; padding-bottom: 0.372em;">a</span></span></span></span><span class="mjx-mo MJXc-space2"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.225em; padding-bottom: 0.298em;">×</span></span><span class="mjx-texatom MJXc-space2"><span class="mjx-mrow"></span></span><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">b</span></span></span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.631em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">2</span></span></span></span></span></span></span> where <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.151em; padding-bottom: 0.372em;">a</span></span></span></span><span class="mjx-mo MJXc-space3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-texatom MJXc-space3"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.519em; padding-bottom: 0.519em;"><span class='keyword'>decltype</span><span class='parenthesis'>(</span>km<span class='parenthesis'>)</span></span></span></span></span></span></span></span> and <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">b</span></span></span></span><span class="mjx-mo MJXc-space3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-texatom MJXc-space3"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.519em; padding-bottom: 0.519em;"><span class='keyword'>decltype</span><span class='parenthesis'>(</span>h<span class='parenthesis'>)</span></span></span></span></span></span></span></span> (symbolic substitution)
in the mathematical domain<a class='hidden_link' href='#algos-8.sentence-3'>.</a></li></ul></div>&nbsp;<i>end example</i>]</div></div></div></div></div><div class='para' id='algos-9'><div class='marginalizedparent'><a class='marginalized' href='#algos-9'>9</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1227'>#</a></div><div class='texpara'><div id='algos-9.sentence-1' class='sentence'>Then, the operation takes place:
<ul class='itemize'><li id='algos-9.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-9.1'>(9.1)</a></div><span class='texttt'><i >expr-multiply</i></span> multiplies its inputs,</li><li id='algos-9.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-9.2'>(9.2)</a></div><span class='texttt'><i >expr-divide</i></span> divides the input of its first parameter by the input of its second parameter,</li><li id='algos-9.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-9.3'>(9.3)</a></div><span class='texttt'><i >expr-invert</i></span> divides <span class='math'>1</span> by its input, and</li><li id='algos-9.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-9.4'>(9.4)</a></div><span class='texttt'><i >expr-pow</i></span> raises its input to the <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Num</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mtext"><span class="mjx-char MJXc-TeX-type-R" style="padding-top: 0.372em; padding-bottom: 0.298em;">Den</span></span></span></span></span></span></span><a class='hidden_link' href='#algos-9.sentence-1'>.</a></li></ul></div></div></div></div><div class='para' id='algos-10'><div class='marginalizedparent'><a class='marginalized' href='#algos-10'>10</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1240'>#</a></div><div class='texpara'><div id='algos-10.sentence-1' class='sentence'>Finally, let <span class='math'><span class='mathalpha'>r</span></span> be the result of the operation simplified as follows:
<ul class='itemize'><li id='algos-10.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-10.1'>(10.1)</a></div><div class='texpara'><div id='algos-10.1.sentence-1' class='sentence'>All terms are part of the same fraction (if any)<a class='hidden_link' href='#algos-10.1.sentence-1'>.</a></div></div></li><li id='algos-10.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-10.2'>(10.2)</a></div><div class='texpara'><div id='algos-10.2.sentence-1' class='sentence'>There is at most a single term with a given symbolic constant<a class='hidden_link' href='#algos-10.2.sentence-1'>.</a></div></div></li><li id='algos-10.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-10.3'>(10.3)</a></div><div class='texpara'><div id='algos-10.3.sentence-1' class='sentence'>There are no negative exponents<a class='hidden_link' href='#algos-10.3.sentence-1'>.</a></div></div></li><li id='algos-10.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-10.4'>(10.4)</a></div><div class='texpara'><div id='algos-10.4.sentence-1' class='sentence'><span class='math'>1</span> is only present as <span class='math'><span class='mathalpha'>r</span></span> and as a numerator with a denominator not equal to <span class='math'>1</span><a class='hidden_link' href='#algos-10.4.sentence-1'>.</a></div></div></li></ul></div> <div id='algos-example-3' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#algos-example-3'>3</a></i>:&ensp;<div id='algos-10.sentence-2' class='sentence'>Item by item: <br/></div> <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span><span class="mjx-mo MJXc-space2"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.225em; padding-bottom: 0.298em;">×</span></span><span class="mjx-texatom MJXc-space2"><span class="mjx-mrow"></span></span><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.519em; padding-right: 0.006em;">y</span></span><span class="mjx-mo MJXc-space2"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.225em; padding-bottom: 0.298em;">×</span></span><span class="mjx-texatom MJXc-space2"><span class="mjx-mrow"></span></span><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">2</span></span></span></span></span></span></span> <br/> <div id='algos-10.sentence-3' class='sentence'><span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-mi MJXc-space3"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">(</span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.519em; padding-right: 0.006em;">y</span></span><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">2</span></span></span></span><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">)</span></span></span></span></span> (single fraction) <br/></div> <div id='algos-10.sentence-4' class='sentence'><span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-msubsup MJXc-space3"><span class="mjx-base"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.298em; padding-bottom: 0.446em;"></span></span><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span></span></span></span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.519em; padding-right: 0.006em;">y</span></span></span></span></span> (unique symbolic constants) <br/></div> <div id='algos-10.sentence-5' class='sentence'><span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-mn MJXc-space3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">(</span></span><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-mn"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span></span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.519em; padding-right: 0.006em;">y</span></span><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">)</span></span></span></span></span> (positive exponents) <br/></div> <div id='algos-10.sentence-6' class='sentence'><span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-mn MJXc-space3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">(</span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.519em; padding-right: 0.006em;">y</span></span><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">)</span></span></span></span></span> (non-redundant <span class='math'>1</span>s) <br/></div>&nbsp;<i>end example</i>]</div></div></div></div></div><div class='para' id='algos-11'><div class='marginalizedparent'><a class='marginalized' href='#algos-11'>11</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1261'>#</a></div><div class='texpara'><div id='algos-11.sentence-1' class='sentence'><i >Returns</i>: <span class='math'><span class='mathalpha'>r</span></span> is mapped to the return type:
<ul class='itemize'><li id='algos-11.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-11.1'>(11.1)</a></div><div class='texpara'><div id='algos-11.1.sentence-1' class='sentence'>If <span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">r</span></span><span class="mjx-mo MJXc-space3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.077em; padding-bottom: 0.298em;">=</span></span><span class="mjx-mn MJXc-space3"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.372em; padding-bottom: 0.372em;">1</span></span></span></span></span>, returns <span class='texttt'>OneType<span class='curlybracket'>{</span><span class='curlybracket'>}</span></span><a class='hidden_link' href='#algos-11.1.sentence-1'>.</a></div></div></li><li id='algos-11.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-11.2'>(11.2)</a></div><div class='texpara'><div id='algos-11.2.sentence-1' class='sentence'>Otherwise, if <span class='math'><span class='mathalpha'>r</span></span> is a symbolic constant, returns <span class='math'><span class='mathalpha'>r</span></span><a class='hidden_link' href='#algos-11.2.sentence-1'>.</a></div></div></li><li id='algos-11.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-11.3'>(11.3)</a></div><div class='texpara'><div id='algos-11.3.sentence-1' class='sentence'>Otherwise, first applies the following mappings to the terms of <span class='math'><span class='mathalpha'>r</span></span>:
<ul class='itemize'><li id='algos-11.3.1'><div class='marginalizedparent' style='left:-48mm'><a class='marginalized' href='#algos-11.3.1'>(11.3.1)</a></div><span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">n</span></span><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mo"><span class="mjx-char MJXc-TeX-main-R" style="padding-top: 0.446em; padding-bottom: 0.593em;">/</span></span></span></span><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.446em; padding-bottom: 0.298em; padding-right: 0.003em;">d</span></span></span></span></span></span></span></span></span> is mapped to <span class='texttt'>power<span class='anglebracket'>&lt;</span><span class='math'><span class='mathalpha'>x</span></span>, <span class='math'><span class='mathalpha'>n</span></span>, <span class='math'><span class='mathalpha'>d</span></span><span class='anglebracket'>&gt;</span></span>, and
<span class="mjx-chtml"><span class="mjx-math"><span class="mjx-mrow" aria-hidden="true"><span class="mjx-msubsup"><span class="mjx-base"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">x</span></span></span><span class="mjx-sup" style="font-size: 70.7%; vertical-align: 0.513em; padding-left: 0px; padding-right: 0.071em;"><span class="mjx-texatom"><span class="mjx-mrow"><span class="mjx-mi"><span class="mjx-char MJXc-TeX-math-I" style="padding-top: 0.225em; padding-bottom: 0.298em;">n</span></span></span></span></span></span></span></span></span> is mapped to <span class='texttt'>power<span class='anglebracket'>&lt;</span><span class='math'><span class='mathalpha'>x</span></span>, <span class='math'><span class='mathalpha'>n</span></span><span class='anglebracket'>&gt;</span></span>, and</li><li id='algos-11.3.2'><div class='marginalizedparent' style='left:-48mm'><a class='marginalized' href='#algos-11.3.2'>(11.3.2)</a></div><span class='math'>1</span> is mapped to <span class='texttt'>OneType<span class='curlybracket'>{</span><span class='curlybracket'>}</span></span><a class='hidden_link' href='#algos-11.3.sentence-1'>.</a></li></ul></div></div></li><li id='algos-11.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-11.4'>(11.4)</a></div><div class='texpara'><div id='algos-11.4.sentence-1' class='sentence'>Then, a denominator <span class='math'><span class='mathalpha'>x</span></span> of <span class='math'><span class='mathalpha'>r</span></span> (if any) is mapped to <span class='texttt'>per<span class='anglebracket'>&lt;</span><span class='math'><span class='mathalpha'>x</span></span><span class='anglebracket'>&gt;</span></span><a class='hidden_link' href='#algos-11.4.sentence-1'>.</a></div></div></li><li id='algos-11.5'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-11.5'>(11.5)</a></div><div class='texpara'><div id='algos-11.5.sentence-1' class='sentence'>Then, sorts <span class='math'><span class='mathalpha'>r</span></span> without <span class='texttt'>per</span> (if any) and
the template arguments of <span class='texttt'>per</span> (if any)
according to <span class='texttt'>Pred</span><a class='hidden_link' href='#algos-11.5.sentence-1'>.</a></div></div></li><li id='algos-11.6'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-11.6'>(11.6)</a></div><div class='texpara'><div id='algos-11.6.sentence-1' class='sentence'>Finally, returns <span class='texttt'>To<span class='anglebracket'>&lt;</span><span class='math'><span class='mathalpha'>r</span></span><span class='anglebracket'>&gt;</span><span class='curlybracket'>{</span><span class='curlybracket'>}</span></span>, where <span class='texttt'>per</span> (if any) is the last argument<a class='hidden_link' href='#algos-11.6.sentence-1'>.</a></div></div></li></ul></div></div></div></div><div class='para' id='algos-12'><div class='marginalizedparent'><a class='marginalized' href='#algos-12'>12</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1288'>#</a></div><div class='texpara'><div id='algos-12.sentence-1' class='sentence'><i >Remarks</i>: A valid template argument list for <span class='texttt'>To</span> and <span class='texttt'>per</span>
is formed by interspersing commas between each mapped term<a class='hidden_link' href='#algos-12.sentence-1'>.</a></div> <div id='algos-12.sentence-2' class='sentence'>If a mapping to <span class='texttt'>std<span class='operator'>&#x200b;::&#x200b;</span>intmax_<span class='shy'></span>t</span> is not representable,
the program is ill-formed<a class='hidden_link' href='#algos-12.sentence-2'>.</a></div></div></div></div><div class='para' id='algos-13'><div class='marginalizedparent'><a class='marginalized' href='#algos-13'>13</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1296'>#</a></div><div class='texpara'><div id='algos-13.sentence-1' class='sentence'><span class='texttt'><i >expr-map</i></span> maps the contents of one symbolic expression to another resulting in a different type list<a class='hidden_link' href='#algos-13.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:expr-map'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:expr-map'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> Proj, <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType,
<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>&gt;</span> <span class='keyword'>typename</span> Pred <span class='operator'>=</span> <span class='texttt'><i >type-less</i></span>, <span class='keyword'>typename</span> T<span class='anglebracket'>&gt;</span>
<span class='keyword'>consteval</span> <span class='keyword'>auto</span> <span class='texttt'><i >expr-map</i></span><span class='parenthesis'>(</span>T<span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
</code></div></div></div><div class='para' id='algos-14'><div class='marginalizedparent'><a class='marginalized' href='#algos-14'>14</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1307'>#</a></div><div class='texpara'><div id='algos-14.sentence-1' class='sentence'>Let
<ul class='itemize'><li id='algos-14.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-14.1'>(14.1)</a></div><span class='texttt'><span class='texttt'><i >expr-type-map</i></span><span class='anglebracket'>&lt;</span>U<span class='anglebracket'>&gt;</span></span> be
<span class='texttt'>power<span class='anglebracket'>&lt;</span>Proj<span class='anglebracket'>&lt;</span>F<span class='anglebracket'>&gt;</span>, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span> if <span class='texttt'>U</span> is of the form <span class='texttt'>power<span class='anglebracket'>&lt;</span>F, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span>, and
<span class='texttt'>Proj<span class='anglebracket'>&lt;</span>U<span class='anglebracket'>&gt;</span></span> otherwise,</li><li id='algos-14.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-14.2'>(14.2)</a></div><span class='texttt'><span class='texttt'><i >map-power</i></span><span class='parenthesis'>(</span>u<span class='parenthesis'>)</span></span> be
<span class='texttt'>pow<span class='anglebracket'>&lt;</span>Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span>F<span class='curlybracket'>{</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span></span> if <span class='texttt'><span class='keyword'>decltype</span><span class='parenthesis'>(</span>u<span class='parenthesis'>)</span></span> is of the form <span class='texttt'>power<span class='anglebracket'>&lt;</span>F, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>&gt;</span></span>, and
<span class='texttt'>u</span> otherwise, and</li><li id='algos-14.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#algos-14.3'>(14.3)</a></div><span class='texttt'>Nums</span> and <span class='texttt'>Dens</span>
be packs denoting the template arguments of
<span class='texttt'>T<span class='operator'>&#x200b;::&#x200b;</span><span class='texttt'><i >nums</i></span></span> and <span class='texttt'>T<span class='operator'>&#x200b;::&#x200b;</span><span class='texttt'><i >dens</i></span></span>, respectively<a class='hidden_link' href='#algos-14.sentence-1'>.</a></li></ul></div></div></div></div><div class='para' id='algos-15'><div class='marginalizedparent'><a class='marginalized' href='#algos-15'>15</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-units329ffdaacb1bd7bed08565ac80d9eef7ccb1e5b5/source/quantities.tex#L1324'>#</a></div><div class='texpara'><div id='algos-15.sentence-1' class='sentence'><i >Returns</i>: <span class='codeblock'><span class='parenthesis'>(</span>OneType<span class='curlybracket'>{</span><span class='curlybracket'>}</span> <span class='operator'>*</span> <span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> <span class='operator'>*</span> <i >map-power</i><span class='parenthesis'>(</span><i >expr-type-map</i><span class='anglebracket'>&lt;</span>Nums<span class='anglebracket'>&gt;</span><span class='curlybracket'>{</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> <span class='operator'>/</span>
<span class='parenthesis'>(</span>OneType<span class='curlybracket'>{</span><span class='curlybracket'>}</span> <span class='operator'>*</span> <span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> <span class='operator'>*</span> <i >map-power</i><span class='parenthesis'>(</span><i >expr-type-map</i><span class='anglebracket'>&lt;</span>Dens<span class='anglebracket'>&gt;</span><span class='curlybracket'>{</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>
</span></div></div></div></div></div></div></body></html>