<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Rust 每日一库 on wsmの随记</title>
		<link>https://g0g.top/tags/rust-%E6%AF%8F%E6%97%A5%E4%B8%80%E5%BA%93/</link>
		<description>Recent content in Rust 每日一库 on wsmの随记</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Tue, 26 Nov 2024 19:10:59 +0800</lastBuildDate>
		
			<atom:link href="https://g0g.top/tags/rust-%E6%AF%8F%E6%97%A5%E4%B8%80%E5%BA%93/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>[Rust 每日一库] base64</title>
				<link>https://g0g.top/2024/11/base64/</link>
				<pubDate>Tue, 26 Nov 2024 19:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/11/base64/</guid>
				<description>&lt;p&gt;又功能一相当基础的小而美库&lt;/p&gt;&#xA;&lt;h2 id=&#34;核心功能&#34;&gt;核心功能&lt;/h2&gt;&#xA;&lt;p&gt;base64 库把核心功能在 &lt;code&gt;engine::Engine&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;trait&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Engine&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_encode&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_decoded_len_estimate&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input_len&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Self&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;DecodeEstimate&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_decode&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;decode_estimate&lt;/span&gt;: &lt;span style=&#34;color:#3f6e75&#34;&gt;Self&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;DecodeEstimate&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;DecodeMetadata&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;DecodeSliceError&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后它实现了一个 &lt;code&gt;GeneralPurpose&lt;/code&gt; 实现了这个 Trait&lt;/p&gt;&#xA;&lt;p&gt;值得注意的是它的实现用到了循环展开&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;from_be_bytes&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;].&lt;span style=&#34;color:#000&#34;&gt;try_into&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;unwrap&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;internal_encode&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;], &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#3f6e75&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0x3F&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// we read 8 bytes at a time (u64) but only actually consume 6 of those bytes. Thus, we need&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// 2 trailing bytes to be available to read..&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;last_fast_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;().&lt;span style=&#34;color:#000&#34;&gt;saturating_sub&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;last_fast_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;last_fast_index&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// Major performance wins from letting the optimizer do the bounds check once, mostly&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// on the output side&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;))];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;)];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// Hand-unrolling for 32 vs 16 or 8 bytes produces yields performance about equivalent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// to unsafe pointer code on a Xeon E5-1650v3. 64 byte unrolling was slightly better for&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// large inputs but significantly worse for 50-byte input, unsurprisingly. I suspect&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// that it&amp;#39;s a not uncommon use case to encode smallish chunks of data (e.g. a 64-byte&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// SHA-512 digest), so it would be nice if that fit in the unrolled loop at least once.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// Plus, single-digit percentage performance differences might well be quite different&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#177500&#34;&gt;// on different hardware.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;5&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;7&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;9&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;10&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;11&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;12&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;13&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;14&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;15&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;17&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;18&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;19&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;20&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;21&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;23&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;read_u64&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;]);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;24&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;58&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;25&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;52&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;26&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;46&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;27&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;40&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;34&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;29&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;28&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;30&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;22&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;31&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input_u64&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;8&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;BLOCKS_PER_FAST_LOOP&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// Encode what&amp;#39;s left after the fast loop.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u8&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0x3F&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;len&lt;/span&gt;() &lt;span style=&#34;color:#000&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#177500&#34;&gt;// start at the first index not handled by fast loop, which may be 0.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;)];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;..&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;)];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            [((&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            [((&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;6&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input_chunk&lt;/span&gt;[&lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;input_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;3&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#a90d91&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rem&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[(&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#5b269a&#34;&gt;self&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;encode_table&lt;/span&gt;[((&lt;span style=&#34;color:#000&#34;&gt;input&lt;/span&gt;[&lt;span style=&#34;color:#000&#34;&gt;start_of_rem&lt;/span&gt;] &lt;span style=&#34;color:#000&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#000&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LOW_SIX_BITS_U8&lt;/span&gt;) &lt;span style=&#34;color:#a90d91&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;usize&lt;/span&gt;];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;output_index&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O3 优化下，x86_64 的汇编代码就是朴素的一堆 &lt;code&gt;mov&lt;/code&gt;, &lt;code&gt;and&lt;/code&gt; 和 &lt;code&gt;shr&lt;/code&gt;；arm 汇编倒是做了乱序处理；然而实测在 x86_64 (ryzen 6800h)&#xA;上展开与否并不会显著影响性能（提升平均 5% 左右且不稳定）。个人不是很喜欢这个做法&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] bitflags</title>
				<link>https://g0g.top/2024/10/bitfield/</link>
				<pubDate>Wed, 23 Oct 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/bitfield/</guid>
				<description>&lt;p&gt;bitflags 在宏三大法器中抢夺出了前四名中的一席之地。它本身的功能相当简单。直接看代码：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;bitflags&lt;/span&gt;::&lt;span style=&#34;color:#000&#34;&gt;bitflags!&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Flags&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u32&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;A&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000001&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;B&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000010&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000100&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或是&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#3f6e75&#34;&gt;Flags&lt;/span&gt;(&lt;span style=&#34;color:#a90d91&#34;&gt;u32&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;bitflags!&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Flags&lt;/span&gt;: &lt;span style=&#34;color:#a90d91&#34;&gt;u32&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;A&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000001&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;B&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000010&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#1c01ce&#34;&gt;0b00000100&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后就可以把 &lt;code&gt;Flags&lt;/code&gt; 类似 &lt;code&gt;u128&lt;/code&gt; 一样计算使用，不同的是它基于 &lt;a href=&#34;https://docs.rs/bitflags/2.6.0/bitflags/trait.Flags.html&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;&lt;code&gt;Flags&lt;/code&gt;&lt;/a&gt;&#xA;trait 实现了一些好方法，如同官方 &lt;code&gt;slice&lt;/code&gt; 一样，让我们能够轻松使用。&lt;/p&gt;&#xA;&lt;p&gt;这是一种值得学习的范式：用 declarative macro 实现最小化扩展，然后用一个 trait 实现更多方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;宏&#34;&gt;宏&lt;/h2&gt;&#xA;&lt;p&gt;让我们深入看看 bitflags 的实际实现：教科书式的 declarative macro。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;$(#[$outer:meta]&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;$vis&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;vis&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;$BitFlags&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;ident&lt;/span&gt;: &lt;span style=&#34;color:#633820&#34;&gt;$T&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;ty&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#633820&#34;&gt;$(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#633820&#34;&gt;$(#[$inner:ident $($args:tt)*]&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a90d91&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;$Flag&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;tt&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#633820&#34;&gt;$value&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;expr&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#633820&#34;&gt;$($t&lt;/span&gt;:&lt;span style=&#34;color:#3f6e75&#34;&gt;tt&lt;/span&gt;)&lt;span style=&#34;color:#000&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;首先它处理了内外的 metadata；以支持诸如嵌套 macro、文档注释、编译标记等额外信息。&lt;/p&gt;&#xA;&lt;p&gt;然后是逐步的函数式 declarative macro 实现。&lt;/p&gt;&#xA;&lt;p&gt;它在最后处理了额外的 Token Tree，以支持多类型定义。&lt;/p&gt;&#xA;&lt;p&gt;总之简单好用就完了。&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] hashbrown</title>
				<link>https://g0g.top/2024/10/hashbrown/</link>
				<pubDate>Wed, 23 Oct 2024 19:52:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/hashbrown/</guid>
				<description>&lt;p&gt;hashbrown 库是 Rust 转写的 Google SwissTable，算法细节可以看 &lt;a href=&#34;https://www.youtube.com/watch?v=ncHmEUmJZf4&#34;&#xD;&#xA;  &#xD;&#xA;   target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xD;&#xA;&gt;CppCon talk&lt;/a&gt;。&#xA;它也是 1.36 之后版本的 Rust 标准库 HashTable 实现。&lt;/p&gt;&#xA;&lt;h2 id=&#34;layout&#34;&gt;Layout&lt;/h2&gt;&#xA;&lt;p&gt;大体架构上，它实现了一个 &lt;code&gt;RawTable&amp;lt;T&amp;gt;&lt;/code&gt;。不同于 CppCon 中提到的一个 ctrl 一个 bucket 两个向量，它的实现只用了一个 &lt;code&gt;ctrl&lt;/code&gt; 指针。&lt;/p&gt;&#xA;&lt;p&gt;源码中有以下说明：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       `self.table.ctrl.cast()` returns pointer that&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       points here (to the end of `T0`)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         ∨&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Pad], T_n, ..., T1, T0, |CT0, CT1, ..., CT_n|, CTa_0, CTa_1, ..., CTa_m&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          \________  ________/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                   \/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      `n = buckets - 1`, i.e. `RawTable::buckets() - 1`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;where: T0...T_n  - our stored data;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       CT0...CT_n - control bytes or metadata for `data`.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       CTa_0...CTa_m - additional control bytes, where `m = Group::WIDTH - 1` (so that the search&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       with loading `Group` bytes from the heap works properly, even if the result&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       of `h1(hash) &amp;amp; self.bucket_mask` is equal to `self.bucket_mask`). See also&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       `RawTableInner::set_ctrl` function.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;P.S. `h1(hash) &amp;amp; self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本质上是 Grouped Vector，让人眼前一亮！这种做法感觉对缓存非常友好。&lt;/p&gt;</description>
			</item>
			<item>
				<title>[Rust 每日一库] 引言</title>
				<link>https://g0g.top/2024/10/%E7%9B%AE%E5%BD%95/</link>
				<pubDate>Tue, 22 Oct 2024 23:10:59 +0800</pubDate>
				<guid>https://g0g.top/2024/10/%E7%9B%AE%E5%BD%95/</guid>
				<description>&lt;p&gt;Rust 提供了 crates.io 作为官方在线库服务；不过即使是拥有 Rust 语言本身的高要求，crates.io 里已然有着和&#xA;npm registry 一样的毛病：不少库看似花哨，实际性能低下、包装过多、依赖繁重。&lt;/p&gt;&#xA;&lt;p&gt;本系列计划或浅或深地按照 crates.io 上热门排名的顺序，选择一些库进行试用和学习；不爽的点可能会批判；但不会深入探究用法和功能，对应需求建议参考对应库的&#xA;&lt;code&gt;examples/&lt;/code&gt; 文件夹。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
