Files
uutils.github.io/src/uu_seq/seq.rs.html
T
2021-08-30 02:25:46 +00:00

745 lines
48 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><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 of the Rust file `src/uu/seq/src/seq.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>seq.rs - 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="../../light.css" id="themeStyle"><link rel="stylesheet" type="text/css" href="../../dark.css" disabled ><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled ><script id="default-settings"></script><script src="../../storage.js"></script><script src="../../crates.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="icon" type="image/svg+xml" href="../../favicon.svg">
<link rel="alternate icon" type="image/png" href="../../favicon-16x16.png">
<link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><style type="text/css">#crate-search{background-image:url("../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a href='../../uu_seq/index.html'><div class='logo-container rust-logo'><img src='../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img src="../../brush.svg" width="18" height="18" alt="Pick another theme!"></button><div id="theme-choices" role="menu"></div></div><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><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img src="../../wheel.svg" width="18" height="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><div class="example-wrap"><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>
</pre><pre class="rust">
<span class="comment">// TODO: Make -w flag work with decimals</span>
<span class="comment">// TODO: Support -f flag</span>
<span class="comment">// spell-checker:ignore (ToDO) istr chiter argptr ilen</span>
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">uucore</span>;
<span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">crate_version</span>, <span class="ident">App</span>, <span class="ident">AppSettings</span>, <span class="ident">Arg</span>};
<span class="kw">use</span> <span class="ident">num_bigint::BigInt</span>;
<span class="kw">use</span> <span class="ident">num_traits::One</span>;
<span class="kw">use</span> <span class="ident">num_traits::Zero</span>;
<span class="kw">use</span> <span class="ident">num_traits</span>::{<span class="ident">Num</span>, <span class="ident">ToPrimitive</span>};
<span class="kw">use</span> <span class="ident">std::cmp</span>;
<span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stdout</span>, <span class="ident">Write</span>};
<span class="kw">use</span> <span class="ident">std::str::FromStr</span>;
<span class="kw">static</span> <span class="ident">ABOUT</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;Display numbers from FIRST to LAST, in steps of INCREMENT.&quot;</span>;
<span class="kw">static</span> <span class="ident">OPT_SEPARATOR</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;separator&quot;</span>;
<span class="kw">static</span> <span class="ident">OPT_TERMINATOR</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;terminator&quot;</span>;
<span class="kw">static</span> <span class="ident">OPT_WIDTHS</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;widths&quot;</span>;
<span class="kw">static</span> <span class="ident">ARG_NUMBERS</span>: <span class="kw-2">&amp;</span><span class="ident">str</span> <span class="op">=</span> <span class="string">&quot;numbers&quot;</span>;
<span class="kw">fn</span> <span class="ident">usage</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">String</span> {
<span class="macro">format!</span>(
<span class="string">&quot;{0} [OPTION]... LAST
{0} [OPTION]... FIRST LAST
{0} [OPTION]... FIRST INCREMENT LAST&quot;</span>,
<span class="ident">uucore::execution_phrase</span>()
)
}
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
<span class="kw">struct</span> <span class="ident">SeqOptions</span> {
<span class="ident">separator</span>: <span class="ident">String</span>,
<span class="ident">terminator</span>: <span class="ident">String</span>,
<span class="ident">widths</span>: <span class="ident">bool</span>,
}
<span class="kw">enum</span> <span class="ident">Number</span> {
<span class="doccomment">/// Negative zero, as if it were an integer.</span>
<span class="ident">MinusZero</span>,
<span class="ident">BigInt</span>(<span class="ident">BigInt</span>),
<span class="ident">F64</span>(<span class="ident">f64</span>),
}
<span class="kw">impl</span> <span class="ident">Number</span> {
<span class="kw">fn</span> <span class="ident">is_zero</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">bool</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Number::MinusZero</span> <span class="op">=</span><span class="op">&gt;</span> <span class="bool-val">true</span>,
<span class="ident">Number::BigInt</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">is_zero</span>(),
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">is_zero</span>(),
}
}
<span class="kw">fn</span> <span class="ident">into_f64</span>(<span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">f64</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Number::MinusZero</span> <span class="op">=</span><span class="op">&gt;</span> <span class="op">-</span><span class="number">0.</span>,
<span class="comment">// BigInt::to_f64() can not return None.</span>
<span class="ident">Number::BigInt</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">to_f64</span>().<span class="ident">unwrap</span>(),
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>,
}
}
<span class="doccomment">/// Number of characters needed to print the integral part of the number.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The number of characters includes one character to represent the</span>
<span class="doccomment">/// minus sign (&quot;-&quot;) if this number is negative.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// # Examples</span>
<span class="doccomment">///</span>
<span class="doccomment">/// ```rust,ignore</span>
<span class="doccomment">/// use num_bigint::{BigInt, Sign};</span>
<span class="doccomment">///</span>
<span class="doccomment">/// assert_eq!(</span>
<span class="doccomment">/// Number::BigInt(BigInt::new(Sign::Plus, vec![123])).num_digits(),</span>
<span class="doccomment">/// 3</span>
<span class="doccomment">/// );</span>
<span class="doccomment">/// assert_eq!(</span>
<span class="doccomment">/// Number::BigInt(BigInt::new(Sign::Minus, vec![123])).num_digits(),</span>
<span class="doccomment">/// 4</span>
<span class="doccomment">/// );</span>
<span class="doccomment">/// assert_eq!(Number::F64(123.45).num_digits(), 3);</span>
<span class="doccomment">/// assert_eq!(Number::MinusZero.num_digits(), 2);</span>
<span class="doccomment">/// ```</span>
<span class="kw">fn</span> <span class="ident">num_digits</span>(<span class="kw-2">&amp;</span><span class="self">self</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">usize</span> {
<span class="kw">match</span> <span class="self">self</span> {
<span class="ident">Number::MinusZero</span> <span class="op">=</span><span class="op">&gt;</span> <span class="number">2</span>,
<span class="ident">Number::BigInt</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">n</span>.<span class="ident">to_string</span>().<span class="ident">len</span>(),
<span class="ident">Number::F64</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">n</span>.<span class="ident">to_string</span>();
<span class="ident">s</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">s</span>.<span class="ident">len</span>())
}
}
}
}
<span class="kw">impl</span> <span class="ident">FromStr</span> <span class="kw">for</span> <span class="ident">Number</span> {
<span class="kw">type</span> <span class="prelude-val">Err</span> <span class="op">=</span> <span class="ident">String</span>;
<span class="kw">fn</span> <span class="ident">from_str</span>(<span class="kw-2">mut</span> <span class="ident">s</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">Result</span><span class="op">&lt;</span><span class="self">Self</span>, <span class="self">Self</span><span class="ident">::Err</span><span class="op">&gt;</span> {
<span class="kw">if</span> <span class="ident">s</span>.<span class="ident">starts_with</span>(<span class="string">&#39;+&#39;</span>) {
<span class="ident">s</span> <span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">s</span>[<span class="number">1</span>..];
}
<span class="kw">match</span> <span class="ident">s</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">BigInt</span><span class="op">&gt;</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">n</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="comment">// If `s` is &#39;-0&#39;, then `parse()` returns</span>
<span class="comment">// `BigInt::zero()`, but we need to return</span>
<span class="comment">// `Number::MinusZero` instead.</span>
<span class="kw">if</span> <span class="ident">n</span> <span class="op">=</span><span class="op">=</span> <span class="ident">BigInt::zero</span>() <span class="op">&amp;&amp;</span> <span class="ident">s</span>.<span class="ident">starts_with</span>(<span class="string">&#39;-&#39;</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">Number::MinusZero</span>)
} <span class="kw">else</span> {
<span class="prelude-val">Ok</span>(<span class="ident">Number::BigInt</span>(<span class="ident">n</span>))
}
}
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="kw">match</span> <span class="ident">s</span>.<span class="ident">parse</span>::<span class="op">&lt;</span><span class="ident">f64</span><span class="op">&gt;</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">value</span>) <span class="kw">if</span> <span class="ident">value</span>.<span class="ident">is_nan</span>() <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="macro">format!</span>(
<span class="string">&quot;invalid &#39;not-a-number&#39; argument: &#39;{}&#39;\nTry &#39;{} --help&#39; for more information.&quot;</span>,
<span class="ident">s</span>,
<span class="ident">uucore::execution_phrase</span>(),
)),
<span class="prelude-val">Ok</span>(<span class="ident">value</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Ok</span>(<span class="ident">Number::F64</span>(<span class="ident">value</span>)),
<span class="prelude-val">Err</span>(<span class="kw">_</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="prelude-val">Err</span>(<span class="macro">format!</span>(
<span class="string">&quot;invalid floating point argument: &#39;{}&#39;\nTry &#39;{} --help&#39; for more information.&quot;</span>,
<span class="ident">s</span>,
<span class="ident">uucore::execution_phrase</span>(),
)),
},
}
}
}
<span class="doccomment">/// A range of integers.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The elements are (first, increment, last).</span>
<span class="kw">type</span> <span class="ident">RangeInt</span> <span class="op">=</span> (<span class="ident">BigInt</span>, <span class="ident">BigInt</span>, <span class="ident">BigInt</span>);
<span class="doccomment">/// A range of f64.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The elements are (first, increment, last).</span>
<span class="kw">type</span> <span class="ident">RangeF64</span> <span class="op">=</span> (<span class="ident">f64</span>, <span class="ident">f64</span>, <span class="ident">f64</span>);
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uumain</span>(<span class="ident">args</span>: <span class="kw">impl</span> <span class="ident">uucore::Args</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">i32</span> {
<span class="kw">let</span> <span class="ident">usage</span> <span class="op">=</span> <span class="ident">usage</span>();
<span class="kw">let</span> <span class="ident">matches</span> <span class="op">=</span> <span class="ident">uu_app</span>().<span class="ident">usage</span>(<span class="kw-2">&amp;</span><span class="ident">usage</span>[..]).<span class="ident">get_matches_from</span>(<span class="ident">args</span>);
<span class="kw">let</span> <span class="ident">numbers</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">values_of</span>(<span class="ident">ARG_NUMBERS</span>).<span class="ident">unwrap</span>().<span class="ident">collect</span>::<span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="kw">_</span><span class="op">&gt;</span><span class="op">&gt;</span>();
<span class="kw">let</span> <span class="ident">options</span> <span class="op">=</span> <span class="ident">SeqOptions</span> {
<span class="ident">separator</span>: <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">OPT_SEPARATOR</span>).<span class="ident">unwrap_or</span>(<span class="string">&quot;\n&quot;</span>).<span class="ident">to_string</span>(),
<span class="ident">terminator</span>: <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">OPT_TERMINATOR</span>).<span class="ident">unwrap_or</span>(<span class="string">&quot;\n&quot;</span>).<span class="ident">to_string</span>(),
<span class="ident">widths</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_WIDTHS</span>),
};
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">largest_dec</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="ident">first</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">numbers</span>.<span class="ident">len</span>() <span class="op">&gt;</span> <span class="number">1</span> {
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="ident">numbers</span>[<span class="number">0</span>];
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="kw">let</span> <span class="ident">dec</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or</span>(<span class="ident">len</span>);
<span class="ident">largest_dec</span> <span class="op">=</span> <span class="ident">len</span> <span class="op">-</span> <span class="ident">dec</span>;
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">slice</span>.<span class="ident">parse</span>())
} <span class="kw">else</span> {
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::one</span>())
};
<span class="kw">let</span> <span class="ident">increment</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">numbers</span>.<span class="ident">len</span>() <span class="op">&gt;</span> <span class="number">2</span> {
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="ident">numbers</span>[<span class="number">1</span>];
<span class="kw">let</span> <span class="ident">len</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">len</span>();
<span class="kw">let</span> <span class="ident">dec</span> <span class="op">=</span> <span class="ident">slice</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or</span>(<span class="ident">len</span>);
<span class="ident">largest_dec</span> <span class="op">=</span> <span class="ident">cmp::max</span>(<span class="ident">largest_dec</span>, <span class="ident">len</span> <span class="op">-</span> <span class="ident">dec</span>);
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">slice</span>.<span class="ident">parse</span>())
} <span class="kw">else</span> {
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::one</span>())
};
<span class="kw">if</span> <span class="ident">increment</span>.<span class="ident">is_zero</span>() {
<span class="macro">show_error!</span>(
<span class="string">&quot;invalid Zero increment value: &#39;{}&#39;\nTry &#39;{} --help&#39; for more information.&quot;</span>,
<span class="ident">numbers</span>[<span class="number">1</span>],
<span class="ident">uucore::execution_phrase</span>()
);
<span class="kw">return</span> <span class="number">1</span>;
}
<span class="kw">let</span> <span class="ident">last</span>: <span class="ident">Number</span> <span class="op">=</span> {
<span class="kw">let</span> <span class="ident">slice</span> <span class="op">=</span> <span class="ident">numbers</span>[<span class="ident">numbers</span>.<span class="ident">len</span>() <span class="op">-</span> <span class="number">1</span>];
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">slice</span>.<span class="ident">parse</span>())
};
<span class="kw">if</span> <span class="ident">largest_dec</span> <span class="op">&gt;</span> <span class="number">0</span> {
<span class="ident">largest_dec</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
}
<span class="kw">let</span> <span class="ident">padding</span> <span class="op">=</span> <span class="ident">first</span>
.<span class="ident">num_digits</span>()
.<span class="ident">max</span>(<span class="ident">increment</span>.<span class="ident">num_digits</span>())
.<span class="ident">max</span>(<span class="ident">last</span>.<span class="ident">num_digits</span>());
<span class="kw">match</span> (<span class="ident">first</span>, <span class="ident">last</span>, <span class="ident">increment</span>) {
(<span class="ident">Number::MinusZero</span>, <span class="ident">Number::BigInt</span>(<span class="ident">last</span>), <span class="ident">Number::BigInt</span>(<span class="ident">increment</span>)) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">print_seq_integers</span>(
(<span class="ident">BigInt::zero</span>(), <span class="ident">increment</span>, <span class="ident">last</span>),
<span class="ident">options</span>.<span class="ident">separator</span>,
<span class="ident">options</span>.<span class="ident">terminator</span>,
<span class="ident">options</span>.<span class="ident">widths</span>,
<span class="ident">padding</span>,
<span class="bool-val">true</span>,
),
(<span class="ident">Number::BigInt</span>(<span class="ident">first</span>), <span class="ident">Number::BigInt</span>(<span class="ident">last</span>), <span class="ident">Number::BigInt</span>(<span class="ident">increment</span>)) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">print_seq_integers</span>(
(<span class="ident">first</span>, <span class="ident">increment</span>, <span class="ident">last</span>),
<span class="ident">options</span>.<span class="ident">separator</span>,
<span class="ident">options</span>.<span class="ident">terminator</span>,
<span class="ident">options</span>.<span class="ident">widths</span>,
<span class="ident">padding</span>,
<span class="bool-val">false</span>,
)
}
(<span class="ident">first</span>, <span class="ident">last</span>, <span class="ident">increment</span>) <span class="op">=</span><span class="op">&gt;</span> <span class="ident">print_seq</span>(
(<span class="ident">first</span>.<span class="ident">into_f64</span>(), <span class="ident">increment</span>.<span class="ident">into_f64</span>(), <span class="ident">last</span>.<span class="ident">into_f64</span>()),
<span class="ident">largest_dec</span>,
<span class="ident">options</span>.<span class="ident">separator</span>,
<span class="ident">options</span>.<span class="ident">terminator</span>,
<span class="ident">options</span>.<span class="ident">widths</span>,
<span class="ident">padding</span>,
),
}
<span class="number">0</span>
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uu_app</span>() <span class="op">-</span><span class="op">&gt;</span> <span class="ident">App</span><span class="op">&lt;</span><span class="lifetime">&#39;static</span>, <span class="lifetime">&#39;static</span><span class="op">&gt;</span> {
<span class="ident">App::new</span>(<span class="ident">uucore::util_name</span>())
.<span class="ident">setting</span>(<span class="ident">AppSettings::AllowLeadingHyphen</span>)
.<span class="ident">version</span>(<span class="macro">crate_version!</span>())
.<span class="ident">about</span>(<span class="ident">ABOUT</span>)
.<span class="ident">arg</span>(
<span class="ident">Arg::with_name</span>(<span class="ident">OPT_SEPARATOR</span>)
.<span class="ident">short</span>(<span class="string">&quot;s&quot;</span>)
.<span class="ident">long</span>(<span class="string">&quot;separator&quot;</span>)
.<span class="ident">help</span>(<span class="string">&quot;Separator character (defaults to \\n)&quot;</span>)
.<span class="ident">takes_value</span>(<span class="bool-val">true</span>)
.<span class="ident">number_of_values</span>(<span class="number">1</span>),
)
.<span class="ident">arg</span>(
<span class="ident">Arg::with_name</span>(<span class="ident">OPT_TERMINATOR</span>)
.<span class="ident">short</span>(<span class="string">&quot;t&quot;</span>)
.<span class="ident">long</span>(<span class="string">&quot;terminator&quot;</span>)
.<span class="ident">help</span>(<span class="string">&quot;Terminator character (defaults to \\n)&quot;</span>)
.<span class="ident">takes_value</span>(<span class="bool-val">true</span>)
.<span class="ident">number_of_values</span>(<span class="number">1</span>),
)
.<span class="ident">arg</span>(
<span class="ident">Arg::with_name</span>(<span class="ident">OPT_WIDTHS</span>)
.<span class="ident">short</span>(<span class="string">&quot;w&quot;</span>)
.<span class="ident">long</span>(<span class="string">&quot;widths&quot;</span>)
.<span class="ident">help</span>(<span class="string">&quot;Equalize widths of all numbers by padding with zeros&quot;</span>),
)
.<span class="ident">arg</span>(
<span class="ident">Arg::with_name</span>(<span class="ident">ARG_NUMBERS</span>)
.<span class="ident">multiple</span>(<span class="bool-val">true</span>)
.<span class="ident">takes_value</span>(<span class="bool-val">true</span>)
.<span class="ident">allow_hyphen_values</span>(<span class="bool-val">true</span>)
.<span class="ident">max_values</span>(<span class="number">3</span>)
.<span class="ident">required</span>(<span class="bool-val">true</span>),
)
}
<span class="kw">fn</span> <span class="ident">done_printing</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="ident">Num</span> <span class="op">+</span> <span class="ident">PartialOrd</span><span class="op">&gt;</span>(<span class="ident">next</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>, <span class="ident">increment</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>, <span class="ident">last</span>: <span class="kw-2">&amp;</span><span class="ident">T</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">bool</span> {
<span class="kw">if</span> <span class="ident">increment</span> <span class="op">&gt;</span><span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">T::zero</span>() {
<span class="ident">next</span> <span class="op">&gt;</span> <span class="ident">last</span>
} <span class="kw">else</span> {
<span class="ident">next</span> <span class="op">&lt;</span> <span class="ident">last</span>
}
}
<span class="doccomment">/// Floating point based code path</span>
<span class="kw">fn</span> <span class="ident">print_seq</span>(
<span class="ident">range</span>: <span class="ident">RangeF64</span>,
<span class="ident">largest_dec</span>: <span class="ident">usize</span>,
<span class="ident">separator</span>: <span class="ident">String</span>,
<span class="ident">terminator</span>: <span class="ident">String</span>,
<span class="ident">pad</span>: <span class="ident">bool</span>,
<span class="ident">padding</span>: <span class="ident">usize</span>,
) {
<span class="kw">let</span> (<span class="ident">first</span>, <span class="ident">increment</span>, <span class="ident">last</span>) <span class="op">=</span> <span class="ident">range</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">i</span> <span class="op">=</span> <span class="number">0isize</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">value</span> <span class="op">=</span> <span class="ident">first</span> <span class="op">+</span> <span class="ident">i</span> <span class="kw">as</span> <span class="ident">f64</span> <span class="op">*</span> <span class="ident">increment</span>;
<span class="kw">while</span> <span class="op">!</span><span class="ident">done_printing</span>(<span class="kw-2">&amp;</span><span class="ident">value</span>, <span class="kw-2">&amp;</span><span class="ident">increment</span>, <span class="kw-2">&amp;</span><span class="ident">last</span>) {
<span class="kw">let</span> <span class="ident">istr</span> <span class="op">=</span> <span class="macro">format!</span>(<span class="string">&quot;{:.*}&quot;</span>, <span class="ident">largest_dec</span>, <span class="ident">value</span>);
<span class="kw">let</span> <span class="ident">ilen</span> <span class="op">=</span> <span class="ident">istr</span>.<span class="ident">len</span>();
<span class="kw">let</span> <span class="ident">before_dec</span> <span class="op">=</span> <span class="ident">istr</span>.<span class="ident">find</span>(<span class="string">&#39;.&#39;</span>).<span class="ident">unwrap_or</span>(<span class="ident">ilen</span>);
<span class="kw">if</span> <span class="ident">pad</span> <span class="op">&amp;&amp;</span> <span class="ident">before_dec</span> <span class="op">&lt;</span> <span class="ident">padding</span> {
<span class="kw">for</span> <span class="kw">_</span> <span class="kw">in</span> <span class="number">0</span>..(<span class="ident">padding</span> <span class="op">-</span> <span class="ident">before_dec</span>) {
<span class="macro">print!</span>(<span class="string">&quot;0&quot;</span>);
}
}
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">istr</span>);
<span class="ident">i</span> <span class="op">+</span><span class="op">=</span> <span class="number">1</span>;
<span class="ident">value</span> <span class="op">=</span> <span class="ident">first</span> <span class="op">+</span> <span class="ident">i</span> <span class="kw">as</span> <span class="ident">f64</span> <span class="op">*</span> <span class="ident">increment</span>;
<span class="kw">if</span> <span class="op">!</span><span class="ident">done_printing</span>(<span class="kw-2">&amp;</span><span class="ident">value</span>, <span class="kw-2">&amp;</span><span class="ident">increment</span>, <span class="kw-2">&amp;</span><span class="ident">last</span>) {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">separator</span>);
}
}
<span class="kw">if</span> (<span class="ident">first</span> <span class="op">&gt;</span><span class="op">=</span> <span class="ident">last</span> <span class="op">&amp;&amp;</span> <span class="ident">increment</span> <span class="op">&lt;</span> <span class="number">0f64</span>) <span class="op">|</span><span class="op">|</span> (<span class="ident">first</span> <span class="op">&lt;</span><span class="op">=</span> <span class="ident">last</span> <span class="op">&amp;&amp;</span> <span class="ident">increment</span> <span class="op">&gt;</span> <span class="number">0f64</span>) {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">terminator</span>);
}
<span class="macro">crash_if_err!</span>(<span class="number">1</span>, <span class="ident">stdout</span>().<span class="ident">flush</span>());
}
<span class="doccomment">/// Print an integer sequence.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// This function prints a sequence of integers defined by `range`,</span>
<span class="doccomment">/// which defines the first integer, last integer, and increment of the</span>
<span class="doccomment">/// range. The `separator` is inserted between each integer and</span>
<span class="doccomment">/// `terminator` is inserted at the end.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// The `pad` parameter indicates whether to pad numbers to the width</span>
<span class="doccomment">/// given in `padding`.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// If `is_first_minus_zero` is `true`, then the `first` parameter is</span>
<span class="doccomment">/// printed as if it were negative zero, even though no such number</span>
<span class="doccomment">/// exists as an integer (negative zero only exists for floating point</span>
<span class="doccomment">/// numbers). Only set this to `true` if `first` is actually zero.</span>
<span class="kw">fn</span> <span class="ident">print_seq_integers</span>(
<span class="ident">range</span>: <span class="ident">RangeInt</span>,
<span class="ident">separator</span>: <span class="ident">String</span>,
<span class="ident">terminator</span>: <span class="ident">String</span>,
<span class="ident">pad</span>: <span class="ident">bool</span>,
<span class="ident">padding</span>: <span class="ident">usize</span>,
<span class="ident">is_first_minus_zero</span>: <span class="ident">bool</span>,
) {
<span class="kw">let</span> (<span class="ident">first</span>, <span class="ident">increment</span>, <span class="ident">last</span>) <span class="op">=</span> <span class="ident">range</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">value</span> <span class="op">=</span> <span class="ident">first</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">is_first_iteration</span> <span class="op">=</span> <span class="bool-val">true</span>;
<span class="kw">while</span> <span class="op">!</span><span class="ident">done_printing</span>(<span class="kw-2">&amp;</span><span class="ident">value</span>, <span class="kw-2">&amp;</span><span class="ident">increment</span>, <span class="kw-2">&amp;</span><span class="ident">last</span>) {
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_first_iteration</span> {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">separator</span>);
}
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">width</span> <span class="op">=</span> <span class="ident">padding</span>;
<span class="kw">if</span> <span class="ident">is_first_iteration</span> <span class="op">&amp;&amp;</span> <span class="ident">is_first_minus_zero</span> {
<span class="macro">print!</span>(<span class="string">&quot;-&quot;</span>);
<span class="ident">width</span> <span class="op">-</span><span class="op">=</span> <span class="number">1</span>;
}
<span class="ident">is_first_iteration</span> <span class="op">=</span> <span class="bool-val">false</span>;
<span class="kw">if</span> <span class="ident">pad</span> {
<span class="macro">print!</span>(<span class="string">&quot;{number:&gt;0width$}&quot;</span>, <span class="ident">number</span> <span class="op">=</span> <span class="ident">value</span>, <span class="ident">width</span> <span class="op">=</span> <span class="ident">width</span>);
} <span class="kw">else</span> {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">value</span>);
}
<span class="ident">value</span> <span class="op">+</span><span class="op">=</span> <span class="kw-2">&amp;</span><span class="ident">increment</span>;
}
<span class="kw">if</span> <span class="op">!</span><span class="ident">is_first_iteration</span> {
<span class="macro">print!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">terminator</span>);
}
}
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">test</span>)]</span>
<span class="kw">mod</span> <span class="ident">tests</span> {
<span class="kw">use</span> <span class="kw">crate</span><span class="ident">::Number</span>;
<span class="kw">use</span> <span class="ident">num_bigint</span>::{<span class="ident">BigInt</span>, <span class="ident">Sign</span>};
<span class="attribute">#[<span class="ident">test</span>]</span>
<span class="kw">fn</span> <span class="ident">test_number_num_digits</span>() {
<span class="macro">assert_eq!</span>(
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::new</span>(<span class="ident">Sign::Plus</span>, <span class="macro">vec!</span>[<span class="number">123</span>])).<span class="ident">num_digits</span>(),
<span class="number">3</span>
);
<span class="macro">assert_eq!</span>(
<span class="ident">Number::BigInt</span>(<span class="ident">BigInt::new</span>(<span class="ident">Sign::Minus</span>, <span class="macro">vec!</span>[<span class="number">123</span>])).<span class="ident">num_digits</span>(),
<span class="number">4</span>
);
<span class="macro">assert_eq!</span>(<span class="ident">Number::F64</span>(<span class="number">123.45</span>).<span class="ident">num_digits</span>(), <span class="number">3</span>);
<span class="macro">assert_eq!</span>(<span class="ident">Number::MinusZero</span>.<span class="ident">num_digits</span>(), <span class="number">2</span>);
}
}
</pre></div>
</section><section id="search" class="content hidden"></section><div id="rustdoc-vars" data-root-path="../../" data-current-crate="uu_seq" data-search-index-js="../../search-index.js" data-search-js="../../search.js"></div><script src="../../main.js"></script><script src="../../source-script.js"></script><script src="../../source-files.js"></script></body></html>