forked from mpusz/mp-units
123 lines
70 KiB
HTML
123 lines
70 KiB
HTML
<!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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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 <a href='#general-example-1'>1</a></i>: <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<si​::​kilo_<span class='shy'></span><si​::​gram>, si​::​kilo_<span class='shy'></span><si​::​metre>, per<power<non_<span class='shy'></span>si​::​hour, 2>>></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> — <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'><</span><span class='keyword'>typename</span> T<span class='anglebracket'>></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'><</span>T<span class='anglebracket'>></span> <span class='operator'>&</span><span class='operator'>&</span> std<span class='operator'>::</span>is_final_v<span class='anglebracket'><</span>T<span class='anglebracket'>></span> <span class='operator'>&</span><span class='operator'>&</span> std<span class='operator'>::</span>is_trivially_default_constructible_v<span class='anglebracket'><</span>T<span class='anglebracket'>></span> <span class='operator'>&</span><span class='operator'>&</span>
|
||
std<span class='operator'>::</span>is_trivially_copy_constructible_v<span class='anglebracket'><</span>T<span class='anglebracket'>></span> <span class='operator'>&</span><span class='operator'>&</span> std<span class='operator'>::</span>is_trivially_move_constructible_v<span class='anglebracket'><</span>T<span class='anglebracket'>></span> <span class='operator'>&</span><span class='operator'>&</span>
|
||
std<span class='operator'>::</span>is_trivially_destructible_v<span class='anglebracket'><</span>T<span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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 Concept SymbolicConstant [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'><</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'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</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'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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 <a href='#types-note-1'>1</a></i>: <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> — <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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'>&</span><span class='operator'>&</span> <span class='parenthesis'>(</span>r <span class='anglebracket'>></span> <i >ratio</i><span class='curlybracket'>{</span><span class='literal'>0</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span> <span class='operator'>&</span><span class='operator'>&</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'><</span><span class='keyword'>typename</span> T<span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span>T<span class='anglebracket'>></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'><</span>U, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'><</span><span class='keyword'>typename</span> T, <span class='keyword'>typename</span> U<span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span><span class='keyword'>typename</span> Lhs, <span class='keyword'>typename</span> Rhs<span class='anglebracket'>></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'><</span><i >is-specialization-of</i><span class='anglebracket'><</span>Rhs, power<span class='anglebracket'>></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'><</span><i >expr-type</i><span class='anglebracket'><</span>Lhs<span class='anglebracket'>></span>, <i >expr-type</i><span class='anglebracket'><</span>Rhs<span class='anglebracket'>></span><span class='anglebracket'>></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Ts<span class='anglebracket'>></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'><</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'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span>OneType, Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span>, per<span class='anglebracket'><</span>Us<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span><span class='anglebracket'>></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'>​::​</span><span class='texttt'><i >num</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'><</span>Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'>​::​</span><span class='texttt'><i >den</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'><</span>Us<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'><</span>OneType, Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'>​::​</span><span class='texttt'><i >num</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'><</span>Ts<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'>​::​</span><span class='texttt'><i >den</i></span></span> denotes <span class='texttt'><span class='texttt'><i >type-list</i></span><span class='anglebracket'><</span><span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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 Concept SymbolicConstant [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 <a href='#algos-example-1'>1</a></i>: <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> — <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'><</span><span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType,
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>></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'>></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'><</span><span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType,
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>></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'>></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'><</span><span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType, <span class='keyword'>typename</span> T<span class='anglebracket'>></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'><</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'><</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span> <span class='keyword'>typename</span> To,
|
||
<span class='keyword'>typename</span> OneType, <span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>></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'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'>​::​</span>bool_<span class='shy'></span>constant<span class='anglebracket'><</span>B<span class='anglebracket'>></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'><</span>T, U<span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span>F, Num<span class='anglebracket'>></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'><</span>F, Num, Den<span class='anglebracket'>></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 <a href='#algos-example-2'>2</a></i>: <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'><</span>si<span class='operator'>​::​</span>kilo_<span class='shy'></span><span class='anglebracket'><</span>si<span class='operator'>​::​</span>metre<span class='anglebracket'>></span>, per<span class='anglebracket'><</span>power<span class='anglebracket'><</span>non_<span class='shy'></span>si<span class='operator'>​::​</span>hour, <span class='literal'>2</span><span class='anglebracket'>></span><span class='anglebracket'>></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> ×<span class='texttt'>per<span class='anglebracket'><</span>power<span class='anglebracket'><</span><span class='keyword'>decltype</span><span class='parenthesis'>(</span>h<span class='parenthesis'>)</span>, <span class='literal'>2</span><span class='anglebracket'>></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'><</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'>></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> — <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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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 <a href='#algos-example-3'>3</a></i>: <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> — <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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</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'>></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'><</span><span class='math'><span class='mathalpha'>x</span></span>, <span class='math'><span class='mathalpha'>n</span></span><span class='anglebracket'>></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'><</span><span class='math'><span class='mathalpha'>x</span></span><span class='anglebracket'>></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'><</span><span class='math'><span class='mathalpha'>r</span></span><span class='anglebracket'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'>​::​</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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span><span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span><span class='anglebracket'>></span> <span class='keyword'>typename</span> Proj, <span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span> <span class='keyword'>typename</span> To, <span class='keyword'>typename</span> OneType,
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span>, <span class='keyword'>typename</span><span class='anglebracket'>></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'>></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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span>U<span class='anglebracket'>></span></span> be
|
||
<span class='texttt'>power<span class='anglebracket'><</span>Proj<span class='anglebracket'><</span>F<span class='anglebracket'>></span>, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span></span> if <span class='texttt'>U</span> is of the form <span class='texttt'>power<span class='anglebracket'><</span>F, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></span></span>, and
|
||
<span class='texttt'>Proj<span class='anglebracket'><</span>U<span class='anglebracket'>></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'><</span>Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'><</span>F, Ints<span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='anglebracket'>></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'>​::​</span><span class='texttt'><i >nums</i></span></span> and <span class='texttt'>T<span class='operator'>​::​</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-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/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'><</span>Nums<span class='anglebracket'>></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'><</span>Dens<span class='anglebracket'>></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> |