forked from mpusz/mp-units
257 lines
117 KiB
HTML
257 lines
117 KiB
HTML
<!DOCTYPE html><html lang='en'><head><title>[qty.utils]</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'>[qty.utils]</a></h2><div id='non.types' class='section'><h3 ><a class='secnum' href='#non.types' style='min-width:80pt'>5.3.1</a> Non-types <a class='abbr_ref' href='qty.utils.non.types.html'>[qty.utils.non.types]</a></h3><div class='texpara'><div id='lib:is-derived-from-specialization-of'><div id='lib:is-specialization-of'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:is-specialization-of'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span> T, <span class='keyword'>template</span><span class='anglebracket'><</span><i ><span class='texttt'>see below</span></i><span class='anglebracket'>></span> <span class='keyword'>typename</span> U<span class='anglebracket'>></span>
|
||
<span class='keyword'>consteval</span> <span class='keyword'>bool</span> <span class='texttt'><i >is-specialization-of</i></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span><span class='keyword'>typename</span> T, <span class='keyword'>template</span><span class='anglebracket'><</span><i ><span class='texttt'>see below</span></i><span class='anglebracket'>></span> <span class='keyword'>typename</span> U<span class='anglebracket'>></span>
|
||
<span class='keyword'>consteval</span> <span class='keyword'>bool</span> <span class='texttt'><i >is-derived-from-specialization-of</i></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>; <span class='comment'>// <i >exposition only</i></span>
|
||
</code></div></div></div></div><div class='para' id='non.types-1'><div class='marginalizedparent'><a class='marginalized' href='#non.types-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L710'>#</a></div><div class='texpara'><div id='non.types-1.sentence-1' class='sentence'><i >Returns</i>: <ul class='itemize'><li id='non.types-1.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#non.types-1.1'>(1.1)</a></div><div class='texpara'><div id='non.types-1.1.sentence-1' class='sentence'>For the first signature,
|
||
<span class='texttt'><span class='literal'>true</span></span> of <span class='texttt'>T</span> is a specialization of <span class='texttt'>U</span>, and
|
||
<span class='texttt'><span class='literal'>false</span></span> otherwise<a class='hidden_link' href='#non.types-1.1.sentence-1'>.</a></div></div></li><li id='non.types-1.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#non.types-1.2'>(1.2)</a></div><div class='texpara'><div id='non.types-1.2.sentence-1' class='sentence'>For the second signature,
|
||
<span class='texttt'><span class='literal'>true</span></span> if <span class='texttt'>T</span> has exactly one public base class
|
||
that is a specialization of <span class='texttt'>U</span>
|
||
and has no other base class that is a specialization of <span class='texttt'>U</span>, and
|
||
<span class='texttt'><span class='literal'>false</span></span> otherwise<a class='hidden_link' href='#non.types-1.2.sentence-1'>.</a></div></div></li></ul></div></div></div></div><div class='para' id='non.types-2'><div class='marginalizedparent'><a class='marginalized' href='#non.types-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L725'>#</a></div><div class='texpara'><div id='non.types-2.sentence-1' class='sentence'><i >Remarks</i>: An implementation provides enough overloads for all arguments to <span class='texttt'>U</span><a class='hidden_link' href='#non.types-2.sentence-1'>.</a></div></div></div></div></div><div id='qty.ratio' class='section'><h3 ><a class='secnum' href='#qty.ratio' style='min-width:80pt'>5.3.2</a> Ratio <a class='abbr_ref' href='qty.ratio.html'>[qty.ratio]</a></h3><div class='texpara'><span id='lib:ratio,is-integral'><span id='lib:is-integral,ratio'><span id='lib:ratio,operator/'><span id='lib:operator/,ratio'><span id='lib:ratio,operator+'><span id='lib:operator+,ratio'><span id='lib:ratio,operator-'><span id='lib:operator-,ratio'><span id='lib:ratio,operator<=>'><span id='lib:operator<=>,ratio'><span id='lib:ratio,operator=='><span id='lib:operator==,ratio'><span id='lib:ratio'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:ratio'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> mp_units <span class='curlybracket'>{</span>
|
||
|
||
<span class='keyword'>struct</span> <i >ratio</i> <span class='curlybracket'>{</span> <span class='comment'>// <i >exposition only</i></span>
|
||
std<span class='operator'>::</span>intmax_t num;
|
||
std<span class='operator'>::</span>intmax_t den;
|
||
|
||
<span class='keyword'>consteval</span> <i >ratio</i><span class='parenthesis'>(</span>std<span class='operator'>::</span>intmax_t n, std<span class='operator'>::</span>intmax_t d <span class='operator'>=</span> <span class='literal'>1</span><span class='parenthesis'>)</span>;
|
||
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span><i >ratio</i>, <i >ratio</i><span class='parenthesis'>)</span> <span class='operator'>=</span> <span class='keyword'>default</span>;
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <span class='keyword'>auto</span> <span class='keyword'>operator</span><span class='anglebracket'><</span><span class='operator'>=</span><span class='anglebracket'>></span><span class='parenthesis'>(</span><i >ratio</i> lhs, <i >ratio</i> rhs<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='parenthesis'>(</span>lhs <span class='operator'>-</span> rhs<span class='parenthesis'>)</span><span class='operator'>.</span>num <span class='anglebracket'><</span><span class='operator'>=</span><span class='anglebracket'>></span> <span class='literal'>0</span>; <span class='curlybracket'>}</span>
|
||
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <i >ratio</i> <span class='keyword'>operator</span><span class='operator'>-</span><span class='parenthesis'>(</span><i >ratio</i> r<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='curlybracket'>{</span><span class='operator'>-</span>r<span class='operator'>.</span>num, r<span class='operator'>.</span>den<span class='curlybracket'>}</span>; <span class='curlybracket'>}</span>
|
||
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <i >ratio</i> <span class='keyword'>operator</span><span class='operator'>+</span><span class='parenthesis'>(</span><i >ratio</i> lhs, <i >ratio</i> rhs<span class='parenthesis'>)</span>
|
||
<span class='curlybracket'>{</span>
|
||
<span class='keyword'>return</span> <span class='curlybracket'>{</span>lhs<span class='operator'>.</span>num <span class='operator'>*</span> rhs<span class='operator'>.</span>den <span class='operator'>+</span> lhs<span class='operator'>.</span>den <span class='operator'>*</span> rhs<span class='operator'>.</span>num, lhs<span class='operator'>.</span>den <span class='operator'>*</span> rhs<span class='operator'>.</span>den<span class='curlybracket'>}</span>;
|
||
<span class='curlybracket'>}</span>
|
||
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <i >ratio</i> <span class='keyword'>operator</span><span class='operator'>-</span><span class='parenthesis'>(</span><i >ratio</i> lhs, <i >ratio</i> rhs<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> lhs <span class='operator'>+</span> <span class='parenthesis'>(</span><span class='operator'>-</span>rhs<span class='parenthesis'>)</span>; <span class='curlybracket'>}</span>
|
||
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <i >ratio</i> <span class='keyword'>operator</span><span class='operator'>*</span><span class='parenthesis'>(</span><i >ratio</i> lhs, <i >ratio</i> rhs<span class='parenthesis'>)</span>;
|
||
|
||
<span class='keyword'>friend</span> <span class='keyword'>consteval</span> <i >ratio</i> <span class='keyword'>operator</span><span class='operator'>/</span><span class='parenthesis'>(</span><i >ratio</i> lhs, <i >ratio</i> rhs<span class='parenthesis'>)</span>
|
||
<span class='curlybracket'>{</span>
|
||
<span class='keyword'>return</span> lhs <span class='operator'>*</span> <i >ratio</i><span class='curlybracket'>{</span>rhs<span class='operator'>.</span>den, rhs<span class='operator'>.</span>num<span class='curlybracket'>}</span>;
|
||
<span class='curlybracket'>}</span>
|
||
<span class='curlybracket'>}</span>;
|
||
|
||
<span class='keyword'>consteval</span> <span class='keyword'>bool</span> <i >is-integral</i><span class='parenthesis'>(</span><i >ratio</i> r<span class='parenthesis'>)</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> r<span class='operator'>.</span>num <span class='operator'>%</span> r<span class='operator'>.</span>den <span class='operator'>=</span><span class='operator'>=</span> <span class='literal'>0</span>; <span class='curlybracket'>}</span>
|
||
|
||
<span class='keyword'>consteval</span> <i >ratio</i> <i >common-ratio</i><span class='parenthesis'>(</span><i >ratio</i> r1, <i >ratio</i> r2<span class='parenthesis'>)</span>;
|
||
|
||
<span class='curlybracket'>}</span>
|
||
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></div><div class='para' id='qty.ratio-1'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L775'>#</a></div><div class='texpara'><div id='qty.ratio-1.sentence-1' class='sentence'><span class='texttt'><i >ratio</i></span> represents the rational number <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.225em; 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='#qty.ratio-1.sentence-1'>.</a></div></div></div><div class='para' id='qty.ratio-2'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L778'>#</a></div><div class='texpara'><div id='qty.ratio-2.sentence-1' class='sentence'>Unless otherwise specified,
|
||
in the following descriptions,
|
||
let <span class='texttt'>R<span class='parenthesis'>(</span>r<span class='parenthesis'>)</span></span> be <span class='texttt'>std<span class='operator'>​::​</span>ratio<span class='anglebracket'><</span>N, D<span class='anglebracket'>></span></span>,
|
||
where <span class='texttt'>N</span> and <span class='texttt'>D</span> are the values of <span class='texttt'>r<span class='operator'>.</span>num</span> and <span class='texttt'>r<span class='operator'>.</span>den</span><a class='hidden_link' href='#qty.ratio-2.sentence-1'>.</a></div></div></div><div class='texpara'><div id='lib:ratio,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:ratio,constructor'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>consteval</span> <span class='texttt'><i >ratio</i></span><span class='parenthesis'>(</span>std<span class='operator'>::</span>intmax_t n, std<span class='operator'>::</span>intmax_t d <span class='operator'>=</span> <span class='literal'>1</span><span class='parenthesis'>)</span>;
|
||
</code></div></div></div><div class='para' id='qty.ratio-3'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L790'>#</a></div><div class='texpara'><div id='qty.ratio-3.sentence-1' class='sentence'>Let <span class='texttt'>N</span> and <span class='texttt'>D</span> be the values of <span class='texttt'>n</span> and <span class='texttt'>d</span><a class='hidden_link' href='#qty.ratio-3.sentence-1'>.</a></div> <div id='qty.ratio-3.sentence-2' class='sentence'>Let <span class='texttt'>R</span> be <span class='texttt'>std<span class='operator'>​::​</span>ratio<span class='anglebracket'><</span>N, D<span class='anglebracket'>></span></span><a class='hidden_link' href='#qty.ratio-3.sentence-2'>.</a></div></div></div></div><div class='para' id='qty.ratio-4'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L794'>#</a></div><div class='texpara'><div id='qty.ratio-4.sentence-1' class='sentence'><i >Effects</i>: Equivalent to
|
||
<span class='texttt'>R</span><a class='hidden_link' href='#qty.ratio-4.sentence-1'>.</a></div></div></div></div><div class='para' id='qty.ratio-5'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L799'>#</a></div><div class='texpara'><div id='qty.ratio-5.sentence-1' class='sentence'><i >Postconditions</i>: <span class='texttt'>num <span class='operator'>=</span><span class='operator'>=</span> R<span class='operator'>​::​</span>num <span class='operator'>&</span><span class='operator'>&</span> den <span class='operator'>=</span><span class='operator'>=</span> R<span class='operator'>​::​</span>den</span> is <span class='texttt'><span class='literal'>true</span></span><a class='hidden_link' href='#qty.ratio-5.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:ratio,operator*'><div id='lib:operator*,ratio'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator*,ratio'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>friend</span> <span class='keyword'>consteval</span> <span class='texttt'><i >ratio</i></span> <span class='keyword'>operator</span><span class='operator'>*</span><span class='parenthesis'>(</span><span class='texttt'><i >ratio</i></span> lhs, <span class='texttt'><i >ratio</i></span> rhs<span class='parenthesis'>)</span>;
|
||
</code></div></div></div></div><div class='para' id='qty.ratio-6'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L810'>#</a></div><div class='texpara'><div id='qty.ratio-6.sentence-1' class='sentence'>Let <span class='texttt'>Res</span> be <span class='texttt'>std<span class='operator'>​::​</span>ratio_<span class='shy'></span>multiply<span class='anglebracket'><</span>R<span class='parenthesis'>(</span>lhs<span class='parenthesis'>)</span>, R<span class='parenthesis'>(</span>rhs<span class='parenthesis'>)</span><span class='anglebracket'>></span></span><a class='hidden_link' href='#qty.ratio-6.sentence-1'>.</a></div></div></div></div><div class='para' id='qty.ratio-7'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-7'>7</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L813'>#</a></div><div class='texpara'><div id='qty.ratio-7.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
|
||
<span class='texttt'><span class='keyword'>return</span> <span class='curlybracket'>{</span>Res<span class='operator'>​::​</span>num, Res<span class='operator'>​::​</span>den<span class='curlybracket'>}</span>;</span></div></div></div></div><div class='texpara'><div id='lib:ratio,common-ratio'><div id='lib:common-ratio,ratio'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:common-ratio,ratio'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>consteval</span> <span class='texttt'><i >ratio</i></span> <span class='texttt'><i >common-ratio</i></span><span class='parenthesis'>(</span><span class='texttt'><i >ratio</i></span> r1, <span class='texttt'><i >ratio</i></span> r2<span class='parenthesis'>)</span>;
|
||
</code></div></div></div></div><div class='para' id='qty.ratio-8'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-8'>8</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L825'>#</a></div><div class='texpara'><div id='qty.ratio-8.sentence-1' class='sentence'>Let <span class='texttt'>Res</span> be equal to
|
||
<span class='codeblock'>std<span class='operator'>::</span>common_type<span class='anglebracket'><</span>std<span class='operator'>::</span>chrono<span class='operator'>::</span>duration<span class='anglebracket'><</span><span class='keyword'>int</span>, R<span class='parenthesis'>(</span>r1<span class='parenthesis'>)</span><span class='anglebracket'>></span>,
|
||
std<span class='operator'>::</span>chrono<span class='operator'>::</span>duration<span class='anglebracket'><</span><span class='keyword'>int</span>, R<span class='parenthesis'>(</span>r2<span class='parenthesis'>)</span><span class='anglebracket'>></span><span class='anglebracket'>></span><span class='operator'>::</span>type<span class='operator'>::</span>period
|
||
</span></div></div></div></div><div class='para' id='qty.ratio-9'><div class='marginalizedparent'><a class='marginalized' href='#qty.ratio-9'>9</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L832'>#</a></div><div class='texpara'><div id='qty.ratio-9.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
|
||
<span class='texttt'><span class='keyword'>return</span> <span class='curlybracket'>{</span>Res<span class='operator'>​::​</span>num, Res<span class='operator'>​::​</span>den<span class='curlybracket'>}</span>;</span></div></div></div></div></div><div id='qty.sym.txt' class='section'><h3 ><a class='secnum' href='#qty.sym.txt' style='min-width:80pt'>5.3.3</a> Symbol text <a class='abbr_ref' href='qty.sym.txt.html'>[qty.sym.txt]</a></h3><div class='texpara'><span id='lib:symbol_text'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:symbol_text'>🔗</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>std<span class='operator'>::</span>size_t N, std<span class='operator'>::</span>size_t M<span class='anglebracket'>></span>
|
||
<span class='keyword'>class</span> symbol_text <span class='curlybracket'>{</span>
|
||
<span class='keyword'>public</span><span class='operator'>:</span>
|
||
std<span class='operator'>::</span>fixed_u8string<span class='anglebracket'><</span>N<span class='anglebracket'>></span> <i >utf8</i>; <span class='comment'>// <i >exposition only</i></span>
|
||
std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>M<span class='anglebracket'>></span> <i >portable</i>; <span class='comment'>// <i >exposition only</i></span>
|
||
|
||
<span class='comment'>// constructors</span>
|
||
<span class='keyword'>constexpr</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>char</span> portable<span class='parenthesis'>)</span>;
|
||
<span class='keyword'>consteval</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span> <span class='parenthesis'>(</span><span class='operator'>&</span>portable<span class='parenthesis'>)</span><span class='squarebracket'>[</span>N <span class='operator'>+</span> <span class='literal'>1</span><span class='squarebracket'>]</span><span class='parenthesis'>)</span>;
|
||
<span class='keyword'>constexpr</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='operator'>&</span> portable<span class='parenthesis'>)</span>;
|
||
<span class='keyword'>consteval</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char8_t</span> <span class='parenthesis'>(</span><span class='operator'>&</span>utf8<span class='parenthesis'>)</span><span class='squarebracket'>[</span>N <span class='operator'>+</span> <span class='literal'>1</span><span class='squarebracket'>]</span>, <span class='keyword'>const</span> <span class='keyword'>char</span> <span class='parenthesis'>(</span><span class='operator'>&</span>portable<span class='parenthesis'>)</span><span class='squarebracket'>[</span>M <span class='operator'>+</span> <span class='literal'>1</span><span class='squarebracket'>]</span><span class='parenthesis'>)</span>;
|
||
<span class='keyword'>constexpr</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> std<span class='operator'>::</span>fixed_u8string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='operator'>&</span> utf8,
|
||
<span class='keyword'>const</span> std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>M<span class='anglebracket'>></span><span class='operator'>&</span> portable<span class='parenthesis'>)</span>;
|
||
|
||
<span class='comment'>// observers</span>
|
||
<span class='keyword'>constexpr</span> <span class='keyword'>const</span> <span class='keyword'>auto</span><span class='operator'>&</span> <span id='lib:symbol_text,utf8'><span id='lib:utf8,symbol_text'>utf8</span></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <i >utf8</i>; <span class='curlybracket'>}</span>
|
||
<span class='keyword'>constexpr</span> <span class='keyword'>const</span> <span class='keyword'>auto</span><span class='operator'>&</span> <span id='lib:symbol_text,portable'><span id='lib:portable,symbol_text'>portable</span></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <i >portable</i>; <span class='curlybracket'>}</span>
|
||
<span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span id='lib:symbol_text,empty'><span id='lib:empty,symbol_text'>empty</span></span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> utf8<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='operator'>.</span>empty<span class='parenthesis'>(</span><span class='parenthesis'>)</span>; <span class='curlybracket'>}</span>
|
||
|
||
<span class='comment'>// string operations</span>
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N2, std<span class='operator'>::</span>size_t M2<span class='anglebracket'>></span>
|
||
<span class='keyword'>friend</span> <span class='keyword'>constexpr</span> symbol_text<span class='anglebracket'><</span>N <span class='operator'>+</span> N2, M <span class='operator'>+</span> M2<span class='anglebracket'>></span> <span class='keyword'>operator</span><span class='operator'>+</span><span class='parenthesis'>(</span><span class='keyword'>const</span> symbol_text<span class='operator'>&</span> lhs,
|
||
<span class='keyword'>const</span> symbol_text<span class='anglebracket'><</span>N2, M2<span class='anglebracket'>></span><span class='operator'>&</span> rhs<span class='parenthesis'>)</span>;
|
||
|
||
<span class='comment'>// comparison</span>
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N2, std<span class='operator'>::</span>size_t M2<span class='anglebracket'>></span>
|
||
<span class='keyword'>friend</span> <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> symbol_text<span class='operator'>&</span> lhs,
|
||
<span class='keyword'>const</span> symbol_text<span class='anglebracket'><</span>N2, M2<span class='anglebracket'>></span><span class='operator'>&</span> rhs<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N2, std<span class='operator'>::</span>size_t M2<span class='anglebracket'>></span>
|
||
<span class='keyword'>friend</span> <span class='keyword'>constexpr</span> <span class='keyword'>auto</span> <span class='keyword'>operator</span><span class='anglebracket'><</span><span class='operator'>=</span><span class='anglebracket'>></span><span class='parenthesis'>(</span><span class='keyword'>const</span> symbol_text<span class='operator'>&</span> lhs,
|
||
<span class='keyword'>const</span> symbol_text<span class='anglebracket'><</span>N2, M2<span class='anglebracket'>></span><span class='operator'>&</span> rhs<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
|
||
<span class='curlybracket'>}</span>;
|
||
|
||
symbol_text<span class='parenthesis'>(</span><span class='keyword'>char</span><span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>></span> symbol_text<span class='anglebracket'><</span><span class='literal'>1</span>, <span class='literal'>1</span><span class='anglebracket'>></span>;
|
||
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N<span class='anglebracket'>></span>
|
||
symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span> <span class='parenthesis'>(</span><span class='operator'>&</span><span class='parenthesis'>)</span><span class='squarebracket'>[</span>N<span class='squarebracket'>]</span><span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>></span> symbol_text<span class='anglebracket'><</span>N <span class='operator'>-</span> <span class='literal'>1</span>, N <span class='operator'>-</span> <span class='literal'>1</span><span class='anglebracket'>></span>;
|
||
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N<span class='anglebracket'>></span>
|
||
symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='operator'>&</span><span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>></span> symbol_text<span class='anglebracket'><</span>N, N<span class='anglebracket'>></span>;
|
||
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N, std<span class='operator'>::</span>size_t M<span class='anglebracket'>></span>
|
||
symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char8_t</span> <span class='parenthesis'>(</span><span class='operator'>&</span><span class='parenthesis'>)</span><span class='squarebracket'>[</span>N<span class='squarebracket'>]</span>, <span class='keyword'>const</span> <span class='keyword'>char</span> <span class='parenthesis'>(</span><span class='operator'>&</span><span class='parenthesis'>)</span><span class='squarebracket'>[</span>M<span class='squarebracket'>]</span><span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>></span> symbol_text<span class='anglebracket'><</span>N <span class='operator'>-</span> <span class='literal'>1</span>, M <span class='operator'>-</span> <span class='literal'>1</span><span class='anglebracket'>></span>;
|
||
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N, std<span class='operator'>::</span>size_t M<span class='anglebracket'>></span>
|
||
symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> std<span class='operator'>::</span>fixed_u8string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='operator'>&</span>, <span class='keyword'>const</span> std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>M<span class='anglebracket'>></span><span class='operator'>&</span><span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>></span> symbol_text<span class='anglebracket'><</span>N, M<span class='anglebracket'>></span>;
|
||
|
||
<span class='curlybracket'>}</span>
|
||
</span></span></div><div class='para' id='qty.sym.txt-1'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L894'>#</a></div><div class='texpara'><div id='qty.sym.txt-1.sentence-1' class='sentence'><span class='texttt'>symbol_<span class='shy'></span>text</span> represents a symbol text<a class='hidden_link' href='#qty.sym.txt-1.sentence-1'>.</a></div> <div id='qty.sym.txt-1.sentence-2' class='sentence'><span class='texttt'><i >utf8</i></span> stores its UTF-8 representation, and
|
||
<span class='texttt'><i >portable</i></span> stores its portable representation<a class='hidden_link' href='#qty.sym.txt-1.sentence-2'>.</a></div> <div id='qty.sym.txt-1.sentence-3' class='sentence'><span class='texttt'>symbol_<span class='shy'></span>text<span class='anglebracket'><</span>N, M<span class='anglebracket'>></span></span> is a structural type (<a href="https://wg21.link/temp.paramterm.structural.type">N4971, [temp.param]</a>)<a class='hidden_link' href='#qty.sym.txt-1.sentence-3'>.</a></div></div></div><div class='para' id='qty.sym.txt-2'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L900'>#</a></div><div class='texpara'><div id='qty.sym.txt-2.sentence-1' class='sentence'>In the descriptions that follow,
|
||
it is a <i >Precondition</i> that
|
||
<ul class='itemize'><li id='qty.sym.txt-2.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#qty.sym.txt-2.1'>(2.1)</a></div>values of <span class='texttt'><span class='keyword'>char</span></span> are in the basic literal character set (<a href="https://wg21.link/lex.charset">N4971, [lex.charset]</a>), and</li><li id='qty.sym.txt-2.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#qty.sym.txt-2.2'>(2.2)</a></div>for a parameter of the form <span class='texttt'><span class='keyword'>const</span> <i >CharT</i> <span class='parenthesis'>(</span><span class='operator'>&</span><i >txt</i><span class='parenthesis'>)</span><span class='squarebracket'>[</span><i >M</i><span class='squarebracket'>]</span></span>,
|
||
<span class='texttt'><span class='parenthesis'>(</span><i >txt</i><span class='squarebracket'>[</span><i >M</i> <span class='operator'>-</span> <span class='literal'>1</span><span class='squarebracket'>]</span> <span class='operator'>=</span><span class='operator'>=</span> <i >CharT</i><span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span></span> is <span class='texttt'><span class='literal'>true</span></span><a class='hidden_link' href='#qty.sym.txt-2.sentence-1'>.</a></li></ul></div></div></div><div class='texpara'><div id='lib:symbol_text,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:symbol_text,constructor'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>constexpr</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>char</span> portable<span class='parenthesis'>)</span>;
|
||
<span class='keyword'>consteval</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char</span> <span class='parenthesis'>(</span><span class='operator'>&</span>portable<span class='parenthesis'>)</span><span class='squarebracket'>[</span>N <span class='operator'>+</span> <span class='literal'>1</span><span class='squarebracket'>]</span><span class='parenthesis'>)</span>;
|
||
<span class='keyword'>constexpr</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='operator'>&</span> portable<span class='parenthesis'>)</span>;
|
||
<span class='keyword'>consteval</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='keyword'>char8_t</span> <span class='parenthesis'>(</span><span class='operator'>&</span>utf8<span class='parenthesis'>)</span><span class='squarebracket'>[</span>N <span class='operator'>+</span> <span class='literal'>1</span><span class='squarebracket'>]</span>, <span class='keyword'>const</span> <span class='keyword'>char</span> <span class='parenthesis'>(</span><span class='operator'>&</span>portable<span class='parenthesis'>)</span><span class='squarebracket'>[</span>M <span class='operator'>+</span> <span class='literal'>1</span><span class='squarebracket'>]</span><span class='parenthesis'>)</span>;
|
||
<span class='keyword'>constexpr</span> symbol_text<span class='parenthesis'>(</span><span class='keyword'>const</span> std<span class='operator'>::</span>fixed_u8string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='operator'>&</span> utf8, <span class='keyword'>const</span> std<span class='operator'>::</span>fixed_string<span class='anglebracket'><</span>M<span class='anglebracket'>></span><span class='operator'>&</span> portable<span class='parenthesis'>)</span>;
|
||
</code></div></div></div><div class='para' id='qty.sym.txt-3'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L921'>#</a></div><div class='texpara'><div id='qty.sym.txt-3.sentence-1' class='sentence'>For the constructors without a parameter named <span class='texttt'>utf8</span>,
|
||
let <span class='texttt'>utf8</span> be:
|
||
<span class='codeblock'>std<span class='operator'>::</span>bit_cast<span class='anglebracket'><</span>std<span class='operator'>::</span>fixed_u8string<span class='anglebracket'><</span>N<span class='anglebracket'>></span><span class='anglebracket'>></span><span class='parenthesis'>(</span>std<span class='operator'>::</span>basic_fixed_string<span class='parenthesis'>(</span>portable<span class='parenthesis'>)</span><span class='parenthesis'>)</span>
|
||
</span></div></div></div></div><div class='para' id='qty.sym.txt-4'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L928'>#</a></div><div class='texpara'><div id='qty.sym.txt-4.sentence-1' class='sentence'><i >Effects</i>: Equivalent to the <span class='textsf'><i >mem-initializer-list</i></span>:
|
||
<span class='codeblock'><i >utf8</i><span class='curlybracket'>{</span>utf8<span class='curlybracket'>}</span>, <i >portable</i><span class='curlybracket'>{</span>portable<span class='curlybracket'>}</span>
|
||
</span></div></div></div></div><div class='texpara'><div id='lib:symbol_text,operator+'><div id='lib:operator+,symbol_text'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator+,symbol_text'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N2, std<span class='operator'>::</span>size_t M2<span class='anglebracket'>></span>
|
||
<span class='keyword'>friend</span> <span class='keyword'>constexpr</span> symbol_text<span class='anglebracket'><</span>N <span class='operator'>+</span> N2, M <span class='operator'>+</span> M2<span class='anglebracket'>></span> <span class='keyword'>operator</span><span class='operator'>+</span><span class='parenthesis'>(</span><span class='keyword'>const</span> symbol_text<span class='operator'>&</span> lhs,
|
||
<span class='keyword'>const</span> symbol_text<span class='anglebracket'><</span>N2, M2<span class='anglebracket'>></span><span class='operator'>&</span> rhs<span class='parenthesis'>)</span>;
|
||
</code></div></div></div></div><div class='para' id='qty.sym.txt-5'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L944'>#</a></div><div class='texpara'><div id='qty.sym.txt-5.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
|
||
<span class='codeblock'><span class='keyword'>return</span> symbol_text<span class='anglebracket'><</span>N <span class='operator'>+</span> N2, M <span class='operator'>+</span> M2<span class='anglebracket'>></span><span class='parenthesis'>(</span>lhs<span class='operator'>.</span>utf8<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>+</span> rhs<span class='operator'>.</span>utf8<span class='parenthesis'>(</span><span class='parenthesis'>)</span>,
|
||
lhs<span class='operator'>.</span>portable<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>+</span> rhs<span class='operator'>.</span>portable<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;
|
||
</span></div></div></div></div><div class='texpara'><div id='lib:symbol_text,operator<=>'><div id='lib:operator<=>,symbol_text'><div id='lib:symbol_text,operator=='><div id='lib:operator==,symbol_text'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator==,symbol_text'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N2, std<span class='operator'>::</span>size_t M2<span class='anglebracket'>></span>
|
||
<span class='keyword'>friend</span> <span class='keyword'>constexpr</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> symbol_text<span class='operator'>&</span> lhs,
|
||
<span class='keyword'>const</span> symbol_text<span class='anglebracket'><</span>N2, M2<span class='anglebracket'>></span><span class='operator'>&</span> rhs<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
|
||
<span class='keyword'>template</span><span class='anglebracket'><</span>std<span class='operator'>::</span>size_t N2, std<span class='operator'>::</span>size_t M2<span class='anglebracket'>></span>
|
||
<span class='keyword'>friend</span> <span class='keyword'>constexpr</span> <span class='keyword'>auto</span> <span class='keyword'>operator</span><span class='anglebracket'><</span><span class='operator'>=</span><span class='anglebracket'>></span><span class='parenthesis'>(</span><span class='keyword'>const</span> symbol_text<span class='operator'>&</span> lhs,
|
||
<span class='keyword'>const</span> symbol_text<span class='anglebracket'><</span>N2, M2<span class='anglebracket'>></span><span class='operator'>&</span> rhs<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
|
||
</code></div></div></div></div></div></div><div class='para' id='qty.sym.txt-6'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L965'>#</a></div><div class='texpara'><div id='qty.sym.txt-6.sentence-1' class='sentence'>Let <span class='texttt'>@</span> be the <span class='textsf'><i >operator</i></span><a class='hidden_link' href='#qty.sym.txt-6.sentence-1'>.</a></div></div></div></div><div class='para' id='qty.sym.txt-7'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.txt-7'>7</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/mpusz/mp-unitse9c5f7236ebfe1b287a5a4a49aaf57fbefa87233/source/quantities.tex#L968'>#</a></div><div class='texpara'><div id='qty.sym.txt-7.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
|
||
<span class='codeblock'><span class='keyword'>return</span> std<span class='operator'>::</span>make_tuple<span class='parenthesis'>(</span>std<span class='operator'>::</span>cref<span class='parenthesis'>(</span>lhs<span class='operator'>.</span>utf8<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>, std<span class='operator'>::</span>cref<span class='parenthesis'>(</span>lhs<span class='operator'>.</span>portable<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span> @
|
||
std<span class='operator'>::</span>make_tuple<span class='parenthesis'>(</span>std<span class='operator'>::</span>cref<span class='parenthesis'>(</span>rhs<span class='operator'>.</span>utf8<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>, std<span class='operator'>::</span>cref<span class='parenthesis'>(</span>rhs<span class='operator'>.</span>portable<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;
|
||
</span></div></div></div></div></div><div id='qty.sym.expr' class='section'><h3 ><a class='secnum' href='#qty.sym.expr' style='min-width:80pt'>5.3.4</a> Symbolic expressions <a class='abbr_ref' href='qty.sym.expr.html'>[qty.sym.expr]</a></h3><div id='qty.sym.expr.general' class='section'><h4 ><a class='secnum' href='#qty.sym.expr.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='qty.sym.expr.general-1'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.general-1.sentence-1' class='sentence'>Subclause <a href='#qty.sym.expr' title='5.3.4 Symbolic expressions'>[qty.<span class='shy'></span>sym.<span class='shy'></span>expr]</a> specifies the components
|
||
used to maintain ordered, simplified, and readable
|
||
argument lists in the names of specializations<a class='hidden_link' href='#qty.sym.expr.general-1.sentence-1'>.</a></div> <div id='qty.sym.expr.general-example-1' class='example'><div class='texpara'>[<i>Example <a href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.general-1.sentence-2'>.</a></div> — <i>end example</i>]</div></div></div></div></div><div id='qty.sym.expr.concepts' class='section'><h4 ><a class='secnum' href='#qty.sym.expr.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='qty.sym.expr.concepts-1'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.concepts-1.sentence-1'>.</a></div></div></div></div><div id='qty.sym.expr.types' class='section'><h4 ><a class='secnum' href='#qty.sym.expr.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='qty.sym.expr.types-1'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.types-1.sentence-1' class='sentence'><span class='texttt'>per</span> is used to store arguments with negative exponents<a class='hidden_link' href='#qty.sym.expr.types-1.sentence-1'>.</a></div> <div id='qty.sym.expr.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='#qty.sym.expr.types-1.sentence-2'>.</a></div> <div id='qty.sym.expr.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='#qty.sym.expr.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='qty.sym.expr.types-2'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.types-2.sentence-1'>.</a></div> <div id='qty.sym.expr.types-note-1' class='note'><div class='texpara'>[<i>Note <a href='#qty.sym.expr.types-note-1'>1</a></i>: <div id='qty.sym.expr.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='#qty.sym.expr.types-2.sentence-2'>.</a></div> — <i>end note</i>]</div></div> <div id='qty.sym.expr.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='#qty.sym.expr.types-2.sentence-3'>.</a></div></div></div><div class='para' id='qty.sym.expr.types-3'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.types-3.sentence-1'>.</a></div> <div id='qty.sym.expr.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='#qty.sym.expr.types-3.sentence-2'>.</a></div> <div id='qty.sym.expr.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='qty.sym.expr.algos' class='section'><h4 ><a class='secnum' href='#qty.sym.expr.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='qty.sym.expr.algos-1'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.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='qty.sym.expr.algos-2'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.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='qty.sym.expr.algos-3'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.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='qty.sym.expr.algos-4'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.algos-4.sentence-1'>.</a></div> <div id='qty.sym.expr.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='#qty.sym.expr.algos-4.sentence-2'>.</a></div> <ul class='itemize'><li id='qty.sym.expr.algos-4.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#qty.sym.expr.algos-4.1'>(4.1)</a></div><div class='texpara'><div id='qty.sym.expr.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='qty.sym.expr.algos-4.1.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-4.1.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-4.1.sentence-1'>.</a></li></ul></div></div></li><li id='qty.sym.expr.algos-4.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#qty.sym.expr.algos-4.2'>(4.2)</a></div><div class='texpara'><div id='qty.sym.expr.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='qty.sym.expr.algos-4.2.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-4.2.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-4.2.sentence-1'>.</a></li></ul></div></div></li></ul></div></div><div class='para' id='qty.sym.expr.algos-5'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-5.sentence-1' class='sentence'>The symbolic expression algorithms perform operations on symbolic constants<a class='hidden_link' href='#qty.sym.expr.algos-5.sentence-1'>.</a></div> <div id='qty.sym.expr.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='#qty.sym.expr.algos-5.sentence-2'>.</a></div> <div id='qty.sym.expr.algos-example-1' class='example'><div class='texpara'>[<i>Example <a href='#qty.sym.expr.algos-example-1'>1</a></i>: <div id='qty.sym.expr.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='#qty.sym.expr.algos-5.sentence-3'>.</a></div> — <i>end example</i>]</div></div> <div id='qty.sym.expr.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='#qty.sym.expr.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='qty.sym.expr.algos-6'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-6.sentence-1' class='sentence'><i >Mandates</i>: <ul class='itemize'><li id='qty.sym.expr.algos-6.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-6.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-6.sentence-1'>.</a> <div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-6.2.sentence-2'>.</a></div></div></li></ul></div></div></div></div><div class='para' id='qty.sym.expr.algos-7'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-7.sentence-1' class='sentence'><i >Effects</i>: </div></div></div></div><div class='para' id='qty.sym.expr.algos-8'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.algos-8.sentence-1'>.</a></div> <div id='qty.sym.expr.algos-8.sentence-2' class='sentence'>If the type of a function parameter is:
|
||
<ul class='itemize'><li id='qty.sym.expr.algos-8.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-8.1'>(8.1)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-8.1.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-8.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-8.2'>(8.2)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-8.2.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-8.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-8.3'>(8.3)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-8.3.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-8.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-8.4'>(8.4)</a></div><div class='texpara'><div id='qty.sym.expr.algos-8.4.sentence-1' class='sentence'>Otherwise, the input is the symbolic constant itself<a class='hidden_link' href='#qty.sym.expr.algos-8.4.sentence-1'>.</a></div></div></li></ul></div> <div id='qty.sym.expr.algos-example-2' class='example'><div class='texpara'>[<i>Example <a href='#qty.sym.expr.algos-example-2'>2</a></i>: <div id='qty.sym.expr.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='qty.sym.expr.algos-8.5'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-8.6'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-8.7'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-8.8'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-8.sentence-3'>.</a></li></ul></div> — <i>end example</i>]</div></div></div></div></div><div class='para' id='qty.sym.expr.algos-9'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-9.sentence-1' class='sentence'>Then, the operation takes place:
|
||
<ul class='itemize'><li id='qty.sym.expr.algos-9.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-9.1'>(9.1)</a></div><span class='texttt'><i >expr-multiply</i></span> multiplies its inputs,</li><li id='qty.sym.expr.algos-9.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-9.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-9.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-9.sentence-1'>.</a></li></ul></div></div></div></div><div class='para' id='qty.sym.expr.algos-10'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='qty.sym.expr.algos-10.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-10.1'>(10.1)</a></div><div class='texpara'><div id='qty.sym.expr.algos-10.1.sentence-1' class='sentence'>All terms are part of the same fraction (if any)<a class='hidden_link' href='#qty.sym.expr.algos-10.1.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-10.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-10.2'>(10.2)</a></div><div class='texpara'><div id='qty.sym.expr.algos-10.2.sentence-1' class='sentence'>There is at most a single term with a given symbolic constant<a class='hidden_link' href='#qty.sym.expr.algos-10.2.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-10.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-10.3'>(10.3)</a></div><div class='texpara'><div id='qty.sym.expr.algos-10.3.sentence-1' class='sentence'>There are no negative exponents<a class='hidden_link' href='#qty.sym.expr.algos-10.3.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-10.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-10.4'>(10.4)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-10.4.sentence-1'>.</a></div></div></li></ul></div> <div id='qty.sym.expr.algos-example-3' class='example'><div class='texpara'>[<i>Example <a href='#qty.sym.expr.algos-example-3'>3</a></i>: <div id='qty.sym.expr.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='qty.sym.expr.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='qty.sym.expr.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='qty.sym.expr.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='qty.sym.expr.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='qty.sym.expr.algos-11'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='qty.sym.expr.algos-11.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-11.1'>(11.1)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-11.1.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-11.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-11.2'>(11.2)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-11.2.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-11.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-11.3'>(11.3)</a></div><div class='texpara'><div id='qty.sym.expr.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='qty.sym.expr.algos-11.3.1'><div class='marginalizedparent' style='left:-48mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-11.3.2'><div class='marginalizedparent' style='left:-48mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-11.3.sentence-1'>.</a></li></ul></div></div></li><li id='qty.sym.expr.algos-11.4'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-11.4'>(11.4)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-11.4.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-11.5'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-11.5'>(11.5)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-11.5.sentence-1'>.</a></div></div></li><li id='qty.sym.expr.algos-11.6'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.algos-11.6'>(11.6)</a></div><div class='texpara'><div id='qty.sym.expr.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='#qty.sym.expr.algos-11.6.sentence-1'>.</a></div></div></li></ul></div></div></div></div><div class='para' id='qty.sym.expr.algos-12'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.algos-12.sentence-1'>.</a></div> <div id='qty.sym.expr.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='#qty.sym.expr.algos-12.sentence-2'>.</a></div></div></div></div><div class='para' id='qty.sym.expr.algos-13'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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='#qty.sym.expr.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='qty.sym.expr.algos-14'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-14.sentence-1' class='sentence'>Let
|
||
<ul class='itemize'><li id='qty.sym.expr.algos-14.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-14.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.algos-14.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#qty.sym.expr.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='#qty.sym.expr.algos-14.sentence-1'>.</a></li></ul></div></div></div></div><div class='para' id='qty.sym.expr.algos-15'><div class='marginalizedparent'><a class='marginalized' href='#qty.sym.expr.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='qty.sym.expr.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></div></body></html> |