Files
mercator_service/src/num_traits/lib.rs.html

1147 lines
93 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `/Users/sambuc/.cargo/registry/src/github.com-1ecc6299db9ec823/num-traits-0.2.11/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css"><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script src="../../storage.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="shortcut icon" href="../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../num_traits/index.html'><div class='logo-container'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../theme.js"></script><nav class="sub"><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" disabled autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../settings.html"><img src="../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
<span id="197">197</span>
<span id="198">198</span>
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
<span id="246">246</span>
<span id="247">247</span>
<span id="248">248</span>
<span id="249">249</span>
<span id="250">250</span>
<span id="251">251</span>
<span id="252">252</span>
<span id="253">253</span>
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
<span id="269">269</span>
<span id="270">270</span>
<span id="271">271</span>
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
<span id="294">294</span>
<span id="295">295</span>
<span id="296">296</span>
<span id="297">297</span>
<span id="298">298</span>
<span id="299">299</span>
<span id="300">300</span>
<span id="301">301</span>
<span id="302">302</span>
<span id="303">303</span>
<span id="304">304</span>
<span id="305">305</span>
<span id="306">306</span>
<span id="307">307</span>
<span id="308">308</span>
<span id="309">309</span>
<span id="310">310</span>
<span id="311">311</span>
<span id="312">312</span>
<span id="313">313</span>
<span id="314">314</span>
<span id="315">315</span>
<span id="316">316</span>
<span id="317">317</span>
<span id="318">318</span>
<span id="319">319</span>
<span id="320">320</span>
<span id="321">321</span>
<span id="322">322</span>
<span id="323">323</span>
<span id="324">324</span>
<span id="325">325</span>
<span id="326">326</span>
<span id="327">327</span>
<span id="328">328</span>
<span id="329">329</span>
<span id="330">330</span>
<span id="331">331</span>
<span id="332">332</span>
<span id="333">333</span>
<span id="334">334</span>
<span id="335">335</span>
<span id="336">336</span>
<span id="337">337</span>
<span id="338">338</span>
<span id="339">339</span>
<span id="340">340</span>
<span id="341">341</span>
<span id="342">342</span>
<span id="343">343</span>
<span id="344">344</span>
<span id="345">345</span>
<span id="346">346</span>
<span id="347">347</span>
<span id="348">348</span>
<span id="349">349</span>
<span id="350">350</span>
<span id="351">351</span>
<span id="352">352</span>
<span id="353">353</span>
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
<span id="371">371</span>
<span id="372">372</span>
<span id="373">373</span>
<span id="374">374</span>
<span id="375">375</span>
<span id="376">376</span>
<span id="377">377</span>
<span id="378">378</span>
<span id="379">379</span>
<span id="380">380</span>
<span id="381">381</span>
<span id="382">382</span>
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
<span id="387">387</span>
<span id="388">388</span>
<span id="389">389</span>
<span id="390">390</span>
<span id="391">391</span>
<span id="392">392</span>
<span id="393">393</span>
<span id="394">394</span>
<span id="395">395</span>
<span id="396">396</span>
<span id="397">397</span>
<span id="398">398</span>
<span id="399">399</span>
<span id="400">400</span>
<span id="401">401</span>
<span id="402">402</span>
<span id="403">403</span>
<span id="404">404</span>
<span id="405">405</span>
<span id="406">406</span>
<span id="407">407</span>
<span id="408">408</span>
<span id="409">409</span>
<span id="410">410</span>
<span id="411">411</span>
<span id="412">412</span>
<span id="413">413</span>
<span id="414">414</span>
<span id="415">415</span>
<span id="416">416</span>
<span id="417">417</span>
<span id="418">418</span>
<span id="419">419</span>
<span id="420">420</span>
<span id="421">421</span>
<span id="422">422</span>
<span id="423">423</span>
<span id="424">424</span>
<span id="425">425</span>
<span id="426">426</span>
<span id="427">427</span>
<span id="428">428</span>
<span id="429">429</span>
<span id="430">430</span>
<span id="431">431</span>
<span id="432">432</span>
<span id="433">433</span>
<span id="434">434</span>
<span id="435">435</span>
<span id="436">436</span>
<span id="437">437</span>
<span id="438">438</span>
<span id="439">439</span>
<span id="440">440</span>
<span id="441">441</span>
<span id="442">442</span>
<span id="443">443</span>
<span id="444">444</span>
<span id="445">445</span>
<span id="446">446</span>
<span id="447">447</span>
<span id="448">448</span>
<span id="449">449</span>
<span id="450">450</span>
<span id="451">451</span>
<span id="452">452</span>
<span id="453">453</span>
<span id="454">454</span>
<span id="455">455</span>
<span id="456">456</span>
<span id="457">457</span>
<span id="458">458</span>
<span id="459">459</span>
<span id="460">460</span>
<span id="461">461</span>
<span id="462">462</span>
<span id="463">463</span>
<span id="464">464</span>
<span id="465">465</span>
<span id="466">466</span>
<span id="467">467</span>
<span id="468">468</span>
<span id="469">469</span>
<span id="470">470</span>
<span id="471">471</span>
<span id="472">472</span>
<span id="473">473</span>
<span id="474">474</span>
<span id="475">475</span>
<span id="476">476</span>
<span id="477">477</span>
<span id="478">478</span>
<span id="479">479</span>
<span id="480">480</span>
<span id="481">481</span>
<span id="482">482</span>
<span id="483">483</span>
<span id="484">484</span>
<span id="485">485</span>
<span id="486">486</span>
<span id="487">487</span>
<span id="488">488</span>
<span id="489">489</span>
<span id="490">490</span>
<span id="491">491</span>
<span id="492">492</span>
<span id="493">493</span>
<span id="494">494</span>
<span id="495">495</span>
<span id="496">496</span>
<span id="497">497</span>
<span id="498">498</span>
<span id="499">499</span>
<span id="500">500</span>
<span id="501">501</span>
<span id="502">502</span>
<span id="503">503</span>
<span id="504">504</span>
<span id="505">505</span>
<span id="506">506</span>
<span id="507">507</span>
<span id="508">508</span>
<span id="509">509</span>
<span id="510">510</span>
<span id="511">511</span>
<span id="512">512</span>
<span id="513">513</span>
<span id="514">514</span>
<span id="515">515</span>
<span id="516">516</span>
<span id="517">517</span>
<span id="518">518</span>
<span id="519">519</span>
<span id="520">520</span>
<span id="521">521</span>
<span id="522">522</span>
<span id="523">523</span>
<span id="524">524</span>
<span id="525">525</span>
<span id="526">526</span>
<span id="527">527</span>
<span id="528">528</span>
<span id="529">529</span>
<span id="530">530</span>
<span id="531">531</span>
<span id="532">532</span>
<span id="533">533</span>
<span id="534">534</span>
<span id="535">535</span>
<span id="536">536</span>
<span id="537">537</span>
<span id="538">538</span>
<span id="539">539</span>
<span id="540">540</span>
<span id="541">541</span>
<span id="542">542</span>
<span id="543">543</span>
<span id="544">544</span>
<span id="545">545</span>
<span id="546">546</span>
<span id="547">547</span>
<span id="548">548</span>
<span id="549">549</span>
<span id="550">550</span>
<span id="551">551</span>
<span id="552">552</span>
<span id="553">553</span>
<span id="554">554</span>
<span id="555">555</span>
<span id="556">556</span>
<span id="557">557</span>
<span id="558">558</span>
<span id="559">559</span>
<span id="560">560</span>
<span id="561">561</span>
<span id="562">562</span>
<span id="563">563</span>
<span id="564">564</span>
<span id="565">565</span>
<span id="566">566</span>
<span id="567">567</span>
<span id="568">568</span>
<span id="569">569</span>
<span id="570">570</span>
<span id="571">571</span>
<span id="572">572</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="comment">// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT</span>
<span class="comment">// file at the top-level directory of this distribution and at</span>
<span class="comment">// http://rust-lang.org/COPYRIGHT.</span>
<span class="comment">//</span>
<span class="comment">// Licensed under the Apache License, Version 2.0 &lt;LICENSE-APACHE or</span>
<span class="comment">// http://www.apache.org/licenses/LICENSE-2.0&gt; or the MIT license</span>
<span class="comment">// &lt;LICENSE-MIT or http://opensource.org/licenses/MIT&gt;, at your</span>
<span class="comment">// option. This file may not be copied, modified, or distributed</span>
<span class="comment">// except according to those terms.</span>
<span class="doccomment">//! Numeric traits for generic mathematics</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! ## Compatibility</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! The `num-traits` crate is tested for rustc 1.8 and greater.</span>
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">html_root_url</span> <span class="op">=</span> <span class="string">&quot;https://docs.rs/num-traits/0.2&quot;</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">unconditional_recursion</span>)]</span>
<span class="attribute">#![<span class="ident">no_std</span>]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">&quot;std&quot;</span>)]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">std</span>;
<span class="comment">// Only `no_std` builds actually use `libm`.</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">not</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">&quot;std&quot;</span>), <span class="ident">feature</span> <span class="op">=</span> <span class="string">&quot;libm&quot;</span>))]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">libm</span>;
<span class="kw">use</span> <span class="ident">core</span>::<span class="ident">fmt</span>;
<span class="kw">use</span> <span class="ident">core</span>::<span class="ident">num</span>::<span class="ident">Wrapping</span>;
<span class="kw">use</span> <span class="ident">core</span>::<span class="ident">ops</span>::{<span class="ident">Add</span>, <span class="ident">Div</span>, <span class="ident">Mul</span>, <span class="ident">Rem</span>, <span class="ident">Sub</span>};
<span class="kw">use</span> <span class="ident">core</span>::<span class="ident">ops</span>::{<span class="ident">AddAssign</span>, <span class="ident">DivAssign</span>, <span class="ident">MulAssign</span>, <span class="ident">RemAssign</span>, <span class="ident">SubAssign</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">bounds</span>::<span class="ident">Bounded</span>;
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">any</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">&quot;std&quot;</span>, <span class="ident">feature</span> <span class="op">=</span> <span class="string">&quot;libm&quot;</span>))]</span>
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">float</span>::<span class="ident">Float</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">float</span>::<span class="ident">FloatConst</span>;
<span class="comment">// pub use real::{FloatCore, Real}; // NOTE: Don&#39;t do this, it breaks `use num_traits::*;`.</span>
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">cast</span>::{<span class="ident">cast</span>, <span class="ident">AsPrimitive</span>, <span class="ident">FromPrimitive</span>, <span class="ident">NumCast</span>, <span class="ident">ToPrimitive</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">identities</span>::{<span class="ident">one</span>, <span class="ident">zero</span>, <span class="ident">One</span>, <span class="ident">Zero</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">int</span>::<span class="ident">PrimInt</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">ops</span>::<span class="ident">checked</span>::{
<span class="ident">CheckedAdd</span>, <span class="ident">CheckedDiv</span>, <span class="ident">CheckedMul</span>, <span class="ident">CheckedNeg</span>, <span class="ident">CheckedRem</span>, <span class="ident">CheckedShl</span>, <span class="ident">CheckedShr</span>, <span class="ident">CheckedSub</span>,
};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">ops</span>::<span class="ident">inv</span>::<span class="ident">Inv</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">ops</span>::<span class="ident">mul_add</span>::{<span class="ident">MulAdd</span>, <span class="ident">MulAddAssign</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">ops</span>::<span class="ident">saturating</span>::<span class="ident">Saturating</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">ops</span>::<span class="ident">wrapping</span>::{<span class="ident">WrappingAdd</span>, <span class="ident">WrappingMul</span>, <span class="ident">WrappingShl</span>, <span class="ident">WrappingShr</span>, <span class="ident">WrappingSub</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">pow</span>::{<span class="ident">checked_pow</span>, <span class="ident">pow</span>, <span class="ident">Pow</span>};
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">sign</span>::{<span class="ident">abs</span>, <span class="ident">abs_sub</span>, <span class="ident">signum</span>, <span class="ident">Signed</span>, <span class="ident">Unsigned</span>};
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">mod</span> <span class="ident">macros</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">bounds</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">cast</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">float</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">identities</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">int</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">ops</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">pow</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">real</span>;
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">sign</span>;
<span class="doccomment">/// The base trait for numeric types, covering `0` and `1` values,</span>
<span class="doccomment">/// comparisons, basic numeric operations, and string conversion.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">Num</span>: <span class="ident">PartialEq</span> <span class="op">+</span> <span class="ident">Zero</span> <span class="op">+</span> <span class="ident">One</span> <span class="op">+</span> <span class="ident">NumOps</span> {
<span class="kw">type</span> <span class="ident">FromStrRadixErr</span>;
<span class="doccomment">/// Convert from a string and radix &lt;= 36.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// # Examples</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ```rust</span>
<span class="doccomment">/// use num_traits::Num;</span>
<span class="doccomment">///</span>
<span class="doccomment">/// let result = &lt;i32 as Num&gt;::from_str_radix(&quot;27&quot;, 10);</span>
<span class="doccomment">/// assert_eq!(result, Ok(27));</span>
<span class="doccomment">///</span>
<span class="doccomment">/// let result = &lt;i32 as Num&gt;::from_str_radix(&quot;foo&quot;, 10);</span>
<span class="doccomment">/// assert!(result.is_err());</span>
<span class="doccomment">/// ```</span>
<span class="kw">fn</span> <span class="ident">from_str_radix</span>(<span class="ident">str</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">radix</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="self">Self</span>::<span class="ident">FromStrRadixErr</span><span class="op">&gt;</span>;
}
<span class="doccomment">/// The trait for types implementing basic numeric operations</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This is automatically implemented for types which implement the operators.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">NumOps</span><span class="op">&lt;</span><span class="ident">Rhs</span> <span class="op">=</span> <span class="self">Self</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="self">Self</span><span class="op">&gt;</span>:
<span class="ident">Add</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Sub</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Mul</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Div</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Rem</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
{
}
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">Rhs</span>, <span class="ident">Output</span><span class="op">&gt;</span> <span class="ident">NumOps</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">T</span> <span class="kw">where</span>
<span class="ident">T</span>: <span class="ident">Add</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Sub</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Mul</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Div</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Rem</span><span class="op">&lt;</span><span class="ident">Rhs</span>, <span class="ident">Output</span> <span class="op">=</span> <span class="ident">Output</span><span class="op">&gt;</span>
{
}
<span class="doccomment">/// The trait for `Num` types which also implement numeric operations taking</span>
<span class="doccomment">/// the second operand by reference.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This is automatically implemented for types which implement the operators.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">NumRef</span>: <span class="ident">Num</span> <span class="op">+</span> <span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> <span class="ident">NumOps</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="self">Self</span><span class="op">&gt;</span> {}
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span> <span class="ident">NumRef</span> <span class="kw">for</span> <span class="ident">T</span> <span class="kw">where</span> <span class="ident">T</span>: <span class="ident">Num</span> <span class="op">+</span> <span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> <span class="ident">NumOps</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="ident">T</span><span class="op">&gt;</span> {}
<span class="doccomment">/// The trait for references which implement numeric operations, taking the</span>
<span class="doccomment">/// second operand either by value or by reference.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This is automatically implemented for types which implement the operators.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">RefNum</span><span class="op">&lt;</span><span class="ident">Base</span><span class="op">&gt;</span>: <span class="ident">NumOps</span><span class="op">&lt;</span><span class="ident">Base</span>, <span class="ident">Base</span><span class="op">&gt;</span> <span class="op">+</span> <span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> <span class="ident">NumOps</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="ident">Base</span>, <span class="ident">Base</span><span class="op">&gt;</span> {}
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">Base</span><span class="op">&gt;</span> <span class="ident">RefNum</span><span class="op">&lt;</span><span class="ident">Base</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">T</span> <span class="kw">where</span> <span class="ident">T</span>: <span class="ident">NumOps</span><span class="op">&lt;</span><span class="ident">Base</span>, <span class="ident">Base</span><span class="op">&gt;</span> <span class="op">+</span> <span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> <span class="ident">NumOps</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="ident">Base</span>, <span class="ident">Base</span><span class="op">&gt;</span> {}
<span class="doccomment">/// The trait for types implementing numeric assignment operators (like `+=`).</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This is automatically implemented for types which implement the operators.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">NumAssignOps</span><span class="op">&lt;</span><span class="ident">Rhs</span> <span class="op">=</span> <span class="self">Self</span><span class="op">&gt;</span>:
<span class="ident">AddAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">SubAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">MulAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">DivAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">RemAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span>
{
}
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>, <span class="ident">Rhs</span><span class="op">&gt;</span> <span class="ident">NumAssignOps</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="kw">for</span> <span class="ident">T</span> <span class="kw">where</span>
<span class="ident">T</span>: <span class="ident">AddAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">SubAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">MulAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">DivAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span> <span class="op">+</span> <span class="ident">RemAssign</span><span class="op">&lt;</span><span class="ident">Rhs</span><span class="op">&gt;</span>
{
}
<span class="doccomment">/// The trait for `Num` types which also implement assignment operators.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This is automatically implemented for types which implement the operators.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">NumAssign</span>: <span class="ident">Num</span> <span class="op">+</span> <span class="ident">NumAssignOps</span> {}
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span> <span class="ident">NumAssign</span> <span class="kw">for</span> <span class="ident">T</span> <span class="kw">where</span> <span class="ident">T</span>: <span class="ident">Num</span> <span class="op">+</span> <span class="ident">NumAssignOps</span> {}
<span class="doccomment">/// The trait for `NumAssign` types which also implement assignment operations</span>
<span class="doccomment">/// taking the second operand by reference.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This is automatically implemented for types which implement the operators.</span>
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">NumAssignRef</span>: <span class="ident">NumAssign</span> <span class="op">+</span> <span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> <span class="ident">NumAssignOps</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="self">Self</span><span class="op">&gt;</span> {}
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span> <span class="ident">NumAssignRef</span> <span class="kw">for</span> <span class="ident">T</span> <span class="kw">where</span> <span class="ident">T</span>: <span class="ident">NumAssign</span> <span class="op">+</span> <span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;r</span><span class="op">&gt;</span> <span class="ident">NumAssignOps</span><span class="op">&lt;</span><span class="kw-2">&amp;</span><span class="lifetime">&#39;r</span> <span class="ident">T</span><span class="op">&gt;</span> {}
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">int_trait_impl</span> {
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span>:<span class="ident">ident</span> <span class="kw">for</span> $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">ty</span>)<span class="kw-2">*</span>) <span class="op">=</span><span class="op">&gt;</span> ($(
<span class="kw">impl</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span> <span class="kw">for</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span> {
<span class="kw">type</span> <span class="ident">FromStrRadixErr</span> <span class="op">=</span> ::<span class="ident">core</span>::<span class="ident">num</span>::<span class="ident">ParseIntError</span>;
<span class="attribute">#[<span class="ident">inline</span>]</span>
<span class="kw">fn</span> <span class="ident">from_str_radix</span>(<span class="ident">s</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">radix</span>: <span class="ident">u32</span>)
<span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, ::<span class="ident">core</span>::<span class="ident">num</span>::<span class="ident">ParseIntError</span><span class="op">&gt;</span>
{
<span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span><span class="op">&gt;</span>::<span class="ident">from_str_radix</span>(<span class="ident">s</span>, <span class="ident">radix</span>)
}
}
)<span class="kw-2">*</span>)
}
<span class="macro">int_trait_impl</span><span class="macro">!</span>(<span class="ident">Num</span> <span class="kw">for</span> <span class="ident">usize</span> <span class="ident">u8</span> <span class="ident">u16</span> <span class="ident">u32</span> <span class="ident">u64</span> <span class="ident">isize</span> <span class="ident">i8</span> <span class="ident">i16</span> <span class="ident">i32</span> <span class="ident">i64</span>);
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">has_i128</span>)]</span>
<span class="macro">int_trait_impl</span><span class="macro">!</span>(<span class="ident">Num</span> <span class="kw">for</span> <span class="ident">u128</span> <span class="ident">i128</span>);
<span class="kw">impl</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Num</span><span class="op">&gt;</span> <span class="ident">Num</span> <span class="kw">for</span> <span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>
<span class="kw">where</span>
<span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>: <span class="ident">Add</span><span class="op">&lt;</span><span class="ident">Output</span> <span class="op">=</span> <span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Sub</span><span class="op">&lt;</span><span class="ident">Output</span> <span class="op">=</span> <span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Mul</span><span class="op">&lt;</span><span class="ident">Output</span> <span class="op">=</span> <span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Div</span><span class="op">&lt;</span><span class="ident">Output</span> <span class="op">=</span> <span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span><span class="op">&gt;</span>
<span class="op">+</span> <span class="ident">Rem</span><span class="op">&lt;</span><span class="ident">Output</span> <span class="op">=</span> <span class="ident">Wrapping</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span><span class="op">&gt;</span>,
{
<span class="kw">type</span> <span class="ident">FromStrRadixErr</span> <span class="op">=</span> <span class="ident">T</span>::<span class="ident">FromStrRadixErr</span>;
<span class="kw">fn</span> <span class="ident">from_str_radix</span>(<span class="ident">str</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">radix</span>: <span class="ident">u32</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="self">Self</span>::<span class="ident">FromStrRadixErr</span><span class="op">&gt;</span> {
<span class="ident">T</span>::<span class="ident">from_str_radix</span>(<span class="ident">str</span>, <span class="ident">radix</span>).<span class="ident">map</span>(<span class="ident">Wrapping</span>)
}
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">enum</span> <span class="ident">FloatErrorKind</span> {
<span class="ident">Empty</span>,
<span class="ident">Invalid</span>,
}
<span class="comment">// FIXME: core::num::ParseFloatError is stable in 1.0, but opaque to us,</span>
<span class="comment">// so there&#39;s not really any way for us to reuse it.</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">ParseFloatError</span> {
<span class="kw">pub</span> <span class="ident">kind</span>: <span class="ident">FloatErrorKind</span>,
}
<span class="kw">impl</span> <span class="ident">fmt</span>::<span class="ident">Display</span> <span class="kw">for</span> <span class="ident">ParseFloatError</span> {
<span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">fmt</span>::<span class="ident">Formatter</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">fmt</span>::<span class="prelude-ty">Result</span> {
<span class="kw">let</span> <span class="ident">description</span> <span class="op">=</span> <span class="kw">match</span> <span class="self">self</span>.<span class="ident">kind</span> {
<span class="ident">FloatErrorKind</span>::<span class="ident">Empty</span> <span class="op">=</span><span class="op">&gt;</span> <span class="string">&quot;cannot parse float from empty string&quot;</span>,
<span class="ident">FloatErrorKind</span>::<span class="ident">Invalid</span> <span class="op">=</span><span class="op">&gt;</span> <span class="string">&quot;invalid float literal&quot;</span>,
};
<span class="ident">description</span>.<span class="ident">fmt</span>(<span class="ident">f</span>)
}
}
<span class="comment">// FIXME: The standard library from_str_radix on floats was deprecated, so we&#39;re stuck</span>
<span class="comment">// with this implementation ourselves until we want to make a breaking change.</span>
<span class="comment">// (would have to drop it from `Num` though)</span>
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">float_trait_impl</span> {
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span>:<span class="ident">ident</span> <span class="kw">for</span> $(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">ident</span>)<span class="kw-2">*</span>) <span class="op">=</span><span class="op">&gt;</span> ($(
<span class="kw">impl</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">name</span> <span class="kw">for</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span> {
<span class="kw">type</span> <span class="ident">FromStrRadixErr</span> <span class="op">=</span> <span class="ident">ParseFloatError</span>;
<span class="kw">fn</span> <span class="ident">from_str_radix</span>(<span class="ident">src</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>, <span class="ident">radix</span>: <span class="ident">u32</span>)
<span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="self">Self</span>::<span class="ident">FromStrRadixErr</span><span class="op">&gt;</span>
{
<span class="kw">use</span> <span class="self">self</span>::<span class="ident">FloatErrorKind</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="self">self</span>::<span class="ident">ParseFloatError</span> <span class="kw">as</span> <span class="ident">PFE</span>;
<span class="comment">// Special values</span>
<span class="kw">match</span> <span class="ident">src</span> {
<span class="string">&quot;inf&quot;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">INFINITY</span>),
<span class="string">&quot;-inf&quot;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">NEG_INFINITY</span>),
<span class="string">&quot;NaN&quot;</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">NAN</span>),
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> {},
}
<span class="kw">fn</span> <span class="ident">slice_shift_char</span>(<span class="ident">src</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span>(<span class="ident">char</span>, <span class="kw-2">&amp;</span><span class="ident">str</span>)<span class="op">&gt;</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">chars</span> <span class="op">=</span> <span class="ident">src</span>.<span class="ident">chars</span>();
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">ch</span>) <span class="op">=</span> <span class="ident">chars</span>.<span class="ident">next</span>() {
<span class="prelude-val">Some</span>((<span class="ident">ch</span>, <span class="ident">chars</span>.<span class="ident">as_str</span>()))
} <span class="kw">else</span> {
<span class="prelude-val">None</span>
}
}
<span class="kw">let</span> (<span class="ident">is_positive</span>, <span class="ident">src</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">slice_shift_char</span>(<span class="ident">src</span>) {
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Empty</span> }),
<span class="prelude-val">Some</span>((<span class="string">&#39;-&#39;</span>, <span class="string">&quot;&quot;</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Empty</span> }),
<span class="prelude-val">Some</span>((<span class="string">&#39;-&#39;</span>, <span class="ident">src</span>)) <span class="op">=</span><span class="op">&gt;</span> (<span class="bool-val">false</span>, <span class="ident">src</span>),
<span class="prelude-val">Some</span>((<span class="kw">_</span>, <span class="kw">_</span>)) <span class="op">=</span><span class="op">&gt;</span> (<span class="bool-val">true</span>, <span class="ident">src</span>),
};
<span class="comment">// The significand to accumulate</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">sig</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">is_positive</span> { <span class="number">0.0</span> } <span class="kw">else</span> { <span class="op">-</span><span class="number">0.0</span> };
<span class="comment">// Necessary to detect overflow</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">prev_sig</span> <span class="op">=</span> <span class="ident">sig</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">cs</span> <span class="op">=</span> <span class="ident">src</span>.<span class="ident">chars</span>().<span class="ident">enumerate</span>();
<span class="comment">// Exponent prefix and exponent index offset</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">exp_info</span> <span class="op">=</span> <span class="prelude-val">None</span>::<span class="op">&lt;</span>(<span class="ident">char</span>, <span class="ident">usize</span>)<span class="op">&gt;</span>;
<span class="comment">// Parse the integer part of the significand</span>
<span class="kw">for</span> (<span class="ident">i</span>, <span class="ident">c</span>) <span class="kw">in</span> <span class="ident">cs</span>.<span class="ident">by_ref</span>() {
<span class="kw">match</span> <span class="ident">c</span>.<span class="ident">to_digit</span>(<span class="ident">radix</span>) {
<span class="prelude-val">Some</span>(<span class="ident">digit</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// shift significand one digit left</span>
<span class="ident">sig</span> <span class="op">=</span> <span class="ident">sig</span> <span class="op">*</span> (<span class="ident">radix</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>);
<span class="comment">// add/subtract current digit depending on sign</span>
<span class="kw">if</span> <span class="ident">is_positive</span> {
<span class="ident">sig</span> <span class="op">=</span> <span class="ident">sig</span> <span class="op">+</span> ((<span class="ident">digit</span> <span class="kw">as</span> <span class="ident">isize</span>) <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>);
} <span class="kw">else</span> {
<span class="ident">sig</span> <span class="op">=</span> <span class="ident">sig</span> <span class="op">-</span> ((<span class="ident">digit</span> <span class="kw">as</span> <span class="ident">isize</span>) <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>);
}
<span class="comment">// Detect overflow by comparing to last value, except</span>
<span class="comment">// if we&#39;ve not seen any non-zero digits.</span>
<span class="kw">if</span> <span class="ident">prev_sig</span> <span class="op">!</span><span class="op">=</span> <span class="number">0.0</span> {
<span class="kw">if</span> <span class="ident">is_positive</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">sig</span> <span class="op">&lt;</span><span class="op">=</span> <span class="ident">prev_sig</span>
{ <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">INFINITY</span>); }
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_positive</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">sig</span> <span class="op">&gt;</span><span class="op">=</span> <span class="ident">prev_sig</span>
{ <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">NEG_INFINITY</span>); }
<span class="comment">// Detect overflow by reversing the shift-and-add process</span>
<span class="kw">if</span> <span class="ident">is_positive</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> (<span class="ident">prev_sig</span> <span class="op">!</span><span class="op">=</span> (<span class="ident">sig</span> <span class="op">-</span> <span class="ident">digit</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>) <span class="op">/</span> <span class="ident">radix</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)
{ <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">INFINITY</span>); }
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_positive</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> (<span class="ident">prev_sig</span> <span class="op">!</span><span class="op">=</span> (<span class="ident">sig</span> <span class="op">+</span> <span class="ident">digit</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>) <span class="op">/</span> <span class="ident">radix</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>)
{ <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">NEG_INFINITY</span>); }
}
<span class="ident">prev_sig</span> <span class="op">=</span> <span class="ident">sig</span>;
},
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">c</span> {
<span class="string">&#39;e&#39;</span> <span class="op">|</span> <span class="string">&#39;E&#39;</span> <span class="op">|</span> <span class="string">&#39;p&#39;</span> <span class="op">|</span> <span class="string">&#39;P&#39;</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">exp_info</span> <span class="op">=</span> <span class="prelude-val">Some</span>((<span class="ident">c</span>, <span class="ident">i</span> <span class="op">+</span> <span class="number">1</span>));
<span class="kw">break</span>; <span class="comment">// start of exponent</span>
},
<span class="string">&#39;.&#39;</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">break</span>; <span class="comment">// start of fractional part</span>
},
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Invalid</span> });
},
},
}
}
<span class="comment">// If we are not yet at the exponent parse the fractional</span>
<span class="comment">// part of the significand</span>
<span class="kw">if</span> <span class="ident">exp_info</span>.<span class="ident">is_none</span>() {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">power</span> <span class="op">=</span> <span class="number">1.0</span>;
<span class="kw">for</span> (<span class="ident">i</span>, <span class="ident">c</span>) <span class="kw">in</span> <span class="ident">cs</span>.<span class="ident">by_ref</span>() {
<span class="kw">match</span> <span class="ident">c</span>.<span class="ident">to_digit</span>(<span class="ident">radix</span>) {
<span class="prelude-val">Some</span>(<span class="ident">digit</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// Decrease power one order of magnitude</span>
<span class="ident">power</span> <span class="op">=</span> <span class="ident">power</span> <span class="op">/</span> (<span class="ident">radix</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>);
<span class="comment">// add/subtract current digit depending on sign</span>
<span class="ident">sig</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">is_positive</span> {
<span class="ident">sig</span> <span class="op">+</span> (<span class="ident">digit</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>) <span class="op">*</span> <span class="ident">power</span>
} <span class="kw">else</span> {
<span class="ident">sig</span> <span class="op">-</span> (<span class="ident">digit</span> <span class="kw">as</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>) <span class="op">*</span> <span class="ident">power</span>
};
<span class="comment">// Detect overflow by comparing to last value</span>
<span class="kw">if</span> <span class="ident">is_positive</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">sig</span> <span class="op">&lt;</span> <span class="ident">prev_sig</span>
{ <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">INFINITY</span>); }
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_positive</span> <span class="kw-2">&amp;</span><span class="op">&amp;</span> <span class="ident">sig</span> <span class="op">&gt;</span> <span class="ident">prev_sig</span>
{ <span class="kw">return</span> <span class="prelude-val">Ok</span>(<span class="ident">core</span>::<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>::<span class="ident">NEG_INFINITY</span>); }
<span class="ident">prev_sig</span> <span class="op">=</span> <span class="ident">sig</span>;
},
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">c</span> {
<span class="string">&#39;e&#39;</span> <span class="op">|</span> <span class="string">&#39;E&#39;</span> <span class="op">|</span> <span class="string">&#39;p&#39;</span> <span class="op">|</span> <span class="string">&#39;P&#39;</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">exp_info</span> <span class="op">=</span> <span class="prelude-val">Some</span>((<span class="ident">c</span>, <span class="ident">i</span> <span class="op">+</span> <span class="number">1</span>));
<span class="kw">break</span>; <span class="comment">// start of exponent</span>
},
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Invalid</span> });
},
},
}
}
}
<span class="comment">// Parse and calculate the exponent</span>
<span class="kw">let</span> <span class="ident">exp</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">exp_info</span> {
<span class="prelude-val">Some</span>((<span class="ident">c</span>, <span class="ident">offset</span>)) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">base</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">c</span> {
<span class="string">&#39;E&#39;</span> <span class="op">|</span> <span class="string">&#39;e&#39;</span> <span class="kw">if</span> <span class="ident">radix</span> <span class="op">=</span><span class="op">=</span> <span class="number">10</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">10.0</span>,
<span class="string">&#39;P&#39;</span> <span class="op">|</span> <span class="string">&#39;p&#39;</span> <span class="kw">if</span> <span class="ident">radix</span> <span class="op">=</span><span class="op">=</span> <span class="number">16</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">2.0</span>,
<span class="kw">_</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Invalid</span> }),
};
<span class="comment">// Parse the exponent as decimal integer</span>
<span class="kw">let</span> <span class="ident">src</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">src</span>[<span class="ident">offset</span>..];
<span class="kw">let</span> (<span class="ident">is_positive</span>, <span class="ident">exp</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">slice_shift_char</span>(<span class="ident">src</span>) {
<span class="prelude-val">Some</span>((<span class="string">&#39;-&#39;</span>, <span class="ident">src</span>)) <span class="op">=</span><span class="op">&gt;</span> (<span class="bool-val">false</span>, <span class="ident">src</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">usize</span><span class="op">&gt;</span>()),
<span class="prelude-val">Some</span>((<span class="string">&#39;+&#39;</span>, <span class="ident">src</span>)) <span class="op">=</span><span class="op">&gt;</span> (<span class="bool-val">true</span>, <span class="ident">src</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">usize</span><span class="op">&gt;</span>()),
<span class="prelude-val">Some</span>((<span class="kw">_</span>, <span class="kw">_</span>)) <span class="op">=</span><span class="op">&gt;</span> (<span class="bool-val">true</span>, <span class="ident">src</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">usize</span><span class="op">&gt;</span>()),
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Invalid</span> }),
};
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">&quot;std&quot;</span>)]</span>
<span class="kw">fn</span> <span class="ident">pow</span>(<span class="ident">base</span>: <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>, <span class="ident">exp</span>: <span class="ident">usize</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span> {
<span class="ident">Float</span>::<span class="ident">powi</span>(<span class="ident">base</span>, <span class="ident">exp</span> <span class="kw">as</span> <span class="ident">i32</span>)
}
<span class="comment">// otherwise uses the generic `pow` from the root</span>
<span class="kw">match</span> (<span class="ident">is_positive</span>, <span class="ident">exp</span>) {
(<span class="bool-val">true</span>, <span class="prelude-val">Ok</span>(<span class="ident">exp</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">pow</span>(<span class="ident">base</span>, <span class="ident">exp</span>),
(<span class="bool-val">false</span>, <span class="prelude-val">Ok</span>(<span class="ident">exp</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="number">1.0</span> <span class="op">/</span> <span class="ident">pow</span>(<span class="ident">base</span>, <span class="ident">exp</span>),
(<span class="kw">_</span>, <span class="prelude-val">Err</span>(<span class="kw">_</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">PFE</span> { <span class="ident">kind</span>: <span class="ident">Invalid</span> }),
}
},
<span class="prelude-val">None</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">1.0</span>, <span class="comment">// no exponent</span>
};
<span class="prelude-val">Ok</span>(<span class="ident">sig</span> <span class="op">*</span> <span class="ident">exp</span>)
}
}
)<span class="kw-2">*</span>)
}
<span class="macro">float_trait_impl</span><span class="macro">!</span>(<span class="ident">Num</span> <span class="kw">for</span> <span class="ident">f32</span> <span class="ident">f64</span>);
<span class="doccomment">/// A value bounded by a minimum and a maximum</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If input is less than min then this returns min.</span>
<span class="doccomment">/// If input is greater than max then this returns max.</span>
<span class="doccomment">/// Otherwise this returns input.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// **Panics** in debug mode if `!(min &lt;= max)`.</span>
<span class="attribute">#[<span class="ident">inline</span>]</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">clamp</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">PartialOrd</span><span class="op">&gt;</span>(<span class="ident">input</span>: <span class="ident">T</span>, <span class="ident">min</span>: <span class="ident">T</span>, <span class="ident">max</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span> {
<span class="macro">debug_assert</span><span class="macro">!</span>(<span class="ident">min</span> <span class="op">&lt;</span><span class="op">=</span> <span class="ident">max</span>, <span class="string">&quot;min must be less than or equal to max&quot;</span>);
<span class="kw">if</span> <span class="ident">input</span> <span class="op">&lt;</span> <span class="ident">min</span> {
<span class="ident">min</span>
} <span class="kw">else</span> <span class="kw">if</span> <span class="ident">input</span> <span class="op">&gt;</span> <span class="ident">max</span> {
<span class="ident">max</span>
} <span class="kw">else</span> {
<span class="ident">input</span>
}
}
<span class="doccomment">/// A value bounded by a minimum value</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If input is less than min then this returns min.</span>
<span class="doccomment">/// Otherwise this returns input.</span>
<span class="doccomment">/// `clamp_min(std::f32::NAN, 1.0)` preserves `NAN` different from `f32::min(std::f32::NAN, 1.0)`.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// **Panics** in debug mode if `!(min == min)`. (This occurs if `min` is `NAN`.)</span>
<span class="attribute">#[<span class="ident">inline</span>]</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">clamp_min</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">PartialOrd</span><span class="op">&gt;</span>(<span class="ident">input</span>: <span class="ident">T</span>, <span class="ident">min</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span> {
<span class="macro">debug_assert</span><span class="macro">!</span>(<span class="ident">min</span> <span class="op">=</span><span class="op">=</span> <span class="ident">min</span>, <span class="string">&quot;min must not be NAN&quot;</span>);
<span class="kw">if</span> <span class="ident">input</span> <span class="op">&lt;</span> <span class="ident">min</span> {
<span class="ident">min</span>
} <span class="kw">else</span> {
<span class="ident">input</span>
}
}
<span class="doccomment">/// A value bounded by a maximum value</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If input is greater than max then this returns max.</span>
<span class="doccomment">/// Otherwise this returns input.</span>
<span class="doccomment">/// `clamp_max(std::f32::NAN, 1.0)` preserves `NAN` different from `f32::max(std::f32::NAN, 1.0)`.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// **Panics** in debug mode if `!(max == max)`. (This occurs if `max` is `NAN`.)</span>
<span class="attribute">#[<span class="ident">inline</span>]</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">clamp_max</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">PartialOrd</span><span class="op">&gt;</span>(<span class="ident">input</span>: <span class="ident">T</span>, <span class="ident">max</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span> {
<span class="macro">debug_assert</span><span class="macro">!</span>(<span class="ident">max</span> <span class="op">=</span><span class="op">=</span> <span class="ident">max</span>, <span class="string">&quot;max must not be NAN&quot;</span>);
<span class="kw">if</span> <span class="ident">input</span> <span class="op">&gt;</span> <span class="ident">max</span> {
<span class="ident">max</span>
} <span class="kw">else</span> {
<span class="ident">input</span>
}
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">clamp_test</span>() {
<span class="comment">// Int test</span>
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="number">1</span>, <span class="ident">clamp</span>(<span class="number">1</span>, <span class="op">-</span><span class="number">1</span>, <span class="number">2</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">1</span>, <span class="ident">clamp</span>(<span class="op">-</span><span class="number">2</span>, <span class="op">-</span><span class="number">1</span>, <span class="number">2</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="number">2</span>, <span class="ident">clamp</span>(<span class="number">3</span>, <span class="op">-</span><span class="number">1</span>, <span class="number">2</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="number">1</span>, <span class="ident">clamp_min</span>(<span class="number">1</span>, <span class="op">-</span><span class="number">1</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">1</span>, <span class="ident">clamp_min</span>(<span class="op">-</span><span class="number">2</span>, <span class="op">-</span><span class="number">1</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">1</span>, <span class="ident">clamp_max</span>(<span class="number">1</span>, <span class="op">-</span><span class="number">1</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">2</span>, <span class="ident">clamp_max</span>(<span class="op">-</span><span class="number">2</span>, <span class="op">-</span><span class="number">1</span>));
<span class="comment">// Float test</span>
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="number">1.0</span>, <span class="ident">clamp</span>(<span class="number">1.0</span>, <span class="op">-</span><span class="number">1.0</span>, <span class="number">2.0</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">1.0</span>, <span class="ident">clamp</span>(<span class="op">-</span><span class="number">2.0</span>, <span class="op">-</span><span class="number">1.0</span>, <span class="number">2.0</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="number">2.0</span>, <span class="ident">clamp</span>(<span class="number">3.0</span>, <span class="op">-</span><span class="number">1.0</span>, <span class="number">2.0</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="number">1.0</span>, <span class="ident">clamp_min</span>(<span class="number">1.0</span>, <span class="op">-</span><span class="number">1.0</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">1.0</span>, <span class="ident">clamp_min</span>(<span class="op">-</span><span class="number">2.0</span>, <span class="op">-</span><span class="number">1.0</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">1.0</span>, <span class="ident">clamp_max</span>(<span class="number">1.0</span>, <span class="op">-</span><span class="number">1.0</span>));
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="op">-</span><span class="number">2.0</span>, <span class="ident">clamp_max</span>(<span class="op">-</span><span class="number">2.0</span>, <span class="op">-</span><span class="number">1.0</span>));
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">clamp</span>(::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>, <span class="op">-</span><span class="number">1.0</span>, <span class="number">1.0</span>).<span class="ident">is_nan</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">clamp_min</span>(::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>, <span class="number">1.0</span>).<span class="ident">is_nan</span>());
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">clamp_max</span>(::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>, <span class="number">1.0</span>).<span class="ident">is_nan</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">should_panic</span>]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">debug_assertions</span>)]</span>
<span class="kw">fn</span> <span class="ident">clamp_nan_min</span>() {
<span class="ident">clamp</span>(<span class="number">0.</span>, ::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>, <span class="number">1.</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">should_panic</span>]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">debug_assertions</span>)]</span>
<span class="kw">fn</span> <span class="ident">clamp_nan_max</span>() {
<span class="ident">clamp</span>(<span class="number">0.</span>, <span class="op">-</span><span class="number">1.</span>, ::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">should_panic</span>]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">debug_assertions</span>)]</span>
<span class="kw">fn</span> <span class="ident">clamp_nan_min_max</span>() {
<span class="ident">clamp</span>(<span class="number">0.</span>, ::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>, ::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">should_panic</span>]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">debug_assertions</span>)]</span>
<span class="kw">fn</span> <span class="ident">clamp_min_nan_min</span>() {
<span class="ident">clamp_min</span>(<span class="number">0.</span>, ::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="attribute">#[<span class="ident">should_panic</span>]</span>
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">debug_assertions</span>)]</span>
<span class="kw">fn</span> <span class="ident">clamp_max_nan_max</span>() {
<span class="ident">clamp_max</span>(<span class="number">0.</span>, ::<span class="ident">core</span>::<span class="ident">f32</span>::<span class="ident">NAN</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">from_str_radix_unwrap</span>() {
<span class="comment">// The Result error must impl Debug to allow unwrap()</span>
<span class="kw">let</span> <span class="ident">i</span>: <span class="ident">i32</span> <span class="op">=</span> <span class="ident">Num</span>::<span class="ident">from_str_radix</span>(<span class="string">&quot;0&quot;</span>, <span class="number">10</span>).<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">i</span>, <span class="number">0</span>);
<span class="kw">let</span> <span class="ident">f</span>: <span class="ident">f32</span> <span class="op">=</span> <span class="ident">Num</span>::<span class="ident">from_str_radix</span>(<span class="string">&quot;0.0&quot;</span>, <span class="number">10</span>).<span class="ident">unwrap</span>();
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">f</span>, <span class="number">0.0</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">from_str_radix_multi_byte_fail</span>() {
<span class="comment">// Ensure parsing doesn&#39;t panic, even on invalid sign characters</span>
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">f32</span>::<span class="ident">from_str_radix</span>(<span class="string">&quot;™0.2&quot;</span>, <span class="number">10</span>).<span class="ident">is_err</span>());
<span class="comment">// Even when parsing the exponent sign</span>
<span class="macro">assert</span><span class="macro">!</span>(<span class="ident">f32</span>::<span class="ident">from_str_radix</span>(<span class="string">&quot;0.2E™1&quot;</span>, <span class="number">10</span>).<span class="ident">is_err</span>());
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">wrapping_is_num</span>() {
<span class="kw">fn</span> <span class="ident">require_num</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Num</span><span class="op">&gt;</span>(<span class="kw">_</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>) {}
<span class="ident">require_num</span>(<span class="kw-2">&amp;</span><span class="ident">Wrapping</span>(<span class="number">42_u32</span>));
<span class="ident">require_num</span>(<span class="kw-2">&amp;</span><span class="ident">Wrapping</span>(<span class="op">-</span><span class="number">42</span>));
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">wrapping_from_str_radix</span>() {
<span class="macro">macro_rules</span><span class="macro">!</span> <span class="ident">test_wrapping_from_str_radix</span> {
($(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span>:<span class="ident">ty</span>)<span class="op">+</span>) <span class="op">=</span><span class="op">&gt;</span> {
$(
<span class="kw">for</span> <span class="kw-2">&amp;</span>(<span class="ident">s</span>, <span class="ident">r</span>) <span class="kw">in</span> <span class="kw-2">&amp;</span>[(<span class="string">&quot;42&quot;</span>, <span class="number">10</span>), (<span class="string">&quot;42&quot;</span>, <span class="number">2</span>), (<span class="string">&quot;-13.0&quot;</span>, <span class="number">10</span>), (<span class="string">&quot;foo&quot;</span>, <span class="number">10</span>)] {
<span class="kw">let</span> <span class="ident">w</span> <span class="op">=</span> <span class="ident">Wrapping</span>::<span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span><span class="op">&gt;</span>::<span class="ident">from_str_radix</span>(<span class="ident">s</span>, <span class="ident">r</span>).<span class="ident">map</span>(<span class="op">|</span><span class="ident">w</span><span class="op">|</span> <span class="ident">w</span>.<span class="number">0</span>);
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">w</span>, <span class="op">&lt;</span><span class="macro-nonterminal">$</span><span class="macro-nonterminal">t</span> <span class="kw">as</span> <span class="ident">Num</span><span class="op">&gt;</span>::<span class="ident">from_str_radix</span>(<span class="ident">s</span>, <span class="ident">r</span>));
}
)<span class="op">+</span>
};
}
<span class="macro">test_wrapping_from_str_radix</span><span class="macro">!</span>(<span class="ident">usize</span> <span class="ident">u8</span> <span class="ident">u16</span> <span class="ident">u32</span> <span class="ident">u64</span> <span class="ident">isize</span> <span class="ident">i8</span> <span class="ident">i16</span> <span class="ident">i32</span> <span class="ident">i64</span>);
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">check_num_ops</span>() {
<span class="kw">fn</span> <span class="ident">compute</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Num</span> <span class="op">+</span> <span class="ident">Copy</span><span class="op">&gt;</span>(<span class="ident">x</span>: <span class="ident">T</span>, <span class="ident">y</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span> {
<span class="ident">x</span> <span class="op">*</span> <span class="ident">y</span> <span class="op">/</span> <span class="ident">y</span> <span class="op">%</span> <span class="ident">y</span> <span class="op">+</span> <span class="ident">y</span> <span class="op">-</span> <span class="ident">y</span>
}
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">compute</span>(<span class="number">1</span>, <span class="number">2</span>), <span class="number">1</span>)
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">check_numref_ops</span>() {
<span class="kw">fn</span> <span class="ident">compute</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">NumRef</span><span class="op">&gt;</span>(<span class="ident">x</span>: <span class="ident">T</span>, <span class="ident">y</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span> {
<span class="ident">x</span> <span class="op">*</span> <span class="ident">y</span> <span class="op">/</span> <span class="ident">y</span> <span class="op">%</span> <span class="ident">y</span> <span class="op">+</span> <span class="ident">y</span> <span class="op">-</span> <span class="ident">y</span>
}
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">compute</span>(<span class="number">1</span>, <span class="kw-2">&amp;</span><span class="number">2</span>), <span class="number">1</span>)
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">check_refnum_ops</span>() {
<span class="kw">fn</span> <span class="ident">compute</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Copy</span><span class="op">&gt;</span>(<span class="ident">x</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>, <span class="ident">y</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span>
<span class="kw">where</span>
<span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">T</span>: <span class="ident">RefNum</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>,
{
<span class="kw-2">&amp;</span>(<span class="kw-2">&amp;</span>(<span class="kw-2">&amp;</span>(<span class="kw-2">&amp;</span>(<span class="ident">x</span> <span class="op">*</span> <span class="ident">y</span>) <span class="op">/</span> <span class="ident">y</span>) <span class="op">%</span> <span class="ident">y</span>) <span class="op">+</span> <span class="ident">y</span>) <span class="op">-</span> <span class="ident">y</span>
}
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">compute</span>(<span class="kw-2">&amp;</span><span class="number">1</span>, <span class="number">2</span>), <span class="number">1</span>)
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">check_refref_ops</span>() {
<span class="kw">fn</span> <span class="ident">compute</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>(<span class="ident">x</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>, <span class="ident">y</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span>
<span class="kw">where</span>
<span class="kw">for</span><span class="op">&lt;</span><span class="lifetime">&#39;a</span><span class="op">&gt;</span> <span class="kw-2">&amp;</span><span class="lifetime">&#39;a</span> <span class="ident">T</span>: <span class="ident">RefNum</span><span class="op">&lt;</span><span class="ident">T</span><span class="op">&gt;</span>,
{
<span class="kw-2">&amp;</span>(<span class="kw-2">&amp;</span>(<span class="kw-2">&amp;</span>(<span class="kw-2">&amp;</span>(<span class="ident">x</span> <span class="op">*</span> <span class="ident">y</span>) <span class="op">/</span> <span class="ident">y</span>) <span class="op">%</span> <span class="ident">y</span>) <span class="op">+</span> <span class="ident">y</span>) <span class="op">-</span> <span class="ident">y</span>
}
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">compute</span>(<span class="kw-2">&amp;</span><span class="number">1</span>, <span class="kw-2">&amp;</span><span class="number">2</span>), <span class="number">1</span>)
}
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">check_numassign_ops</span>() {
<span class="kw">fn</span> <span class="ident">compute</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">NumAssign</span> <span class="op">+</span> <span class="ident">Copy</span><span class="op">&gt;</span>(<span class="kw-2">mut</span> <span class="ident">x</span>: <span class="ident">T</span>, <span class="ident">y</span>: <span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">T</span> {
<span class="ident">x</span> <span class="kw-2">*</span><span class="op">=</span> <span class="ident">y</span>;
<span class="ident">x</span> <span class="op">/</span><span class="op">=</span> <span class="ident">y</span>;
<span class="ident">x</span> <span class="op">%</span><span class="op">=</span> <span class="ident">y</span>;
<span class="ident">x</span> <span class="op">+</span><span class="op">=</span> <span class="ident">y</span>;
<span class="ident">x</span> <span class="op">-</span><span class="op">=</span> <span class="ident">y</span>;
<span class="ident">x</span>
}
<span class="macro">assert_eq</span><span class="macro">!</span>(<span class="ident">compute</span>(<span class="number">1</span>, <span class="number">2</span>), <span class="number">1</span>)
}
<span class="comment">// TODO test `NumAssignRef`, but even the standard numeric types don&#39;t</span>
<span class="comment">// implement this yet. (see rust pr41336)</span>
</pre></div>
</section><section id="search" class="content hidden"></section><section class="footer"></section><script>window.rootPath = "../../";window.currentCrate = "num_traits";</script><script src="../../aliases.js"></script><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script><script defer src="../../search-index.js"></script></body></html>