|
166 | 166 | <span id="161">161</span>
|
167 | 167 | <span id="162">162</span>
|
168 | 168 | <span id="163">163</span>
|
169 |
| -<span id="164">164</span> |
170 |
| -<span id="165">165</span> |
171 |
| -<span id="166">166</span> |
172 | 169 | </pre><pre class="rust"><code><span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::word_count::WordCount</span>;
|
173 | 170 |
|
174 | 171 | <span class="kw">use</span> <span class="ident"><span class="kw">super</span>::WordCountable</span>;
|
|
288 | 285 | }
|
289 | 286 | }
|
290 | 287 |
|
291 |
| -<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">count_bytes_and_lines_fast</span><span class="op"><</span><span class="ident">R</span>: <span class="ident">Read</span><span class="op">></span>( |
292 |
| - <span class="ident">handle</span>: <span class="kw-2">&mut</span> <span class="ident">R</span>, |
293 |
| -) -> (<span class="ident">WordCount</span>, <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">io::Error</span><span class="op">></span>) { |
294 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">total</span> <span class="op">=</span> <span class="ident">WordCount::default</span>(); |
295 |
| - <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">buf</span> <span class="op">=</span> [<span class="number">0</span>; <span class="ident">BUF_SIZE</span>]; |
296 |
| - <span class="kw">loop</span> { |
297 |
| - <span class="kw">match</span> <span class="ident">handle</span>.<span class="ident">read</span>(<span class="kw-2">&mut</span> <span class="ident">buf</span>) { |
298 |
| - <span class="prelude-val">Ok</span>(<span class="number">0</span>) => <span class="kw">return</span> (<span class="ident">total</span>, <span class="prelude-val">None</span>), |
299 |
| - <span class="prelude-val">Ok</span>(<span class="ident">n</span>) => { |
300 |
| - <span class="ident">total</span>.<span class="ident">bytes</span> <span class="op">+</span><span class="op">=</span> <span class="ident">n</span>; |
301 |
| - <span class="ident">total</span>.<span class="ident">lines</span> <span class="op">+</span><span class="op">=</span> <span class="ident">bytecount::count</span>(<span class="kw-2">&</span><span class="ident">buf</span>[..<span class="ident">n</span>], <span class="string">b'\n'</span>); |
302 |
| - } |
303 |
| - <span class="prelude-val">Err</span>(<span class="kw-2">ref</span> <span class="ident">e</span>) <span class="kw">if</span> <span class="ident">e</span>.<span class="ident">kind</span>() <span class="op">==</span> <span class="ident">ErrorKind::Interrupted</span> => <span class="kw">continue</span>, |
304 |
| - <span class="prelude-val">Err</span>(<span class="ident">e</span>) => <span class="kw">return</span> (<span class="ident">total</span>, <span class="prelude-val">Some</span>(<span class="ident">e</span>)), |
305 |
| - } |
306 |
| - } |
307 |
| -} |
308 |
| - |
309 |
| -<span class="doccomment">/// Returns a WordCount that counts the number of Unicode characters encoded in UTF-8 read via a Reader.</span> |
| 288 | +<span class="doccomment">/// Returns a WordCount that counts the number of bytes, lines, and/or the number of Unicode characters encoded in UTF-8 read via a Reader.</span> |
310 | 289 | <span class="doccomment">///</span>
|
311 |
| -<span class="doccomment">/// This corresponds to the `-m` command line flag to wc.</span> |
| 290 | +<span class="doccomment">/// This corresponds to the `-c`, `-l` and `-m` command line flags to wc.</span> |
312 | 291 | <span class="doccomment">///</span>
|
313 | 292 | <span class="doccomment">/// # Arguments</span>
|
314 | 293 | <span class="doccomment">///</span>
|
315 | 294 | <span class="doccomment">/// * `R` - A Reader from which the UTF-8 stream will be read.</span>
|
316 |
| -<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">count_chars_fast</span><span class="op"><</span><span class="ident">R</span>: <span class="ident">Read</span><span class="op">></span>(<span class="ident">handle</span>: <span class="kw-2">&mut</span> <span class="ident">R</span>) -> (<span class="ident">WordCount</span>, <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">io::Error</span><span class="op">></span>) { |
| 295 | +<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">count_bytes_chars_and_lines_fast</span><span class="op"><</span> |
| 296 | + <span class="ident">R</span>: <span class="ident">Read</span>, |
| 297 | + <span class="kw">const</span> <span class="ident">COUNT_BYTES</span>: <span class="ident">bool</span>, |
| 298 | + <span class="kw">const</span> <span class="ident">COUNT_CHARS</span>: <span class="ident">bool</span>, |
| 299 | + <span class="kw">const</span> <span class="ident">COUNT_LINES</span>: <span class="ident">bool</span>, |
| 300 | +<span class="op">></span>( |
| 301 | + <span class="ident">handle</span>: <span class="kw-2">&mut</span> <span class="ident">R</span>, |
| 302 | +) -> (<span class="ident">WordCount</span>, <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">io::Error</span><span class="op">></span>) { |
317 | 303 | <span class="doccomment">/// Mask of the value bits of a continuation byte</span>
|
318 | 304 | <span class="kw">const</span> <span class="ident">CONT_MASK</span>: <span class="ident">u8</span> <span class="op">=</span> <span class="number">0b0011_1111u8</span>;
|
319 | 305 | <span class="doccomment">/// Value of the tag bits (tag mask is !CONT_MASK) of a continuation byte</span>
|
|
325 | 311 | <span class="kw">match</span> <span class="ident">handle</span>.<span class="ident">read</span>(<span class="kw-2">&mut</span> <span class="ident">buf</span>) {
|
326 | 312 | <span class="prelude-val">Ok</span>(<span class="number">0</span>) => <span class="kw">return</span> (<span class="ident">total</span>, <span class="prelude-val">None</span>),
|
327 | 313 | <span class="prelude-val">Ok</span>(<span class="ident">n</span>) => {
|
328 |
| - <span class="ident">total</span>.<span class="ident">chars</span> <span class="op">+</span><span class="op">=</span> <span class="ident">buf</span>[..<span class="ident">n</span>] |
329 |
| - .<span class="ident">iter</span>() |
330 |
| - .<span class="ident">filter</span>(<span class="op">|</span><span class="op">&&</span><span class="ident">byte</span><span class="op">|</span> (<span class="ident">byte</span> <span class="op">&</span> <span class="op">!</span><span class="ident">CONT_MASK</span>) <span class="op">!</span><span class="op">=</span> <span class="ident">TAG_CONT_U8</span>) |
331 |
| - .<span class="ident">count</span>(); |
| 314 | + <span class="kw">if</span> <span class="ident">COUNT_BYTES</span> { |
| 315 | + <span class="ident">total</span>.<span class="ident">bytes</span> <span class="op">+</span><span class="op">=</span> <span class="ident">n</span>; |
| 316 | + } |
| 317 | + <span class="kw">if</span> <span class="ident">COUNT_CHARS</span> { |
| 318 | + <span class="ident">total</span>.<span class="ident">chars</span> <span class="op">+</span><span class="op">=</span> <span class="ident">buf</span>[..<span class="ident">n</span>] |
| 319 | + .<span class="ident">iter</span>() |
| 320 | + .<span class="ident">filter</span>(<span class="op">|</span><span class="op">&&</span><span class="ident">byte</span><span class="op">|</span> (<span class="ident">byte</span> <span class="op">&</span> <span class="op">!</span><span class="ident">CONT_MASK</span>) <span class="op">!</span><span class="op">=</span> <span class="ident">TAG_CONT_U8</span>) |
| 321 | + .<span class="ident">count</span>(); |
| 322 | + } |
| 323 | + <span class="kw">if</span> <span class="ident">COUNT_LINES</span> { |
| 324 | + <span class="ident">total</span>.<span class="ident">lines</span> <span class="op">+</span><span class="op">=</span> <span class="ident">bytecount::count</span>(<span class="kw-2">&</span><span class="ident">buf</span>[..<span class="ident">n</span>], <span class="string">b'\n'</span>); |
| 325 | + } |
332 | 326 | }
|
333 | 327 | <span class="prelude-val">Err</span>(<span class="kw-2">ref</span> <span class="ident">e</span>) <span class="kw">if</span> <span class="ident">e</span>.<span class="ident">kind</span>() <span class="op">==</span> <span class="ident">ErrorKind::Interrupted</span> => <span class="kw">continue</span>,
|
334 | 328 | <span class="prelude-val">Err</span>(<span class="ident">e</span>) => <span class="kw">return</span> (<span class="ident">total</span>, <span class="prelude-val">Some</span>(<span class="ident">e</span>)),
|
|
0 commit comments