Adding large folders

This commit is contained in:
2026-02-26 12:00:21 -05:00
parent 5400d82acd
commit 49701c85ad
47332 changed files with 1942573 additions and 0 deletions

View File

@@ -0,0 +1,514 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/backward_references/hash_to_binary_tree.rs`."><title>hash_to_binary_tree.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../../" data-static-root-path="../../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../../static.files/src-script-813739b1.js"></script><script defer src="../../../../src-files.js"></script><script defer src="../../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/backward_references/</div>hash_to_binary_tree.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core;
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span>core::cmp::min;
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use super</span>::{
<a href=#6 id=6 data-nosnippet>6</a> kHashMul32, AnyHasher, BrotliEncoderParams, CloneWithAlloc, H9Opts, HasherSearchResult,
<a href=#7 id=7 data-nosnippet>7</a> HowPrepared, Struct1, fix_unbroken_len,
<a href=#8 id=8 data-nosnippet>8</a>};
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::allocate;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">crate</span>::enc::static_dict::{
<a href=#11 id=11 data-nosnippet>11</a> BrotliDictionary, FindMatchLengthWithLimit, BROTLI_UNALIGNED_LOAD32,
<a href=#12 id=12 data-nosnippet>12</a>};
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span><span class="kw">crate</span>::enc::util::floatX;
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">pub const </span>kInfinity: floatX = <span class="number">1.7e38</span>;
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a><span class="attr">#[derive(Clone, Copy, Debug)]
<a href=#18 id=18 data-nosnippet>18</a></span><span class="kw">pub enum </span>Union1 {
<a href=#19 id=19 data-nosnippet>19</a> cost(floatX),
<a href=#20 id=20 data-nosnippet>20</a> next(u32),
<a href=#21 id=21 data-nosnippet>21</a> shortcut(u32),
<a href=#22 id=22 data-nosnippet>22</a>}
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a><span class="attr">#[derive(Clone, Copy, Debug)]
<a href=#25 id=25 data-nosnippet>25</a></span><span class="kw">pub struct </span>ZopfliNode {
<a href=#26 id=26 data-nosnippet>26</a> <span class="comment">//highest 7 bit is used to reconstruct the length code
<a href=#27 id=27 data-nosnippet>27</a> </span><span class="kw">pub </span>length: u32,
<a href=#28 id=28 data-nosnippet>28</a> <span class="comment">// distance associated with the length
<a href=#29 id=29 data-nosnippet>29</a> </span><span class="kw">pub </span>distance: u32,
<a href=#30 id=30 data-nosnippet>30</a> <span class="comment">// number of literal inserts before the copy; highest 5 bits contain distance short code + 1 (or zero if no short code)
<a href=#31 id=31 data-nosnippet>31</a> </span><span class="kw">pub </span>dcode_insert_length: u32,
<a href=#32 id=32 data-nosnippet>32</a> <span class="kw">pub </span>u: Union1,
<a href=#33 id=33 data-nosnippet>33</a>}
<a href=#34 id=34 data-nosnippet>34</a><span class="kw">impl </span>Default <span class="kw">for </span>ZopfliNode {
<a href=#35 id=35 data-nosnippet>35</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#36 id=36 data-nosnippet>36</a> ZopfliNode {
<a href=#37 id=37 data-nosnippet>37</a> length: <span class="number">1</span>,
<a href=#38 id=38 data-nosnippet>38</a> distance: <span class="number">0</span>,
<a href=#39 id=39 data-nosnippet>39</a> dcode_insert_length: <span class="number">0</span>,
<a href=#40 id=40 data-nosnippet>40</a> u: Union1::cost(kInfinity),
<a href=#41 id=41 data-nosnippet>41</a> }
<a href=#42 id=42 data-nosnippet>42</a> }
<a href=#43 id=43 data-nosnippet>43</a>}
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a><span class="kw">pub trait </span>Allocable&lt;T: Copy, AllocT: Allocator&lt;T&gt;&gt; {
<a href=#46 id=46 data-nosnippet>46</a> <span class="kw">fn </span>new(m: <span class="kw-2">&amp;mut </span>AllocT, init: T) -&gt; <span class="self">Self</span>;
<a href=#47 id=47 data-nosnippet>47</a> <span class="kw">fn </span>new_uninit(m: <span class="kw-2">&amp;mut </span>AllocT) -&gt; <span class="self">Self</span>;
<a href=#48 id=48 data-nosnippet>48</a> <span class="kw">fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m: <span class="kw-2">&amp;mut </span>AllocT);
<a href=#49 id=49 data-nosnippet>49</a>}
<a href=#50 id=50 data-nosnippet>50</a><span class="kw">pub trait </span>H10Params {
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">fn </span>max_tree_search_depth() -&gt; u32;
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">fn </span>max_tree_comp_length() -&gt; u32;
<a href=#53 id=53 data-nosnippet>53</a>}
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a><span class="kw">pub struct </span>H10DefaultParams {}
<a href=#56 id=56 data-nosnippet>56</a><span class="kw">impl </span>H10Params <span class="kw">for </span>H10DefaultParams {
<a href=#57 id=57 data-nosnippet>57</a> <span class="attr">#[inline(always)]
<a href=#58 id=58 data-nosnippet>58</a> </span><span class="kw">fn </span>max_tree_search_depth() -&gt; u32 {
<a href=#59 id=59 data-nosnippet>59</a> <span class="number">64
<a href=#60 id=60 data-nosnippet>60</a> </span>}
<a href=#61 id=61 data-nosnippet>61</a> <span class="attr">#[inline(always)]
<a href=#62 id=62 data-nosnippet>62</a> </span><span class="kw">fn </span>max_tree_comp_length() -&gt; u32 {
<a href=#63 id=63 data-nosnippet>63</a> <span class="number">128
<a href=#64 id=64 data-nosnippet>64</a> </span>}
<a href=#65 id=65 data-nosnippet>65</a>}
<a href=#66 id=66 data-nosnippet>66</a>
<a href=#67 id=67 data-nosnippet>67</a><span class="kw">const </span>BUCKET_BITS: usize = <span class="number">17</span>;
<a href=#68 id=68 data-nosnippet>68</a>
<a href=#69 id=69 data-nosnippet>69</a><span class="kw">pub struct </span>H10Buckets&lt;AllocU32: Allocator&lt;u32&gt;&gt;(AllocU32::AllocatedMemory);
<a href=#70 id=70 data-nosnippet>70</a>
<a href=#71 id=71 data-nosnippet>71</a><span class="kw">impl</span>&lt;AllocU32: Allocator&lt;u32&gt;&gt; Allocable&lt;u32, AllocU32&gt; <span class="kw">for </span>H10Buckets&lt;AllocU32&gt; {
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">fn </span>new(m: <span class="kw-2">&amp;mut </span>AllocU32, initializer: u32) -&gt; H10Buckets&lt;AllocU32&gt; {
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = m.alloc_cell(<span class="number">1 </span>&lt;&lt; BUCKET_BITS);
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">for </span>item <span class="kw">in </span>ret.slice_mut().iter_mut() {
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw-2">*</span>item = initializer;
<a href=#76 id=76 data-nosnippet>76</a> }
<a href=#77 id=77 data-nosnippet>77</a> H10Buckets::&lt;AllocU32&gt;(ret)
<a href=#78 id=78 data-nosnippet>78</a> }
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw">fn </span>new_uninit(m: <span class="kw-2">&amp;mut </span>AllocU32) -&gt; H10Buckets&lt;AllocU32&gt; {
<a href=#80 id=80 data-nosnippet>80</a> H10Buckets::&lt;AllocU32&gt;(m.alloc_cell(<span class="number">1 </span>&lt;&lt; BUCKET_BITS))
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a> <span class="kw">fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m: <span class="kw-2">&amp;mut </span>AllocU32) {
<a href=#83 id=83 data-nosnippet>83</a> m.free_cell(core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>));
<a href=#84 id=84 data-nosnippet>84</a> }
<a href=#85 id=85 data-nosnippet>85</a>}
<a href=#86 id=86 data-nosnippet>86</a>
<a href=#87 id=87 data-nosnippet>87</a><span class="kw">impl</span>&lt;AllocU32: Allocator&lt;u32&gt;&gt; PartialEq&lt;H10Buckets&lt;AllocU32&gt;&gt; <span class="kw">for </span>H10Buckets&lt;AllocU32&gt; {
<a href=#88 id=88 data-nosnippet>88</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>H10Buckets&lt;AllocU32&gt;) -&gt; bool {
<a href=#89 id=89 data-nosnippet>89</a> <span class="kw">return </span><span class="self">self</span>.<span class="number">0</span>.slice() == other.<span class="number">0</span>.slice();
<a href=#90 id=90 data-nosnippet>90</a> }
<a href=#91 id=91 data-nosnippet>91</a>}
<a href=#92 id=92 data-nosnippet>92</a>
<a href=#93 id=93 data-nosnippet>93</a><span class="kw">impl</span>&lt;AllocU32: Allocator&lt;u32&gt;&gt; SliceWrapper&lt;u32&gt; <span class="kw">for </span>H10Buckets&lt;AllocU32&gt; {
<a href=#94 id=94 data-nosnippet>94</a> <span class="attr">#[inline(always)]
<a href=#95 id=95 data-nosnippet>95</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u32] {
<a href=#96 id=96 data-nosnippet>96</a> <span class="self">self</span>.<span class="number">0</span>.slice()
<a href=#97 id=97 data-nosnippet>97</a> }
<a href=#98 id=98 data-nosnippet>98</a>}
<a href=#99 id=99 data-nosnippet>99</a><span class="kw">impl</span>&lt;AllocU32: Allocator&lt;u32&gt;&gt; SliceWrapperMut&lt;u32&gt; <span class="kw">for </span>H10Buckets&lt;AllocU32&gt; {
<a href=#100 id=100 data-nosnippet>100</a> <span class="attr">#[inline(always)]
<a href=#101 id=101 data-nosnippet>101</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u32] {
<a href=#102 id=102 data-nosnippet>102</a> <span class="self">self</span>.<span class="number">0</span>.slice_mut()
<a href=#103 id=103 data-nosnippet>103</a> }
<a href=#104 id=104 data-nosnippet>104</a>}
<a href=#105 id=105 data-nosnippet>105</a>
<a href=#106 id=106 data-nosnippet>106</a><span class="kw">pub struct </span>H10&lt;
<a href=#107 id=107 data-nosnippet>107</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#108 id=108 data-nosnippet>108</a> Buckets: Allocable&lt;u32, AllocU32&gt; + SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt;,
<a href=#109 id=109 data-nosnippet>109</a> Params: H10Params,
<a href=#110 id=110 data-nosnippet>110</a>&gt; <span class="kw">where
<a href=#111 id=111 data-nosnippet>111</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#112 id=112 data-nosnippet>112</a>{
<a href=#113 id=113 data-nosnippet>113</a> <span class="kw">pub </span>window_mask_: usize,
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">pub </span>ringbuffer_break: <span class="prelude-ty">Option</span>&lt;core::num::NonZeroUsize&gt;,
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw">pub </span>common: Struct1,
<a href=#116 id=116 data-nosnippet>116</a> <span class="kw">pub </span>buckets_: Buckets,
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw">pub </span>invalid_pos_: u32,
<a href=#118 id=118 data-nosnippet>118</a> <span class="kw">pub </span>forest: AllocU32::AllocatedMemory,
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw">pub </span>_params: core::marker::PhantomData&lt;Params&gt;,
<a href=#120 id=120 data-nosnippet>120</a>}
<a href=#121 id=121 data-nosnippet>121</a>
<a href=#122 id=122 data-nosnippet>122</a><span class="kw">impl</span>&lt;
<a href=#123 id=123 data-nosnippet>123</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#124 id=124 data-nosnippet>124</a> Buckets: Allocable&lt;u32, AllocU32&gt; + SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt;,
<a href=#125 id=125 data-nosnippet>125</a> Params: H10Params,
<a href=#126 id=126 data-nosnippet>126</a> &gt; PartialEq&lt;H10&lt;AllocU32, Buckets, Params&gt;&gt; <span class="kw">for </span>H10&lt;AllocU32, Buckets, Params&gt;
<a href=#127 id=127 data-nosnippet>127</a><span class="kw">where
<a href=#128 id=128 data-nosnippet>128</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#129 id=129 data-nosnippet>129</a>{
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>H10&lt;AllocU32, Buckets, Params&gt;) -&gt; bool {
<a href=#131 id=131 data-nosnippet>131</a> <span class="self">self</span>.window_mask_ == other.window_mask_
<a href=#132 id=132 data-nosnippet>132</a> &amp;&amp; <span class="self">self</span>.common == other.common
<a href=#133 id=133 data-nosnippet>133</a> &amp;&amp; <span class="self">self</span>.buckets_ == other.buckets_
<a href=#134 id=134 data-nosnippet>134</a> &amp;&amp; <span class="self">self</span>.invalid_pos_ == other.invalid_pos_
<a href=#135 id=135 data-nosnippet>135</a> &amp;&amp; <span class="self">self</span>.forest.slice() == other.forest.slice()
<a href=#136 id=136 data-nosnippet>136</a> &amp;&amp; <span class="self">self</span>._params == other._params
<a href=#137 id=137 data-nosnippet>137</a> &amp;&amp; <span class="self">self</span>.ringbuffer_break == other.ringbuffer_break
<a href=#138 id=138 data-nosnippet>138</a> }
<a href=#139 id=139 data-nosnippet>139</a>}
<a href=#140 id=140 data-nosnippet>140</a>
<a href=#141 id=141 data-nosnippet>141</a><span class="kw">pub fn </span>InitializeH10&lt;AllocU32: Allocator&lt;u32&gt;&gt;(
<a href=#142 id=142 data-nosnippet>142</a> m32: <span class="kw-2">&amp;mut </span>AllocU32,
<a href=#143 id=143 data-nosnippet>143</a> one_shot: bool,
<a href=#144 id=144 data-nosnippet>144</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#145 id=145 data-nosnippet>145</a> ringbuffer_break: <span class="prelude-ty">Option</span>&lt;core::num::NonZeroUsize&gt;,
<a href=#146 id=146 data-nosnippet>146</a> input_size: usize,
<a href=#147 id=147 data-nosnippet>147</a>) -&gt; H10&lt;AllocU32, H10Buckets&lt;AllocU32&gt;, H10DefaultParams&gt; {
<a href=#148 id=148 data-nosnippet>148</a> initialize_h10::&lt;AllocU32, H10Buckets&lt;AllocU32&gt;&gt;(m32, one_shot, params, input_size, ringbuffer_break)
<a href=#149 id=149 data-nosnippet>149</a>}
<a href=#150 id=150 data-nosnippet>150</a><span class="kw">fn </span>initialize_h10&lt;
<a href=#151 id=151 data-nosnippet>151</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#152 id=152 data-nosnippet>152</a> Buckets: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + Allocable&lt;u32, AllocU32&gt;,
<a href=#153 id=153 data-nosnippet>153</a>&gt;(
<a href=#154 id=154 data-nosnippet>154</a> m32: <span class="kw-2">&amp;mut </span>AllocU32,
<a href=#155 id=155 data-nosnippet>155</a> one_shot: bool,
<a href=#156 id=156 data-nosnippet>156</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#157 id=157 data-nosnippet>157</a> input_size: usize,
<a href=#158 id=158 data-nosnippet>158</a> ringbuffer_break: <span class="prelude-ty">Option</span>&lt;core::num::NonZeroUsize&gt;,
<a href=#159 id=159 data-nosnippet>159</a>) -&gt; H10&lt;AllocU32, Buckets, H10DefaultParams&gt;
<a href=#160 id=160 data-nosnippet>160</a><span class="kw">where
<a href=#161 id=161 data-nosnippet>161</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#162 id=162 data-nosnippet>162</a>{
<a href=#163 id=163 data-nosnippet>163</a> <span class="kw">let </span><span class="kw-2">mut </span>num_nodes = <span class="number">1 </span>&lt;&lt; params.lgwin;
<a href=#164 id=164 data-nosnippet>164</a> <span class="kw">if </span>one_shot &amp;&amp; input_size &lt; num_nodes {
<a href=#165 id=165 data-nosnippet>165</a> num_nodes = input_size;
<a href=#166 id=166 data-nosnippet>166</a> }
<a href=#167 id=167 data-nosnippet>167</a> <span class="kw">let </span>window_mask = (<span class="number">1 </span>&lt;&lt; params.lgwin) - <span class="number">1</span>;
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">let </span>invalid_pos = <span class="number">0u32</span>.wrapping_sub(window_mask);
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">let </span>buckets = &lt;Buckets <span class="kw">as </span>Allocable&lt;u32, AllocU32&gt;&gt;::new(m32, invalid_pos);
<a href=#170 id=170 data-nosnippet>170</a> H10::&lt;AllocU32, Buckets, H10DefaultParams&gt; {
<a href=#171 id=171 data-nosnippet>171</a> common: Struct1 {
<a href=#172 id=172 data-nosnippet>172</a> params: params.hasher,
<a href=#173 id=173 data-nosnippet>173</a> is_prepared_: <span class="number">1</span>,
<a href=#174 id=174 data-nosnippet>174</a> dict_num_lookups: <span class="number">0</span>,
<a href=#175 id=175 data-nosnippet>175</a> dict_num_matches: <span class="number">0</span>,
<a href=#176 id=176 data-nosnippet>176</a> },
<a href=#177 id=177 data-nosnippet>177</a> _params: core::marker::PhantomData::&lt;H10DefaultParams&gt;,
<a href=#178 id=178 data-nosnippet>178</a> window_mask_: window_mask <span class="kw">as </span>usize,
<a href=#179 id=179 data-nosnippet>179</a> invalid_pos_: invalid_pos,
<a href=#180 id=180 data-nosnippet>180</a> buckets_: buckets,
<a href=#181 id=181 data-nosnippet>181</a> forest: m32.alloc_cell(num_nodes * <span class="number">2</span>),
<a href=#182 id=182 data-nosnippet>182</a> ringbuffer_break,
<a href=#183 id=183 data-nosnippet>183</a> }
<a href=#184 id=184 data-nosnippet>184</a>}
<a href=#185 id=185 data-nosnippet>185</a>
<a href=#186 id=186 data-nosnippet>186</a><span class="kw">impl</span>&lt;
<a href=#187 id=187 data-nosnippet>187</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#188 id=188 data-nosnippet>188</a> Buckets: Allocable&lt;u32, AllocU32&gt; + SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt;,
<a href=#189 id=189 data-nosnippet>189</a> Params: H10Params,
<a href=#190 id=190 data-nosnippet>190</a> &gt; H10&lt;AllocU32, Buckets, Params&gt;
<a href=#191 id=191 data-nosnippet>191</a><span class="kw">where
<a href=#192 id=192 data-nosnippet>192</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#193 id=193 data-nosnippet>193</a>{
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">pub fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m32: <span class="kw-2">&amp;mut </span>AllocU32) {
<a href=#195 id=195 data-nosnippet>195</a> m32.free_cell(core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.forest));
<a href=#196 id=196 data-nosnippet>196</a> <span class="self">self</span>.buckets_.free(m32);
<a href=#197 id=197 data-nosnippet>197</a> }
<a href=#198 id=198 data-nosnippet>198</a>}
<a href=#199 id=199 data-nosnippet>199</a><span class="kw">impl</span>&lt;
<a href=#200 id=200 data-nosnippet>200</a> Alloc: Allocator&lt;u16&gt; + Allocator&lt;u32&gt;,
<a href=#201 id=201 data-nosnippet>201</a> Buckets: Allocable&lt;u32, Alloc&gt; + SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt;,
<a href=#202 id=202 data-nosnippet>202</a> Params: H10Params,
<a href=#203 id=203 data-nosnippet>203</a> &gt; CloneWithAlloc&lt;Alloc&gt; <span class="kw">for </span>H10&lt;Alloc, Buckets, Params&gt;
<a href=#204 id=204 data-nosnippet>204</a><span class="kw">where
<a href=#205 id=205 data-nosnippet>205</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#206 id=206 data-nosnippet>206</a>{
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">fn </span>clone_with_alloc(<span class="kw-2">&amp;</span><span class="self">self</span>, m: <span class="kw-2">&amp;mut </span>Alloc) -&gt; <span class="self">Self </span>{
<a href=#208 id=208 data-nosnippet>208</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = H10::&lt;Alloc, Buckets, Params&gt; {
<a href=#209 id=209 data-nosnippet>209</a> window_mask_: <span class="self">self</span>.window_mask_,
<a href=#210 id=210 data-nosnippet>210</a> common: <span class="self">self</span>.common.clone(),
<a href=#211 id=211 data-nosnippet>211</a> buckets_: Buckets::new_uninit(m),
<a href=#212 id=212 data-nosnippet>212</a> invalid_pos_: <span class="self">self</span>.invalid_pos_,
<a href=#213 id=213 data-nosnippet>213</a> forest: allocate::&lt;u32, <span class="kw">_</span>&gt;(m, <span class="self">self</span>.forest.len()),
<a href=#214 id=214 data-nosnippet>214</a> _params: core::marker::PhantomData::&lt;Params&gt;,
<a href=#215 id=215 data-nosnippet>215</a> ringbuffer_break: <span class="self">self</span>.ringbuffer_break,
<a href=#216 id=216 data-nosnippet>216</a> };
<a href=#217 id=217 data-nosnippet>217</a> ret.buckets_
<a href=#218 id=218 data-nosnippet>218</a> .slice_mut()
<a href=#219 id=219 data-nosnippet>219</a> .clone_from_slice(<span class="self">self</span>.buckets_.slice());
<a href=#220 id=220 data-nosnippet>220</a> ret.forest.slice_mut().clone_from_slice(<span class="self">self</span>.forest.slice());
<a href=#221 id=221 data-nosnippet>221</a> ret
<a href=#222 id=222 data-nosnippet>222</a> }
<a href=#223 id=223 data-nosnippet>223</a>}
<a href=#224 id=224 data-nosnippet>224</a>
<a href=#225 id=225 data-nosnippet>225</a><span class="kw">impl</span>&lt;
<a href=#226 id=226 data-nosnippet>226</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#227 id=227 data-nosnippet>227</a> Buckets: Allocable&lt;u32, AllocU32&gt; + SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt;,
<a href=#228 id=228 data-nosnippet>228</a> Params: H10Params,
<a href=#229 id=229 data-nosnippet>229</a> &gt; AnyHasher <span class="kw">for </span>H10&lt;AllocU32, Buckets, Params&gt;
<a href=#230 id=230 data-nosnippet>230</a><span class="kw">where
<a href=#231 id=231 data-nosnippet>231</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#232 id=232 data-nosnippet>232</a>{
<a href=#233 id=233 data-nosnippet>233</a> <span class="comment">/* fn GetH10Tree(&amp;mut self) -&gt; Option&lt;&amp;mut H10&lt;AllocU32, Buckets, H10Params&gt;&gt; {
<a href=#234 id=234 data-nosnippet>234</a> Some(self)
<a href=#235 id=235 data-nosnippet>235</a> }*/
<a href=#236 id=236 data-nosnippet>236</a> </span><span class="attr">#[inline(always)]
<a href=#237 id=237 data-nosnippet>237</a> </span><span class="kw">fn </span>Opts(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; H9Opts {
<a href=#238 id=238 data-nosnippet>238</a> H9Opts {
<a href=#239 id=239 data-nosnippet>239</a> literal_byte_score: <span class="number">340</span>,
<a href=#240 id=240 data-nosnippet>240</a> }
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a> <span class="attr">#[inline(always)]
<a href=#243 id=243 data-nosnippet>243</a> </span><span class="kw">fn </span>PrepareDistanceCache(<span class="kw-2">&amp;</span><span class="self">self</span>, _distance_cache: <span class="kw-2">&amp;mut </span>[i32]) {}
<a href=#244 id=244 data-nosnippet>244</a> <span class="attr">#[inline(always)]
<a href=#245 id=245 data-nosnippet>245</a> </span><span class="kw">fn </span>HashTypeLength(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#246 id=246 data-nosnippet>246</a> <span class="number">4
<a href=#247 id=247 data-nosnippet>247</a> </span>}
<a href=#248 id=248 data-nosnippet>248</a> <span class="attr">#[inline(always)]
<a href=#249 id=249 data-nosnippet>249</a> </span><span class="kw">fn </span>StoreLookahead(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#250 id=250 data-nosnippet>250</a> Params::max_tree_comp_length() <span class="kw">as </span>usize
<a href=#251 id=251 data-nosnippet>251</a> }
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">fn </span>StitchToPreviousBlock(
<a href=#253 id=253 data-nosnippet>253</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#254 id=254 data-nosnippet>254</a> num_bytes: usize,
<a href=#255 id=255 data-nosnippet>255</a> position: usize,
<a href=#256 id=256 data-nosnippet>256</a> ringbuffer: <span class="kw-2">&amp;</span>[u8],
<a href=#257 id=257 data-nosnippet>257</a> ringbuffer_mask: usize,
<a href=#258 id=258 data-nosnippet>258</a> ) {
<a href=#259 id=259 data-nosnippet>259</a> <span class="kw">super</span>::hq::StitchToPreviousBlockH10(<span class="self">self</span>, num_bytes, position, ringbuffer, ringbuffer_mask, <span class="self">self</span>.ringbuffer_break)
<a href=#260 id=260 data-nosnippet>260</a> }
<a href=#261 id=261 data-nosnippet>261</a> <span class="attr">#[inline(always)]
<a href=#262 id=262 data-nosnippet>262</a> </span><span class="kw">fn </span>GetHasherCommon(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>Struct1 {
<a href=#263 id=263 data-nosnippet>263</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.common
<a href=#264 id=264 data-nosnippet>264</a> }
<a href=#265 id=265 data-nosnippet>265</a> <span class="attr">#[inline(always)]
<a href=#266 id=266 data-nosnippet>266</a> </span><span class="kw">fn </span>HashBytes(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>[u8]) -&gt; usize {
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">let </span>h = BROTLI_UNALIGNED_LOAD32(data).wrapping_mul(kHashMul32);
<a href=#268 id=268 data-nosnippet>268</a> (h &gt;&gt; (<span class="number">32i32 </span>- BUCKET_BITS <span class="kw">as </span>i32)) <span class="kw">as </span>usize
<a href=#269 id=269 data-nosnippet>269</a> }
<a href=#270 id=270 data-nosnippet>270</a> <span class="attr">#[inline(always)]
<a href=#271 id=271 data-nosnippet>271</a> </span><span class="kw">fn </span>Store(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>[u8], mask: usize, ix: usize) {
<a href=#272 id=272 data-nosnippet>272</a> <span class="kw">let </span>max_backward: usize = <span class="self">self</span>.window_mask_.wrapping_sub(<span class="number">16</span>).wrapping_add(<span class="number">1</span>);
<a href=#273 id=273 data-nosnippet>273</a> StoreAndFindMatchesH10(
<a href=#274 id=274 data-nosnippet>274</a> <span class="self">self</span>,
<a href=#275 id=275 data-nosnippet>275</a> data,
<a href=#276 id=276 data-nosnippet>276</a> ix,
<a href=#277 id=277 data-nosnippet>277</a> mask,
<a href=#278 id=278 data-nosnippet>278</a> <span class="self">self</span>.ringbuffer_break,
<a href=#279 id=279 data-nosnippet>279</a> Params::max_tree_comp_length() <span class="kw">as </span>usize,
<a href=#280 id=280 data-nosnippet>280</a> max_backward,
<a href=#281 id=281 data-nosnippet>281</a> <span class="kw-2">&amp;mut </span><span class="number">0</span>,
<a href=#282 id=282 data-nosnippet>282</a> <span class="kw-2">&amp;mut </span>[],
<a href=#283 id=283 data-nosnippet>283</a> );
<a href=#284 id=284 data-nosnippet>284</a> }
<a href=#285 id=285 data-nosnippet>285</a> <span class="kw">fn </span>StoreRange(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>[u8], mask: usize, ix_start: usize, ix_end: usize) {
<a href=#286 id=286 data-nosnippet>286</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize = ix_start;
<a href=#287 id=287 data-nosnippet>287</a> <span class="kw">let </span><span class="kw-2">mut </span>j: usize = ix_start;
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">if </span>ix_start.wrapping_add(<span class="number">63</span>) &lt;= ix_end {
<a href=#289 id=289 data-nosnippet>289</a> i = ix_end.wrapping_sub(<span class="number">63</span>);
<a href=#290 id=290 data-nosnippet>290</a> }
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw">if </span>ix_start.wrapping_add(<span class="number">512</span>) &lt;= i {
<a href=#292 id=292 data-nosnippet>292</a> <span class="kw">while </span>j &lt; i {
<a href=#293 id=293 data-nosnippet>293</a> {
<a href=#294 id=294 data-nosnippet>294</a> <span class="self">self</span>.Store(data, mask, j);
<a href=#295 id=295 data-nosnippet>295</a> }
<a href=#296 id=296 data-nosnippet>296</a> j = j.wrapping_add(<span class="number">8</span>);
<a href=#297 id=297 data-nosnippet>297</a> }
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a> <span class="kw">while </span>i &lt; ix_end {
<a href=#300 id=300 data-nosnippet>300</a> {
<a href=#301 id=301 data-nosnippet>301</a> <span class="self">self</span>.Store(data, mask, i);
<a href=#302 id=302 data-nosnippet>302</a> }
<a href=#303 id=303 data-nosnippet>303</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#304 id=304 data-nosnippet>304</a> }
<a href=#305 id=305 data-nosnippet>305</a> }
<a href=#306 id=306 data-nosnippet>306</a> <span class="kw">fn </span>BulkStoreRange(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>[u8], mask: usize, ix_start: usize, ix_end: usize) {
<a href=#307 id=307 data-nosnippet>307</a> <span class="kw">for </span>i <span class="kw">in </span>ix_start..ix_end {
<a href=#308 id=308 data-nosnippet>308</a> <span class="self">self</span>.Store(data, mask, i);
<a href=#309 id=309 data-nosnippet>309</a> }
<a href=#310 id=310 data-nosnippet>310</a> }
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">fn </span>Prepare(<span class="kw-2">&amp;mut </span><span class="self">self</span>, _one_shot: bool, _input_size: usize, _data: <span class="kw-2">&amp;</span>[u8]) -&gt; HowPrepared {
<a href=#312 id=312 data-nosnippet>312</a> <span class="kw">if </span><span class="self">self</span>.common.<span class="macro">is_prepared_ !</span>= <span class="number">0 </span>{
<a href=#313 id=313 data-nosnippet>313</a> <span class="kw">return </span>HowPrepared::ALREADY_PREPARED;
<a href=#314 id=314 data-nosnippet>314</a> }
<a href=#315 id=315 data-nosnippet>315</a> <span class="kw">let </span>invalid_pos = <span class="self">self</span>.invalid_pos_;
<a href=#316 id=316 data-nosnippet>316</a> <span class="kw">for </span>bucket <span class="kw">in </span><span class="self">self</span>.buckets_.slice_mut().iter_mut() {
<a href=#317 id=317 data-nosnippet>317</a> <span class="kw-2">*</span>bucket = invalid_pos;
<a href=#318 id=318 data-nosnippet>318</a> }
<a href=#319 id=319 data-nosnippet>319</a> <span class="self">self</span>.common.is_prepared_ = <span class="number">1</span>;
<a href=#320 id=320 data-nosnippet>320</a> HowPrepared::NEWLY_PREPARED
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a>
<a href=#323 id=323 data-nosnippet>323</a> <span class="kw">fn </span>FindLongestMatch(
<a href=#324 id=324 data-nosnippet>324</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#325 id=325 data-nosnippet>325</a> _dictionary: <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>BrotliDictionary&gt;,
<a href=#326 id=326 data-nosnippet>326</a> _dictionary_hash: <span class="kw-2">&amp;</span>[u16],
<a href=#327 id=327 data-nosnippet>327</a> _data: <span class="kw-2">&amp;</span>[u8],
<a href=#328 id=328 data-nosnippet>328</a> _ring_buffer_mask: usize,
<a href=#329 id=329 data-nosnippet>329</a> _ring_buffer_break: <span class="prelude-ty">Option</span>&lt;core::num::NonZeroUsize&gt;,
<a href=#330 id=330 data-nosnippet>330</a> _distance_cache: <span class="kw-2">&amp;</span>[i32],
<a href=#331 id=331 data-nosnippet>331</a> _cur_ix: usize,
<a href=#332 id=332 data-nosnippet>332</a> _max_length: usize,
<a href=#333 id=333 data-nosnippet>333</a> _max_backward: usize,
<a href=#334 id=334 data-nosnippet>334</a> _gap: usize,
<a href=#335 id=335 data-nosnippet>335</a> _max_distance: usize,
<a href=#336 id=336 data-nosnippet>336</a> _out: <span class="kw-2">&amp;mut </span>HasherSearchResult,
<a href=#337 id=337 data-nosnippet>337</a> ) -&gt; bool {
<a href=#338 id=338 data-nosnippet>338</a> <span class="macro">unimplemented!</span>();
<a href=#339 id=339 data-nosnippet>339</a> }
<a href=#340 id=340 data-nosnippet>340</a>}
<a href=#341 id=341 data-nosnippet>341</a>
<a href=#342 id=342 data-nosnippet>342</a><span class="kw">pub struct </span>BackwardMatch(<span class="kw">pub </span>u64);
<a href=#343 id=343 data-nosnippet>343</a>
<a href=#344 id=344 data-nosnippet>344</a><span class="comment">// pub distance : u32,
<a href=#345 id=345 data-nosnippet>345</a>// pub length_and_code : u32,
<a href=#346 id=346 data-nosnippet>346</a></span><span class="kw">impl </span>BackwardMatch {
<a href=#347 id=347 data-nosnippet>347</a> <span class="attr">#[inline(always)]
<a href=#348 id=348 data-nosnippet>348</a> </span><span class="kw">pub fn </span>distance(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#349 id=349 data-nosnippet>349</a> <span class="self">self</span>.<span class="number">0 </span><span class="kw">as </span>u32
<a href=#350 id=350 data-nosnippet>350</a> }
<a href=#351 id=351 data-nosnippet>351</a> <span class="attr">#[inline(always)]
<a href=#352 id=352 data-nosnippet>352</a> </span><span class="kw">pub fn </span>length_and_code(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#353 id=353 data-nosnippet>353</a> (<span class="self">self</span>.<span class="number">0 </span>&gt;&gt; <span class="number">32</span>) <span class="kw">as </span>u32
<a href=#354 id=354 data-nosnippet>354</a> }
<a href=#355 id=355 data-nosnippet>355</a>}
<a href=#356 id=356 data-nosnippet>356</a><span class="kw">pub struct </span>BackwardMatchMut&lt;<span class="lifetime">'a</span>&gt;(<span class="kw">pub </span><span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>u64);
<a href=#357 id=357 data-nosnippet>357</a>
<a href=#358 id=358 data-nosnippet>358</a><span class="comment">// pub distance : u32,
<a href=#359 id=359 data-nosnippet>359</a>// pub length_and_code : u32,
<a href=#360 id=360 data-nosnippet>360</a></span><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; BackwardMatchMut&lt;<span class="lifetime">'a</span>&gt; {
<a href=#361 id=361 data-nosnippet>361</a> <span class="attr">#[inline(always)]
<a href=#362 id=362 data-nosnippet>362</a> </span><span class="kw">pub fn </span>distance(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#363 id=363 data-nosnippet>363</a> <span class="kw-2">*</span><span class="self">self</span>.<span class="number">0 </span><span class="kw">as </span>u32
<a href=#364 id=364 data-nosnippet>364</a> }
<a href=#365 id=365 data-nosnippet>365</a> <span class="attr">#[inline(always)]
<a href=#366 id=366 data-nosnippet>366</a> </span><span class="kw">pub fn </span>length_and_code(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#367 id=367 data-nosnippet>367</a> (<span class="kw-2">*</span><span class="self">self</span>.<span class="number">0 </span>&gt;&gt; <span class="number">32</span>) <span class="kw">as </span>u32
<a href=#368 id=368 data-nosnippet>368</a> }
<a href=#369 id=369 data-nosnippet>369</a> <span class="attr">#[inline(always)]
<a href=#370 id=370 data-nosnippet>370</a> </span><span class="kw">pub fn </span>set_distance(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: u32) {
<a href=#371 id=371 data-nosnippet>371</a> <span class="kw-2">*</span><span class="self">self</span>.<span class="number">0 </span>&amp;= <span class="number">0xffffffff00000000</span>;
<a href=#372 id=372 data-nosnippet>372</a> <span class="kw-2">*</span><span class="self">self</span>.<span class="number">0 </span>|= u64::from(data)
<a href=#373 id=373 data-nosnippet>373</a> }
<a href=#374 id=374 data-nosnippet>374</a> <span class="attr">#[inline(always)]
<a href=#375 id=375 data-nosnippet>375</a> </span><span class="kw">pub fn </span>set_length_and_code(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: u32) {
<a href=#376 id=376 data-nosnippet>376</a> <span class="kw-2">*</span><span class="self">self</span>.<span class="number">0 </span>= u64::from((<span class="kw-2">*</span><span class="self">self</span>.<span class="number">0</span>) <span class="kw">as </span>u32) | (u64::from(data) &lt;&lt; <span class="number">32</span>);
<a href=#377 id=377 data-nosnippet>377</a> }
<a href=#378 id=378 data-nosnippet>378</a> <span class="attr">#[inline(always)]
<a href=#379 id=379 data-nosnippet>379</a> </span><span class="kw">pub fn </span>init(<span class="kw-2">&amp;mut </span><span class="self">self</span>, dist: usize, len: usize) {
<a href=#380 id=380 data-nosnippet>380</a> <span class="self">self</span>.set_distance(dist <span class="kw">as </span>u32);
<a href=#381 id=381 data-nosnippet>381</a> <span class="self">self</span>.set_length_and_code((len &lt;&lt; <span class="number">5</span>) <span class="kw">as </span>u32);
<a href=#382 id=382 data-nosnippet>382</a> }
<a href=#383 id=383 data-nosnippet>383</a> <span class="attr">#[inline(always)]
<a href=#384 id=384 data-nosnippet>384</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>init_dictionary(<span class="kw-2">&amp;mut </span><span class="self">self</span>, dist: usize, len: usize, len_code: usize) {
<a href=#385 id=385 data-nosnippet>385</a> <span class="self">self</span>.set_distance(dist <span class="kw">as </span>u32);
<a href=#386 id=386 data-nosnippet>386</a> <span class="self">self</span>.set_length_and_code((len &lt;&lt; <span class="number">5 </span>| <span class="kw">if </span>len == len_code { <span class="number">0 </span>} <span class="kw">else </span>{ len_code }) <span class="kw">as </span>u32);
<a href=#387 id=387 data-nosnippet>387</a> }
<a href=#388 id=388 data-nosnippet>388</a>}
<a href=#389 id=389 data-nosnippet>389</a>
<a href=#390 id=390 data-nosnippet>390</a><span class="macro">macro_rules!</span> LeftChildIndexH10 {
<a href=#391 id=391 data-nosnippet>391</a> (<span class="macro-nonterminal">$xself</span>: expr, <span class="macro-nonterminal">$pos</span>: expr) =&gt; {
<a href=#392 id=392 data-nosnippet>392</a> (<span class="number">2usize</span>).wrapping_mul(<span class="macro-nonterminal">$pos </span>&amp; (<span class="kw-2">*</span><span class="macro-nonterminal">$xself</span>).window_mask_)
<a href=#393 id=393 data-nosnippet>393</a> };
<a href=#394 id=394 data-nosnippet>394</a>}
<a href=#395 id=395 data-nosnippet>395</a><span class="macro">macro_rules!</span> RightChildIndexH10 {
<a href=#396 id=396 data-nosnippet>396</a> (<span class="macro-nonterminal">$xself</span>: expr, <span class="macro-nonterminal">$pos</span>: expr) =&gt; {
<a href=#397 id=397 data-nosnippet>397</a> (<span class="number">2usize</span>)
<a href=#398 id=398 data-nosnippet>398</a> .wrapping_mul(<span class="macro-nonterminal">$pos </span>&amp; (<span class="kw-2">*</span><span class="macro-nonterminal">$xself</span>).window_mask_)
<a href=#399 id=399 data-nosnippet>399</a> .wrapping_add(<span class="number">1</span>)
<a href=#400 id=400 data-nosnippet>400</a> };
<a href=#401 id=401 data-nosnippet>401</a>}
<a href=#402 id=402 data-nosnippet>402</a><span class="comment">/*
<a href=#403 id=403 data-nosnippet>403</a>fn LeftChildIndexH10&lt;AllocU32: Allocator&lt;u32&gt;,
<a href=#404 id=404 data-nosnippet>404</a> Buckets: Allocable&lt;u32, AllocU32&gt;+SliceWrapperMut&lt;u32&gt;+SliceWrapper&lt;u32&gt;,
<a href=#405 id=405 data-nosnippet>405</a> Params:H10Params&gt;(
<a href=#406 id=406 data-nosnippet>406</a> mut xself : &amp;mut H10&lt;AllocU32, Buckets, Params&gt;, pos : usize
<a href=#407 id=407 data-nosnippet>407</a>) -&gt; usize {
<a href=#408 id=408 data-nosnippet>408</a> (2usize).wrapping_mul(pos &amp; xself.window_mask_)
<a href=#409 id=409 data-nosnippet>409</a>}
<a href=#410 id=410 data-nosnippet>410</a>
<a href=#411 id=411 data-nosnippet>411</a>fn RightChildIndexH10&lt;AllocU32: Allocator&lt;u32&gt;,
<a href=#412 id=412 data-nosnippet>412</a> Buckets: Allocable&lt;u32, AllocU32&gt;+SliceWrapperMut&lt;u32&gt;+SliceWrapper&lt;u32&gt;,
<a href=#413 id=413 data-nosnippet>413</a> Params:H10Params&gt;(
<a href=#414 id=414 data-nosnippet>414</a> mut xself : &amp;mut H10&lt;AllocU32, Buckets, Params&gt;, pos : usize
<a href=#415 id=415 data-nosnippet>415</a>) -&gt; usize {
<a href=#416 id=416 data-nosnippet>416</a> (2usize).wrapping_mul(
<a href=#417 id=417 data-nosnippet>417</a> pos &amp; xself.window_mask_
<a href=#418 id=418 data-nosnippet>418</a> ).wrapping_add(
<a href=#419 id=419 data-nosnippet>419</a> 1
<a href=#420 id=420 data-nosnippet>420</a> )
<a href=#421 id=421 data-nosnippet>421</a>}
<a href=#422 id=422 data-nosnippet>422</a>*/
<a href=#423 id=423 data-nosnippet>423</a>
<a href=#424 id=424 data-nosnippet>424</a></span><span class="kw">pub fn </span>StoreAndFindMatchesH10&lt;
<a href=#425 id=425 data-nosnippet>425</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#426 id=426 data-nosnippet>426</a> Buckets: Allocable&lt;u32, AllocU32&gt; + SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt;,
<a href=#427 id=427 data-nosnippet>427</a> Params: H10Params,
<a href=#428 id=428 data-nosnippet>428</a>&gt;(
<a href=#429 id=429 data-nosnippet>429</a> xself: <span class="kw-2">&amp;mut </span>H10&lt;AllocU32, Buckets, Params&gt;,
<a href=#430 id=430 data-nosnippet>430</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#431 id=431 data-nosnippet>431</a> cur_ix: usize,
<a href=#432 id=432 data-nosnippet>432</a> ring_buffer_mask: usize,
<a href=#433 id=433 data-nosnippet>433</a> ringbuffer_break: <span class="prelude-ty">Option</span>&lt;core::num::NonZeroUsize&gt;,
<a href=#434 id=434 data-nosnippet>434</a> max_length: usize,
<a href=#435 id=435 data-nosnippet>435</a> max_backward: usize,
<a href=#436 id=436 data-nosnippet>436</a> best_len: <span class="kw-2">&amp;mut </span>usize,
<a href=#437 id=437 data-nosnippet>437</a> matches: <span class="kw-2">&amp;mut </span>[u64],
<a href=#438 id=438 data-nosnippet>438</a>) -&gt; usize
<a href=#439 id=439 data-nosnippet>439</a><span class="kw">where
<a href=#440 id=440 data-nosnippet>440</a> </span>Buckets: PartialEq&lt;Buckets&gt;,
<a href=#441 id=441 data-nosnippet>441</a>{
<a href=#442 id=442 data-nosnippet>442</a> <span class="kw">let </span><span class="kw-2">mut </span>matches_offset = <span class="number">0_usize</span>;
<a href=#443 id=443 data-nosnippet>443</a> <span class="kw">let </span>cur_ix_masked = cur_ix &amp; ring_buffer_mask;
<a href=#444 id=444 data-nosnippet>444</a> <span class="kw">let </span>max_comp_len = min(max_length, <span class="number">128</span>);
<a href=#445 id=445 data-nosnippet>445</a> <span class="kw">let </span>should_reroot_tree = max_length &gt;= <span class="number">128</span>;
<a href=#446 id=446 data-nosnippet>446</a> <span class="kw">let </span>key = xself.HashBytes(<span class="kw-2">&amp;</span>data[cur_ix_masked..]);
<a href=#447 id=447 data-nosnippet>447</a> <span class="kw">let </span>forest = xself.forest.slice_mut();
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw">let </span><span class="kw-2">mut </span>prev_ix = xself.buckets_.slice()[key] <span class="kw">as </span>usize;
<a href=#449 id=449 data-nosnippet>449</a> <span class="kw">let </span><span class="kw-2">mut </span>node_left = <span class="macro">LeftChildIndexH10!</span>(xself, cur_ix);
<a href=#450 id=450 data-nosnippet>450</a> <span class="kw">let </span><span class="kw-2">mut </span>node_right = <span class="macro">RightChildIndexH10!</span>(xself, cur_ix);
<a href=#451 id=451 data-nosnippet>451</a> <span class="kw">let </span><span class="kw-2">mut </span>best_len_left = <span class="number">0_usize</span>;
<a href=#452 id=452 data-nosnippet>452</a> <span class="kw">let </span><span class="kw-2">mut </span>best_len_right = <span class="number">0_usize</span>;
<a href=#453 id=453 data-nosnippet>453</a> <span class="kw">let </span><span class="kw-2">mut </span>depth_remaining = <span class="number">64_usize</span>;
<a href=#454 id=454 data-nosnippet>454</a>
<a href=#455 id=455 data-nosnippet>455</a> <span class="kw">if </span>should_reroot_tree {
<a href=#456 id=456 data-nosnippet>456</a> xself.buckets_.slice_mut()[key] = cur_ix <span class="kw">as </span>u32;
<a href=#457 id=457 data-nosnippet>457</a> }
<a href=#458 id=458 data-nosnippet>458</a>
<a href=#459 id=459 data-nosnippet>459</a> <span class="kw">loop </span>{
<a href=#460 id=460 data-nosnippet>460</a> <span class="kw">let </span>backward = cur_ix.wrapping_sub(prev_ix);
<a href=#461 id=461 data-nosnippet>461</a> <span class="kw">let </span>prev_ix_masked = prev_ix &amp; ring_buffer_mask;
<a href=#462 id=462 data-nosnippet>462</a> <span class="kw">if </span>backward == <span class="number">0 </span>|| backward &gt; max_backward || depth_remaining == <span class="number">0 </span>{
<a href=#463 id=463 data-nosnippet>463</a> <span class="kw">if </span>should_reroot_tree {
<a href=#464 id=464 data-nosnippet>464</a> forest[node_left] = xself.invalid_pos_;
<a href=#465 id=465 data-nosnippet>465</a> forest[node_right] = xself.invalid_pos_;
<a href=#466 id=466 data-nosnippet>466</a> }
<a href=#467 id=467 data-nosnippet>467</a> <span class="kw">break</span>;
<a href=#468 id=468 data-nosnippet>468</a> }
<a href=#469 id=469 data-nosnippet>469</a>
<a href=#470 id=470 data-nosnippet>470</a> <span class="kw">let </span>cur_len = min(best_len_left, best_len_right);
<a href=#471 id=471 data-nosnippet>471</a>
<a href=#472 id=472 data-nosnippet>472</a> <span class="kw">let </span>len = fix_unbroken_len(
<a href=#473 id=473 data-nosnippet>473</a> cur_len.wrapping_add(FindMatchLengthWithLimit(
<a href=#474 id=474 data-nosnippet>474</a> <span class="kw-2">&amp;</span>data[cur_ix_masked.wrapping_add(cur_len)..],
<a href=#475 id=475 data-nosnippet>475</a> <span class="kw-2">&amp;</span>data[prev_ix_masked.wrapping_add(cur_len)..],
<a href=#476 id=476 data-nosnippet>476</a> max_length.wrapping_sub(cur_len),
<a href=#477 id=477 data-nosnippet>477</a> )), prev_ix_masked, cur_ix_masked, ringbuffer_break);
<a href=#478 id=478 data-nosnippet>478</a>
<a href=#479 id=479 data-nosnippet>479</a> <span class="kw">if </span><span class="macro">matches_offset !</span>= matches.len() &amp;&amp; len &gt; <span class="kw-2">*</span>best_len {
<a href=#480 id=480 data-nosnippet>480</a> <span class="kw-2">*</span>best_len = len;
<a href=#481 id=481 data-nosnippet>481</a> BackwardMatchMut(<span class="kw-2">&amp;mut </span>matches[matches_offset]).init(backward, len);
<a href=#482 id=482 data-nosnippet>482</a> matches_offset += <span class="number">1</span>;
<a href=#483 id=483 data-nosnippet>483</a> }
<a href=#484 id=484 data-nosnippet>484</a>
<a href=#485 id=485 data-nosnippet>485</a> <span class="kw">if </span>len &gt;= max_comp_len {
<a href=#486 id=486 data-nosnippet>486</a> <span class="kw">if </span>should_reroot_tree {
<a href=#487 id=487 data-nosnippet>487</a> forest[node_left] = forest[<span class="macro">LeftChildIndexH10!</span>(xself, prev_ix)];
<a href=#488 id=488 data-nosnippet>488</a> forest[node_right] = forest[<span class="macro">RightChildIndexH10!</span>(xself, prev_ix)];
<a href=#489 id=489 data-nosnippet>489</a> }
<a href=#490 id=490 data-nosnippet>490</a> <span class="kw">break</span>;
<a href=#491 id=491 data-nosnippet>491</a> }
<a href=#492 id=492 data-nosnippet>492</a>
<a href=#493 id=493 data-nosnippet>493</a> <span class="kw">if </span>data[cur_ix_masked.wrapping_add(len)] &gt; data[prev_ix_masked.wrapping_add(len)] {
<a href=#494 id=494 data-nosnippet>494</a> best_len_left = len;
<a href=#495 id=495 data-nosnippet>495</a> <span class="kw">if </span>should_reroot_tree {
<a href=#496 id=496 data-nosnippet>496</a> forest[node_left] = prev_ix <span class="kw">as </span>u32;
<a href=#497 id=497 data-nosnippet>497</a> }
<a href=#498 id=498 data-nosnippet>498</a> node_left = <span class="macro">RightChildIndexH10!</span>(xself, prev_ix);
<a href=#499 id=499 data-nosnippet>499</a> prev_ix = forest[node_left] <span class="kw">as </span>usize;
<a href=#500 id=500 data-nosnippet>500</a> } <span class="kw">else </span>{
<a href=#501 id=501 data-nosnippet>501</a> best_len_right = len;
<a href=#502 id=502 data-nosnippet>502</a> <span class="kw">if </span>should_reroot_tree {
<a href=#503 id=503 data-nosnippet>503</a> forest[node_right] = prev_ix <span class="kw">as </span>u32;
<a href=#504 id=504 data-nosnippet>504</a> }
<a href=#505 id=505 data-nosnippet>505</a> node_right = <span class="macro">LeftChildIndexH10!</span>(xself, prev_ix);
<a href=#506 id=506 data-nosnippet>506</a> prev_ix = forest[node_right] <span class="kw">as </span>usize;
<a href=#507 id=507 data-nosnippet>507</a> }
<a href=#508 id=508 data-nosnippet>508</a>
<a href=#509 id=509 data-nosnippet>509</a> depth_remaining = depth_remaining.wrapping_sub(<span class="number">1</span>);
<a href=#510 id=510 data-nosnippet>510</a> }
<a href=#511 id=511 data-nosnippet>511</a>
<a href=#512 id=512 data-nosnippet>512</a> matches_offset
<a href=#513 id=513 data-nosnippet>513</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,212 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/bit_cost.rs`."><title>bit_cost.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>bit_cost.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::SliceWrapperMut;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::{max, min};
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::SliceWrapper;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::histogram::CostAccessors;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::util::{FastLog2, FastLog2u16};
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::vectorization::Mem256i;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">crate</span>::enc::floatX;
<a href=#9 id=9 data-nosnippet>9</a>
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">const </span>BROTLI_REPEAT_ZERO_CODE_LENGTH: usize = <span class="number">17</span>;
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">const </span>BROTLI_CODE_LENGTH_CODES: usize = BROTLI_REPEAT_ZERO_CODE_LENGTH + <span class="number">1</span>;
<a href=#12 id=12 data-nosnippet>12</a>
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>shannon_entropy(<span class="kw-2">mut </span>population: <span class="kw-2">&amp;</span>[u32], size: usize) -&gt; (floatX, usize) {
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw">let </span><span class="kw-2">mut </span>sum: usize = <span class="number">0</span>;
<a href=#15 id=15 data-nosnippet>15</a> <span class="kw">let </span><span class="kw-2">mut </span>retval: floatX = <span class="number">0.0</span>;
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a> <span class="kw">if </span>(size &amp; <span class="number">1</span>) != <span class="number">0 </span>&amp;&amp; !population.is_empty() {
<a href=#18 id=18 data-nosnippet>18</a> <span class="kw">let </span>p = population[<span class="number">0</span>] <span class="kw">as </span>usize;
<a href=#19 id=19 data-nosnippet>19</a> population = population.split_at(<span class="number">1</span>).<span class="number">1</span>;
<a href=#20 id=20 data-nosnippet>20</a> sum = sum.wrapping_add(p);
<a href=#21 id=21 data-nosnippet>21</a> retval -= p <span class="kw">as </span>floatX * FastLog2u16(p <span class="kw">as </span>u16);
<a href=#22 id=22 data-nosnippet>22</a> }
<a href=#23 id=23 data-nosnippet>23</a> <span class="kw">for </span>pop_iter <span class="kw">in </span>population.split_at((size &gt;&gt; <span class="number">1</span>) &lt;&lt; <span class="number">1</span>).<span class="number">0 </span>{
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">let </span>p = <span class="kw-2">*</span>pop_iter <span class="kw">as </span>usize;
<a href=#25 id=25 data-nosnippet>25</a> sum = sum.wrapping_add(p);
<a href=#26 id=26 data-nosnippet>26</a> retval -= p <span class="kw">as </span>floatX * FastLog2u16(p <span class="kw">as </span>u16);
<a href=#27 id=27 data-nosnippet>27</a> }
<a href=#28 id=28 data-nosnippet>28</a> <span class="kw">if </span><span class="macro">sum !</span>= <span class="number">0 </span>{
<a href=#29 id=29 data-nosnippet>29</a> retval += sum <span class="kw">as </span>floatX * FastLog2(sum <span class="kw">as </span>u64); <span class="comment">// not sure it's 16 bit
<a href=#30 id=30 data-nosnippet>30</a> </span>}
<a href=#31 id=31 data-nosnippet>31</a>
<a href=#32 id=32 data-nosnippet>32</a> (retval, sum)
<a href=#33 id=33 data-nosnippet>33</a>}
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a><span class="attr">#[inline(always)]
<a href=#36 id=36 data-nosnippet>36</a></span><span class="kw">pub fn </span>BitsEntropy(population: <span class="kw-2">&amp;</span>[u32], size: usize) -&gt; floatX {
<a href=#37 id=37 data-nosnippet>37</a> <span class="kw">let </span>(<span class="kw-2">mut </span>retval, sum) = shannon_entropy(population, size);
<a href=#38 id=38 data-nosnippet>38</a> <span class="kw">if </span>retval &lt; sum <span class="kw">as </span>floatX {
<a href=#39 id=39 data-nosnippet>39</a> retval = sum <span class="kw">as </span>floatX;
<a href=#40 id=40 data-nosnippet>40</a> }
<a href=#41 id=41 data-nosnippet>41</a> retval
<a href=#42 id=42 data-nosnippet>42</a>}
<a href=#43 id=43 data-nosnippet>43</a>
<a href=#44 id=44 data-nosnippet>44</a><span class="attr">#[allow(clippy::excessive_precision)]
<a href=#45 id=45 data-nosnippet>45</a></span><span class="kw">fn </span>CostComputation&lt;T: SliceWrapper&lt;Mem256i&gt;&gt;(
<a href=#46 id=46 data-nosnippet>46</a> depth_histo: <span class="kw-2">&amp;mut </span>[u32; BROTLI_CODE_LENGTH_CODES],
<a href=#47 id=47 data-nosnippet>47</a> nnz_data: <span class="kw-2">&amp;</span>T,
<a href=#48 id=48 data-nosnippet>48</a> nnz: usize,
<a href=#49 id=49 data-nosnippet>49</a> _total_count: floatX,
<a href=#50 id=50 data-nosnippet>50</a> log2total: floatX,
<a href=#51 id=51 data-nosnippet>51</a>) -&gt; floatX {
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">let </span><span class="kw-2">mut </span>bits: floatX = <span class="number">0.0</span>;
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">let </span><span class="kw-2">mut </span>max_depth: usize = <span class="number">1</span>;
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..nnz {
<a href=#55 id=55 data-nosnippet>55</a> <span class="comment">// Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) =
<a href=#56 id=56 data-nosnippet>56</a> // = log2(total_count) - log2(count(symbol))
<a href=#57 id=57 data-nosnippet>57</a> </span><span class="kw">let </span>element = nnz_data.slice()[i &gt;&gt; <span class="number">3</span>][i &amp; <span class="number">7</span>];
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">let </span>log2p = log2total - FastLog2u16(element <span class="kw">as </span>u16);
<a href=#59 id=59 data-nosnippet>59</a> <span class="comment">// Approximate the bit depth by round(-log2(P(symbol)))
<a href=#60 id=60 data-nosnippet>60</a> </span><span class="kw">let </span>depth = min((log2p + <span class="number">0.5</span>) <span class="kw">as </span>u8, <span class="number">15u8</span>);
<a href=#61 id=61 data-nosnippet>61</a> bits += (element <span class="kw">as </span>floatX) * log2p;
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">if </span>(depth <span class="kw">as </span>usize) &gt; max_depth {
<a href=#63 id=63 data-nosnippet>63</a> max_depth = depth <span class="kw">as </span>usize;
<a href=#64 id=64 data-nosnippet>64</a> }
<a href=#65 id=65 data-nosnippet>65</a> depth_histo[depth <span class="kw">as </span>usize] += <span class="number">1</span>;
<a href=#66 id=66 data-nosnippet>66</a> }
<a href=#67 id=67 data-nosnippet>67</a>
<a href=#68 id=68 data-nosnippet>68</a> <span class="comment">// Add the estimated encoding cost of the code length code histogram.
<a href=#69 id=69 data-nosnippet>69</a> </span>bits += (<span class="number">18 </span>+ <span class="number">2 </span>* max_depth) <span class="kw">as </span>floatX;
<a href=#70 id=70 data-nosnippet>70</a> <span class="comment">// Add the entropy of the code length code histogram.
<a href=#71 id=71 data-nosnippet>71</a> </span>bits += BitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES);
<a href=#72 id=72 data-nosnippet>72</a> <span class="comment">//println_stderr!("{:?} {:?}", &amp;depth_histo[..], bits);
<a href=#73 id=73 data-nosnippet>73</a> </span>bits
<a href=#74 id=74 data-nosnippet>74</a>}
<a href=#75 id=75 data-nosnippet>75</a>
<a href=#76 id=76 data-nosnippet>76</a><span class="kw">pub fn </span>BrotliPopulationCost&lt;HistogramType: SliceWrapper&lt;u32&gt; + CostAccessors&gt;(
<a href=#77 id=77 data-nosnippet>77</a> histogram: <span class="kw-2">&amp;</span>HistogramType,
<a href=#78 id=78 data-nosnippet>78</a> nnz_data: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#79 id=79 data-nosnippet>79</a>) -&gt; floatX {
<a href=#80 id=80 data-nosnippet>80</a> <span class="kw">static </span>kOneSymbolHistogramCost: floatX = <span class="number">12.0</span>;
<a href=#81 id=81 data-nosnippet>81</a> <span class="kw">static </span>kTwoSymbolHistogramCost: floatX = <span class="number">20.0</span>;
<a href=#82 id=82 data-nosnippet>82</a> <span class="kw">static </span>kThreeSymbolHistogramCost: floatX = <span class="number">28.0</span>;
<a href=#83 id=83 data-nosnippet>83</a> <span class="kw">static </span>kFourSymbolHistogramCost: floatX = <span class="number">37.0</span>;
<a href=#84 id=84 data-nosnippet>84</a>
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">let </span>data_size: usize = histogram.slice().len();
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">let </span><span class="kw-2">mut </span>count = <span class="number">0</span>;
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">let </span><span class="kw-2">mut </span>s: [usize; <span class="number">5</span>] = [<span class="number">0</span>; <span class="number">5</span>];
<a href=#88 id=88 data-nosnippet>88</a> <span class="kw">let </span><span class="kw-2">mut </span>bits: floatX = <span class="number">0.0</span>;
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a> <span class="kw">if </span>histogram.total_count() == <span class="number">0 </span>{
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw">return </span>kOneSymbolHistogramCost;
<a href=#92 id=92 data-nosnippet>92</a> }
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..data_size {
<a href=#94 id=94 data-nosnippet>94</a> <span class="kw">if </span>histogram.slice()[i] &gt; <span class="number">0 </span>{
<a href=#95 id=95 data-nosnippet>95</a> s[count] = i;
<a href=#96 id=96 data-nosnippet>96</a> count += <span class="number">1</span>;
<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">if </span>count &gt; <span class="number">4 </span>{
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">break</span>;
<a href=#99 id=99 data-nosnippet>99</a> }
<a href=#100 id=100 data-nosnippet>100</a> }
<a href=#101 id=101 data-nosnippet>101</a> }
<a href=#102 id=102 data-nosnippet>102</a> <span class="kw">match </span>count {
<a href=#103 id=103 data-nosnippet>103</a> <span class="number">1 </span>=&gt; <span class="kw">return </span>kOneSymbolHistogramCost,
<a href=#104 id=104 data-nosnippet>104</a> <span class="number">2 </span>=&gt; <span class="kw">return </span>kTwoSymbolHistogramCost + histogram.total_count() <span class="kw">as </span>floatX,
<a href=#105 id=105 data-nosnippet>105</a> <span class="number">3 </span>=&gt; {
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">let </span>histo0: u32 = histogram.slice()[s[<span class="number">0</span>]];
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span>histo1: u32 = histogram.slice()[s[<span class="number">1</span>]];
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">let </span>histo2: u32 = histogram.slice()[s[<span class="number">2</span>]];
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">let </span>histomax: u32 = max(histo0, max(histo1, histo2));
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">return </span>kThreeSymbolHistogramCost
<a href=#111 id=111 data-nosnippet>111</a> + (<span class="number">2u32</span>).wrapping_mul(histo0.wrapping_add(histo1).wrapping_add(histo2)) <span class="kw">as </span>floatX
<a href=#112 id=112 data-nosnippet>112</a> - histomax <span class="kw">as </span>floatX;
<a href=#113 id=113 data-nosnippet>113</a> }
<a href=#114 id=114 data-nosnippet>114</a> <span class="number">4 </span>=&gt; {
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw">let </span><span class="kw-2">mut </span>histo: [u32; <span class="number">4</span>] = [<span class="number">0</span>; <span class="number">4</span>];
<a href=#116 id=116 data-nosnippet>116</a>
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">4 </span>{
<a href=#118 id=118 data-nosnippet>118</a> histo[i] = histogram.slice()[s[i]];
<a href=#119 id=119 data-nosnippet>119</a> }
<a href=#120 id=120 data-nosnippet>120</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">4 </span>{
<a href=#121 id=121 data-nosnippet>121</a> <span class="kw">for </span>j <span class="kw">in </span>i + <span class="number">1</span>..<span class="number">4 </span>{
<a href=#122 id=122 data-nosnippet>122</a> <span class="kw">if </span>histo[j] &gt; histo[i] {
<a href=#123 id=123 data-nosnippet>123</a> histo.swap(j, i);
<a href=#124 id=124 data-nosnippet>124</a> }
<a href=#125 id=125 data-nosnippet>125</a> }
<a href=#126 id=126 data-nosnippet>126</a> }
<a href=#127 id=127 data-nosnippet>127</a> <span class="kw">let </span>h23: u32 = histo[<span class="number">2</span>].wrapping_add(histo[<span class="number">3</span>]);
<a href=#128 id=128 data-nosnippet>128</a> <span class="kw">let </span>histomax: u32 = max(h23, histo[<span class="number">0</span>]);
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw">return </span>kFourSymbolHistogramCost
<a href=#130 id=130 data-nosnippet>130</a> + (<span class="number">3u32</span>).wrapping_mul(h23) <span class="kw">as </span>floatX
<a href=#131 id=131 data-nosnippet>131</a> + (<span class="number">2u32</span>).wrapping_mul(histo[<span class="number">0</span>].wrapping_add(histo[<span class="number">1</span>])) <span class="kw">as </span>floatX
<a href=#132 id=132 data-nosnippet>132</a> - histomax <span class="kw">as </span>floatX;
<a href=#133 id=133 data-nosnippet>133</a> }
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">_ </span>=&gt; {}
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a>
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">if </span><span class="macro">cfg!</span>(feature = <span class="string">"vector_scratch_space"</span>) {
<a href=#138 id=138 data-nosnippet>138</a> <span class="comment">// vectorization failed: it's faster to do things inline than split into two loops
<a href=#139 id=139 data-nosnippet>139</a> </span><span class="kw">let </span><span class="kw-2">mut </span>nnz: usize = <span class="number">0</span>;
<a href=#140 id=140 data-nosnippet>140</a> <span class="kw">let </span><span class="kw-2">mut </span>depth_histo = [<span class="number">0u32</span>; <span class="number">18</span>];
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">let </span>total_count = histogram.total_count() <span class="kw">as </span>floatX;
<a href=#142 id=142 data-nosnippet>142</a> <span class="kw">let </span>log2total = FastLog2(histogram.total_count() <span class="kw">as </span>u64);
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize = <span class="number">0</span>;
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw">while </span>i &lt; data_size {
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">if </span>histogram.slice()[i] &gt; <span class="number">0 </span>{
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">let </span>nnz_val = <span class="kw-2">&amp;mut </span>nnz_data.slice_mut()[nnz &gt;&gt; <span class="number">3</span>];
<a href=#147 id=147 data-nosnippet>147</a> nnz_val[nnz &amp; <span class="number">7</span>] = histogram.slice()[i] <span class="kw">as </span>i32;
<a href=#148 id=148 data-nosnippet>148</a> i += <span class="number">1</span>;
<a href=#149 id=149 data-nosnippet>149</a> nnz += <span class="number">1</span>;
<a href=#150 id=150 data-nosnippet>150</a> } <span class="kw">else </span>{
<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">let </span><span class="kw-2">mut </span>reps: u32 = <span class="number">1</span>;
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">for </span>hd <span class="kw">in </span>histogram.slice()[i + <span class="number">1</span>..data_size].iter() {
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">hd !</span>= <span class="number">0 </span>{
<a href=#154 id=154 data-nosnippet>154</a> <span class="kw">break</span>;
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a> reps += <span class="number">1
<a href=#157 id=157 data-nosnippet>157</a> </span>}
<a href=#158 id=158 data-nosnippet>158</a> i += reps <span class="kw">as </span>usize;
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">if </span>i == data_size {
<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">break</span>;
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">if </span>reps &lt; <span class="number">3 </span>{
<a href=#163 id=163 data-nosnippet>163</a> depth_histo[<span class="number">0</span>] += reps;
<a href=#164 id=164 data-nosnippet>164</a> } <span class="kw">else </span>{
<a href=#165 id=165 data-nosnippet>165</a> reps -= <span class="number">2</span>;
<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">let </span><span class="kw-2">mut </span>depth_histo_adds: u32 = <span class="number">0</span>;
<a href=#167 id=167 data-nosnippet>167</a> <span class="kw">while </span>reps &gt; <span class="number">0 </span>{
<a href=#168 id=168 data-nosnippet>168</a> depth_histo_adds += <span class="number">1</span>;
<a href=#169 id=169 data-nosnippet>169</a> bits += <span class="number">3.0</span>;
<a href=#170 id=170 data-nosnippet>170</a> reps &gt;&gt;= <span class="number">3</span>;
<a href=#171 id=171 data-nosnippet>171</a> }
<a href=#172 id=172 data-nosnippet>172</a> depth_histo[BROTLI_REPEAT_ZERO_CODE_LENGTH] += depth_histo_adds;
<a href=#173 id=173 data-nosnippet>173</a> }
<a href=#174 id=174 data-nosnippet>174</a> }
<a href=#175 id=175 data-nosnippet>175</a> }
<a href=#176 id=176 data-nosnippet>176</a> bits += CostComputation(<span class="kw-2">&amp;mut </span>depth_histo, nnz_data, nnz, total_count, log2total);
<a href=#177 id=177 data-nosnippet>177</a> } <span class="kw">else </span>{
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">let </span><span class="kw-2">mut </span>max_depth: usize = <span class="number">1</span>;
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">let </span><span class="kw-2">mut </span>depth_histo = [<span class="number">0u32</span>; <span class="number">18</span>];
<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">let </span>log2total: floatX = FastLog2(histogram.total_count() <span class="kw">as </span>u64); <span class="comment">// 64 bit here
<a href=#181 id=181 data-nosnippet>181</a> </span><span class="kw">let </span><span class="kw-2">mut </span>reps: u32 = <span class="number">0</span>;
<a href=#182 id=182 data-nosnippet>182</a> <span class="kw">for </span>histo <span class="kw">in </span>histogram.slice()[..data_size].iter() {
<a href=#183 id=183 data-nosnippet>183</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">histo !</span>= <span class="number">0 </span>{
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">if </span><span class="macro">reps !</span>= <span class="number">0 </span>{
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">if </span>reps &lt; <span class="number">3 </span>{
<a href=#186 id=186 data-nosnippet>186</a> depth_histo[<span class="number">0</span>] += reps;
<a href=#187 id=187 data-nosnippet>187</a> } <span class="kw">else </span>{
<a href=#188 id=188 data-nosnippet>188</a> reps -= <span class="number">2</span>;
<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">while </span>reps &gt; <span class="number">0 </span>{
<a href=#190 id=190 data-nosnippet>190</a> depth_histo[<span class="number">17</span>] += <span class="number">1</span>;
<a href=#191 id=191 data-nosnippet>191</a> bits += <span class="number">3.0</span>;
<a href=#192 id=192 data-nosnippet>192</a> reps &gt;&gt;= <span class="number">3</span>;
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a> }
<a href=#195 id=195 data-nosnippet>195</a> reps = <span class="number">0</span>;
<a href=#196 id=196 data-nosnippet>196</a> }
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">let </span>log2p = log2total - FastLog2u16(<span class="kw-2">*</span>histo <span class="kw">as </span>u16);
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw">let </span><span class="kw-2">mut </span>depth = (log2p + <span class="number">0.5</span>) <span class="kw">as </span>usize;
<a href=#199 id=199 data-nosnippet>199</a> bits += <span class="kw-2">*</span>histo <span class="kw">as </span>floatX * log2p;
<a href=#200 id=200 data-nosnippet>200</a> depth = min(depth, <span class="number">15</span>);
<a href=#201 id=201 data-nosnippet>201</a> max_depth = max(depth, max_depth);
<a href=#202 id=202 data-nosnippet>202</a> depth_histo[depth] += <span class="number">1</span>;
<a href=#203 id=203 data-nosnippet>203</a> } <span class="kw">else </span>{
<a href=#204 id=204 data-nosnippet>204</a> reps += <span class="number">1</span>;
<a href=#205 id=205 data-nosnippet>205</a> }
<a href=#206 id=206 data-nosnippet>206</a> }
<a href=#207 id=207 data-nosnippet>207</a> bits += (<span class="number">18usize</span>).wrapping_add((<span class="number">2usize</span>).wrapping_mul(max_depth)) <span class="kw">as </span>floatX;
<a href=#208 id=208 data-nosnippet>208</a> bits += BitsEntropy(<span class="kw-2">&amp;</span>depth_histo[..], <span class="number">18</span>);
<a href=#209 id=209 data-nosnippet>209</a> }
<a href=#210 id=210 data-nosnippet>210</a> bits
<a href=#211 id=211 data-nosnippet>211</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,40 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/block_split.rs`."><title>block_split.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>block_split.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{Allocator, SliceWrapper};
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::alloc_default;
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">pub struct </span>BlockSplit&lt;Alloc: alloc::Allocator&lt;u8&gt; + alloc::Allocator&lt;u32&gt;&gt; {
<a href=#6 id=6 data-nosnippet>6</a> <span class="kw">pub </span>num_types: usize,
<a href=#7 id=7 data-nosnippet>7</a> <span class="kw">pub </span>num_blocks: usize,
<a href=#8 id=8 data-nosnippet>8</a> <span class="kw">pub </span>types: &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory,
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">pub </span>lengths: &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory,
<a href=#10 id=10 data-nosnippet>10</a>}
<a href=#11 id=11 data-nosnippet>11</a>
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">impl</span>&lt;Alloc: alloc::Allocator&lt;u8&gt; + alloc::Allocator&lt;u32&gt;&gt; Default <span class="kw">for </span>BlockSplit&lt;Alloc&gt; {
<a href=#13 id=13 data-nosnippet>13</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#14 id=14 data-nosnippet>14</a> <span class="self">Self </span>{
<a href=#15 id=15 data-nosnippet>15</a> num_types: <span class="number">0</span>,
<a href=#16 id=16 data-nosnippet>16</a> num_blocks: <span class="number">0</span>,
<a href=#17 id=17 data-nosnippet>17</a> types: alloc_default::&lt;u8, Alloc&gt;(),
<a href=#18 id=18 data-nosnippet>18</a> lengths: alloc_default::&lt;u32, Alloc&gt;(),
<a href=#19 id=19 data-nosnippet>19</a> }
<a href=#20 id=20 data-nosnippet>20</a> }
<a href=#21 id=21 data-nosnippet>21</a>}
<a href=#22 id=22 data-nosnippet>22</a>
<a href=#23 id=23 data-nosnippet>23</a><span class="kw">impl</span>&lt;Alloc: alloc::Allocator&lt;u8&gt; + alloc::Allocator&lt;u32&gt;&gt; BlockSplit&lt;Alloc&gt; {
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">pub fn </span>new() -&gt; BlockSplit&lt;Alloc&gt; {
<a href=#25 id=25 data-nosnippet>25</a> <span class="self">Self</span>::default()
<a href=#26 id=26 data-nosnippet>26</a> }
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">pub fn </span>destroy(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m: <span class="kw-2">&amp;mut </span>Alloc) {
<a href=#28 id=28 data-nosnippet>28</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(m, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.types));
<a href=#29 id=29 data-nosnippet>29</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(m, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.lengths));
<a href=#30 id=30 data-nosnippet>30</a> <span class="self">self</span>.num_blocks = <span class="number">0</span>;
<a href=#31 id=31 data-nosnippet>31</a> <span class="self">self</span>.num_types = <span class="number">0</span>;
<a href=#32 id=32 data-nosnippet>32</a> }
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">pub fn </span>types_alloc_size(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#34 id=34 data-nosnippet>34</a> <span class="self">self</span>.types.slice().len()
<a href=#35 id=35 data-nosnippet>35</a> }
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">pub fn </span>lengths_alloc_size(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#37 id=37 data-nosnippet>37</a> <span class="self">self</span>.lengths.slice().len()
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,930 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/block_splitter.rs`."><title>block_splitter.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>block_splitter.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::{max, min};
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[cfg(feature = <span class="string">"simd"</span>)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">use </span>core::simd::prelude::{SimdFloat, SimdPartialOrd};
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::backward_references::BrotliEncoderParams;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::bit_cost::BrotliPopulationCost;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">super</span>::block_split::BlockSplit;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">super</span>::cluster::{BrotliHistogramBitCostDistance, BrotliHistogramCombine, HistogramPair};
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">super</span>::command::Command;
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use </span><span class="kw">super</span>::histogram::{
<a href=#13 id=13 data-nosnippet>13</a> ClearHistograms, CostAccessors, HistogramAddHistogram, HistogramAddItem, HistogramAddVector,
<a href=#14 id=14 data-nosnippet>14</a> HistogramClear, HistogramCommand, HistogramDistance, HistogramLiteral,
<a href=#15 id=15 data-nosnippet>15</a>};
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">use </span><span class="kw">super</span>::util::FastLog2;
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">use </span><span class="kw">super</span>::vectorization::{sum8i, v256, v256i, Mem256f};
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::allocate;
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">use </span><span class="kw">crate</span>::enc::floatX;
<a href=#20 id=20 data-nosnippet>20</a>
<a href=#21 id=21 data-nosnippet>21</a><span class="kw">static </span>kMaxLiteralHistograms: usize = <span class="number">100usize</span>;
<a href=#22 id=22 data-nosnippet>22</a>
<a href=#23 id=23 data-nosnippet>23</a><span class="kw">static </span>kMaxCommandHistograms: usize = <span class="number">50usize</span>;
<a href=#24 id=24 data-nosnippet>24</a>
<a href=#25 id=25 data-nosnippet>25</a><span class="kw">static </span>kLiteralBlockSwitchCost: floatX = <span class="number">28.1</span>;
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="kw">static </span>kCommandBlockSwitchCost: floatX = <span class="number">13.5</span>;
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a><span class="kw">static </span>kDistanceBlockSwitchCost: floatX = <span class="number">14.6</span>;
<a href=#30 id=30 data-nosnippet>30</a>
<a href=#31 id=31 data-nosnippet>31</a><span class="kw">static </span>kLiteralStrideLength: usize = <span class="number">70usize</span>;
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a><span class="kw">static </span>kCommandStrideLength: usize = <span class="number">40usize</span>;
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a><span class="kw">static </span>kSymbolsPerLiteralHistogram: usize = <span class="number">544usize</span>;
<a href=#36 id=36 data-nosnippet>36</a>
<a href=#37 id=37 data-nosnippet>37</a><span class="kw">static </span>kSymbolsPerCommandHistogram: usize = <span class="number">530usize</span>;
<a href=#38 id=38 data-nosnippet>38</a>
<a href=#39 id=39 data-nosnippet>39</a><span class="kw">static </span>kSymbolsPerDistanceHistogram: usize = <span class="number">544usize</span>;
<a href=#40 id=40 data-nosnippet>40</a>
<a href=#41 id=41 data-nosnippet>41</a><span class="kw">static </span>kMinLengthForBlockSplitting: usize = <span class="number">128usize</span>;
<a href=#42 id=42 data-nosnippet>42</a>
<a href=#43 id=43 data-nosnippet>43</a><span class="kw">static </span>kIterMulForRefining: usize = <span class="number">2usize</span>;
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a><span class="kw">static </span>kMinItersForRefining: usize = <span class="number">100usize</span>;
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a><span class="attr">#[inline(always)]
<a href=#48 id=48 data-nosnippet>48</a></span><span class="kw">fn </span>update_cost_and_signal(
<a href=#49 id=49 data-nosnippet>49</a> num_histograms32: u32,
<a href=#50 id=50 data-nosnippet>50</a> ix: usize,
<a href=#51 id=51 data-nosnippet>51</a> min_cost: floatX,
<a href=#52 id=52 data-nosnippet>52</a> block_switch_cost: floatX,
<a href=#53 id=53 data-nosnippet>53</a> cost: <span class="kw-2">&amp;mut </span>[Mem256f],
<a href=#54 id=54 data-nosnippet>54</a> switch_signal: <span class="kw-2">&amp;mut </span>[u8],
<a href=#55 id=55 data-nosnippet>55</a>) {
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">let </span>ymm_min_cost = v256::splat(min_cost);
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw">let </span>ymm_block_switch_cost = v256::splat(block_switch_cost);
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">let </span>ymm_and_mask = v256i::from([
<a href=#59 id=59 data-nosnippet>59</a> <span class="number">1 </span>&lt;&lt; <span class="number">0</span>,
<a href=#60 id=60 data-nosnippet>60</a> <span class="number">1 </span>&lt;&lt; <span class="number">1</span>,
<a href=#61 id=61 data-nosnippet>61</a> <span class="number">1 </span>&lt;&lt; <span class="number">2</span>,
<a href=#62 id=62 data-nosnippet>62</a> <span class="number">1 </span>&lt;&lt; <span class="number">3</span>,
<a href=#63 id=63 data-nosnippet>63</a> <span class="number">1 </span>&lt;&lt; <span class="number">4</span>,
<a href=#64 id=64 data-nosnippet>64</a> <span class="number">1 </span>&lt;&lt; <span class="number">5</span>,
<a href=#65 id=65 data-nosnippet>65</a> <span class="number">1 </span>&lt;&lt; <span class="number">6</span>,
<a href=#66 id=66 data-nosnippet>66</a> <span class="number">1 </span>&lt;&lt; <span class="number">7</span>,
<a href=#67 id=67 data-nosnippet>67</a> ]);
<a href=#68 id=68 data-nosnippet>68</a>
<a href=#69 id=69 data-nosnippet>69</a> <span class="kw">for </span>(index, cost_it) <span class="kw">in </span>cost[..((num_histograms32 <span class="kw">as </span>usize + <span class="number">7</span>) &gt;&gt; <span class="number">3</span>)]
<a href=#70 id=70 data-nosnippet>70</a> .iter_mut()
<a href=#71 id=71 data-nosnippet>71</a> .enumerate()
<a href=#72 id=72 data-nosnippet>72</a> {
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">let </span><span class="kw-2">mut </span>ymm_cost = <span class="kw-2">*</span>cost_it;
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">let </span>costk_minus_min_cost = ymm_cost - ymm_min_cost;
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">let </span>ymm_cmpge: v256i = costk_minus_min_cost.simd_ge(ymm_block_switch_cost).to_int();
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw">let </span>ymm_bits = ymm_cmpge &amp; ymm_and_mask;
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">let </span>result = sum8i(ymm_bits);
<a href=#78 id=78 data-nosnippet>78</a> <span class="comment">//super::vectorization::sum8(ymm_bits) as u8;
<a href=#79 id=79 data-nosnippet>79</a> </span>switch_signal[ix + index] |= result <span class="kw">as </span>u8;
<a href=#80 id=80 data-nosnippet>80</a> ymm_cost = costk_minus_min_cost.simd_min(ymm_block_switch_cost);
<a href=#81 id=81 data-nosnippet>81</a> <span class="kw-2">*</span>cost_it = Mem256f::from(ymm_cost);
<a href=#82 id=82 data-nosnippet>82</a> <span class="comment">//println_stderr!("{:} ss {:} c {:?}", (index &lt;&lt; 3) + 7, switch_signal[ix + index],*cost_it);
<a href=#83 id=83 data-nosnippet>83</a> </span>}
<a href=#84 id=84 data-nosnippet>84</a>}
<a href=#85 id=85 data-nosnippet>85</a><span class="kw">fn </span>CountLiterals(cmds: <span class="kw-2">&amp;</span>[Command], num_commands: usize) -&gt; usize {
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">let </span><span class="kw-2">mut </span>total_length: usize = <span class="number">0usize</span>;
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_commands {
<a href=#88 id=88 data-nosnippet>88</a> total_length = total_length.wrapping_add((cmds[i]).insert_len_ <span class="kw">as </span>usize);
<a href=#89 id=89 data-nosnippet>89</a> }
<a href=#90 id=90 data-nosnippet>90</a> total_length
<a href=#91 id=91 data-nosnippet>91</a>}
<a href=#92 id=92 data-nosnippet>92</a>
<a href=#93 id=93 data-nosnippet>93</a><span class="kw">fn </span>CopyLiteralsToByteArray(
<a href=#94 id=94 data-nosnippet>94</a> cmds: <span class="kw-2">&amp;</span>[Command],
<a href=#95 id=95 data-nosnippet>95</a> num_commands: usize,
<a href=#96 id=96 data-nosnippet>96</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#97 id=97 data-nosnippet>97</a> offset: usize,
<a href=#98 id=98 data-nosnippet>98</a> mask: usize,
<a href=#99 id=99 data-nosnippet>99</a> literals: <span class="kw-2">&amp;mut </span>[u8],
<a href=#100 id=100 data-nosnippet>100</a>) {
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">let </span><span class="kw-2">mut </span>pos: usize = <span class="number">0usize</span>;
<a href=#102 id=102 data-nosnippet>102</a> <span class="kw">let </span><span class="kw-2">mut </span>from_pos: usize = offset &amp; mask;
<a href=#103 id=103 data-nosnippet>103</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_commands {
<a href=#104 id=104 data-nosnippet>104</a> <span class="kw">let </span><span class="kw-2">mut </span>insert_len: usize = (cmds[i]).insert_len_ <span class="kw">as </span>usize;
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">if </span>from_pos.wrapping_add(insert_len) &gt; mask {
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">let </span>head_size: usize = mask.wrapping_add(<span class="number">1</span>).wrapping_sub(from_pos);
<a href=#107 id=107 data-nosnippet>107</a> literals[pos..(pos + head_size)]
<a href=#108 id=108 data-nosnippet>108</a> .clone_from_slice(<span class="kw-2">&amp;</span>data[from_pos..(from_pos + head_size)]);
<a href=#109 id=109 data-nosnippet>109</a> from_pos = <span class="number">0usize</span>;
<a href=#110 id=110 data-nosnippet>110</a> pos = pos.wrapping_add(head_size);
<a href=#111 id=111 data-nosnippet>111</a> insert_len = insert_len.wrapping_sub(head_size);
<a href=#112 id=112 data-nosnippet>112</a> }
<a href=#113 id=113 data-nosnippet>113</a> <span class="kw">if </span>insert_len &gt; <span class="number">0usize </span>{
<a href=#114 id=114 data-nosnippet>114</a> literals[pos..(pos + insert_len)]
<a href=#115 id=115 data-nosnippet>115</a> .clone_from_slice(<span class="kw-2">&amp;</span>data[from_pos..(from_pos + insert_len)]);
<a href=#116 id=116 data-nosnippet>116</a> pos = pos.wrapping_add(insert_len);
<a href=#117 id=117 data-nosnippet>117</a> }
<a href=#118 id=118 data-nosnippet>118</a> from_pos = from_pos
<a href=#119 id=119 data-nosnippet>119</a> .wrapping_add(insert_len)
<a href=#120 id=120 data-nosnippet>120</a> .wrapping_add(cmds[i].copy_len() <span class="kw">as </span>usize)
<a href=#121 id=121 data-nosnippet>121</a> &amp; mask;
<a href=#122 id=122 data-nosnippet>122</a> }
<a href=#123 id=123 data-nosnippet>123</a>}
<a href=#124 id=124 data-nosnippet>124</a>
<a href=#125 id=125 data-nosnippet>125</a><span class="kw">fn </span>MyRand(seed: <span class="kw-2">&amp;mut </span>u32) -&gt; u32 {
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw-2">*</span>seed = seed.wrapping_mul(<span class="number">16807</span>);
<a href=#127 id=127 data-nosnippet>127</a> <span class="kw">if </span><span class="kw-2">*</span>seed == <span class="number">0u32 </span>{
<a href=#128 id=128 data-nosnippet>128</a> <span class="kw-2">*</span>seed = <span class="number">1u32</span>;
<a href=#129 id=129 data-nosnippet>129</a> }
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw-2">*</span>seed
<a href=#131 id=131 data-nosnippet>131</a>}
<a href=#132 id=132 data-nosnippet>132</a>
<a href=#133 id=133 data-nosnippet>133</a><span class="kw">fn </span>InitialEntropyCodes&lt;
<a href=#134 id=134 data-nosnippet>134</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors,
<a href=#135 id=135 data-nosnippet>135</a> IntegerType: Sized + Clone,
<a href=#136 id=136 data-nosnippet>136</a>&gt;(
<a href=#137 id=137 data-nosnippet>137</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#138 id=138 data-nosnippet>138</a> length: usize,
<a href=#139 id=139 data-nosnippet>139</a> stride: usize,
<a href=#140 id=140 data-nosnippet>140</a> num_histograms: usize,
<a href=#141 id=141 data-nosnippet>141</a> histograms: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#142 id=142 data-nosnippet>142</a>) <span class="kw">where
<a href=#143 id=143 data-nosnippet>143</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#144 id=144 data-nosnippet>144</a>{
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">let </span><span class="kw-2">mut </span>seed: u32 = <span class="number">7u32</span>;
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">let </span>block_length: usize = length.wrapping_div(num_histograms);
<a href=#147 id=147 data-nosnippet>147</a> ClearHistograms(histograms, num_histograms);
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_histograms {
<a href=#149 id=149 data-nosnippet>149</a> <span class="kw">let </span><span class="kw-2">mut </span>pos: usize = length.wrapping_mul(i).wrapping_div(num_histograms);
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">if </span><span class="macro">i !</span>= <span class="number">0usize </span>{
<a href=#151 id=151 data-nosnippet>151</a> pos = pos.wrapping_add((MyRand(<span class="kw-2">&amp;mut </span>seed) <span class="kw">as </span>usize).wrapping_rem(block_length));
<a href=#152 id=152 data-nosnippet>152</a> }
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">if </span>pos.wrapping_add(stride) &gt;= length {
<a href=#154 id=154 data-nosnippet>154</a> pos = length.wrapping_sub(stride).wrapping_sub(<span class="number">1</span>);
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a> HistogramAddVector(<span class="kw-2">&amp;mut </span>histograms[i], <span class="kw-2">&amp;</span>data[pos..], stride);
<a href=#157 id=157 data-nosnippet>157</a> }
<a href=#158 id=158 data-nosnippet>158</a>}
<a href=#159 id=159 data-nosnippet>159</a>
<a href=#160 id=160 data-nosnippet>160</a><span class="kw">fn </span>RandomSample&lt;
<a href=#161 id=161 data-nosnippet>161</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors,
<a href=#162 id=162 data-nosnippet>162</a> IntegerType: Sized + Clone,
<a href=#163 id=163 data-nosnippet>163</a>&gt;(
<a href=#164 id=164 data-nosnippet>164</a> seed: <span class="kw-2">&amp;mut </span>u32,
<a href=#165 id=165 data-nosnippet>165</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#166 id=166 data-nosnippet>166</a> length: usize,
<a href=#167 id=167 data-nosnippet>167</a> <span class="kw-2">mut </span>stride: usize,
<a href=#168 id=168 data-nosnippet>168</a> sample: <span class="kw-2">&amp;mut </span>HistogramType,
<a href=#169 id=169 data-nosnippet>169</a>) <span class="kw">where
<a href=#170 id=170 data-nosnippet>170</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#171 id=171 data-nosnippet>171</a>{
<a href=#172 id=172 data-nosnippet>172</a> <span class="kw">let </span>pos: usize;
<a href=#173 id=173 data-nosnippet>173</a> <span class="kw">if </span>stride &gt;= length {
<a href=#174 id=174 data-nosnippet>174</a> pos = <span class="number">0usize</span>;
<a href=#175 id=175 data-nosnippet>175</a> stride = length;
<a href=#176 id=176 data-nosnippet>176</a> } <span class="kw">else </span>{
<a href=#177 id=177 data-nosnippet>177</a> pos = (MyRand(seed) <span class="kw">as </span>usize).wrapping_rem(length.wrapping_sub(stride).wrapping_add(<span class="number">1</span>));
<a href=#178 id=178 data-nosnippet>178</a> }
<a href=#179 id=179 data-nosnippet>179</a> HistogramAddVector(sample, <span class="kw-2">&amp;</span>data[pos..], stride);
<a href=#180 id=180 data-nosnippet>180</a>}
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a><span class="kw">fn </span>RefineEntropyCodes&lt;
<a href=#183 id=183 data-nosnippet>183</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors + core::default::Default,
<a href=#184 id=184 data-nosnippet>184</a> IntegerType: Sized + Clone,
<a href=#185 id=185 data-nosnippet>185</a>&gt;(
<a href=#186 id=186 data-nosnippet>186</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#187 id=187 data-nosnippet>187</a> length: usize,
<a href=#188 id=188 data-nosnippet>188</a> stride: usize,
<a href=#189 id=189 data-nosnippet>189</a> num_histograms: usize,
<a href=#190 id=190 data-nosnippet>190</a> histograms: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#191 id=191 data-nosnippet>191</a>) <span class="kw">where
<a href=#192 id=192 data-nosnippet>192</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#193 id=193 data-nosnippet>193</a>{
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">let </span><span class="kw-2">mut </span>iters: usize = kIterMulForRefining
<a href=#195 id=195 data-nosnippet>195</a> .wrapping_mul(length)
<a href=#196 id=196 data-nosnippet>196</a> .wrapping_div(stride)
<a href=#197 id=197 data-nosnippet>197</a> .wrapping_add(kMinItersForRefining);
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw">let </span><span class="kw-2">mut </span>seed: u32 = <span class="number">7u32</span>;
<a href=#199 id=199 data-nosnippet>199</a> iters = iters
<a href=#200 id=200 data-nosnippet>200</a> .wrapping_add(num_histograms)
<a href=#201 id=201 data-nosnippet>201</a> .wrapping_sub(<span class="number">1</span>)
<a href=#202 id=202 data-nosnippet>202</a> .wrapping_div(num_histograms)
<a href=#203 id=203 data-nosnippet>203</a> .wrapping_mul(num_histograms);
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">for </span>iter <span class="kw">in </span><span class="number">0usize</span>..iters {
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">let </span><span class="kw-2">mut </span>sample = HistogramType::default();
<a href=#206 id=206 data-nosnippet>206</a> HistogramClear(<span class="kw-2">&amp;mut </span>sample);
<a href=#207 id=207 data-nosnippet>207</a> RandomSample(<span class="kw-2">&amp;mut </span>seed, data, length, stride, <span class="kw-2">&amp;mut </span>sample);
<a href=#208 id=208 data-nosnippet>208</a> HistogramAddHistogram(
<a href=#209 id=209 data-nosnippet>209</a> <span class="kw-2">&amp;mut </span>histograms[iter.wrapping_rem(num_histograms)],
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw-2">&amp;mut </span>sample,
<a href=#211 id=211 data-nosnippet>211</a> );
<a href=#212 id=212 data-nosnippet>212</a> }
<a href=#213 id=213 data-nosnippet>213</a>}
<a href=#214 id=214 data-nosnippet>214</a>
<a href=#215 id=215 data-nosnippet>215</a><span class="kw">fn </span>BitCost(count: usize) -&gt; floatX {
<a href=#216 id=216 data-nosnippet>216</a> <span class="kw">if </span>count == <span class="number">0usize </span>{
<a href=#217 id=217 data-nosnippet>217</a> -<span class="number">2.0
<a href=#218 id=218 data-nosnippet>218</a> </span>} <span class="kw">else </span>{
<a href=#219 id=219 data-nosnippet>219</a> FastLog2(count <span class="kw">as </span>u64)
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a>}
<a href=#222 id=222 data-nosnippet>222</a>
<a href=#223 id=223 data-nosnippet>223</a><span class="kw">fn </span>FindBlocks&lt;
<a href=#224 id=224 data-nosnippet>224</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors,
<a href=#225 id=225 data-nosnippet>225</a> IntegerType: Sized + Clone,
<a href=#226 id=226 data-nosnippet>226</a>&gt;(
<a href=#227 id=227 data-nosnippet>227</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#228 id=228 data-nosnippet>228</a> length: usize,
<a href=#229 id=229 data-nosnippet>229</a> block_switch_bitcost: floatX,
<a href=#230 id=230 data-nosnippet>230</a> num_histograms: usize,
<a href=#231 id=231 data-nosnippet>231</a> histograms: <span class="kw-2">&amp;</span>[HistogramType],
<a href=#232 id=232 data-nosnippet>232</a> insert_cost: <span class="kw-2">&amp;mut </span>[floatX],
<a href=#233 id=233 data-nosnippet>233</a> cost: <span class="kw-2">&amp;mut </span>[Mem256f],
<a href=#234 id=234 data-nosnippet>234</a> switch_signal: <span class="kw-2">&amp;mut </span>[u8],
<a href=#235 id=235 data-nosnippet>235</a> block_id: <span class="kw-2">&amp;mut </span>[u8],
<a href=#236 id=236 data-nosnippet>236</a>) -&gt; usize
<a href=#237 id=237 data-nosnippet>237</a><span class="kw">where
<a href=#238 id=238 data-nosnippet>238</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#239 id=239 data-nosnippet>239</a>{
<a href=#240 id=240 data-nosnippet>240</a> <span class="kw">if </span>num_histograms == <span class="number">0 </span>{
<a href=#241 id=241 data-nosnippet>241</a> <span class="kw">return </span><span class="number">0</span>;
<a href=#242 id=242 data-nosnippet>242</a> }
<a href=#243 id=243 data-nosnippet>243</a> <span class="kw">let </span>data_size: usize = histograms[<span class="number">0</span>].slice().len();
<a href=#244 id=244 data-nosnippet>244</a> <span class="kw">let </span>bitmaplen: usize = num_histograms.wrapping_add(<span class="number">7</span>) &gt;&gt; <span class="number">3</span>;
<a href=#245 id=245 data-nosnippet>245</a> <span class="kw">let </span><span class="kw-2">mut </span>num_blocks: usize = <span class="number">1</span>;
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">if </span>num_histograms &lt;= <span class="number">1 </span>{
<a href=#248 id=248 data-nosnippet>248</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#249 id=249 data-nosnippet>249</a> block_id[i] = <span class="number">0u8</span>;
<a href=#250 id=250 data-nosnippet>250</a> }
<a href=#251 id=251 data-nosnippet>251</a> <span class="kw">return </span><span class="number">1</span>;
<a href=#252 id=252 data-nosnippet>252</a> }
<a href=#253 id=253 data-nosnippet>253</a> <span class="kw">for </span>item <span class="kw">in </span>insert_cost[..(data_size * num_histograms)].iter_mut() {
<a href=#254 id=254 data-nosnippet>254</a> <span class="kw-2">*</span>item = <span class="number">0.0</span>;
<a href=#255 id=255 data-nosnippet>255</a> }
<a href=#256 id=256 data-nosnippet>256</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_histograms {
<a href=#257 id=257 data-nosnippet>257</a> insert_cost[i] = FastLog2((histograms[i]).total_count() <span class="kw">as </span>u32 <span class="kw">as </span>(u64));
<a href=#258 id=258 data-nosnippet>258</a> }
<a href=#259 id=259 data-nosnippet>259</a> i = data_size;
<a href=#260 id=260 data-nosnippet>260</a> <span class="kw">while </span><span class="macro">i !</span>= <span class="number">0usize </span>{
<a href=#261 id=261 data-nosnippet>261</a> i = i.wrapping_sub(<span class="number">1</span>);
<a href=#262 id=262 data-nosnippet>262</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_histograms {
<a href=#263 id=263 data-nosnippet>263</a> insert_cost[i.wrapping_mul(num_histograms).wrapping_add(j)] =
<a href=#264 id=264 data-nosnippet>264</a> insert_cost[j] - BitCost((histograms[j]).slice()[i] <span class="kw">as </span>usize);
<a href=#265 id=265 data-nosnippet>265</a> }
<a href=#266 id=266 data-nosnippet>266</a> }
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">for </span>item <span class="kw">in </span>cost.iter_mut() {
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw-2">*</span>item = Mem256f::default();
<a href=#269 id=269 data-nosnippet>269</a> }
<a href=#270 id=270 data-nosnippet>270</a> <span class="kw">for </span>item <span class="kw">in </span>switch_signal[..(length * bitmaplen)].iter_mut() {
<a href=#271 id=271 data-nosnippet>271</a> <span class="kw-2">*</span>item = <span class="number">0</span>;
<a href=#272 id=272 data-nosnippet>272</a> }
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">for </span>(byte_ix, data_byte_ix) <span class="kw">in </span>data[..length].iter().enumerate() {
<a href=#274 id=274 data-nosnippet>274</a> <span class="kw">let </span>block_id_ptr = <span class="kw-2">&amp;mut </span>block_id[byte_ix];
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">let </span>ix: usize = byte_ix.wrapping_mul(bitmaplen);
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">let </span>insert_cost_ix: usize =
<a href=#277 id=277 data-nosnippet>277</a> u64::from(data_byte_ix.clone()).wrapping_mul(num_histograms <span class="kw">as </span>u64) <span class="kw">as </span>usize;
<a href=#278 id=278 data-nosnippet>278</a> <span class="kw">let </span><span class="kw-2">mut </span>min_cost: floatX = <span class="number">1e38</span>;
<a href=#279 id=279 data-nosnippet>279</a> <span class="kw">let </span><span class="kw-2">mut </span>block_switch_cost: floatX = block_switch_bitcost;
<a href=#280 id=280 data-nosnippet>280</a> <span class="comment">// main (vectorized) loop
<a href=#281 id=281 data-nosnippet>281</a> </span><span class="kw">let </span>insert_cost_slice = insert_cost.split_at(insert_cost_ix).<span class="number">1</span>;
<a href=#282 id=282 data-nosnippet>282</a> <span class="kw">for </span>(v_index, cost_iter) <span class="kw">in </span>cost
<a href=#283 id=283 data-nosnippet>283</a> .split_at_mut(num_histograms &gt;&gt; <span class="number">3</span>)
<a href=#284 id=284 data-nosnippet>284</a> .<span class="number">0
<a href=#285 id=285 data-nosnippet>285</a> </span>.iter_mut()
<a href=#286 id=286 data-nosnippet>286</a> .enumerate()
<a href=#287 id=287 data-nosnippet>287</a> {
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">let </span>base_index = v_index &lt;&lt; <span class="number">3</span>;
<a href=#289 id=289 data-nosnippet>289</a> <span class="kw">let </span><span class="kw-2">mut </span>local_insert_cost = [<span class="number">0.0</span>; <span class="number">8</span>];
<a href=#290 id=290 data-nosnippet>290</a> local_insert_cost
<a href=#291 id=291 data-nosnippet>291</a> .clone_from_slice(insert_cost_slice.split_at(base_index).<span class="number">1</span>.split_at(<span class="number">8</span>).<span class="number">0</span>);
<a href=#292 id=292 data-nosnippet>292</a> <span class="kw">for </span>sub_index <span class="kw">in </span><span class="number">0usize</span>..<span class="number">8usize </span>{
<a href=#293 id=293 data-nosnippet>293</a> cost_iter[sub_index] += local_insert_cost[sub_index];
<a href=#294 id=294 data-nosnippet>294</a> <span class="kw">let </span>final_cost = cost_iter[sub_index];
<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">if </span>final_cost &lt; min_cost {
<a href=#296 id=296 data-nosnippet>296</a> min_cost = final_cost;
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw-2">*</span>block_id_ptr = (base_index + sub_index) <span class="kw">as </span>u8;
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a> }
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw">let </span>vectorized_offset = ((num_histograms &gt;&gt; <span class="number">3</span>) &lt;&lt; <span class="number">3</span>);
<a href=#302 id=302 data-nosnippet>302</a> <span class="kw">let </span><span class="kw-2">mut </span>k = vectorized_offset;
<a href=#303 id=303 data-nosnippet>303</a> <span class="comment">//remainder loop for
<a href=#304 id=304 data-nosnippet>304</a> </span><span class="kw">for </span>insert_cost_iter <span class="kw">in </span>insert_cost
<a href=#305 id=305 data-nosnippet>305</a> .split_at(insert_cost_ix + vectorized_offset)
<a href=#306 id=306 data-nosnippet>306</a> .<span class="number">1
<a href=#307 id=307 data-nosnippet>307</a> </span>.split_at(num_histograms &amp; <span class="number">7</span>)
<a href=#308 id=308 data-nosnippet>308</a> .<span class="number">0
<a href=#309 id=309 data-nosnippet>309</a> </span>.iter()
<a href=#310 id=310 data-nosnippet>310</a> {
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">let </span>cost_iter = <span class="kw-2">&amp;mut </span>cost[(k &gt;&gt; <span class="number">3</span>)];
<a href=#312 id=312 data-nosnippet>312</a> cost_iter[k &amp; <span class="number">7</span>] += <span class="kw-2">*</span>insert_cost_iter;
<a href=#313 id=313 data-nosnippet>313</a> <span class="kw">if </span>cost_iter[k &amp; <span class="number">7</span>] &lt; min_cost {
<a href=#314 id=314 data-nosnippet>314</a> min_cost = cost_iter[k &amp; <span class="number">7</span>];
<a href=#315 id=315 data-nosnippet>315</a> <span class="kw-2">*</span>block_id_ptr = k <span class="kw">as </span>u8;
<a href=#316 id=316 data-nosnippet>316</a> }
<a href=#317 id=317 data-nosnippet>317</a> k += <span class="number">1</span>;
<a href=#318 id=318 data-nosnippet>318</a> }
<a href=#319 id=319 data-nosnippet>319</a> <span class="kw">if </span>byte_ix &lt; <span class="number">2000usize </span>{
<a href=#320 id=320 data-nosnippet>320</a> block_switch_cost <span class="kw-2">*</span>= (<span class="number">0.77 </span>+ <span class="number">0.07 </span>* (byte_ix <span class="kw">as </span>floatX) / <span class="number">2000.0</span>);
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a> update_cost_and_signal(
<a href=#323 id=323 data-nosnippet>323</a> num_histograms <span class="kw">as </span>u32,
<a href=#324 id=324 data-nosnippet>324</a> ix,
<a href=#325 id=325 data-nosnippet>325</a> min_cost,
<a href=#326 id=326 data-nosnippet>326</a> block_switch_cost,
<a href=#327 id=327 data-nosnippet>327</a> cost,
<a href=#328 id=328 data-nosnippet>328</a> switch_signal,
<a href=#329 id=329 data-nosnippet>329</a> );
<a href=#330 id=330 data-nosnippet>330</a> }
<a href=#331 id=331 data-nosnippet>331</a> {
<a href=#332 id=332 data-nosnippet>332</a> <span class="kw">let </span><span class="kw-2">mut </span>byte_ix: usize = length.wrapping_sub(<span class="number">1</span>);
<a href=#333 id=333 data-nosnippet>333</a> <span class="kw">let </span><span class="kw-2">mut </span>ix: usize = byte_ix.wrapping_mul(bitmaplen);
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">let </span><span class="kw-2">mut </span>cur_id: u8 = block_id[byte_ix];
<a href=#335 id=335 data-nosnippet>335</a> <span class="kw">while </span>byte_ix &gt; <span class="number">0usize </span>{
<a href=#336 id=336 data-nosnippet>336</a> <span class="kw">let </span>mask: u8 = (<span class="number">1u32 </span>&lt;&lt; (cur_id <span class="kw">as </span>i32 &amp; <span class="number">7i32</span>)) <span class="kw">as </span>u8;
<a href=#337 id=337 data-nosnippet>337</a> byte_ix -= <span class="number">1</span>;
<a href=#338 id=338 data-nosnippet>338</a> ix = ix.wrapping_sub(bitmaplen);
<a href=#339 id=339 data-nosnippet>339</a> <span class="kw">if </span>switch_signal[ix.wrapping_add((cur_id <span class="kw">as </span>i32 &gt;&gt; <span class="number">3</span>) <span class="kw">as </span>usize)] <span class="kw">as </span>i32 &amp; mask <span class="kw">as </span><span class="macro">i32
<a href=#340 id=340 data-nosnippet>340</a> !</span>= <span class="number">0
<a href=#341 id=341 data-nosnippet>341</a> </span>&amp;&amp; cur_id <span class="kw">as </span><span class="macro">i32 !</span>= block_id[byte_ix] <span class="kw">as </span>i32
<a href=#342 id=342 data-nosnippet>342</a> {
<a href=#343 id=343 data-nosnippet>343</a> cur_id = block_id[byte_ix];
<a href=#344 id=344 data-nosnippet>344</a> num_blocks = num_blocks.wrapping_add(<span class="number">1</span>);
<a href=#345 id=345 data-nosnippet>345</a> }
<a href=#346 id=346 data-nosnippet>346</a> block_id[byte_ix] = cur_id;
<a href=#347 id=347 data-nosnippet>347</a> }
<a href=#348 id=348 data-nosnippet>348</a> }
<a href=#349 id=349 data-nosnippet>349</a> num_blocks
<a href=#350 id=350 data-nosnippet>350</a>}
<a href=#351 id=351 data-nosnippet>351</a>
<a href=#352 id=352 data-nosnippet>352</a><span class="kw">fn </span>RemapBlockIds(
<a href=#353 id=353 data-nosnippet>353</a> block_ids: <span class="kw-2">&amp;mut </span>[u8],
<a href=#354 id=354 data-nosnippet>354</a> length: usize,
<a href=#355 id=355 data-nosnippet>355</a> new_id: <span class="kw-2">&amp;mut </span>[u16],
<a href=#356 id=356 data-nosnippet>356</a> num_histograms: usize,
<a href=#357 id=357 data-nosnippet>357</a>) -&gt; usize {
<a href=#358 id=358 data-nosnippet>358</a> <span class="kw">static </span>kInvalidId: u16 = <span class="number">256u16</span>;
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">let </span><span class="kw-2">mut </span>next_id: u16 = <span class="number">0u16</span>;
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_histograms {
<a href=#361 id=361 data-nosnippet>361</a> new_id[i] = kInvalidId;
<a href=#362 id=362 data-nosnippet>362</a> }
<a href=#363 id=363 data-nosnippet>363</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#364 id=364 data-nosnippet>364</a> <span class="kw">if </span>new_id[(block_ids[i] <span class="kw">as </span>usize)] <span class="kw">as </span>i32 == kInvalidId <span class="kw">as </span>i32 {
<a href=#365 id=365 data-nosnippet>365</a> new_id[(block_ids[i] <span class="kw">as </span>usize)] = {
<a href=#366 id=366 data-nosnippet>366</a> <span class="kw">let </span>_old = next_id;
<a href=#367 id=367 data-nosnippet>367</a> next_id = (next_id <span class="kw">as </span>i32 + <span class="number">1</span>) <span class="kw">as </span>u16;
<a href=#368 id=368 data-nosnippet>368</a> _old
<a href=#369 id=369 data-nosnippet>369</a> };
<a href=#370 id=370 data-nosnippet>370</a> }
<a href=#371 id=371 data-nosnippet>371</a> }
<a href=#372 id=372 data-nosnippet>372</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#373 id=373 data-nosnippet>373</a> block_ids[i] = new_id[(block_ids[i] <span class="kw">as </span>usize)] <span class="kw">as </span>u8;
<a href=#374 id=374 data-nosnippet>374</a> }
<a href=#375 id=375 data-nosnippet>375</a> next_id <span class="kw">as </span>usize
<a href=#376 id=376 data-nosnippet>376</a>}
<a href=#377 id=377 data-nosnippet>377</a>
<a href=#378 id=378 data-nosnippet>378</a><span class="kw">fn </span>BuildBlockHistograms&lt;
<a href=#379 id=379 data-nosnippet>379</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors,
<a href=#380 id=380 data-nosnippet>380</a> IntegerType: Sized + Clone,
<a href=#381 id=381 data-nosnippet>381</a>&gt;(
<a href=#382 id=382 data-nosnippet>382</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#383 id=383 data-nosnippet>383</a> length: usize,
<a href=#384 id=384 data-nosnippet>384</a> block_ids: <span class="kw-2">&amp;</span>[u8],
<a href=#385 id=385 data-nosnippet>385</a> num_histograms: usize,
<a href=#386 id=386 data-nosnippet>386</a> histograms: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#387 id=387 data-nosnippet>387</a>) <span class="kw">where
<a href=#388 id=388 data-nosnippet>388</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#389 id=389 data-nosnippet>389</a>{
<a href=#390 id=390 data-nosnippet>390</a> ClearHistograms(histograms, num_histograms);
<a href=#391 id=391 data-nosnippet>391</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#392 id=392 data-nosnippet>392</a> HistogramAddItem(
<a href=#393 id=393 data-nosnippet>393</a> <span class="kw-2">&amp;mut </span>histograms[(block_ids[i] <span class="kw">as </span>usize)],
<a href=#394 id=394 data-nosnippet>394</a> u64::from(data[i].clone()) <span class="kw">as </span>usize,
<a href=#395 id=395 data-nosnippet>395</a> );
<a href=#396 id=396 data-nosnippet>396</a> }
<a href=#397 id=397 data-nosnippet>397</a>}
<a href=#398 id=398 data-nosnippet>398</a>
<a href=#399 id=399 data-nosnippet>399</a><span class="kw">fn </span>ClusterBlocks&lt;
<a href=#400 id=400 data-nosnippet>400</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors + core::default::Default + Clone,
<a href=#401 id=401 data-nosnippet>401</a> Alloc: alloc::Allocator&lt;u8&gt;
<a href=#402 id=402 data-nosnippet>402</a> + alloc::Allocator&lt;u32&gt;
<a href=#403 id=403 data-nosnippet>403</a> + alloc::Allocator&lt;HistogramType&gt;
<a href=#404 id=404 data-nosnippet>404</a> + alloc::Allocator&lt;HistogramPair&gt;,
<a href=#405 id=405 data-nosnippet>405</a> IntegerType: Sized + Clone,
<a href=#406 id=406 data-nosnippet>406</a>&gt;(
<a href=#407 id=407 data-nosnippet>407</a> alloc: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#408 id=408 data-nosnippet>408</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#409 id=409 data-nosnippet>409</a> length: usize,
<a href=#410 id=410 data-nosnippet>410</a> num_blocks: usize,
<a href=#411 id=411 data-nosnippet>411</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#412 id=412 data-nosnippet>412</a> block_ids: <span class="kw-2">&amp;mut </span>[u8],
<a href=#413 id=413 data-nosnippet>413</a> split: <span class="kw-2">&amp;mut </span>BlockSplit&lt;Alloc&gt;,
<a href=#414 id=414 data-nosnippet>414</a>) <span class="kw">where
<a href=#415 id=415 data-nosnippet>415</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#416 id=416 data-nosnippet>416</a>{
<a href=#417 id=417 data-nosnippet>417</a> <span class="kw">let </span><span class="kw-2">mut </span>histogram_symbols = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, num_blocks);
<a href=#418 id=418 data-nosnippet>418</a> <span class="kw">let </span><span class="kw-2">mut </span>block_lengths = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, num_blocks);
<a href=#419 id=419 data-nosnippet>419</a> <span class="kw">let </span>expected_num_clusters: usize = (<span class="number">16usize</span>)
<a href=#420 id=420 data-nosnippet>420</a> .wrapping_mul(num_blocks.wrapping_add(<span class="number">64</span>).wrapping_sub(<span class="number">1</span>))
<a href=#421 id=421 data-nosnippet>421</a> .wrapping_div(<span class="number">64</span>);
<a href=#422 id=422 data-nosnippet>422</a> <span class="kw">let </span><span class="kw-2">mut </span>all_histograms_size: usize = <span class="number">0usize</span>;
<a href=#423 id=423 data-nosnippet>423</a> <span class="kw">let </span><span class="kw-2">mut </span>all_histograms_capacity: usize = expected_num_clusters;
<a href=#424 id=424 data-nosnippet>424</a> <span class="kw">let </span><span class="kw-2">mut </span>all_histograms = allocate::&lt;HistogramType, <span class="kw">_</span>&gt;(alloc, all_histograms_capacity);
<a href=#425 id=425 data-nosnippet>425</a> <span class="kw">let </span><span class="kw-2">mut </span>cluster_size_size: usize = <span class="number">0usize</span>;
<a href=#426 id=426 data-nosnippet>426</a> <span class="kw">let </span><span class="kw-2">mut </span>cluster_size_capacity: usize = expected_num_clusters;
<a href=#427 id=427 data-nosnippet>427</a> <span class="kw">let </span><span class="kw-2">mut </span>cluster_size = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, cluster_size_capacity);
<a href=#428 id=428 data-nosnippet>428</a> <span class="kw">let </span><span class="kw-2">mut </span>num_clusters: usize = <span class="number">0usize</span>;
<a href=#429 id=429 data-nosnippet>429</a> <span class="kw">let </span><span class="kw-2">mut </span>histograms = allocate::&lt;HistogramType, <span class="kw">_</span>&gt;(alloc, min(num_blocks, <span class="number">64</span>));
<a href=#430 id=430 data-nosnippet>430</a> <span class="kw">let </span><span class="kw-2">mut </span>max_num_pairs: usize = (<span class="number">64i32 </span>* <span class="number">64i32 </span>/ <span class="number">2i32</span>) <span class="kw">as </span>usize;
<a href=#431 id=431 data-nosnippet>431</a> <span class="kw">let </span>pairs_capacity: usize = max_num_pairs.wrapping_add(<span class="number">1</span>);
<a href=#432 id=432 data-nosnippet>432</a> <span class="kw">let </span><span class="kw-2">mut </span>pairs = allocate::&lt;HistogramPair, <span class="kw">_</span>&gt;(alloc, pairs_capacity);
<a href=#433 id=433 data-nosnippet>433</a> <span class="kw">let </span><span class="kw-2">mut </span>pos: usize = <span class="number">0usize</span>;
<a href=#434 id=434 data-nosnippet>434</a> <span class="kw">let </span><span class="kw-2">mut </span>clusters: &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory;
<a href=#435 id=435 data-nosnippet>435</a>
<a href=#436 id=436 data-nosnippet>436</a> <span class="kw">static </span>kInvalidIndex: u32 = u32::MAX;
<a href=#437 id=437 data-nosnippet>437</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#438 id=438 data-nosnippet>438</a> <span class="kw">let </span><span class="kw-2">mut </span>sizes: [u32; <span class="number">64</span>] = [<span class="number">0</span>; <span class="number">64</span>];
<a href=#439 id=439 data-nosnippet>439</a> <span class="kw">let </span><span class="kw-2">mut </span>new_clusters: [u32; <span class="number">64</span>] = [<span class="number">0</span>; <span class="number">64</span>];
<a href=#440 id=440 data-nosnippet>440</a> <span class="kw">let </span><span class="kw-2">mut </span>symbols: [u32; <span class="number">64</span>] = [<span class="number">0</span>; <span class="number">64</span>];
<a href=#441 id=441 data-nosnippet>441</a> <span class="kw">let </span><span class="kw-2">mut </span>remap: [u32; <span class="number">64</span>] = [<span class="number">0</span>; <span class="number">64</span>];
<a href=#442 id=442 data-nosnippet>442</a> {
<a href=#443 id=443 data-nosnippet>443</a> <span class="kw">let </span><span class="kw-2">mut </span>block_idx: usize = <span class="number">0usize</span>;
<a href=#444 id=444 data-nosnippet>444</a> i = <span class="number">0usize</span>;
<a href=#445 id=445 data-nosnippet>445</a> <span class="kw">while </span>i &lt; length {
<a href=#446 id=446 data-nosnippet>446</a> {
<a href=#447 id=447 data-nosnippet>447</a> {
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#449 id=449 data-nosnippet>449</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>block_lengths.slice_mut()[block_idx];
<a href=#450 id=450 data-nosnippet>450</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#451 id=451 data-nosnippet>451</a> }
<a href=#452 id=452 data-nosnippet>452</a> <span class="kw">if </span>i.wrapping_add(<span class="number">1</span>) == length
<a href=#453 id=453 data-nosnippet>453</a> || block_ids[i] <span class="kw">as </span><span class="macro">i32 !</span>= block_ids[i.wrapping_add(<span class="number">1</span>)] <span class="kw">as </span>i32
<a href=#454 id=454 data-nosnippet>454</a> {
<a href=#455 id=455 data-nosnippet>455</a> block_idx = block_idx.wrapping_add(<span class="number">1</span>);
<a href=#456 id=456 data-nosnippet>456</a> }
<a href=#457 id=457 data-nosnippet>457</a> }
<a href=#458 id=458 data-nosnippet>458</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#459 id=459 data-nosnippet>459</a> }
<a href=#460 id=460 data-nosnippet>460</a> }
<a href=#461 id=461 data-nosnippet>461</a> i = <span class="number">0usize</span>;
<a href=#462 id=462 data-nosnippet>462</a> <span class="kw">while </span>i &lt; num_blocks {
<a href=#463 id=463 data-nosnippet>463</a> {
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw">let </span>num_to_combine: usize = min(num_blocks.wrapping_sub(i), <span class="number">64</span>);
<a href=#465 id=465 data-nosnippet>465</a>
<a href=#466 id=466 data-nosnippet>466</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_to_combine {
<a href=#467 id=467 data-nosnippet>467</a> HistogramClear(<span class="kw-2">&amp;mut </span>histograms.slice_mut()[j]);
<a href=#468 id=468 data-nosnippet>468</a> <span class="kw">for </span>_k <span class="kw">in </span><span class="number">0usize</span>..block_lengths.slice()[i.wrapping_add(j)] <span class="kw">as </span>usize {
<a href=#469 id=469 data-nosnippet>469</a> HistogramAddItem(
<a href=#470 id=470 data-nosnippet>470</a> <span class="kw-2">&amp;mut </span>histograms.slice_mut()[j],
<a href=#471 id=471 data-nosnippet>471</a> u64::from(data[pos].clone()) <span class="kw">as </span>usize,
<a href=#472 id=472 data-nosnippet>472</a> );
<a href=#473 id=473 data-nosnippet>473</a> pos = pos.wrapping_add(<span class="number">1</span>);
<a href=#474 id=474 data-nosnippet>474</a> }
<a href=#475 id=475 data-nosnippet>475</a> <span class="kw">let </span>new_cost = BrotliPopulationCost(<span class="kw-2">&amp;</span>histograms.slice()[j], scratch_space);
<a href=#476 id=476 data-nosnippet>476</a> (histograms.slice_mut()[j]).set_bit_cost(new_cost);
<a href=#477 id=477 data-nosnippet>477</a>
<a href=#478 id=478 data-nosnippet>478</a> new_clusters[j] = j <span class="kw">as </span>u32;
<a href=#479 id=479 data-nosnippet>479</a> symbols[j] = j <span class="kw">as </span>u32;
<a href=#480 id=480 data-nosnippet>480</a> sizes[j] = <span class="number">1u32</span>;
<a href=#481 id=481 data-nosnippet>481</a> }
<a href=#482 id=482 data-nosnippet>482</a> <span class="kw">let </span>num_new_clusters: usize = BrotliHistogramCombine(
<a href=#483 id=483 data-nosnippet>483</a> histograms.slice_mut(),
<a href=#484 id=484 data-nosnippet>484</a> <span class="kw-2">&amp;mut </span>sizes[..],
<a href=#485 id=485 data-nosnippet>485</a> <span class="kw-2">&amp;mut </span>symbols[..],
<a href=#486 id=486 data-nosnippet>486</a> <span class="kw-2">&amp;mut </span>new_clusters[..],
<a href=#487 id=487 data-nosnippet>487</a> pairs.slice_mut(),
<a href=#488 id=488 data-nosnippet>488</a> num_to_combine,
<a href=#489 id=489 data-nosnippet>489</a> num_to_combine,
<a href=#490 id=490 data-nosnippet>490</a> <span class="number">64usize</span>,
<a href=#491 id=491 data-nosnippet>491</a> max_num_pairs,
<a href=#492 id=492 data-nosnippet>492</a> scratch_space,
<a href=#493 id=493 data-nosnippet>493</a> );
<a href=#494 id=494 data-nosnippet>494</a> {
<a href=#495 id=495 data-nosnippet>495</a> <span class="kw">if </span>all_histograms_capacity &lt; all_histograms_size.wrapping_add(num_new_clusters) {
<a href=#496 id=496 data-nosnippet>496</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>all_histograms_capacity == <span class="number">0usize </span>{
<a href=#497 id=497 data-nosnippet>497</a> all_histograms_size.wrapping_add(num_new_clusters)
<a href=#498 id=498 data-nosnippet>498</a> } <span class="kw">else </span>{
<a href=#499 id=499 data-nosnippet>499</a> all_histograms_capacity
<a href=#500 id=500 data-nosnippet>500</a> };
<a href=#501 id=501 data-nosnippet>501</a> <span class="kw">while </span>_new_size &lt; all_histograms_size.wrapping_add(num_new_clusters) {
<a href=#502 id=502 data-nosnippet>502</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#503 id=503 data-nosnippet>503</a> }
<a href=#504 id=504 data-nosnippet>504</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array = allocate::&lt;HistogramType, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#505 id=505 data-nosnippet>505</a> new_array.slice_mut()[..all_histograms_capacity]
<a href=#506 id=506 data-nosnippet>506</a> .clone_from_slice(<span class="kw-2">&amp;</span>all_histograms.slice()[..all_histograms_capacity]);
<a href=#507 id=507 data-nosnippet>507</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramType&gt;&gt;::free_cell(
<a href=#508 id=508 data-nosnippet>508</a> alloc,
<a href=#509 id=509 data-nosnippet>509</a> core::mem::replace(<span class="kw-2">&amp;mut </span>all_histograms, new_array),
<a href=#510 id=510 data-nosnippet>510</a> );
<a href=#511 id=511 data-nosnippet>511</a> all_histograms_capacity = _new_size;
<a href=#512 id=512 data-nosnippet>512</a> }
<a href=#513 id=513 data-nosnippet>513</a> }
<a href=#514 id=514 data-nosnippet>514</a> {
<a href=#515 id=515 data-nosnippet>515</a> <span class="kw">if </span>cluster_size_capacity &lt; cluster_size_size.wrapping_add(num_new_clusters) {
<a href=#516 id=516 data-nosnippet>516</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>cluster_size_capacity == <span class="number">0usize </span>{
<a href=#517 id=517 data-nosnippet>517</a> cluster_size_size.wrapping_add(num_new_clusters)
<a href=#518 id=518 data-nosnippet>518</a> } <span class="kw">else </span>{
<a href=#519 id=519 data-nosnippet>519</a> cluster_size_capacity
<a href=#520 id=520 data-nosnippet>520</a> };
<a href=#521 id=521 data-nosnippet>521</a> <span class="kw">while </span>_new_size &lt; cluster_size_size.wrapping_add(num_new_clusters) {
<a href=#522 id=522 data-nosnippet>522</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#523 id=523 data-nosnippet>523</a> }
<a href=#524 id=524 data-nosnippet>524</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#525 id=525 data-nosnippet>525</a> new_array.slice_mut()[..cluster_size_capacity]
<a href=#526 id=526 data-nosnippet>526</a> .clone_from_slice(<span class="kw-2">&amp;</span>cluster_size.slice()[..cluster_size_capacity]);
<a href=#527 id=527 data-nosnippet>527</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(
<a href=#528 id=528 data-nosnippet>528</a> alloc,
<a href=#529 id=529 data-nosnippet>529</a> core::mem::replace(<span class="kw-2">&amp;mut </span>cluster_size, new_array),
<a href=#530 id=530 data-nosnippet>530</a> );
<a href=#531 id=531 data-nosnippet>531</a> cluster_size_capacity = _new_size;
<a href=#532 id=532 data-nosnippet>532</a> }
<a href=#533 id=533 data-nosnippet>533</a> }
<a href=#534 id=534 data-nosnippet>534</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_new_clusters {
<a href=#535 id=535 data-nosnippet>535</a> all_histograms.slice_mut()[all_histograms_size] =
<a href=#536 id=536 data-nosnippet>536</a> histograms.slice()[new_clusters[j] <span class="kw">as </span>usize].clone();
<a href=#537 id=537 data-nosnippet>537</a> all_histograms_size = all_histograms_size.wrapping_add(<span class="number">1</span>);
<a href=#538 id=538 data-nosnippet>538</a> cluster_size.slice_mut()[cluster_size_size] = sizes[new_clusters[j] <span class="kw">as </span>usize];
<a href=#539 id=539 data-nosnippet>539</a> cluster_size_size = cluster_size_size.wrapping_add(<span class="number">1</span>);
<a href=#540 id=540 data-nosnippet>540</a> remap[new_clusters[j] <span class="kw">as </span>usize] = j <span class="kw">as </span>u32;
<a href=#541 id=541 data-nosnippet>541</a> }
<a href=#542 id=542 data-nosnippet>542</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_to_combine {
<a href=#543 id=543 data-nosnippet>543</a> histogram_symbols.slice_mut()[i.wrapping_add(j)] =
<a href=#544 id=544 data-nosnippet>544</a> (num_clusters <span class="kw">as </span>u32).wrapping_add(remap[symbols[j] <span class="kw">as </span>usize]);
<a href=#545 id=545 data-nosnippet>545</a> }
<a href=#546 id=546 data-nosnippet>546</a> num_clusters = num_clusters.wrapping_add(num_new_clusters);
<a href=#547 id=547 data-nosnippet>547</a> }
<a href=#548 id=548 data-nosnippet>548</a> i = i.wrapping_add(<span class="number">64</span>);
<a href=#549 id=549 data-nosnippet>549</a> }
<a href=#550 id=550 data-nosnippet>550</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramType&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span>histograms));
<a href=#551 id=551 data-nosnippet>551</a> max_num_pairs = min(
<a href=#552 id=552 data-nosnippet>552</a> (<span class="number">64usize</span>).wrapping_mul(num_clusters),
<a href=#553 id=553 data-nosnippet>553</a> num_clusters.wrapping_div(<span class="number">2</span>).wrapping_mul(num_clusters),
<a href=#554 id=554 data-nosnippet>554</a> );
<a href=#555 id=555 data-nosnippet>555</a> <span class="kw">if </span>pairs_capacity &lt; max_num_pairs.wrapping_add(<span class="number">1</span>) {
<a href=#556 id=556 data-nosnippet>556</a> <span class="kw">let </span>new_cell = allocate::&lt;HistogramPair, <span class="kw">_</span>&gt;(alloc, max_num_pairs.wrapping_add(<span class="number">1</span>));
<a href=#557 id=557 data-nosnippet>557</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramPair&gt;&gt;::free_cell(
<a href=#558 id=558 data-nosnippet>558</a> alloc,
<a href=#559 id=559 data-nosnippet>559</a> core::mem::replace(<span class="kw-2">&amp;mut </span>pairs, new_cell),
<a href=#560 id=560 data-nosnippet>560</a> );
<a href=#561 id=561 data-nosnippet>561</a> }
<a href=#562 id=562 data-nosnippet>562</a> clusters = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, num_clusters);
<a href=#563 id=563 data-nosnippet>563</a> i = <span class="number">0usize</span>;
<a href=#564 id=564 data-nosnippet>564</a> <span class="kw">for </span>item <span class="kw">in </span>clusters.slice_mut()[..num_clusters].iter_mut() {
<a href=#565 id=565 data-nosnippet>565</a> <span class="kw-2">*</span>item = i <span class="kw">as </span>u32;
<a href=#566 id=566 data-nosnippet>566</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#567 id=567 data-nosnippet>567</a> }
<a href=#568 id=568 data-nosnippet>568</a> <span class="kw">let </span>num_final_clusters: usize = BrotliHistogramCombine(
<a href=#569 id=569 data-nosnippet>569</a> all_histograms.slice_mut(),
<a href=#570 id=570 data-nosnippet>570</a> cluster_size.slice_mut(),
<a href=#571 id=571 data-nosnippet>571</a> histogram_symbols.slice_mut(),
<a href=#572 id=572 data-nosnippet>572</a> clusters.slice_mut(),
<a href=#573 id=573 data-nosnippet>573</a> pairs.slice_mut(),
<a href=#574 id=574 data-nosnippet>574</a> num_clusters,
<a href=#575 id=575 data-nosnippet>575</a> num_blocks,
<a href=#576 id=576 data-nosnippet>576</a> <span class="number">256usize</span>,
<a href=#577 id=577 data-nosnippet>577</a> max_num_pairs,
<a href=#578 id=578 data-nosnippet>578</a> scratch_space,
<a href=#579 id=579 data-nosnippet>579</a> );
<a href=#580 id=580 data-nosnippet>580</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramPair&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span>pairs));
<a href=#581 id=581 data-nosnippet>581</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span>cluster_size));
<a href=#582 id=582 data-nosnippet>582</a>
<a href=#583 id=583 data-nosnippet>583</a> <span class="kw">let </span><span class="kw-2">mut </span>new_index = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, num_clusters);
<a href=#584 id=584 data-nosnippet>584</a> <span class="kw">for </span>item <span class="kw">in </span>new_index.slice_mut().iter_mut() {
<a href=#585 id=585 data-nosnippet>585</a> <span class="kw-2">*</span>item = kInvalidIndex;
<a href=#586 id=586 data-nosnippet>586</a> }
<a href=#587 id=587 data-nosnippet>587</a> pos = <span class="number">0usize</span>;
<a href=#588 id=588 data-nosnippet>588</a> {
<a href=#589 id=589 data-nosnippet>589</a> <span class="kw">let </span><span class="kw-2">mut </span>next_index: u32 = <span class="number">0u32</span>;
<a href=#590 id=590 data-nosnippet>590</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_blocks {
<a href=#591 id=591 data-nosnippet>591</a> <span class="kw">let </span><span class="kw-2">mut </span>histo: HistogramType = HistogramType::default();
<a href=#592 id=592 data-nosnippet>592</a> <span class="kw">let </span><span class="kw-2">mut </span>best_out: u32;
<a href=#593 id=593 data-nosnippet>593</a> <span class="kw">let </span><span class="kw-2">mut </span>best_bits: floatX;
<a href=#594 id=594 data-nosnippet>594</a> HistogramClear(<span class="kw-2">&amp;mut </span>histo);
<a href=#595 id=595 data-nosnippet>595</a> <span class="kw">for </span>_j <span class="kw">in </span><span class="number">0usize</span>..block_lengths.slice()[i] <span class="kw">as </span>usize {
<a href=#596 id=596 data-nosnippet>596</a> HistogramAddItem(<span class="kw-2">&amp;mut </span>histo, u64::from(data[pos].clone()) <span class="kw">as </span>usize);
<a href=#597 id=597 data-nosnippet>597</a> pos = pos.wrapping_add(<span class="number">1</span>);
<a href=#598 id=598 data-nosnippet>598</a> }
<a href=#599 id=599 data-nosnippet>599</a> best_out = <span class="kw">if </span>i == <span class="number">0usize </span>{
<a href=#600 id=600 data-nosnippet>600</a> histogram_symbols.slice()[<span class="number">0</span>]
<a href=#601 id=601 data-nosnippet>601</a> } <span class="kw">else </span>{
<a href=#602 id=602 data-nosnippet>602</a> histogram_symbols.slice()[i.wrapping_sub(<span class="number">1</span>)]
<a href=#603 id=603 data-nosnippet>603</a> };
<a href=#604 id=604 data-nosnippet>604</a> best_bits = BrotliHistogramBitCostDistance(
<a href=#605 id=605 data-nosnippet>605</a> <span class="kw-2">&amp;mut </span>histo,
<a href=#606 id=606 data-nosnippet>606</a> <span class="kw-2">&amp;mut </span>all_histograms.slice_mut()[(best_out <span class="kw">as </span>usize)],
<a href=#607 id=607 data-nosnippet>607</a> scratch_space,
<a href=#608 id=608 data-nosnippet>608</a> );
<a href=#609 id=609 data-nosnippet>609</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_final_clusters {
<a href=#610 id=610 data-nosnippet>610</a> <span class="kw">let </span>cur_bits: floatX = BrotliHistogramBitCostDistance(
<a href=#611 id=611 data-nosnippet>611</a> <span class="kw-2">&amp;mut </span>histo,
<a href=#612 id=612 data-nosnippet>612</a> <span class="kw-2">&amp;mut </span>all_histograms.slice_mut()[(clusters.slice()[j] <span class="kw">as </span>usize)],
<a href=#613 id=613 data-nosnippet>613</a> scratch_space,
<a href=#614 id=614 data-nosnippet>614</a> );
<a href=#615 id=615 data-nosnippet>615</a> <span class="kw">if </span>cur_bits &lt; best_bits {
<a href=#616 id=616 data-nosnippet>616</a> best_bits = cur_bits;
<a href=#617 id=617 data-nosnippet>617</a> best_out = clusters.slice()[j];
<a href=#618 id=618 data-nosnippet>618</a> }
<a href=#619 id=619 data-nosnippet>619</a> }
<a href=#620 id=620 data-nosnippet>620</a> histogram_symbols.slice_mut()[i] = best_out;
<a href=#621 id=621 data-nosnippet>621</a> <span class="kw">if </span>new_index.slice()[best_out <span class="kw">as </span>usize] == kInvalidIndex {
<a href=#622 id=622 data-nosnippet>622</a> new_index.slice_mut()[best_out <span class="kw">as </span>usize] = next_index;
<a href=#623 id=623 data-nosnippet>623</a> next_index = next_index.wrapping_add(<span class="number">1</span>);
<a href=#624 id=624 data-nosnippet>624</a> }
<a href=#625 id=625 data-nosnippet>625</a> }
<a href=#626 id=626 data-nosnippet>626</a> }
<a href=#627 id=627 data-nosnippet>627</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span>clusters));
<a href=#628 id=628 data-nosnippet>628</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramType&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span>all_histograms));
<a href=#629 id=629 data-nosnippet>629</a> {
<a href=#630 id=630 data-nosnippet>630</a> <span class="kw">if </span>split.types_alloc_size() &lt; num_blocks {
<a href=#631 id=631 data-nosnippet>631</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>split.types_alloc_size() == <span class="number">0usize </span>{
<a href=#632 id=632 data-nosnippet>632</a> num_blocks
<a href=#633 id=633 data-nosnippet>633</a> } <span class="kw">else </span>{
<a href=#634 id=634 data-nosnippet>634</a> split.types_alloc_size()
<a href=#635 id=635 data-nosnippet>635</a> };
<a href=#636 id=636 data-nosnippet>636</a> <span class="kw">while </span>_new_size &lt; num_blocks {
<a href=#637 id=637 data-nosnippet>637</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#638 id=638 data-nosnippet>638</a> }
<a href=#639 id=639 data-nosnippet>639</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array = allocate::&lt;u8, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#640 id=640 data-nosnippet>640</a> new_array.slice_mut()[..split.types_alloc_size()]
<a href=#641 id=641 data-nosnippet>641</a> .clone_from_slice(<span class="kw-2">&amp;</span>split.types.slice()[..split.types_alloc_size()]);
<a href=#642 id=642 data-nosnippet>642</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(
<a href=#643 id=643 data-nosnippet>643</a> alloc,
<a href=#644 id=644 data-nosnippet>644</a> core::mem::replace(<span class="kw-2">&amp;mut </span>split.types, new_array),
<a href=#645 id=645 data-nosnippet>645</a> );
<a href=#646 id=646 data-nosnippet>646</a> }
<a href=#647 id=647 data-nosnippet>647</a> }
<a href=#648 id=648 data-nosnippet>648</a> {
<a href=#649 id=649 data-nosnippet>649</a> <span class="kw">if </span>split.lengths_alloc_size() &lt; num_blocks {
<a href=#650 id=650 data-nosnippet>650</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>split.lengths_alloc_size() == <span class="number">0usize </span>{
<a href=#651 id=651 data-nosnippet>651</a> num_blocks
<a href=#652 id=652 data-nosnippet>652</a> } <span class="kw">else </span>{
<a href=#653 id=653 data-nosnippet>653</a> split.lengths_alloc_size()
<a href=#654 id=654 data-nosnippet>654</a> };
<a href=#655 id=655 data-nosnippet>655</a> <span class="kw">while </span>_new_size &lt; num_blocks {
<a href=#656 id=656 data-nosnippet>656</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#657 id=657 data-nosnippet>657</a> }
<a href=#658 id=658 data-nosnippet>658</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#659 id=659 data-nosnippet>659</a> new_array.slice_mut()[..split.lengths_alloc_size()]
<a href=#660 id=660 data-nosnippet>660</a> .clone_from_slice(split.lengths.slice());
<a href=#661 id=661 data-nosnippet>661</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(
<a href=#662 id=662 data-nosnippet>662</a> alloc,
<a href=#663 id=663 data-nosnippet>663</a> core::mem::replace(<span class="kw-2">&amp;mut </span>split.lengths, new_array),
<a href=#664 id=664 data-nosnippet>664</a> );
<a href=#665 id=665 data-nosnippet>665</a> }
<a href=#666 id=666 data-nosnippet>666</a> }
<a href=#667 id=667 data-nosnippet>667</a> {
<a href=#668 id=668 data-nosnippet>668</a> <span class="kw">let </span><span class="kw-2">mut </span>cur_length: u32 = <span class="number">0u32</span>;
<a href=#669 id=669 data-nosnippet>669</a> <span class="kw">let </span><span class="kw-2">mut </span>block_idx: usize = <span class="number">0usize</span>;
<a href=#670 id=670 data-nosnippet>670</a> <span class="kw">let </span><span class="kw-2">mut </span>max_type: u8 = <span class="number">0u8</span>;
<a href=#671 id=671 data-nosnippet>671</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_blocks {
<a href=#672 id=672 data-nosnippet>672</a> cur_length = cur_length.wrapping_add(block_lengths.slice()[i]);
<a href=#673 id=673 data-nosnippet>673</a> <span class="kw">if </span>i.wrapping_add(<span class="number">1</span>) == num_blocks
<a href=#674 id=674 data-nosnippet>674</a> || histogram_symbols.slice()[i] != histogram_symbols.slice()[i.wrapping_add(<span class="number">1</span>)]
<a href=#675 id=675 data-nosnippet>675</a> {
<a href=#676 id=676 data-nosnippet>676</a> <span class="kw">let </span>id: u8 = new_index.slice()[(histogram_symbols.slice()[i] <span class="kw">as </span>usize)] <span class="kw">as </span>u8;
<a href=#677 id=677 data-nosnippet>677</a> split.types.slice_mut()[block_idx] = id;
<a href=#678 id=678 data-nosnippet>678</a> split.lengths.slice_mut()[block_idx] = cur_length;
<a href=#679 id=679 data-nosnippet>679</a> max_type = max(max_type, id);
<a href=#680 id=680 data-nosnippet>680</a> cur_length = <span class="number">0u32</span>;
<a href=#681 id=681 data-nosnippet>681</a> block_idx = block_idx.wrapping_add(<span class="number">1</span>);
<a href=#682 id=682 data-nosnippet>682</a> }
<a href=#683 id=683 data-nosnippet>683</a> }
<a href=#684 id=684 data-nosnippet>684</a> split.num_blocks = block_idx;
<a href=#685 id=685 data-nosnippet>685</a> split.num_types = (max_type <span class="kw">as </span>usize).wrapping_add(<span class="number">1</span>);
<a href=#686 id=686 data-nosnippet>686</a> }
<a href=#687 id=687 data-nosnippet>687</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, new_index);
<a href=#688 id=688 data-nosnippet>688</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, block_lengths);
<a href=#689 id=689 data-nosnippet>689</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, histogram_symbols);
<a href=#690 id=690 data-nosnippet>690</a>}
<a href=#691 id=691 data-nosnippet>691</a>
<a href=#692 id=692 data-nosnippet>692</a><span class="kw">fn </span>SplitByteVector&lt;
<a href=#693 id=693 data-nosnippet>693</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors + core::default::Default + Clone,
<a href=#694 id=694 data-nosnippet>694</a> Alloc: alloc::Allocator&lt;u8&gt;
<a href=#695 id=695 data-nosnippet>695</a> + alloc::Allocator&lt;u16&gt;
<a href=#696 id=696 data-nosnippet>696</a> + alloc::Allocator&lt;u32&gt;
<a href=#697 id=697 data-nosnippet>697</a> + alloc::Allocator&lt;floatX&gt;
<a href=#698 id=698 data-nosnippet>698</a> + alloc::Allocator&lt;Mem256f&gt;
<a href=#699 id=699 data-nosnippet>699</a> + alloc::Allocator&lt;HistogramType&gt;
<a href=#700 id=700 data-nosnippet>700</a> + alloc::Allocator&lt;HistogramPair&gt;,
<a href=#701 id=701 data-nosnippet>701</a> IntegerType: Sized + Clone,
<a href=#702 id=702 data-nosnippet>702</a>&gt;(
<a href=#703 id=703 data-nosnippet>703</a> alloc: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#704 id=704 data-nosnippet>704</a> data: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#705 id=705 data-nosnippet>705</a> length: usize,
<a href=#706 id=706 data-nosnippet>706</a> literals_per_histogram: usize,
<a href=#707 id=707 data-nosnippet>707</a> max_histograms: usize,
<a href=#708 id=708 data-nosnippet>708</a> sampling_stride_length: usize,
<a href=#709 id=709 data-nosnippet>709</a> block_switch_cost: floatX,
<a href=#710 id=710 data-nosnippet>710</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#711 id=711 data-nosnippet>711</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#712 id=712 data-nosnippet>712</a> split: <span class="kw-2">&amp;mut </span>BlockSplit&lt;Alloc&gt;,
<a href=#713 id=713 data-nosnippet>713</a>) <span class="kw">where
<a href=#714 id=714 data-nosnippet>714</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#715 id=715 data-nosnippet>715</a>{
<a href=#716 id=716 data-nosnippet>716</a> <span class="kw">let </span>data_size: usize = HistogramType::default().slice().len();
<a href=#717 id=717 data-nosnippet>717</a> <span class="kw">let </span><span class="kw-2">mut </span>num_histograms: usize = length.wrapping_div(literals_per_histogram).wrapping_add(<span class="number">1</span>);
<a href=#718 id=718 data-nosnippet>718</a> <span class="kw">if </span>num_histograms &gt; max_histograms {
<a href=#719 id=719 data-nosnippet>719</a> num_histograms = max_histograms;
<a href=#720 id=720 data-nosnippet>720</a> }
<a href=#721 id=721 data-nosnippet>721</a> <span class="kw">if </span>length == <span class="number">0usize </span>{
<a href=#722 id=722 data-nosnippet>722</a> split.num_types = <span class="number">1</span>;
<a href=#723 id=723 data-nosnippet>723</a> <span class="kw">return</span>;
<a href=#724 id=724 data-nosnippet>724</a> } <span class="kw">else if </span>length &lt; kMinLengthForBlockSplitting {
<a href=#725 id=725 data-nosnippet>725</a> {
<a href=#726 id=726 data-nosnippet>726</a> <span class="kw">if </span>split.types_alloc_size() &lt; split.num_blocks.wrapping_add(<span class="number">1</span>) {
<a href=#727 id=727 data-nosnippet>727</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>split.types_alloc_size() == <span class="number">0usize </span>{
<a href=#728 id=728 data-nosnippet>728</a> split.num_blocks.wrapping_add(<span class="number">1</span>)
<a href=#729 id=729 data-nosnippet>729</a> } <span class="kw">else </span>{
<a href=#730 id=730 data-nosnippet>730</a> split.types_alloc_size()
<a href=#731 id=731 data-nosnippet>731</a> };
<a href=#732 id=732 data-nosnippet>732</a>
<a href=#733 id=733 data-nosnippet>733</a> <span class="kw">while </span>_new_size &lt; split.num_blocks.wrapping_add(<span class="number">1</span>) {
<a href=#734 id=734 data-nosnippet>734</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#735 id=735 data-nosnippet>735</a> }
<a href=#736 id=736 data-nosnippet>736</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array = allocate::&lt;u8, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#737 id=737 data-nosnippet>737</a> new_array.slice_mut()[..split.types_alloc_size()]
<a href=#738 id=738 data-nosnippet>738</a> .clone_from_slice(<span class="kw-2">&amp;</span>split.types.slice()[..split.types_alloc_size()]);
<a href=#739 id=739 data-nosnippet>739</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(
<a href=#740 id=740 data-nosnippet>740</a> alloc,
<a href=#741 id=741 data-nosnippet>741</a> core::mem::replace(<span class="kw-2">&amp;mut </span>split.types, new_array),
<a href=#742 id=742 data-nosnippet>742</a> );
<a href=#743 id=743 data-nosnippet>743</a> }
<a href=#744 id=744 data-nosnippet>744</a> }
<a href=#745 id=745 data-nosnippet>745</a> {
<a href=#746 id=746 data-nosnippet>746</a> <span class="kw">if </span>split.lengths_alloc_size() &lt; split.num_blocks.wrapping_add(<span class="number">1</span>) {
<a href=#747 id=747 data-nosnippet>747</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>split.lengths_alloc_size() == <span class="number">0usize </span>{
<a href=#748 id=748 data-nosnippet>748</a> split.num_blocks.wrapping_add(<span class="number">1</span>)
<a href=#749 id=749 data-nosnippet>749</a> } <span class="kw">else </span>{
<a href=#750 id=750 data-nosnippet>750</a> split.lengths_alloc_size()
<a href=#751 id=751 data-nosnippet>751</a> };
<a href=#752 id=752 data-nosnippet>752</a> <span class="kw">while </span>_new_size &lt; split.num_blocks.wrapping_add(<span class="number">1</span>) {
<a href=#753 id=753 data-nosnippet>753</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#754 id=754 data-nosnippet>754</a> }
<a href=#755 id=755 data-nosnippet>755</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array = allocate::&lt;u32, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#756 id=756 data-nosnippet>756</a> new_array.slice_mut()[..split.lengths_alloc_size()]
<a href=#757 id=757 data-nosnippet>757</a> .clone_from_slice(<span class="kw-2">&amp;</span>split.lengths.slice()[..split.lengths_alloc_size()]);
<a href=#758 id=758 data-nosnippet>758</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(
<a href=#759 id=759 data-nosnippet>759</a> alloc,
<a href=#760 id=760 data-nosnippet>760</a> core::mem::replace(<span class="kw-2">&amp;mut </span>split.lengths, new_array),
<a href=#761 id=761 data-nosnippet>761</a> );
<a href=#762 id=762 data-nosnippet>762</a> }
<a href=#763 id=763 data-nosnippet>763</a> }
<a href=#764 id=764 data-nosnippet>764</a> split.num_types = <span class="number">1</span>;
<a href=#765 id=765 data-nosnippet>765</a> split.types.slice_mut()[split.num_blocks] = <span class="number">0u8</span>;
<a href=#766 id=766 data-nosnippet>766</a> split.lengths.slice_mut()[split.num_blocks] = length <span class="kw">as </span>u32;
<a href=#767 id=767 data-nosnippet>767</a> split.num_blocks = split.num_blocks.wrapping_add(<span class="number">1</span>);
<a href=#768 id=768 data-nosnippet>768</a> <span class="kw">return</span>;
<a href=#769 id=769 data-nosnippet>769</a> }
<a href=#770 id=770 data-nosnippet>770</a> <span class="kw">let </span><span class="kw-2">mut </span>histograms = allocate::&lt;HistogramType, <span class="kw">_</span>&gt;(alloc, num_histograms);
<a href=#771 id=771 data-nosnippet>771</a>
<a href=#772 id=772 data-nosnippet>772</a> InitialEntropyCodes(
<a href=#773 id=773 data-nosnippet>773</a> data,
<a href=#774 id=774 data-nosnippet>774</a> length,
<a href=#775 id=775 data-nosnippet>775</a> sampling_stride_length,
<a href=#776 id=776 data-nosnippet>776</a> num_histograms,
<a href=#777 id=777 data-nosnippet>777</a> histograms.slice_mut(),
<a href=#778 id=778 data-nosnippet>778</a> );
<a href=#779 id=779 data-nosnippet>779</a> RefineEntropyCodes(
<a href=#780 id=780 data-nosnippet>780</a> data,
<a href=#781 id=781 data-nosnippet>781</a> length,
<a href=#782 id=782 data-nosnippet>782</a> sampling_stride_length,
<a href=#783 id=783 data-nosnippet>783</a> num_histograms,
<a href=#784 id=784 data-nosnippet>784</a> histograms.slice_mut(),
<a href=#785 id=785 data-nosnippet>785</a> );
<a href=#786 id=786 data-nosnippet>786</a> {
<a href=#787 id=787 data-nosnippet>787</a> <span class="kw">let </span><span class="kw-2">mut </span>block_ids = allocate::&lt;u8, <span class="kw">_</span>&gt;(alloc, length);
<a href=#788 id=788 data-nosnippet>788</a> <span class="kw">let </span><span class="kw-2">mut </span>num_blocks: usize = <span class="number">0usize</span>;
<a href=#789 id=789 data-nosnippet>789</a> <span class="kw">let </span>bitmaplen: usize = num_histograms.wrapping_add(<span class="number">7</span>) &gt;&gt; <span class="number">3</span>;
<a href=#790 id=790 data-nosnippet>790</a> <span class="kw">let </span><span class="kw-2">mut </span>insert_cost = allocate::&lt;floatX, <span class="kw">_</span>&gt;(alloc, data_size.wrapping_mul(num_histograms));
<a href=#791 id=791 data-nosnippet>791</a> <span class="kw">let </span><span class="kw-2">mut </span>cost = allocate::&lt;Mem256f, <span class="kw">_</span>&gt;(alloc, ((num_histograms + <span class="number">7</span>) &gt;&gt; <span class="number">3</span>));
<a href=#792 id=792 data-nosnippet>792</a> <span class="kw">let </span><span class="kw-2">mut </span>switch_signal = allocate::&lt;u8, <span class="kw">_</span>&gt;(alloc, length.wrapping_mul(bitmaplen));
<a href=#793 id=793 data-nosnippet>793</a> <span class="kw">let </span><span class="kw-2">mut </span>new_id = allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, num_histograms);
<a href=#794 id=794 data-nosnippet>794</a> <span class="kw">let </span>iters: usize = (<span class="kw">if </span>params.quality &lt;= <span class="number">11 </span>{ <span class="number">3i32 </span>} <span class="kw">else </span>{ <span class="number">10i32 </span>}) <span class="kw">as </span>usize;
<a href=#795 id=795 data-nosnippet>795</a> <span class="kw">for </span>_i <span class="kw">in </span><span class="number">0usize</span>..iters {
<a href=#796 id=796 data-nosnippet>796</a> num_blocks = FindBlocks(
<a href=#797 id=797 data-nosnippet>797</a> data,
<a href=#798 id=798 data-nosnippet>798</a> length,
<a href=#799 id=799 data-nosnippet>799</a> block_switch_cost,
<a href=#800 id=800 data-nosnippet>800</a> num_histograms,
<a href=#801 id=801 data-nosnippet>801</a> histograms.slice_mut(),
<a href=#802 id=802 data-nosnippet>802</a> insert_cost.slice_mut(),
<a href=#803 id=803 data-nosnippet>803</a> cost.slice_mut(),
<a href=#804 id=804 data-nosnippet>804</a> switch_signal.slice_mut(),
<a href=#805 id=805 data-nosnippet>805</a> block_ids.slice_mut(),
<a href=#806 id=806 data-nosnippet>806</a> );
<a href=#807 id=807 data-nosnippet>807</a> num_histograms = RemapBlockIds(
<a href=#808 id=808 data-nosnippet>808</a> block_ids.slice_mut(),
<a href=#809 id=809 data-nosnippet>809</a> length,
<a href=#810 id=810 data-nosnippet>810</a> new_id.slice_mut(),
<a href=#811 id=811 data-nosnippet>811</a> num_histograms,
<a href=#812 id=812 data-nosnippet>812</a> );
<a href=#813 id=813 data-nosnippet>813</a> BuildBlockHistograms(
<a href=#814 id=814 data-nosnippet>814</a> data,
<a href=#815 id=815 data-nosnippet>815</a> length,
<a href=#816 id=816 data-nosnippet>816</a> block_ids.slice(),
<a href=#817 id=817 data-nosnippet>817</a> num_histograms,
<a href=#818 id=818 data-nosnippet>818</a> histograms.slice_mut(),
<a href=#819 id=819 data-nosnippet>819</a> );
<a href=#820 id=820 data-nosnippet>820</a> }
<a href=#821 id=821 data-nosnippet>821</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;floatX&gt;&gt;::free_cell(alloc, insert_cost);
<a href=#822 id=822 data-nosnippet>822</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;Mem256f&gt;&gt;::free_cell(alloc, cost);
<a href=#823 id=823 data-nosnippet>823</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(alloc, switch_signal);
<a href=#824 id=824 data-nosnippet>824</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::free_cell(alloc, new_id);
<a href=#825 id=825 data-nosnippet>825</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramType&gt;&gt;::free_cell(alloc, histograms);
<a href=#826 id=826 data-nosnippet>826</a> ClusterBlocks::&lt;HistogramType, Alloc, IntegerType&gt;(
<a href=#827 id=827 data-nosnippet>827</a> alloc,
<a href=#828 id=828 data-nosnippet>828</a> data,
<a href=#829 id=829 data-nosnippet>829</a> length,
<a href=#830 id=830 data-nosnippet>830</a> num_blocks,
<a href=#831 id=831 data-nosnippet>831</a> scratch_space,
<a href=#832 id=832 data-nosnippet>832</a> block_ids.slice_mut(),
<a href=#833 id=833 data-nosnippet>833</a> split,
<a href=#834 id=834 data-nosnippet>834</a> );
<a href=#835 id=835 data-nosnippet>835</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(alloc, block_ids);
<a href=#836 id=836 data-nosnippet>836</a> }
<a href=#837 id=837 data-nosnippet>837</a>}
<a href=#838 id=838 data-nosnippet>838</a>
<a href=#839 id=839 data-nosnippet>839</a><span class="kw">pub fn </span>BrotliSplitBlock&lt;
<a href=#840 id=840 data-nosnippet>840</a> Alloc: alloc::Allocator&lt;u8&gt;
<a href=#841 id=841 data-nosnippet>841</a> + alloc::Allocator&lt;u16&gt;
<a href=#842 id=842 data-nosnippet>842</a> + alloc::Allocator&lt;u32&gt;
<a href=#843 id=843 data-nosnippet>843</a> + alloc::Allocator&lt;floatX&gt;
<a href=#844 id=844 data-nosnippet>844</a> + alloc::Allocator&lt;Mem256f&gt;
<a href=#845 id=845 data-nosnippet>845</a> + alloc::Allocator&lt;HistogramLiteral&gt;
<a href=#846 id=846 data-nosnippet>846</a> + alloc::Allocator&lt;HistogramCommand&gt;
<a href=#847 id=847 data-nosnippet>847</a> + alloc::Allocator&lt;HistogramDistance&gt;
<a href=#848 id=848 data-nosnippet>848</a> + alloc::Allocator&lt;HistogramPair&gt;,
<a href=#849 id=849 data-nosnippet>849</a>&gt;(
<a href=#850 id=850 data-nosnippet>850</a> alloc: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#851 id=851 data-nosnippet>851</a> cmds: <span class="kw-2">&amp;</span>[Command],
<a href=#852 id=852 data-nosnippet>852</a> num_commands: usize,
<a href=#853 id=853 data-nosnippet>853</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#854 id=854 data-nosnippet>854</a> pos: usize,
<a href=#855 id=855 data-nosnippet>855</a> mask: usize,
<a href=#856 id=856 data-nosnippet>856</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#857 id=857 data-nosnippet>857</a> lit_scratch_space: <span class="kw-2">&amp;mut </span>&lt;HistogramLiteral <span class="kw">as </span>CostAccessors&gt;::i32vec,
<a href=#858 id=858 data-nosnippet>858</a> cmd_scratch_space: <span class="kw-2">&amp;mut </span>&lt;HistogramCommand <span class="kw">as </span>CostAccessors&gt;::i32vec,
<a href=#859 id=859 data-nosnippet>859</a> dst_scratch_space: <span class="kw-2">&amp;mut </span>&lt;HistogramDistance <span class="kw">as </span>CostAccessors&gt;::i32vec,
<a href=#860 id=860 data-nosnippet>860</a> literal_split: <span class="kw-2">&amp;mut </span>BlockSplit&lt;Alloc&gt;,
<a href=#861 id=861 data-nosnippet>861</a> insert_and_copy_split: <span class="kw-2">&amp;mut </span>BlockSplit&lt;Alloc&gt;,
<a href=#862 id=862 data-nosnippet>862</a> dist_split: <span class="kw-2">&amp;mut </span>BlockSplit&lt;Alloc&gt;,
<a href=#863 id=863 data-nosnippet>863</a>) {
<a href=#864 id=864 data-nosnippet>864</a> {
<a href=#865 id=865 data-nosnippet>865</a> <span class="comment">/*for (i, cmd) in cmds[..num_commands].iter().enumerate() {
<a href=#866 id=866 data-nosnippet>866</a> println_stderr!("C {:} {:} {:} {:} {:} {:}",
<a href=#867 id=867 data-nosnippet>867</a> i, cmd.insert_len_, cmd.copy_len_, cmd.dist_extra_, cmd.cmd_prefix_, cmd.dist_prefix_);
<a href=#868 id=868 data-nosnippet>868</a> }*/
<a href=#869 id=869 data-nosnippet>869</a> </span><span class="kw">let </span>literals_count: usize = CountLiterals(cmds, num_commands);
<a href=#870 id=870 data-nosnippet>870</a> <span class="kw">let </span><span class="kw-2">mut </span>literals = allocate::&lt;u8, <span class="kw">_</span>&gt;(alloc, literals_count);
<a href=#871 id=871 data-nosnippet>871</a> CopyLiteralsToByteArray(cmds, num_commands, data, pos, mask, literals.slice_mut());
<a href=#872 id=872 data-nosnippet>872</a> SplitByteVector::&lt;HistogramLiteral, Alloc, u8&gt;(
<a href=#873 id=873 data-nosnippet>873</a> alloc,
<a href=#874 id=874 data-nosnippet>874</a> literals.slice(),
<a href=#875 id=875 data-nosnippet>875</a> literals_count,
<a href=#876 id=876 data-nosnippet>876</a> kSymbolsPerLiteralHistogram,
<a href=#877 id=877 data-nosnippet>877</a> kMaxLiteralHistograms,
<a href=#878 id=878 data-nosnippet>878</a> kLiteralStrideLength,
<a href=#879 id=879 data-nosnippet>879</a> kLiteralBlockSwitchCost,
<a href=#880 id=880 data-nosnippet>880</a> params,
<a href=#881 id=881 data-nosnippet>881</a> lit_scratch_space,
<a href=#882 id=882 data-nosnippet>882</a> literal_split,
<a href=#883 id=883 data-nosnippet>883</a> );
<a href=#884 id=884 data-nosnippet>884</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(alloc, literals);
<a href=#885 id=885 data-nosnippet>885</a> }
<a href=#886 id=886 data-nosnippet>886</a> {
<a href=#887 id=887 data-nosnippet>887</a> <span class="kw">let </span><span class="kw-2">mut </span>insert_and_copy_codes = allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, num_commands);
<a href=#888 id=888 data-nosnippet>888</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..min(num_commands, cmds.len()) {
<a href=#889 id=889 data-nosnippet>889</a> insert_and_copy_codes.slice_mut()[i] = (cmds[i]).cmd_prefix_;
<a href=#890 id=890 data-nosnippet>890</a> }
<a href=#891 id=891 data-nosnippet>891</a> SplitByteVector::&lt;HistogramCommand, Alloc, u16&gt;(
<a href=#892 id=892 data-nosnippet>892</a> alloc,
<a href=#893 id=893 data-nosnippet>893</a> insert_and_copy_codes.slice(),
<a href=#894 id=894 data-nosnippet>894</a> num_commands,
<a href=#895 id=895 data-nosnippet>895</a> kSymbolsPerCommandHistogram,
<a href=#896 id=896 data-nosnippet>896</a> kMaxCommandHistograms,
<a href=#897 id=897 data-nosnippet>897</a> kCommandStrideLength,
<a href=#898 id=898 data-nosnippet>898</a> kCommandBlockSwitchCost,
<a href=#899 id=899 data-nosnippet>899</a> params,
<a href=#900 id=900 data-nosnippet>900</a> cmd_scratch_space,
<a href=#901 id=901 data-nosnippet>901</a> insert_and_copy_split,
<a href=#902 id=902 data-nosnippet>902</a> );
<a href=#903 id=903 data-nosnippet>903</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::free_cell(alloc, insert_and_copy_codes);
<a href=#904 id=904 data-nosnippet>904</a> }
<a href=#905 id=905 data-nosnippet>905</a> {
<a href=#906 id=906 data-nosnippet>906</a> <span class="kw">let </span><span class="kw-2">mut </span>distance_prefixes = allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, num_commands);
<a href=#907 id=907 data-nosnippet>907</a> <span class="kw">let </span><span class="kw-2">mut </span>j: usize = <span class="number">0usize</span>;
<a href=#908 id=908 data-nosnippet>908</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_commands {
<a href=#909 id=909 data-nosnippet>909</a> <span class="kw">let </span>cmd = <span class="kw-2">&amp;</span>cmds[i];
<a href=#910 id=910 data-nosnippet>910</a> <span class="kw">if </span>cmd.copy_len() != <span class="number">0 </span>&amp;&amp; cmd.cmd_prefix_ &gt;= <span class="number">128 </span>{
<a href=#911 id=911 data-nosnippet>911</a> distance_prefixes.slice_mut()[j] = cmd.dist_prefix_ &amp; <span class="number">0x03ff</span>;
<a href=#912 id=912 data-nosnippet>912</a> j = j.wrapping_add(<span class="number">1</span>);
<a href=#913 id=913 data-nosnippet>913</a> }
<a href=#914 id=914 data-nosnippet>914</a> }
<a href=#915 id=915 data-nosnippet>915</a> SplitByteVector::&lt;HistogramDistance, Alloc, u16&gt;(
<a href=#916 id=916 data-nosnippet>916</a> alloc,
<a href=#917 id=917 data-nosnippet>917</a> distance_prefixes.slice(),
<a href=#918 id=918 data-nosnippet>918</a> j,
<a href=#919 id=919 data-nosnippet>919</a> kSymbolsPerDistanceHistogram,
<a href=#920 id=920 data-nosnippet>920</a> kMaxCommandHistograms,
<a href=#921 id=921 data-nosnippet>921</a> kCommandStrideLength,
<a href=#922 id=922 data-nosnippet>922</a> kDistanceBlockSwitchCost,
<a href=#923 id=923 data-nosnippet>923</a> params,
<a href=#924 id=924 data-nosnippet>924</a> dst_scratch_space,
<a href=#925 id=925 data-nosnippet>925</a> dist_split,
<a href=#926 id=926 data-nosnippet>926</a> );
<a href=#927 id=927 data-nosnippet>927</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::free_cell(alloc, distance_prefixes);
<a href=#928 id=928 data-nosnippet>928</a> }
<a href=#929 id=929 data-nosnippet>929</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,468 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/cluster.rs`."><title>cluster.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>cluster.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::min;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>{alloc, core};
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::bit_cost::BrotliPopulationCost;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::histogram::{
<a href=#8 id=8 data-nosnippet>8</a> CostAccessors, HistogramAddHistogram, HistogramClear, HistogramSelfAddHistogram,
<a href=#9 id=9 data-nosnippet>9</a>};
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">super</span>::util::FastLog2;
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::{alloc_or_default, allocate};
<a href=#12 id=12 data-nosnippet>12</a>
<a href=#13 id=13 data-nosnippet>13</a><span class="attr">#[derive(Clone, Copy)]
<a href=#14 id=14 data-nosnippet>14</a></span><span class="kw">pub struct </span>HistogramPair {
<a href=#15 id=15 data-nosnippet>15</a> <span class="kw">pub </span>idx1: u32,
<a href=#16 id=16 data-nosnippet>16</a> <span class="kw">pub </span>idx2: u32,
<a href=#17 id=17 data-nosnippet>17</a> <span class="kw">pub </span>cost_combo: <span class="kw">super</span>::util::floatX,
<a href=#18 id=18 data-nosnippet>18</a> <span class="kw">pub </span>cost_diff: <span class="kw">super</span>::util::floatX,
<a href=#19 id=19 data-nosnippet>19</a>}
<a href=#20 id=20 data-nosnippet>20</a>
<a href=#21 id=21 data-nosnippet>21</a><span class="kw">impl </span>Default <span class="kw">for </span>HistogramPair {
<a href=#22 id=22 data-nosnippet>22</a> <span class="attr">#[inline(always)]
<a href=#23 id=23 data-nosnippet>23</a> </span><span class="kw">fn </span>default() -&gt; HistogramPair {
<a href=#24 id=24 data-nosnippet>24</a> HistogramPair {
<a href=#25 id=25 data-nosnippet>25</a> idx1: <span class="number">0</span>,
<a href=#26 id=26 data-nosnippet>26</a> idx2: <span class="number">0</span>,
<a href=#27 id=27 data-nosnippet>27</a> cost_combo: <span class="number">0.0</span>,
<a href=#28 id=28 data-nosnippet>28</a> cost_diff: <span class="number">0.0</span>,
<a href=#29 id=29 data-nosnippet>29</a> }
<a href=#30 id=30 data-nosnippet>30</a> }
<a href=#31 id=31 data-nosnippet>31</a>}
<a href=#32 id=32 data-nosnippet>32</a><span class="comment">/* Returns entropy reduction of the context map when we combine two clusters. */
<a href=#33 id=33 data-nosnippet>33</a></span><span class="attr">#[inline(always)]
<a href=#34 id=34 data-nosnippet>34</a></span><span class="kw">fn </span>ClusterCostDiff(size_a: usize, size_b: usize) -&gt; <span class="kw">super</span>::util::floatX {
<a href=#35 id=35 data-nosnippet>35</a> <span class="kw">let </span>size_c: usize = size_a.wrapping_add(size_b);
<a href=#36 id=36 data-nosnippet>36</a> size_a <span class="kw">as </span>(<span class="kw">super</span>::util::floatX) * FastLog2(size_a <span class="kw">as </span>u64)
<a href=#37 id=37 data-nosnippet>37</a> + size_b <span class="kw">as </span>(<span class="kw">super</span>::util::floatX) * FastLog2(size_b <span class="kw">as </span>u64)
<a href=#38 id=38 data-nosnippet>38</a> - size_c <span class="kw">as </span>(<span class="kw">super</span>::util::floatX) * FastLog2(size_c <span class="kw">as </span>u64)
<a href=#39 id=39 data-nosnippet>39</a>}
<a href=#40 id=40 data-nosnippet>40</a>
<a href=#41 id=41 data-nosnippet>41</a><span class="attr">#[inline(always)]
<a href=#42 id=42 data-nosnippet>42</a></span><span class="kw">fn </span>HistogramPairIsLess(p1: <span class="kw-2">&amp;</span>HistogramPair, p2: <span class="kw-2">&amp;</span>HistogramPair) -&gt; bool {
<a href=#43 id=43 data-nosnippet>43</a> <span class="kw">if </span>p1.<span class="macro">cost_diff !</span>= p2.cost_diff {
<a href=#44 id=44 data-nosnippet>44</a> p1.cost_diff &gt; p2.cost_diff
<a href=#45 id=45 data-nosnippet>45</a> } <span class="kw">else </span>{
<a href=#46 id=46 data-nosnippet>46</a> p1.idx2.wrapping_sub(p1.idx1) &gt; p2.idx2.wrapping_sub(p2.idx1)
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a>}
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a><span class="comment">/* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if
<a href=#51 id=51 data-nosnippet>51</a>it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */
<a href=#52 id=52 data-nosnippet>52</a></span><span class="kw">fn </span>BrotliCompareAndPushToQueue&lt;
<a href=#53 id=53 data-nosnippet>53</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors + Clone,
<a href=#54 id=54 data-nosnippet>54</a>&gt;(
<a href=#55 id=55 data-nosnippet>55</a> out: <span class="kw-2">&amp;</span>[HistogramType],
<a href=#56 id=56 data-nosnippet>56</a> cluster_size: <span class="kw-2">&amp;</span>[u32],
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw-2">mut </span>idx1: u32,
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw-2">mut </span>idx2: u32,
<a href=#59 id=59 data-nosnippet>59</a> max_num_pairs: usize,
<a href=#60 id=60 data-nosnippet>60</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#61 id=61 data-nosnippet>61</a> pairs: <span class="kw-2">&amp;mut </span>[HistogramPair],
<a href=#62 id=62 data-nosnippet>62</a> num_pairs: <span class="kw-2">&amp;mut </span>usize,
<a href=#63 id=63 data-nosnippet>63</a>) {
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">let </span><span class="kw-2">mut </span>is_good_pair = <span class="bool-val">false</span>;
<a href=#65 id=65 data-nosnippet>65</a> <span class="kw">let </span><span class="kw-2">mut </span>p: HistogramPair = HistogramPair {
<a href=#66 id=66 data-nosnippet>66</a> idx1: <span class="number">0</span>,
<a href=#67 id=67 data-nosnippet>67</a> idx2: <span class="number">0</span>,
<a href=#68 id=68 data-nosnippet>68</a> cost_combo: <span class="number">0.0</span>,
<a href=#69 id=69 data-nosnippet>69</a> cost_diff: <span class="number">0.0</span>,
<a href=#70 id=70 data-nosnippet>70</a> };
<a href=#71 id=71 data-nosnippet>71</a> <span class="kw">if </span>idx1 == idx2 {
<a href=#72 id=72 data-nosnippet>72</a> } <span class="kw">else </span>{
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">if </span>idx2 &lt; idx1 {
<a href=#74 id=74 data-nosnippet>74</a> core::mem::swap(<span class="kw-2">&amp;mut </span>idx2, <span class="kw-2">&amp;mut </span>idx1);
<a href=#75 id=75 data-nosnippet>75</a> }
<a href=#76 id=76 data-nosnippet>76</a> p.idx1 = idx1;
<a href=#77 id=77 data-nosnippet>77</a> p.idx2 = idx2;
<a href=#78 id=78 data-nosnippet>78</a> p.cost_diff = <span class="number">0.5
<a href=#79 id=79 data-nosnippet>79</a> </span>* ClusterCostDiff(
<a href=#80 id=80 data-nosnippet>80</a> cluster_size[idx1 <span class="kw">as </span>usize] <span class="kw">as </span>usize,
<a href=#81 id=81 data-nosnippet>81</a> cluster_size[idx2 <span class="kw">as </span>usize] <span class="kw">as </span>usize,
<a href=#82 id=82 data-nosnippet>82</a> );
<a href=#83 id=83 data-nosnippet>83</a> p.cost_diff -= (out[idx1 <span class="kw">as </span>usize]).bit_cost();
<a href=#84 id=84 data-nosnippet>84</a> p.cost_diff -= (out[idx2 <span class="kw">as </span>usize]).bit_cost();
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">if </span>(out[idx1 <span class="kw">as </span>usize]).total_count() == <span class="number">0usize </span>{
<a href=#86 id=86 data-nosnippet>86</a> p.cost_combo = (out[idx2 <span class="kw">as </span>usize]).bit_cost();
<a href=#87 id=87 data-nosnippet>87</a> is_good_pair = <span class="bool-val">true</span>;
<a href=#88 id=88 data-nosnippet>88</a> } <span class="kw">else if </span>(out[idx2 <span class="kw">as </span>usize]).total_count() == <span class="number">0usize </span>{
<a href=#89 id=89 data-nosnippet>89</a> p.cost_combo = (out[idx1 <span class="kw">as </span>usize]).bit_cost();
<a href=#90 id=90 data-nosnippet>90</a> is_good_pair = <span class="bool-val">true</span>;
<a href=#91 id=91 data-nosnippet>91</a> } <span class="kw">else </span>{
<a href=#92 id=92 data-nosnippet>92</a> <span class="kw">let </span>threshold = <span class="kw">if </span><span class="kw-2">*</span>num_pairs == <span class="number">0 </span>{
<a href=#93 id=93 data-nosnippet>93</a> <span class="number">1e38
<a href=#94 id=94 data-nosnippet>94</a> </span>} <span class="kw">else </span>{
<a href=#95 id=95 data-nosnippet>95</a> pairs[<span class="number">0</span>].cost_diff.max(<span class="number">0.0</span>)
<a href=#96 id=96 data-nosnippet>96</a> };
<a href=#97 id=97 data-nosnippet>97</a>
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">let </span><span class="kw-2">mut </span>combo: HistogramType = out[idx1 <span class="kw">as </span>usize].clone();
<a href=#99 id=99 data-nosnippet>99</a> HistogramAddHistogram(<span class="kw-2">&amp;mut </span>combo, <span class="kw-2">&amp;</span>out[idx2 <span class="kw">as </span>usize]);
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">let </span>cost_combo: <span class="kw">super</span>::util::floatX = BrotliPopulationCost(<span class="kw-2">&amp;</span>combo, scratch_space);
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">if </span>cost_combo &lt; threshold - p.cost_diff {
<a href=#102 id=102 data-nosnippet>102</a> p.cost_combo = cost_combo;
<a href=#103 id=103 data-nosnippet>103</a> is_good_pair = <span class="bool-val">true</span>;
<a href=#104 id=104 data-nosnippet>104</a> }
<a href=#105 id=105 data-nosnippet>105</a> }
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">if </span>is_good_pair {
<a href=#107 id=107 data-nosnippet>107</a> p.cost_diff += p.cost_combo;
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">if </span><span class="kw-2">*</span>num_pairs &gt; <span class="number">0usize </span>&amp;&amp; HistogramPairIsLess(<span class="kw-2">&amp;</span>pairs[<span class="number">0</span>], <span class="kw-2">&amp;</span>p) {
<a href=#109 id=109 data-nosnippet>109</a> <span class="comment">/* Replace the top of the queue if needed. */
<a href=#110 id=110 data-nosnippet>110</a> </span><span class="kw">if </span><span class="kw-2">*</span>num_pairs &lt; max_num_pairs {
<a href=#111 id=111 data-nosnippet>111</a> pairs[<span class="kw-2">*</span>num_pairs] = pairs[<span class="number">0</span>];
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw-2">*</span>num_pairs = num_pairs.wrapping_add(<span class="number">1</span>);
<a href=#113 id=113 data-nosnippet>113</a> }
<a href=#114 id=114 data-nosnippet>114</a> pairs[<span class="number">0</span>] = p;
<a href=#115 id=115 data-nosnippet>115</a> } <span class="kw">else if </span><span class="kw-2">*</span>num_pairs &lt; max_num_pairs {
<a href=#116 id=116 data-nosnippet>116</a> pairs[<span class="kw-2">*</span>num_pairs] = p;
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw-2">*</span>num_pairs = num_pairs.wrapping_add(<span class="number">1</span>);
<a href=#118 id=118 data-nosnippet>118</a> }
<a href=#119 id=119 data-nosnippet>119</a> }
<a href=#120 id=120 data-nosnippet>120</a> }
<a href=#121 id=121 data-nosnippet>121</a>}
<a href=#122 id=122 data-nosnippet>122</a>
<a href=#123 id=123 data-nosnippet>123</a><span class="kw">pub fn </span>BrotliHistogramCombine&lt;
<a href=#124 id=124 data-nosnippet>124</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors + Clone,
<a href=#125 id=125 data-nosnippet>125</a>&gt;(
<a href=#126 id=126 data-nosnippet>126</a> out: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#127 id=127 data-nosnippet>127</a> cluster_size: <span class="kw-2">&amp;mut </span>[u32],
<a href=#128 id=128 data-nosnippet>128</a> symbols: <span class="kw-2">&amp;mut </span>[u32],
<a href=#129 id=129 data-nosnippet>129</a> clusters: <span class="kw-2">&amp;mut </span>[u32],
<a href=#130 id=130 data-nosnippet>130</a> pairs: <span class="kw-2">&amp;mut </span>[HistogramPair],
<a href=#131 id=131 data-nosnippet>131</a> <span class="kw-2">mut </span>num_clusters: usize,
<a href=#132 id=132 data-nosnippet>132</a> symbols_size: usize,
<a href=#133 id=133 data-nosnippet>133</a> max_clusters: usize,
<a href=#134 id=134 data-nosnippet>134</a> max_num_pairs: usize,
<a href=#135 id=135 data-nosnippet>135</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#136 id=136 data-nosnippet>136</a>) -&gt; usize {
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">let </span><span class="kw-2">mut </span>cost_diff_threshold: <span class="kw">super</span>::util::floatX = <span class="number">0.0</span>;
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">let </span><span class="kw-2">mut </span>min_cluster_size: usize = <span class="number">1</span>;
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">let </span><span class="kw-2">mut </span>num_pairs: usize = <span class="number">0usize</span>;
<a href=#140 id=140 data-nosnippet>140</a> {
<a href=#141 id=141 data-nosnippet>141</a> <span class="comment">/* We maintain a vector of histogram pairs, with the property that the pair
<a href=#142 id=142 data-nosnippet>142</a> with the maximum bit cost reduction is the first. */
<a href=#143 id=143 data-nosnippet>143</a> </span><span class="kw">for </span>idx1 <span class="kw">in </span><span class="number">0</span>..num_clusters {
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw">for </span>idx2 <span class="kw">in </span>idx1 + <span class="number">1</span>..num_clusters {
<a href=#145 id=145 data-nosnippet>145</a> BrotliCompareAndPushToQueue(
<a href=#146 id=146 data-nosnippet>146</a> out,
<a href=#147 id=147 data-nosnippet>147</a> cluster_size,
<a href=#148 id=148 data-nosnippet>148</a> clusters[idx1],
<a href=#149 id=149 data-nosnippet>149</a> clusters[idx2],
<a href=#150 id=150 data-nosnippet>150</a> max_num_pairs,
<a href=#151 id=151 data-nosnippet>151</a> scratch_space,
<a href=#152 id=152 data-nosnippet>152</a> pairs,
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw-2">&amp;mut </span>num_pairs,
<a href=#154 id=154 data-nosnippet>154</a> );
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a> }
<a href=#157 id=157 data-nosnippet>157</a> }
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">while </span>num_clusters &gt; min_cluster_size {
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">if </span>(pairs[<span class="number">0</span>]).cost_diff &gt;= cost_diff_threshold {
<a href=#161 id=161 data-nosnippet>161</a> cost_diff_threshold = <span class="number">1e38</span>;
<a href=#162 id=162 data-nosnippet>162</a> min_cluster_size = max_clusters;
<a href=#163 id=163 data-nosnippet>163</a> {
<a href=#164 id=164 data-nosnippet>164</a> <span class="kw">continue</span>;
<a href=#165 id=165 data-nosnippet>165</a> }
<a href=#166 id=166 data-nosnippet>166</a> }
<a href=#167 id=167 data-nosnippet>167</a> <span class="comment">/* Take the best pair from the top of heap. */
<a href=#168 id=168 data-nosnippet>168</a> </span><span class="kw">let </span>best_idx1: u32 = (pairs[<span class="number">0</span>]).idx1;
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">let </span>best_idx2: u32 = (pairs[<span class="number">0</span>]).idx2;
<a href=#170 id=170 data-nosnippet>170</a> HistogramSelfAddHistogram(out, (best_idx1 <span class="kw">as </span>usize), (best_idx2 <span class="kw">as </span>usize));
<a href=#171 id=171 data-nosnippet>171</a> (out[(best_idx1 <span class="kw">as </span>usize)]).set_bit_cost((pairs[<span class="number">0</span>]).cost_combo);
<a href=#172 id=172 data-nosnippet>172</a> {
<a href=#173 id=173 data-nosnippet>173</a> <span class="kw">let </span>_rhs = cluster_size[(best_idx2 <span class="kw">as </span>usize)];
<a href=#174 id=174 data-nosnippet>174</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>cluster_size[(best_idx1 <span class="kw">as </span>usize)];
<a href=#175 id=175 data-nosnippet>175</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs);
<a href=#176 id=176 data-nosnippet>176</a> }
<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..symbols_size {
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">if </span>symbols[i] == best_idx2 {
<a href=#179 id=179 data-nosnippet>179</a> symbols[i] = best_idx1;
<a href=#180 id=180 data-nosnippet>180</a> }
<a href=#181 id=181 data-nosnippet>181</a> }
<a href=#182 id=182 data-nosnippet>182</a> i = <span class="number">0usize</span>;
<a href=#183 id=183 data-nosnippet>183</a> <span class="lifetime">'break9</span>: <span class="kw">while </span>i &lt; num_clusters {
<a href=#184 id=184 data-nosnippet>184</a> {
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">if </span>clusters[i] == best_idx2 {
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw">for </span>offset <span class="kw">in </span><span class="number">0</span>..(num_clusters - i - <span class="number">1</span>) {
<a href=#187 id=187 data-nosnippet>187</a> clusters[i + offset] = clusters[i + <span class="number">1 </span>+ offset];
<a href=#188 id=188 data-nosnippet>188</a> }
<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">break </span><span class="lifetime">'break9</span>;
<a href=#190 id=190 data-nosnippet>190</a> }
<a href=#191 id=191 data-nosnippet>191</a> }
<a href=#192 id=192 data-nosnippet>192</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a> num_clusters = num_clusters.wrapping_sub(<span class="number">1</span>);
<a href=#195 id=195 data-nosnippet>195</a> {
<a href=#196 id=196 data-nosnippet>196</a> <span class="comment">/* Remove pairs intersecting the just combined best pair. */
<a href=#197 id=197 data-nosnippet>197</a> </span><span class="kw">let </span><span class="kw-2">mut </span>copy_to_idx: usize = <span class="number">0usize</span>;
<a href=#198 id=198 data-nosnippet>198</a> i = <span class="number">0usize</span>;
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">while </span>i &lt; num_pairs {
<a href=#200 id=200 data-nosnippet>200</a> <span class="lifetime">'continue12</span>: <span class="kw">loop </span>{
<a href=#201 id=201 data-nosnippet>201</a> {
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">let </span>p: HistogramPair = pairs[i];
<a href=#203 id=203 data-nosnippet>203</a> <span class="kw">if </span>(p).idx1 == best_idx1
<a href=#204 id=204 data-nosnippet>204</a> || (p).idx2 == best_idx1
<a href=#205 id=205 data-nosnippet>205</a> || (p).idx1 == best_idx2
<a href=#206 id=206 data-nosnippet>206</a> || (p).idx2 == best_idx2
<a href=#207 id=207 data-nosnippet>207</a> {
<a href=#208 id=208 data-nosnippet>208</a> <span class="comment">/* Remove invalid pair from the queue. */
<a href=#209 id=209 data-nosnippet>209</a> </span><span class="kw">break </span><span class="lifetime">'continue12</span>;
<a href=#210 id=210 data-nosnippet>210</a> }
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">if </span>HistogramPairIsLess(<span class="kw-2">&amp;</span>pairs[<span class="number">0</span>], <span class="kw-2">&amp;</span>p) {
<a href=#212 id=212 data-nosnippet>212</a> <span class="comment">/* Replace the top of the queue if needed. */
<a href=#213 id=213 data-nosnippet>213</a> </span><span class="kw">let </span>front: HistogramPair = pairs[<span class="number">0</span>];
<a href=#214 id=214 data-nosnippet>214</a> pairs[<span class="number">0</span>] = p;
<a href=#215 id=215 data-nosnippet>215</a> pairs[copy_to_idx] = front;
<a href=#216 id=216 data-nosnippet>216</a> } <span class="kw">else </span>{
<a href=#217 id=217 data-nosnippet>217</a> pairs[copy_to_idx] = p;
<a href=#218 id=218 data-nosnippet>218</a> }
<a href=#219 id=219 data-nosnippet>219</a> copy_to_idx = copy_to_idx.wrapping_add(<span class="number">1</span>);
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">break</span>;
<a href=#222 id=222 data-nosnippet>222</a> }
<a href=#223 id=223 data-nosnippet>223</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#224 id=224 data-nosnippet>224</a> }
<a href=#225 id=225 data-nosnippet>225</a> num_pairs = copy_to_idx;
<a href=#226 id=226 data-nosnippet>226</a> }
<a href=#227 id=227 data-nosnippet>227</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_clusters {
<a href=#228 id=228 data-nosnippet>228</a> BrotliCompareAndPushToQueue(
<a href=#229 id=229 data-nosnippet>229</a> out,
<a href=#230 id=230 data-nosnippet>230</a> cluster_size,
<a href=#231 id=231 data-nosnippet>231</a> best_idx1,
<a href=#232 id=232 data-nosnippet>232</a> clusters[i],
<a href=#233 id=233 data-nosnippet>233</a> max_num_pairs,
<a href=#234 id=234 data-nosnippet>234</a> scratch_space,
<a href=#235 id=235 data-nosnippet>235</a> pairs,
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw-2">&amp;mut </span>num_pairs,
<a href=#237 id=237 data-nosnippet>237</a> );
<a href=#238 id=238 data-nosnippet>238</a> }
<a href=#239 id=239 data-nosnippet>239</a> }
<a href=#240 id=240 data-nosnippet>240</a> num_clusters
<a href=#241 id=241 data-nosnippet>241</a>}
<a href=#242 id=242 data-nosnippet>242</a>
<a href=#243 id=243 data-nosnippet>243</a><span class="comment">/* What is the bit cost of moving histogram from cur_symbol to candidate. */
<a href=#244 id=244 data-nosnippet>244</a></span><span class="attr">#[inline(always)]
<a href=#245 id=245 data-nosnippet>245</a></span><span class="kw">pub fn </span>BrotliHistogramBitCostDistance&lt;
<a href=#246 id=246 data-nosnippet>246</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors + Clone,
<a href=#247 id=247 data-nosnippet>247</a>&gt;(
<a href=#248 id=248 data-nosnippet>248</a> histogram: <span class="kw-2">&amp;</span>HistogramType,
<a href=#249 id=249 data-nosnippet>249</a> candidate: <span class="kw-2">&amp;</span>HistogramType,
<a href=#250 id=250 data-nosnippet>250</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#251 id=251 data-nosnippet>251</a>) -&gt; <span class="kw">super</span>::util::floatX {
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">if </span>histogram.total_count() == <span class="number">0usize </span>{
<a href=#253 id=253 data-nosnippet>253</a> <span class="number">0.0
<a href=#254 id=254 data-nosnippet>254</a> </span>} <span class="kw">else </span>{
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp: HistogramType = histogram.clone();
<a href=#256 id=256 data-nosnippet>256</a> HistogramAddHistogram(<span class="kw-2">&amp;mut </span>tmp, candidate);
<a href=#257 id=257 data-nosnippet>257</a> BrotliPopulationCost(<span class="kw-2">&amp;</span>tmp, scratch_space) - candidate.bit_cost()
<a href=#258 id=258 data-nosnippet>258</a> }
<a href=#259 id=259 data-nosnippet>259</a>}
<a href=#260 id=260 data-nosnippet>260</a>
<a href=#261 id=261 data-nosnippet>261</a><span class="comment">/* Find the best 'out' histogram for each of the 'in' histograms.
<a href=#262 id=262 data-nosnippet>262</a>When called, clusters[0..num_clusters) contains the unique values from
<a href=#263 id=263 data-nosnippet>263</a>symbols[0..in_size), but this property is not preserved in this function.
<a href=#264 id=264 data-nosnippet>264</a>Note: we assume that out[]-&gt;bit_cost_ is already up-to-date. */
<a href=#265 id=265 data-nosnippet>265</a>
<a href=#266 id=266 data-nosnippet>266</a></span><span class="kw">pub fn </span>BrotliHistogramRemap&lt;
<a href=#267 id=267 data-nosnippet>267</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors + Clone,
<a href=#268 id=268 data-nosnippet>268</a>&gt;(
<a href=#269 id=269 data-nosnippet>269</a> inp: <span class="kw-2">&amp;</span>[HistogramType],
<a href=#270 id=270 data-nosnippet>270</a> in_size: usize,
<a href=#271 id=271 data-nosnippet>271</a> clusters: <span class="kw-2">&amp;</span>[u32],
<a href=#272 id=272 data-nosnippet>272</a> num_clusters: usize,
<a href=#273 id=273 data-nosnippet>273</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#274 id=274 data-nosnippet>274</a> out: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#275 id=275 data-nosnippet>275</a> symbols: <span class="kw-2">&amp;mut </span>[u32],
<a href=#276 id=276 data-nosnippet>276</a>) {
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..in_size {
<a href=#278 id=278 data-nosnippet>278</a> <span class="kw">let </span><span class="kw-2">mut </span>best_out: u32 = <span class="kw">if </span>i == <span class="number">0usize </span>{
<a href=#279 id=279 data-nosnippet>279</a> symbols[<span class="number">0</span>]
<a href=#280 id=280 data-nosnippet>280</a> } <span class="kw">else </span>{
<a href=#281 id=281 data-nosnippet>281</a> symbols[i.wrapping_sub(<span class="number">1</span>)]
<a href=#282 id=282 data-nosnippet>282</a> };
<a href=#283 id=283 data-nosnippet>283</a> <span class="kw">let </span><span class="kw-2">mut </span>best_bits: <span class="kw">super</span>::util::floatX =
<a href=#284 id=284 data-nosnippet>284</a> BrotliHistogramBitCostDistance(<span class="kw-2">&amp;</span>inp[i], <span class="kw-2">&amp;mut </span>out[(best_out <span class="kw">as </span>usize)], scratch_space);
<a href=#285 id=285 data-nosnippet>285</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_clusters {
<a href=#286 id=286 data-nosnippet>286</a> <span class="kw">let </span>cur_bits: <span class="kw">super</span>::util::floatX = BrotliHistogramBitCostDistance(
<a href=#287 id=287 data-nosnippet>287</a> <span class="kw-2">&amp;</span>inp[i],
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw-2">&amp;mut </span>out[(clusters[j] <span class="kw">as </span>usize)],
<a href=#289 id=289 data-nosnippet>289</a> scratch_space,
<a href=#290 id=290 data-nosnippet>290</a> );
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw">if </span>cur_bits &lt; best_bits {
<a href=#292 id=292 data-nosnippet>292</a> best_bits = cur_bits;
<a href=#293 id=293 data-nosnippet>293</a> best_out = clusters[j];
<a href=#294 id=294 data-nosnippet>294</a> }
<a href=#295 id=295 data-nosnippet>295</a> }
<a href=#296 id=296 data-nosnippet>296</a> symbols[i] = best_out;
<a href=#297 id=297 data-nosnippet>297</a> }
<a href=#298 id=298 data-nosnippet>298</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_clusters {
<a href=#299 id=299 data-nosnippet>299</a> HistogramClear(<span class="kw-2">&amp;mut </span>out[(clusters[i] <span class="kw">as </span>usize)]);
<a href=#300 id=300 data-nosnippet>300</a> }
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..in_size {
<a href=#302 id=302 data-nosnippet>302</a> HistogramAddHistogram(<span class="kw-2">&amp;mut </span>out[(symbols[i] <span class="kw">as </span>usize)], <span class="kw-2">&amp;</span>inp[i]);
<a href=#303 id=303 data-nosnippet>303</a> }
<a href=#304 id=304 data-nosnippet>304</a>}
<a href=#305 id=305 data-nosnippet>305</a>
<a href=#306 id=306 data-nosnippet>306</a><span class="comment">/* Reorders elements of the out[0..length) array and changes values in
<a href=#307 id=307 data-nosnippet>307</a>symbols[0..length) array in the following way:
<a href=#308 id=308 data-nosnippet>308</a> * when called, symbols[] contains indexes into out[], and has N unique
<a href=#309 id=309 data-nosnippet>309</a> values (possibly N &lt; length)
<a href=#310 id=310 data-nosnippet>310</a> * on return, symbols'[i] = f(symbols[i]) and
<a href=#311 id=311 data-nosnippet>311</a> out'[symbols'[i]] = out[symbols[i]], for each 0 &lt;= i &lt; length,
<a href=#312 id=312 data-nosnippet>312</a> where f is a bijection between the range of symbols[] and [0..N), and
<a href=#313 id=313 data-nosnippet>313</a> the first occurrences of values in symbols'[i] come in consecutive
<a href=#314 id=314 data-nosnippet>314</a> increasing order.
<a href=#315 id=315 data-nosnippet>315</a>Returns N, the number of unique values in symbols[]. */
<a href=#316 id=316 data-nosnippet>316</a></span><span class="kw">pub fn </span>BrotliHistogramReindex&lt;
<a href=#317 id=317 data-nosnippet>317</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors + Clone,
<a href=#318 id=318 data-nosnippet>318</a> Alloc: alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;HistogramType&gt;,
<a href=#319 id=319 data-nosnippet>319</a>&gt;(
<a href=#320 id=320 data-nosnippet>320</a> alloc: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#321 id=321 data-nosnippet>321</a> out: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#322 id=322 data-nosnippet>322</a> symbols: <span class="kw-2">&amp;mut </span>[u32],
<a href=#323 id=323 data-nosnippet>323</a> length: usize,
<a href=#324 id=324 data-nosnippet>324</a>) -&gt; usize {
<a href=#325 id=325 data-nosnippet>325</a> <span class="kw">static </span>kInvalidIndex: u32 = u32::MAX;
<a href=#326 id=326 data-nosnippet>326</a> <span class="kw">let </span><span class="kw-2">mut </span>new_index = alloc_or_default::&lt;u32, <span class="kw">_</span>&gt;(alloc, length);
<a href=#327 id=327 data-nosnippet>327</a> <span class="kw">let </span><span class="kw-2">mut </span>next_index: u32;
<a href=#328 id=328 data-nosnippet>328</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp: &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramType&gt;&gt;::AllocatedMemory;
<a href=#329 id=329 data-nosnippet>329</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#330 id=330 data-nosnippet>330</a> new_index.slice_mut()[i] = kInvalidIndex;
<a href=#331 id=331 data-nosnippet>331</a> }
<a href=#332 id=332 data-nosnippet>332</a> next_index = <span class="number">0u32</span>;
<a href=#333 id=333 data-nosnippet>333</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">if </span>new_index.slice()[(symbols[i] <span class="kw">as </span>usize)] == kInvalidIndex {
<a href=#335 id=335 data-nosnippet>335</a> new_index.slice_mut()[(symbols[i] <span class="kw">as </span>usize)] = next_index;
<a href=#336 id=336 data-nosnippet>336</a> next_index = next_index.wrapping_add(<span class="number">1</span>);
<a href=#337 id=337 data-nosnippet>337</a> }
<a href=#338 id=338 data-nosnippet>338</a> }
<a href=#339 id=339 data-nosnippet>339</a> tmp = alloc_or_default::&lt;HistogramType, <span class="kw">_</span>&gt;(alloc, next_index <span class="kw">as </span>usize);
<a href=#340 id=340 data-nosnippet>340</a> next_index = <span class="number">0u32</span>;
<a href=#341 id=341 data-nosnippet>341</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#342 id=342 data-nosnippet>342</a> <span class="kw">if </span>new_index.slice()[(symbols[i] <span class="kw">as </span>usize)] == next_index {
<a href=#343 id=343 data-nosnippet>343</a> tmp.slice_mut()[(next_index <span class="kw">as </span>usize)] = out[(symbols[i] <span class="kw">as </span>usize)].clone();
<a href=#344 id=344 data-nosnippet>344</a> next_index = next_index.wrapping_add(<span class="number">1</span>);
<a href=#345 id=345 data-nosnippet>345</a> }
<a href=#346 id=346 data-nosnippet>346</a> symbols[i] = new_index.slice()[(symbols[i] <span class="kw">as </span>usize)];
<a href=#347 id=347 data-nosnippet>347</a> }
<a href=#348 id=348 data-nosnippet>348</a> {
<a href=#349 id=349 data-nosnippet>349</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, new_index);
<a href=#350 id=350 data-nosnippet>350</a> }
<a href=#351 id=351 data-nosnippet>351</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..next_index <span class="kw">as </span>usize {
<a href=#352 id=352 data-nosnippet>352</a> out[i] = tmp.slice()[i].clone();
<a href=#353 id=353 data-nosnippet>353</a> }
<a href=#354 id=354 data-nosnippet>354</a> {
<a href=#355 id=355 data-nosnippet>355</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramType&gt;&gt;::free_cell(alloc, tmp)
<a href=#356 id=356 data-nosnippet>356</a> }
<a href=#357 id=357 data-nosnippet>357</a> next_index <span class="kw">as </span>usize
<a href=#358 id=358 data-nosnippet>358</a>}
<a href=#359 id=359 data-nosnippet>359</a>
<a href=#360 id=360 data-nosnippet>360</a><span class="kw">pub fn </span>BrotliClusterHistograms&lt;
<a href=#361 id=361 data-nosnippet>361</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors + Clone,
<a href=#362 id=362 data-nosnippet>362</a> Alloc: alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;HistogramPair&gt; + alloc::Allocator&lt;HistogramType&gt;,
<a href=#363 id=363 data-nosnippet>363</a>&gt;(
<a href=#364 id=364 data-nosnippet>364</a> alloc: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#365 id=365 data-nosnippet>365</a> inp: <span class="kw-2">&amp;</span>[HistogramType],
<a href=#366 id=366 data-nosnippet>366</a> in_size: usize,
<a href=#367 id=367 data-nosnippet>367</a> max_histograms: usize,
<a href=#368 id=368 data-nosnippet>368</a> scratch_space: <span class="kw-2">&amp;mut </span>HistogramType::i32vec,
<a href=#369 id=369 data-nosnippet>369</a> out: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#370 id=370 data-nosnippet>370</a> out_size: <span class="kw-2">&amp;mut </span>usize,
<a href=#371 id=371 data-nosnippet>371</a> histogram_symbols: <span class="kw-2">&amp;mut </span>[u32],
<a href=#372 id=372 data-nosnippet>372</a>) {
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw">let </span><span class="kw-2">mut </span>cluster_size = alloc_or_default::&lt;u32, Alloc&gt;(alloc, in_size);
<a href=#374 id=374 data-nosnippet>374</a> <span class="kw">let </span><span class="kw-2">mut </span>clusters = alloc_or_default::&lt;u32, Alloc&gt;(alloc, in_size);
<a href=#375 id=375 data-nosnippet>375</a> <span class="kw">let </span><span class="kw-2">mut </span>num_clusters: usize = <span class="number">0usize</span>;
<a href=#376 id=376 data-nosnippet>376</a> <span class="kw">let </span>max_input_histograms: usize = <span class="number">64usize</span>;
<a href=#377 id=377 data-nosnippet>377</a> <span class="kw">let </span>pairs_capacity: usize = max_input_histograms
<a href=#378 id=378 data-nosnippet>378</a> .wrapping_mul(max_input_histograms)
<a href=#379 id=379 data-nosnippet>379</a> .wrapping_div(<span class="number">2</span>);
<a href=#380 id=380 data-nosnippet>380</a> <span class="kw">let </span><span class="kw-2">mut </span>pairs = allocate::&lt;HistogramPair, <span class="kw">_</span>&gt;(alloc, pairs_capacity.wrapping_add(<span class="number">1</span>));
<a href=#381 id=381 data-nosnippet>381</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#382 id=382 data-nosnippet>382</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..in_size {
<a href=#383 id=383 data-nosnippet>383</a> cluster_size.slice_mut()[i] = <span class="number">1u32</span>;
<a href=#384 id=384 data-nosnippet>384</a> }
<a href=#385 id=385 data-nosnippet>385</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..in_size {
<a href=#386 id=386 data-nosnippet>386</a> out[i] = inp[i].clone();
<a href=#387 id=387 data-nosnippet>387</a> (out[i]).set_bit_cost(BrotliPopulationCost(<span class="kw-2">&amp;</span>inp[i], scratch_space));
<a href=#388 id=388 data-nosnippet>388</a> histogram_symbols[i] = i <span class="kw">as </span>u32;
<a href=#389 id=389 data-nosnippet>389</a> }
<a href=#390 id=390 data-nosnippet>390</a> i = <span class="number">0usize</span>;
<a href=#391 id=391 data-nosnippet>391</a> <span class="kw">while </span>i &lt; in_size {
<a href=#392 id=392 data-nosnippet>392</a> {
<a href=#393 id=393 data-nosnippet>393</a> <span class="kw">let </span>num_to_combine: usize = min(in_size.wrapping_sub(i), max_input_histograms);
<a href=#394 id=394 data-nosnippet>394</a>
<a href=#395 id=395 data-nosnippet>395</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0usize</span>..num_to_combine {
<a href=#396 id=396 data-nosnippet>396</a> clusters.slice_mut()[num_clusters.wrapping_add(j)] = i.wrapping_add(j) <span class="kw">as </span>u32;
<a href=#397 id=397 data-nosnippet>397</a> }
<a href=#398 id=398 data-nosnippet>398</a> <span class="kw">let </span>num_new_clusters: usize = BrotliHistogramCombine(
<a href=#399 id=399 data-nosnippet>399</a> out,
<a href=#400 id=400 data-nosnippet>400</a> cluster_size.slice_mut(),
<a href=#401 id=401 data-nosnippet>401</a> <span class="kw-2">&amp;mut </span>histogram_symbols[i..],
<a href=#402 id=402 data-nosnippet>402</a> <span class="kw-2">&amp;mut </span>clusters.slice_mut()[num_clusters..],
<a href=#403 id=403 data-nosnippet>403</a> pairs.slice_mut(),
<a href=#404 id=404 data-nosnippet>404</a> num_to_combine,
<a href=#405 id=405 data-nosnippet>405</a> num_to_combine,
<a href=#406 id=406 data-nosnippet>406</a> max_histograms,
<a href=#407 id=407 data-nosnippet>407</a> pairs_capacity,
<a href=#408 id=408 data-nosnippet>408</a> scratch_space,
<a href=#409 id=409 data-nosnippet>409</a> );
<a href=#410 id=410 data-nosnippet>410</a> num_clusters = num_clusters.wrapping_add(num_new_clusters);
<a href=#411 id=411 data-nosnippet>411</a> }
<a href=#412 id=412 data-nosnippet>412</a> i = i.wrapping_add(max_input_histograms);
<a href=#413 id=413 data-nosnippet>413</a> }
<a href=#414 id=414 data-nosnippet>414</a> {
<a href=#415 id=415 data-nosnippet>415</a> <span class="kw">let </span>max_num_pairs: usize = min(
<a href=#416 id=416 data-nosnippet>416</a> (<span class="number">64usize</span>).wrapping_mul(num_clusters),
<a href=#417 id=417 data-nosnippet>417</a> num_clusters.wrapping_div(<span class="number">2</span>).wrapping_mul(num_clusters),
<a href=#418 id=418 data-nosnippet>418</a> );
<a href=#419 id=419 data-nosnippet>419</a> {
<a href=#420 id=420 data-nosnippet>420</a> <span class="kw">if </span>pairs_capacity &lt; max_num_pairs.wrapping_add(<span class="number">1</span>) {
<a href=#421 id=421 data-nosnippet>421</a> <span class="kw">let </span><span class="kw-2">mut </span>_new_size: usize = <span class="kw">if </span>pairs_capacity == <span class="number">0usize </span>{
<a href=#422 id=422 data-nosnippet>422</a> max_num_pairs.wrapping_add(<span class="number">1</span>)
<a href=#423 id=423 data-nosnippet>423</a> } <span class="kw">else </span>{
<a href=#424 id=424 data-nosnippet>424</a> pairs_capacity
<a href=#425 id=425 data-nosnippet>425</a> };
<a href=#426 id=426 data-nosnippet>426</a> <span class="kw">let </span><span class="kw-2">mut </span>new_array: &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramPair&gt;&gt;::AllocatedMemory;
<a href=#427 id=427 data-nosnippet>427</a> <span class="kw">while </span>_new_size &lt; max_num_pairs.wrapping_add(<span class="number">1</span>) {
<a href=#428 id=428 data-nosnippet>428</a> _new_size = _new_size.wrapping_mul(<span class="number">2</span>);
<a href=#429 id=429 data-nosnippet>429</a> }
<a href=#430 id=430 data-nosnippet>430</a> new_array = alloc_or_default::&lt;HistogramPair, <span class="kw">_</span>&gt;(alloc, _new_size);
<a href=#431 id=431 data-nosnippet>431</a> new_array.slice_mut()[..pairs_capacity]
<a href=#432 id=432 data-nosnippet>432</a> .clone_from_slice(<span class="kw-2">&amp;</span>pairs.slice()[..pairs_capacity]);
<a href=#433 id=433 data-nosnippet>433</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramPair&gt;&gt;::free_cell(
<a href=#434 id=434 data-nosnippet>434</a> alloc,
<a href=#435 id=435 data-nosnippet>435</a> core::mem::replace(<span class="kw-2">&amp;mut </span>pairs, new_array),
<a href=#436 id=436 data-nosnippet>436</a> );
<a href=#437 id=437 data-nosnippet>437</a> }
<a href=#438 id=438 data-nosnippet>438</a> }
<a href=#439 id=439 data-nosnippet>439</a> num_clusters = BrotliHistogramCombine(
<a href=#440 id=440 data-nosnippet>440</a> out,
<a href=#441 id=441 data-nosnippet>441</a> cluster_size.slice_mut(),
<a href=#442 id=442 data-nosnippet>442</a> histogram_symbols,
<a href=#443 id=443 data-nosnippet>443</a> clusters.slice_mut(),
<a href=#444 id=444 data-nosnippet>444</a> pairs.slice_mut(),
<a href=#445 id=445 data-nosnippet>445</a> num_clusters,
<a href=#446 id=446 data-nosnippet>446</a> in_size,
<a href=#447 id=447 data-nosnippet>447</a> max_histograms,
<a href=#448 id=448 data-nosnippet>448</a> max_num_pairs,
<a href=#449 id=449 data-nosnippet>449</a> scratch_space,
<a href=#450 id=450 data-nosnippet>450</a> );
<a href=#451 id=451 data-nosnippet>451</a> }
<a href=#452 id=452 data-nosnippet>452</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;HistogramPair&gt;&gt;::free_cell(alloc, pairs);
<a href=#453 id=453 data-nosnippet>453</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, cluster_size);
<a href=#454 id=454 data-nosnippet>454</a> BrotliHistogramRemap(
<a href=#455 id=455 data-nosnippet>455</a> inp,
<a href=#456 id=456 data-nosnippet>456</a> in_size,
<a href=#457 id=457 data-nosnippet>457</a> clusters.slice(),
<a href=#458 id=458 data-nosnippet>458</a> num_clusters,
<a href=#459 id=459 data-nosnippet>459</a> scratch_space,
<a href=#460 id=460 data-nosnippet>460</a> out,
<a href=#461 id=461 data-nosnippet>461</a> histogram_symbols,
<a href=#462 id=462 data-nosnippet>462</a> );
<a href=#463 id=463 data-nosnippet>463</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::free_cell(alloc, clusters);
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw-2">*</span>out_size = BrotliHistogramReindex(alloc, out, histogram_symbols, in_size);
<a href=#465 id=465 data-nosnippet>465</a>}
<a href=#466 id=466 data-nosnippet>466</a>
<a href=#467 id=467 data-nosnippet>467</a><span class="comment">/////////// DONE //////////////////////////
</span></code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,553 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/combined_alloc.rs`."><title>combined_alloc.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>combined_alloc.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">pub use </span>alloc::Allocator;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">use </span>alloc_stdlib::StandardAlloc;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::cluster::HistogramPair;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::command::Command;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::entropy_encode::HuffmanTree;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">super</span>::hash_to_binary_tree::ZopfliNode;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">super</span>::histogram::{ContextType, HistogramCommand, HistogramDistance, HistogramLiteral};
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">super</span>::interface::StaticCommand;
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use </span><span class="kw">super</span>::util::floatX;
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use super</span>::{s16, v8, PDF};
<a href=#14 id=14 data-nosnippet>14</a><span class="comment">/*
<a href=#15 id=15 data-nosnippet>15</a>struct CombiningAllocator&lt;T1, T2, AllocT1:Allocator&lt;T1&gt;, AllocT2:Allocator&lt;T2&gt;&gt;(AllocT1, AllocT2);
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a>impl &lt;T1, T2, AllocT1:Allocator&lt;T1&gt;, AllocT2:Allocator&lt;T2&gt;&gt; CombiningAllocator&lt;T1, T2, AllocT1, AllocT2&gt; {
<a href=#18 id=18 data-nosnippet>18</a> pub fn new(a: AllocT1, b: AllocT2) -&gt; Self {
<a href=#19 id=19 data-nosnippet>19</a> CombiningAllocator(a, b)
<a href=#20 id=20 data-nosnippet>20</a> }
<a href=#21 id=21 data-nosnippet>21</a>}
<a href=#22 id=22 data-nosnippet>22</a>
<a href=#23 id=23 data-nosnippet>23</a>impl &lt;T1, T2, AllocT1:Allocator&lt;T1&gt;, AllocT2:Allocator&lt;T2&gt;&gt; Allocator&lt;T1&gt; for CombiningAllocator&lt;T1, T2, AllocT1, AllocT2&gt; {
<a href=#24 id=24 data-nosnippet>24</a>
<a href=#25 id=25 data-nosnippet>25</a>}
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a>
<a href=#28 id=28 data-nosnippet>28</a>impl &lt;T1, T2, AllocT1:Allocator&lt;T1&gt;, AllocT2:Allocator&lt;T2&gt;&gt; Allocator&lt;T2&gt; for CombiningAllocator&lt;T1, T2, AllocT1, AllocT2&gt; {
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a>}
<a href=#31 id=31 data-nosnippet>31</a>*/
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a></span><span class="kw">pub trait </span>BrotliAlloc:
<a href=#34 id=34 data-nosnippet>34</a> Allocator&lt;u8&gt;
<a href=#35 id=35 data-nosnippet>35</a> + Allocator&lt;u16&gt;
<a href=#36 id=36 data-nosnippet>36</a> + Allocator&lt;i32&gt;
<a href=#37 id=37 data-nosnippet>37</a> + Allocator&lt;u32&gt;
<a href=#38 id=38 data-nosnippet>38</a> + Allocator&lt;u64&gt;
<a href=#39 id=39 data-nosnippet>39</a> + Allocator&lt;Command&gt;
<a href=#40 id=40 data-nosnippet>40</a> + Allocator&lt;<span class="kw">super</span>::util::floatX&gt;
<a href=#41 id=41 data-nosnippet>41</a> + Allocator&lt;v8&gt;
<a href=#42 id=42 data-nosnippet>42</a> + Allocator&lt;s16&gt;
<a href=#43 id=43 data-nosnippet>43</a> + Allocator&lt;PDF&gt;
<a href=#44 id=44 data-nosnippet>44</a> + Allocator&lt;StaticCommand&gt;
<a href=#45 id=45 data-nosnippet>45</a> + Allocator&lt;HistogramLiteral&gt;
<a href=#46 id=46 data-nosnippet>46</a> + Allocator&lt;HistogramCommand&gt;
<a href=#47 id=47 data-nosnippet>47</a> + Allocator&lt;HistogramDistance&gt;
<a href=#48 id=48 data-nosnippet>48</a> + Allocator&lt;HistogramPair&gt;
<a href=#49 id=49 data-nosnippet>49</a> + Allocator&lt;ContextType&gt;
<a href=#50 id=50 data-nosnippet>50</a> + Allocator&lt;HuffmanTree&gt;
<a href=#51 id=51 data-nosnippet>51</a> + Allocator&lt;ZopfliNode&gt;
<a href=#52 id=52 data-nosnippet>52</a>{
<a href=#53 id=53 data-nosnippet>53</a>}
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#56 id=56 data-nosnippet>56</a></span><span class="kw">impl </span>BrotliAlloc <span class="kw">for </span>StandardAlloc {}
<a href=#57 id=57 data-nosnippet>57</a>
<a href=#58 id=58 data-nosnippet>58</a><span class="kw">pub struct </span>CombiningAllocator&lt;
<a href=#59 id=59 data-nosnippet>59</a> AllocU8: Allocator&lt;u8&gt;,
<a href=#60 id=60 data-nosnippet>60</a> AllocU16: Allocator&lt;u16&gt;,
<a href=#61 id=61 data-nosnippet>61</a> AllocI32: Allocator&lt;i32&gt;,
<a href=#62 id=62 data-nosnippet>62</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#63 id=63 data-nosnippet>63</a> AllocU64: Allocator&lt;u64&gt;,
<a href=#64 id=64 data-nosnippet>64</a> AllocCommand: Allocator&lt;Command&gt;,
<a href=#65 id=65 data-nosnippet>65</a> AllocFloatX: Allocator&lt;floatX&gt;,
<a href=#66 id=66 data-nosnippet>66</a> AllocV8: Allocator&lt;v8&gt;,
<a href=#67 id=67 data-nosnippet>67</a> AllocS16: Allocator&lt;s16&gt;,
<a href=#68 id=68 data-nosnippet>68</a> AllocPDF: Allocator&lt;PDF&gt;,
<a href=#69 id=69 data-nosnippet>69</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt;,
<a href=#70 id=70 data-nosnippet>70</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt;,
<a href=#71 id=71 data-nosnippet>71</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt;,
<a href=#72 id=72 data-nosnippet>72</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt;,
<a href=#73 id=73 data-nosnippet>73</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt;,
<a href=#74 id=74 data-nosnippet>74</a> AllocContextType: Allocator&lt;ContextType&gt;,
<a href=#75 id=75 data-nosnippet>75</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt;,
<a href=#76 id=76 data-nosnippet>76</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt;,
<a href=#77 id=77 data-nosnippet>77</a>&gt; {
<a href=#78 id=78 data-nosnippet>78</a> alloc_u8: AllocU8,
<a href=#79 id=79 data-nosnippet>79</a> alloc_u16: AllocU16,
<a href=#80 id=80 data-nosnippet>80</a> alloc_i32: AllocI32,
<a href=#81 id=81 data-nosnippet>81</a> alloc_u32: AllocU32,
<a href=#82 id=82 data-nosnippet>82</a> alloc_u64: AllocU64,
<a href=#83 id=83 data-nosnippet>83</a> alloc_c: AllocCommand,
<a href=#84 id=84 data-nosnippet>84</a> alloc_f: AllocFloatX,
<a href=#85 id=85 data-nosnippet>85</a> alloc_f32x8: AllocV8,
<a href=#86 id=86 data-nosnippet>86</a> alloc_i16x16: AllocS16,
<a href=#87 id=87 data-nosnippet>87</a> alloc_pdf: AllocPDF,
<a href=#88 id=88 data-nosnippet>88</a> alloc_sc: AllocStaticCommand,
<a href=#89 id=89 data-nosnippet>89</a> alloc_hl: AllocHistogramLiteral,
<a href=#90 id=90 data-nosnippet>90</a> alloc_hc: AllocHistogramCommand,
<a href=#91 id=91 data-nosnippet>91</a> alloc_hd: AllocHistogramDistance,
<a href=#92 id=92 data-nosnippet>92</a> alloc_hp: AllocHistogramPair,
<a href=#93 id=93 data-nosnippet>93</a> alloc_ct: AllocContextType,
<a href=#94 id=94 data-nosnippet>94</a> alloc_ht: AllocHuffmanTree,
<a href=#95 id=95 data-nosnippet>95</a> alloc_zn: AllocZopfliNode,
<a href=#96 id=96 data-nosnippet>96</a>}
<a href=#97 id=97 data-nosnippet>97</a>
<a href=#98 id=98 data-nosnippet>98</a><span class="kw">impl</span>&lt;
<a href=#99 id=99 data-nosnippet>99</a> AllocU8: Allocator&lt;u8&gt;,
<a href=#100 id=100 data-nosnippet>100</a> AllocU16: Allocator&lt;u16&gt;,
<a href=#101 id=101 data-nosnippet>101</a> AllocI32: Allocator&lt;i32&gt;,
<a href=#102 id=102 data-nosnippet>102</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#103 id=103 data-nosnippet>103</a> AllocU64: Allocator&lt;u64&gt;,
<a href=#104 id=104 data-nosnippet>104</a> AllocCommand: Allocator&lt;Command&gt;,
<a href=#105 id=105 data-nosnippet>105</a> AllocFloatX: Allocator&lt;floatX&gt;,
<a href=#106 id=106 data-nosnippet>106</a> AllocV8: Allocator&lt;v8&gt;,
<a href=#107 id=107 data-nosnippet>107</a> AllocS16: Allocator&lt;s16&gt;,
<a href=#108 id=108 data-nosnippet>108</a> AllocPDF: Allocator&lt;PDF&gt;,
<a href=#109 id=109 data-nosnippet>109</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt;,
<a href=#110 id=110 data-nosnippet>110</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt;,
<a href=#111 id=111 data-nosnippet>111</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt;,
<a href=#112 id=112 data-nosnippet>112</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt;,
<a href=#113 id=113 data-nosnippet>113</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt;,
<a href=#114 id=114 data-nosnippet>114</a> AllocContextType: Allocator&lt;ContextType&gt;,
<a href=#115 id=115 data-nosnippet>115</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt;,
<a href=#116 id=116 data-nosnippet>116</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt;,
<a href=#117 id=117 data-nosnippet>117</a> &gt;
<a href=#118 id=118 data-nosnippet>118</a> CombiningAllocator&lt;
<a href=#119 id=119 data-nosnippet>119</a> AllocU8,
<a href=#120 id=120 data-nosnippet>120</a> AllocU16,
<a href=#121 id=121 data-nosnippet>121</a> AllocI32,
<a href=#122 id=122 data-nosnippet>122</a> AllocU32,
<a href=#123 id=123 data-nosnippet>123</a> AllocU64,
<a href=#124 id=124 data-nosnippet>124</a> AllocCommand,
<a href=#125 id=125 data-nosnippet>125</a> AllocFloatX,
<a href=#126 id=126 data-nosnippet>126</a> AllocV8,
<a href=#127 id=127 data-nosnippet>127</a> AllocS16,
<a href=#128 id=128 data-nosnippet>128</a> AllocPDF,
<a href=#129 id=129 data-nosnippet>129</a> AllocStaticCommand,
<a href=#130 id=130 data-nosnippet>130</a> AllocHistogramLiteral,
<a href=#131 id=131 data-nosnippet>131</a> AllocHistogramCommand,
<a href=#132 id=132 data-nosnippet>132</a> AllocHistogramDistance,
<a href=#133 id=133 data-nosnippet>133</a> AllocHistogramPair,
<a href=#134 id=134 data-nosnippet>134</a> AllocContextType,
<a href=#135 id=135 data-nosnippet>135</a> AllocHuffmanTree,
<a href=#136 id=136 data-nosnippet>136</a> AllocZopfliNode,
<a href=#137 id=137 data-nosnippet>137</a> &gt;
<a href=#138 id=138 data-nosnippet>138</a>{
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">pub fn </span>new(
<a href=#140 id=140 data-nosnippet>140</a> alloc_u8: AllocU8,
<a href=#141 id=141 data-nosnippet>141</a> alloc_u16: AllocU16,
<a href=#142 id=142 data-nosnippet>142</a> alloc_i32: AllocI32,
<a href=#143 id=143 data-nosnippet>143</a> alloc_u32: AllocU32,
<a href=#144 id=144 data-nosnippet>144</a> alloc_u64: AllocU64,
<a href=#145 id=145 data-nosnippet>145</a> alloc_c: AllocCommand,
<a href=#146 id=146 data-nosnippet>146</a> alloc_f: AllocFloatX,
<a href=#147 id=147 data-nosnippet>147</a> alloc_f32x8: AllocV8,
<a href=#148 id=148 data-nosnippet>148</a> alloc_i16x16: AllocS16,
<a href=#149 id=149 data-nosnippet>149</a> alloc_pdf: AllocPDF,
<a href=#150 id=150 data-nosnippet>150</a> alloc_sc: AllocStaticCommand,
<a href=#151 id=151 data-nosnippet>151</a> alloc_hl: AllocHistogramLiteral,
<a href=#152 id=152 data-nosnippet>152</a> alloc_hc: AllocHistogramCommand,
<a href=#153 id=153 data-nosnippet>153</a> alloc_hd: AllocHistogramDistance,
<a href=#154 id=154 data-nosnippet>154</a> alloc_hp: AllocHistogramPair,
<a href=#155 id=155 data-nosnippet>155</a> alloc_ct: AllocContextType,
<a href=#156 id=156 data-nosnippet>156</a> alloc_ht: AllocHuffmanTree,
<a href=#157 id=157 data-nosnippet>157</a> alloc_zn: AllocZopfliNode,
<a href=#158 id=158 data-nosnippet>158</a> ) -&gt; <span class="self">Self </span>{
<a href=#159 id=159 data-nosnippet>159</a> CombiningAllocator {
<a href=#160 id=160 data-nosnippet>160</a> alloc_u8,
<a href=#161 id=161 data-nosnippet>161</a> alloc_u16,
<a href=#162 id=162 data-nosnippet>162</a> alloc_i32,
<a href=#163 id=163 data-nosnippet>163</a> alloc_u32,
<a href=#164 id=164 data-nosnippet>164</a> alloc_u64,
<a href=#165 id=165 data-nosnippet>165</a> alloc_c,
<a href=#166 id=166 data-nosnippet>166</a> alloc_f,
<a href=#167 id=167 data-nosnippet>167</a> alloc_f32x8,
<a href=#168 id=168 data-nosnippet>168</a> alloc_i16x16,
<a href=#169 id=169 data-nosnippet>169</a> alloc_pdf,
<a href=#170 id=170 data-nosnippet>170</a> alloc_sc,
<a href=#171 id=171 data-nosnippet>171</a> alloc_hl,
<a href=#172 id=172 data-nosnippet>172</a> alloc_hc,
<a href=#173 id=173 data-nosnippet>173</a> alloc_hd,
<a href=#174 id=174 data-nosnippet>174</a> alloc_hp,
<a href=#175 id=175 data-nosnippet>175</a> alloc_ct,
<a href=#176 id=176 data-nosnippet>176</a> alloc_ht,
<a href=#177 id=177 data-nosnippet>177</a> alloc_zn,
<a href=#178 id=178 data-nosnippet>178</a> }
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a>}
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a><span class="kw">impl</span>&lt;
<a href=#183 id=183 data-nosnippet>183</a> AllocU8: Allocator&lt;u8&gt;,
<a href=#184 id=184 data-nosnippet>184</a> AllocU16: Allocator&lt;u16&gt;,
<a href=#185 id=185 data-nosnippet>185</a> AllocI32: Allocator&lt;i32&gt;,
<a href=#186 id=186 data-nosnippet>186</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#187 id=187 data-nosnippet>187</a> AllocU64: Allocator&lt;u64&gt;,
<a href=#188 id=188 data-nosnippet>188</a> AllocCommand: Allocator&lt;Command&gt;,
<a href=#189 id=189 data-nosnippet>189</a> AllocFloatX: Allocator&lt;floatX&gt;,
<a href=#190 id=190 data-nosnippet>190</a> AllocV8: Allocator&lt;v8&gt;,
<a href=#191 id=191 data-nosnippet>191</a> AllocS16: Allocator&lt;s16&gt;,
<a href=#192 id=192 data-nosnippet>192</a> AllocPDF: Allocator&lt;PDF&gt;,
<a href=#193 id=193 data-nosnippet>193</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt;,
<a href=#194 id=194 data-nosnippet>194</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt;,
<a href=#195 id=195 data-nosnippet>195</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt;,
<a href=#196 id=196 data-nosnippet>196</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt;,
<a href=#197 id=197 data-nosnippet>197</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt;,
<a href=#198 id=198 data-nosnippet>198</a> AllocContextType: Allocator&lt;ContextType&gt;,
<a href=#199 id=199 data-nosnippet>199</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt;,
<a href=#200 id=200 data-nosnippet>200</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt;,
<a href=#201 id=201 data-nosnippet>201</a> &gt; BrotliAlloc
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">for </span>CombiningAllocator&lt;
<a href=#203 id=203 data-nosnippet>203</a> AllocU8,
<a href=#204 id=204 data-nosnippet>204</a> AllocU16,
<a href=#205 id=205 data-nosnippet>205</a> AllocI32,
<a href=#206 id=206 data-nosnippet>206</a> AllocU32,
<a href=#207 id=207 data-nosnippet>207</a> AllocU64,
<a href=#208 id=208 data-nosnippet>208</a> AllocCommand,
<a href=#209 id=209 data-nosnippet>209</a> AllocFloatX,
<a href=#210 id=210 data-nosnippet>210</a> AllocV8,
<a href=#211 id=211 data-nosnippet>211</a> AllocS16,
<a href=#212 id=212 data-nosnippet>212</a> AllocPDF,
<a href=#213 id=213 data-nosnippet>213</a> AllocStaticCommand,
<a href=#214 id=214 data-nosnippet>214</a> AllocHistogramLiteral,
<a href=#215 id=215 data-nosnippet>215</a> AllocHistogramCommand,
<a href=#216 id=216 data-nosnippet>216</a> AllocHistogramDistance,
<a href=#217 id=217 data-nosnippet>217</a> AllocHistogramPair,
<a href=#218 id=218 data-nosnippet>218</a> AllocContextType,
<a href=#219 id=219 data-nosnippet>219</a> AllocHuffmanTree,
<a href=#220 id=220 data-nosnippet>220</a> AllocZopfliNode,
<a href=#221 id=221 data-nosnippet>221</a> &gt;
<a href=#222 id=222 data-nosnippet>222</a>{
<a href=#223 id=223 data-nosnippet>223</a>}
<a href=#224 id=224 data-nosnippet>224</a>
<a href=#225 id=225 data-nosnippet>225</a><span class="kw">impl</span>&lt;
<a href=#226 id=226 data-nosnippet>226</a> AllocU8: Allocator&lt;u8&gt; + Default,
<a href=#227 id=227 data-nosnippet>227</a> AllocU16: Allocator&lt;u16&gt; + Default,
<a href=#228 id=228 data-nosnippet>228</a> AllocI32: Allocator&lt;i32&gt; + Default,
<a href=#229 id=229 data-nosnippet>229</a> AllocU32: Allocator&lt;u32&gt; + Default,
<a href=#230 id=230 data-nosnippet>230</a> AllocU64: Allocator&lt;u64&gt; + Default,
<a href=#231 id=231 data-nosnippet>231</a> AllocCommand: Allocator&lt;Command&gt; + Default,
<a href=#232 id=232 data-nosnippet>232</a> AllocFloatX: Allocator&lt;floatX&gt; + Default,
<a href=#233 id=233 data-nosnippet>233</a> AllocV8: Allocator&lt;v8&gt; + Default,
<a href=#234 id=234 data-nosnippet>234</a> AllocS16: Allocator&lt;s16&gt; + Default,
<a href=#235 id=235 data-nosnippet>235</a> AllocPDF: Allocator&lt;PDF&gt; + Default,
<a href=#236 id=236 data-nosnippet>236</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt; + Default,
<a href=#237 id=237 data-nosnippet>237</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt; + Default,
<a href=#238 id=238 data-nosnippet>238</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt; + Default,
<a href=#239 id=239 data-nosnippet>239</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt; + Default,
<a href=#240 id=240 data-nosnippet>240</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt; + Default,
<a href=#241 id=241 data-nosnippet>241</a> AllocContextType: Allocator&lt;ContextType&gt; + Default,
<a href=#242 id=242 data-nosnippet>242</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt; + Default,
<a href=#243 id=243 data-nosnippet>243</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt; + Default,
<a href=#244 id=244 data-nosnippet>244</a> &gt; Default
<a href=#245 id=245 data-nosnippet>245</a> <span class="kw">for </span>CombiningAllocator&lt;
<a href=#246 id=246 data-nosnippet>246</a> AllocU8,
<a href=#247 id=247 data-nosnippet>247</a> AllocU16,
<a href=#248 id=248 data-nosnippet>248</a> AllocI32,
<a href=#249 id=249 data-nosnippet>249</a> AllocU32,
<a href=#250 id=250 data-nosnippet>250</a> AllocU64,
<a href=#251 id=251 data-nosnippet>251</a> AllocCommand,
<a href=#252 id=252 data-nosnippet>252</a> AllocFloatX,
<a href=#253 id=253 data-nosnippet>253</a> AllocV8,
<a href=#254 id=254 data-nosnippet>254</a> AllocS16,
<a href=#255 id=255 data-nosnippet>255</a> AllocPDF,
<a href=#256 id=256 data-nosnippet>256</a> AllocStaticCommand,
<a href=#257 id=257 data-nosnippet>257</a> AllocHistogramLiteral,
<a href=#258 id=258 data-nosnippet>258</a> AllocHistogramCommand,
<a href=#259 id=259 data-nosnippet>259</a> AllocHistogramDistance,
<a href=#260 id=260 data-nosnippet>260</a> AllocHistogramPair,
<a href=#261 id=261 data-nosnippet>261</a> AllocContextType,
<a href=#262 id=262 data-nosnippet>262</a> AllocHuffmanTree,
<a href=#263 id=263 data-nosnippet>263</a> AllocZopfliNode,
<a href=#264 id=264 data-nosnippet>264</a> &gt;
<a href=#265 id=265 data-nosnippet>265</a>{
<a href=#266 id=266 data-nosnippet>266</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#267 id=267 data-nosnippet>267</a> CombiningAllocator {
<a href=#268 id=268 data-nosnippet>268</a> alloc_u8: AllocU8::default(),
<a href=#269 id=269 data-nosnippet>269</a> alloc_u16: AllocU16::default(),
<a href=#270 id=270 data-nosnippet>270</a> alloc_i32: AllocI32::default(),
<a href=#271 id=271 data-nosnippet>271</a> alloc_u32: AllocU32::default(),
<a href=#272 id=272 data-nosnippet>272</a> alloc_u64: AllocU64::default(),
<a href=#273 id=273 data-nosnippet>273</a> alloc_c: AllocCommand::default(),
<a href=#274 id=274 data-nosnippet>274</a> alloc_f: AllocFloatX::default(),
<a href=#275 id=275 data-nosnippet>275</a> alloc_f32x8: AllocV8::default(),
<a href=#276 id=276 data-nosnippet>276</a> alloc_i16x16: AllocS16::default(),
<a href=#277 id=277 data-nosnippet>277</a> alloc_pdf: AllocPDF::default(),
<a href=#278 id=278 data-nosnippet>278</a> alloc_sc: AllocStaticCommand::default(),
<a href=#279 id=279 data-nosnippet>279</a> alloc_hl: AllocHistogramLiteral::default(),
<a href=#280 id=280 data-nosnippet>280</a> alloc_hc: AllocHistogramCommand::default(),
<a href=#281 id=281 data-nosnippet>281</a> alloc_hd: AllocHistogramDistance::default(),
<a href=#282 id=282 data-nosnippet>282</a> alloc_hp: AllocHistogramPair::default(),
<a href=#283 id=283 data-nosnippet>283</a> alloc_ct: AllocContextType::default(),
<a href=#284 id=284 data-nosnippet>284</a> alloc_ht: AllocHuffmanTree::default(),
<a href=#285 id=285 data-nosnippet>285</a> alloc_zn: AllocZopfliNode::default(),
<a href=#286 id=286 data-nosnippet>286</a> }
<a href=#287 id=287 data-nosnippet>287</a> }
<a href=#288 id=288 data-nosnippet>288</a>}
<a href=#289 id=289 data-nosnippet>289</a>
<a href=#290 id=290 data-nosnippet>290</a><span class="kw">impl</span>&lt;
<a href=#291 id=291 data-nosnippet>291</a> AllocU8: Allocator&lt;u8&gt; + Clone,
<a href=#292 id=292 data-nosnippet>292</a> AllocU16: Allocator&lt;u16&gt; + Clone,
<a href=#293 id=293 data-nosnippet>293</a> AllocI32: Allocator&lt;i32&gt; + Clone,
<a href=#294 id=294 data-nosnippet>294</a> AllocU32: Allocator&lt;u32&gt; + Clone,
<a href=#295 id=295 data-nosnippet>295</a> AllocU64: Allocator&lt;u64&gt; + Clone,
<a href=#296 id=296 data-nosnippet>296</a> AllocCommand: Allocator&lt;Command&gt; + Clone,
<a href=#297 id=297 data-nosnippet>297</a> AllocFloatX: Allocator&lt;floatX&gt; + Clone,
<a href=#298 id=298 data-nosnippet>298</a> AllocV8: Allocator&lt;v8&gt; + Clone,
<a href=#299 id=299 data-nosnippet>299</a> AllocS16: Allocator&lt;s16&gt; + Clone,
<a href=#300 id=300 data-nosnippet>300</a> AllocPDF: Allocator&lt;PDF&gt; + Clone,
<a href=#301 id=301 data-nosnippet>301</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt; + Clone,
<a href=#302 id=302 data-nosnippet>302</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt; + Clone,
<a href=#303 id=303 data-nosnippet>303</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt; + Clone,
<a href=#304 id=304 data-nosnippet>304</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt; + Clone,
<a href=#305 id=305 data-nosnippet>305</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt; + Clone,
<a href=#306 id=306 data-nosnippet>306</a> AllocContextType: Allocator&lt;ContextType&gt; + Clone,
<a href=#307 id=307 data-nosnippet>307</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt; + Clone,
<a href=#308 id=308 data-nosnippet>308</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt; + Clone,
<a href=#309 id=309 data-nosnippet>309</a> &gt; Clone
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">for </span>CombiningAllocator&lt;
<a href=#311 id=311 data-nosnippet>311</a> AllocU8,
<a href=#312 id=312 data-nosnippet>312</a> AllocU16,
<a href=#313 id=313 data-nosnippet>313</a> AllocI32,
<a href=#314 id=314 data-nosnippet>314</a> AllocU32,
<a href=#315 id=315 data-nosnippet>315</a> AllocU64,
<a href=#316 id=316 data-nosnippet>316</a> AllocCommand,
<a href=#317 id=317 data-nosnippet>317</a> AllocFloatX,
<a href=#318 id=318 data-nosnippet>318</a> AllocV8,
<a href=#319 id=319 data-nosnippet>319</a> AllocS16,
<a href=#320 id=320 data-nosnippet>320</a> AllocPDF,
<a href=#321 id=321 data-nosnippet>321</a> AllocStaticCommand,
<a href=#322 id=322 data-nosnippet>322</a> AllocHistogramLiteral,
<a href=#323 id=323 data-nosnippet>323</a> AllocHistogramCommand,
<a href=#324 id=324 data-nosnippet>324</a> AllocHistogramDistance,
<a href=#325 id=325 data-nosnippet>325</a> AllocHistogramPair,
<a href=#326 id=326 data-nosnippet>326</a> AllocContextType,
<a href=#327 id=327 data-nosnippet>327</a> AllocHuffmanTree,
<a href=#328 id=328 data-nosnippet>328</a> AllocZopfliNode,
<a href=#329 id=329 data-nosnippet>329</a> &gt;
<a href=#330 id=330 data-nosnippet>330</a>{
<a href=#331 id=331 data-nosnippet>331</a> <span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#332 id=332 data-nosnippet>332</a> CombiningAllocator {
<a href=#333 id=333 data-nosnippet>333</a> alloc_u8: <span class="self">self</span>.alloc_u8.clone(),
<a href=#334 id=334 data-nosnippet>334</a> alloc_u16: <span class="self">self</span>.alloc_u16.clone(),
<a href=#335 id=335 data-nosnippet>335</a> alloc_i32: <span class="self">self</span>.alloc_i32.clone(),
<a href=#336 id=336 data-nosnippet>336</a> alloc_u32: <span class="self">self</span>.alloc_u32.clone(),
<a href=#337 id=337 data-nosnippet>337</a> alloc_u64: <span class="self">self</span>.alloc_u64.clone(),
<a href=#338 id=338 data-nosnippet>338</a> alloc_c: <span class="self">self</span>.alloc_c.clone(),
<a href=#339 id=339 data-nosnippet>339</a> alloc_f: <span class="self">self</span>.alloc_f.clone(),
<a href=#340 id=340 data-nosnippet>340</a> alloc_f32x8: <span class="self">self</span>.alloc_f32x8.clone(),
<a href=#341 id=341 data-nosnippet>341</a> alloc_i16x16: <span class="self">self</span>.alloc_i16x16.clone(),
<a href=#342 id=342 data-nosnippet>342</a> alloc_pdf: <span class="self">self</span>.alloc_pdf.clone(),
<a href=#343 id=343 data-nosnippet>343</a> alloc_sc: <span class="self">self</span>.alloc_sc.clone(),
<a href=#344 id=344 data-nosnippet>344</a> alloc_hl: <span class="self">self</span>.alloc_hl.clone(),
<a href=#345 id=345 data-nosnippet>345</a> alloc_hc: <span class="self">self</span>.alloc_hc.clone(),
<a href=#346 id=346 data-nosnippet>346</a> alloc_hd: <span class="self">self</span>.alloc_hd.clone(),
<a href=#347 id=347 data-nosnippet>347</a> alloc_hp: <span class="self">self</span>.alloc_hp.clone(),
<a href=#348 id=348 data-nosnippet>348</a> alloc_ct: <span class="self">self</span>.alloc_ct.clone(),
<a href=#349 id=349 data-nosnippet>349</a> alloc_ht: <span class="self">self</span>.alloc_ht.clone(),
<a href=#350 id=350 data-nosnippet>350</a> alloc_zn: <span class="self">self</span>.alloc_zn.clone(),
<a href=#351 id=351 data-nosnippet>351</a> }
<a href=#352 id=352 data-nosnippet>352</a> }
<a href=#353 id=353 data-nosnippet>353</a>}
<a href=#354 id=354 data-nosnippet>354</a>
<a href=#355 id=355 data-nosnippet>355</a><span class="kw">impl</span>&lt;
<a href=#356 id=356 data-nosnippet>356</a> AllocU8: Allocator&lt;u8&gt; + Copy,
<a href=#357 id=357 data-nosnippet>357</a> AllocU16: Allocator&lt;u16&gt; + Copy,
<a href=#358 id=358 data-nosnippet>358</a> AllocI32: Allocator&lt;i32&gt; + Copy,
<a href=#359 id=359 data-nosnippet>359</a> AllocU32: Allocator&lt;u32&gt; + Copy,
<a href=#360 id=360 data-nosnippet>360</a> AllocU64: Allocator&lt;u64&gt; + Copy,
<a href=#361 id=361 data-nosnippet>361</a> AllocCommand: Allocator&lt;Command&gt; + Copy,
<a href=#362 id=362 data-nosnippet>362</a> AllocFloatX: Allocator&lt;floatX&gt; + Copy,
<a href=#363 id=363 data-nosnippet>363</a> AllocV8: Allocator&lt;v8&gt; + Copy,
<a href=#364 id=364 data-nosnippet>364</a> AllocS16: Allocator&lt;s16&gt; + Copy,
<a href=#365 id=365 data-nosnippet>365</a> AllocPDF: Allocator&lt;PDF&gt; + Copy,
<a href=#366 id=366 data-nosnippet>366</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt; + Copy,
<a href=#367 id=367 data-nosnippet>367</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt; + Copy,
<a href=#368 id=368 data-nosnippet>368</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt; + Copy,
<a href=#369 id=369 data-nosnippet>369</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt; + Copy,
<a href=#370 id=370 data-nosnippet>370</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt; + Copy,
<a href=#371 id=371 data-nosnippet>371</a> AllocContextType: Allocator&lt;ContextType&gt; + Copy,
<a href=#372 id=372 data-nosnippet>372</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt; + Copy,
<a href=#373 id=373 data-nosnippet>373</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt; + Copy,
<a href=#374 id=374 data-nosnippet>374</a> &gt; Copy
<a href=#375 id=375 data-nosnippet>375</a> <span class="kw">for </span>CombiningAllocator&lt;
<a href=#376 id=376 data-nosnippet>376</a> AllocU8,
<a href=#377 id=377 data-nosnippet>377</a> AllocU16,
<a href=#378 id=378 data-nosnippet>378</a> AllocI32,
<a href=#379 id=379 data-nosnippet>379</a> AllocU32,
<a href=#380 id=380 data-nosnippet>380</a> AllocU64,
<a href=#381 id=381 data-nosnippet>381</a> AllocCommand,
<a href=#382 id=382 data-nosnippet>382</a> AllocFloatX,
<a href=#383 id=383 data-nosnippet>383</a> AllocV8,
<a href=#384 id=384 data-nosnippet>384</a> AllocS16,
<a href=#385 id=385 data-nosnippet>385</a> AllocPDF,
<a href=#386 id=386 data-nosnippet>386</a> AllocStaticCommand,
<a href=#387 id=387 data-nosnippet>387</a> AllocHistogramLiteral,
<a href=#388 id=388 data-nosnippet>388</a> AllocHistogramCommand,
<a href=#389 id=389 data-nosnippet>389</a> AllocHistogramDistance,
<a href=#390 id=390 data-nosnippet>390</a> AllocHistogramPair,
<a href=#391 id=391 data-nosnippet>391</a> AllocContextType,
<a href=#392 id=392 data-nosnippet>392</a> AllocHuffmanTree,
<a href=#393 id=393 data-nosnippet>393</a> AllocZopfliNode,
<a href=#394 id=394 data-nosnippet>394</a> &gt;
<a href=#395 id=395 data-nosnippet>395</a>{
<a href=#396 id=396 data-nosnippet>396</a>}
<a href=#397 id=397 data-nosnippet>397</a>
<a href=#398 id=398 data-nosnippet>398</a><span class="macro">macro_rules!</span> implement_allocator {
<a href=#399 id=399 data-nosnippet>399</a> (<span class="macro-nonterminal">$bound_name</span>: ty,
<a href=#400 id=400 data-nosnippet>400</a> <span class="macro-nonterminal">$type_name</span>: ty,
<a href=#401 id=401 data-nosnippet>401</a> <span class="macro-nonterminal">$sub_type_name</span>: ty,
<a href=#402 id=402 data-nosnippet>402</a> <span class="macro-nonterminal">$local_name</span>: ident) =&gt; {
<a href=#403 id=403 data-nosnippet>403</a> <span class="kw">impl</span>&lt;
<a href=#404 id=404 data-nosnippet>404</a> AllocU8: Allocator&lt;u8&gt;,
<a href=#405 id=405 data-nosnippet>405</a> AllocU16: Allocator&lt;u16&gt;,
<a href=#406 id=406 data-nosnippet>406</a> AllocI32: Allocator&lt;i32&gt;,
<a href=#407 id=407 data-nosnippet>407</a> AllocU32: Allocator&lt;u32&gt;,
<a href=#408 id=408 data-nosnippet>408</a> AllocU64: Allocator&lt;u64&gt;,
<a href=#409 id=409 data-nosnippet>409</a> AllocCommand: Allocator&lt;Command&gt;,
<a href=#410 id=410 data-nosnippet>410</a> AllocFloatX: Allocator&lt;floatX&gt;,
<a href=#411 id=411 data-nosnippet>411</a> AllocV8: Allocator&lt;v8&gt;,
<a href=#412 id=412 data-nosnippet>412</a> AllocS16: Allocator&lt;s16&gt;,
<a href=#413 id=413 data-nosnippet>413</a> AllocPDF: Allocator&lt;PDF&gt;,
<a href=#414 id=414 data-nosnippet>414</a> AllocStaticCommand: Allocator&lt;StaticCommand&gt;,
<a href=#415 id=415 data-nosnippet>415</a> AllocHistogramLiteral: Allocator&lt;HistogramLiteral&gt;,
<a href=#416 id=416 data-nosnippet>416</a> AllocHistogramCommand: Allocator&lt;HistogramCommand&gt;,
<a href=#417 id=417 data-nosnippet>417</a> AllocHistogramDistance: Allocator&lt;HistogramDistance&gt;,
<a href=#418 id=418 data-nosnippet>418</a> AllocHistogramPair: Allocator&lt;HistogramPair&gt;,
<a href=#419 id=419 data-nosnippet>419</a> AllocContextType: Allocator&lt;ContextType&gt;,
<a href=#420 id=420 data-nosnippet>420</a> AllocHuffmanTree: Allocator&lt;HuffmanTree&gt;,
<a href=#421 id=421 data-nosnippet>421</a> AllocZopfliNode: Allocator&lt;ZopfliNode&gt;,
<a href=#422 id=422 data-nosnippet>422</a> &gt; Allocator&lt;<span class="macro-nonterminal">$type_name</span>&gt;
<a href=#423 id=423 data-nosnippet>423</a> <span class="kw">for </span>CombiningAllocator&lt;
<a href=#424 id=424 data-nosnippet>424</a> AllocU8,
<a href=#425 id=425 data-nosnippet>425</a> AllocU16,
<a href=#426 id=426 data-nosnippet>426</a> AllocI32,
<a href=#427 id=427 data-nosnippet>427</a> AllocU32,
<a href=#428 id=428 data-nosnippet>428</a> AllocU64,
<a href=#429 id=429 data-nosnippet>429</a> AllocCommand,
<a href=#430 id=430 data-nosnippet>430</a> AllocFloatX,
<a href=#431 id=431 data-nosnippet>431</a> AllocV8,
<a href=#432 id=432 data-nosnippet>432</a> AllocS16,
<a href=#433 id=433 data-nosnippet>433</a> AllocPDF,
<a href=#434 id=434 data-nosnippet>434</a> AllocStaticCommand,
<a href=#435 id=435 data-nosnippet>435</a> AllocHistogramLiteral,
<a href=#436 id=436 data-nosnippet>436</a> AllocHistogramCommand,
<a href=#437 id=437 data-nosnippet>437</a> AllocHistogramDistance,
<a href=#438 id=438 data-nosnippet>438</a> AllocHistogramPair,
<a href=#439 id=439 data-nosnippet>439</a> AllocContextType,
<a href=#440 id=440 data-nosnippet>440</a> AllocHuffmanTree,
<a href=#441 id=441 data-nosnippet>441</a> AllocZopfliNode,
<a href=#442 id=442 data-nosnippet>442</a> &gt;
<a href=#443 id=443 data-nosnippet>443</a> {
<a href=#444 id=444 data-nosnippet>444</a> <span class="kw">type </span>AllocatedMemory = <span class="macro-nonterminal">$sub_type_name</span>;
<a href=#445 id=445 data-nosnippet>445</a> <span class="kw">fn </span>alloc_cell(
<a href=#446 id=446 data-nosnippet>446</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#447 id=447 data-nosnippet>447</a> size: usize,
<a href=#448 id=448 data-nosnippet>448</a> ) -&gt; &lt;<span class="self">Self </span><span class="kw">as </span>Allocator&lt;<span class="macro-nonterminal">$type_name</span>&gt;&gt;::AllocatedMemory {
<a href=#449 id=449 data-nosnippet>449</a> <span class="self">self</span>.<span class="macro-nonterminal">$local_name</span>.alloc_cell(size)
<a href=#450 id=450 data-nosnippet>450</a> }
<a href=#451 id=451 data-nosnippet>451</a> <span class="kw">fn </span>free_cell(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: &lt;<span class="self">Self </span><span class="kw">as </span>Allocator&lt;<span class="macro-nonterminal">$type_name</span>&gt;&gt;::AllocatedMemory) {
<a href=#452 id=452 data-nosnippet>452</a> <span class="self">self</span>.<span class="macro-nonterminal">$local_name</span>.free_cell(data)
<a href=#453 id=453 data-nosnippet>453</a> }
<a href=#454 id=454 data-nosnippet>454</a> }
<a href=#455 id=455 data-nosnippet>455</a> };
<a href=#456 id=456 data-nosnippet>456</a>}
<a href=#457 id=457 data-nosnippet>457</a>
<a href=#458 id=458 data-nosnippet>458</a><span class="macro">implement_allocator!</span>(AllocU8, u8, AllocU8::AllocatedMemory, alloc_u8);
<a href=#459 id=459 data-nosnippet>459</a><span class="macro">implement_allocator!</span>(AllocU16, u16, AllocU16::AllocatedMemory, alloc_u16);
<a href=#460 id=460 data-nosnippet>460</a>
<a href=#461 id=461 data-nosnippet>461</a><span class="macro">implement_allocator!</span>(AllocI32, i32, AllocI32::AllocatedMemory, alloc_i32);
<a href=#462 id=462 data-nosnippet>462</a><span class="macro">implement_allocator!</span>(AllocU32, u32, AllocU32::AllocatedMemory, alloc_u32);
<a href=#463 id=463 data-nosnippet>463</a><span class="macro">implement_allocator!</span>(AllocU64, u64, AllocU64::AllocatedMemory, alloc_u64);
<a href=#464 id=464 data-nosnippet>464</a><span class="macro">implement_allocator!</span>(
<a href=#465 id=465 data-nosnippet>465</a> AllocCommand,
<a href=#466 id=466 data-nosnippet>466</a> Command,
<a href=#467 id=467 data-nosnippet>467</a> AllocCommand::AllocatedMemory,
<a href=#468 id=468 data-nosnippet>468</a> alloc_c
<a href=#469 id=469 data-nosnippet>469</a>);
<a href=#470 id=470 data-nosnippet>470</a><span class="macro">implement_allocator!</span>(AllocFloatX, floatX, AllocFloatX::AllocatedMemory, alloc_f);
<a href=#471 id=471 data-nosnippet>471</a><span class="macro">implement_allocator!</span>(AllocV8, v8, AllocV8::AllocatedMemory, alloc_f32x8);
<a href=#472 id=472 data-nosnippet>472</a><span class="macro">implement_allocator!</span>(AllocS16, s16, AllocS16::AllocatedMemory, alloc_i16x16);
<a href=#473 id=473 data-nosnippet>473</a><span class="macro">implement_allocator!</span>(AllocPDF, PDF, AllocPDF::AllocatedMemory, alloc_pdf);
<a href=#474 id=474 data-nosnippet>474</a><span class="macro">implement_allocator!</span>(
<a href=#475 id=475 data-nosnippet>475</a> AllocStaticCommand,
<a href=#476 id=476 data-nosnippet>476</a> StaticCommand,
<a href=#477 id=477 data-nosnippet>477</a> AllocStaticCommand::AllocatedMemory,
<a href=#478 id=478 data-nosnippet>478</a> alloc_sc
<a href=#479 id=479 data-nosnippet>479</a>);
<a href=#480 id=480 data-nosnippet>480</a><span class="macro">implement_allocator!</span>(
<a href=#481 id=481 data-nosnippet>481</a> AllocHistogramLiteral,
<a href=#482 id=482 data-nosnippet>482</a> HistogramLiteral,
<a href=#483 id=483 data-nosnippet>483</a> AllocHistogramLiteral::AllocatedMemory,
<a href=#484 id=484 data-nosnippet>484</a> alloc_hl
<a href=#485 id=485 data-nosnippet>485</a>);
<a href=#486 id=486 data-nosnippet>486</a><span class="macro">implement_allocator!</span>(
<a href=#487 id=487 data-nosnippet>487</a> AllocHistogramCommand,
<a href=#488 id=488 data-nosnippet>488</a> HistogramCommand,
<a href=#489 id=489 data-nosnippet>489</a> AllocHistogramCommand::AllocatedMemory,
<a href=#490 id=490 data-nosnippet>490</a> alloc_hc
<a href=#491 id=491 data-nosnippet>491</a>);
<a href=#492 id=492 data-nosnippet>492</a><span class="macro">implement_allocator!</span>(
<a href=#493 id=493 data-nosnippet>493</a> AllocHistogramDistance,
<a href=#494 id=494 data-nosnippet>494</a> HistogramDistance,
<a href=#495 id=495 data-nosnippet>495</a> AllocHistogramDistance::AllocatedMemory,
<a href=#496 id=496 data-nosnippet>496</a> alloc_hd
<a href=#497 id=497 data-nosnippet>497</a>);
<a href=#498 id=498 data-nosnippet>498</a><span class="macro">implement_allocator!</span>(
<a href=#499 id=499 data-nosnippet>499</a> AllocHistogramPair,
<a href=#500 id=500 data-nosnippet>500</a> HistogramPair,
<a href=#501 id=501 data-nosnippet>501</a> AllocHistogramPair::AllocatedMemory,
<a href=#502 id=502 data-nosnippet>502</a> alloc_hp
<a href=#503 id=503 data-nosnippet>503</a>);
<a href=#504 id=504 data-nosnippet>504</a><span class="macro">implement_allocator!</span>(
<a href=#505 id=505 data-nosnippet>505</a> AllocContextType,
<a href=#506 id=506 data-nosnippet>506</a> ContextType,
<a href=#507 id=507 data-nosnippet>507</a> AllocContextType::AllocatedMemory,
<a href=#508 id=508 data-nosnippet>508</a> alloc_ct
<a href=#509 id=509 data-nosnippet>509</a>);
<a href=#510 id=510 data-nosnippet>510</a><span class="macro">implement_allocator!</span>(
<a href=#511 id=511 data-nosnippet>511</a> AllocHuffmanTree,
<a href=#512 id=512 data-nosnippet>512</a> HuffmanTree,
<a href=#513 id=513 data-nosnippet>513</a> AllocHuffmanTree::AllocatedMemory,
<a href=#514 id=514 data-nosnippet>514</a> alloc_ht
<a href=#515 id=515 data-nosnippet>515</a>);
<a href=#516 id=516 data-nosnippet>516</a><span class="macro">implement_allocator!</span>(
<a href=#517 id=517 data-nosnippet>517</a> AllocZopfliNode,
<a href=#518 id=518 data-nosnippet>518</a> ZopfliNode,
<a href=#519 id=519 data-nosnippet>519</a> AllocZopfliNode::AllocatedMemory,
<a href=#520 id=520 data-nosnippet>520</a> alloc_zn
<a href=#521 id=521 data-nosnippet>521</a>);
<a href=#522 id=522 data-nosnippet>522</a>
<a href=#523 id=523 data-nosnippet>523</a><span class="doccomment">/// Helper function to allocate memory with the given allocator (may crash if the `len` is 0).
<a href=#524 id=524 data-nosnippet>524</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>allocate&lt;T, A: Allocator&lt;T&gt;&gt;(alloc: <span class="kw-2">&amp;mut </span>A, len: usize) -&gt; A::AllocatedMemory {
<a href=#525 id=525 data-nosnippet>525</a> A::alloc_cell(alloc, len)
<a href=#526 id=526 data-nosnippet>526</a>}
<a href=#527 id=527 data-nosnippet>527</a>
<a href=#528 id=528 data-nosnippet>528</a><span class="doccomment">/// Helper function to create an empty allocator object
<a href=#529 id=529 data-nosnippet>529</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>alloc_default&lt;T, A: Allocator&lt;T&gt;&gt;() -&gt; A::AllocatedMemory {
<a href=#530 id=530 data-nosnippet>530</a> A::AllocatedMemory::default()
<a href=#531 id=531 data-nosnippet>531</a>}
<a href=#532 id=532 data-nosnippet>532</a>
<a href=#533 id=533 data-nosnippet>533</a><span class="doccomment">/// Helper function to allocate memory or return a default value if the condition is false
<a href=#534 id=534 data-nosnippet>534</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>alloc_if&lt;T, A: Allocator&lt;T&gt;&gt;(
<a href=#535 id=535 data-nosnippet>535</a> condition: bool,
<a href=#536 id=536 data-nosnippet>536</a> alloc: <span class="kw-2">&amp;mut </span>A,
<a href=#537 id=537 data-nosnippet>537</a> len: usize,
<a href=#538 id=538 data-nosnippet>538</a>) -&gt; A::AllocatedMemory {
<a href=#539 id=539 data-nosnippet>539</a> <span class="kw">if </span>condition {
<a href=#540 id=540 data-nosnippet>540</a> allocate(alloc, len)
<a href=#541 id=541 data-nosnippet>541</a> } <span class="kw">else </span>{
<a href=#542 id=542 data-nosnippet>542</a> alloc_default::&lt;T, A&gt;()
<a href=#543 id=543 data-nosnippet>543</a> }
<a href=#544 id=544 data-nosnippet>544</a>}
<a href=#545 id=545 data-nosnippet>545</a>
<a href=#546 id=546 data-nosnippet>546</a><span class="doccomment">/// Helper function to allocate memory or return a default value when the size is 0.
<a href=#547 id=547 data-nosnippet>547</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>alloc_or_default&lt;T, A: Allocator&lt;T&gt;&gt;(
<a href=#548 id=548 data-nosnippet>548</a> alloc: <span class="kw-2">&amp;mut </span>A,
<a href=#549 id=549 data-nosnippet>549</a> len: usize,
<a href=#550 id=550 data-nosnippet>550</a>) -&gt; A::AllocatedMemory {
<a href=#551 id=551 data-nosnippet>551</a> alloc_if(len &gt; <span class="number">0</span>, alloc, len)
<a href=#552 id=552 data-nosnippet>552</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,443 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/command.rs`."><title>command.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>command.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">super</span>::encode::BROTLI_NUM_DISTANCE_SHORT_CODES;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span><span class="kw">super</span>::util::Log2FloorNonZero;
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[derive(Copy, Clone, Debug)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">pub struct </span>BrotliDistanceParams {
<a href=#5 id=5 data-nosnippet>5</a> <span class="kw">pub </span>distance_postfix_bits: u32,
<a href=#6 id=6 data-nosnippet>6</a> <span class="kw">pub </span>num_direct_distance_codes: u32,
<a href=#7 id=7 data-nosnippet>7</a> <span class="kw">pub </span>alphabet_size: u32,
<a href=#8 id=8 data-nosnippet>8</a> <span class="kw">pub </span>max_distance: usize,
<a href=#9 id=9 data-nosnippet>9</a>}
<a href=#10 id=10 data-nosnippet>10</a>
<a href=#11 id=11 data-nosnippet>11</a><span class="attr">#[derive(Clone, Copy, Debug, Default)]
<a href=#12 id=12 data-nosnippet>12</a></span><span class="kw">pub struct </span>Command {
<a href=#13 id=13 data-nosnippet>13</a> <span class="comment">// stores copy_len in low 25 bits and copy_code - copy_len in high 7 bit
<a href=#14 id=14 data-nosnippet>14</a> </span><span class="kw">pub </span>insert_len_: u32,
<a href=#15 id=15 data-nosnippet>15</a> <span class="kw">pub </span>copy_len_: u32,
<a href=#16 id=16 data-nosnippet>16</a> <span class="comment">//stores distance_extra bits
<a href=#17 id=17 data-nosnippet>17</a> </span><span class="kw">pub </span>dist_extra_: u32,
<a href=#18 id=18 data-nosnippet>18</a> <span class="kw">pub </span>cmd_prefix_: u16,
<a href=#19 id=19 data-nosnippet>19</a> <span class="comment">// stores distance code in low 10 bits and num extra bits in high 6 bits
<a href=#20 id=20 data-nosnippet>20</a> </span><span class="kw">pub </span>dist_prefix_: u16,
<a href=#21 id=21 data-nosnippet>21</a>}
<a href=#22 id=22 data-nosnippet>22</a>
<a href=#23 id=23 data-nosnippet>23</a><span class="kw">impl </span>Command {
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">pub fn </span>copy_len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#25 id=25 data-nosnippet>25</a> <span class="self">self</span>.copy_len_ &amp; <span class="number">0x01ff_ffff
<a href=#26 id=26 data-nosnippet>26</a> </span>}
<a href=#27 id=27 data-nosnippet>27</a>
<a href=#28 id=28 data-nosnippet>28</a> <span class="kw">pub fn </span>distance_context(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#29 id=29 data-nosnippet>29</a> <span class="kw">let </span>r: u32 = (<span class="self">self</span>.cmd_prefix_ <span class="kw">as </span>i32 &gt;&gt; <span class="number">6</span>) <span class="kw">as </span>u32;
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">let </span>c: u32 = (<span class="self">self</span>.cmd_prefix_ <span class="kw">as </span>i32 &amp; <span class="number">7i32</span>) <span class="kw">as </span>u32;
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">if </span>(r == <span class="number">0 </span>|| r == <span class="number">2 </span>|| r == <span class="number">4 </span>|| r == <span class="number">7</span>) &amp;&amp; c &lt;= <span class="number">2 </span>{
<a href=#32 id=32 data-nosnippet>32</a> c
<a href=#33 id=33 data-nosnippet>33</a> } <span class="kw">else </span>{
<a href=#34 id=34 data-nosnippet>34</a> <span class="number">3
<a href=#35 id=35 data-nosnippet>35</a> </span>}
<a href=#36 id=36 data-nosnippet>36</a> }
<a href=#37 id=37 data-nosnippet>37</a>
<a href=#38 id=38 data-nosnippet>38</a> <span class="kw">pub fn </span>init_insert(<span class="kw-2">&amp;mut </span><span class="self">self</span>, insertlen: usize) {
<a href=#39 id=39 data-nosnippet>39</a> <span class="self">self</span>.insert_len_ = insertlen <span class="kw">as </span>u32;
<a href=#40 id=40 data-nosnippet>40</a> <span class="self">self</span>.copy_len_ = (<span class="number">4i32 </span>&lt;&lt; <span class="number">25</span>) <span class="kw">as </span>u32;
<a href=#41 id=41 data-nosnippet>41</a> <span class="self">self</span>.dist_extra_ = <span class="number">0u32</span>;
<a href=#42 id=42 data-nosnippet>42</a> <span class="self">self</span>.dist_prefix_ = (<span class="number">1u16 </span>&lt;&lt; <span class="number">10</span>) | BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>u16;
<a href=#43 id=43 data-nosnippet>43</a> get_length_code(insertlen, <span class="number">4usize</span>, <span class="bool-val">false</span>, <span class="kw-2">&amp;mut </span><span class="self">self</span>.cmd_prefix_);
<a href=#44 id=44 data-nosnippet>44</a> }
<a href=#45 id=45 data-nosnippet>45</a>}
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a><span class="attr">#[inline(always)]
<a href=#48 id=48 data-nosnippet>48</a></span><span class="kw">pub fn </span>ComputeDistanceCode(distance: usize, max_distance: usize, dist_cache: <span class="kw-2">&amp;</span>[i32]) -&gt; usize {
<a href=#49 id=49 data-nosnippet>49</a> <span class="kw">if </span>distance &lt;= max_distance {
<a href=#50 id=50 data-nosnippet>50</a> <span class="kw">let </span>distance_plus_3: usize = distance.wrapping_add(<span class="number">3</span>);
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">let </span>offset0: usize = distance_plus_3.wrapping_sub(dist_cache[<span class="number">0</span>] <span class="kw">as </span>usize);
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">let </span>offset1: usize = distance_plus_3.wrapping_sub(dist_cache[<span class="number">1</span>] <span class="kw">as </span>usize);
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">if </span>distance == dist_cache[<span class="number">0</span>] <span class="kw">as </span>usize {
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">return </span><span class="number">0usize</span>;
<a href=#55 id=55 data-nosnippet>55</a> } <span class="kw">else if </span>distance == dist_cache[<span class="number">1</span>] <span class="kw">as </span>usize {
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">return </span><span class="number">1</span>;
<a href=#57 id=57 data-nosnippet>57</a> } <span class="kw">else if </span>offset0 &lt; <span class="number">7usize </span>{
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">return </span>(<span class="number">0x0975_0468_i32 </span>&gt;&gt; (<span class="number">4usize</span>).wrapping_mul(offset0) &amp; <span class="number">0xfi32</span>) <span class="kw">as </span>usize;
<a href=#59 id=59 data-nosnippet>59</a> } <span class="kw">else if </span>offset1 &lt; <span class="number">7usize </span>{
<a href=#60 id=60 data-nosnippet>60</a> <span class="kw">return </span>(<span class="number">0x0fdb_1ace_i32 </span>&gt;&gt; (<span class="number">4usize</span>).wrapping_mul(offset1) &amp; <span class="number">0xfi32</span>) <span class="kw">as </span>usize;
<a href=#61 id=61 data-nosnippet>61</a> } <span class="kw">else if </span>distance == dist_cache[<span class="number">2</span>] <span class="kw">as </span>usize {
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">return </span><span class="number">2usize</span>;
<a href=#63 id=63 data-nosnippet>63</a> } <span class="kw">else if </span>distance == dist_cache[<span class="number">3</span>] <span class="kw">as </span>usize {
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">return </span><span class="number">3usize</span>;
<a href=#65 id=65 data-nosnippet>65</a> }
<a href=#66 id=66 data-nosnippet>66</a> }
<a href=#67 id=67 data-nosnippet>67</a> distance.wrapping_add(<span class="number">16</span>).wrapping_sub(<span class="number">1</span>)
<a href=#68 id=68 data-nosnippet>68</a>}
<a href=#69 id=69 data-nosnippet>69</a>
<a href=#70 id=70 data-nosnippet>70</a><span class="attr">#[inline(always)]
<a href=#71 id=71 data-nosnippet>71</a></span><span class="kw">pub fn </span>GetInsertLengthCode(insertlen: usize) -&gt; u16 {
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">if </span>insertlen &lt; <span class="number">6usize </span>{
<a href=#73 id=73 data-nosnippet>73</a> insertlen <span class="kw">as </span>u16
<a href=#74 id=74 data-nosnippet>74</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">130usize </span>{
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">let </span>nbits: u32 = Log2FloorNonZero(insertlen.wrapping_sub(<span class="number">2</span>) <span class="kw">as </span>u64).wrapping_sub(<span class="number">1</span>);
<a href=#76 id=76 data-nosnippet>76</a> ((nbits &lt;&lt; <span class="number">1</span>) <span class="kw">as </span>usize)
<a href=#77 id=77 data-nosnippet>77</a> .wrapping_add(insertlen.wrapping_sub(<span class="number">2</span>) &gt;&gt; nbits)
<a href=#78 id=78 data-nosnippet>78</a> .wrapping_add(<span class="number">2</span>) <span class="kw">as </span>u16
<a href=#79 id=79 data-nosnippet>79</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">2114usize </span>{
<a href=#80 id=80 data-nosnippet>80</a> Log2FloorNonZero(insertlen.wrapping_sub(<span class="number">66</span>) <span class="kw">as </span>u64).wrapping_add(<span class="number">10</span>) <span class="kw">as </span>u16
<a href=#81 id=81 data-nosnippet>81</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">6210usize </span>{
<a href=#82 id=82 data-nosnippet>82</a> <span class="number">21u32 </span><span class="kw">as </span>u16
<a href=#83 id=83 data-nosnippet>83</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">22594usize </span>{
<a href=#84 id=84 data-nosnippet>84</a> <span class="number">22u32 </span><span class="kw">as </span>u16
<a href=#85 id=85 data-nosnippet>85</a> } <span class="kw">else </span>{
<a href=#86 id=86 data-nosnippet>86</a> <span class="number">23u32 </span><span class="kw">as </span>u16
<a href=#87 id=87 data-nosnippet>87</a> }
<a href=#88 id=88 data-nosnippet>88</a>}
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a><span class="attr">#[inline(always)]
<a href=#91 id=91 data-nosnippet>91</a></span><span class="kw">pub fn </span>GetCopyLengthCode(copylen: usize) -&gt; u16 {
<a href=#92 id=92 data-nosnippet>92</a> <span class="kw">if </span>copylen &lt; <span class="number">10usize </span>{
<a href=#93 id=93 data-nosnippet>93</a> copylen.wrapping_sub(<span class="number">2</span>) <span class="kw">as </span>u16
<a href=#94 id=94 data-nosnippet>94</a> } <span class="kw">else if </span>copylen &lt; <span class="number">134usize </span>{
<a href=#95 id=95 data-nosnippet>95</a> <span class="kw">let </span>nbits: u32 = Log2FloorNonZero(copylen.wrapping_sub(<span class="number">6</span>) <span class="kw">as </span>u64).wrapping_sub(<span class="number">1</span>);
<a href=#96 id=96 data-nosnippet>96</a> ((nbits &lt;&lt; <span class="number">1</span>) <span class="kw">as </span>usize)
<a href=#97 id=97 data-nosnippet>97</a> .wrapping_add(copylen.wrapping_sub(<span class="number">6</span>) &gt;&gt; nbits)
<a href=#98 id=98 data-nosnippet>98</a> .wrapping_add(<span class="number">4</span>) <span class="kw">as </span>u16
<a href=#99 id=99 data-nosnippet>99</a> } <span class="kw">else if </span>copylen &lt; <span class="number">2118usize </span>{
<a href=#100 id=100 data-nosnippet>100</a> Log2FloorNonZero(copylen.wrapping_sub(<span class="number">70</span>) <span class="kw">as </span>u64).wrapping_add(<span class="number">12</span>) <span class="kw">as </span>u16
<a href=#101 id=101 data-nosnippet>101</a> } <span class="kw">else </span>{
<a href=#102 id=102 data-nosnippet>102</a> <span class="number">23u32 </span><span class="kw">as </span>u16
<a href=#103 id=103 data-nosnippet>103</a> }
<a href=#104 id=104 data-nosnippet>104</a>}
<a href=#105 id=105 data-nosnippet>105</a>
<a href=#106 id=106 data-nosnippet>106</a>
<a href=#107 id=107 data-nosnippet>107</a><span class="attr">#[inline(always)]
<a href=#108 id=108 data-nosnippet>108</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>combine_length_codes(inscode: u16, copycode: u16, use_last_distance: bool) -&gt; u16 {
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">let </span>bits64: u16 = (copycode <span class="kw">as </span>u32 &amp; <span class="number">0x7u32 </span>| (inscode <span class="kw">as </span>u32 &amp; <span class="number">0x7u32</span>) &lt;&lt; <span class="number">3</span>) <span class="kw">as </span>u16;
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">if </span>use_last_distance &amp;&amp; inscode &lt; <span class="number">8 </span>&amp;&amp; copycode &lt; <span class="number">16 </span>{
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">if </span>(copycode <span class="kw">as </span>i32) &lt; <span class="number">8i32 </span>{
<a href=#112 id=112 data-nosnippet>112</a> bits64
<a href=#113 id=113 data-nosnippet>113</a> } <span class="kw">else </span>{
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">let </span>s64: u16 = <span class="number">64u16</span>;
<a href=#115 id=115 data-nosnippet>115</a> (bits64 <span class="kw">as </span>i32 | s64 <span class="kw">as </span>i32) <span class="kw">as </span>u16
<a href=#116 id=116 data-nosnippet>116</a> }
<a href=#117 id=117 data-nosnippet>117</a> } <span class="kw">else </span>{
<a href=#118 id=118 data-nosnippet>118</a> <span class="kw">let </span>sub_offset: i32 = <span class="number">2i32 </span>* ((copycode <span class="kw">as </span>i32 &gt;&gt; <span class="number">3</span>) + <span class="number">3i32 </span>* (inscode <span class="kw">as </span>i32 &gt;&gt; <span class="number">3</span>));
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw">let </span>offset = (sub_offset &lt;&lt; <span class="number">5</span>) + <span class="number">0x40i32 </span>+ (<span class="number">0x520d40i32 </span>&gt;&gt; sub_offset &amp; <span class="number">0xc0i32</span>);
<a href=#120 id=120 data-nosnippet>120</a> (offset <span class="kw">as </span>u16 <span class="kw">as </span>i32 | bits64 <span class="kw">as </span>i32) <span class="kw">as </span>u16
<a href=#121 id=121 data-nosnippet>121</a> }
<a href=#122 id=122 data-nosnippet>122</a>}
<a href=#123 id=123 data-nosnippet>123</a>
<a href=#124 id=124 data-nosnippet>124</a>
<a href=#125 id=125 data-nosnippet>125</a><span class="attr">#[inline(always)]
<a href=#126 id=126 data-nosnippet>126</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>get_length_code(
<a href=#127 id=127 data-nosnippet>127</a> insertlen: usize,
<a href=#128 id=128 data-nosnippet>128</a> copylen: usize,
<a href=#129 id=129 data-nosnippet>129</a> use_last_distance: bool,
<a href=#130 id=130 data-nosnippet>130</a> code: <span class="kw-2">&amp;mut </span>u16,
<a href=#131 id=131 data-nosnippet>131</a>) {
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">let </span>inscode: u16 = GetInsertLengthCode(insertlen);
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span>copycode: u16 = GetCopyLengthCode(copylen);
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw-2">*</span>code = combine_length_codes(inscode, copycode, use_last_distance);
<a href=#135 id=135 data-nosnippet>135</a>}
<a href=#136 id=136 data-nosnippet>136</a><span class="kw">pub fn </span>PrefixEncodeCopyDistance(
<a href=#137 id=137 data-nosnippet>137</a> distance_code: usize,
<a href=#138 id=138 data-nosnippet>138</a> num_direct_codes: usize,
<a href=#139 id=139 data-nosnippet>139</a> postfix_bits: u64,
<a href=#140 id=140 data-nosnippet>140</a> code: <span class="kw-2">&amp;mut </span>u16,
<a href=#141 id=141 data-nosnippet>141</a> extra_bits: <span class="kw-2">&amp;mut </span>u32,
<a href=#142 id=142 data-nosnippet>142</a>) {
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">if </span>distance_code &lt; (BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>usize).wrapping_add(num_direct_codes) {
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw-2">*</span>code = distance_code <span class="kw">as </span>u16;
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw-2">*</span>extra_bits = <span class="number">0u32</span>;
<a href=#146 id=146 data-nosnippet>146</a> } <span class="kw">else </span>{
<a href=#147 id=147 data-nosnippet>147</a> <span class="kw">let </span>dist: u64 = (<span class="number">1u64 </span>&lt;&lt; postfix_bits.wrapping_add(<span class="number">2u32 </span><span class="kw">as </span>(u64))).wrapping_add(
<a href=#148 id=148 data-nosnippet>148</a> (distance_code <span class="kw">as </span>u64)
<a href=#149 id=149 data-nosnippet>149</a> .wrapping_sub(BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>u64)
<a href=#150 id=150 data-nosnippet>150</a> .wrapping_sub(num_direct_codes <span class="kw">as </span>u64),
<a href=#151 id=151 data-nosnippet>151</a> );
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">let </span>bucket: u64 = Log2FloorNonZero(dist).wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>(u64);
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">let </span>postfix_mask: u64 = (<span class="number">1u32 </span>&lt;&lt; postfix_bits).wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>(u64);
<a href=#154 id=154 data-nosnippet>154</a> <span class="kw">let </span>postfix: u64 = dist &amp; postfix_mask;
<a href=#155 id=155 data-nosnippet>155</a> <span class="kw">let </span>prefix: u64 = (dist &gt;&gt; bucket) &amp; <span class="number">1</span>;
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw">let </span>offset: u64 = (<span class="number">2u64</span>).wrapping_add(prefix) &lt;&lt; bucket;
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw">let </span>nbits: u64 = bucket.wrapping_sub(postfix_bits);
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw-2">*</span>code = ((nbits &lt;&lt; <span class="number">10</span>)
<a href=#159 id=159 data-nosnippet>159</a> | ((BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>u64)
<a href=#160 id=160 data-nosnippet>160</a> .wrapping_add(num_direct_codes <span class="kw">as </span>u64)
<a href=#161 id=161 data-nosnippet>161</a> .wrapping_add(
<a href=#162 id=162 data-nosnippet>162</a> <span class="number">2u64</span>.wrapping_mul(nbits.wrapping_sub(<span class="number">1</span>))
<a href=#163 id=163 data-nosnippet>163</a> .wrapping_add(prefix)
<a href=#164 id=164 data-nosnippet>164</a> &lt;&lt; postfix_bits,
<a href=#165 id=165 data-nosnippet>165</a> )
<a href=#166 id=166 data-nosnippet>166</a> .wrapping_add(postfix))) <span class="kw">as </span>u16;
<a href=#167 id=167 data-nosnippet>167</a> <span class="kw-2">*</span>extra_bits = (dist.wrapping_sub(offset) &gt;&gt; postfix_bits) <span class="kw">as </span>u32;
<a href=#168 id=168 data-nosnippet>168</a> <span class="comment">/*(16u64)
<a href=#169 id=169 data-nosnippet>169</a> .wrapping_add(num_direct_codes as u64)
<a href=#170 id=170 data-nosnippet>170</a> .wrapping_add((2u64).wrapping_mul(nbits.wrapping_sub(1)).wrapping_add(prefix) &lt;&lt;
<a href=#171 id=171 data-nosnippet>171</a> postfix_bits)
<a href=#172 id=172 data-nosnippet>172</a> .wrapping_add(postfix) as u16;*/
<a href=#173 id=173 data-nosnippet>173</a> //*extra_bits = (nbits &lt;&lt; 24 | dist.wrapping_sub(offset) &gt;&gt; postfix_bits) as u32;
<a href=#174 id=174 data-nosnippet>174</a> </span>}
<a href=#175 id=175 data-nosnippet>175</a>}
<a href=#176 id=176 data-nosnippet>176</a>
<a href=#177 id=177 data-nosnippet>177</a><span class="kw">impl </span>Command {
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">pub fn </span>restore_distance_code(<span class="kw-2">&amp;</span><span class="self">self</span>, dist: <span class="kw-2">&amp;</span>BrotliDistanceParams) -&gt; u32 {
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">if </span>(<span class="self">self</span>.dist_prefix_ <span class="kw">as </span>i32 &amp; <span class="number">0x3ff</span>)
<a href=#180 id=180 data-nosnippet>180</a> &lt; BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>i32 + dist.num_direct_distance_codes <span class="kw">as </span>i32
<a href=#181 id=181 data-nosnippet>181</a> {
<a href=#182 id=182 data-nosnippet>182</a> <span class="self">self</span>.dist_prefix_ <span class="kw">as </span>u32 &amp; <span class="number">0x3ff
<a href=#183 id=183 data-nosnippet>183</a> </span>} <span class="kw">else </span>{
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">let </span>dcode = <span class="self">self</span>.dist_prefix_ <span class="kw">as </span>u32 &amp; <span class="number">0x3ff</span>;
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">let </span>nbits: u32 = u32::from(<span class="self">self</span>.dist_prefix_ &gt;&gt; <span class="number">10</span>);
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw">let </span>extra: u32 = <span class="self">self</span>.dist_extra_;
<a href=#187 id=187 data-nosnippet>187</a> <span class="kw">let </span>postfix_mask = (<span class="number">1u32 </span>&lt;&lt; dist.distance_postfix_bits) - <span class="number">1</span>;
<a href=#188 id=188 data-nosnippet>188</a> <span class="kw">let </span>hcode = dcode
<a href=#189 id=189 data-nosnippet>189</a> .wrapping_sub(dist.num_direct_distance_codes)
<a href=#190 id=190 data-nosnippet>190</a> .wrapping_sub(BROTLI_NUM_DISTANCE_SHORT_CODES)
<a href=#191 id=191 data-nosnippet>191</a> &gt;&gt; dist.distance_postfix_bits;
<a href=#192 id=192 data-nosnippet>192</a> <span class="kw">let </span>lcode = dcode
<a href=#193 id=193 data-nosnippet>193</a> .wrapping_sub(dist.num_direct_distance_codes)
<a href=#194 id=194 data-nosnippet>194</a> .wrapping_sub(BROTLI_NUM_DISTANCE_SHORT_CODES)
<a href=#195 id=195 data-nosnippet>195</a> &amp; postfix_mask;
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw">let </span>offset = (<span class="number">2u32</span>.wrapping_add((hcode &amp; <span class="number">1</span>)) &lt;&lt; nbits).wrapping_sub(<span class="number">4</span>);
<a href=#197 id=197 data-nosnippet>197</a> (offset.wrapping_add(extra) &lt;&lt; dist.distance_postfix_bits)
<a href=#198 id=198 data-nosnippet>198</a> .wrapping_add(lcode)
<a href=#199 id=199 data-nosnippet>199</a> .wrapping_add(dist.num_direct_distance_codes)
<a href=#200 id=200 data-nosnippet>200</a> .wrapping_add(BROTLI_NUM_DISTANCE_SHORT_CODES)
<a href=#201 id=201 data-nosnippet>201</a> }
<a href=#202 id=202 data-nosnippet>202</a> }
<a href=#203 id=203 data-nosnippet>203</a>
<a href=#204 id=204 data-nosnippet>204</a> <span class="comment">// returns which distance code to use ( 0 means none, 1 means last, 2 means penultimate, 3 means the prior to penultimate
<a href=#205 id=205 data-nosnippet>205</a> </span><span class="kw">pub fn </span>distance_index_and_offset(<span class="kw-2">&amp;</span><span class="self">self</span>, dist: <span class="kw-2">&amp;</span>BrotliDistanceParams) -&gt; (usize, isize) {
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">let </span>n_postfix = dist.distance_postfix_bits;
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">let </span>n_direct = dist.num_direct_distance_codes;
<a href=#208 id=208 data-nosnippet>208</a> <span class="kw">let </span>dextra = <span class="self">self</span>.dist_extra_;
<a href=#209 id=209 data-nosnippet>209</a> <span class="kw">let </span>dprefix = <span class="self">self</span>.dist_prefix_ &amp; <span class="number">0x3ff</span>;
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">let </span>n_dist_bits = <span class="self">self</span>.dist_prefix_ &gt;&gt; <span class="number">10</span>;
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">if </span>u32::from(dprefix) &lt; BROTLI_NUM_DISTANCE_SHORT_CODES {
<a href=#212 id=212 data-nosnippet>212</a> <span class="kw">let </span>table: [(usize, isize); <span class="number">16</span>] = [
<a href=#213 id=213 data-nosnippet>213</a> (<span class="number">1</span>, <span class="number">0</span>),
<a href=#214 id=214 data-nosnippet>214</a> (<span class="number">2</span>, <span class="number">0</span>),
<a href=#215 id=215 data-nosnippet>215</a> (<span class="number">3</span>, <span class="number">0</span>),
<a href=#216 id=216 data-nosnippet>216</a> (<span class="number">4</span>, <span class="number">0</span>),
<a href=#217 id=217 data-nosnippet>217</a> (<span class="number">1</span>, -<span class="number">1</span>),
<a href=#218 id=218 data-nosnippet>218</a> (<span class="number">1</span>, <span class="number">1</span>),
<a href=#219 id=219 data-nosnippet>219</a> (<span class="number">1</span>, -<span class="number">2</span>),
<a href=#220 id=220 data-nosnippet>220</a> (<span class="number">1</span>, <span class="number">2</span>),
<a href=#221 id=221 data-nosnippet>221</a> (<span class="number">1</span>, -<span class="number">3</span>),
<a href=#222 id=222 data-nosnippet>222</a> (<span class="number">1</span>, <span class="number">3</span>),
<a href=#223 id=223 data-nosnippet>223</a> (<span class="number">2</span>, -<span class="number">1</span>),
<a href=#224 id=224 data-nosnippet>224</a> (<span class="number">2</span>, <span class="number">1</span>),
<a href=#225 id=225 data-nosnippet>225</a> (<span class="number">2</span>, -<span class="number">2</span>),
<a href=#226 id=226 data-nosnippet>226</a> (<span class="number">2</span>, <span class="number">2</span>),
<a href=#227 id=227 data-nosnippet>227</a> (<span class="number">2</span>, -<span class="number">3</span>),
<a href=#228 id=228 data-nosnippet>228</a> (<span class="number">2</span>, <span class="number">3</span>),
<a href=#229 id=229 data-nosnippet>229</a> ];
<a href=#230 id=230 data-nosnippet>230</a> <span class="comment">//eprint!("AA {:?} {:?} -&gt; {:?}\n",*self, *dist, table[dprefix as usize]);
<a href=#231 id=231 data-nosnippet>231</a> </span><span class="kw">return </span>table[dprefix <span class="kw">as </span>usize];
<a href=#232 id=232 data-nosnippet>232</a> }
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw">if </span>(dprefix <span class="kw">as </span>usize) &lt; BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>usize + n_direct <span class="kw">as </span>usize {
<a href=#234 id=234 data-nosnippet>234</a> <span class="kw">let </span>ret = dprefix <span class="kw">as </span>isize + <span class="number">1 </span>- BROTLI_NUM_DISTANCE_SHORT_CODES <span class="kw">as </span>isize;
<a href=#235 id=235 data-nosnippet>235</a> <span class="comment">//eprint!("BB {:?} {:?} -&gt; {:?}\n",*self, *dist, ret);
<a href=#236 id=236 data-nosnippet>236</a> </span><span class="kw">return </span>(<span class="number">0</span>, ret);
<a href=#237 id=237 data-nosnippet>237</a> }
<a href=#238 id=238 data-nosnippet>238</a> <span class="kw">let </span>postfix_mask = (<span class="number">1 </span>&lt;&lt; n_postfix) - <span class="number">1</span>;
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">let </span>dcode = dprefix <span class="kw">as </span>u32 - BROTLI_NUM_DISTANCE_SHORT_CODES - n_direct;
<a href=#240 id=240 data-nosnippet>240</a> <span class="kw">let </span>hcode = dcode &gt;&gt; n_postfix;
<a href=#241 id=241 data-nosnippet>241</a> <span class="kw">let </span>lcode = dcode &amp; postfix_mask;
<a href=#242 id=242 data-nosnippet>242</a> <span class="kw">let </span>offset = ((<span class="number">2 </span>+ (hcode &amp; <span class="number">1</span>)) &lt;&lt; n_dist_bits) - <span class="number">4</span>;
<a href=#243 id=243 data-nosnippet>243</a>
<a href=#244 id=244 data-nosnippet>244</a> <span class="kw">let </span>ret = (((offset + dextra) &lt;&lt; n_postfix) + lcode + n_direct + <span class="number">1</span>) <span class="kw">as </span>isize;
<a href=#245 id=245 data-nosnippet>245</a> <span class="comment">//assert!(ret != 0);
<a href=#246 id=246 data-nosnippet>246</a> </span>(<span class="number">0</span>, ret)
<a href=#247 id=247 data-nosnippet>247</a> }
<a href=#248 id=248 data-nosnippet>248</a>}
<a href=#249 id=249 data-nosnippet>249</a>
<a href=#250 id=250 data-nosnippet>250</a><span class="kw">pub fn </span>RecomputeDistancePrefixes(
<a href=#251 id=251 data-nosnippet>251</a> cmds: <span class="kw-2">&amp;mut </span>[Command],
<a href=#252 id=252 data-nosnippet>252</a> num_commands: usize,
<a href=#253 id=253 data-nosnippet>253</a> num_direct_distance_codes: u32,
<a href=#254 id=254 data-nosnippet>254</a> distance_postfix_bits: u32,
<a href=#255 id=255 data-nosnippet>255</a> dist: <span class="kw-2">&amp;</span>BrotliDistanceParams,
<a href=#256 id=256 data-nosnippet>256</a>) {
<a href=#257 id=257 data-nosnippet>257</a> <span class="kw">if </span>num_direct_distance_codes == <span class="number">0u32 </span>&amp;&amp; (distance_postfix_bits == <span class="number">0u32</span>) {
<a href=#258 id=258 data-nosnippet>258</a> <span class="kw">return</span>;
<a href=#259 id=259 data-nosnippet>259</a> }
<a href=#260 id=260 data-nosnippet>260</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_commands {
<a href=#261 id=261 data-nosnippet>261</a> <span class="kw">let </span>cmd: <span class="kw-2">&amp;mut </span>Command = <span class="kw-2">&amp;mut </span>cmds[i];
<a href=#262 id=262 data-nosnippet>262</a> <span class="kw">if </span>cmd.copy_len() != <span class="number">0 </span>&amp;&amp; cmd.cmd_prefix_ &gt;= <span class="number">128 </span>{
<a href=#263 id=263 data-nosnippet>263</a> PrefixEncodeCopyDistance(
<a href=#264 id=264 data-nosnippet>264</a> cmd.restore_distance_code(dist) <span class="kw">as </span>usize,
<a href=#265 id=265 data-nosnippet>265</a> num_direct_distance_codes <span class="kw">as </span>usize,
<a href=#266 id=266 data-nosnippet>266</a> distance_postfix_bits <span class="kw">as </span>(u64),
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw-2">&amp;mut </span>cmd.dist_prefix_,
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw-2">&amp;mut </span>cmd.dist_extra_,
<a href=#269 id=269 data-nosnippet>269</a> );
<a href=#270 id=270 data-nosnippet>270</a> }
<a href=#271 id=271 data-nosnippet>271</a> }
<a href=#272 id=272 data-nosnippet>272</a>}
<a href=#273 id=273 data-nosnippet>273</a>
<a href=#274 id=274 data-nosnippet>274</a><span class="kw">impl </span>Command {
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">pub fn </span>init(
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#277 id=277 data-nosnippet>277</a> dist: <span class="kw-2">&amp;</span>BrotliDistanceParams,
<a href=#278 id=278 data-nosnippet>278</a> insertlen: usize,
<a href=#279 id=279 data-nosnippet>279</a> copylen: usize,
<a href=#280 id=280 data-nosnippet>280</a> copylen_code: usize,
<a href=#281 id=281 data-nosnippet>281</a> distance_code: usize,
<a href=#282 id=282 data-nosnippet>282</a> ) {
<a href=#283 id=283 data-nosnippet>283</a> <span class="self">self</span>.insert_len_ = insertlen <span class="kw">as </span>u32;
<a href=#284 id=284 data-nosnippet>284</a> <span class="kw">let </span>copylen_code_delta = (copylen_code <span class="kw">as </span>i32 - copylen <span class="kw">as </span>i32) <span class="kw">as </span>i8;
<a href=#285 id=285 data-nosnippet>285</a> <span class="self">self</span>.copy_len_ = (copylen <span class="kw">as </span>u32 | (u32::from(copylen_code_delta <span class="kw">as </span>u8) &lt;&lt; <span class="number">25</span>));
<a href=#286 id=286 data-nosnippet>286</a> PrefixEncodeCopyDistance(
<a href=#287 id=287 data-nosnippet>287</a> distance_code,
<a href=#288 id=288 data-nosnippet>288</a> dist.num_direct_distance_codes <span class="kw">as </span>usize,
<a href=#289 id=289 data-nosnippet>289</a> u64::from(dist.distance_postfix_bits),
<a href=#290 id=290 data-nosnippet>290</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.dist_prefix_,
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.dist_extra_,
<a href=#292 id=292 data-nosnippet>292</a> );
<a href=#293 id=293 data-nosnippet>293</a> get_length_code(
<a href=#294 id=294 data-nosnippet>294</a> insertlen,
<a href=#295 id=295 data-nosnippet>295</a> copylen_code,
<a href=#296 id=296 data-nosnippet>296</a> (<span class="self">self</span>.dist_prefix_ &amp; <span class="number">0x3ff</span>) == <span class="number">0</span>,
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.cmd_prefix_,
<a href=#298 id=298 data-nosnippet>298</a> );
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a>
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw">pub fn </span>new(
<a href=#302 id=302 data-nosnippet>302</a> dist: <span class="kw-2">&amp;</span>BrotliDistanceParams,
<a href=#303 id=303 data-nosnippet>303</a> insertlen: usize,
<a href=#304 id=304 data-nosnippet>304</a> copylen: usize,
<a href=#305 id=305 data-nosnippet>305</a> copylen_code: usize,
<a href=#306 id=306 data-nosnippet>306</a> distance_code: usize,
<a href=#307 id=307 data-nosnippet>307</a> ) -&gt; <span class="self">Self </span>{
<a href=#308 id=308 data-nosnippet>308</a> <span class="kw">let </span><span class="kw-2">mut </span>cmd = Command {
<a href=#309 id=309 data-nosnippet>309</a> insert_len_: insertlen <span class="kw">as </span>u32,
<a href=#310 id=310 data-nosnippet>310</a> copy_len_: (copylen | ((copylen_code ^ copylen) &lt;&lt; <span class="number">25</span>)) <span class="kw">as </span>u32,
<a href=#311 id=311 data-nosnippet>311</a> dist_extra_: <span class="number">0</span>,
<a href=#312 id=312 data-nosnippet>312</a> cmd_prefix_: <span class="number">0</span>,
<a href=#313 id=313 data-nosnippet>313</a> dist_prefix_: <span class="number">0</span>,
<a href=#314 id=314 data-nosnippet>314</a> };
<a href=#315 id=315 data-nosnippet>315</a> cmd.init(dist, insertlen, copylen, copylen_code, distance_code);
<a href=#316 id=316 data-nosnippet>316</a> cmd
<a href=#317 id=317 data-nosnippet>317</a> }
<a href=#318 id=318 data-nosnippet>318</a>}
<a href=#319 id=319 data-nosnippet>319</a>
<a href=#320 id=320 data-nosnippet>320</a><span class="attr">#[cfg(test)]
<a href=#321 id=321 data-nosnippet>321</a></span><span class="kw">mod </span>test {
<a href=#322 id=322 data-nosnippet>322</a> <span class="comment">// returns which distance code to use ( 0 means none, 1 means last, 2 means penultimate, 3 means the prior to penultimate
<a href=#323 id=323 data-nosnippet>323</a> </span><span class="kw">pub fn </span>helperCommandDistanceIndexAndOffset(
<a href=#324 id=324 data-nosnippet>324</a> cmd: <span class="kw-2">&amp;</span><span class="kw">super</span>::Command,
<a href=#325 id=325 data-nosnippet>325</a> dist: <span class="kw-2">&amp;</span><span class="kw">super</span>::BrotliDistanceParams,
<a href=#326 id=326 data-nosnippet>326</a> ) -&gt; (usize, isize) {
<a href=#327 id=327 data-nosnippet>327</a> <span class="kw">let </span>n_postfix = dist.distance_postfix_bits;
<a href=#328 id=328 data-nosnippet>328</a> <span class="kw">let </span>n_direct = dist.num_direct_distance_codes;
<a href=#329 id=329 data-nosnippet>329</a> <span class="kw">let </span>dextra = cmd.dist_extra_;
<a href=#330 id=330 data-nosnippet>330</a> <span class="kw">let </span>dist_prefix = cmd.dist_prefix_ &amp; <span class="number">0x3ff</span>;
<a href=#331 id=331 data-nosnippet>331</a> <span class="kw">if </span>dist_prefix &lt; <span class="number">16 </span>{
<a href=#332 id=332 data-nosnippet>332</a> <span class="kw">let </span>table: [(usize, isize); <span class="number">16</span>] = [
<a href=#333 id=333 data-nosnippet>333</a> (<span class="number">1</span>, <span class="number">0</span>),
<a href=#334 id=334 data-nosnippet>334</a> (<span class="number">2</span>, <span class="number">0</span>),
<a href=#335 id=335 data-nosnippet>335</a> (<span class="number">3</span>, <span class="number">0</span>),
<a href=#336 id=336 data-nosnippet>336</a> (<span class="number">4</span>, <span class="number">0</span>),
<a href=#337 id=337 data-nosnippet>337</a> (<span class="number">1</span>, -<span class="number">1</span>),
<a href=#338 id=338 data-nosnippet>338</a> (<span class="number">1</span>, <span class="number">1</span>),
<a href=#339 id=339 data-nosnippet>339</a> (<span class="number">1</span>, -<span class="number">2</span>),
<a href=#340 id=340 data-nosnippet>340</a> (<span class="number">1</span>, <span class="number">2</span>),
<a href=#341 id=341 data-nosnippet>341</a> (<span class="number">1</span>, -<span class="number">3</span>),
<a href=#342 id=342 data-nosnippet>342</a> (<span class="number">1</span>, <span class="number">3</span>),
<a href=#343 id=343 data-nosnippet>343</a> (<span class="number">2</span>, -<span class="number">1</span>),
<a href=#344 id=344 data-nosnippet>344</a> (<span class="number">2</span>, <span class="number">1</span>),
<a href=#345 id=345 data-nosnippet>345</a> (<span class="number">2</span>, -<span class="number">2</span>),
<a href=#346 id=346 data-nosnippet>346</a> (<span class="number">2</span>, <span class="number">2</span>),
<a href=#347 id=347 data-nosnippet>347</a> (<span class="number">2</span>, -<span class="number">3</span>),
<a href=#348 id=348 data-nosnippet>348</a> (<span class="number">2</span>, <span class="number">3</span>),
<a href=#349 id=349 data-nosnippet>349</a> ];
<a href=#350 id=350 data-nosnippet>350</a> <span class="kw">return </span>table[cmd.dist_prefix_ <span class="kw">as </span>usize];
<a href=#351 id=351 data-nosnippet>351</a> }
<a href=#352 id=352 data-nosnippet>352</a> <span class="kw">if </span>(dist_prefix <span class="kw">as </span>usize) &lt; <span class="number">16 </span>+ n_direct <span class="kw">as </span>usize {
<a href=#353 id=353 data-nosnippet>353</a> <span class="kw">return </span>(<span class="number">0</span>, dist_prefix <span class="kw">as </span>isize + <span class="number">1 </span>- <span class="number">16</span>);
<a href=#354 id=354 data-nosnippet>354</a> }
<a href=#355 id=355 data-nosnippet>355</a> <span class="kw">let </span>postfix_mask = (<span class="number">1 </span>&lt;&lt; n_postfix) - <span class="number">1</span>;
<a href=#356 id=356 data-nosnippet>356</a> <span class="kw">let </span>dcode = dist_prefix <span class="kw">as </span>u32 - <span class="number">16 </span>- n_direct;
<a href=#357 id=357 data-nosnippet>357</a> <span class="kw">let </span>n_dist_bits = <span class="number">1 </span>+ (dcode &gt;&gt; (n_postfix + <span class="number">1</span>));
<a href=#358 id=358 data-nosnippet>358</a>
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">let </span>hcode = dcode &gt;&gt; n_postfix;
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">let </span>lcode = dcode &amp; postfix_mask;
<a href=#361 id=361 data-nosnippet>361</a> <span class="kw">let </span>offset = ((<span class="number">2 </span>+ (hcode &amp; <span class="number">1</span>)) &lt;&lt; n_dist_bits) - <span class="number">4</span>;
<a href=#362 id=362 data-nosnippet>362</a> (
<a href=#363 id=363 data-nosnippet>363</a> <span class="number">0</span>,
<a href=#364 id=364 data-nosnippet>364</a> (((offset + dextra) &lt;&lt; n_postfix) + lcode + n_direct + <span class="number">1</span>) <span class="kw">as </span>isize,
<a href=#365 id=365 data-nosnippet>365</a> )
<a href=#366 id=366 data-nosnippet>366</a> }
<a href=#367 id=367 data-nosnippet>367</a> <span class="attr">#[test]
<a href=#368 id=368 data-nosnippet>368</a> </span><span class="kw">fn </span>test_command_return_distance_index_offset() {
<a href=#369 id=369 data-nosnippet>369</a> <span class="kw">let </span>param = <span class="kw">super</span>::BrotliDistanceParams {
<a href=#370 id=370 data-nosnippet>370</a> distance_postfix_bits: <span class="number">2</span>,
<a href=#371 id=371 data-nosnippet>371</a> num_direct_distance_codes: <span class="number">16</span>,
<a href=#372 id=372 data-nosnippet>372</a> alphabet_size: <span class="number">224</span>,
<a href=#373 id=373 data-nosnippet>373</a> max_distance: <span class="number">268435456</span>,
<a href=#374 id=374 data-nosnippet>374</a> };
<a href=#375 id=375 data-nosnippet>375</a> <span class="kw">let </span><span class="kw-2">mut </span>cmd = <span class="kw">super</span>::Command::default();
<a href=#376 id=376 data-nosnippet>376</a> cmd.insert_len_ = <span class="number">63</span>;
<a href=#377 id=377 data-nosnippet>377</a> cmd.copy_len_ = <span class="number">3</span>;
<a href=#378 id=378 data-nosnippet>378</a> cmd.dist_extra_ = <span class="number">3</span>;
<a href=#379 id=379 data-nosnippet>379</a> cmd.cmd_prefix_ = <span class="number">297</span>;
<a href=#380 id=380 data-nosnippet>380</a> cmd.dist_prefix_ = <span class="number">2089</span>;
<a href=#381 id=381 data-nosnippet>381</a>
<a href=#382 id=382 data-nosnippet>382</a> <span class="macro">assert_eq!</span>(cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param), (<span class="number">0</span>, <span class="number">46</span>));
<a href=#383 id=383 data-nosnippet>383</a> <span class="macro">assert_eq!</span>(
<a href=#384 id=384 data-nosnippet>384</a> cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param),
<a href=#385 id=385 data-nosnippet>385</a> helperCommandDistanceIndexAndOffset(<span class="kw-2">&amp;</span>cmd, <span class="kw-2">&amp;</span>param)
<a href=#386 id=386 data-nosnippet>386</a> );
<a href=#387 id=387 data-nosnippet>387</a> cmd = <span class="kw">super</span>::Command {
<a href=#388 id=388 data-nosnippet>388</a> insert_len_: <span class="number">27</span>,
<a href=#389 id=389 data-nosnippet>389</a> copy_len_: <span class="number">3</span>,
<a href=#390 id=390 data-nosnippet>390</a> dist_extra_: <span class="number">0</span>,
<a href=#391 id=391 data-nosnippet>391</a> cmd_prefix_: <span class="number">281</span>,
<a href=#392 id=392 data-nosnippet>392</a> dist_prefix_: <span class="number">6</span>,
<a href=#393 id=393 data-nosnippet>393</a> };
<a href=#394 id=394 data-nosnippet>394</a> <span class="macro">assert_eq!</span>(cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param), (<span class="number">1</span>, -<span class="number">2</span>));
<a href=#395 id=395 data-nosnippet>395</a> <span class="macro">assert_eq!</span>(
<a href=#396 id=396 data-nosnippet>396</a> cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param),
<a href=#397 id=397 data-nosnippet>397</a> helperCommandDistanceIndexAndOffset(<span class="kw-2">&amp;</span>cmd, <span class="kw-2">&amp;</span>param)
<a href=#398 id=398 data-nosnippet>398</a> );
<a href=#399 id=399 data-nosnippet>399</a> cmd = <span class="kw">super</span>::Command {
<a href=#400 id=400 data-nosnippet>400</a> insert_len_: <span class="number">1</span>,
<a href=#401 id=401 data-nosnippet>401</a> copy_len_: <span class="number">3</span>,
<a href=#402 id=402 data-nosnippet>402</a> dist_extra_: <span class="number">0</span>,
<a href=#403 id=403 data-nosnippet>403</a> cmd_prefix_: <span class="number">137</span>,
<a href=#404 id=404 data-nosnippet>404</a> dist_prefix_: <span class="number">27</span>,
<a href=#405 id=405 data-nosnippet>405</a> };
<a href=#406 id=406 data-nosnippet>406</a> <span class="macro">assert_eq!</span>(cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param), (<span class="number">0</span>, <span class="number">12</span>));
<a href=#407 id=407 data-nosnippet>407</a> <span class="macro">assert_eq!</span>(
<a href=#408 id=408 data-nosnippet>408</a> cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param),
<a href=#409 id=409 data-nosnippet>409</a> helperCommandDistanceIndexAndOffset(<span class="kw-2">&amp;</span>cmd, <span class="kw-2">&amp;</span>param)
<a href=#410 id=410 data-nosnippet>410</a> );
<a href=#411 id=411 data-nosnippet>411</a> cmd = <span class="kw">super</span>::Command {
<a href=#412 id=412 data-nosnippet>412</a> insert_len_: <span class="number">5</span>,
<a href=#413 id=413 data-nosnippet>413</a> copy_len_: <span class="number">4</span>,
<a href=#414 id=414 data-nosnippet>414</a> dist_extra_: <span class="number">297</span>,
<a href=#415 id=415 data-nosnippet>415</a> cmd_prefix_: <span class="number">170</span>,
<a href=#416 id=416 data-nosnippet>416</a> dist_prefix_: <span class="number">11377</span>,
<a href=#417 id=417 data-nosnippet>417</a> };
<a href=#418 id=418 data-nosnippet>418</a> <span class="macro">assert_eq!</span>(cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param), (<span class="number">0</span>, <span class="number">17574</span>));
<a href=#419 id=419 data-nosnippet>419</a> <span class="macro">assert_eq!</span>(
<a href=#420 id=420 data-nosnippet>420</a> cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param),
<a href=#421 id=421 data-nosnippet>421</a> helperCommandDistanceIndexAndOffset(<span class="kw-2">&amp;</span>cmd, <span class="kw-2">&amp;</span>param)
<a href=#422 id=422 data-nosnippet>422</a> );
<a href=#423 id=423 data-nosnippet>423</a> cmd.init_insert(<span class="number">24</span>);
<a href=#424 id=424 data-nosnippet>424</a> <span class="macro">assert_eq!</span>(cmd.distance_index_and_offset(<span class="kw-2">&amp;</span>param), (<span class="number">0</span>, <span class="number">1</span>));
<a href=#425 id=425 data-nosnippet>425</a> }
<a href=#426 id=426 data-nosnippet>426</a> <span class="comment">/*
<a href=#427 id=427 data-nosnippet>427</a> #[test]
<a href=#428 id=428 data-nosnippet>428</a> fn test_restore_distance_code() {
<a href=#429 id=429 data-nosnippet>429</a> for dist_code in 0..50000 {
<a href=#430 id=430 data-nosnippet>430</a> let mut cmd = super::Command::default();
<a href=#431 id=431 data-nosnippet>431</a> let param =super::BrotliDistanceParams{
<a href=#432 id=432 data-nosnippet>432</a> distance_postfix_bits:2,
<a href=#433 id=433 data-nosnippet>433</a> num_direct_distance_codes:16,
<a href=#434 id=434 data-nosnippet>434</a> alphabet_size:224,
<a href=#435 id=435 data-nosnippet>435</a> max_distance:268435456,
<a href=#436 id=436 data-nosnippet>436</a> };
<a href=#437 id=437 data-nosnippet>437</a> super::InitCommand(&amp;mut cmd, &amp;param, 4, 4, 4, dist_code);
<a href=#438 id=438 data-nosnippet>438</a> let exp_dist_code = super::CommandRestoreDistanceCode(&amp;cmd, &amp;param);
<a href=#439 id=439 data-nosnippet>439</a> assert_eq!(exp_dist_code as u32, dist_code as u32);
<a href=#440 id=440 data-nosnippet>440</a> }
<a href=#441 id=441 data-nosnippet>441</a> }*/
<a href=#442 id=442 data-nosnippet>442</a></span>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,393 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/compat.rs`."><title>compat.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>compat.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#![cfg_attr(feature = <span class="string">"simd"</span>, allow(unused))]
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>core::ops::{Add, AddAssign, BitAnd, Index, IndexMut, Mul, Shr, Sub};
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="attr">#[derive(Default, Copy, Clone, Debug)]
<a href=#6 id=6 data-nosnippet>6</a></span><span class="kw">pub struct </span>Compat16x16([i16; <span class="number">16</span>]);
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">impl </span>Compat16x16 {
<a href=#8 id=8 data-nosnippet>8</a> <span class="attr">#[inline(always)]
<a href=#9 id=9 data-nosnippet>9</a> </span><span class="kw">pub fn </span>splat(a: i16) -&gt; Compat16x16 {
<a href=#10 id=10 data-nosnippet>10</a> Compat16x16([a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a])
<a href=#11 id=11 data-nosnippet>11</a> }
<a href=#12 id=12 data-nosnippet>12</a> <span class="attr">#[inline(always)]
<a href=#13 id=13 data-nosnippet>13</a> </span><span class="kw">pub fn </span>to_int(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw-2">*</span><span class="self">self
<a href=#15 id=15 data-nosnippet>15</a> </span>}
<a href=#16 id=16 data-nosnippet>16</a> <span class="attr">#[inline(always)]
<a href=#17 id=17 data-nosnippet>17</a> </span><span class="kw">pub fn </span>simd_gt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: Compat16x16) -&gt; Compat16x16 {
<a href=#18 id=18 data-nosnippet>18</a> <span class="self">Self</span>([
<a href=#19 id=19 data-nosnippet>19</a> -((<span class="self">self</span>[<span class="number">0</span>] &gt; rhs[<span class="number">0</span>]) <span class="kw">as </span>i16),
<a href=#20 id=20 data-nosnippet>20</a> -((<span class="self">self</span>[<span class="number">1</span>] &gt; rhs[<span class="number">1</span>]) <span class="kw">as </span>i16),
<a href=#21 id=21 data-nosnippet>21</a> -((<span class="self">self</span>[<span class="number">2</span>] &gt; rhs[<span class="number">2</span>]) <span class="kw">as </span>i16),
<a href=#22 id=22 data-nosnippet>22</a> -((<span class="self">self</span>[<span class="number">3</span>] &gt; rhs[<span class="number">3</span>]) <span class="kw">as </span>i16),
<a href=#23 id=23 data-nosnippet>23</a> -((<span class="self">self</span>[<span class="number">4</span>] &gt; rhs[<span class="number">4</span>]) <span class="kw">as </span>i16),
<a href=#24 id=24 data-nosnippet>24</a> -((<span class="self">self</span>[<span class="number">5</span>] &gt; rhs[<span class="number">5</span>]) <span class="kw">as </span>i16),
<a href=#25 id=25 data-nosnippet>25</a> -((<span class="self">self</span>[<span class="number">6</span>] &gt; rhs[<span class="number">6</span>]) <span class="kw">as </span>i16),
<a href=#26 id=26 data-nosnippet>26</a> -((<span class="self">self</span>[<span class="number">7</span>] &gt; rhs[<span class="number">7</span>]) <span class="kw">as </span>i16),
<a href=#27 id=27 data-nosnippet>27</a> -((<span class="self">self</span>[<span class="number">8</span>] &gt; rhs[<span class="number">8</span>]) <span class="kw">as </span>i16),
<a href=#28 id=28 data-nosnippet>28</a> -((<span class="self">self</span>[<span class="number">9</span>] &gt; rhs[<span class="number">9</span>]) <span class="kw">as </span>i16),
<a href=#29 id=29 data-nosnippet>29</a> -((<span class="self">self</span>[<span class="number">10</span>] &gt; rhs[<span class="number">10</span>]) <span class="kw">as </span>i16),
<a href=#30 id=30 data-nosnippet>30</a> -((<span class="self">self</span>[<span class="number">11</span>] &gt; rhs[<span class="number">11</span>]) <span class="kw">as </span>i16),
<a href=#31 id=31 data-nosnippet>31</a> -((<span class="self">self</span>[<span class="number">12</span>] &gt; rhs[<span class="number">12</span>]) <span class="kw">as </span>i16),
<a href=#32 id=32 data-nosnippet>32</a> -((<span class="self">self</span>[<span class="number">13</span>] &gt; rhs[<span class="number">13</span>]) <span class="kw">as </span>i16),
<a href=#33 id=33 data-nosnippet>33</a> -((<span class="self">self</span>[<span class="number">14</span>] &gt; rhs[<span class="number">14</span>]) <span class="kw">as </span>i16),
<a href=#34 id=34 data-nosnippet>34</a> -((<span class="self">self</span>[<span class="number">15</span>] &gt; rhs[<span class="number">15</span>]) <span class="kw">as </span>i16),
<a href=#35 id=35 data-nosnippet>35</a> ])
<a href=#36 id=36 data-nosnippet>36</a> }
<a href=#37 id=37 data-nosnippet>37</a>}
<a href=#38 id=38 data-nosnippet>38</a>
<a href=#39 id=39 data-nosnippet>39</a><span class="macro">macro_rules!</span> op16 {
<a href=#40 id=40 data-nosnippet>40</a> (<span class="macro-nonterminal">$a</span>: expr, <span class="macro-nonterminal">$b</span>: expr, <span class="macro-nonterminal">$op</span>: expr) =&gt; {
<a href=#41 id=41 data-nosnippet>41</a> Compat16x16([
<a href=#42 id=42 data-nosnippet>42</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">0</span>], <span class="macro-nonterminal">$b</span>[<span class="number">0</span>]),
<a href=#43 id=43 data-nosnippet>43</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">1</span>], <span class="macro-nonterminal">$b</span>[<span class="number">1</span>]),
<a href=#44 id=44 data-nosnippet>44</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">2</span>], <span class="macro-nonterminal">$b</span>[<span class="number">2</span>]),
<a href=#45 id=45 data-nosnippet>45</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">3</span>], <span class="macro-nonterminal">$b</span>[<span class="number">3</span>]),
<a href=#46 id=46 data-nosnippet>46</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">4</span>], <span class="macro-nonterminal">$b</span>[<span class="number">4</span>]),
<a href=#47 id=47 data-nosnippet>47</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">5</span>], <span class="macro-nonterminal">$b</span>[<span class="number">5</span>]),
<a href=#48 id=48 data-nosnippet>48</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">6</span>], <span class="macro-nonterminal">$b</span>[<span class="number">6</span>]),
<a href=#49 id=49 data-nosnippet>49</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">7</span>], <span class="macro-nonterminal">$b</span>[<span class="number">7</span>]),
<a href=#50 id=50 data-nosnippet>50</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">8</span>], <span class="macro-nonterminal">$b</span>[<span class="number">8</span>]),
<a href=#51 id=51 data-nosnippet>51</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">9</span>], <span class="macro-nonterminal">$b</span>[<span class="number">9</span>]),
<a href=#52 id=52 data-nosnippet>52</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">10</span>], <span class="macro-nonterminal">$b</span>[<span class="number">10</span>]),
<a href=#53 id=53 data-nosnippet>53</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">11</span>], <span class="macro-nonterminal">$b</span>[<span class="number">11</span>]),
<a href=#54 id=54 data-nosnippet>54</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">12</span>], <span class="macro-nonterminal">$b</span>[<span class="number">12</span>]),
<a href=#55 id=55 data-nosnippet>55</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">13</span>], <span class="macro-nonterminal">$b</span>[<span class="number">13</span>]),
<a href=#56 id=56 data-nosnippet>56</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">14</span>], <span class="macro-nonterminal">$b</span>[<span class="number">14</span>]),
<a href=#57 id=57 data-nosnippet>57</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">15</span>], <span class="macro-nonterminal">$b</span>[<span class="number">15</span>]),
<a href=#58 id=58 data-nosnippet>58</a> ])
<a href=#59 id=59 data-nosnippet>59</a> };
<a href=#60 id=60 data-nosnippet>60</a>}
<a href=#61 id=61 data-nosnippet>61</a><span class="macro">macro_rules!</span> scalar_op16 {
<a href=#62 id=62 data-nosnippet>62</a> (<span class="macro-nonterminal">$a</span>: expr, <span class="macro-nonterminal">$b</span>: expr, <span class="macro-nonterminal">$op</span>: expr) =&gt; {
<a href=#63 id=63 data-nosnippet>63</a> Compat16x16([
<a href=#64 id=64 data-nosnippet>64</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">0</span>], <span class="macro-nonterminal">$b</span>),
<a href=#65 id=65 data-nosnippet>65</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">1</span>], <span class="macro-nonterminal">$b</span>),
<a href=#66 id=66 data-nosnippet>66</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">2</span>], <span class="macro-nonterminal">$b</span>),
<a href=#67 id=67 data-nosnippet>67</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">3</span>], <span class="macro-nonterminal">$b</span>),
<a href=#68 id=68 data-nosnippet>68</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">4</span>], <span class="macro-nonterminal">$b</span>),
<a href=#69 id=69 data-nosnippet>69</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">5</span>], <span class="macro-nonterminal">$b</span>),
<a href=#70 id=70 data-nosnippet>70</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">6</span>], <span class="macro-nonterminal">$b</span>),
<a href=#71 id=71 data-nosnippet>71</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">7</span>], <span class="macro-nonterminal">$b</span>),
<a href=#72 id=72 data-nosnippet>72</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">8</span>], <span class="macro-nonterminal">$b</span>),
<a href=#73 id=73 data-nosnippet>73</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">9</span>], <span class="macro-nonterminal">$b</span>),
<a href=#74 id=74 data-nosnippet>74</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">10</span>], <span class="macro-nonterminal">$b</span>),
<a href=#75 id=75 data-nosnippet>75</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">11</span>], <span class="macro-nonterminal">$b</span>),
<a href=#76 id=76 data-nosnippet>76</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">12</span>], <span class="macro-nonterminal">$b</span>),
<a href=#77 id=77 data-nosnippet>77</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">13</span>], <span class="macro-nonterminal">$b</span>),
<a href=#78 id=78 data-nosnippet>78</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">14</span>], <span class="macro-nonterminal">$b</span>),
<a href=#79 id=79 data-nosnippet>79</a> <span class="macro-nonterminal">$op</span>(<span class="macro-nonterminal">$a</span>[<span class="number">15</span>], <span class="macro-nonterminal">$b</span>),
<a href=#80 id=80 data-nosnippet>80</a> ])
<a href=#81 id=81 data-nosnippet>81</a> };
<a href=#82 id=82 data-nosnippet>82</a>}
<a href=#83 id=83 data-nosnippet>83</a><span class="attr">#[inline(always)]
<a href=#84 id=84 data-nosnippet>84</a></span><span class="kw">fn </span>wrapping_i16_add(a: i16, b: i16) -&gt; i16 {
<a href=#85 id=85 data-nosnippet>85</a> a.wrapping_add(b)
<a href=#86 id=86 data-nosnippet>86</a>}
<a href=#87 id=87 data-nosnippet>87</a><span class="attr">#[inline(always)]
<a href=#88 id=88 data-nosnippet>88</a></span><span class="kw">fn </span>wrapping_i16_sub(a: i16, b: i16) -&gt; i16 {
<a href=#89 id=89 data-nosnippet>89</a> a.wrapping_sub(b)
<a href=#90 id=90 data-nosnippet>90</a>}
<a href=#91 id=91 data-nosnippet>91</a><span class="attr">#[inline(always)]
<a href=#92 id=92 data-nosnippet>92</a></span><span class="kw">fn </span>i16_bitand(a: i16, b: i16) -&gt; i16 {
<a href=#93 id=93 data-nosnippet>93</a> a &amp; b
<a href=#94 id=94 data-nosnippet>94</a>}
<a href=#95 id=95 data-nosnippet>95</a><span class="attr">#[inline(always)]
<a href=#96 id=96 data-nosnippet>96</a></span><span class="kw">fn </span>shift16&lt;Scalar&gt;(a: i16, b: Scalar) -&gt; i16
<a href=#97 id=97 data-nosnippet>97</a><span class="kw">where
<a href=#98 id=98 data-nosnippet>98</a> </span>i64: From&lt;Scalar&gt;,
<a href=#99 id=99 data-nosnippet>99</a>{
<a href=#100 id=100 data-nosnippet>100</a> a &gt;&gt; i64::from(b)
<a href=#101 id=101 data-nosnippet>101</a>}
<a href=#102 id=102 data-nosnippet>102</a><span class="kw">impl </span>Add <span class="kw">for </span>Compat16x16 {
<a href=#103 id=103 data-nosnippet>103</a> <span class="kw">type </span>Output = Compat16x16;
<a href=#104 id=104 data-nosnippet>104</a> <span class="attr">#[inline(always)]
<a href=#105 id=105 data-nosnippet>105</a> </span><span class="kw">fn </span>add(<span class="self">self</span>, other: Compat16x16) -&gt; Compat16x16 {
<a href=#106 id=106 data-nosnippet>106</a> <span class="macro">op16!</span>(<span class="self">self</span>.<span class="number">0</span>, other.<span class="number">0</span>, wrapping_i16_add)
<a href=#107 id=107 data-nosnippet>107</a> }
<a href=#108 id=108 data-nosnippet>108</a>}
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">impl </span>Sub <span class="kw">for </span>Compat16x16 {
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">type </span>Output = Compat16x16;
<a href=#111 id=111 data-nosnippet>111</a> <span class="attr">#[inline(always)]
<a href=#112 id=112 data-nosnippet>112</a> </span><span class="kw">fn </span>sub(<span class="self">self</span>, other: Compat16x16) -&gt; Compat16x16 {
<a href=#113 id=113 data-nosnippet>113</a> <span class="macro">op16!</span>(<span class="self">self</span>.<span class="number">0</span>, other.<span class="number">0</span>, wrapping_i16_sub)
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a>}
<a href=#116 id=116 data-nosnippet>116</a><span class="kw">impl </span>BitAnd <span class="kw">for </span>Compat16x16 {
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw">type </span>Output = Compat16x16;
<a href=#118 id=118 data-nosnippet>118</a> <span class="attr">#[inline(always)]
<a href=#119 id=119 data-nosnippet>119</a> </span><span class="kw">fn </span>bitand(<span class="self">self</span>, other: Compat16x16) -&gt; Compat16x16 {
<a href=#120 id=120 data-nosnippet>120</a> <span class="macro">op16!</span>(<span class="self">self</span>.<span class="number">0</span>, other.<span class="number">0</span>, i16_bitand)
<a href=#121 id=121 data-nosnippet>121</a> }
<a href=#122 id=122 data-nosnippet>122</a>}
<a href=#123 id=123 data-nosnippet>123</a><span class="kw">impl </span>From&lt;[i16; <span class="number">16</span>]&gt; <span class="kw">for </span>Compat16x16 {
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">fn </span>from(value: [i16; <span class="number">16</span>]) -&gt; <span class="self">Self </span>{
<a href=#125 id=125 data-nosnippet>125</a> <span class="self">Self</span>(value)
<a href=#126 id=126 data-nosnippet>126</a> }
<a href=#127 id=127 data-nosnippet>127</a>}
<a href=#128 id=128 data-nosnippet>128</a><span class="kw">impl</span>&lt;I&gt; Index&lt;I&gt; <span class="kw">for </span>Compat16x16
<a href=#129 id=129 data-nosnippet>129</a><span class="kw">where
<a href=#130 id=130 data-nosnippet>130</a> </span>I: core::slice::SliceIndex&lt;[i16]&gt;,
<a href=#131 id=131 data-nosnippet>131</a>{
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">type </span>Output = I::Output;
<a href=#133 id=133 data-nosnippet>133</a>
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: I) -&gt; <span class="kw-2">&amp;</span><span class="self">Self</span>::Output {
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>[index]
<a href=#136 id=136 data-nosnippet>136</a> }
<a href=#137 id=137 data-nosnippet>137</a>}
<a href=#138 id=138 data-nosnippet>138</a><span class="kw">impl</span>&lt;I&gt; IndexMut&lt;I&gt; <span class="kw">for </span>Compat16x16
<a href=#139 id=139 data-nosnippet>139</a><span class="kw">where
<a href=#140 id=140 data-nosnippet>140</a> </span>I: core::slice::SliceIndex&lt;[i16]&gt;,
<a href=#141 id=141 data-nosnippet>141</a>{
<a href=#142 id=142 data-nosnippet>142</a> <span class="kw">fn </span>index_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>, index: I) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Output {
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>[index]
<a href=#144 id=144 data-nosnippet>144</a> }
<a href=#145 id=145 data-nosnippet>145</a>}
<a href=#146 id=146 data-nosnippet>146</a><span class="kw">impl</span>&lt;Scalar: Clone&gt; Shr&lt;Scalar&gt; <span class="kw">for </span>Compat16x16
<a href=#147 id=147 data-nosnippet>147</a><span class="kw">where
<a href=#148 id=148 data-nosnippet>148</a> </span>i64: From&lt;Scalar&gt;,
<a href=#149 id=149 data-nosnippet>149</a>{
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">type </span>Output = Compat16x16;
<a href=#151 id=151 data-nosnippet>151</a> <span class="attr">#[inline(always)]
<a href=#152 id=152 data-nosnippet>152</a> </span><span class="kw">fn </span>shr(<span class="self">self</span>, other: Scalar) -&gt; Compat16x16 {
<a href=#153 id=153 data-nosnippet>153</a> <span class="macro">scalar_op16!</span>(<span class="self">self</span>.<span class="number">0</span>, other.clone(), shift16)
<a href=#154 id=154 data-nosnippet>154</a> }
<a href=#155 id=155 data-nosnippet>155</a>}
<a href=#156 id=156 data-nosnippet>156</a>
<a href=#157 id=157 data-nosnippet>157</a><span class="attr">#[derive(Default, Copy, Clone, Debug)]
<a href=#158 id=158 data-nosnippet>158</a></span><span class="kw">pub struct </span>Compat32x8([i32; <span class="number">8</span>]);
<a href=#159 id=159 data-nosnippet>159</a><span class="kw">impl </span>Compat32x8 {
<a href=#160 id=160 data-nosnippet>160</a> <span class="attr">#[inline(always)]
<a href=#161 id=161 data-nosnippet>161</a> </span><span class="kw">pub fn </span>splat(a: i32) -&gt; Compat32x8 {
<a href=#162 id=162 data-nosnippet>162</a> Compat32x8([a, a, a, a, a, a, a, a])
<a href=#163 id=163 data-nosnippet>163</a> }
<a href=#164 id=164 data-nosnippet>164</a> <span class="attr">#[inline(always)]
<a href=#165 id=165 data-nosnippet>165</a> </span><span class="kw">pub fn </span>simd_gt(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: Compat32x8) -&gt; Compat32x8 {
<a href=#166 id=166 data-nosnippet>166</a> <span class="self">Self</span>([
<a href=#167 id=167 data-nosnippet>167</a> -((<span class="self">self</span>[<span class="number">0</span>] &gt; rhs[<span class="number">0</span>]) <span class="kw">as </span>i32),
<a href=#168 id=168 data-nosnippet>168</a> -((<span class="self">self</span>[<span class="number">1</span>] &gt; rhs[<span class="number">1</span>]) <span class="kw">as </span>i32),
<a href=#169 id=169 data-nosnippet>169</a> -((<span class="self">self</span>[<span class="number">2</span>] &gt; rhs[<span class="number">2</span>]) <span class="kw">as </span>i32),
<a href=#170 id=170 data-nosnippet>170</a> -((<span class="self">self</span>[<span class="number">3</span>] &gt; rhs[<span class="number">3</span>]) <span class="kw">as </span>i32),
<a href=#171 id=171 data-nosnippet>171</a> -((<span class="self">self</span>[<span class="number">4</span>] &gt; rhs[<span class="number">4</span>]) <span class="kw">as </span>i32),
<a href=#172 id=172 data-nosnippet>172</a> -((<span class="self">self</span>[<span class="number">5</span>] &gt; rhs[<span class="number">5</span>]) <span class="kw">as </span>i32),
<a href=#173 id=173 data-nosnippet>173</a> -((<span class="self">self</span>[<span class="number">6</span>] &gt; rhs[<span class="number">6</span>]) <span class="kw">as </span>i32),
<a href=#174 id=174 data-nosnippet>174</a> -((<span class="self">self</span>[<span class="number">7</span>] &gt; rhs[<span class="number">7</span>]) <span class="kw">as </span>i32),
<a href=#175 id=175 data-nosnippet>175</a> ])
<a href=#176 id=176 data-nosnippet>176</a> }
<a href=#177 id=177 data-nosnippet>177</a> <span class="attr">#[inline(always)]
<a href=#178 id=178 data-nosnippet>178</a> </span><span class="kw">pub fn </span>simd_ge(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: Compat32x8) -&gt; Compat32x8 {
<a href=#179 id=179 data-nosnippet>179</a> <span class="self">Self</span>([
<a href=#180 id=180 data-nosnippet>180</a> -((<span class="self">self</span>[<span class="number">0</span>] &gt;= rhs[<span class="number">0</span>]) <span class="kw">as </span>i32),
<a href=#181 id=181 data-nosnippet>181</a> -((<span class="self">self</span>[<span class="number">1</span>] &gt;= rhs[<span class="number">1</span>]) <span class="kw">as </span>i32),
<a href=#182 id=182 data-nosnippet>182</a> -((<span class="self">self</span>[<span class="number">2</span>] &gt;= rhs[<span class="number">2</span>]) <span class="kw">as </span>i32),
<a href=#183 id=183 data-nosnippet>183</a> -((<span class="self">self</span>[<span class="number">3</span>] &gt;= rhs[<span class="number">3</span>]) <span class="kw">as </span>i32),
<a href=#184 id=184 data-nosnippet>184</a> -((<span class="self">self</span>[<span class="number">4</span>] &gt;= rhs[<span class="number">4</span>]) <span class="kw">as </span>i32),
<a href=#185 id=185 data-nosnippet>185</a> -((<span class="self">self</span>[<span class="number">5</span>] &gt;= rhs[<span class="number">5</span>]) <span class="kw">as </span>i32),
<a href=#186 id=186 data-nosnippet>186</a> -((<span class="self">self</span>[<span class="number">6</span>] &gt;= rhs[<span class="number">6</span>]) <span class="kw">as </span>i32),
<a href=#187 id=187 data-nosnippet>187</a> -((<span class="self">self</span>[<span class="number">7</span>] &gt;= rhs[<span class="number">7</span>]) <span class="kw">as </span>i32),
<a href=#188 id=188 data-nosnippet>188</a> ])
<a href=#189 id=189 data-nosnippet>189</a> }
<a href=#190 id=190 data-nosnippet>190</a> <span class="kw">pub fn </span>to_int(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#191 id=191 data-nosnippet>191</a> <span class="kw-2">*</span><span class="self">self
<a href=#192 id=192 data-nosnippet>192</a> </span>}
<a href=#193 id=193 data-nosnippet>193</a>}
<a href=#194 id=194 data-nosnippet>194</a>
<a href=#195 id=195 data-nosnippet>195</a><span class="attr">#[inline(always)]
<a href=#196 id=196 data-nosnippet>196</a></span><span class="kw">fn </span>fmin(a: f32, b: f32) -&gt; f32 {
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">if </span>a &lt; b {
<a href=#198 id=198 data-nosnippet>198</a> a
<a href=#199 id=199 data-nosnippet>199</a> } <span class="kw">else </span>{
<a href=#200 id=200 data-nosnippet>200</a> b
<a href=#201 id=201 data-nosnippet>201</a> }
<a href=#202 id=202 data-nosnippet>202</a>}
<a href=#203 id=203 data-nosnippet>203</a><span class="attr">#[derive(Default, Copy, Clone, Debug)]
<a href=#204 id=204 data-nosnippet>204</a></span><span class="kw">pub struct </span>CompatF8([f32; <span class="number">8</span>]);
<a href=#205 id=205 data-nosnippet>205</a><span class="kw">impl </span>CompatF8 {
<a href=#206 id=206 data-nosnippet>206</a> <span class="attr">#[inline(always)]
<a href=#207 id=207 data-nosnippet>207</a> </span><span class="kw">pub fn </span>splat(a: f32) -&gt; CompatF8 {
<a href=#208 id=208 data-nosnippet>208</a> CompatF8([a, a, a, a, a, a, a, a])
<a href=#209 id=209 data-nosnippet>209</a> }
<a href=#210 id=210 data-nosnippet>210</a> <span class="attr">#[inline(always)]
<a href=#211 id=211 data-nosnippet>211</a> </span><span class="kw">pub fn </span>simd_ge(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: CompatF8) -&gt; Compat32x8 {
<a href=#212 id=212 data-nosnippet>212</a> Compat32x8([
<a href=#213 id=213 data-nosnippet>213</a> -((<span class="self">self</span>[<span class="number">0</span>] &gt;= rhs[<span class="number">0</span>]) <span class="kw">as </span>i32),
<a href=#214 id=214 data-nosnippet>214</a> -((<span class="self">self</span>[<span class="number">1</span>] &gt;= rhs[<span class="number">1</span>]) <span class="kw">as </span>i32),
<a href=#215 id=215 data-nosnippet>215</a> -((<span class="self">self</span>[<span class="number">2</span>] &gt;= rhs[<span class="number">2</span>]) <span class="kw">as </span>i32),
<a href=#216 id=216 data-nosnippet>216</a> -((<span class="self">self</span>[<span class="number">3</span>] &gt;= rhs[<span class="number">3</span>]) <span class="kw">as </span>i32),
<a href=#217 id=217 data-nosnippet>217</a> -((<span class="self">self</span>[<span class="number">4</span>] &gt;= rhs[<span class="number">4</span>]) <span class="kw">as </span>i32),
<a href=#218 id=218 data-nosnippet>218</a> -((<span class="self">self</span>[<span class="number">5</span>] &gt;= rhs[<span class="number">5</span>]) <span class="kw">as </span>i32),
<a href=#219 id=219 data-nosnippet>219</a> -((<span class="self">self</span>[<span class="number">6</span>] &gt;= rhs[<span class="number">6</span>]) <span class="kw">as </span>i32),
<a href=#220 id=220 data-nosnippet>220</a> -((<span class="self">self</span>[<span class="number">7</span>] &gt;= rhs[<span class="number">7</span>]) <span class="kw">as </span>i32),
<a href=#221 id=221 data-nosnippet>221</a> ])
<a href=#222 id=222 data-nosnippet>222</a> }
<a href=#223 id=223 data-nosnippet>223</a> <span class="attr">#[inline(always)]
<a href=#224 id=224 data-nosnippet>224</a> </span><span class="kw">pub fn </span>simd_min(<span class="kw-2">&amp;</span><span class="self">self</span>, rhs: CompatF8) -&gt; CompatF8 {
<a href=#225 id=225 data-nosnippet>225</a> <span class="self">Self</span>([
<a href=#226 id=226 data-nosnippet>226</a> fmin(<span class="self">self</span>[<span class="number">0</span>], rhs[<span class="number">0</span>]),
<a href=#227 id=227 data-nosnippet>227</a> fmin(<span class="self">self</span>[<span class="number">1</span>], rhs[<span class="number">1</span>]),
<a href=#228 id=228 data-nosnippet>228</a> fmin(<span class="self">self</span>[<span class="number">2</span>], rhs[<span class="number">2</span>]),
<a href=#229 id=229 data-nosnippet>229</a> fmin(<span class="self">self</span>[<span class="number">3</span>], rhs[<span class="number">3</span>]),
<a href=#230 id=230 data-nosnippet>230</a> fmin(<span class="self">self</span>[<span class="number">4</span>], rhs[<span class="number">4</span>]),
<a href=#231 id=231 data-nosnippet>231</a> fmin(<span class="self">self</span>[<span class="number">5</span>], rhs[<span class="number">5</span>]),
<a href=#232 id=232 data-nosnippet>232</a> fmin(<span class="self">self</span>[<span class="number">6</span>], rhs[<span class="number">6</span>]),
<a href=#233 id=233 data-nosnippet>233</a> fmin(<span class="self">self</span>[<span class="number">7</span>], rhs[<span class="number">7</span>]),
<a href=#234 id=234 data-nosnippet>234</a> ])
<a href=#235 id=235 data-nosnippet>235</a> }
<a href=#236 id=236 data-nosnippet>236</a>}
<a href=#237 id=237 data-nosnippet>237</a><span class="kw">impl </span>Add <span class="kw">for </span>Compat32x8 {
<a href=#238 id=238 data-nosnippet>238</a> <span class="kw">type </span>Output = Compat32x8;
<a href=#239 id=239 data-nosnippet>239</a> <span class="attr">#[inline(always)]
<a href=#240 id=240 data-nosnippet>240</a> </span><span class="kw">fn </span>add(<span class="self">self</span>, other: Compat32x8) -&gt; Compat32x8 {
<a href=#241 id=241 data-nosnippet>241</a> Compat32x8([
<a href=#242 id=242 data-nosnippet>242</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">0</span>]),
<a href=#243 id=243 data-nosnippet>243</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">1</span>]),
<a href=#244 id=244 data-nosnippet>244</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">2</span>]),
<a href=#245 id=245 data-nosnippet>245</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">3</span>]),
<a href=#246 id=246 data-nosnippet>246</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">4</span>]),
<a href=#247 id=247 data-nosnippet>247</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">5</span>]),
<a href=#248 id=248 data-nosnippet>248</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">6</span>]),
<a href=#249 id=249 data-nosnippet>249</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>].wrapping_add(other.<span class="number">0</span>[<span class="number">7</span>]),
<a href=#250 id=250 data-nosnippet>250</a> ])
<a href=#251 id=251 data-nosnippet>251</a> }
<a href=#252 id=252 data-nosnippet>252</a>}
<a href=#253 id=253 data-nosnippet>253</a>
<a href=#254 id=254 data-nosnippet>254</a><span class="kw">impl </span>BitAnd <span class="kw">for </span>Compat32x8 {
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">type </span>Output = Compat32x8;
<a href=#256 id=256 data-nosnippet>256</a> <span class="attr">#[inline(always)]
<a href=#257 id=257 data-nosnippet>257</a> </span><span class="kw">fn </span>bitand(<span class="self">self</span>, other: Compat32x8) -&gt; Compat32x8 {
<a href=#258 id=258 data-nosnippet>258</a> Compat32x8([
<a href=#259 id=259 data-nosnippet>259</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>] &amp; other.<span class="number">0</span>[<span class="number">0</span>],
<a href=#260 id=260 data-nosnippet>260</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>] &amp; other.<span class="number">0</span>[<span class="number">1</span>],
<a href=#261 id=261 data-nosnippet>261</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>] &amp; other.<span class="number">0</span>[<span class="number">2</span>],
<a href=#262 id=262 data-nosnippet>262</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>] &amp; other.<span class="number">0</span>[<span class="number">3</span>],
<a href=#263 id=263 data-nosnippet>263</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>] &amp; other.<span class="number">0</span>[<span class="number">4</span>],
<a href=#264 id=264 data-nosnippet>264</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>] &amp; other.<span class="number">0</span>[<span class="number">5</span>],
<a href=#265 id=265 data-nosnippet>265</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>] &amp; other.<span class="number">0</span>[<span class="number">6</span>],
<a href=#266 id=266 data-nosnippet>266</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>] &amp; other.<span class="number">0</span>[<span class="number">7</span>],
<a href=#267 id=267 data-nosnippet>267</a> ])
<a href=#268 id=268 data-nosnippet>268</a> }
<a href=#269 id=269 data-nosnippet>269</a>}
<a href=#270 id=270 data-nosnippet>270</a><span class="kw">impl </span>Mul <span class="kw">for </span>Compat32x8 {
<a href=#271 id=271 data-nosnippet>271</a> <span class="kw">type </span>Output = Compat32x8;
<a href=#272 id=272 data-nosnippet>272</a> <span class="attr">#[inline(always)]
<a href=#273 id=273 data-nosnippet>273</a> </span><span class="kw">fn </span>mul(<span class="self">self</span>, other: Compat32x8) -&gt; Compat32x8 {
<a href=#274 id=274 data-nosnippet>274</a> Compat32x8([
<a href=#275 id=275 data-nosnippet>275</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">0</span>]),
<a href=#276 id=276 data-nosnippet>276</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">1</span>]),
<a href=#277 id=277 data-nosnippet>277</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">2</span>]),
<a href=#278 id=278 data-nosnippet>278</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">3</span>]),
<a href=#279 id=279 data-nosnippet>279</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">4</span>]),
<a href=#280 id=280 data-nosnippet>280</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">5</span>]),
<a href=#281 id=281 data-nosnippet>281</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">6</span>]),
<a href=#282 id=282 data-nosnippet>282</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>].wrapping_mul(other.<span class="number">0</span>[<span class="number">7</span>]),
<a href=#283 id=283 data-nosnippet>283</a> ])
<a href=#284 id=284 data-nosnippet>284</a> }
<a href=#285 id=285 data-nosnippet>285</a>}
<a href=#286 id=286 data-nosnippet>286</a><span class="kw">impl </span>From&lt;[i32; <span class="number">8</span>]&gt; <span class="kw">for </span>Compat32x8 {
<a href=#287 id=287 data-nosnippet>287</a> <span class="kw">fn </span>from(value: [i32; <span class="number">8</span>]) -&gt; <span class="self">Self </span>{
<a href=#288 id=288 data-nosnippet>288</a> <span class="self">Self</span>(value)
<a href=#289 id=289 data-nosnippet>289</a> }
<a href=#290 id=290 data-nosnippet>290</a>}
<a href=#291 id=291 data-nosnippet>291</a><span class="kw">impl</span>&lt;I&gt; Index&lt;I&gt; <span class="kw">for </span>Compat32x8
<a href=#292 id=292 data-nosnippet>292</a><span class="kw">where
<a href=#293 id=293 data-nosnippet>293</a> </span>I: core::slice::SliceIndex&lt;[i32]&gt;,
<a href=#294 id=294 data-nosnippet>294</a>{
<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">type </span>Output = I::Output;
<a href=#296 id=296 data-nosnippet>296</a>
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: I) -&gt; <span class="kw-2">&amp;</span><span class="self">Self</span>::Output {
<a href=#298 id=298 data-nosnippet>298</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>[index]
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a>}
<a href=#301 id=301 data-nosnippet>301</a><span class="kw">impl</span>&lt;I&gt; IndexMut&lt;I&gt; <span class="kw">for </span>Compat32x8
<a href=#302 id=302 data-nosnippet>302</a><span class="kw">where
<a href=#303 id=303 data-nosnippet>303</a> </span>I: core::slice::SliceIndex&lt;[i32]&gt;,
<a href=#304 id=304 data-nosnippet>304</a>{
<a href=#305 id=305 data-nosnippet>305</a> <span class="kw">fn </span>index_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>, index: I) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Output {
<a href=#306 id=306 data-nosnippet>306</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>[index]
<a href=#307 id=307 data-nosnippet>307</a> }
<a href=#308 id=308 data-nosnippet>308</a>}
<a href=#309 id=309 data-nosnippet>309</a><span class="kw">impl </span>Add <span class="kw">for </span>CompatF8 {
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">type </span>Output = CompatF8;
<a href=#311 id=311 data-nosnippet>311</a> <span class="attr">#[inline(always)]
<a href=#312 id=312 data-nosnippet>312</a> </span><span class="kw">fn </span>add(<span class="self">self</span>, other: CompatF8) -&gt; CompatF8 {
<a href=#313 id=313 data-nosnippet>313</a> CompatF8([
<a href=#314 id=314 data-nosnippet>314</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>] + other.<span class="number">0</span>[<span class="number">0</span>],
<a href=#315 id=315 data-nosnippet>315</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>] + other.<span class="number">0</span>[<span class="number">1</span>],
<a href=#316 id=316 data-nosnippet>316</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>] + other.<span class="number">0</span>[<span class="number">2</span>],
<a href=#317 id=317 data-nosnippet>317</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>] + other.<span class="number">0</span>[<span class="number">3</span>],
<a href=#318 id=318 data-nosnippet>318</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>] + other.<span class="number">0</span>[<span class="number">4</span>],
<a href=#319 id=319 data-nosnippet>319</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>] + other.<span class="number">0</span>[<span class="number">5</span>],
<a href=#320 id=320 data-nosnippet>320</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>] + other.<span class="number">0</span>[<span class="number">6</span>],
<a href=#321 id=321 data-nosnippet>321</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>] + other.<span class="number">0</span>[<span class="number">7</span>],
<a href=#322 id=322 data-nosnippet>322</a> ])
<a href=#323 id=323 data-nosnippet>323</a> }
<a href=#324 id=324 data-nosnippet>324</a>}
<a href=#325 id=325 data-nosnippet>325</a><span class="kw">impl </span>Sub <span class="kw">for </span>CompatF8 {
<a href=#326 id=326 data-nosnippet>326</a> <span class="kw">type </span>Output = CompatF8;
<a href=#327 id=327 data-nosnippet>327</a> <span class="attr">#[inline(always)]
<a href=#328 id=328 data-nosnippet>328</a> </span><span class="kw">fn </span>sub(<span class="self">self</span>, other: CompatF8) -&gt; CompatF8 {
<a href=#329 id=329 data-nosnippet>329</a> CompatF8([
<a href=#330 id=330 data-nosnippet>330</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>] - other.<span class="number">0</span>[<span class="number">0</span>],
<a href=#331 id=331 data-nosnippet>331</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>] - other.<span class="number">0</span>[<span class="number">1</span>],
<a href=#332 id=332 data-nosnippet>332</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>] - other.<span class="number">0</span>[<span class="number">2</span>],
<a href=#333 id=333 data-nosnippet>333</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>] - other.<span class="number">0</span>[<span class="number">3</span>],
<a href=#334 id=334 data-nosnippet>334</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>] - other.<span class="number">0</span>[<span class="number">4</span>],
<a href=#335 id=335 data-nosnippet>335</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>] - other.<span class="number">0</span>[<span class="number">5</span>],
<a href=#336 id=336 data-nosnippet>336</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>] - other.<span class="number">0</span>[<span class="number">6</span>],
<a href=#337 id=337 data-nosnippet>337</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>] - other.<span class="number">0</span>[<span class="number">7</span>],
<a href=#338 id=338 data-nosnippet>338</a> ])
<a href=#339 id=339 data-nosnippet>339</a> }
<a href=#340 id=340 data-nosnippet>340</a>}
<a href=#341 id=341 data-nosnippet>341</a><span class="kw">impl </span>Mul <span class="kw">for </span>CompatF8 {
<a href=#342 id=342 data-nosnippet>342</a> <span class="kw">type </span>Output = CompatF8;
<a href=#343 id=343 data-nosnippet>343</a> <span class="attr">#[inline(always)]
<a href=#344 id=344 data-nosnippet>344</a> </span><span class="kw">fn </span>mul(<span class="self">self</span>, other: CompatF8) -&gt; CompatF8 {
<a href=#345 id=345 data-nosnippet>345</a> CompatF8([
<a href=#346 id=346 data-nosnippet>346</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>] * other.<span class="number">0</span>[<span class="number">0</span>],
<a href=#347 id=347 data-nosnippet>347</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>] * other.<span class="number">0</span>[<span class="number">1</span>],
<a href=#348 id=348 data-nosnippet>348</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>] * other.<span class="number">0</span>[<span class="number">2</span>],
<a href=#349 id=349 data-nosnippet>349</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>] * other.<span class="number">0</span>[<span class="number">3</span>],
<a href=#350 id=350 data-nosnippet>350</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>] * other.<span class="number">0</span>[<span class="number">4</span>],
<a href=#351 id=351 data-nosnippet>351</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>] * other.<span class="number">0</span>[<span class="number">5</span>],
<a href=#352 id=352 data-nosnippet>352</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>] * other.<span class="number">0</span>[<span class="number">6</span>],
<a href=#353 id=353 data-nosnippet>353</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>] * other.<span class="number">0</span>[<span class="number">7</span>],
<a href=#354 id=354 data-nosnippet>354</a> ])
<a href=#355 id=355 data-nosnippet>355</a> }
<a href=#356 id=356 data-nosnippet>356</a>}
<a href=#357 id=357 data-nosnippet>357</a><span class="kw">impl </span>AddAssign <span class="kw">for </span>CompatF8 {
<a href=#358 id=358 data-nosnippet>358</a> <span class="attr">#[inline(always)]
<a href=#359 id=359 data-nosnippet>359</a> </span><span class="kw">fn </span>add_assign(<span class="kw-2">&amp;mut </span><span class="self">self</span>, other: CompatF8) {
<a href=#360 id=360 data-nosnippet>360</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">0</span>] += other.<span class="number">0</span>[<span class="number">0</span>];
<a href=#361 id=361 data-nosnippet>361</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">1</span>] += other.<span class="number">0</span>[<span class="number">1</span>];
<a href=#362 id=362 data-nosnippet>362</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">2</span>] += other.<span class="number">0</span>[<span class="number">2</span>];
<a href=#363 id=363 data-nosnippet>363</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">3</span>] += other.<span class="number">0</span>[<span class="number">3</span>];
<a href=#364 id=364 data-nosnippet>364</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">4</span>] += other.<span class="number">0</span>[<span class="number">4</span>];
<a href=#365 id=365 data-nosnippet>365</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">5</span>] += other.<span class="number">0</span>[<span class="number">5</span>];
<a href=#366 id=366 data-nosnippet>366</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">6</span>] += other.<span class="number">0</span>[<span class="number">6</span>];
<a href=#367 id=367 data-nosnippet>367</a> <span class="self">self</span>.<span class="number">0</span>[<span class="number">7</span>] += other.<span class="number">0</span>[<span class="number">7</span>];
<a href=#368 id=368 data-nosnippet>368</a> }
<a href=#369 id=369 data-nosnippet>369</a>}
<a href=#370 id=370 data-nosnippet>370</a><span class="kw">impl </span>From&lt;[f32; <span class="number">8</span>]&gt; <span class="kw">for </span>CompatF8 {
<a href=#371 id=371 data-nosnippet>371</a> <span class="kw">fn </span>from(value: [f32; <span class="number">8</span>]) -&gt; <span class="self">Self </span>{
<a href=#372 id=372 data-nosnippet>372</a> <span class="self">Self</span>(value)
<a href=#373 id=373 data-nosnippet>373</a> }
<a href=#374 id=374 data-nosnippet>374</a>}
<a href=#375 id=375 data-nosnippet>375</a><span class="kw">impl</span>&lt;I&gt; Index&lt;I&gt; <span class="kw">for </span>CompatF8
<a href=#376 id=376 data-nosnippet>376</a><span class="kw">where
<a href=#377 id=377 data-nosnippet>377</a> </span>I: core::slice::SliceIndex&lt;[f32]&gt;,
<a href=#378 id=378 data-nosnippet>378</a>{
<a href=#379 id=379 data-nosnippet>379</a> <span class="kw">type </span>Output = I::Output;
<a href=#380 id=380 data-nosnippet>380</a>
<a href=#381 id=381 data-nosnippet>381</a> <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: I) -&gt; <span class="kw-2">&amp;</span><span class="self">Self</span>::Output {
<a href=#382 id=382 data-nosnippet>382</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>[index]
<a href=#383 id=383 data-nosnippet>383</a> }
<a href=#384 id=384 data-nosnippet>384</a>}
<a href=#385 id=385 data-nosnippet>385</a><span class="kw">impl</span>&lt;I&gt; IndexMut&lt;I&gt; <span class="kw">for </span>CompatF8
<a href=#386 id=386 data-nosnippet>386</a><span class="kw">where
<a href=#387 id=387 data-nosnippet>387</a> </span>I: core::slice::SliceIndex&lt;[f32]&gt;,
<a href=#388 id=388 data-nosnippet>388</a>{
<a href=#389 id=389 data-nosnippet>389</a> <span class="kw">fn </span>index_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>, index: I) -&gt; <span class="kw-2">&amp;mut </span><span class="self">Self</span>::Output {
<a href=#390 id=390 data-nosnippet>390</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>[index]
<a href=#391 id=391 data-nosnippet>391</a> }
<a href=#392 id=392 data-nosnippet>392</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,907 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/compress_fragment_two_pass.rs`."><title>compress_fragment_two_pass.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>compress_fragment_two_pass.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::min;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::backward_references::kHashMul32;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::bit_cost::BitsEntropy;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::brotli_bit_stream::{BrotliBuildAndStoreHuffmanTreeFast, BrotliStoreHuffmanTree};
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::entropy_encode::{
<a href=#9 id=9 data-nosnippet>9</a> BrotliConvertBitDepthsToSymbols, BrotliCreateHuffmanTree, HuffmanTree,
<a href=#10 id=10 data-nosnippet>10</a>};
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">super</span>::static_dict::{
<a href=#12 id=12 data-nosnippet>12</a> FindMatchLengthWithLimit, BROTLI_UNALIGNED_LOAD32, BROTLI_UNALIGNED_LOAD64,
<a href=#13 id=13 data-nosnippet>13</a> BROTLI_UNALIGNED_STORE64,
<a href=#14 id=14 data-nosnippet>14</a>};
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">use </span><span class="kw">super</span>::util::{floatX, Log2FloorNonZero};
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">static </span>kCompressFragmentTwoPassBlockSize: usize = (<span class="number">1i32 </span>&lt;&lt; <span class="number">17</span>) <span class="kw">as </span>usize;
<a href=#17 id=17 data-nosnippet>17</a>
<a href=#18 id=18 data-nosnippet>18</a><span class="comment">// returns number of commands inserted
<a href=#19 id=19 data-nosnippet>19</a></span><span class="kw">fn </span>EmitInsertLen(insertlen: u32, commands: <span class="kw-2">&amp;mut &amp;mut </span>[u32]) -&gt; usize {
<a href=#20 id=20 data-nosnippet>20</a> <span class="kw">if </span>insertlen &lt; <span class="number">6u32 </span>{
<a href=#21 id=21 data-nosnippet>21</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = insertlen;
<a href=#22 id=22 data-nosnippet>22</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">130u32 </span>{
<a href=#23 id=23 data-nosnippet>23</a> <span class="kw">let </span>tail: u32 = insertlen.wrapping_sub(<span class="number">2</span>);
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">let </span>nbits: u32 = Log2FloorNonZero(tail <span class="kw">as </span>(u64)).wrapping_sub(<span class="number">1</span>);
<a href=#25 id=25 data-nosnippet>25</a> <span class="kw">let </span>prefix: u32 = tail &gt;&gt; nbits;
<a href=#26 id=26 data-nosnippet>26</a> <span class="kw">let </span>inscode: u32 = (nbits &lt;&lt; <span class="number">1</span>).wrapping_add(prefix).wrapping_add(<span class="number">2</span>);
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">let </span>extra: u32 = tail.wrapping_sub(prefix &lt;&lt; nbits);
<a href=#28 id=28 data-nosnippet>28</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = inscode | extra &lt;&lt; <span class="number">8</span>;
<a href=#29 id=29 data-nosnippet>29</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">2114u32 </span>{
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">let </span>tail: u32 = insertlen.wrapping_sub(<span class="number">66</span>);
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">let </span>nbits: u32 = Log2FloorNonZero(tail <span class="kw">as </span>(u64));
<a href=#32 id=32 data-nosnippet>32</a> <span class="kw">let </span>code: u32 = nbits.wrapping_add(<span class="number">10</span>);
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">let </span>extra: u32 = tail.wrapping_sub(<span class="number">1u32 </span>&lt;&lt; nbits);
<a href=#34 id=34 data-nosnippet>34</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = code | extra &lt;&lt; <span class="number">8</span>;
<a href=#35 id=35 data-nosnippet>35</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">6210u32 </span>{
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">let </span>extra: u32 = insertlen.wrapping_sub(<span class="number">2114</span>);
<a href=#37 id=37 data-nosnippet>37</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">21u32 </span>| extra &lt;&lt; <span class="number">8</span>;
<a href=#38 id=38 data-nosnippet>38</a> } <span class="kw">else if </span>insertlen &lt; <span class="number">22594u32 </span>{
<a href=#39 id=39 data-nosnippet>39</a> <span class="kw">let </span>extra: u32 = insertlen.wrapping_sub(<span class="number">6210</span>);
<a href=#40 id=40 data-nosnippet>40</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">22u32 </span>| extra &lt;&lt; <span class="number">8</span>;
<a href=#41 id=41 data-nosnippet>41</a> } <span class="kw">else </span>{
<a href=#42 id=42 data-nosnippet>42</a> <span class="kw">let </span>extra: u32 = insertlen.wrapping_sub(<span class="number">22594</span>);
<a href=#43 id=43 data-nosnippet>43</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">23u32 </span>| extra &lt;&lt; <span class="number">8</span>;
<a href=#44 id=44 data-nosnippet>44</a> }
<a href=#45 id=45 data-nosnippet>45</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#46 id=46 data-nosnippet>46</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#47 id=47 data-nosnippet>47</a> <span class="number">1
<a href=#48 id=48 data-nosnippet>48</a></span>}
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a><span class="kw">fn </span>EmitDistance(distance: u32, commands: <span class="kw-2">&amp;mut &amp;mut </span>[u32]) -&gt; usize {
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">let </span>d: u32 = distance.wrapping_add(<span class="number">3</span>);
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">let </span>nbits: u32 = Log2FloorNonZero(d <span class="kw">as </span>(u64)).wrapping_sub(<span class="number">1</span>);
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">let </span>prefix: u32 = d &gt;&gt; nbits &amp; <span class="number">1u32</span>;
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">let </span>offset: u32 = (<span class="number">2u32</span>).wrapping_add(prefix) &lt;&lt; nbits;
<a href=#55 id=55 data-nosnippet>55</a> <span class="kw">let </span>distcode: u32 = (<span class="number">2u32</span>)
<a href=#56 id=56 data-nosnippet>56</a> .wrapping_mul(nbits.wrapping_sub(<span class="number">1</span>))
<a href=#57 id=57 data-nosnippet>57</a> .wrapping_add(prefix)
<a href=#58 id=58 data-nosnippet>58</a> .wrapping_add(<span class="number">80</span>);
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">let </span>extra: u32 = d.wrapping_sub(offset);
<a href=#60 id=60 data-nosnippet>60</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = distcode | extra &lt;&lt; <span class="number">8</span>;
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#63 id=63 data-nosnippet>63</a> <span class="number">1
<a href=#64 id=64 data-nosnippet>64</a></span>}
<a href=#65 id=65 data-nosnippet>65</a>
<a href=#66 id=66 data-nosnippet>66</a><span class="kw">fn </span>EmitCopyLenLastDistance(copylen: usize, commands: <span class="kw-2">&amp;mut &amp;mut </span>[u32]) -&gt; usize {
<a href=#67 id=67 data-nosnippet>67</a> <span class="kw">if </span>copylen &lt; <span class="number">12usize </span>{
<a href=#68 id=68 data-nosnippet>68</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = copylen.wrapping_add(<span class="number">20</span>) <span class="kw">as </span>u32;
<a href=#69 id=69 data-nosnippet>69</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#70 id=70 data-nosnippet>70</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#71 id=71 data-nosnippet>71</a> <span class="number">1
<a href=#72 id=72 data-nosnippet>72</a> </span>} <span class="kw">else if </span>copylen &lt; <span class="number">72usize </span>{
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">let </span>tail: usize = copylen.wrapping_sub(<span class="number">8</span>);
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">let </span>nbits: usize = Log2FloorNonZero(tail <span class="kw">as </span>u64).wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>usize;
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">let </span>prefix: usize = tail &gt;&gt; nbits;
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw">let </span>code: usize = (nbits &lt;&lt; <span class="number">1</span>).wrapping_add(prefix).wrapping_add(<span class="number">28</span>);
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">let </span>extra: usize = tail.wrapping_sub(prefix &lt;&lt; nbits);
<a href=#78 id=78 data-nosnippet>78</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (code | extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#80 id=80 data-nosnippet>80</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#81 id=81 data-nosnippet>81</a> <span class="number">1
<a href=#82 id=82 data-nosnippet>82</a> </span>} <span class="kw">else if </span>copylen &lt; <span class="number">136usize </span>{
<a href=#83 id=83 data-nosnippet>83</a> <span class="kw">let </span>tail: usize = copylen.wrapping_sub(<span class="number">8</span>);
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">let </span>code: usize = (tail &gt;&gt; <span class="number">5</span>).wrapping_add(<span class="number">54</span>);
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">let </span>extra: usize = tail &amp; <span class="number">31usize</span>;
<a href=#86 id=86 data-nosnippet>86</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (code | extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#88 id=88 data-nosnippet>88</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#89 id=89 data-nosnippet>89</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">64u32</span>;
<a href=#90 id=90 data-nosnippet>90</a> <span class="kw">let </span>remainder2 = core::mem::take(commands);
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder2[<span class="number">1</span>..]);
<a href=#92 id=92 data-nosnippet>92</a> <span class="number">2
<a href=#93 id=93 data-nosnippet>93</a> </span>} <span class="kw">else if </span>copylen &lt; <span class="number">2120usize </span>{
<a href=#94 id=94 data-nosnippet>94</a> <span class="kw">let </span>tail: usize = copylen.wrapping_sub(<span class="number">72</span>);
<a href=#95 id=95 data-nosnippet>95</a> <span class="kw">let </span>nbits: usize = Log2FloorNonZero(tail <span class="kw">as </span>u64) <span class="kw">as </span>usize;
<a href=#96 id=96 data-nosnippet>96</a> <span class="kw">let </span>code: usize = nbits.wrapping_add(<span class="number">52</span>);
<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">let </span>extra: usize = tail.wrapping_sub(<span class="number">1usize </span>&lt;&lt; nbits);
<a href=#98 id=98 data-nosnippet>98</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (code | extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#99 id=99 data-nosnippet>99</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#101 id=101 data-nosnippet>101</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">64u32</span>;
<a href=#102 id=102 data-nosnippet>102</a> <span class="kw">let </span>remainder2 = core::mem::take(commands);
<a href=#103 id=103 data-nosnippet>103</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder2[<span class="number">1</span>..]);
<a href=#104 id=104 data-nosnippet>104</a> <span class="number">2
<a href=#105 id=105 data-nosnippet>105</a> </span>} <span class="kw">else </span>{
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">let </span>extra: usize = copylen.wrapping_sub(<span class="number">2120</span>);
<a href=#107 id=107 data-nosnippet>107</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (<span class="number">63usize </span>| extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#110 id=110 data-nosnippet>110</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">64u32</span>;
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">let </span>remainder2 = core::mem::take(commands);
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder2[<span class="number">1</span>..]);
<a href=#113 id=113 data-nosnippet>113</a> <span class="number">2
<a href=#114 id=114 data-nosnippet>114</a> </span>}
<a href=#115 id=115 data-nosnippet>115</a>}
<a href=#116 id=116 data-nosnippet>116</a><span class="kw">fn </span>HashBytesAtOffset(v: u64, offset: i32, shift: usize, length: usize) -&gt; u32 {
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw">let </span>h: u64 = (v &gt;&gt; (<span class="number">8i32 </span>* offset) &lt;&lt; ((<span class="number">8 </span>- length) * <span class="number">8</span>)).wrapping_mul(kHashMul32 <span class="kw">as </span>(u64));
<a href=#118 id=118 data-nosnippet>118</a> (h &gt;&gt; shift) <span class="kw">as </span>u32
<a href=#119 id=119 data-nosnippet>119</a>}
<a href=#120 id=120 data-nosnippet>120</a>
<a href=#121 id=121 data-nosnippet>121</a><span class="kw">fn </span>EmitCopyLen(copylen: usize, commands: <span class="kw-2">&amp;mut &amp;mut </span>[u32]) -&gt; usize {
<a href=#122 id=122 data-nosnippet>122</a> <span class="kw">if </span>copylen &lt; <span class="number">10usize </span>{
<a href=#123 id=123 data-nosnippet>123</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = copylen.wrapping_add(<span class="number">38</span>) <span class="kw">as </span>u32;
<a href=#124 id=124 data-nosnippet>124</a> } <span class="kw">else if </span>copylen &lt; <span class="number">134usize </span>{
<a href=#125 id=125 data-nosnippet>125</a> <span class="kw">let </span>tail: usize = copylen.wrapping_sub(<span class="number">6</span>);
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw">let </span>nbits: usize = Log2FloorNonZero(tail <span class="kw">as </span>u64).wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>usize;
<a href=#127 id=127 data-nosnippet>127</a> <span class="kw">let </span>prefix: usize = tail &gt;&gt; nbits;
<a href=#128 id=128 data-nosnippet>128</a> <span class="kw">let </span>code: usize = (nbits &lt;&lt; <span class="number">1</span>).wrapping_add(prefix).wrapping_add(<span class="number">44</span>);
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw">let </span>extra: usize = tail.wrapping_sub(prefix &lt;&lt; nbits);
<a href=#130 id=130 data-nosnippet>130</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (code | extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#131 id=131 data-nosnippet>131</a> } <span class="kw">else if </span>copylen &lt; <span class="number">2118usize </span>{
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">let </span>tail: usize = copylen.wrapping_sub(<span class="number">70</span>);
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span>nbits: usize = Log2FloorNonZero(tail <span class="kw">as </span>u64) <span class="kw">as </span>usize;
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">let </span>code: usize = nbits.wrapping_add(<span class="number">52</span>);
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw">let </span>extra: usize = tail.wrapping_sub(<span class="number">1usize </span>&lt;&lt; nbits);
<a href=#136 id=136 data-nosnippet>136</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (code | extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#137 id=137 data-nosnippet>137</a> } <span class="kw">else </span>{
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">let </span>extra: usize = copylen.wrapping_sub(<span class="number">2118</span>);
<a href=#139 id=139 data-nosnippet>139</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = (<span class="number">63usize </span>| extra &lt;&lt; <span class="number">8</span>) <span class="kw">as </span>u32;
<a href=#140 id=140 data-nosnippet>140</a> }
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#142 id=142 data-nosnippet>142</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#143 id=143 data-nosnippet>143</a> <span class="number">1
<a href=#144 id=144 data-nosnippet>144</a></span>}
<a href=#145 id=145 data-nosnippet>145</a><span class="kw">fn </span>Hash(p: <span class="kw-2">&amp;</span>[u8], shift: usize, length: usize) -&gt; u32 {
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">let </span>h: u64 =
<a href=#147 id=147 data-nosnippet>147</a> (BROTLI_UNALIGNED_LOAD64(p) &lt;&lt; ((<span class="number">8 </span>- length) * <span class="number">8</span>)).wrapping_mul(kHashMul32 <span class="kw">as </span>(u64));
<a href=#148 id=148 data-nosnippet>148</a> (h &gt;&gt; shift) <span class="kw">as </span>u32
<a href=#149 id=149 data-nosnippet>149</a>}
<a href=#150 id=150 data-nosnippet>150</a>
<a href=#151 id=151 data-nosnippet>151</a><span class="kw">fn </span>IsMatch(p1: <span class="kw-2">&amp;</span>[u8], p2: <span class="kw-2">&amp;</span>[u8], length: usize) -&gt; bool {
<a href=#152 id=152 data-nosnippet>152</a> BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2)
<a href=#153 id=153 data-nosnippet>153</a> &amp;&amp; (length == <span class="number">4 </span>|| (p1[<span class="number">4</span>] == p2[<span class="number">4</span>] &amp;&amp; p1[<span class="number">5</span>] == p2[<span class="number">5</span>]))
<a href=#154 id=154 data-nosnippet>154</a>}
<a href=#155 id=155 data-nosnippet>155</a>
<a href=#156 id=156 data-nosnippet>156</a><span class="attr">#[allow(unused_assignments)]
<a href=#157 id=157 data-nosnippet>157</a></span><span class="kw">fn </span>CreateCommands(
<a href=#158 id=158 data-nosnippet>158</a> input_index: usize,
<a href=#159 id=159 data-nosnippet>159</a> block_size: usize,
<a href=#160 id=160 data-nosnippet>160</a> input_size: usize,
<a href=#161 id=161 data-nosnippet>161</a> base_ip: <span class="kw-2">&amp;</span>[u8],
<a href=#162 id=162 data-nosnippet>162</a> table: <span class="kw-2">&amp;mut </span>[i32],
<a href=#163 id=163 data-nosnippet>163</a> table_bits: usize,
<a href=#164 id=164 data-nosnippet>164</a> min_match: usize,
<a href=#165 id=165 data-nosnippet>165</a> literals: <span class="kw-2">&amp;mut &amp;mut </span>[u8],
<a href=#166 id=166 data-nosnippet>166</a> num_literals: <span class="kw-2">&amp;mut </span>usize,
<a href=#167 id=167 data-nosnippet>167</a> commands: <span class="kw-2">&amp;mut &amp;mut </span>[u32],
<a href=#168 id=168 data-nosnippet>168</a> num_commands: <span class="kw-2">&amp;mut </span>usize,
<a href=#169 id=169 data-nosnippet>169</a>) {
<a href=#170 id=170 data-nosnippet>170</a> <span class="kw">let </span><span class="kw-2">mut </span>ip_index: usize = input_index;
<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">let </span>shift: usize = (<span class="number">64u32 </span><span class="kw">as </span>usize).wrapping_sub(table_bits);
<a href=#172 id=172 data-nosnippet>172</a> <span class="kw">let </span>ip_end: usize = input_index.wrapping_add(block_size);
<a href=#173 id=173 data-nosnippet>173</a> <span class="kw">let </span><span class="kw-2">mut </span>next_emit: usize = input_index;
<a href=#174 id=174 data-nosnippet>174</a> <span class="kw">let </span><span class="kw-2">mut </span>last_distance: i32 = -<span class="number">1i32</span>;
<a href=#175 id=175 data-nosnippet>175</a> <span class="kw">let </span>kInputMarginBytes: usize = <span class="number">16usize</span>;
<a href=#176 id=176 data-nosnippet>176</a>
<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">if </span>block_size &gt;= kInputMarginBytes {
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">let </span>len_limit: usize = min(
<a href=#179 id=179 data-nosnippet>179</a> block_size.wrapping_sub(min_match),
<a href=#180 id=180 data-nosnippet>180</a> input_size.wrapping_sub(kInputMarginBytes),
<a href=#181 id=181 data-nosnippet>181</a> );
<a href=#182 id=182 data-nosnippet>182</a> <span class="kw">let </span>ip_limit: usize = input_index.wrapping_add(len_limit);
<a href=#183 id=183 data-nosnippet>183</a> <span class="kw">let </span><span class="kw-2">mut </span>next_hash: u32;
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">let </span><span class="kw-2">mut </span>goto_emit_remainder = <span class="bool-val">false</span>;
<a href=#185 id=185 data-nosnippet>185</a> next_hash = Hash(
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw-2">&amp;</span>base_ip[{
<a href=#187 id=187 data-nosnippet>187</a> ip_index = ip_index.wrapping_add(<span class="number">1</span>);
<a href=#188 id=188 data-nosnippet>188</a> ip_index
<a href=#189 id=189 data-nosnippet>189</a> }..],
<a href=#190 id=190 data-nosnippet>190</a> shift,
<a href=#191 id=191 data-nosnippet>191</a> min_match,
<a href=#192 id=192 data-nosnippet>192</a> );
<a href=#193 id=193 data-nosnippet>193</a> <span class="kw">while </span>!goto_emit_remainder {
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">let </span><span class="kw-2">mut </span>skip: u32 = <span class="number">32u32</span>;
<a href=#195 id=195 data-nosnippet>195</a> <span class="kw">let </span><span class="kw-2">mut </span>next_ip: usize = ip_index;
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw">let </span><span class="kw-2">mut </span>candidate: usize = <span class="number">0</span>;
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">loop </span>{
<a href=#198 id=198 data-nosnippet>198</a> {
<a href=#199 id=199 data-nosnippet>199</a> <span class="lifetime">'break3</span>: <span class="kw">loop </span>{
<a href=#200 id=200 data-nosnippet>200</a> {
<a href=#201 id=201 data-nosnippet>201</a> <span class="kw">let </span>hash: u32 = next_hash;
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">let </span>bytes_between_hash_lookups: u32 = skip &gt;&gt; <span class="number">5</span>;
<a href=#203 id=203 data-nosnippet>203</a> skip = skip.wrapping_add(<span class="number">1</span>);
<a href=#204 id=204 data-nosnippet>204</a> ip_index = next_ip;
<a href=#205 id=205 data-nosnippet>205</a> next_ip = ip_index.wrapping_add(bytes_between_hash_lookups <span class="kw">as </span>usize);
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">if </span>next_ip &gt; ip_limit {
<a href=#207 id=207 data-nosnippet>207</a> goto_emit_remainder = <span class="bool-val">true</span>;
<a href=#208 id=208 data-nosnippet>208</a> {
<a href=#209 id=209 data-nosnippet>209</a> <span class="kw">break </span><span class="lifetime">'break3</span>;
<a href=#210 id=210 data-nosnippet>210</a> }
<a href=#211 id=211 data-nosnippet>211</a> }
<a href=#212 id=212 data-nosnippet>212</a> next_hash = Hash(<span class="kw-2">&amp;</span>base_ip[next_ip..], shift, min_match);
<a href=#213 id=213 data-nosnippet>213</a> candidate = ip_index.wrapping_sub(last_distance <span class="kw">as </span>usize);
<a href=#214 id=214 data-nosnippet>214</a> <span class="kw">if </span>IsMatch(<span class="kw-2">&amp;</span>base_ip[ip_index..], <span class="kw-2">&amp;</span>base_ip[candidate..], min_match)
<a href=#215 id=215 data-nosnippet>215</a> &amp;&amp; candidate &lt; ip_index
<a href=#216 id=216 data-nosnippet>216</a> {
<a href=#217 id=217 data-nosnippet>217</a> table[(hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">0</span>) <span class="kw">as </span>i32;
<a href=#218 id=218 data-nosnippet>218</a> {
<a href=#219 id=219 data-nosnippet>219</a> <span class="kw">break </span><span class="lifetime">'break3</span>;
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a> }
<a href=#222 id=222 data-nosnippet>222</a> candidate = table[(hash <span class="kw">as </span>usize)] <span class="kw">as </span>usize;
<a href=#223 id=223 data-nosnippet>223</a> table[(hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">0</span>) <span class="kw">as </span>i32;
<a href=#224 id=224 data-nosnippet>224</a> }
<a href=#225 id=225 data-nosnippet>225</a> <span class="kw">if </span>IsMatch(<span class="kw-2">&amp;</span>base_ip[ip_index..], <span class="kw-2">&amp;</span>base_ip[candidate..], min_match) {
<a href=#226 id=226 data-nosnippet>226</a> <span class="kw">break</span>;
<a href=#227 id=227 data-nosnippet>227</a> }
<a href=#228 id=228 data-nosnippet>228</a> }
<a href=#229 id=229 data-nosnippet>229</a> }
<a href=#230 id=230 data-nosnippet>230</a> <span class="kw">if </span>!(ip_index.wrapping_sub(candidate)
<a href=#231 id=231 data-nosnippet>231</a> &gt; (<span class="number">1usize </span>&lt;&lt; <span class="number">18</span>).wrapping_sub(<span class="number">16</span>) <span class="kw">as </span>isize <span class="kw">as </span>usize
<a href=#232 id=232 data-nosnippet>232</a> &amp;&amp; !goto_emit_remainder)
<a href=#233 id=233 data-nosnippet>233</a> {
<a href=#234 id=234 data-nosnippet>234</a> <span class="kw">break</span>;
<a href=#235 id=235 data-nosnippet>235</a> }
<a href=#236 id=236 data-nosnippet>236</a> }
<a href=#237 id=237 data-nosnippet>237</a> <span class="kw">if </span>goto_emit_remainder {
<a href=#238 id=238 data-nosnippet>238</a> <span class="kw">break</span>;
<a href=#239 id=239 data-nosnippet>239</a> }
<a href=#240 id=240 data-nosnippet>240</a> {
<a href=#241 id=241 data-nosnippet>241</a> <span class="kw">let </span>base: usize = ip_index;
<a href=#242 id=242 data-nosnippet>242</a> <span class="kw">let </span>matched: usize = min_match.wrapping_add(FindMatchLengthWithLimit(
<a href=#243 id=243 data-nosnippet>243</a> <span class="kw-2">&amp;</span>base_ip[(candidate + min_match)..],
<a href=#244 id=244 data-nosnippet>244</a> <span class="kw-2">&amp;</span>base_ip[(ip_index + min_match)..],
<a href=#245 id=245 data-nosnippet>245</a> ip_end.wrapping_sub(ip_index).wrapping_sub(min_match),
<a href=#246 id=246 data-nosnippet>246</a> ));
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">let </span>distance: i32 = base.wrapping_sub(candidate) <span class="kw">as </span>i32;
<a href=#248 id=248 data-nosnippet>248</a> <span class="kw">let </span>insert: i32 = base.wrapping_sub(next_emit) <span class="kw">as </span>i32;
<a href=#249 id=249 data-nosnippet>249</a> ip_index = ip_index.wrapping_add(matched);
<a href=#250 id=250 data-nosnippet>250</a> <span class="kw-2">*</span>num_commands += EmitInsertLen(insert <span class="kw">as </span>u32, commands);
<a href=#251 id=251 data-nosnippet>251</a> (<span class="kw-2">*</span>literals)[..(insert <span class="kw">as </span>usize)]
<a href=#252 id=252 data-nosnippet>252</a> .clone_from_slice(<span class="kw-2">&amp;</span>base_ip[next_emit..(next_emit + insert <span class="kw">as </span>usize)]);
<a href=#253 id=253 data-nosnippet>253</a> <span class="kw-2">*</span>num_literals += insert <span class="kw">as </span>usize;
<a href=#254 id=254 data-nosnippet>254</a> <span class="kw">let </span>new_literals = core::mem::take(literals);
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">let _ </span>= core::mem::replace(literals, <span class="kw-2">&amp;mut </span>new_literals[(insert <span class="kw">as </span>usize)..]);
<a href=#256 id=256 data-nosnippet>256</a> <span class="kw">if </span>distance == last_distance {
<a href=#257 id=257 data-nosnippet>257</a> (<span class="kw-2">*</span>commands)[<span class="number">0</span>] = <span class="number">64u32</span>;
<a href=#258 id=258 data-nosnippet>258</a> <span class="kw">let </span>remainder = core::mem::take(commands);
<a href=#259 id=259 data-nosnippet>259</a> <span class="kw">let _ </span>= core::mem::replace(commands, <span class="kw-2">&amp;mut </span>remainder[<span class="number">1</span>..]);
<a href=#260 id=260 data-nosnippet>260</a> <span class="kw-2">*</span>num_commands += <span class="number">1</span>;
<a href=#261 id=261 data-nosnippet>261</a> } <span class="kw">else </span>{
<a href=#262 id=262 data-nosnippet>262</a> <span class="kw-2">*</span>num_commands += EmitDistance(distance <span class="kw">as </span>u32, commands);
<a href=#263 id=263 data-nosnippet>263</a> last_distance = distance;
<a href=#264 id=264 data-nosnippet>264</a> }
<a href=#265 id=265 data-nosnippet>265</a> <span class="kw-2">*</span>num_commands += EmitCopyLenLastDistance(matched, commands);
<a href=#266 id=266 data-nosnippet>266</a> next_emit = ip_index;
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">if </span>ip_index &gt;= ip_limit {
<a href=#268 id=268 data-nosnippet>268</a> goto_emit_remainder = <span class="bool-val">true</span>;
<a href=#269 id=269 data-nosnippet>269</a> {
<a href=#270 id=270 data-nosnippet>270</a> <span class="kw">break</span>;
<a href=#271 id=271 data-nosnippet>271</a> }
<a href=#272 id=272 data-nosnippet>272</a> }
<a href=#273 id=273 data-nosnippet>273</a> {
<a href=#274 id=274 data-nosnippet>274</a> <span class="kw">let </span><span class="kw-2">mut </span>input_bytes: u64;
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">let </span><span class="kw-2">mut </span>prev_hash: u32;
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">let </span>cur_hash: u32;
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw">if </span>min_match == <span class="number">4 </span>{
<a href=#278 id=278 data-nosnippet>278</a> input_bytes = BROTLI_UNALIGNED_LOAD64(<span class="kw-2">&amp;</span>base_ip[(ip_index - <span class="number">3</span>)..]);
<a href=#279 id=279 data-nosnippet>279</a> cur_hash = HashBytesAtOffset(input_bytes, <span class="number">3i32</span>, shift, min_match);
<a href=#280 id=280 data-nosnippet>280</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#281 id=281 data-nosnippet>281</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">3</span>) <span class="kw">as </span>i32;
<a href=#282 id=282 data-nosnippet>282</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">1i32</span>, shift, min_match);
<a href=#283 id=283 data-nosnippet>283</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">2</span>) <span class="kw">as </span>i32;
<a href=#284 id=284 data-nosnippet>284</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#285 id=285 data-nosnippet>285</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>i32;
<a href=#286 id=286 data-nosnippet>286</a> } <span class="kw">else </span>{
<a href=#287 id=287 data-nosnippet>287</a> <span class="macro">assert!</span>(ip_index &gt;= <span class="number">5</span>);
<a href=#288 id=288 data-nosnippet>288</a> <span class="comment">// could this be off the end FIXME
<a href=#289 id=289 data-nosnippet>289</a> </span>input_bytes = BROTLI_UNALIGNED_LOAD64(<span class="kw-2">&amp;</span>base_ip[(ip_index - <span class="number">5</span>)..]);
<a href=#290 id=290 data-nosnippet>290</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#291 id=291 data-nosnippet>291</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">5</span>) <span class="kw">as </span>i32;
<a href=#292 id=292 data-nosnippet>292</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">1i32</span>, shift, min_match);
<a href=#293 id=293 data-nosnippet>293</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">4</span>) <span class="kw">as </span>i32;
<a href=#294 id=294 data-nosnippet>294</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">2i32</span>, shift, min_match);
<a href=#295 id=295 data-nosnippet>295</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">3</span>) <span class="kw">as </span>i32;
<a href=#296 id=296 data-nosnippet>296</a> <span class="macro">assert!</span>(ip_index &gt;= <span class="number">2</span>);
<a href=#297 id=297 data-nosnippet>297</a> input_bytes = BROTLI_UNALIGNED_LOAD64(<span class="kw-2">&amp;</span>base_ip[(ip_index - <span class="number">2</span>)..]);
<a href=#298 id=298 data-nosnippet>298</a> cur_hash = HashBytesAtOffset(input_bytes, <span class="number">2i32</span>, shift, min_match);
<a href=#299 id=299 data-nosnippet>299</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#300 id=300 data-nosnippet>300</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">2</span>) <span class="kw">as </span>i32;
<a href=#301 id=301 data-nosnippet>301</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">1i32</span>, shift, min_match);
<a href=#302 id=302 data-nosnippet>302</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>i32;
<a href=#303 id=303 data-nosnippet>303</a> }
<a href=#304 id=304 data-nosnippet>304</a> candidate = table[(cur_hash <span class="kw">as </span>usize)] <span class="kw">as </span>usize;
<a href=#305 id=305 data-nosnippet>305</a> table[(cur_hash <span class="kw">as </span>usize)] = ip_index <span class="kw">as </span>i32;
<a href=#306 id=306 data-nosnippet>306</a> }
<a href=#307 id=307 data-nosnippet>307</a> }
<a href=#308 id=308 data-nosnippet>308</a> <span class="kw">while </span>ip_index.wrapping_sub(candidate)
<a href=#309 id=309 data-nosnippet>309</a> &lt;= (<span class="number">1usize </span>&lt;&lt; <span class="number">18</span>).wrapping_sub(<span class="number">16</span>) <span class="kw">as </span>isize <span class="kw">as </span>usize
<a href=#310 id=310 data-nosnippet>310</a> &amp;&amp; IsMatch(<span class="kw-2">&amp;</span>base_ip[ip_index..], <span class="kw-2">&amp;</span>base_ip[candidate..], min_match)
<a href=#311 id=311 data-nosnippet>311</a> {
<a href=#312 id=312 data-nosnippet>312</a> <span class="kw">let </span>base_index: usize = ip_index;
<a href=#313 id=313 data-nosnippet>313</a> <span class="kw">let </span>matched: usize = min_match.wrapping_add(FindMatchLengthWithLimit(
<a href=#314 id=314 data-nosnippet>314</a> <span class="kw-2">&amp;</span>base_ip[(candidate + min_match)..],
<a href=#315 id=315 data-nosnippet>315</a> <span class="kw-2">&amp;</span>base_ip[(ip_index + min_match)..],
<a href=#316 id=316 data-nosnippet>316</a> ip_end.wrapping_sub(ip_index).wrapping_sub(min_match),
<a href=#317 id=317 data-nosnippet>317</a> ));
<a href=#318 id=318 data-nosnippet>318</a> ip_index = ip_index.wrapping_add(matched);
<a href=#319 id=319 data-nosnippet>319</a> last_distance = base_index.wrapping_sub(candidate) <span class="kw">as </span>i32;
<a href=#320 id=320 data-nosnippet>320</a> <span class="kw-2">*</span>num_commands += EmitCopyLen(matched, commands);
<a href=#321 id=321 data-nosnippet>321</a> <span class="kw-2">*</span>num_commands += EmitDistance(last_distance <span class="kw">as </span>u32, commands);
<a href=#322 id=322 data-nosnippet>322</a> next_emit = ip_index;
<a href=#323 id=323 data-nosnippet>323</a> <span class="kw">if </span>ip_index &gt;= ip_limit {
<a href=#324 id=324 data-nosnippet>324</a> goto_emit_remainder = <span class="bool-val">true</span>;
<a href=#325 id=325 data-nosnippet>325</a> {
<a href=#326 id=326 data-nosnippet>326</a> <span class="kw">break</span>;
<a href=#327 id=327 data-nosnippet>327</a> }
<a href=#328 id=328 data-nosnippet>328</a> }
<a href=#329 id=329 data-nosnippet>329</a> {
<a href=#330 id=330 data-nosnippet>330</a> <span class="macro">assert!</span>(ip_index &gt;= <span class="number">5</span>);
<a href=#331 id=331 data-nosnippet>331</a> <span class="kw">let </span><span class="kw-2">mut </span>input_bytes: u64;
<a href=#332 id=332 data-nosnippet>332</a>
<a href=#333 id=333 data-nosnippet>333</a> <span class="kw">let </span>cur_hash: u32;
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">let </span><span class="kw-2">mut </span>prev_hash: u32;
<a href=#335 id=335 data-nosnippet>335</a> <span class="kw">if </span>min_match == <span class="number">4 </span>{
<a href=#336 id=336 data-nosnippet>336</a> input_bytes = BROTLI_UNALIGNED_LOAD64(<span class="kw-2">&amp;</span>base_ip[(ip_index - <span class="number">3</span>)..]);
<a href=#337 id=337 data-nosnippet>337</a> cur_hash = HashBytesAtOffset(input_bytes, <span class="number">3i32</span>, shift, min_match);
<a href=#338 id=338 data-nosnippet>338</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#339 id=339 data-nosnippet>339</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">3</span>) <span class="kw">as </span>i32;
<a href=#340 id=340 data-nosnippet>340</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">1i32</span>, shift, min_match);
<a href=#341 id=341 data-nosnippet>341</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">2</span>) <span class="kw">as </span>i32;
<a href=#342 id=342 data-nosnippet>342</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">2i32</span>, shift, min_match);
<a href=#343 id=343 data-nosnippet>343</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>i32;
<a href=#344 id=344 data-nosnippet>344</a> } <span class="kw">else </span>{
<a href=#345 id=345 data-nosnippet>345</a> input_bytes = BROTLI_UNALIGNED_LOAD64(<span class="kw-2">&amp;</span>base_ip[(ip_index - <span class="number">5</span>)..]);
<a href=#346 id=346 data-nosnippet>346</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#347 id=347 data-nosnippet>347</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">5</span>) <span class="kw">as </span>i32;
<a href=#348 id=348 data-nosnippet>348</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">1i32</span>, shift, min_match);
<a href=#349 id=349 data-nosnippet>349</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">4</span>) <span class="kw">as </span>i32;
<a href=#350 id=350 data-nosnippet>350</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">2i32</span>, shift, min_match);
<a href=#351 id=351 data-nosnippet>351</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">3</span>) <span class="kw">as </span>i32;
<a href=#352 id=352 data-nosnippet>352</a> <span class="macro">assert!</span>(ip_index &gt;= <span class="number">2</span>);
<a href=#353 id=353 data-nosnippet>353</a> input_bytes = BROTLI_UNALIGNED_LOAD64(<span class="kw-2">&amp;</span>base_ip[(ip_index - <span class="number">2</span>)..]);
<a href=#354 id=354 data-nosnippet>354</a> cur_hash = HashBytesAtOffset(input_bytes, <span class="number">2i32</span>, shift, min_match);
<a href=#355 id=355 data-nosnippet>355</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">0i32</span>, shift, min_match);
<a href=#356 id=356 data-nosnippet>356</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">2</span>) <span class="kw">as </span>i32;
<a href=#357 id=357 data-nosnippet>357</a> prev_hash = HashBytesAtOffset(input_bytes, <span class="number">1i32</span>, shift, min_match);
<a href=#358 id=358 data-nosnippet>358</a> table[(prev_hash <span class="kw">as </span>usize)] = ip_index.wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>i32;
<a href=#359 id=359 data-nosnippet>359</a> }
<a href=#360 id=360 data-nosnippet>360</a> candidate = table[(cur_hash <span class="kw">as </span>usize)] <span class="kw">as </span>usize;
<a href=#361 id=361 data-nosnippet>361</a> table[(cur_hash <span class="kw">as </span>usize)] = ip_index <span class="kw">as </span>i32;
<a href=#362 id=362 data-nosnippet>362</a> }
<a href=#363 id=363 data-nosnippet>363</a> }
<a href=#364 id=364 data-nosnippet>364</a> <span class="kw">if </span>!goto_emit_remainder {
<a href=#365 id=365 data-nosnippet>365</a> next_hash = Hash(
<a href=#366 id=366 data-nosnippet>366</a> <span class="kw-2">&amp;</span>base_ip[{
<a href=#367 id=367 data-nosnippet>367</a> ip_index = ip_index.wrapping_add(<span class="number">1</span>);
<a href=#368 id=368 data-nosnippet>368</a> ip_index
<a href=#369 id=369 data-nosnippet>369</a> }..],
<a href=#370 id=370 data-nosnippet>370</a> shift,
<a href=#371 id=371 data-nosnippet>371</a> min_match,
<a href=#372 id=372 data-nosnippet>372</a> );
<a href=#373 id=373 data-nosnippet>373</a> }
<a href=#374 id=374 data-nosnippet>374</a> }
<a href=#375 id=375 data-nosnippet>375</a> }
<a href=#376 id=376 data-nosnippet>376</a> <span class="kw">if </span>next_emit &lt; ip_end {
<a href=#377 id=377 data-nosnippet>377</a> <span class="kw">let </span>insert: u32 = ip_end.wrapping_sub(next_emit) <span class="kw">as </span>u32;
<a href=#378 id=378 data-nosnippet>378</a> <span class="kw-2">*</span>num_commands += EmitInsertLen(insert, commands);
<a href=#379 id=379 data-nosnippet>379</a> literals[..insert <span class="kw">as </span>usize]
<a href=#380 id=380 data-nosnippet>380</a> .clone_from_slice(<span class="kw-2">&amp;</span>base_ip[next_emit..(next_emit + insert <span class="kw">as </span>usize)]);
<a href=#381 id=381 data-nosnippet>381</a> <span class="kw">let </span><span class="kw-2">mut </span>xliterals = core::mem::take(literals);
<a href=#382 id=382 data-nosnippet>382</a> <span class="kw-2">*</span>literals = <span class="kw-2">&amp;mut </span>core::mem::take(<span class="kw-2">&amp;mut </span>xliterals)[(insert <span class="kw">as </span>usize)..];
<a href=#383 id=383 data-nosnippet>383</a> <span class="kw-2">*</span>num_literals += insert <span class="kw">as </span>usize;
<a href=#384 id=384 data-nosnippet>384</a> }
<a href=#385 id=385 data-nosnippet>385</a>}
<a href=#386 id=386 data-nosnippet>386</a>
<a href=#387 id=387 data-nosnippet>387</a><span class="kw">fn </span>ShouldCompress(input: <span class="kw-2">&amp;</span>[u8], input_size: usize, num_literals: usize) -&gt; bool {
<a href=#388 id=388 data-nosnippet>388</a> <span class="kw">let </span>corpus_size = input_size <span class="kw">as </span>floatX;
<a href=#389 id=389 data-nosnippet>389</a> <span class="kw">if </span>(num_literals <span class="kw">as </span>floatX) &lt; <span class="number">0.98 </span>* corpus_size {
<a href=#390 id=390 data-nosnippet>390</a> <span class="bool-val">true
<a href=#391 id=391 data-nosnippet>391</a> </span>} <span class="kw">else </span>{
<a href=#392 id=392 data-nosnippet>392</a> <span class="kw">let </span><span class="kw-2">mut </span>literal_histo: [u32; <span class="number">256</span>] = [<span class="number">0</span>; <span class="number">256</span>];
<a href=#393 id=393 data-nosnippet>393</a> <span class="kw">let </span>max_total_bit_cost: floatX = corpus_size * <span class="number">8.0 </span>* <span class="number">0.98 </span>/ <span class="number">43.0</span>;
<a href=#394 id=394 data-nosnippet>394</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#395 id=395 data-nosnippet>395</a> i = <span class="number">0usize</span>;
<a href=#396 id=396 data-nosnippet>396</a> <span class="kw">while </span>i &lt; input_size {
<a href=#397 id=397 data-nosnippet>397</a> {
<a href=#398 id=398 data-nosnippet>398</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#399 id=399 data-nosnippet>399</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>literal_histo[input[i] <span class="kw">as </span>usize];
<a href=#400 id=400 data-nosnippet>400</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#401 id=401 data-nosnippet>401</a> }
<a href=#402 id=402 data-nosnippet>402</a> i = i.wrapping_add(<span class="number">43</span>);
<a href=#403 id=403 data-nosnippet>403</a> }
<a href=#404 id=404 data-nosnippet>404</a> BitsEntropy(<span class="kw-2">&amp;mut </span>literal_histo[..], <span class="number">256</span>) &lt; max_total_bit_cost
<a href=#405 id=405 data-nosnippet>405</a> }
<a href=#406 id=406 data-nosnippet>406</a>}
<a href=#407 id=407 data-nosnippet>407</a>
<a href=#408 id=408 data-nosnippet>408</a><span class="kw">pub fn </span>BrotliWriteBits(n_bits: usize, bits: u64, pos: <span class="kw-2">&amp;mut </span>usize, array: <span class="kw-2">&amp;mut </span>[u8]) {
<a href=#409 id=409 data-nosnippet>409</a> <span class="kw">let </span>p = <span class="kw-2">&amp;mut </span>array[(<span class="kw-2">*</span>pos &gt;&gt; <span class="number">3</span>)..];
<a href=#410 id=410 data-nosnippet>410</a> <span class="kw">let </span><span class="kw-2">mut </span>v: u64 = p[<span class="number">0</span>] <span class="kw">as </span>(u64);
<a href=#411 id=411 data-nosnippet>411</a> v |= bits &lt;&lt; (<span class="kw-2">*</span>pos &amp; <span class="number">7</span>);
<a href=#412 id=412 data-nosnippet>412</a> BROTLI_UNALIGNED_STORE64(p, v);
<a href=#413 id=413 data-nosnippet>413</a> <span class="kw-2">*</span>pos = pos.wrapping_add(n_bits);
<a href=#414 id=414 data-nosnippet>414</a>}
<a href=#415 id=415 data-nosnippet>415</a>
<a href=#416 id=416 data-nosnippet>416</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>store_meta_block_header(
<a href=#417 id=417 data-nosnippet>417</a> len: usize,
<a href=#418 id=418 data-nosnippet>418</a> is_uncompressed: bool,
<a href=#419 id=419 data-nosnippet>419</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#420 id=420 data-nosnippet>420</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#421 id=421 data-nosnippet>421</a>) {
<a href=#422 id=422 data-nosnippet>422</a> <span class="kw">let </span><span class="kw-2">mut </span>nibbles: u64 = <span class="number">6</span>;
<a href=#423 id=423 data-nosnippet>423</a> BrotliWriteBits(<span class="number">1</span>, <span class="number">0</span>, storage_ix, storage);
<a href=#424 id=424 data-nosnippet>424</a> <span class="kw">if </span>len &lt;= (<span class="number">1u32 </span>&lt;&lt; <span class="number">16</span>) <span class="kw">as </span>usize {
<a href=#425 id=425 data-nosnippet>425</a> nibbles = <span class="number">4</span>;
<a href=#426 id=426 data-nosnippet>426</a> } <span class="kw">else if </span>len &lt;= (<span class="number">1u32 </span>&lt;&lt; <span class="number">20</span>) <span class="kw">as </span>usize {
<a href=#427 id=427 data-nosnippet>427</a> nibbles = <span class="number">5</span>;
<a href=#428 id=428 data-nosnippet>428</a> }
<a href=#429 id=429 data-nosnippet>429</a> BrotliWriteBits(<span class="number">2</span>, nibbles.wrapping_sub(<span class="number">4</span>), storage_ix, storage);
<a href=#430 id=430 data-nosnippet>430</a> BrotliWriteBits(
<a href=#431 id=431 data-nosnippet>431</a> nibbles.wrapping_mul(<span class="number">4</span>) <span class="kw">as </span>usize,
<a href=#432 id=432 data-nosnippet>432</a> len.wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>u64,
<a href=#433 id=433 data-nosnippet>433</a> storage_ix,
<a href=#434 id=434 data-nosnippet>434</a> storage,
<a href=#435 id=435 data-nosnippet>435</a> );
<a href=#436 id=436 data-nosnippet>436</a> BrotliWriteBits(<span class="number">1</span>, u64::from(is_uncompressed), storage_ix, storage);
<a href=#437 id=437 data-nosnippet>437</a>}
<a href=#438 id=438 data-nosnippet>438</a>
<a href=#439 id=439 data-nosnippet>439</a><span class="kw">pub fn </span>memcpy&lt;T: Sized + Clone&gt;(
<a href=#440 id=440 data-nosnippet>440</a> dst: <span class="kw-2">&amp;mut </span>[T],
<a href=#441 id=441 data-nosnippet>441</a> dst_offset: usize,
<a href=#442 id=442 data-nosnippet>442</a> src: <span class="kw-2">&amp;</span>[T],
<a href=#443 id=443 data-nosnippet>443</a> src_offset: usize,
<a href=#444 id=444 data-nosnippet>444</a> size_to_copy: usize,
<a href=#445 id=445 data-nosnippet>445</a>) {
<a href=#446 id=446 data-nosnippet>446</a> dst[dst_offset..(dst_offset + size_to_copy)]
<a href=#447 id=447 data-nosnippet>447</a> .clone_from_slice(<span class="kw-2">&amp;</span>src[src_offset..(src_offset + size_to_copy)]);
<a href=#448 id=448 data-nosnippet>448</a>}
<a href=#449 id=449 data-nosnippet>449</a><span class="kw">fn </span>BuildAndStoreCommandPrefixCode(
<a href=#450 id=450 data-nosnippet>450</a> histogram: <span class="kw-2">&amp;</span>[u32],
<a href=#451 id=451 data-nosnippet>451</a> depth: <span class="kw-2">&amp;mut </span>[u8],
<a href=#452 id=452 data-nosnippet>452</a> bits: <span class="kw-2">&amp;mut </span>[u16],
<a href=#453 id=453 data-nosnippet>453</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#454 id=454 data-nosnippet>454</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#455 id=455 data-nosnippet>455</a>) {
<a href=#456 id=456 data-nosnippet>456</a> <span class="kw">let </span><span class="kw-2">mut </span>tree = [HuffmanTree::new(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>); <span class="number">129</span>];
<a href=#457 id=457 data-nosnippet>457</a> <span class="kw">let </span><span class="kw-2">mut </span>cmd_depth: [u8; <span class="number">704</span>] = [<span class="number">0</span>; <span class="number">704</span>];
<a href=#458 id=458 data-nosnippet>458</a> <span class="kw">let </span><span class="kw-2">mut </span>cmd_bits: [u16; <span class="number">64</span>] = [<span class="number">0</span>; <span class="number">64</span>];
<a href=#459 id=459 data-nosnippet>459</a> BrotliCreateHuffmanTree(histogram, <span class="number">64usize</span>, <span class="number">15i32</span>, <span class="kw-2">&amp;mut </span>tree[..], depth);
<a href=#460 id=460 data-nosnippet>460</a> BrotliCreateHuffmanTree(
<a href=#461 id=461 data-nosnippet>461</a> <span class="kw-2">&amp;</span>histogram[<span class="number">64</span>..],
<a href=#462 id=462 data-nosnippet>462</a> <span class="number">64usize</span>,
<a href=#463 id=463 data-nosnippet>463</a> <span class="number">14i32</span>,
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw-2">&amp;mut </span>tree[..],
<a href=#465 id=465 data-nosnippet>465</a> <span class="kw-2">&amp;mut </span>depth[<span class="number">64</span>..],
<a href=#466 id=466 data-nosnippet>466</a> );
<a href=#467 id=467 data-nosnippet>467</a> <span class="comment">/* We have to jump through a few hoops here in order to compute
<a href=#468 id=468 data-nosnippet>468</a> the command bits because the symbols are in a different order than in
<a href=#469 id=469 data-nosnippet>469</a> the full alphabet. This looks complicated, but having the symbols
<a href=#470 id=470 data-nosnippet>470</a> in this order in the command bits saves a few branches in the Emit*
<a href=#471 id=471 data-nosnippet>471</a> functions. */
<a href=#472 id=472 data-nosnippet>472</a> </span>memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">0</span>, depth, <span class="number">24</span>, <span class="number">24</span>);
<a href=#473 id=473 data-nosnippet>473</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">24</span>, depth, <span class="number">0</span>, <span class="number">8</span>);
<a href=#474 id=474 data-nosnippet>474</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">32usize</span>, depth, (<span class="number">48usize</span>), <span class="number">8usize</span>);
<a href=#475 id=475 data-nosnippet>475</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">40usize</span>, depth, (<span class="number">8usize</span>), <span class="number">8usize</span>);
<a href=#476 id=476 data-nosnippet>476</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">48usize</span>, depth, (<span class="number">56usize</span>), <span class="number">8usize</span>);
<a href=#477 id=477 data-nosnippet>477</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">56usize</span>, depth, (<span class="number">16usize</span>), <span class="number">8usize</span>);
<a href=#478 id=478 data-nosnippet>478</a> BrotliConvertBitDepthsToSymbols(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">64usize</span>, <span class="kw-2">&amp;mut </span>cmd_bits[..]);
<a href=#479 id=479 data-nosnippet>479</a> memcpy(bits, <span class="number">0</span>, <span class="kw-2">&amp;</span>cmd_bits[..], <span class="number">24usize</span>, <span class="number">16usize</span>);
<a href=#480 id=480 data-nosnippet>480</a> memcpy(bits, (<span class="number">8usize</span>), <span class="kw-2">&amp;</span>cmd_bits[..], <span class="number">40usize</span>, <span class="number">8usize</span>);
<a href=#481 id=481 data-nosnippet>481</a> memcpy(bits, (<span class="number">16usize</span>), <span class="kw-2">&amp;</span>cmd_bits[..], <span class="number">56usize</span>, <span class="number">8usize</span>);
<a href=#482 id=482 data-nosnippet>482</a> memcpy(bits, (<span class="number">24usize</span>), <span class="kw-2">&amp;</span>cmd_bits[..], <span class="number">0</span>, <span class="number">48usize</span>);
<a href=#483 id=483 data-nosnippet>483</a> memcpy(bits, (<span class="number">48usize</span>), <span class="kw-2">&amp;</span>cmd_bits[..], <span class="number">32usize</span>, <span class="number">8usize</span>);
<a href=#484 id=484 data-nosnippet>484</a> memcpy(bits, (<span class="number">56usize</span>), <span class="kw-2">&amp;</span>cmd_bits[..], <span class="number">48usize</span>, <span class="number">8usize</span>);
<a href=#485 id=485 data-nosnippet>485</a> BrotliConvertBitDepthsToSymbols(<span class="kw-2">&amp;mut </span>depth[<span class="number">64</span>..], <span class="number">64usize</span>, <span class="kw-2">&amp;mut </span>bits[<span class="number">64</span>..]);
<a href=#486 id=486 data-nosnippet>486</a> {
<a href=#487 id=487 data-nosnippet>487</a> <span class="kw">for </span>item <span class="kw">in </span>cmd_depth[..<span class="number">64</span>].iter_mut() {
<a href=#488 id=488 data-nosnippet>488</a> <span class="kw-2">*</span>item = <span class="number">0</span>;
<a href=#489 id=489 data-nosnippet>489</a> }
<a href=#490 id=490 data-nosnippet>490</a> <span class="comment">//memset(&amp;mut cmd_depth[..], 0i32, 64usize);
<a href=#491 id=491 data-nosnippet>491</a> </span>memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">0</span>, depth, (<span class="number">24usize</span>), <span class="number">8usize</span>);
<a href=#492 id=492 data-nosnippet>492</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">64usize</span>, depth, (<span class="number">32usize</span>), <span class="number">8usize</span>);
<a href=#493 id=493 data-nosnippet>493</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">128usize</span>, depth, (<span class="number">40usize</span>), <span class="number">8usize</span>);
<a href=#494 id=494 data-nosnippet>494</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">192usize</span>, depth, (<span class="number">48usize</span>), <span class="number">8usize</span>);
<a href=#495 id=495 data-nosnippet>495</a> memcpy(<span class="kw-2">&amp;mut </span>cmd_depth[..], <span class="number">384usize</span>, depth, (<span class="number">56usize</span>), <span class="number">8usize</span>);
<a href=#496 id=496 data-nosnippet>496</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..<span class="number">8usize </span>{
<a href=#497 id=497 data-nosnippet>497</a> cmd_depth[(<span class="number">128usize</span>).wrapping_add((<span class="number">8usize</span>).wrapping_mul(i))] = depth[i];
<a href=#498 id=498 data-nosnippet>498</a> cmd_depth[(<span class="number">256usize</span>).wrapping_add((<span class="number">8usize</span>).wrapping_mul(i))] = depth[i.wrapping_add(<span class="number">8</span>)];
<a href=#499 id=499 data-nosnippet>499</a> cmd_depth[(<span class="number">448usize</span>).wrapping_add((<span class="number">8usize</span>).wrapping_mul(i))] =
<a href=#500 id=500 data-nosnippet>500</a> depth[i.wrapping_add(<span class="number">16</span>)];
<a href=#501 id=501 data-nosnippet>501</a> }
<a href=#502 id=502 data-nosnippet>502</a> BrotliStoreHuffmanTree(
<a href=#503 id=503 data-nosnippet>503</a> <span class="kw-2">&amp;mut </span>cmd_depth[..],
<a href=#504 id=504 data-nosnippet>504</a> <span class="number">704usize</span>,
<a href=#505 id=505 data-nosnippet>505</a> <span class="kw-2">&amp;mut </span>tree[..],
<a href=#506 id=506 data-nosnippet>506</a> storage_ix,
<a href=#507 id=507 data-nosnippet>507</a> storage,
<a href=#508 id=508 data-nosnippet>508</a> );
<a href=#509 id=509 data-nosnippet>509</a> }
<a href=#510 id=510 data-nosnippet>510</a> BrotliStoreHuffmanTree(
<a href=#511 id=511 data-nosnippet>511</a> <span class="kw-2">&amp;mut </span>depth[<span class="number">64</span>..],
<a href=#512 id=512 data-nosnippet>512</a> <span class="number">64usize</span>,
<a href=#513 id=513 data-nosnippet>513</a> <span class="kw-2">&amp;mut </span>tree[..],
<a href=#514 id=514 data-nosnippet>514</a> storage_ix,
<a href=#515 id=515 data-nosnippet>515</a> storage,
<a href=#516 id=516 data-nosnippet>516</a> );
<a href=#517 id=517 data-nosnippet>517</a>}
<a href=#518 id=518 data-nosnippet>518</a>
<a href=#519 id=519 data-nosnippet>519</a><span class="kw">fn </span>StoreCommands&lt;AllocHT: alloc::Allocator&lt;HuffmanTree&gt;&gt;(
<a href=#520 id=520 data-nosnippet>520</a> mht: <span class="kw-2">&amp;mut </span>AllocHT,
<a href=#521 id=521 data-nosnippet>521</a> <span class="kw-2">mut </span>literals: <span class="kw-2">&amp;</span>[u8],
<a href=#522 id=522 data-nosnippet>522</a> num_literals: usize,
<a href=#523 id=523 data-nosnippet>523</a> commands: <span class="kw-2">&amp;</span>[u32],
<a href=#524 id=524 data-nosnippet>524</a> num_commands: usize,
<a href=#525 id=525 data-nosnippet>525</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#526 id=526 data-nosnippet>526</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#527 id=527 data-nosnippet>527</a>) {
<a href=#528 id=528 data-nosnippet>528</a> <span class="kw">static </span>kNumExtraBits: [u32; <span class="number">128</span>] = [
<a href=#529 id=529 data-nosnippet>529</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">12</span>, <span class="number">14</span>, <span class="number">24</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#530 id=530 data-nosnippet>530</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>,
<a href=#531 id=531 data-nosnippet>531</a> <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">24</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>,
<a href=#532 id=532 data-nosnippet>532</a> <span class="number">5</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">17</span>,
<a href=#533 id=533 data-nosnippet>533</a> <span class="number">18</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">19</span>, <span class="number">20</span>, <span class="number">20</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">22</span>, <span class="number">23</span>, <span class="number">23</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#534 id=534 data-nosnippet>534</a> ];
<a href=#535 id=535 data-nosnippet>535</a> <span class="kw">static </span>kInsertOffset: [u32; <span class="number">24</span>] = [
<a href=#536 id=536 data-nosnippet>536</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">14</span>, <span class="number">18</span>, <span class="number">26</span>, <span class="number">34</span>, <span class="number">50</span>, <span class="number">66</span>, <span class="number">98</span>, <span class="number">130</span>, <span class="number">194</span>, <span class="number">322</span>, <span class="number">578</span>, <span class="number">1090</span>, <span class="number">2114</span>,
<a href=#537 id=537 data-nosnippet>537</a> <span class="number">6210</span>, <span class="number">22594</span>,
<a href=#538 id=538 data-nosnippet>538</a> ];
<a href=#539 id=539 data-nosnippet>539</a> <span class="kw">let </span><span class="kw-2">mut </span>lit_depths: [u8; <span class="number">256</span>] = [<span class="number">0</span>; <span class="number">256</span>];
<a href=#540 id=540 data-nosnippet>540</a> <span class="kw">let </span><span class="kw-2">mut </span>lit_bits: [u16; <span class="number">256</span>] = [<span class="number">0</span>; <span class="number">256</span>]; <span class="comment">// maybe return this instead
<a href=#541 id=541 data-nosnippet>541</a> </span><span class="kw">let </span><span class="kw-2">mut </span>lit_histo: [u32; <span class="number">256</span>] = [<span class="number">0</span>; <span class="number">256</span>]; <span class="comment">// maybe return this instead of init
<a href=#542 id=542 data-nosnippet>542</a> </span><span class="kw">let </span><span class="kw-2">mut </span>cmd_depths: [u8; <span class="number">128</span>] = [<span class="number">0</span>; <span class="number">128</span>];
<a href=#543 id=543 data-nosnippet>543</a> <span class="kw">let </span><span class="kw-2">mut </span>cmd_bits: [u16; <span class="number">128</span>] = [<span class="number">0</span>; <span class="number">128</span>];
<a href=#544 id=544 data-nosnippet>544</a> <span class="kw">let </span><span class="kw-2">mut </span>cmd_histo: [u32; <span class="number">128</span>] = [<span class="number">0</span>; <span class="number">128</span>];
<a href=#545 id=545 data-nosnippet>545</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#546 id=546 data-nosnippet>546</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_literals {
<a href=#547 id=547 data-nosnippet>547</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#548 id=548 data-nosnippet>548</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>lit_histo[literals[i] <span class="kw">as </span>usize];
<a href=#549 id=549 data-nosnippet>549</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#550 id=550 data-nosnippet>550</a> }
<a href=#551 id=551 data-nosnippet>551</a> BrotliBuildAndStoreHuffmanTreeFast(
<a href=#552 id=552 data-nosnippet>552</a> mht,
<a href=#553 id=553 data-nosnippet>553</a> <span class="kw-2">&amp;</span>lit_histo[..],
<a href=#554 id=554 data-nosnippet>554</a> num_literals,
<a href=#555 id=555 data-nosnippet>555</a> <span class="number">8usize</span>,
<a href=#556 id=556 data-nosnippet>556</a> <span class="kw-2">&amp;mut </span>lit_depths[..],
<a href=#557 id=557 data-nosnippet>557</a> <span class="kw-2">&amp;mut </span>lit_bits[..],
<a href=#558 id=558 data-nosnippet>558</a> storage_ix,
<a href=#559 id=559 data-nosnippet>559</a> storage,
<a href=#560 id=560 data-nosnippet>560</a> );
<a href=#561 id=561 data-nosnippet>561</a> i = <span class="number">0usize</span>;
<a href=#562 id=562 data-nosnippet>562</a> <span class="kw">while </span>i &lt; num_commands {
<a href=#563 id=563 data-nosnippet>563</a> {
<a href=#564 id=564 data-nosnippet>564</a> <span class="kw">let </span>code: u32 = commands[i] &amp; <span class="number">0xffu32</span>;
<a href=#565 id=565 data-nosnippet>565</a> {
<a href=#566 id=566 data-nosnippet>566</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#567 id=567 data-nosnippet>567</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>cmd_histo[code <span class="kw">as </span>usize];
<a href=#568 id=568 data-nosnippet>568</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#569 id=569 data-nosnippet>569</a> }
<a href=#570 id=570 data-nosnippet>570</a> }
<a href=#571 id=571 data-nosnippet>571</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#572 id=572 data-nosnippet>572</a> }
<a href=#573 id=573 data-nosnippet>573</a> {
<a href=#574 id=574 data-nosnippet>574</a> <span class="kw">let </span>_rhs = <span class="number">1i32</span>;
<a href=#575 id=575 data-nosnippet>575</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>cmd_histo[<span class="number">1</span>];
<a href=#576 id=576 data-nosnippet>576</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#577 id=577 data-nosnippet>577</a> }
<a href=#578 id=578 data-nosnippet>578</a> {
<a href=#579 id=579 data-nosnippet>579</a> <span class="kw">let </span>_rhs = <span class="number">1i32</span>;
<a href=#580 id=580 data-nosnippet>580</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>cmd_histo[<span class="number">2</span>];
<a href=#581 id=581 data-nosnippet>581</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#582 id=582 data-nosnippet>582</a> }
<a href=#583 id=583 data-nosnippet>583</a> {
<a href=#584 id=584 data-nosnippet>584</a> <span class="kw">let </span>_rhs = <span class="number">1i32</span>;
<a href=#585 id=585 data-nosnippet>585</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>cmd_histo[<span class="number">64</span>];
<a href=#586 id=586 data-nosnippet>586</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#587 id=587 data-nosnippet>587</a> }
<a href=#588 id=588 data-nosnippet>588</a> {
<a href=#589 id=589 data-nosnippet>589</a> <span class="kw">let </span>_rhs = <span class="number">1i32</span>;
<a href=#590 id=590 data-nosnippet>590</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>cmd_histo[<span class="number">84</span>];
<a href=#591 id=591 data-nosnippet>591</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#592 id=592 data-nosnippet>592</a> }
<a href=#593 id=593 data-nosnippet>593</a> BuildAndStoreCommandPrefixCode(
<a href=#594 id=594 data-nosnippet>594</a> <span class="kw-2">&amp;mut </span>cmd_histo[..],
<a href=#595 id=595 data-nosnippet>595</a> <span class="kw-2">&amp;mut </span>cmd_depths[..],
<a href=#596 id=596 data-nosnippet>596</a> <span class="kw-2">&amp;mut </span>cmd_bits[..],
<a href=#597 id=597 data-nosnippet>597</a> storage_ix,
<a href=#598 id=598 data-nosnippet>598</a> storage,
<a href=#599 id=599 data-nosnippet>599</a> );
<a href=#600 id=600 data-nosnippet>600</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_commands {
<a href=#601 id=601 data-nosnippet>601</a> <span class="kw">let </span>cmd: u32 = commands[i];
<a href=#602 id=602 data-nosnippet>602</a> <span class="kw">let </span>code: u32 = cmd &amp; <span class="number">0xffu32</span>;
<a href=#603 id=603 data-nosnippet>603</a> <span class="kw">let </span>extra: u32 = cmd &gt;&gt; <span class="number">8</span>;
<a href=#604 id=604 data-nosnippet>604</a> BrotliWriteBits(
<a href=#605 id=605 data-nosnippet>605</a> cmd_depths[code <span class="kw">as </span>usize] <span class="kw">as </span>usize,
<a href=#606 id=606 data-nosnippet>606</a> cmd_bits[code <span class="kw">as </span>usize] <span class="kw">as </span>(u64),
<a href=#607 id=607 data-nosnippet>607</a> storage_ix,
<a href=#608 id=608 data-nosnippet>608</a> storage,
<a href=#609 id=609 data-nosnippet>609</a> );
<a href=#610 id=610 data-nosnippet>610</a> BrotliWriteBits(
<a href=#611 id=611 data-nosnippet>611</a> kNumExtraBits[code <span class="kw">as </span>usize] <span class="kw">as </span>usize,
<a href=#612 id=612 data-nosnippet>612</a> extra <span class="kw">as </span>(u64),
<a href=#613 id=613 data-nosnippet>613</a> storage_ix,
<a href=#614 id=614 data-nosnippet>614</a> storage,
<a href=#615 id=615 data-nosnippet>615</a> );
<a href=#616 id=616 data-nosnippet>616</a> <span class="kw">if </span>code &lt; <span class="number">24u32 </span>{
<a href=#617 id=617 data-nosnippet>617</a> <span class="kw">let </span>insert: u32 = kInsertOffset[code <span class="kw">as </span>usize].wrapping_add(extra);
<a href=#618 id=618 data-nosnippet>618</a> <span class="kw">for </span>literal <span class="kw">in </span>literals[..(insert <span class="kw">as </span>usize)].iter() {
<a href=#619 id=619 data-nosnippet>619</a> <span class="kw">let </span>lit: u8 = <span class="kw-2">*</span>literal;
<a href=#620 id=620 data-nosnippet>620</a> BrotliWriteBits(
<a href=#621 id=621 data-nosnippet>621</a> lit_depths[lit <span class="kw">as </span>usize] <span class="kw">as </span>usize,
<a href=#622 id=622 data-nosnippet>622</a> lit_bits[lit <span class="kw">as </span>usize] <span class="kw">as </span>(u64),
<a href=#623 id=623 data-nosnippet>623</a> storage_ix,
<a href=#624 id=624 data-nosnippet>624</a> storage,
<a href=#625 id=625 data-nosnippet>625</a> );
<a href=#626 id=626 data-nosnippet>626</a> }
<a href=#627 id=627 data-nosnippet>627</a> literals = <span class="kw-2">&amp;</span>literals[insert <span class="kw">as </span>usize..];
<a href=#628 id=628 data-nosnippet>628</a> }
<a href=#629 id=629 data-nosnippet>629</a> }
<a href=#630 id=630 data-nosnippet>630</a>}
<a href=#631 id=631 data-nosnippet>631</a><span class="kw">fn </span>EmitUncompressedMetaBlock(
<a href=#632 id=632 data-nosnippet>632</a> input: <span class="kw-2">&amp;</span>[u8],
<a href=#633 id=633 data-nosnippet>633</a> input_size: usize,
<a href=#634 id=634 data-nosnippet>634</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#635 id=635 data-nosnippet>635</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#636 id=636 data-nosnippet>636</a>) {
<a href=#637 id=637 data-nosnippet>637</a> store_meta_block_header(input_size, <span class="bool-val">true</span>, storage_ix, storage);
<a href=#638 id=638 data-nosnippet>638</a> <span class="kw-2">*</span>storage_ix = storage_ix.wrapping_add(<span class="number">7u32 </span><span class="kw">as </span>usize) &amp; !<span class="number">7u32 </span><span class="kw">as </span>usize;
<a href=#639 id=639 data-nosnippet>639</a> memcpy(storage, (<span class="kw-2">*</span>storage_ix &gt;&gt; <span class="number">3</span>), input, <span class="number">0</span>, input_size);
<a href=#640 id=640 data-nosnippet>640</a> <span class="kw-2">*</span>storage_ix = storage_ix.wrapping_add(input_size &lt;&lt; <span class="number">3</span>);
<a href=#641 id=641 data-nosnippet>641</a> storage[(<span class="kw-2">*</span>storage_ix &gt;&gt; <span class="number">3</span>)] = <span class="number">0u8</span>;
<a href=#642 id=642 data-nosnippet>642</a>}
<a href=#643 id=643 data-nosnippet>643</a>
<a href=#644 id=644 data-nosnippet>644</a><span class="attr">#[allow(unused_variables)]
<a href=#645 id=645 data-nosnippet>645</a>#[inline(always)]
<a href=#646 id=646 data-nosnippet>646</a></span><span class="kw">fn </span>compress_fragment_two_pass_impl&lt;AllocHT: alloc::Allocator&lt;HuffmanTree&gt;&gt;(
<a href=#647 id=647 data-nosnippet>647</a> m: <span class="kw-2">&amp;mut </span>AllocHT,
<a href=#648 id=648 data-nosnippet>648</a> base_ip: <span class="kw-2">&amp;</span>[u8],
<a href=#649 id=649 data-nosnippet>649</a> <span class="kw-2">mut </span>input_size: usize,
<a href=#650 id=650 data-nosnippet>650</a> is_last: bool,
<a href=#651 id=651 data-nosnippet>651</a> command_buf: <span class="kw-2">&amp;mut </span>[u32],
<a href=#652 id=652 data-nosnippet>652</a> literal_buf: <span class="kw-2">&amp;mut </span>[u8],
<a href=#653 id=653 data-nosnippet>653</a> table: <span class="kw-2">&amp;mut </span>[i32],
<a href=#654 id=654 data-nosnippet>654</a> table_bits: usize,
<a href=#655 id=655 data-nosnippet>655</a> min_match: usize,
<a href=#656 id=656 data-nosnippet>656</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#657 id=657 data-nosnippet>657</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#658 id=658 data-nosnippet>658</a>) {
<a href=#659 id=659 data-nosnippet>659</a> <span class="kw">let </span><span class="kw-2">mut </span>input_index: usize = <span class="number">0usize</span>;
<a href=#660 id=660 data-nosnippet>660</a> <span class="kw">while </span>input_size &gt; <span class="number">0usize </span>{
<a href=#661 id=661 data-nosnippet>661</a> <span class="kw">let </span>block_size: usize = min(input_size, kCompressFragmentTwoPassBlockSize);
<a href=#662 id=662 data-nosnippet>662</a> <span class="kw">let </span><span class="kw-2">mut </span>num_literals: usize = <span class="number">0</span>;
<a href=#663 id=663 data-nosnippet>663</a> <span class="kw">let </span><span class="kw-2">mut </span>num_commands: usize = <span class="number">0</span>;
<a href=#664 id=664 data-nosnippet>664</a> {
<a href=#665 id=665 data-nosnippet>665</a> <span class="kw">let </span><span class="kw-2">mut </span>literals = <span class="kw-2">&amp;mut </span>literal_buf[..];
<a href=#666 id=666 data-nosnippet>666</a> <span class="kw">let </span><span class="kw-2">mut </span>commands = <span class="kw-2">&amp;mut </span>command_buf[..];
<a href=#667 id=667 data-nosnippet>667</a> CreateCommands(
<a href=#668 id=668 data-nosnippet>668</a> input_index,
<a href=#669 id=669 data-nosnippet>669</a> block_size,
<a href=#670 id=670 data-nosnippet>670</a> input_size,
<a href=#671 id=671 data-nosnippet>671</a> base_ip,
<a href=#672 id=672 data-nosnippet>672</a> table,
<a href=#673 id=673 data-nosnippet>673</a> table_bits,
<a href=#674 id=674 data-nosnippet>674</a> min_match,
<a href=#675 id=675 data-nosnippet>675</a> <span class="kw-2">&amp;mut </span>literals,
<a href=#676 id=676 data-nosnippet>676</a> <span class="kw-2">&amp;mut </span>num_literals,
<a href=#677 id=677 data-nosnippet>677</a> <span class="kw-2">&amp;mut </span>commands,
<a href=#678 id=678 data-nosnippet>678</a> <span class="kw-2">&amp;mut </span>num_commands,
<a href=#679 id=679 data-nosnippet>679</a> );
<a href=#680 id=680 data-nosnippet>680</a> }
<a href=#681 id=681 data-nosnippet>681</a> <span class="kw">if </span>ShouldCompress(<span class="kw-2">&amp;</span>base_ip[input_index..], block_size, num_literals) {
<a href=#682 id=682 data-nosnippet>682</a> store_meta_block_header(block_size, <span class="bool-val">false</span>, storage_ix, storage);
<a href=#683 id=683 data-nosnippet>683</a> BrotliWriteBits(<span class="number">13usize</span>, <span class="number">0</span>, storage_ix, storage);
<a href=#684 id=684 data-nosnippet>684</a> StoreCommands(
<a href=#685 id=685 data-nosnippet>685</a> m,
<a href=#686 id=686 data-nosnippet>686</a> literal_buf,
<a href=#687 id=687 data-nosnippet>687</a> num_literals,
<a href=#688 id=688 data-nosnippet>688</a> command_buf,
<a href=#689 id=689 data-nosnippet>689</a> num_commands,
<a href=#690 id=690 data-nosnippet>690</a> storage_ix,
<a href=#691 id=691 data-nosnippet>691</a> storage,
<a href=#692 id=692 data-nosnippet>692</a> );
<a href=#693 id=693 data-nosnippet>693</a> } <span class="kw">else </span>{
<a href=#694 id=694 data-nosnippet>694</a> EmitUncompressedMetaBlock(<span class="kw-2">&amp;</span>base_ip[input_index..], block_size, storage_ix, storage);
<a href=#695 id=695 data-nosnippet>695</a> }
<a href=#696 id=696 data-nosnippet>696</a> input_index = input_index.wrapping_add(block_size);
<a href=#697 id=697 data-nosnippet>697</a> input_size = input_size.wrapping_sub(block_size);
<a href=#698 id=698 data-nosnippet>698</a> }
<a href=#699 id=699 data-nosnippet>699</a>}
<a href=#700 id=700 data-nosnippet>700</a><span class="macro">macro_rules!</span> compress_specialization {
<a href=#701 id=701 data-nosnippet>701</a> (<span class="macro-nonterminal">$table_bits </span>: expr, <span class="macro-nonterminal">$fname</span>: ident) =&gt; {
<a href=#702 id=702 data-nosnippet>702</a> <span class="kw">fn </span><span class="macro-nonterminal">$fname</span>&lt;AllocHT: alloc::Allocator&lt;HuffmanTree&gt;&gt;(
<a href=#703 id=703 data-nosnippet>703</a> mht: <span class="kw-2">&amp;mut </span>AllocHT,
<a href=#704 id=704 data-nosnippet>704</a> input: <span class="kw-2">&amp;</span>[u8],
<a href=#705 id=705 data-nosnippet>705</a> input_size: usize,
<a href=#706 id=706 data-nosnippet>706</a> is_last: bool,
<a href=#707 id=707 data-nosnippet>707</a> command_buf: <span class="kw-2">&amp;mut </span>[u32],
<a href=#708 id=708 data-nosnippet>708</a> literal_buf: <span class="kw-2">&amp;mut </span>[u8],
<a href=#709 id=709 data-nosnippet>709</a> table: <span class="kw-2">&amp;mut </span>[i32],
<a href=#710 id=710 data-nosnippet>710</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#711 id=711 data-nosnippet>711</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#712 id=712 data-nosnippet>712</a> ) {
<a href=#713 id=713 data-nosnippet>713</a> <span class="kw">let </span>min_match = <span class="kw">if </span><span class="macro-nonterminal">$table_bits </span>&lt; <span class="number">15 </span>{ <span class="number">4 </span>} <span class="kw">else </span>{ <span class="number">6 </span>};
<a href=#714 id=714 data-nosnippet>714</a> compress_fragment_two_pass_impl(
<a href=#715 id=715 data-nosnippet>715</a> mht,
<a href=#716 id=716 data-nosnippet>716</a> input,
<a href=#717 id=717 data-nosnippet>717</a> input_size,
<a href=#718 id=718 data-nosnippet>718</a> is_last,
<a href=#719 id=719 data-nosnippet>719</a> command_buf,
<a href=#720 id=720 data-nosnippet>720</a> literal_buf,
<a href=#721 id=721 data-nosnippet>721</a> table,
<a href=#722 id=722 data-nosnippet>722</a> <span class="macro-nonterminal">$table_bits</span>,
<a href=#723 id=723 data-nosnippet>723</a> min_match,
<a href=#724 id=724 data-nosnippet>724</a> storage_ix,
<a href=#725 id=725 data-nosnippet>725</a> storage,
<a href=#726 id=726 data-nosnippet>726</a> );
<a href=#727 id=727 data-nosnippet>727</a> }
<a href=#728 id=728 data-nosnippet>728</a> };
<a href=#729 id=729 data-nosnippet>729</a>}
<a href=#730 id=730 data-nosnippet>730</a><span class="macro">compress_specialization!</span>(<span class="number">8</span>, BrotliCompressFragmentTwoPassImpl8);
<a href=#731 id=731 data-nosnippet>731</a><span class="macro">compress_specialization!</span>(<span class="number">9</span>, BrotliCompressFragmentTwoPassImpl9);
<a href=#732 id=732 data-nosnippet>732</a><span class="macro">compress_specialization!</span>(<span class="number">10</span>, BrotliCompressFragmentTwoPassImpl10);
<a href=#733 id=733 data-nosnippet>733</a><span class="macro">compress_specialization!</span>(<span class="number">11</span>, BrotliCompressFragmentTwoPassImpl11);
<a href=#734 id=734 data-nosnippet>734</a><span class="macro">compress_specialization!</span>(<span class="number">12</span>, BrotliCompressFragmentTwoPassImpl12);
<a href=#735 id=735 data-nosnippet>735</a><span class="macro">compress_specialization!</span>(<span class="number">13</span>, BrotliCompressFragmentTwoPassImpl13);
<a href=#736 id=736 data-nosnippet>736</a><span class="macro">compress_specialization!</span>(<span class="number">14</span>, BrotliCompressFragmentTwoPassImpl14);
<a href=#737 id=737 data-nosnippet>737</a><span class="macro">compress_specialization!</span>(<span class="number">15</span>, BrotliCompressFragmentTwoPassImpl15);
<a href=#738 id=738 data-nosnippet>738</a><span class="macro">compress_specialization!</span>(<span class="number">16</span>, BrotliCompressFragmentTwoPassImpl16);
<a href=#739 id=739 data-nosnippet>739</a><span class="macro">compress_specialization!</span>(<span class="number">17</span>, BrotliCompressFragmentTwoPassImpl17);
<a href=#740 id=740 data-nosnippet>740</a>
<a href=#741 id=741 data-nosnippet>741</a><span class="kw">fn </span>RewindBitPosition(new_storage_ix: usize, storage_ix: <span class="kw-2">&amp;mut </span>usize, storage: <span class="kw-2">&amp;mut </span>[u8]) {
<a href=#742 id=742 data-nosnippet>742</a> <span class="kw">let </span>bitpos: usize = new_storage_ix &amp; <span class="number">7usize</span>;
<a href=#743 id=743 data-nosnippet>743</a> <span class="kw">let </span>mask: usize = (<span class="number">1u32 </span>&lt;&lt; bitpos).wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>usize;
<a href=#744 id=744 data-nosnippet>744</a> {
<a href=#745 id=745 data-nosnippet>745</a> <span class="kw">let </span>_rhs = mask <span class="kw">as </span>u8;
<a href=#746 id=746 data-nosnippet>746</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>storage[(new_storage_ix &gt;&gt; <span class="number">3</span>)];
<a href=#747 id=747 data-nosnippet>747</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs <span class="kw">as </span>i32 &amp; _rhs <span class="kw">as </span>i32) <span class="kw">as </span>u8;
<a href=#748 id=748 data-nosnippet>748</a> }
<a href=#749 id=749 data-nosnippet>749</a> <span class="kw-2">*</span>storage_ix = new_storage_ix;
<a href=#750 id=750 data-nosnippet>750</a>}
<a href=#751 id=751 data-nosnippet>751</a>
<a href=#752 id=752 data-nosnippet>752</a>
<a href=#753 id=753 data-nosnippet>753</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>compress_fragment_two_pass&lt;AllocHT: alloc::Allocator&lt;HuffmanTree&gt;&gt;(
<a href=#754 id=754 data-nosnippet>754</a> m: <span class="kw-2">&amp;mut </span>AllocHT,
<a href=#755 id=755 data-nosnippet>755</a> input: <span class="kw-2">&amp;</span>[u8],
<a href=#756 id=756 data-nosnippet>756</a> input_size: usize,
<a href=#757 id=757 data-nosnippet>757</a> is_last: bool,
<a href=#758 id=758 data-nosnippet>758</a> command_buf: <span class="kw-2">&amp;mut </span>[u32],
<a href=#759 id=759 data-nosnippet>759</a> literal_buf: <span class="kw-2">&amp;mut </span>[u8],
<a href=#760 id=760 data-nosnippet>760</a> table: <span class="kw-2">&amp;mut </span>[i32],
<a href=#761 id=761 data-nosnippet>761</a> table_size: usize,
<a href=#762 id=762 data-nosnippet>762</a> storage_ix: <span class="kw-2">&amp;mut </span>usize,
<a href=#763 id=763 data-nosnippet>763</a> storage: <span class="kw-2">&amp;mut </span>[u8],
<a href=#764 id=764 data-nosnippet>764</a>) {
<a href=#765 id=765 data-nosnippet>765</a> <span class="kw">let </span>initial_storage_ix: usize = <span class="kw-2">*</span>storage_ix;
<a href=#766 id=766 data-nosnippet>766</a> <span class="kw">let </span>table_bits: usize = Log2FloorNonZero(table_size <span class="kw">as </span>u64) <span class="kw">as </span>usize;
<a href=#767 id=767 data-nosnippet>767</a> <span class="kw">if </span>table_bits == <span class="number">8usize </span>{
<a href=#768 id=768 data-nosnippet>768</a> BrotliCompressFragmentTwoPassImpl8(
<a href=#769 id=769 data-nosnippet>769</a> m,
<a href=#770 id=770 data-nosnippet>770</a> input,
<a href=#771 id=771 data-nosnippet>771</a> input_size,
<a href=#772 id=772 data-nosnippet>772</a> is_last,
<a href=#773 id=773 data-nosnippet>773</a> command_buf,
<a href=#774 id=774 data-nosnippet>774</a> literal_buf,
<a href=#775 id=775 data-nosnippet>775</a> table,
<a href=#776 id=776 data-nosnippet>776</a> storage_ix,
<a href=#777 id=777 data-nosnippet>777</a> storage,
<a href=#778 id=778 data-nosnippet>778</a> );
<a href=#779 id=779 data-nosnippet>779</a> }
<a href=#780 id=780 data-nosnippet>780</a> <span class="kw">if </span>table_bits == <span class="number">9usize </span>{
<a href=#781 id=781 data-nosnippet>781</a> BrotliCompressFragmentTwoPassImpl9(
<a href=#782 id=782 data-nosnippet>782</a> m,
<a href=#783 id=783 data-nosnippet>783</a> input,
<a href=#784 id=784 data-nosnippet>784</a> input_size,
<a href=#785 id=785 data-nosnippet>785</a> is_last,
<a href=#786 id=786 data-nosnippet>786</a> command_buf,
<a href=#787 id=787 data-nosnippet>787</a> literal_buf,
<a href=#788 id=788 data-nosnippet>788</a> table,
<a href=#789 id=789 data-nosnippet>789</a> storage_ix,
<a href=#790 id=790 data-nosnippet>790</a> storage,
<a href=#791 id=791 data-nosnippet>791</a> );
<a href=#792 id=792 data-nosnippet>792</a> }
<a href=#793 id=793 data-nosnippet>793</a> <span class="kw">if </span>table_bits == <span class="number">10usize </span>{
<a href=#794 id=794 data-nosnippet>794</a> BrotliCompressFragmentTwoPassImpl10(
<a href=#795 id=795 data-nosnippet>795</a> m,
<a href=#796 id=796 data-nosnippet>796</a> input,
<a href=#797 id=797 data-nosnippet>797</a> input_size,
<a href=#798 id=798 data-nosnippet>798</a> is_last,
<a href=#799 id=799 data-nosnippet>799</a> command_buf,
<a href=#800 id=800 data-nosnippet>800</a> literal_buf,
<a href=#801 id=801 data-nosnippet>801</a> table,
<a href=#802 id=802 data-nosnippet>802</a> storage_ix,
<a href=#803 id=803 data-nosnippet>803</a> storage,
<a href=#804 id=804 data-nosnippet>804</a> );
<a href=#805 id=805 data-nosnippet>805</a> }
<a href=#806 id=806 data-nosnippet>806</a> <span class="kw">if </span>table_bits == <span class="number">11usize </span>{
<a href=#807 id=807 data-nosnippet>807</a> BrotliCompressFragmentTwoPassImpl11(
<a href=#808 id=808 data-nosnippet>808</a> m,
<a href=#809 id=809 data-nosnippet>809</a> input,
<a href=#810 id=810 data-nosnippet>810</a> input_size,
<a href=#811 id=811 data-nosnippet>811</a> is_last,
<a href=#812 id=812 data-nosnippet>812</a> command_buf,
<a href=#813 id=813 data-nosnippet>813</a> literal_buf,
<a href=#814 id=814 data-nosnippet>814</a> table,
<a href=#815 id=815 data-nosnippet>815</a> storage_ix,
<a href=#816 id=816 data-nosnippet>816</a> storage,
<a href=#817 id=817 data-nosnippet>817</a> );
<a href=#818 id=818 data-nosnippet>818</a> }
<a href=#819 id=819 data-nosnippet>819</a> <span class="kw">if </span>table_bits == <span class="number">12usize </span>{
<a href=#820 id=820 data-nosnippet>820</a> BrotliCompressFragmentTwoPassImpl12(
<a href=#821 id=821 data-nosnippet>821</a> m,
<a href=#822 id=822 data-nosnippet>822</a> input,
<a href=#823 id=823 data-nosnippet>823</a> input_size,
<a href=#824 id=824 data-nosnippet>824</a> is_last,
<a href=#825 id=825 data-nosnippet>825</a> command_buf,
<a href=#826 id=826 data-nosnippet>826</a> literal_buf,
<a href=#827 id=827 data-nosnippet>827</a> table,
<a href=#828 id=828 data-nosnippet>828</a> storage_ix,
<a href=#829 id=829 data-nosnippet>829</a> storage,
<a href=#830 id=830 data-nosnippet>830</a> );
<a href=#831 id=831 data-nosnippet>831</a> }
<a href=#832 id=832 data-nosnippet>832</a> <span class="kw">if </span>table_bits == <span class="number">13usize </span>{
<a href=#833 id=833 data-nosnippet>833</a> BrotliCompressFragmentTwoPassImpl13(
<a href=#834 id=834 data-nosnippet>834</a> m,
<a href=#835 id=835 data-nosnippet>835</a> input,
<a href=#836 id=836 data-nosnippet>836</a> input_size,
<a href=#837 id=837 data-nosnippet>837</a> is_last,
<a href=#838 id=838 data-nosnippet>838</a> command_buf,
<a href=#839 id=839 data-nosnippet>839</a> literal_buf,
<a href=#840 id=840 data-nosnippet>840</a> table,
<a href=#841 id=841 data-nosnippet>841</a> storage_ix,
<a href=#842 id=842 data-nosnippet>842</a> storage,
<a href=#843 id=843 data-nosnippet>843</a> );
<a href=#844 id=844 data-nosnippet>844</a> }
<a href=#845 id=845 data-nosnippet>845</a> <span class="kw">if </span>table_bits == <span class="number">14usize </span>{
<a href=#846 id=846 data-nosnippet>846</a> BrotliCompressFragmentTwoPassImpl14(
<a href=#847 id=847 data-nosnippet>847</a> m,
<a href=#848 id=848 data-nosnippet>848</a> input,
<a href=#849 id=849 data-nosnippet>849</a> input_size,
<a href=#850 id=850 data-nosnippet>850</a> is_last,
<a href=#851 id=851 data-nosnippet>851</a> command_buf,
<a href=#852 id=852 data-nosnippet>852</a> literal_buf,
<a href=#853 id=853 data-nosnippet>853</a> table,
<a href=#854 id=854 data-nosnippet>854</a> storage_ix,
<a href=#855 id=855 data-nosnippet>855</a> storage,
<a href=#856 id=856 data-nosnippet>856</a> );
<a href=#857 id=857 data-nosnippet>857</a> }
<a href=#858 id=858 data-nosnippet>858</a> <span class="kw">if </span>table_bits == <span class="number">15usize </span>{
<a href=#859 id=859 data-nosnippet>859</a> BrotliCompressFragmentTwoPassImpl15(
<a href=#860 id=860 data-nosnippet>860</a> m,
<a href=#861 id=861 data-nosnippet>861</a> input,
<a href=#862 id=862 data-nosnippet>862</a> input_size,
<a href=#863 id=863 data-nosnippet>863</a> is_last,
<a href=#864 id=864 data-nosnippet>864</a> command_buf,
<a href=#865 id=865 data-nosnippet>865</a> literal_buf,
<a href=#866 id=866 data-nosnippet>866</a> table,
<a href=#867 id=867 data-nosnippet>867</a> storage_ix,
<a href=#868 id=868 data-nosnippet>868</a> storage,
<a href=#869 id=869 data-nosnippet>869</a> );
<a href=#870 id=870 data-nosnippet>870</a> }
<a href=#871 id=871 data-nosnippet>871</a> <span class="kw">if </span>table_bits == <span class="number">16usize </span>{
<a href=#872 id=872 data-nosnippet>872</a> BrotliCompressFragmentTwoPassImpl16(
<a href=#873 id=873 data-nosnippet>873</a> m,
<a href=#874 id=874 data-nosnippet>874</a> input,
<a href=#875 id=875 data-nosnippet>875</a> input_size,
<a href=#876 id=876 data-nosnippet>876</a> is_last,
<a href=#877 id=877 data-nosnippet>877</a> command_buf,
<a href=#878 id=878 data-nosnippet>878</a> literal_buf,
<a href=#879 id=879 data-nosnippet>879</a> table,
<a href=#880 id=880 data-nosnippet>880</a> storage_ix,
<a href=#881 id=881 data-nosnippet>881</a> storage,
<a href=#882 id=882 data-nosnippet>882</a> );
<a href=#883 id=883 data-nosnippet>883</a> }
<a href=#884 id=884 data-nosnippet>884</a> <span class="kw">if </span>table_bits == <span class="number">17usize </span>{
<a href=#885 id=885 data-nosnippet>885</a> BrotliCompressFragmentTwoPassImpl17(
<a href=#886 id=886 data-nosnippet>886</a> m,
<a href=#887 id=887 data-nosnippet>887</a> input,
<a href=#888 id=888 data-nosnippet>888</a> input_size,
<a href=#889 id=889 data-nosnippet>889</a> is_last,
<a href=#890 id=890 data-nosnippet>890</a> command_buf,
<a href=#891 id=891 data-nosnippet>891</a> literal_buf,
<a href=#892 id=892 data-nosnippet>892</a> table,
<a href=#893 id=893 data-nosnippet>893</a> storage_ix,
<a href=#894 id=894 data-nosnippet>894</a> storage,
<a href=#895 id=895 data-nosnippet>895</a> );
<a href=#896 id=896 data-nosnippet>896</a> }
<a href=#897 id=897 data-nosnippet>897</a> <span class="kw">if </span>storage_ix.wrapping_sub(initial_storage_ix) &gt; (<span class="number">31usize</span>).wrapping_add(input_size &lt;&lt; <span class="number">3</span>) {
<a href=#898 id=898 data-nosnippet>898</a> RewindBitPosition(initial_storage_ix, storage_ix, storage);
<a href=#899 id=899 data-nosnippet>899</a> EmitUncompressedMetaBlock(input, input_size, storage_ix, storage);
<a href=#900 id=900 data-nosnippet>900</a> }
<a href=#901 id=901 data-nosnippet>901</a> <span class="kw">if </span>is_last {
<a href=#902 id=902 data-nosnippet>902</a> BrotliWriteBits(<span class="number">1</span>, <span class="number">1</span>, storage_ix, storage);
<a href=#903 id=903 data-nosnippet>903</a> BrotliWriteBits(<span class="number">1</span>, <span class="number">1</span>, storage_ix, storage);
<a href=#904 id=904 data-nosnippet>904</a> <span class="kw-2">*</span>storage_ix = storage_ix.wrapping_add(<span class="number">7u32 </span><span class="kw">as </span>usize) &amp; !<span class="number">7u32 </span><span class="kw">as </span>usize;
<a href=#905 id=905 data-nosnippet>905</a> }
<a href=#906 id=906 data-nosnippet>906</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,463 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/constants.rs`."><title>constants.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>constants.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">pub const </span>BROTLI_NUM_BLOCK_LEN_SYMBOLS: usize = <span class="number">26</span>;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">pub static </span>kInsBase: [u32; <span class="number">24</span>] = [
<a href=#3 id=3 data-nosnippet>3</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">14</span>, <span class="number">18</span>, <span class="number">26</span>, <span class="number">34</span>, <span class="number">50</span>, <span class="number">66</span>, <span class="number">98</span>, <span class="number">130</span>, <span class="number">194</span>, <span class="number">322</span>, <span class="number">578</span>, <span class="number">1090</span>, <span class="number">2114</span>, <span class="number">6210</span>,
<a href=#4 id=4 data-nosnippet>4</a> <span class="number">22594</span>,
<a href=#5 id=5 data-nosnippet>5</a>];
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">pub static </span>kInsExtra: [u32; <span class="number">24</span>] = [
<a href=#8 id=8 data-nosnippet>8</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">12</span>, <span class="number">14</span>, <span class="number">24</span>,
<a href=#9 id=9 data-nosnippet>9</a>];
<a href=#10 id=10 data-nosnippet>10</a>
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">pub static </span>kCopyBase: [u32; <span class="number">24</span>] = [
<a href=#12 id=12 data-nosnippet>12</a> <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">12</span>, <span class="number">14</span>, <span class="number">18</span>, <span class="number">22</span>, <span class="number">30</span>, <span class="number">38</span>, <span class="number">54</span>, <span class="number">70</span>, <span class="number">102</span>, <span class="number">134</span>, <span class="number">198</span>, <span class="number">326</span>, <span class="number">582</span>, <span class="number">1094</span>, <span class="number">2118</span>,
<a href=#13 id=13 data-nosnippet>13</a>];
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">pub static </span>kCopyExtra: [u32; <span class="number">24</span>] = [
<a href=#16 id=16 data-nosnippet>16</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">24</span>,
<a href=#17 id=17 data-nosnippet>17</a>];
<a href=#18 id=18 data-nosnippet>18</a>
<a href=#19 id=19 data-nosnippet>19</a><span class="comment">/* Common context lookup table for all context modes. */
<a href=#20 id=20 data-nosnippet>20</a></span><span class="kw">static </span>kContextLookup: [u8; <span class="number">2048</span>] = [
<a href=#21 id=21 data-nosnippet>21</a> <span class="comment">/* CONTEXT_LSB6, last byte. */
<a href=#22 id=22 data-nosnippet>22</a> </span><span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">23</span>, <span class="number">24</span>, <span class="number">25</span>,
<a href=#23 id=23 data-nosnippet>23</a> <span class="number">26</span>, <span class="number">27</span>, <span class="number">28</span>, <span class="number">29</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">32</span>, <span class="number">33</span>, <span class="number">34</span>, <span class="number">35</span>, <span class="number">36</span>, <span class="number">37</span>, <span class="number">38</span>, <span class="number">39</span>, <span class="number">40</span>, <span class="number">41</span>, <span class="number">42</span>, <span class="number">43</span>, <span class="number">44</span>, <span class="number">45</span>, <span class="number">46</span>, <span class="number">47</span>, <span class="number">48</span>, <span class="number">49</span>,
<a href=#24 id=24 data-nosnippet>24</a> <span class="number">50</span>, <span class="number">51</span>, <span class="number">52</span>, <span class="number">53</span>, <span class="number">54</span>, <span class="number">55</span>, <span class="number">56</span>, <span class="number">57</span>, <span class="number">58</span>, <span class="number">59</span>, <span class="number">60</span>, <span class="number">61</span>, <span class="number">62</span>, <span class="number">63</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>,
<a href=#25 id=25 data-nosnippet>25</a> <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">23</span>, <span class="number">24</span>, <span class="number">25</span>, <span class="number">26</span>, <span class="number">27</span>, <span class="number">28</span>, <span class="number">29</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">32</span>, <span class="number">33</span>, <span class="number">34</span>, <span class="number">35</span>,
<a href=#26 id=26 data-nosnippet>26</a> <span class="number">36</span>, <span class="number">37</span>, <span class="number">38</span>, <span class="number">39</span>, <span class="number">40</span>, <span class="number">41</span>, <span class="number">42</span>, <span class="number">43</span>, <span class="number">44</span>, <span class="number">45</span>, <span class="number">46</span>, <span class="number">47</span>, <span class="number">48</span>, <span class="number">49</span>, <span class="number">50</span>, <span class="number">51</span>, <span class="number">52</span>, <span class="number">53</span>, <span class="number">54</span>, <span class="number">55</span>, <span class="number">56</span>, <span class="number">57</span>, <span class="number">58</span>, <span class="number">59</span>,
<a href=#27 id=27 data-nosnippet>27</a> <span class="number">60</span>, <span class="number">61</span>, <span class="number">62</span>, <span class="number">63</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>, <span class="number">21</span>,
<a href=#28 id=28 data-nosnippet>28</a> <span class="number">22</span>, <span class="number">23</span>, <span class="number">24</span>, <span class="number">25</span>, <span class="number">26</span>, <span class="number">27</span>, <span class="number">28</span>, <span class="number">29</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">32</span>, <span class="number">33</span>, <span class="number">34</span>, <span class="number">35</span>, <span class="number">36</span>, <span class="number">37</span>, <span class="number">38</span>, <span class="number">39</span>, <span class="number">40</span>, <span class="number">41</span>, <span class="number">42</span>, <span class="number">43</span>, <span class="number">44</span>, <span class="number">45</span>,
<a href=#29 id=29 data-nosnippet>29</a> <span class="number">46</span>, <span class="number">47</span>, <span class="number">48</span>, <span class="number">49</span>, <span class="number">50</span>, <span class="number">51</span>, <span class="number">52</span>, <span class="number">53</span>, <span class="number">54</span>, <span class="number">55</span>, <span class="number">56</span>, <span class="number">57</span>, <span class="number">58</span>, <span class="number">59</span>, <span class="number">60</span>, <span class="number">61</span>, <span class="number">62</span>, <span class="number">63</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>,
<a href=#30 id=30 data-nosnippet>30</a> <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">23</span>, <span class="number">24</span>, <span class="number">25</span>, <span class="number">26</span>, <span class="number">27</span>, <span class="number">28</span>, <span class="number">29</span>, <span class="number">30</span>, <span class="number">31</span>,
<a href=#31 id=31 data-nosnippet>31</a> <span class="number">32</span>, <span class="number">33</span>, <span class="number">34</span>, <span class="number">35</span>, <span class="number">36</span>, <span class="number">37</span>, <span class="number">38</span>, <span class="number">39</span>, <span class="number">40</span>, <span class="number">41</span>, <span class="number">42</span>, <span class="number">43</span>, <span class="number">44</span>, <span class="number">45</span>, <span class="number">46</span>, <span class="number">47</span>, <span class="number">48</span>, <span class="number">49</span>, <span class="number">50</span>, <span class="number">51</span>, <span class="number">52</span>, <span class="number">53</span>, <span class="number">54</span>, <span class="number">55</span>,
<a href=#32 id=32 data-nosnippet>32</a> <span class="number">56</span>, <span class="number">57</span>, <span class="number">58</span>, <span class="number">59</span>, <span class="number">60</span>, <span class="number">61</span>, <span class="number">62</span>, <span class="number">63</span>, <span class="comment">/* CONTEXT_LSB6, second last byte, */
<a href=#33 id=33 data-nosnippet>33</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#34 id=34 data-nosnippet>34</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#35 id=35 data-nosnippet>35</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#36 id=36 data-nosnippet>36</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#37 id=37 data-nosnippet>37</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#38 id=38 data-nosnippet>38</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#39 id=39 data-nosnippet>39</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#40 id=40 data-nosnippet>40</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#41 id=41 data-nosnippet>41</a> <span class="comment">/* CONTEXT_MSB6, last byte. */
<a href=#42 id=42 data-nosnippet>42</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>,
<a href=#43 id=43 data-nosnippet>43</a> <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">10</span>, <span class="number">10</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">13</span>, <span class="number">13</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">14</span>,
<a href=#44 id=44 data-nosnippet>44</a> <span class="number">14</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">15</span>, <span class="number">15</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">17</span>, <span class="number">17</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">19</span>, <span class="number">19</span>, <span class="number">19</span>, <span class="number">20</span>, <span class="number">20</span>,
<a href=#45 id=45 data-nosnippet>45</a> <span class="number">20</span>, <span class="number">20</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">22</span>, <span class="number">22</span>, <span class="number">22</span>, <span class="number">23</span>, <span class="number">23</span>, <span class="number">23</span>, <span class="number">23</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">25</span>, <span class="number">25</span>, <span class="number">25</span>, <span class="number">25</span>, <span class="number">26</span>, <span class="number">26</span>,
<a href=#46 id=46 data-nosnippet>46</a> <span class="number">26</span>, <span class="number">26</span>, <span class="number">27</span>, <span class="number">27</span>, <span class="number">27</span>, <span class="number">27</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">29</span>, <span class="number">29</span>, <span class="number">29</span>, <span class="number">29</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">31</span>, <span class="number">31</span>, <span class="number">31</span>, <span class="number">31</span>, <span class="number">32</span>, <span class="number">32</span>,
<a href=#47 id=47 data-nosnippet>47</a> <span class="number">32</span>, <span class="number">32</span>, <span class="number">33</span>, <span class="number">33</span>, <span class="number">33</span>, <span class="number">33</span>, <span class="number">34</span>, <span class="number">34</span>, <span class="number">34</span>, <span class="number">34</span>, <span class="number">35</span>, <span class="number">35</span>, <span class="number">35</span>, <span class="number">35</span>, <span class="number">36</span>, <span class="number">36</span>, <span class="number">36</span>, <span class="number">36</span>, <span class="number">37</span>, <span class="number">37</span>, <span class="number">37</span>, <span class="number">37</span>, <span class="number">38</span>, <span class="number">38</span>,
<a href=#48 id=48 data-nosnippet>48</a> <span class="number">38</span>, <span class="number">38</span>, <span class="number">39</span>, <span class="number">39</span>, <span class="number">39</span>, <span class="number">39</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">41</span>, <span class="number">41</span>, <span class="number">41</span>, <span class="number">41</span>, <span class="number">42</span>, <span class="number">42</span>, <span class="number">42</span>, <span class="number">42</span>, <span class="number">43</span>, <span class="number">43</span>, <span class="number">43</span>, <span class="number">43</span>, <span class="number">44</span>, <span class="number">44</span>,
<a href=#49 id=49 data-nosnippet>49</a> <span class="number">44</span>, <span class="number">44</span>, <span class="number">45</span>, <span class="number">45</span>, <span class="number">45</span>, <span class="number">45</span>, <span class="number">46</span>, <span class="number">46</span>, <span class="number">46</span>, <span class="number">46</span>, <span class="number">47</span>, <span class="number">47</span>, <span class="number">47</span>, <span class="number">47</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">49</span>, <span class="number">49</span>, <span class="number">49</span>, <span class="number">49</span>, <span class="number">50</span>, <span class="number">50</span>,
<a href=#50 id=50 data-nosnippet>50</a> <span class="number">50</span>, <span class="number">50</span>, <span class="number">51</span>, <span class="number">51</span>, <span class="number">51</span>, <span class="number">51</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">53</span>, <span class="number">53</span>, <span class="number">53</span>, <span class="number">53</span>, <span class="number">54</span>, <span class="number">54</span>, <span class="number">54</span>, <span class="number">54</span>, <span class="number">55</span>, <span class="number">55</span>, <span class="number">55</span>, <span class="number">55</span>, <span class="number">56</span>, <span class="number">56</span>,
<a href=#51 id=51 data-nosnippet>51</a> <span class="number">56</span>, <span class="number">56</span>, <span class="number">57</span>, <span class="number">57</span>, <span class="number">57</span>, <span class="number">57</span>, <span class="number">58</span>, <span class="number">58</span>, <span class="number">58</span>, <span class="number">58</span>, <span class="number">59</span>, <span class="number">59</span>, <span class="number">59</span>, <span class="number">59</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">61</span>, <span class="number">61</span>, <span class="number">61</span>, <span class="number">61</span>, <span class="number">62</span>, <span class="number">62</span>,
<a href=#52 id=52 data-nosnippet>52</a> <span class="number">62</span>, <span class="number">62</span>, <span class="number">63</span>, <span class="number">63</span>, <span class="number">63</span>, <span class="number">63</span>, <span class="comment">/* CONTEXT_MSB6, second last byte, */
<a href=#53 id=53 data-nosnippet>53</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#54 id=54 data-nosnippet>54</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#55 id=55 data-nosnippet>55</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#56 id=56 data-nosnippet>56</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#57 id=57 data-nosnippet>57</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#58 id=58 data-nosnippet>58</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#59 id=59 data-nosnippet>59</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#60 id=60 data-nosnippet>60</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#61 id=61 data-nosnippet>61</a> <span class="comment">/* CONTEXT_UTF8, last byte. */
<a href=#62 id=62 data-nosnippet>62</a> /* ASCII range. */
<a href=#63 id=63 data-nosnippet>63</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">4</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#64 id=64 data-nosnippet>64</a> <span class="number">8</span>, <span class="number">12</span>, <span class="number">16</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">20</span>, <span class="number">12</span>, <span class="number">16</span>, <span class="number">24</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">32</span>, <span class="number">12</span>, <span class="number">36</span>, <span class="number">12</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>,
<a href=#65 id=65 data-nosnippet>65</a> <span class="number">44</span>, <span class="number">44</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">24</span>, <span class="number">40</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>,
<a href=#66 id=66 data-nosnippet>66</a> <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">24</span>, <span class="number">12</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>,
<a href=#67 id=67 data-nosnippet>67</a> <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">24</span>, <span class="number">12</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">0</span>,
<a href=#68 id=68 data-nosnippet>68</a> <span class="comment">/* UTF8 continuation byte range. */
<a href=#69 id=69 data-nosnippet>69</a> </span><span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>,
<a href=#70 id=70 data-nosnippet>70</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>,
<a href=#71 id=71 data-nosnippet>71</a> <span class="comment">/* UTF8 lead byte range. */
<a href=#72 id=72 data-nosnippet>72</a> </span><span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>,
<a href=#73 id=73 data-nosnippet>73</a> <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>,
<a href=#74 id=74 data-nosnippet>74</a> <span class="comment">/* CONTEXT_UTF8 second last byte. */
<a href=#75 id=75 data-nosnippet>75</a> /* ASCII range. */
<a href=#76 id=76 data-nosnippet>76</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#77 id=77 data-nosnippet>77</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>,
<a href=#78 id=78 data-nosnippet>78</a> <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>,
<a href=#79 id=79 data-nosnippet>79</a> <span class="number">1</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>,
<a href=#80 id=80 data-nosnippet>80</a> <span class="comment">/* UTF8 continuation byte range. */
<a href=#81 id=81 data-nosnippet>81</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#82 id=82 data-nosnippet>82</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#83 id=83 data-nosnippet>83</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="comment">/* UTF8 lead byte range. */
<a href=#84 id=84 data-nosnippet>84</a> </span><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#85 id=85 data-nosnippet>85</a> <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#86 id=86 data-nosnippet>86</a> <span class="comment">/* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
<a href=#87 id=87 data-nosnippet>87</a> </span><span class="number">0</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">8</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>,
<a href=#88 id=88 data-nosnippet>88</a> <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>,
<a href=#89 id=89 data-nosnippet>89</a> <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#90 id=90 data-nosnippet>90</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#91 id=91 data-nosnippet>91</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#92 id=92 data-nosnippet>92</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>,
<a href=#93 id=93 data-nosnippet>93</a> <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>,
<a href=#94 id=94 data-nosnippet>94</a> <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>,
<a href=#95 id=95 data-nosnippet>95</a> <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>,
<a href=#96 id=96 data-nosnippet>96</a> <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">40</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>,
<a href=#97 id=97 data-nosnippet>97</a> <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">48</span>, <span class="number">56</span>, <span class="comment">/* CONTEXT_SIGNED, second last byte. */
<a href=#98 id=98 data-nosnippet>98</a> </span><span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#99 id=99 data-nosnippet>99</a> <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#100 id=100 data-nosnippet>100</a> <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>,
<a href=#101 id=101 data-nosnippet>101</a> <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>,
<a href=#102 id=102 data-nosnippet>102</a> <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>,
<a href=#103 id=103 data-nosnippet>103</a> <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>,
<a href=#104 id=104 data-nosnippet>104</a> <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>,
<a href=#105 id=105 data-nosnippet>105</a> <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">7</span>,
<a href=#106 id=106 data-nosnippet>106</a>];
<a href=#107 id=107 data-nosnippet>107</a><span class="kw">pub const </span>BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS: usize = <span class="number">544</span>;
<a href=#108 id=108 data-nosnippet>108</a><span class="kw">pub const </span>BROTLI_NUM_LITERAL_SYMBOLS: usize = <span class="number">256</span>;
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">pub const </span>BROTLI_NUM_COMMAND_SYMBOLS: usize = <span class="number">704</span>;
<a href=#110 id=110 data-nosnippet>110</a><span class="kw">pub const </span>BROTLI_WINDOW_GAP: usize = <span class="number">16</span>;
<a href=#111 id=111 data-nosnippet>111</a><span class="kw">pub const </span>BROTLI_MAX_NPOSTFIX: usize = <span class="number">3</span>;
<a href=#112 id=112 data-nosnippet>112</a><span class="kw">pub const </span>BROTLI_MAX_NDIRECT: usize = <span class="number">120</span>;
<a href=#113 id=113 data-nosnippet>113</a><span class="attr">#[inline(always)]
<a href=#114 id=114 data-nosnippet>114</a></span><span class="kw">pub fn </span>BROTLI_CONTEXT_LUT(mode: <span class="kw">super</span>::histogram::ContextType) -&gt; <span class="kw-2">&amp;</span><span class="lifetime">'static </span>[u8] {
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw-2">&amp;</span>kContextLookup[((mode <span class="kw">as </span>usize) &lt;&lt; <span class="number">9</span>)..]
<a href=#116 id=116 data-nosnippet>116</a>}
<a href=#117 id=117 data-nosnippet>117</a><span class="kw">pub fn </span>BROTLI_CONTEXT(P1: u8, P2: u8, LUT: <span class="kw-2">&amp;</span>[u8]) -&gt; u8 {
<a href=#118 id=118 data-nosnippet>118</a> (LUT)[P1 <span class="kw">as </span>usize] | ((LUT)[<span class="number">256 </span>+ P2 <span class="kw">as </span>usize])
<a href=#119 id=119 data-nosnippet>119</a>}
<a href=#120 id=120 data-nosnippet>120</a><span class="kw">pub static </span>kZeroRepsBits: [usize; <span class="number">704</span>] = [
<a href=#121 id=121 data-nosnippet>121</a> <span class="number">0x0</span>, <span class="number">0x0</span>, <span class="number">0x0</span>, <span class="number">0x7</span>, <span class="number">0x17</span>, <span class="number">0x27</span>, <span class="number">0x37</span>, <span class="number">0x47</span>, <span class="number">0x57</span>, <span class="number">0x67</span>, <span class="number">0x77</span>, <span class="number">0x770</span>, <span class="number">0xb87</span>, <span class="number">0x1387</span>, <span class="number">0x1b87</span>,
<a href=#122 id=122 data-nosnippet>122</a> <span class="number">0x2387</span>, <span class="number">0x2b87</span>, <span class="number">0x3387</span>, <span class="number">0x3b87</span>, <span class="number">0x397</span>, <span class="number">0xb97</span>, <span class="number">0x1397</span>, <span class="number">0x1b97</span>, <span class="number">0x2397</span>, <span class="number">0x2b97</span>, <span class="number">0x3397</span>, <span class="number">0x3b97</span>,
<a href=#123 id=123 data-nosnippet>123</a> <span class="number">0x3a7</span>, <span class="number">0xba7</span>, <span class="number">0x13a7</span>, <span class="number">0x1ba7</span>, <span class="number">0x23a7</span>, <span class="number">0x2ba7</span>, <span class="number">0x33a7</span>, <span class="number">0x3ba7</span>, <span class="number">0x3b7</span>, <span class="number">0xbb7</span>, <span class="number">0x13b7</span>, <span class="number">0x1bb7</span>,
<a href=#124 id=124 data-nosnippet>124</a> <span class="number">0x23b7</span>, <span class="number">0x2bb7</span>, <span class="number">0x33b7</span>, <span class="number">0x3bb7</span>, <span class="number">0x3c7</span>, <span class="number">0xbc7</span>, <span class="number">0x13c7</span>, <span class="number">0x1bc7</span>, <span class="number">0x23c7</span>, <span class="number">0x2bc7</span>, <span class="number">0x33c7</span>, <span class="number">0x3bc7</span>,
<a href=#125 id=125 data-nosnippet>125</a> <span class="number">0x3d7</span>, <span class="number">0xbd7</span>, <span class="number">0x13d7</span>, <span class="number">0x1bd7</span>, <span class="number">0x23d7</span>, <span class="number">0x2bd7</span>, <span class="number">0x33d7</span>, <span class="number">0x3bd7</span>, <span class="number">0x3e7</span>, <span class="number">0xbe7</span>, <span class="number">0x13e7</span>, <span class="number">0x1be7</span>,
<a href=#126 id=126 data-nosnippet>126</a> <span class="number">0x23e7</span>, <span class="number">0x2be7</span>, <span class="number">0x33e7</span>, <span class="number">0x3be7</span>, <span class="number">0x3f7</span>, <span class="number">0xbf7</span>, <span class="number">0x13f7</span>, <span class="number">0x1bf7</span>, <span class="number">0x23f7</span>, <span class="number">0x2bf7</span>, <span class="number">0x33f7</span>, <span class="number">0x3bf7</span>,
<a href=#127 id=127 data-nosnippet>127</a> <span class="number">0x1c387</span>, <span class="number">0x5c387</span>, <span class="number">0x9c387</span>, <span class="number">0xdc387</span>, <span class="number">0x11c387</span>, <span class="number">0x15c387</span>, <span class="number">0x19c387</span>, <span class="number">0x1dc387</span>, <span class="number">0x1cb87</span>, <span class="number">0x5cb87</span>,
<a href=#128 id=128 data-nosnippet>128</a> <span class="number">0x9cb87</span>, <span class="number">0xdcb87</span>, <span class="number">0x11cb87</span>, <span class="number">0x15cb87</span>, <span class="number">0x19cb87</span>, <span class="number">0x1dcb87</span>, <span class="number">0x1d387</span>, <span class="number">0x5d387</span>, <span class="number">0x9d387</span>, <span class="number">0xdd387</span>,
<a href=#129 id=129 data-nosnippet>129</a> <span class="number">0x11d387</span>, <span class="number">0x15d387</span>, <span class="number">0x19d387</span>, <span class="number">0x1dd387</span>, <span class="number">0x1db87</span>, <span class="number">0x5db87</span>, <span class="number">0x9db87</span>, <span class="number">0xddb87</span>, <span class="number">0x11db87</span>, <span class="number">0x15db87</span>,
<a href=#130 id=130 data-nosnippet>130</a> <span class="number">0x19db87</span>, <span class="number">0x1ddb87</span>, <span class="number">0x1e387</span>, <span class="number">0x5e387</span>, <span class="number">0x9e387</span>, <span class="number">0xde387</span>, <span class="number">0x11e387</span>, <span class="number">0x15e387</span>, <span class="number">0x19e387</span>, <span class="number">0x1de387</span>,
<a href=#131 id=131 data-nosnippet>131</a> <span class="number">0x1eb87</span>, <span class="number">0x5eb87</span>, <span class="number">0x9eb87</span>, <span class="number">0xdeb87</span>, <span class="number">0x11eb87</span>, <span class="number">0x15eb87</span>, <span class="number">0x19eb87</span>, <span class="number">0x1deb87</span>, <span class="number">0x1f387</span>, <span class="number">0x5f387</span>,
<a href=#132 id=132 data-nosnippet>132</a> <span class="number">0x9f387</span>, <span class="number">0xdf387</span>, <span class="number">0x11f387</span>, <span class="number">0x15f387</span>, <span class="number">0x19f387</span>, <span class="number">0x1df387</span>, <span class="number">0x1fb87</span>, <span class="number">0x5fb87</span>, <span class="number">0x9fb87</span>, <span class="number">0xdfb87</span>,
<a href=#133 id=133 data-nosnippet>133</a> <span class="number">0x11fb87</span>, <span class="number">0x15fb87</span>, <span class="number">0x19fb87</span>, <span class="number">0x1dfb87</span>, <span class="number">0x1c397</span>, <span class="number">0x5c397</span>, <span class="number">0x9c397</span>, <span class="number">0xdc397</span>, <span class="number">0x11c397</span>, <span class="number">0x15c397</span>,
<a href=#134 id=134 data-nosnippet>134</a> <span class="number">0x19c397</span>, <span class="number">0x1dc397</span>, <span class="number">0x1cb97</span>, <span class="number">0x5cb97</span>, <span class="number">0x9cb97</span>, <span class="number">0xdcb97</span>, <span class="number">0x11cb97</span>, <span class="number">0x15cb97</span>, <span class="number">0x19cb97</span>, <span class="number">0x1dcb97</span>,
<a href=#135 id=135 data-nosnippet>135</a> <span class="number">0x1d397</span>, <span class="number">0x5d397</span>, <span class="number">0x9d397</span>, <span class="number">0xdd397</span>, <span class="number">0x11d397</span>, <span class="number">0x15d397</span>, <span class="number">0x19d397</span>, <span class="number">0x1dd397</span>, <span class="number">0x1db97</span>, <span class="number">0x5db97</span>,
<a href=#136 id=136 data-nosnippet>136</a> <span class="number">0x9db97</span>, <span class="number">0xddb97</span>, <span class="number">0x11db97</span>, <span class="number">0x15db97</span>, <span class="number">0x19db97</span>, <span class="number">0x1ddb97</span>, <span class="number">0x1e397</span>, <span class="number">0x5e397</span>, <span class="number">0x9e397</span>, <span class="number">0xde397</span>,
<a href=#137 id=137 data-nosnippet>137</a> <span class="number">0x11e397</span>, <span class="number">0x15e397</span>, <span class="number">0x19e397</span>, <span class="number">0x1de397</span>, <span class="number">0x1eb97</span>, <span class="number">0x5eb97</span>, <span class="number">0x9eb97</span>, <span class="number">0xdeb97</span>, <span class="number">0x11eb97</span>, <span class="number">0x15eb97</span>,
<a href=#138 id=138 data-nosnippet>138</a> <span class="number">0x19eb97</span>, <span class="number">0x1deb97</span>, <span class="number">0x1f397</span>, <span class="number">0x5f397</span>, <span class="number">0x9f397</span>, <span class="number">0xdf397</span>, <span class="number">0x11f397</span>, <span class="number">0x15f397</span>, <span class="number">0x19f397</span>, <span class="number">0x1df397</span>,
<a href=#139 id=139 data-nosnippet>139</a> <span class="number">0x1fb97</span>, <span class="number">0x5fb97</span>, <span class="number">0x9fb97</span>, <span class="number">0xdfb97</span>, <span class="number">0x11fb97</span>, <span class="number">0x15fb97</span>, <span class="number">0x19fb97</span>, <span class="number">0x1dfb97</span>, <span class="number">0x1c3a7</span>, <span class="number">0x5c3a7</span>,
<a href=#140 id=140 data-nosnippet>140</a> <span class="number">0x9c3a7</span>, <span class="number">0xdc3a7</span>, <span class="number">0x11c3a7</span>, <span class="number">0x15c3a7</span>, <span class="number">0x19c3a7</span>, <span class="number">0x1dc3a7</span>, <span class="number">0x1cba7</span>, <span class="number">0x5cba7</span>, <span class="number">0x9cba7</span>, <span class="number">0xdcba7</span>,
<a href=#141 id=141 data-nosnippet>141</a> <span class="number">0x11cba7</span>, <span class="number">0x15cba7</span>, <span class="number">0x19cba7</span>, <span class="number">0x1dcba7</span>, <span class="number">0x1d3a7</span>, <span class="number">0x5d3a7</span>, <span class="number">0x9d3a7</span>, <span class="number">0xdd3a7</span>, <span class="number">0x11d3a7</span>, <span class="number">0x15d3a7</span>,
<a href=#142 id=142 data-nosnippet>142</a> <span class="number">0x19d3a7</span>, <span class="number">0x1dd3a7</span>, <span class="number">0x1dba7</span>, <span class="number">0x5dba7</span>, <span class="number">0x9dba7</span>, <span class="number">0xddba7</span>, <span class="number">0x11dba7</span>, <span class="number">0x15dba7</span>, <span class="number">0x19dba7</span>, <span class="number">0x1ddba7</span>,
<a href=#143 id=143 data-nosnippet>143</a> <span class="number">0x1e3a7</span>, <span class="number">0x5e3a7</span>, <span class="number">0x9e3a7</span>, <span class="number">0xde3a7</span>, <span class="number">0x11e3a7</span>, <span class="number">0x15e3a7</span>, <span class="number">0x19e3a7</span>, <span class="number">0x1de3a7</span>, <span class="number">0x1eba7</span>, <span class="number">0x5eba7</span>,
<a href=#144 id=144 data-nosnippet>144</a> <span class="number">0x9eba7</span>, <span class="number">0xdeba7</span>, <span class="number">0x11eba7</span>, <span class="number">0x15eba7</span>, <span class="number">0x19eba7</span>, <span class="number">0x1deba7</span>, <span class="number">0x1f3a7</span>, <span class="number">0x5f3a7</span>, <span class="number">0x9f3a7</span>, <span class="number">0xdf3a7</span>,
<a href=#145 id=145 data-nosnippet>145</a> <span class="number">0x11f3a7</span>, <span class="number">0x15f3a7</span>, <span class="number">0x19f3a7</span>, <span class="number">0x1df3a7</span>, <span class="number">0x1fba7</span>, <span class="number">0x5fba7</span>, <span class="number">0x9fba7</span>, <span class="number">0xdfba7</span>, <span class="number">0x11fba7</span>, <span class="number">0x15fba7</span>,
<a href=#146 id=146 data-nosnippet>146</a> <span class="number">0x19fba7</span>, <span class="number">0x1dfba7</span>, <span class="number">0x1c3b7</span>, <span class="number">0x5c3b7</span>, <span class="number">0x9c3b7</span>, <span class="number">0xdc3b7</span>, <span class="number">0x11c3b7</span>, <span class="number">0x15c3b7</span>, <span class="number">0x19c3b7</span>, <span class="number">0x1dc3b7</span>,
<a href=#147 id=147 data-nosnippet>147</a> <span class="number">0x1cbb7</span>, <span class="number">0x5cbb7</span>, <span class="number">0x9cbb7</span>, <span class="number">0xdcbb7</span>, <span class="number">0x11cbb7</span>, <span class="number">0x15cbb7</span>, <span class="number">0x19cbb7</span>, <span class="number">0x1dcbb7</span>, <span class="number">0x1d3b7</span>, <span class="number">0x5d3b7</span>,
<a href=#148 id=148 data-nosnippet>148</a> <span class="number">0x9d3b7</span>, <span class="number">0xdd3b7</span>, <span class="number">0x11d3b7</span>, <span class="number">0x15d3b7</span>, <span class="number">0x19d3b7</span>, <span class="number">0x1dd3b7</span>, <span class="number">0x1dbb7</span>, <span class="number">0x5dbb7</span>, <span class="number">0x9dbb7</span>, <span class="number">0xddbb7</span>,
<a href=#149 id=149 data-nosnippet>149</a> <span class="number">0x11dbb7</span>, <span class="number">0x15dbb7</span>, <span class="number">0x19dbb7</span>, <span class="number">0x1ddbb7</span>, <span class="number">0x1e3b7</span>, <span class="number">0x5e3b7</span>, <span class="number">0x9e3b7</span>, <span class="number">0xde3b7</span>, <span class="number">0x11e3b7</span>, <span class="number">0x15e3b7</span>,
<a href=#150 id=150 data-nosnippet>150</a> <span class="number">0x19e3b7</span>, <span class="number">0x1de3b7</span>, <span class="number">0x1ebb7</span>, <span class="number">0x5ebb7</span>, <span class="number">0x9ebb7</span>, <span class="number">0xdebb7</span>, <span class="number">0x11ebb7</span>, <span class="number">0x15ebb7</span>, <span class="number">0x19ebb7</span>, <span class="number">0x1debb7</span>,
<a href=#151 id=151 data-nosnippet>151</a> <span class="number">0x1f3b7</span>, <span class="number">0x5f3b7</span>, <span class="number">0x9f3b7</span>, <span class="number">0xdf3b7</span>, <span class="number">0x11f3b7</span>, <span class="number">0x15f3b7</span>, <span class="number">0x19f3b7</span>, <span class="number">0x1df3b7</span>, <span class="number">0x1fbb7</span>, <span class="number">0x5fbb7</span>,
<a href=#152 id=152 data-nosnippet>152</a> <span class="number">0x9fbb7</span>, <span class="number">0xdfbb7</span>, <span class="number">0x11fbb7</span>, <span class="number">0x15fbb7</span>, <span class="number">0x19fbb7</span>, <span class="number">0x1dfbb7</span>, <span class="number">0x1c3c7</span>, <span class="number">0x5c3c7</span>, <span class="number">0x9c3c7</span>, <span class="number">0xdc3c7</span>,
<a href=#153 id=153 data-nosnippet>153</a> <span class="number">0x11c3c7</span>, <span class="number">0x15c3c7</span>, <span class="number">0x19c3c7</span>, <span class="number">0x1dc3c7</span>, <span class="number">0x1cbc7</span>, <span class="number">0x5cbc7</span>, <span class="number">0x9cbc7</span>, <span class="number">0xdcbc7</span>, <span class="number">0x11cbc7</span>, <span class="number">0x15cbc7</span>,
<a href=#154 id=154 data-nosnippet>154</a> <span class="number">0x19cbc7</span>, <span class="number">0x1dcbc7</span>, <span class="number">0x1d3c7</span>, <span class="number">0x5d3c7</span>, <span class="number">0x9d3c7</span>, <span class="number">0xdd3c7</span>, <span class="number">0x11d3c7</span>, <span class="number">0x15d3c7</span>, <span class="number">0x19d3c7</span>, <span class="number">0x1dd3c7</span>,
<a href=#155 id=155 data-nosnippet>155</a> <span class="number">0x1dbc7</span>, <span class="number">0x5dbc7</span>, <span class="number">0x9dbc7</span>, <span class="number">0xddbc7</span>, <span class="number">0x11dbc7</span>, <span class="number">0x15dbc7</span>, <span class="number">0x19dbc7</span>, <span class="number">0x1ddbc7</span>, <span class="number">0x1e3c7</span>, <span class="number">0x5e3c7</span>,
<a href=#156 id=156 data-nosnippet>156</a> <span class="number">0x9e3c7</span>, <span class="number">0xde3c7</span>, <span class="number">0x11e3c7</span>, <span class="number">0x15e3c7</span>, <span class="number">0x19e3c7</span>, <span class="number">0x1de3c7</span>, <span class="number">0x1ebc7</span>, <span class="number">0x5ebc7</span>, <span class="number">0x9ebc7</span>, <span class="number">0xdebc7</span>,
<a href=#157 id=157 data-nosnippet>157</a> <span class="number">0x11ebc7</span>, <span class="number">0x15ebc7</span>, <span class="number">0x19ebc7</span>, <span class="number">0x1debc7</span>, <span class="number">0x1f3c7</span>, <span class="number">0x5f3c7</span>, <span class="number">0x9f3c7</span>, <span class="number">0xdf3c7</span>, <span class="number">0x11f3c7</span>, <span class="number">0x15f3c7</span>,
<a href=#158 id=158 data-nosnippet>158</a> <span class="number">0x19f3c7</span>, <span class="number">0x1df3c7</span>, <span class="number">0x1fbc7</span>, <span class="number">0x5fbc7</span>, <span class="number">0x9fbc7</span>, <span class="number">0xdfbc7</span>, <span class="number">0x11fbc7</span>, <span class="number">0x15fbc7</span>, <span class="number">0x19fbc7</span>, <span class="number">0x1dfbc7</span>,
<a href=#159 id=159 data-nosnippet>159</a> <span class="number">0x1c3d7</span>, <span class="number">0x5c3d7</span>, <span class="number">0x9c3d7</span>, <span class="number">0xdc3d7</span>, <span class="number">0x11c3d7</span>, <span class="number">0x15c3d7</span>, <span class="number">0x19c3d7</span>, <span class="number">0x1dc3d7</span>, <span class="number">0x1cbd7</span>, <span class="number">0x5cbd7</span>,
<a href=#160 id=160 data-nosnippet>160</a> <span class="number">0x9cbd7</span>, <span class="number">0xdcbd7</span>, <span class="number">0x11cbd7</span>, <span class="number">0x15cbd7</span>, <span class="number">0x19cbd7</span>, <span class="number">0x1dcbd7</span>, <span class="number">0x1d3d7</span>, <span class="number">0x5d3d7</span>, <span class="number">0x9d3d7</span>, <span class="number">0xdd3d7</span>,
<a href=#161 id=161 data-nosnippet>161</a> <span class="number">0x11d3d7</span>, <span class="number">0x15d3d7</span>, <span class="number">0x19d3d7</span>, <span class="number">0x1dd3d7</span>, <span class="number">0x1dbd7</span>, <span class="number">0x5dbd7</span>, <span class="number">0x9dbd7</span>, <span class="number">0xddbd7</span>, <span class="number">0x11dbd7</span>, <span class="number">0x15dbd7</span>,
<a href=#162 id=162 data-nosnippet>162</a> <span class="number">0x19dbd7</span>, <span class="number">0x1ddbd7</span>, <span class="number">0x1e3d7</span>, <span class="number">0x5e3d7</span>, <span class="number">0x9e3d7</span>, <span class="number">0xde3d7</span>, <span class="number">0x11e3d7</span>, <span class="number">0x15e3d7</span>, <span class="number">0x19e3d7</span>, <span class="number">0x1de3d7</span>,
<a href=#163 id=163 data-nosnippet>163</a> <span class="number">0x1ebd7</span>, <span class="number">0x5ebd7</span>, <span class="number">0x9ebd7</span>, <span class="number">0xdebd7</span>, <span class="number">0x11ebd7</span>, <span class="number">0x15ebd7</span>, <span class="number">0x19ebd7</span>, <span class="number">0x1debd7</span>, <span class="number">0x1f3d7</span>, <span class="number">0x5f3d7</span>,
<a href=#164 id=164 data-nosnippet>164</a> <span class="number">0x9f3d7</span>, <span class="number">0xdf3d7</span>, <span class="number">0x11f3d7</span>, <span class="number">0x15f3d7</span>, <span class="number">0x19f3d7</span>, <span class="number">0x1df3d7</span>, <span class="number">0x1fbd7</span>, <span class="number">0x5fbd7</span>, <span class="number">0x9fbd7</span>, <span class="number">0xdfbd7</span>,
<a href=#165 id=165 data-nosnippet>165</a> <span class="number">0x11fbd7</span>, <span class="number">0x15fbd7</span>, <span class="number">0x19fbd7</span>, <span class="number">0x1dfbd7</span>, <span class="number">0x1c3e7</span>, <span class="number">0x5c3e7</span>, <span class="number">0x9c3e7</span>, <span class="number">0xdc3e7</span>, <span class="number">0x11c3e7</span>, <span class="number">0x15c3e7</span>,
<a href=#166 id=166 data-nosnippet>166</a> <span class="number">0x19c3e7</span>, <span class="number">0x1dc3e7</span>, <span class="number">0x1cbe7</span>, <span class="number">0x5cbe7</span>, <span class="number">0x9cbe7</span>, <span class="number">0xdcbe7</span>, <span class="number">0x11cbe7</span>, <span class="number">0x15cbe7</span>, <span class="number">0x19cbe7</span>, <span class="number">0x1dcbe7</span>,
<a href=#167 id=167 data-nosnippet>167</a> <span class="number">0x1d3e7</span>, <span class="number">0x5d3e7</span>, <span class="number">0x9d3e7</span>, <span class="number">0xdd3e7</span>, <span class="number">0x11d3e7</span>, <span class="number">0x15d3e7</span>, <span class="number">0x19d3e7</span>, <span class="number">0x1dd3e7</span>, <span class="number">0x1dbe7</span>, <span class="number">0x5dbe7</span>,
<a href=#168 id=168 data-nosnippet>168</a> <span class="number">0x9dbe7</span>, <span class="number">0xddbe7</span>, <span class="number">0x11dbe7</span>, <span class="number">0x15dbe7</span>, <span class="number">0x19dbe7</span>, <span class="number">0x1ddbe7</span>, <span class="number">0x1e3e7</span>, <span class="number">0x5e3e7</span>, <span class="number">0x9e3e7</span>, <span class="number">0xde3e7</span>,
<a href=#169 id=169 data-nosnippet>169</a> <span class="number">0x11e3e7</span>, <span class="number">0x15e3e7</span>, <span class="number">0x19e3e7</span>, <span class="number">0x1de3e7</span>, <span class="number">0x1ebe7</span>, <span class="number">0x5ebe7</span>, <span class="number">0x9ebe7</span>, <span class="number">0xdebe7</span>, <span class="number">0x11ebe7</span>, <span class="number">0x15ebe7</span>,
<a href=#170 id=170 data-nosnippet>170</a> <span class="number">0x19ebe7</span>, <span class="number">0x1debe7</span>, <span class="number">0x1f3e7</span>, <span class="number">0x5f3e7</span>, <span class="number">0x9f3e7</span>, <span class="number">0xdf3e7</span>, <span class="number">0x11f3e7</span>, <span class="number">0x15f3e7</span>, <span class="number">0x19f3e7</span>, <span class="number">0x1df3e7</span>,
<a href=#171 id=171 data-nosnippet>171</a> <span class="number">0x1fbe7</span>, <span class="number">0x5fbe7</span>, <span class="number">0x9fbe7</span>, <span class="number">0xdfbe7</span>, <span class="number">0x11fbe7</span>, <span class="number">0x15fbe7</span>, <span class="number">0x19fbe7</span>, <span class="number">0x1dfbe7</span>, <span class="number">0x1c3f7</span>, <span class="number">0x5c3f7</span>,
<a href=#172 id=172 data-nosnippet>172</a> <span class="number">0x9c3f7</span>, <span class="number">0xdc3f7</span>, <span class="number">0x11c3f7</span>, <span class="number">0x15c3f7</span>, <span class="number">0x19c3f7</span>, <span class="number">0x1dc3f7</span>, <span class="number">0x1cbf7</span>, <span class="number">0x5cbf7</span>, <span class="number">0x9cbf7</span>, <span class="number">0xdcbf7</span>,
<a href=#173 id=173 data-nosnippet>173</a> <span class="number">0x11cbf7</span>, <span class="number">0x15cbf7</span>, <span class="number">0x19cbf7</span>, <span class="number">0x1dcbf7</span>, <span class="number">0x1d3f7</span>, <span class="number">0x5d3f7</span>, <span class="number">0x9d3f7</span>, <span class="number">0xdd3f7</span>, <span class="number">0x11d3f7</span>, <span class="number">0x15d3f7</span>,
<a href=#174 id=174 data-nosnippet>174</a> <span class="number">0x19d3f7</span>, <span class="number">0x1dd3f7</span>, <span class="number">0x1dbf7</span>, <span class="number">0x5dbf7</span>, <span class="number">0x9dbf7</span>, <span class="number">0xddbf7</span>, <span class="number">0x11dbf7</span>, <span class="number">0x15dbf7</span>, <span class="number">0x19dbf7</span>, <span class="number">0x1ddbf7</span>,
<a href=#175 id=175 data-nosnippet>175</a> <span class="number">0x1e3f7</span>, <span class="number">0x5e3f7</span>, <span class="number">0x9e3f7</span>, <span class="number">0xde3f7</span>, <span class="number">0x11e3f7</span>, <span class="number">0x15e3f7</span>, <span class="number">0x19e3f7</span>, <span class="number">0x1de3f7</span>, <span class="number">0x1ebf7</span>, <span class="number">0x5ebf7</span>,
<a href=#176 id=176 data-nosnippet>176</a> <span class="number">0x9ebf7</span>, <span class="number">0xdebf7</span>, <span class="number">0x11ebf7</span>, <span class="number">0x15ebf7</span>, <span class="number">0x19ebf7</span>, <span class="number">0x1debf7</span>, <span class="number">0x1f3f7</span>, <span class="number">0x5f3f7</span>, <span class="number">0x9f3f7</span>, <span class="number">0xdf3f7</span>,
<a href=#177 id=177 data-nosnippet>177</a> <span class="number">0x11f3f7</span>, <span class="number">0x15f3f7</span>, <span class="number">0x19f3f7</span>, <span class="number">0x1df3f7</span>, <span class="number">0x1fbf7</span>, <span class="number">0x5fbf7</span>, <span class="number">0x9fbf7</span>, <span class="number">0xdfbf7</span>, <span class="number">0x11fbf7</span>, <span class="number">0x15fbf7</span>,
<a href=#178 id=178 data-nosnippet>178</a> <span class="number">0x19fbf7</span>, <span class="number">0x1dfbf7</span>, <span class="number">0xe1c387</span>, <span class="number">0x2e1c387</span>, <span class="number">0x4e1c387</span>, <span class="number">0x6e1c387</span>, <span class="number">0x8e1c387</span>, <span class="number">0xae1c387</span>, <span class="number">0xce1c387</span>,
<a href=#179 id=179 data-nosnippet>179</a> <span class="number">0xee1c387</span>, <span class="number">0xe5c387</span>, <span class="number">0x2e5c387</span>, <span class="number">0x4e5c387</span>, <span class="number">0x6e5c387</span>, <span class="number">0x8e5c387</span>, <span class="number">0xae5c387</span>, <span class="number">0xce5c387</span>,
<a href=#180 id=180 data-nosnippet>180</a> <span class="number">0xee5c387</span>, <span class="number">0xe9c387</span>, <span class="number">0x2e9c387</span>, <span class="number">0x4e9c387</span>, <span class="number">0x6e9c387</span>, <span class="number">0x8e9c387</span>, <span class="number">0xae9c387</span>, <span class="number">0xce9c387</span>,
<a href=#181 id=181 data-nosnippet>181</a> <span class="number">0xee9c387</span>, <span class="number">0xedc387</span>, <span class="number">0x2edc387</span>, <span class="number">0x4edc387</span>, <span class="number">0x6edc387</span>, <span class="number">0x8edc387</span>, <span class="number">0xaedc387</span>, <span class="number">0xcedc387</span>,
<a href=#182 id=182 data-nosnippet>182</a> <span class="number">0xeedc387</span>, <span class="number">0xf1c387</span>, <span class="number">0x2f1c387</span>, <span class="number">0x4f1c387</span>, <span class="number">0x6f1c387</span>, <span class="number">0x8f1c387</span>, <span class="number">0xaf1c387</span>, <span class="number">0xcf1c387</span>,
<a href=#183 id=183 data-nosnippet>183</a> <span class="number">0xef1c387</span>, <span class="number">0xf5c387</span>, <span class="number">0x2f5c387</span>, <span class="number">0x4f5c387</span>, <span class="number">0x6f5c387</span>, <span class="number">0x8f5c387</span>, <span class="number">0xaf5c387</span>, <span class="number">0xcf5c387</span>,
<a href=#184 id=184 data-nosnippet>184</a> <span class="number">0xef5c387</span>, <span class="number">0xf9c387</span>, <span class="number">0x2f9c387</span>, <span class="number">0x4f9c387</span>, <span class="number">0x6f9c387</span>, <span class="number">0x8f9c387</span>, <span class="number">0xaf9c387</span>, <span class="number">0xcf9c387</span>,
<a href=#185 id=185 data-nosnippet>185</a> <span class="number">0xef9c387</span>, <span class="number">0xfdc387</span>, <span class="number">0x2fdc387</span>, <span class="number">0x4fdc387</span>, <span class="number">0x6fdc387</span>, <span class="number">0x8fdc387</span>, <span class="number">0xafdc387</span>, <span class="number">0xcfdc387</span>,
<a href=#186 id=186 data-nosnippet>186</a> <span class="number">0xefdc387</span>, <span class="number">0xe1cb87</span>, <span class="number">0x2e1cb87</span>, <span class="number">0x4e1cb87</span>, <span class="number">0x6e1cb87</span>, <span class="number">0x8e1cb87</span>, <span class="number">0xae1cb87</span>, <span class="number">0xce1cb87</span>,
<a href=#187 id=187 data-nosnippet>187</a> <span class="number">0xee1cb87</span>, <span class="number">0xe5cb87</span>, <span class="number">0x2e5cb87</span>, <span class="number">0x4e5cb87</span>, <span class="number">0x6e5cb87</span>, <span class="number">0x8e5cb87</span>, <span class="number">0xae5cb87</span>, <span class="number">0xce5cb87</span>,
<a href=#188 id=188 data-nosnippet>188</a> <span class="number">0xee5cb87</span>, <span class="number">0xe9cb87</span>, <span class="number">0x2e9cb87</span>, <span class="number">0x4e9cb87</span>, <span class="number">0x6e9cb87</span>, <span class="number">0x8e9cb87</span>, <span class="number">0xae9cb87</span>, <span class="number">0xce9cb87</span>,
<a href=#189 id=189 data-nosnippet>189</a> <span class="number">0xee9cb87</span>, <span class="number">0xedcb87</span>, <span class="number">0x2edcb87</span>, <span class="number">0x4edcb87</span>, <span class="number">0x6edcb87</span>, <span class="number">0x8edcb87</span>, <span class="number">0xaedcb87</span>, <span class="number">0xcedcb87</span>,
<a href=#190 id=190 data-nosnippet>190</a> <span class="number">0xeedcb87</span>, <span class="number">0xf1cb87</span>, <span class="number">0x2f1cb87</span>, <span class="number">0x4f1cb87</span>, <span class="number">0x6f1cb87</span>, <span class="number">0x8f1cb87</span>, <span class="number">0xaf1cb87</span>, <span class="number">0xcf1cb87</span>,
<a href=#191 id=191 data-nosnippet>191</a> <span class="number">0xef1cb87</span>, <span class="number">0xf5cb87</span>, <span class="number">0x2f5cb87</span>, <span class="number">0x4f5cb87</span>, <span class="number">0x6f5cb87</span>, <span class="number">0x8f5cb87</span>, <span class="number">0xaf5cb87</span>, <span class="number">0xcf5cb87</span>,
<a href=#192 id=192 data-nosnippet>192</a> <span class="number">0xef5cb87</span>, <span class="number">0xf9cb87</span>, <span class="number">0x2f9cb87</span>, <span class="number">0x4f9cb87</span>, <span class="number">0x6f9cb87</span>, <span class="number">0x8f9cb87</span>,
<a href=#193 id=193 data-nosnippet>193</a>];
<a href=#194 id=194 data-nosnippet>194</a>
<a href=#195 id=195 data-nosnippet>195</a><span class="kw">pub static </span>kZeroRepsDepth: [u32; <span class="number">704</span>] = [
<a href=#196 id=196 data-nosnippet>196</a> <span class="number">0</span>, <span class="number">4</span>, <span class="number">8</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">7</span>, <span class="number">11</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>,
<a href=#197 id=197 data-nosnippet>197</a> <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>,
<a href=#198 id=198 data-nosnippet>198</a> <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>, <span class="number">14</span>,
<a href=#199 id=199 data-nosnippet>199</a> <span class="number">14</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#200 id=200 data-nosnippet>200</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#201 id=201 data-nosnippet>201</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#202 id=202 data-nosnippet>202</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#203 id=203 data-nosnippet>203</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#204 id=204 data-nosnippet>204</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#205 id=205 data-nosnippet>205</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#206 id=206 data-nosnippet>206</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#207 id=207 data-nosnippet>207</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#208 id=208 data-nosnippet>208</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#209 id=209 data-nosnippet>209</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#210 id=210 data-nosnippet>210</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#211 id=211 data-nosnippet>211</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#212 id=212 data-nosnippet>212</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#213 id=213 data-nosnippet>213</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#214 id=214 data-nosnippet>214</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#215 id=215 data-nosnippet>215</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#216 id=216 data-nosnippet>216</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#217 id=217 data-nosnippet>217</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#218 id=218 data-nosnippet>218</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#219 id=219 data-nosnippet>219</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>,
<a href=#220 id=220 data-nosnippet>220</a> <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">21</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>,
<a href=#221 id=221 data-nosnippet>221</a> <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>,
<a href=#222 id=222 data-nosnippet>222</a> <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>,
<a href=#223 id=223 data-nosnippet>223</a> <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>,
<a href=#224 id=224 data-nosnippet>224</a> <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>,
<a href=#225 id=225 data-nosnippet>225</a> <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>, <span class="number">28</span>,
<a href=#226 id=226 data-nosnippet>226</a>];
<a href=#227 id=227 data-nosnippet>227</a>
<a href=#228 id=228 data-nosnippet>228</a><span class="kw">pub static </span>kUTF8ContextLookup: [u8; <span class="number">512</span>] = [
<a href=#229 id=229 data-nosnippet>229</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">4</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#230 id=230 data-nosnippet>230</a> <span class="number">8</span>, <span class="number">12</span>, <span class="number">16</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">20</span>, <span class="number">12</span>, <span class="number">16</span>, <span class="number">24</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">32</span>, <span class="number">12</span>, <span class="number">36</span>, <span class="number">12</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>, <span class="number">44</span>,
<a href=#231 id=231 data-nosnippet>231</a> <span class="number">44</span>, <span class="number">44</span>, <span class="number">32</span>, <span class="number">32</span>, <span class="number">24</span>, <span class="number">40</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>,
<a href=#232 id=232 data-nosnippet>232</a> <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">52</span>, <span class="number">24</span>, <span class="number">12</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>,
<a href=#233 id=233 data-nosnippet>233</a> <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">60</span>, <span class="number">24</span>, <span class="number">12</span>, <span class="number">28</span>, <span class="number">12</span>, <span class="number">0</span>,
<a href=#234 id=234 data-nosnippet>234</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>,
<a href=#235 id=235 data-nosnippet>235</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>,
<a href=#236 id=236 data-nosnippet>236</a> <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>,
<a href=#237 id=237 data-nosnippet>237</a> <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">3</span>,
<a href=#238 id=238 data-nosnippet>238</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#239 id=239 data-nosnippet>239</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>,
<a href=#240 id=240 data-nosnippet>240</a> <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>,
<a href=#241 id=241 data-nosnippet>241</a> <span class="number">1</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>,
<a href=#242 id=242 data-nosnippet>242</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#243 id=243 data-nosnippet>243</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#244 id=244 data-nosnippet>244</a> <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>,
<a href=#245 id=245 data-nosnippet>245</a> <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#246 id=246 data-nosnippet>246</a>];
<a href=#247 id=247 data-nosnippet>247</a>
<a href=#248 id=248 data-nosnippet>248</a><span class="kw">pub static </span>kSigned3BitContextLookup: [u8; <span class="number">256</span>] = [
<a href=#249 id=249 data-nosnippet>249</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#250 id=250 data-nosnippet>250</a> <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>, <span class="number">2</span>,
<a href=#251 id=251 data-nosnippet>251</a> <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>,
<a href=#252 id=252 data-nosnippet>252</a> <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">3</span>,
<a href=#253 id=253 data-nosnippet>253</a> <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>,
<a href=#254 id=254 data-nosnippet>254</a> <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>,
<a href=#255 id=255 data-nosnippet>255</a> <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>,
<a href=#256 id=256 data-nosnippet>256</a> <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">7</span>,
<a href=#257 id=257 data-nosnippet>257</a>];
<a href=#258 id=258 data-nosnippet>258</a>
<a href=#259 id=259 data-nosnippet>259</a><span class="kw">pub static </span>kBrotliMinWindowBits: i32 = <span class="number">10i32</span>;
<a href=#260 id=260 data-nosnippet>260</a>
<a href=#261 id=261 data-nosnippet>261</a><span class="kw">pub static </span>kBrotliMaxWindowBits: i32 = <span class="number">24i32</span>;
<a href=#262 id=262 data-nosnippet>262</a>
<a href=#263 id=263 data-nosnippet>263</a><span class="kw">pub static </span>kCodeLengthDepth: [u8; <span class="number">18</span>] = [<span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">5</span>, <span class="number">0</span>, <span class="number">4</span>, <span class="number">4</span>];
<a href=#264 id=264 data-nosnippet>264</a>
<a href=#265 id=265 data-nosnippet>265</a><span class="kw">pub static </span>kStaticDistanceCodeDepth: [u8; <span class="number">64</span>] = [
<a href=#266 id=266 data-nosnippet>266</a> <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>,
<a href=#267 id=267 data-nosnippet>267</a> <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>,
<a href=#268 id=268 data-nosnippet>268</a>];
<a href=#269 id=269 data-nosnippet>269</a>
<a href=#270 id=270 data-nosnippet>270</a><span class="kw">pub static </span>kCodeLengthBits: [u32; <span class="number">18</span>] =
<a href=#271 id=271 data-nosnippet>271</a> [<span class="number">0</span>, <span class="number">8</span>, <span class="number">4</span>, <span class="number">12</span>, <span class="number">2</span>, <span class="number">10</span>, <span class="number">6</span>, <span class="number">14</span>, <span class="number">1</span>, <span class="number">9</span>, <span class="number">5</span>, <span class="number">13</span>, <span class="number">3</span>, <span class="number">15</span>, <span class="number">31</span>, <span class="number">0</span>, <span class="number">11</span>, <span class="number">7</span>];
<a href=#272 id=272 data-nosnippet>272</a><span class="kw">pub static </span>kNonZeroRepsBits: [usize; <span class="number">704</span>] = [
<a href=#273 id=273 data-nosnippet>273</a> <span class="number">0xb</span>, <span class="number">0x1b</span>, <span class="number">0x2b</span>, <span class="number">0x3b</span>, <span class="number">0x2cb</span>, <span class="number">0x6cb</span>, <span class="number">0xacb</span>, <span class="number">0xecb</span>, <span class="number">0x2db</span>, <span class="number">0x6db</span>, <span class="number">0xadb</span>, <span class="number">0xedb</span>, <span class="number">0x2eb</span>, <span class="number">0x6eb</span>,
<a href=#274 id=274 data-nosnippet>274</a> <span class="number">0xaeb</span>, <span class="number">0xeeb</span>, <span class="number">0x2fb</span>, <span class="number">0x6fb</span>, <span class="number">0xafb</span>, <span class="number">0xefb</span>, <span class="number">0xb2cb</span>, <span class="number">0x1b2cb</span>, <span class="number">0x2b2cb</span>, <span class="number">0x3b2cb</span>, <span class="number">0xb6cb</span>, <span class="number">0x1b6cb</span>,
<a href=#275 id=275 data-nosnippet>275</a> <span class="number">0x2b6cb</span>, <span class="number">0x3b6cb</span>, <span class="number">0xbacb</span>, <span class="number">0x1bacb</span>, <span class="number">0x2bacb</span>, <span class="number">0x3bacb</span>, <span class="number">0xbecb</span>, <span class="number">0x1becb</span>, <span class="number">0x2becb</span>, <span class="number">0x3becb</span>, <span class="number">0xb2db</span>,
<a href=#276 id=276 data-nosnippet>276</a> <span class="number">0x1b2db</span>, <span class="number">0x2b2db</span>, <span class="number">0x3b2db</span>, <span class="number">0xb6db</span>, <span class="number">0x1b6db</span>, <span class="number">0x2b6db</span>, <span class="number">0x3b6db</span>, <span class="number">0xbadb</span>, <span class="number">0x1badb</span>, <span class="number">0x2badb</span>,
<a href=#277 id=277 data-nosnippet>277</a> <span class="number">0x3badb</span>, <span class="number">0xbedb</span>, <span class="number">0x1bedb</span>, <span class="number">0x2bedb</span>, <span class="number">0x3bedb</span>, <span class="number">0xb2eb</span>, <span class="number">0x1b2eb</span>, <span class="number">0x2b2eb</span>, <span class="number">0x3b2eb</span>, <span class="number">0xb6eb</span>, <span class="number">0x1b6eb</span>,
<a href=#278 id=278 data-nosnippet>278</a> <span class="number">0x2b6eb</span>, <span class="number">0x3b6eb</span>, <span class="number">0xbaeb</span>, <span class="number">0x1baeb</span>, <span class="number">0x2baeb</span>, <span class="number">0x3baeb</span>, <span class="number">0xbeeb</span>, <span class="number">0x1beeb</span>, <span class="number">0x2beeb</span>, <span class="number">0x3beeb</span>, <span class="number">0xb2fb</span>,
<a href=#279 id=279 data-nosnippet>279</a> <span class="number">0x1b2fb</span>, <span class="number">0x2b2fb</span>, <span class="number">0x3b2fb</span>, <span class="number">0xb6fb</span>, <span class="number">0x1b6fb</span>, <span class="number">0x2b6fb</span>, <span class="number">0x3b6fb</span>, <span class="number">0xbafb</span>, <span class="number">0x1bafb</span>, <span class="number">0x2bafb</span>,
<a href=#280 id=280 data-nosnippet>280</a> <span class="number">0x3bafb</span>, <span class="number">0xbefb</span>, <span class="number">0x1befb</span>, <span class="number">0x2befb</span>, <span class="number">0x3befb</span>, <span class="number">0x2cb2cb</span>, <span class="number">0x6cb2cb</span>, <span class="number">0xacb2cb</span>, <span class="number">0xecb2cb</span>, <span class="number">0x2db2cb</span>,
<a href=#281 id=281 data-nosnippet>281</a> <span class="number">0x6db2cb</span>, <span class="number">0xadb2cb</span>, <span class="number">0xedb2cb</span>, <span class="number">0x2eb2cb</span>, <span class="number">0x6eb2cb</span>, <span class="number">0xaeb2cb</span>, <span class="number">0xeeb2cb</span>, <span class="number">0x2fb2cb</span>, <span class="number">0x6fb2cb</span>,
<a href=#282 id=282 data-nosnippet>282</a> <span class="number">0xafb2cb</span>, <span class="number">0xefb2cb</span>, <span class="number">0x2cb6cb</span>, <span class="number">0x6cb6cb</span>, <span class="number">0xacb6cb</span>, <span class="number">0xecb6cb</span>, <span class="number">0x2db6cb</span>, <span class="number">0x6db6cb</span>, <span class="number">0xadb6cb</span>,
<a href=#283 id=283 data-nosnippet>283</a> <span class="number">0xedb6cb</span>, <span class="number">0x2eb6cb</span>, <span class="number">0x6eb6cb</span>, <span class="number">0xaeb6cb</span>, <span class="number">0xeeb6cb</span>, <span class="number">0x2fb6cb</span>, <span class="number">0x6fb6cb</span>, <span class="number">0xafb6cb</span>, <span class="number">0xefb6cb</span>,
<a href=#284 id=284 data-nosnippet>284</a> <span class="number">0x2cbacb</span>, <span class="number">0x6cbacb</span>, <span class="number">0xacbacb</span>, <span class="number">0xecbacb</span>, <span class="number">0x2dbacb</span>, <span class="number">0x6dbacb</span>, <span class="number">0xadbacb</span>, <span class="number">0xedbacb</span>, <span class="number">0x2ebacb</span>,
<a href=#285 id=285 data-nosnippet>285</a> <span class="number">0x6ebacb</span>, <span class="number">0xaebacb</span>, <span class="number">0xeebacb</span>, <span class="number">0x2fbacb</span>, <span class="number">0x6fbacb</span>, <span class="number">0xafbacb</span>, <span class="number">0xefbacb</span>, <span class="number">0x2cbecb</span>, <span class="number">0x6cbecb</span>,
<a href=#286 id=286 data-nosnippet>286</a> <span class="number">0xacbecb</span>, <span class="number">0xecbecb</span>, <span class="number">0x2dbecb</span>, <span class="number">0x6dbecb</span>, <span class="number">0xadbecb</span>, <span class="number">0xedbecb</span>, <span class="number">0x2ebecb</span>, <span class="number">0x6ebecb</span>, <span class="number">0xaebecb</span>,
<a href=#287 id=287 data-nosnippet>287</a> <span class="number">0xeebecb</span>, <span class="number">0x2fbecb</span>, <span class="number">0x6fbecb</span>, <span class="number">0xafbecb</span>, <span class="number">0xefbecb</span>, <span class="number">0x2cb2db</span>, <span class="number">0x6cb2db</span>, <span class="number">0xacb2db</span>, <span class="number">0xecb2db</span>,
<a href=#288 id=288 data-nosnippet>288</a> <span class="number">0x2db2db</span>, <span class="number">0x6db2db</span>, <span class="number">0xadb2db</span>, <span class="number">0xedb2db</span>, <span class="number">0x2eb2db</span>, <span class="number">0x6eb2db</span>, <span class="number">0xaeb2db</span>, <span class="number">0xeeb2db</span>, <span class="number">0x2fb2db</span>,
<a href=#289 id=289 data-nosnippet>289</a> <span class="number">0x6fb2db</span>, <span class="number">0xafb2db</span>, <span class="number">0xefb2db</span>, <span class="number">0x2cb6db</span>, <span class="number">0x6cb6db</span>, <span class="number">0xacb6db</span>, <span class="number">0xecb6db</span>, <span class="number">0x2db6db</span>, <span class="number">0x6db6db</span>,
<a href=#290 id=290 data-nosnippet>290</a> <span class="number">0xadb6db</span>, <span class="number">0xedb6db</span>, <span class="number">0x2eb6db</span>, <span class="number">0x6eb6db</span>, <span class="number">0xaeb6db</span>, <span class="number">0xeeb6db</span>, <span class="number">0x2fb6db</span>, <span class="number">0x6fb6db</span>, <span class="number">0xafb6db</span>,
<a href=#291 id=291 data-nosnippet>291</a> <span class="number">0xefb6db</span>, <span class="number">0x2cbadb</span>, <span class="number">0x6cbadb</span>, <span class="number">0xacbadb</span>, <span class="number">0xecbadb</span>, <span class="number">0x2dbadb</span>, <span class="number">0x6dbadb</span>, <span class="number">0xadbadb</span>, <span class="number">0xedbadb</span>,
<a href=#292 id=292 data-nosnippet>292</a> <span class="number">0x2ebadb</span>, <span class="number">0x6ebadb</span>, <span class="number">0xaebadb</span>, <span class="number">0xeebadb</span>, <span class="number">0x2fbadb</span>, <span class="number">0x6fbadb</span>, <span class="number">0xafbadb</span>, <span class="number">0xefbadb</span>, <span class="number">0x2cbedb</span>,
<a href=#293 id=293 data-nosnippet>293</a> <span class="number">0x6cbedb</span>, <span class="number">0xacbedb</span>, <span class="number">0xecbedb</span>, <span class="number">0x2dbedb</span>, <span class="number">0x6dbedb</span>, <span class="number">0xadbedb</span>, <span class="number">0xedbedb</span>, <span class="number">0x2ebedb</span>, <span class="number">0x6ebedb</span>,
<a href=#294 id=294 data-nosnippet>294</a> <span class="number">0xaebedb</span>, <span class="number">0xeebedb</span>, <span class="number">0x2fbedb</span>, <span class="number">0x6fbedb</span>, <span class="number">0xafbedb</span>, <span class="number">0xefbedb</span>, <span class="number">0x2cb2eb</span>, <span class="number">0x6cb2eb</span>, <span class="number">0xacb2eb</span>,
<a href=#295 id=295 data-nosnippet>295</a> <span class="number">0xecb2eb</span>, <span class="number">0x2db2eb</span>, <span class="number">0x6db2eb</span>, <span class="number">0xadb2eb</span>, <span class="number">0xedb2eb</span>, <span class="number">0x2eb2eb</span>, <span class="number">0x6eb2eb</span>, <span class="number">0xaeb2eb</span>, <span class="number">0xeeb2eb</span>,
<a href=#296 id=296 data-nosnippet>296</a> <span class="number">0x2fb2eb</span>, <span class="number">0x6fb2eb</span>, <span class="number">0xafb2eb</span>, <span class="number">0xefb2eb</span>, <span class="number">0x2cb6eb</span>, <span class="number">0x6cb6eb</span>, <span class="number">0xacb6eb</span>, <span class="number">0xecb6eb</span>, <span class="number">0x2db6eb</span>,
<a href=#297 id=297 data-nosnippet>297</a> <span class="number">0x6db6eb</span>, <span class="number">0xadb6eb</span>, <span class="number">0xedb6eb</span>, <span class="number">0x2eb6eb</span>, <span class="number">0x6eb6eb</span>, <span class="number">0xaeb6eb</span>, <span class="number">0xeeb6eb</span>, <span class="number">0x2fb6eb</span>, <span class="number">0x6fb6eb</span>,
<a href=#298 id=298 data-nosnippet>298</a> <span class="number">0xafb6eb</span>, <span class="number">0xefb6eb</span>, <span class="number">0x2cbaeb</span>, <span class="number">0x6cbaeb</span>, <span class="number">0xacbaeb</span>, <span class="number">0xecbaeb</span>, <span class="number">0x2dbaeb</span>, <span class="number">0x6dbaeb</span>, <span class="number">0xadbaeb</span>,
<a href=#299 id=299 data-nosnippet>299</a> <span class="number">0xedbaeb</span>, <span class="number">0x2ebaeb</span>, <span class="number">0x6ebaeb</span>, <span class="number">0xaebaeb</span>, <span class="number">0xeebaeb</span>, <span class="number">0x2fbaeb</span>, <span class="number">0x6fbaeb</span>, <span class="number">0xafbaeb</span>, <span class="number">0xefbaeb</span>,
<a href=#300 id=300 data-nosnippet>300</a> <span class="number">0x2cbeeb</span>, <span class="number">0x6cbeeb</span>, <span class="number">0xacbeeb</span>, <span class="number">0xecbeeb</span>, <span class="number">0x2dbeeb</span>, <span class="number">0x6dbeeb</span>, <span class="number">0xadbeeb</span>, <span class="number">0xedbeeb</span>, <span class="number">0x2ebeeb</span>,
<a href=#301 id=301 data-nosnippet>301</a> <span class="number">0x6ebeeb</span>, <span class="number">0xaebeeb</span>, <span class="number">0xeebeeb</span>, <span class="number">0x2fbeeb</span>, <span class="number">0x6fbeeb</span>, <span class="number">0xafbeeb</span>, <span class="number">0xefbeeb</span>, <span class="number">0x2cb2fb</span>, <span class="number">0x6cb2fb</span>,
<a href=#302 id=302 data-nosnippet>302</a> <span class="number">0xacb2fb</span>, <span class="number">0xecb2fb</span>, <span class="number">0x2db2fb</span>, <span class="number">0x6db2fb</span>, <span class="number">0xadb2fb</span>, <span class="number">0xedb2fb</span>, <span class="number">0x2eb2fb</span>, <span class="number">0x6eb2fb</span>, <span class="number">0xaeb2fb</span>,
<a href=#303 id=303 data-nosnippet>303</a> <span class="number">0xeeb2fb</span>, <span class="number">0x2fb2fb</span>, <span class="number">0x6fb2fb</span>, <span class="number">0xafb2fb</span>, <span class="number">0xefb2fb</span>, <span class="number">0x2cb6fb</span>, <span class="number">0x6cb6fb</span>, <span class="number">0xacb6fb</span>, <span class="number">0xecb6fb</span>,
<a href=#304 id=304 data-nosnippet>304</a> <span class="number">0x2db6fb</span>, <span class="number">0x6db6fb</span>, <span class="number">0xadb6fb</span>, <span class="number">0xedb6fb</span>, <span class="number">0x2eb6fb</span>, <span class="number">0x6eb6fb</span>, <span class="number">0xaeb6fb</span>, <span class="number">0xeeb6fb</span>, <span class="number">0x2fb6fb</span>,
<a href=#305 id=305 data-nosnippet>305</a> <span class="number">0x6fb6fb</span>, <span class="number">0xafb6fb</span>, <span class="number">0xefb6fb</span>, <span class="number">0x2cbafb</span>, <span class="number">0x6cbafb</span>, <span class="number">0xacbafb</span>, <span class="number">0xecbafb</span>, <span class="number">0x2dbafb</span>, <span class="number">0x6dbafb</span>,
<a href=#306 id=306 data-nosnippet>306</a> <span class="number">0xadbafb</span>, <span class="number">0xedbafb</span>, <span class="number">0x2ebafb</span>, <span class="number">0x6ebafb</span>, <span class="number">0xaebafb</span>, <span class="number">0xeebafb</span>, <span class="number">0x2fbafb</span>, <span class="number">0x6fbafb</span>, <span class="number">0xafbafb</span>,
<a href=#307 id=307 data-nosnippet>307</a> <span class="number">0xefbafb</span>, <span class="number">0x2cbefb</span>, <span class="number">0x6cbefb</span>, <span class="number">0xacbefb</span>, <span class="number">0xecbefb</span>, <span class="number">0x2dbefb</span>, <span class="number">0x6dbefb</span>, <span class="number">0xadbefb</span>, <span class="number">0xedbefb</span>,
<a href=#308 id=308 data-nosnippet>308</a> <span class="number">0x2ebefb</span>, <span class="number">0x6ebefb</span>, <span class="number">0xaebefb</span>, <span class="number">0xeebefb</span>, <span class="number">0x2fbefb</span>, <span class="number">0x6fbefb</span>, <span class="number">0xafbefb</span>, <span class="number">0xefbefb</span>, <span class="number">0xb2cb2cb</span>,
<a href=#309 id=309 data-nosnippet>309</a> <span class="number">0x1b2cb2cb</span>, <span class="number">0x2b2cb2cb</span>, <span class="number">0x3b2cb2cb</span>, <span class="number">0xb6cb2cb</span>, <span class="number">0x1b6cb2cb</span>, <span class="number">0x2b6cb2cb</span>, <span class="number">0x3b6cb2cb</span>, <span class="number">0xbacb2cb</span>,
<a href=#310 id=310 data-nosnippet>310</a> <span class="number">0x1bacb2cb</span>, <span class="number">0x2bacb2cb</span>, <span class="number">0x3bacb2cb</span>, <span class="number">0xbecb2cb</span>, <span class="number">0x1becb2cb</span>, <span class="number">0x2becb2cb</span>, <span class="number">0x3becb2cb</span>, <span class="number">0xb2db2cb</span>,
<a href=#311 id=311 data-nosnippet>311</a> <span class="number">0x1b2db2cb</span>, <span class="number">0x2b2db2cb</span>, <span class="number">0x3b2db2cb</span>, <span class="number">0xb6db2cb</span>, <span class="number">0x1b6db2cb</span>, <span class="number">0x2b6db2cb</span>, <span class="number">0x3b6db2cb</span>, <span class="number">0xbadb2cb</span>,
<a href=#312 id=312 data-nosnippet>312</a> <span class="number">0x1badb2cb</span>, <span class="number">0x2badb2cb</span>, <span class="number">0x3badb2cb</span>, <span class="number">0xbedb2cb</span>, <span class="number">0x1bedb2cb</span>, <span class="number">0x2bedb2cb</span>, <span class="number">0x3bedb2cb</span>, <span class="number">0xb2eb2cb</span>,
<a href=#313 id=313 data-nosnippet>313</a> <span class="number">0x1b2eb2cb</span>, <span class="number">0x2b2eb2cb</span>, <span class="number">0x3b2eb2cb</span>, <span class="number">0xb6eb2cb</span>, <span class="number">0x1b6eb2cb</span>, <span class="number">0x2b6eb2cb</span>, <span class="number">0x3b6eb2cb</span>, <span class="number">0xbaeb2cb</span>,
<a href=#314 id=314 data-nosnippet>314</a> <span class="number">0x1baeb2cb</span>, <span class="number">0x2baeb2cb</span>, <span class="number">0x3baeb2cb</span>, <span class="number">0xbeeb2cb</span>, <span class="number">0x1beeb2cb</span>, <span class="number">0x2beeb2cb</span>, <span class="number">0x3beeb2cb</span>, <span class="number">0xb2fb2cb</span>,
<a href=#315 id=315 data-nosnippet>315</a> <span class="number">0x1b2fb2cb</span>, <span class="number">0x2b2fb2cb</span>, <span class="number">0x3b2fb2cb</span>, <span class="number">0xb6fb2cb</span>, <span class="number">0x1b6fb2cb</span>, <span class="number">0x2b6fb2cb</span>, <span class="number">0x3b6fb2cb</span>, <span class="number">0xbafb2cb</span>,
<a href=#316 id=316 data-nosnippet>316</a> <span class="number">0x1bafb2cb</span>, <span class="number">0x2bafb2cb</span>, <span class="number">0x3bafb2cb</span>, <span class="number">0xbefb2cb</span>, <span class="number">0x1befb2cb</span>, <span class="number">0x2befb2cb</span>, <span class="number">0x3befb2cb</span>, <span class="number">0xb2cb6cb</span>,
<a href=#317 id=317 data-nosnippet>317</a> <span class="number">0x1b2cb6cb</span>, <span class="number">0x2b2cb6cb</span>, <span class="number">0x3b2cb6cb</span>, <span class="number">0xb6cb6cb</span>, <span class="number">0x1b6cb6cb</span>, <span class="number">0x2b6cb6cb</span>, <span class="number">0x3b6cb6cb</span>, <span class="number">0xbacb6cb</span>,
<a href=#318 id=318 data-nosnippet>318</a> <span class="number">0x1bacb6cb</span>, <span class="number">0x2bacb6cb</span>, <span class="number">0x3bacb6cb</span>, <span class="number">0xbecb6cb</span>, <span class="number">0x1becb6cb</span>, <span class="number">0x2becb6cb</span>, <span class="number">0x3becb6cb</span>, <span class="number">0xb2db6cb</span>,
<a href=#319 id=319 data-nosnippet>319</a> <span class="number">0x1b2db6cb</span>, <span class="number">0x2b2db6cb</span>, <span class="number">0x3b2db6cb</span>, <span class="number">0xb6db6cb</span>, <span class="number">0x1b6db6cb</span>, <span class="number">0x2b6db6cb</span>, <span class="number">0x3b6db6cb</span>, <span class="number">0xbadb6cb</span>,
<a href=#320 id=320 data-nosnippet>320</a> <span class="number">0x1badb6cb</span>, <span class="number">0x2badb6cb</span>, <span class="number">0x3badb6cb</span>, <span class="number">0xbedb6cb</span>, <span class="number">0x1bedb6cb</span>, <span class="number">0x2bedb6cb</span>, <span class="number">0x3bedb6cb</span>, <span class="number">0xb2eb6cb</span>,
<a href=#321 id=321 data-nosnippet>321</a> <span class="number">0x1b2eb6cb</span>, <span class="number">0x2b2eb6cb</span>, <span class="number">0x3b2eb6cb</span>, <span class="number">0xb6eb6cb</span>, <span class="number">0x1b6eb6cb</span>, <span class="number">0x2b6eb6cb</span>, <span class="number">0x3b6eb6cb</span>, <span class="number">0xbaeb6cb</span>,
<a href=#322 id=322 data-nosnippet>322</a> <span class="number">0x1baeb6cb</span>, <span class="number">0x2baeb6cb</span>, <span class="number">0x3baeb6cb</span>, <span class="number">0xbeeb6cb</span>, <span class="number">0x1beeb6cb</span>, <span class="number">0x2beeb6cb</span>, <span class="number">0x3beeb6cb</span>, <span class="number">0xb2fb6cb</span>,
<a href=#323 id=323 data-nosnippet>323</a> <span class="number">0x1b2fb6cb</span>, <span class="number">0x2b2fb6cb</span>, <span class="number">0x3b2fb6cb</span>, <span class="number">0xb6fb6cb</span>, <span class="number">0x1b6fb6cb</span>, <span class="number">0x2b6fb6cb</span>, <span class="number">0x3b6fb6cb</span>, <span class="number">0xbafb6cb</span>,
<a href=#324 id=324 data-nosnippet>324</a> <span class="number">0x1bafb6cb</span>, <span class="number">0x2bafb6cb</span>, <span class="number">0x3bafb6cb</span>, <span class="number">0xbefb6cb</span>, <span class="number">0x1befb6cb</span>, <span class="number">0x2befb6cb</span>, <span class="number">0x3befb6cb</span>, <span class="number">0xb2cbacb</span>,
<a href=#325 id=325 data-nosnippet>325</a> <span class="number">0x1b2cbacb</span>, <span class="number">0x2b2cbacb</span>, <span class="number">0x3b2cbacb</span>, <span class="number">0xb6cbacb</span>, <span class="number">0x1b6cbacb</span>, <span class="number">0x2b6cbacb</span>, <span class="number">0x3b6cbacb</span>, <span class="number">0xbacbacb</span>,
<a href=#326 id=326 data-nosnippet>326</a> <span class="number">0x1bacbacb</span>, <span class="number">0x2bacbacb</span>, <span class="number">0x3bacbacb</span>, <span class="number">0xbecbacb</span>, <span class="number">0x1becbacb</span>, <span class="number">0x2becbacb</span>, <span class="number">0x3becbacb</span>, <span class="number">0xb2dbacb</span>,
<a href=#327 id=327 data-nosnippet>327</a> <span class="number">0x1b2dbacb</span>, <span class="number">0x2b2dbacb</span>, <span class="number">0x3b2dbacb</span>, <span class="number">0xb6dbacb</span>, <span class="number">0x1b6dbacb</span>, <span class="number">0x2b6dbacb</span>, <span class="number">0x3b6dbacb</span>, <span class="number">0xbadbacb</span>,
<a href=#328 id=328 data-nosnippet>328</a> <span class="number">0x1badbacb</span>, <span class="number">0x2badbacb</span>, <span class="number">0x3badbacb</span>, <span class="number">0xbedbacb</span>, <span class="number">0x1bedbacb</span>, <span class="number">0x2bedbacb</span>, <span class="number">0x3bedbacb</span>, <span class="number">0xb2ebacb</span>,
<a href=#329 id=329 data-nosnippet>329</a> <span class="number">0x1b2ebacb</span>, <span class="number">0x2b2ebacb</span>, <span class="number">0x3b2ebacb</span>, <span class="number">0xb6ebacb</span>, <span class="number">0x1b6ebacb</span>, <span class="number">0x2b6ebacb</span>, <span class="number">0x3b6ebacb</span>, <span class="number">0xbaebacb</span>,
<a href=#330 id=330 data-nosnippet>330</a> <span class="number">0x1baebacb</span>, <span class="number">0x2baebacb</span>, <span class="number">0x3baebacb</span>, <span class="number">0xbeebacb</span>, <span class="number">0x1beebacb</span>, <span class="number">0x2beebacb</span>, <span class="number">0x3beebacb</span>, <span class="number">0xb2fbacb</span>,
<a href=#331 id=331 data-nosnippet>331</a> <span class="number">0x1b2fbacb</span>, <span class="number">0x2b2fbacb</span>, <span class="number">0x3b2fbacb</span>, <span class="number">0xb6fbacb</span>, <span class="number">0x1b6fbacb</span>, <span class="number">0x2b6fbacb</span>, <span class="number">0x3b6fbacb</span>, <span class="number">0xbafbacb</span>,
<a href=#332 id=332 data-nosnippet>332</a> <span class="number">0x1bafbacb</span>, <span class="number">0x2bafbacb</span>, <span class="number">0x3bafbacb</span>, <span class="number">0xbefbacb</span>, <span class="number">0x1befbacb</span>, <span class="number">0x2befbacb</span>, <span class="number">0x3befbacb</span>, <span class="number">0xb2cbecb</span>,
<a href=#333 id=333 data-nosnippet>333</a> <span class="number">0x1b2cbecb</span>, <span class="number">0x2b2cbecb</span>, <span class="number">0x3b2cbecb</span>, <span class="number">0xb6cbecb</span>, <span class="number">0x1b6cbecb</span>, <span class="number">0x2b6cbecb</span>, <span class="number">0x3b6cbecb</span>, <span class="number">0xbacbecb</span>,
<a href=#334 id=334 data-nosnippet>334</a> <span class="number">0x1bacbecb</span>, <span class="number">0x2bacbecb</span>, <span class="number">0x3bacbecb</span>, <span class="number">0xbecbecb</span>, <span class="number">0x1becbecb</span>, <span class="number">0x2becbecb</span>, <span class="number">0x3becbecb</span>, <span class="number">0xb2dbecb</span>,
<a href=#335 id=335 data-nosnippet>335</a> <span class="number">0x1b2dbecb</span>, <span class="number">0x2b2dbecb</span>, <span class="number">0x3b2dbecb</span>, <span class="number">0xb6dbecb</span>, <span class="number">0x1b6dbecb</span>, <span class="number">0x2b6dbecb</span>, <span class="number">0x3b6dbecb</span>, <span class="number">0xbadbecb</span>,
<a href=#336 id=336 data-nosnippet>336</a> <span class="number">0x1badbecb</span>, <span class="number">0x2badbecb</span>, <span class="number">0x3badbecb</span>, <span class="number">0xbedbecb</span>, <span class="number">0x1bedbecb</span>, <span class="number">0x2bedbecb</span>, <span class="number">0x3bedbecb</span>, <span class="number">0xb2ebecb</span>,
<a href=#337 id=337 data-nosnippet>337</a> <span class="number">0x1b2ebecb</span>, <span class="number">0x2b2ebecb</span>, <span class="number">0x3b2ebecb</span>, <span class="number">0xb6ebecb</span>, <span class="number">0x1b6ebecb</span>, <span class="number">0x2b6ebecb</span>, <span class="number">0x3b6ebecb</span>, <span class="number">0xbaebecb</span>,
<a href=#338 id=338 data-nosnippet>338</a> <span class="number">0x1baebecb</span>, <span class="number">0x2baebecb</span>, <span class="number">0x3baebecb</span>, <span class="number">0xbeebecb</span>, <span class="number">0x1beebecb</span>, <span class="number">0x2beebecb</span>, <span class="number">0x3beebecb</span>, <span class="number">0xb2fbecb</span>,
<a href=#339 id=339 data-nosnippet>339</a> <span class="number">0x1b2fbecb</span>, <span class="number">0x2b2fbecb</span>, <span class="number">0x3b2fbecb</span>, <span class="number">0xb6fbecb</span>, <span class="number">0x1b6fbecb</span>, <span class="number">0x2b6fbecb</span>, <span class="number">0x3b6fbecb</span>, <span class="number">0xbafbecb</span>,
<a href=#340 id=340 data-nosnippet>340</a> <span class="number">0x1bafbecb</span>, <span class="number">0x2bafbecb</span>, <span class="number">0x3bafbecb</span>, <span class="number">0xbefbecb</span>, <span class="number">0x1befbecb</span>, <span class="number">0x2befbecb</span>, <span class="number">0x3befbecb</span>, <span class="number">0xb2cb2db</span>,
<a href=#341 id=341 data-nosnippet>341</a> <span class="number">0x1b2cb2db</span>, <span class="number">0x2b2cb2db</span>, <span class="number">0x3b2cb2db</span>, <span class="number">0xb6cb2db</span>, <span class="number">0x1b6cb2db</span>, <span class="number">0x2b6cb2db</span>, <span class="number">0x3b6cb2db</span>, <span class="number">0xbacb2db</span>,
<a href=#342 id=342 data-nosnippet>342</a> <span class="number">0x1bacb2db</span>, <span class="number">0x2bacb2db</span>, <span class="number">0x3bacb2db</span>, <span class="number">0xbecb2db</span>, <span class="number">0x1becb2db</span>, <span class="number">0x2becb2db</span>, <span class="number">0x3becb2db</span>, <span class="number">0xb2db2db</span>,
<a href=#343 id=343 data-nosnippet>343</a> <span class="number">0x1b2db2db</span>, <span class="number">0x2b2db2db</span>, <span class="number">0x3b2db2db</span>, <span class="number">0xb6db2db</span>, <span class="number">0x1b6db2db</span>, <span class="number">0x2b6db2db</span>, <span class="number">0x3b6db2db</span>, <span class="number">0xbadb2db</span>,
<a href=#344 id=344 data-nosnippet>344</a> <span class="number">0x1badb2db</span>, <span class="number">0x2badb2db</span>, <span class="number">0x3badb2db</span>, <span class="number">0xbedb2db</span>, <span class="number">0x1bedb2db</span>, <span class="number">0x2bedb2db</span>, <span class="number">0x3bedb2db</span>, <span class="number">0xb2eb2db</span>,
<a href=#345 id=345 data-nosnippet>345</a> <span class="number">0x1b2eb2db</span>, <span class="number">0x2b2eb2db</span>, <span class="number">0x3b2eb2db</span>, <span class="number">0xb6eb2db</span>, <span class="number">0x1b6eb2db</span>, <span class="number">0x2b6eb2db</span>, <span class="number">0x3b6eb2db</span>, <span class="number">0xbaeb2db</span>,
<a href=#346 id=346 data-nosnippet>346</a> <span class="number">0x1baeb2db</span>, <span class="number">0x2baeb2db</span>, <span class="number">0x3baeb2db</span>, <span class="number">0xbeeb2db</span>, <span class="number">0x1beeb2db</span>, <span class="number">0x2beeb2db</span>, <span class="number">0x3beeb2db</span>, <span class="number">0xb2fb2db</span>,
<a href=#347 id=347 data-nosnippet>347</a> <span class="number">0x1b2fb2db</span>, <span class="number">0x2b2fb2db</span>, <span class="number">0x3b2fb2db</span>, <span class="number">0xb6fb2db</span>, <span class="number">0x1b6fb2db</span>, <span class="number">0x2b6fb2db</span>, <span class="number">0x3b6fb2db</span>, <span class="number">0xbafb2db</span>,
<a href=#348 id=348 data-nosnippet>348</a> <span class="number">0x1bafb2db</span>, <span class="number">0x2bafb2db</span>, <span class="number">0x3bafb2db</span>, <span class="number">0xbefb2db</span>, <span class="number">0x1befb2db</span>, <span class="number">0x2befb2db</span>, <span class="number">0x3befb2db</span>, <span class="number">0xb2cb6db</span>,
<a href=#349 id=349 data-nosnippet>349</a> <span class="number">0x1b2cb6db</span>, <span class="number">0x2b2cb6db</span>, <span class="number">0x3b2cb6db</span>, <span class="number">0xb6cb6db</span>, <span class="number">0x1b6cb6db</span>, <span class="number">0x2b6cb6db</span>, <span class="number">0x3b6cb6db</span>, <span class="number">0xbacb6db</span>,
<a href=#350 id=350 data-nosnippet>350</a> <span class="number">0x1bacb6db</span>, <span class="number">0x2bacb6db</span>, <span class="number">0x3bacb6db</span>, <span class="number">0xbecb6db</span>, <span class="number">0x1becb6db</span>, <span class="number">0x2becb6db</span>, <span class="number">0x3becb6db</span>, <span class="number">0xb2db6db</span>,
<a href=#351 id=351 data-nosnippet>351</a> <span class="number">0x1b2db6db</span>, <span class="number">0x2b2db6db</span>, <span class="number">0x3b2db6db</span>, <span class="number">0xb6db6db</span>, <span class="number">0x1b6db6db</span>, <span class="number">0x2b6db6db</span>, <span class="number">0x3b6db6db</span>, <span class="number">0xbadb6db</span>,
<a href=#352 id=352 data-nosnippet>352</a> <span class="number">0x1badb6db</span>, <span class="number">0x2badb6db</span>, <span class="number">0x3badb6db</span>, <span class="number">0xbedb6db</span>, <span class="number">0x1bedb6db</span>, <span class="number">0x2bedb6db</span>, <span class="number">0x3bedb6db</span>, <span class="number">0xb2eb6db</span>,
<a href=#353 id=353 data-nosnippet>353</a> <span class="number">0x1b2eb6db</span>, <span class="number">0x2b2eb6db</span>, <span class="number">0x3b2eb6db</span>, <span class="number">0xb6eb6db</span>, <span class="number">0x1b6eb6db</span>, <span class="number">0x2b6eb6db</span>, <span class="number">0x3b6eb6db</span>, <span class="number">0xbaeb6db</span>,
<a href=#354 id=354 data-nosnippet>354</a> <span class="number">0x1baeb6db</span>, <span class="number">0x2baeb6db</span>, <span class="number">0x3baeb6db</span>,
<a href=#355 id=355 data-nosnippet>355</a>];
<a href=#356 id=356 data-nosnippet>356</a>
<a href=#357 id=357 data-nosnippet>357</a><span class="kw">pub static </span>kNonZeroRepsDepth: [u32; <span class="number">704</span>] = [
<a href=#358 id=358 data-nosnippet>358</a> <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">6</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">12</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>,
<a href=#359 id=359 data-nosnippet>359</a> <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>,
<a href=#360 id=360 data-nosnippet>360</a> <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>,
<a href=#361 id=361 data-nosnippet>361</a> <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#362 id=362 data-nosnippet>362</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#363 id=363 data-nosnippet>363</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#364 id=364 data-nosnippet>364</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#365 id=365 data-nosnippet>365</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#366 id=366 data-nosnippet>366</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#367 id=367 data-nosnippet>367</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#368 id=368 data-nosnippet>368</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#369 id=369 data-nosnippet>369</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#370 id=370 data-nosnippet>370</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#371 id=371 data-nosnippet>371</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>,
<a href=#372 id=372 data-nosnippet>372</a> <span class="number">24</span>, <span class="number">24</span>, <span class="number">24</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#373 id=373 data-nosnippet>373</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#374 id=374 data-nosnippet>374</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#375 id=375 data-nosnippet>375</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#376 id=376 data-nosnippet>376</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#377 id=377 data-nosnippet>377</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#378 id=378 data-nosnippet>378</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#379 id=379 data-nosnippet>379</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#380 id=380 data-nosnippet>380</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#381 id=381 data-nosnippet>381</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#382 id=382 data-nosnippet>382</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#383 id=383 data-nosnippet>383</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#384 id=384 data-nosnippet>384</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#385 id=385 data-nosnippet>385</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#386 id=386 data-nosnippet>386</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#387 id=387 data-nosnippet>387</a> <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>, <span class="number">30</span>,
<a href=#388 id=388 data-nosnippet>388</a>];
<a href=#389 id=389 data-nosnippet>389</a>
<a href=#390 id=390 data-nosnippet>390</a><span class="kw">pub static </span>kStaticCommandCodeDepth: [u8; <span class="number">704</span>] = [
<a href=#391 id=391 data-nosnippet>391</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#392 id=392 data-nosnippet>392</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#393 id=393 data-nosnippet>393</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#394 id=394 data-nosnippet>394</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#395 id=395 data-nosnippet>395</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#396 id=396 data-nosnippet>396</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#397 id=397 data-nosnippet>397</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#398 id=398 data-nosnippet>398</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#399 id=399 data-nosnippet>399</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#400 id=400 data-nosnippet>400</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#401 id=401 data-nosnippet>401</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#402 id=402 data-nosnippet>402</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#403 id=403 data-nosnippet>403</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#404 id=404 data-nosnippet>404</a> <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>, <span class="number">9</span>,
<a href=#405 id=405 data-nosnippet>405</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#406 id=406 data-nosnippet>406</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#407 id=407 data-nosnippet>407</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#408 id=408 data-nosnippet>408</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#409 id=409 data-nosnippet>409</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#410 id=410 data-nosnippet>410</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#411 id=411 data-nosnippet>411</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#412 id=412 data-nosnippet>412</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#413 id=413 data-nosnippet>413</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#414 id=414 data-nosnippet>414</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#415 id=415 data-nosnippet>415</a> <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>, <span class="number">11</span>,
<a href=#416 id=416 data-nosnippet>416</a>];
<a href=#417 id=417 data-nosnippet>417</a>
<a href=#418 id=418 data-nosnippet>418</a><span class="kw">pub static </span>kStaticDistanceCodeBits: [u16; <span class="number">64</span>] = [
<a href=#419 id=419 data-nosnippet>419</a> <span class="number">0</span>, <span class="number">32</span>, <span class="number">16</span>, <span class="number">48</span>, <span class="number">8</span>, <span class="number">40</span>, <span class="number">24</span>, <span class="number">56</span>, <span class="number">4</span>, <span class="number">36</span>, <span class="number">20</span>, <span class="number">52</span>, <span class="number">12</span>, <span class="number">44</span>, <span class="number">28</span>, <span class="number">60</span>, <span class="number">2</span>, <span class="number">34</span>, <span class="number">18</span>, <span class="number">50</span>, <span class="number">10</span>, <span class="number">42</span>, <span class="number">26</span>, <span class="number">58</span>, <span class="number">6</span>,
<a href=#420 id=420 data-nosnippet>420</a> <span class="number">38</span>, <span class="number">22</span>, <span class="number">54</span>, <span class="number">14</span>, <span class="number">46</span>, <span class="number">30</span>, <span class="number">62</span>, <span class="number">1</span>, <span class="number">33</span>, <span class="number">17</span>, <span class="number">49</span>, <span class="number">9</span>, <span class="number">41</span>, <span class="number">25</span>, <span class="number">57</span>, <span class="number">5</span>, <span class="number">37</span>, <span class="number">21</span>, <span class="number">53</span>, <span class="number">13</span>, <span class="number">45</span>, <span class="number">29</span>, <span class="number">61</span>, <span class="number">3</span>, <span class="number">35</span>,
<a href=#421 id=421 data-nosnippet>421</a> <span class="number">19</span>, <span class="number">51</span>, <span class="number">11</span>, <span class="number">43</span>, <span class="number">27</span>, <span class="number">59</span>, <span class="number">7</span>, <span class="number">39</span>, <span class="number">23</span>, <span class="number">55</span>, <span class="number">15</span>, <span class="number">47</span>, <span class="number">31</span>, <span class="number">63</span>,
<a href=#422 id=422 data-nosnippet>422</a>];
<a href=#423 id=423 data-nosnippet>423</a><span class="kw">pub static </span>kStaticCommandCodeBits: [u16; <span class="number">704</span>] = [
<a href=#424 id=424 data-nosnippet>424</a> <span class="number">0</span>, <span class="number">256</span>, <span class="number">128</span>, <span class="number">384</span>, <span class="number">64</span>, <span class="number">320</span>, <span class="number">192</span>, <span class="number">448</span>, <span class="number">32</span>, <span class="number">288</span>, <span class="number">160</span>, <span class="number">416</span>, <span class="number">96</span>, <span class="number">352</span>, <span class="number">224</span>, <span class="number">480</span>, <span class="number">16</span>, <span class="number">272</span>, <span class="number">144</span>, <span class="number">400</span>,
<a href=#425 id=425 data-nosnippet>425</a> <span class="number">80</span>, <span class="number">336</span>, <span class="number">208</span>, <span class="number">464</span>, <span class="number">48</span>, <span class="number">304</span>, <span class="number">176</span>, <span class="number">432</span>, <span class="number">112</span>, <span class="number">368</span>, <span class="number">240</span>, <span class="number">496</span>, <span class="number">8</span>, <span class="number">264</span>, <span class="number">136</span>, <span class="number">392</span>, <span class="number">72</span>, <span class="number">328</span>, <span class="number">200</span>, <span class="number">456</span>,
<a href=#426 id=426 data-nosnippet>426</a> <span class="number">40</span>, <span class="number">296</span>, <span class="number">168</span>, <span class="number">424</span>, <span class="number">104</span>, <span class="number">360</span>, <span class="number">232</span>, <span class="number">488</span>, <span class="number">24</span>, <span class="number">280</span>, <span class="number">152</span>, <span class="number">408</span>, <span class="number">88</span>, <span class="number">344</span>, <span class="number">216</span>, <span class="number">472</span>, <span class="number">56</span>, <span class="number">312</span>, <span class="number">184</span>, <span class="number">440</span>,
<a href=#427 id=427 data-nosnippet>427</a> <span class="number">120</span>, <span class="number">376</span>, <span class="number">248</span>, <span class="number">504</span>, <span class="number">4</span>, <span class="number">260</span>, <span class="number">132</span>, <span class="number">388</span>, <span class="number">68</span>, <span class="number">324</span>, <span class="number">196</span>, <span class="number">452</span>, <span class="number">36</span>, <span class="number">292</span>, <span class="number">164</span>, <span class="number">420</span>, <span class="number">100</span>, <span class="number">356</span>, <span class="number">228</span>, <span class="number">484</span>,
<a href=#428 id=428 data-nosnippet>428</a> <span class="number">20</span>, <span class="number">276</span>, <span class="number">148</span>, <span class="number">404</span>, <span class="number">84</span>, <span class="number">340</span>, <span class="number">212</span>, <span class="number">468</span>, <span class="number">52</span>, <span class="number">308</span>, <span class="number">180</span>, <span class="number">436</span>, <span class="number">116</span>, <span class="number">372</span>, <span class="number">244</span>, <span class="number">500</span>, <span class="number">12</span>, <span class="number">268</span>, <span class="number">140</span>, <span class="number">396</span>,
<a href=#429 id=429 data-nosnippet>429</a> <span class="number">76</span>, <span class="number">332</span>, <span class="number">204</span>, <span class="number">460</span>, <span class="number">44</span>, <span class="number">300</span>, <span class="number">172</span>, <span class="number">428</span>, <span class="number">108</span>, <span class="number">364</span>, <span class="number">236</span>, <span class="number">492</span>, <span class="number">28</span>, <span class="number">284</span>, <span class="number">156</span>, <span class="number">412</span>, <span class="number">92</span>, <span class="number">348</span>, <span class="number">220</span>, <span class="number">476</span>,
<a href=#430 id=430 data-nosnippet>430</a> <span class="number">60</span>, <span class="number">316</span>, <span class="number">188</span>, <span class="number">444</span>, <span class="number">124</span>, <span class="number">380</span>, <span class="number">252</span>, <span class="number">508</span>, <span class="number">2</span>, <span class="number">258</span>, <span class="number">130</span>, <span class="number">386</span>, <span class="number">66</span>, <span class="number">322</span>, <span class="number">194</span>, <span class="number">450</span>, <span class="number">34</span>, <span class="number">290</span>, <span class="number">162</span>, <span class="number">418</span>,
<a href=#431 id=431 data-nosnippet>431</a> <span class="number">98</span>, <span class="number">354</span>, <span class="number">226</span>, <span class="number">482</span>, <span class="number">18</span>, <span class="number">274</span>, <span class="number">146</span>, <span class="number">402</span>, <span class="number">82</span>, <span class="number">338</span>, <span class="number">210</span>, <span class="number">466</span>, <span class="number">50</span>, <span class="number">306</span>, <span class="number">178</span>, <span class="number">434</span>, <span class="number">114</span>, <span class="number">370</span>, <span class="number">242</span>, <span class="number">498</span>,
<a href=#432 id=432 data-nosnippet>432</a> <span class="number">10</span>, <span class="number">266</span>, <span class="number">138</span>, <span class="number">394</span>, <span class="number">74</span>, <span class="number">330</span>, <span class="number">202</span>, <span class="number">458</span>, <span class="number">42</span>, <span class="number">298</span>, <span class="number">170</span>, <span class="number">426</span>, <span class="number">106</span>, <span class="number">362</span>, <span class="number">234</span>, <span class="number">490</span>, <span class="number">26</span>, <span class="number">282</span>, <span class="number">154</span>, <span class="number">410</span>,
<a href=#433 id=433 data-nosnippet>433</a> <span class="number">90</span>, <span class="number">346</span>, <span class="number">218</span>, <span class="number">474</span>, <span class="number">58</span>, <span class="number">314</span>, <span class="number">186</span>, <span class="number">442</span>, <span class="number">122</span>, <span class="number">378</span>, <span class="number">250</span>, <span class="number">506</span>, <span class="number">6</span>, <span class="number">262</span>, <span class="number">134</span>, <span class="number">390</span>, <span class="number">70</span>, <span class="number">326</span>, <span class="number">198</span>, <span class="number">454</span>,
<a href=#434 id=434 data-nosnippet>434</a> <span class="number">38</span>, <span class="number">294</span>, <span class="number">166</span>, <span class="number">422</span>, <span class="number">102</span>, <span class="number">358</span>, <span class="number">230</span>, <span class="number">486</span>, <span class="number">22</span>, <span class="number">278</span>, <span class="number">150</span>, <span class="number">406</span>, <span class="number">86</span>, <span class="number">342</span>, <span class="number">214</span>, <span class="number">470</span>, <span class="number">54</span>, <span class="number">310</span>, <span class="number">182</span>, <span class="number">438</span>,
<a href=#435 id=435 data-nosnippet>435</a> <span class="number">118</span>, <span class="number">374</span>, <span class="number">246</span>, <span class="number">502</span>, <span class="number">14</span>, <span class="number">270</span>, <span class="number">142</span>, <span class="number">398</span>, <span class="number">78</span>, <span class="number">334</span>, <span class="number">206</span>, <span class="number">462</span>, <span class="number">46</span>, <span class="number">302</span>, <span class="number">174</span>, <span class="number">430</span>, <span class="number">110</span>, <span class="number">366</span>, <span class="number">238</span>,
<a href=#436 id=436 data-nosnippet>436</a> <span class="number">494</span>, <span class="number">30</span>, <span class="number">286</span>, <span class="number">158</span>, <span class="number">414</span>, <span class="number">94</span>, <span class="number">350</span>, <span class="number">222</span>, <span class="number">478</span>, <span class="number">62</span>, <span class="number">318</span>, <span class="number">190</span>, <span class="number">446</span>, <span class="number">126</span>, <span class="number">382</span>, <span class="number">254</span>, <span class="number">510</span>, <span class="number">1</span>, <span class="number">257</span>, <span class="number">129</span>,
<a href=#437 id=437 data-nosnippet>437</a> <span class="number">385</span>, <span class="number">65</span>, <span class="number">321</span>, <span class="number">193</span>, <span class="number">449</span>, <span class="number">33</span>, <span class="number">289</span>, <span class="number">161</span>, <span class="number">417</span>, <span class="number">97</span>, <span class="number">353</span>, <span class="number">225</span>, <span class="number">481</span>, <span class="number">17</span>, <span class="number">273</span>, <span class="number">145</span>, <span class="number">401</span>, <span class="number">81</span>, <span class="number">337</span>, <span class="number">209</span>,
<a href=#438 id=438 data-nosnippet>438</a> <span class="number">465</span>, <span class="number">49</span>, <span class="number">305</span>, <span class="number">177</span>, <span class="number">433</span>, <span class="number">113</span>, <span class="number">369</span>, <span class="number">241</span>, <span class="number">497</span>, <span class="number">9</span>, <span class="number">265</span>, <span class="number">137</span>, <span class="number">393</span>, <span class="number">73</span>, <span class="number">329</span>, <span class="number">201</span>, <span class="number">457</span>, <span class="number">41</span>, <span class="number">297</span>, <span class="number">169</span>,
<a href=#439 id=439 data-nosnippet>439</a> <span class="number">425</span>, <span class="number">105</span>, <span class="number">361</span>, <span class="number">233</span>, <span class="number">489</span>, <span class="number">25</span>, <span class="number">281</span>, <span class="number">153</span>, <span class="number">409</span>, <span class="number">89</span>, <span class="number">345</span>, <span class="number">217</span>, <span class="number">473</span>, <span class="number">57</span>, <span class="number">313</span>, <span class="number">185</span>, <span class="number">441</span>, <span class="number">121</span>, <span class="number">377</span>,
<a href=#440 id=440 data-nosnippet>440</a> <span class="number">249</span>, <span class="number">505</span>, <span class="number">5</span>, <span class="number">261</span>, <span class="number">133</span>, <span class="number">389</span>, <span class="number">69</span>, <span class="number">325</span>, <span class="number">197</span>, <span class="number">453</span>, <span class="number">37</span>, <span class="number">293</span>, <span class="number">165</span>, <span class="number">421</span>, <span class="number">101</span>, <span class="number">357</span>, <span class="number">229</span>, <span class="number">485</span>, <span class="number">21</span>, <span class="number">277</span>,
<a href=#441 id=441 data-nosnippet>441</a> <span class="number">149</span>, <span class="number">405</span>, <span class="number">85</span>, <span class="number">341</span>, <span class="number">213</span>, <span class="number">469</span>, <span class="number">53</span>, <span class="number">309</span>, <span class="number">181</span>, <span class="number">437</span>, <span class="number">117</span>, <span class="number">373</span>, <span class="number">245</span>, <span class="number">501</span>, <span class="number">13</span>, <span class="number">269</span>, <span class="number">141</span>, <span class="number">397</span>, <span class="number">77</span>, <span class="number">333</span>,
<a href=#442 id=442 data-nosnippet>442</a> <span class="number">205</span>, <span class="number">461</span>, <span class="number">45</span>, <span class="number">301</span>, <span class="number">173</span>, <span class="number">429</span>, <span class="number">109</span>, <span class="number">365</span>, <span class="number">237</span>, <span class="number">493</span>, <span class="number">29</span>, <span class="number">285</span>, <span class="number">157</span>, <span class="number">413</span>, <span class="number">93</span>, <span class="number">349</span>, <span class="number">221</span>, <span class="number">477</span>, <span class="number">61</span>, <span class="number">317</span>,
<a href=#443 id=443 data-nosnippet>443</a> <span class="number">189</span>, <span class="number">445</span>, <span class="number">125</span>, <span class="number">381</span>, <span class="number">253</span>, <span class="number">509</span>, <span class="number">3</span>, <span class="number">259</span>, <span class="number">131</span>, <span class="number">387</span>, <span class="number">67</span>, <span class="number">323</span>, <span class="number">195</span>, <span class="number">451</span>, <span class="number">35</span>, <span class="number">291</span>, <span class="number">163</span>, <span class="number">419</span>, <span class="number">99</span>, <span class="number">355</span>,
<a href=#444 id=444 data-nosnippet>444</a> <span class="number">227</span>, <span class="number">483</span>, <span class="number">19</span>, <span class="number">275</span>, <span class="number">147</span>, <span class="number">403</span>, <span class="number">83</span>, <span class="number">339</span>, <span class="number">211</span>, <span class="number">467</span>, <span class="number">51</span>, <span class="number">307</span>, <span class="number">179</span>, <span class="number">435</span>, <span class="number">115</span>, <span class="number">371</span>, <span class="number">243</span>, <span class="number">499</span>, <span class="number">11</span>, <span class="number">267</span>,
<a href=#445 id=445 data-nosnippet>445</a> <span class="number">139</span>, <span class="number">395</span>, <span class="number">75</span>, <span class="number">331</span>, <span class="number">203</span>, <span class="number">459</span>, <span class="number">43</span>, <span class="number">299</span>, <span class="number">171</span>, <span class="number">427</span>, <span class="number">107</span>, <span class="number">363</span>, <span class="number">235</span>, <span class="number">491</span>, <span class="number">27</span>, <span class="number">283</span>, <span class="number">155</span>, <span class="number">411</span>, <span class="number">91</span>, <span class="number">347</span>,
<a href=#446 id=446 data-nosnippet>446</a> <span class="number">219</span>, <span class="number">475</span>, <span class="number">59</span>, <span class="number">315</span>, <span class="number">187</span>, <span class="number">443</span>, <span class="number">123</span>, <span class="number">379</span>, <span class="number">251</span>, <span class="number">507</span>, <span class="number">7</span>, <span class="number">1031</span>, <span class="number">519</span>, <span class="number">1543</span>, <span class="number">263</span>, <span class="number">1287</span>, <span class="number">775</span>, <span class="number">1799</span>, <span class="number">135</span>,
<a href=#447 id=447 data-nosnippet>447</a> <span class="number">1159</span>, <span class="number">647</span>, <span class="number">1671</span>, <span class="number">391</span>, <span class="number">1415</span>, <span class="number">903</span>, <span class="number">1927</span>, <span class="number">71</span>, <span class="number">1095</span>, <span class="number">583</span>, <span class="number">1607</span>, <span class="number">327</span>, <span class="number">1351</span>, <span class="number">839</span>, <span class="number">1863</span>, <span class="number">199</span>, <span class="number">1223</span>,
<a href=#448 id=448 data-nosnippet>448</a> <span class="number">711</span>, <span class="number">1735</span>, <span class="number">455</span>, <span class="number">1479</span>, <span class="number">967</span>, <span class="number">1991</span>, <span class="number">39</span>, <span class="number">1063</span>, <span class="number">551</span>, <span class="number">1575</span>, <span class="number">295</span>, <span class="number">1319</span>, <span class="number">807</span>, <span class="number">1831</span>, <span class="number">167</span>, <span class="number">1191</span>, <span class="number">679</span>,
<a href=#449 id=449 data-nosnippet>449</a> <span class="number">1703</span>, <span class="number">423</span>, <span class="number">1447</span>, <span class="number">935</span>, <span class="number">1959</span>, <span class="number">103</span>, <span class="number">1127</span>, <span class="number">615</span>, <span class="number">1639</span>, <span class="number">359</span>, <span class="number">1383</span>, <span class="number">871</span>, <span class="number">1895</span>, <span class="number">231</span>, <span class="number">1255</span>, <span class="number">743</span>, <span class="number">1767</span>,
<a href=#450 id=450 data-nosnippet>450</a> <span class="number">487</span>, <span class="number">1511</span>, <span class="number">999</span>, <span class="number">2023</span>, <span class="number">23</span>, <span class="number">1047</span>, <span class="number">535</span>, <span class="number">1559</span>, <span class="number">279</span>, <span class="number">1303</span>, <span class="number">791</span>, <span class="number">1815</span>, <span class="number">151</span>, <span class="number">1175</span>, <span class="number">663</span>, <span class="number">1687</span>, <span class="number">407</span>,
<a href=#451 id=451 data-nosnippet>451</a> <span class="number">1431</span>, <span class="number">919</span>, <span class="number">1943</span>, <span class="number">87</span>, <span class="number">1111</span>, <span class="number">599</span>, <span class="number">1623</span>, <span class="number">343</span>, <span class="number">1367</span>, <span class="number">855</span>, <span class="number">1879</span>, <span class="number">215</span>, <span class="number">1239</span>, <span class="number">727</span>, <span class="number">1751</span>, <span class="number">471</span>, <span class="number">1495</span>,
<a href=#452 id=452 data-nosnippet>452</a> <span class="number">983</span>, <span class="number">2007</span>, <span class="number">55</span>, <span class="number">1079</span>, <span class="number">567</span>, <span class="number">1591</span>, <span class="number">311</span>, <span class="number">1335</span>, <span class="number">823</span>, <span class="number">1847</span>, <span class="number">183</span>, <span class="number">1207</span>, <span class="number">695</span>, <span class="number">1719</span>, <span class="number">439</span>, <span class="number">1463</span>, <span class="number">951</span>,
<a href=#453 id=453 data-nosnippet>453</a> <span class="number">1975</span>, <span class="number">119</span>, <span class="number">1143</span>, <span class="number">631</span>, <span class="number">1655</span>, <span class="number">375</span>, <span class="number">1399</span>, <span class="number">887</span>, <span class="number">1911</span>, <span class="number">247</span>, <span class="number">1271</span>, <span class="number">759</span>, <span class="number">1783</span>, <span class="number">503</span>, <span class="number">1527</span>, <span class="number">1015</span>, <span class="number">2039</span>,
<a href=#454 id=454 data-nosnippet>454</a> <span class="number">15</span>, <span class="number">1039</span>, <span class="number">527</span>, <span class="number">1551</span>, <span class="number">271</span>, <span class="number">1295</span>, <span class="number">783</span>, <span class="number">1807</span>, <span class="number">143</span>, <span class="number">1167</span>, <span class="number">655</span>, <span class="number">1679</span>, <span class="number">399</span>, <span class="number">1423</span>, <span class="number">911</span>, <span class="number">1935</span>, <span class="number">79</span>,
<a href=#455 id=455 data-nosnippet>455</a> <span class="number">1103</span>, <span class="number">591</span>, <span class="number">1615</span>, <span class="number">335</span>, <span class="number">1359</span>, <span class="number">847</span>, <span class="number">1871</span>, <span class="number">207</span>, <span class="number">1231</span>, <span class="number">719</span>, <span class="number">1743</span>, <span class="number">463</span>, <span class="number">1487</span>, <span class="number">975</span>, <span class="number">1999</span>, <span class="number">47</span>, <span class="number">1071</span>,
<a href=#456 id=456 data-nosnippet>456</a> <span class="number">559</span>, <span class="number">1583</span>, <span class="number">303</span>, <span class="number">1327</span>, <span class="number">815</span>, <span class="number">1839</span>, <span class="number">175</span>, <span class="number">1199</span>, <span class="number">687</span>, <span class="number">1711</span>, <span class="number">431</span>, <span class="number">1455</span>, <span class="number">943</span>, <span class="number">1967</span>, <span class="number">111</span>, <span class="number">1135</span>, <span class="number">623</span>,
<a href=#457 id=457 data-nosnippet>457</a> <span class="number">1647</span>, <span class="number">367</span>, <span class="number">1391</span>, <span class="number">879</span>, <span class="number">1903</span>, <span class="number">239</span>, <span class="number">1263</span>, <span class="number">751</span>, <span class="number">1775</span>, <span class="number">495</span>, <span class="number">1519</span>, <span class="number">1007</span>, <span class="number">2031</span>, <span class="number">31</span>, <span class="number">1055</span>, <span class="number">543</span>, <span class="number">1567</span>,
<a href=#458 id=458 data-nosnippet>458</a> <span class="number">287</span>, <span class="number">1311</span>, <span class="number">799</span>, <span class="number">1823</span>, <span class="number">159</span>, <span class="number">1183</span>, <span class="number">671</span>, <span class="number">1695</span>, <span class="number">415</span>, <span class="number">1439</span>, <span class="number">927</span>, <span class="number">1951</span>, <span class="number">95</span>, <span class="number">1119</span>, <span class="number">607</span>, <span class="number">1631</span>, <span class="number">351</span>,
<a href=#459 id=459 data-nosnippet>459</a> <span class="number">1375</span>, <span class="number">863</span>, <span class="number">1887</span>, <span class="number">223</span>, <span class="number">1247</span>, <span class="number">735</span>, <span class="number">1759</span>, <span class="number">479</span>, <span class="number">1503</span>, <span class="number">991</span>, <span class="number">2015</span>, <span class="number">63</span>, <span class="number">1087</span>, <span class="number">575</span>, <span class="number">1599</span>, <span class="number">319</span>, <span class="number">1343</span>,
<a href=#460 id=460 data-nosnippet>460</a> <span class="number">831</span>, <span class="number">1855</span>, <span class="number">191</span>, <span class="number">1215</span>, <span class="number">703</span>, <span class="number">1727</span>, <span class="number">447</span>, <span class="number">1471</span>, <span class="number">959</span>, <span class="number">1983</span>, <span class="number">127</span>, <span class="number">1151</span>, <span class="number">639</span>, <span class="number">1663</span>, <span class="number">383</span>, <span class="number">1407</span>, <span class="number">895</span>,
<a href=#461 id=461 data-nosnippet>461</a> <span class="number">1919</span>, <span class="number">255</span>, <span class="number">1279</span>, <span class="number">767</span>, <span class="number">1791</span>, <span class="number">511</span>, <span class="number">1535</span>, <span class="number">1023</span>, <span class="number">2047</span>,
<a href=#462 id=462 data-nosnippet>462</a>];
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,555 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/context_map_entropy.rs`."><title>context_map_entropy.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>context_map_entropy.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::input_pair::{InputPair, InputReference, InputReferenceMut};
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">pub use </span><span class="kw">super</span>::ir_interpret::{push_base, Context, IRInterpreter};
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::util::{floatX, FastLog2u16};
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::weights::{Weights, BLEND_FIXED_POINT_PRECISION};
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use super</span>::{find_stride, interface};
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::alloc_if;
<a href=#11 id=11 data-nosnippet>11</a>
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">const </span>DEFAULT_CM_SPEED_INDEX: usize = <span class="number">8</span>;
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">const </span>NUM_SPEEDS_TO_TRY: usize = <span class="number">16</span>;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">const </span>SPEEDS_TO_SEARCH: [u16; NUM_SPEEDS_TO_TRY] = [
<a href=#15 id=15 data-nosnippet>15</a> <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">4</span>, <span class="number">8</span>, <span class="number">16</span>, <span class="number">16</span>, <span class="number">32</span>, <span class="number">64</span>, <span class="number">128</span>, <span class="number">128</span>, <span class="number">512</span>, <span class="number">1664</span>, <span class="number">1664</span>,
<a href=#16 id=16 data-nosnippet>16</a>];
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">const </span>MAXES_TO_SEARCH: [u16; NUM_SPEEDS_TO_TRY] = [
<a href=#18 id=18 data-nosnippet>18</a> <span class="number">32</span>, <span class="number">32</span>, <span class="number">128</span>, <span class="number">16384</span>, <span class="number">1024</span>, <span class="number">1024</span>, <span class="number">8192</span>, <span class="number">48</span>, <span class="number">8192</span>, <span class="number">4096</span>, <span class="number">16384</span>, <span class="number">256</span>, <span class="number">16384</span>, <span class="number">16384</span>, <span class="number">16384</span>, <span class="number">16384</span>,
<a href=#19 id=19 data-nosnippet>19</a>];
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">const </span>NIBBLE_PRIOR_SIZE: usize = <span class="number">16 </span>* NUM_SPEEDS_TO_TRY;
<a href=#21 id=21 data-nosnippet>21</a><span class="comment">// the high nibble, followed by the low nibbles
<a href=#22 id=22 data-nosnippet>22</a></span><span class="kw">const </span>CONTEXT_MAP_PRIOR_SIZE: usize = <span class="number">256 </span>* NIBBLE_PRIOR_SIZE * <span class="number">17</span>;
<a href=#23 id=23 data-nosnippet>23</a><span class="kw">const </span>STRIDE_PRIOR_SIZE: usize = <span class="number">256 </span>* <span class="number">256 </span>* NIBBLE_PRIOR_SIZE * <span class="number">2</span>;
<a href=#24 id=24 data-nosnippet>24</a><span class="attr">#[derive(Clone, Copy, Debug)]
<a href=#25 id=25 data-nosnippet>25</a></span><span class="kw">pub struct </span>SpeedAndMax(<span class="kw">pub </span>u16, <span class="kw">pub </span>u16);
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="kw">pub fn </span>speed_to_tuple(inp: [SpeedAndMax; <span class="number">2</span>]) -&gt; [(u16, u16); <span class="number">2</span>] {
<a href=#28 id=28 data-nosnippet>28</a> [(inp[<span class="number">0</span>].<span class="number">0</span>, inp[<span class="number">0</span>].<span class="number">1</span>), (inp[<span class="number">1</span>].<span class="number">0</span>, inp[<span class="number">1</span>].<span class="number">1</span>)]
<a href=#29 id=29 data-nosnippet>29</a>}
<a href=#30 id=30 data-nosnippet>30</a>
<a href=#31 id=31 data-nosnippet>31</a><span class="kw">fn </span>get_stride_cdf_low(
<a href=#32 id=32 data-nosnippet>32</a> data: <span class="kw-2">&amp;mut </span>[u16],
<a href=#33 id=33 data-nosnippet>33</a> stride_prior: u8,
<a href=#34 id=34 data-nosnippet>34</a> cm_prior: usize,
<a href=#35 id=35 data-nosnippet>35</a> high_nibble: u8,
<a href=#36 id=36 data-nosnippet>36</a>) -&gt; <span class="kw-2">&amp;mut </span>[u16] {
<a href=#37 id=37 data-nosnippet>37</a> <span class="kw">let </span>index: usize =
<a href=#38 id=38 data-nosnippet>38</a> <span class="number">1 </span>+ <span class="number">2 </span>* (cm_prior | ((stride_prior <span class="kw">as </span>usize &amp; <span class="number">0xf</span>) &lt;&lt; <span class="number">8</span>) | ((high_nibble <span class="kw">as </span>usize) &lt;&lt; <span class="number">12</span>));
<a href=#39 id=39 data-nosnippet>39</a> data.split_at_mut((NUM_SPEEDS_TO_TRY * index) &lt;&lt; <span class="number">4</span>)
<a href=#40 id=40 data-nosnippet>40</a> .<span class="number">1
<a href=#41 id=41 data-nosnippet>41</a> </span>.split_at_mut(<span class="number">16 </span>* NUM_SPEEDS_TO_TRY)
<a href=#42 id=42 data-nosnippet>42</a> .<span class="number">0
<a href=#43 id=43 data-nosnippet>43</a></span>}
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a><span class="kw">fn </span>get_stride_cdf_high(data: <span class="kw-2">&amp;mut </span>[u16], stride_prior: u8, cm_prior: usize) -&gt; <span class="kw-2">&amp;mut </span>[u16] {
<a href=#46 id=46 data-nosnippet>46</a> <span class="kw">let </span>index: usize = <span class="number">2 </span>* (cm_prior | ((stride_prior <span class="kw">as </span>usize) &lt;&lt; <span class="number">8</span>));
<a href=#47 id=47 data-nosnippet>47</a> data.split_at_mut((NUM_SPEEDS_TO_TRY * index) &lt;&lt; <span class="number">4</span>)
<a href=#48 id=48 data-nosnippet>48</a> .<span class="number">1
<a href=#49 id=49 data-nosnippet>49</a> </span>.split_at_mut(<span class="number">16 </span>* NUM_SPEEDS_TO_TRY)
<a href=#50 id=50 data-nosnippet>50</a> .<span class="number">0
<a href=#51 id=51 data-nosnippet>51</a></span>}
<a href=#52 id=52 data-nosnippet>52</a>
<a href=#53 id=53 data-nosnippet>53</a><span class="kw">fn </span>get_cm_cdf_low(data: <span class="kw-2">&amp;mut </span>[u16], cm_prior: usize, high_nibble: u8) -&gt; <span class="kw-2">&amp;mut </span>[u16] {
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">let </span>index: usize = (high_nibble <span class="kw">as </span>usize + <span class="number">1</span>) + <span class="number">17 </span>* cm_prior;
<a href=#55 id=55 data-nosnippet>55</a> data.split_at_mut((NUM_SPEEDS_TO_TRY * index) &lt;&lt; <span class="number">4</span>)
<a href=#56 id=56 data-nosnippet>56</a> .<span class="number">1
<a href=#57 id=57 data-nosnippet>57</a> </span>.split_at_mut(<span class="number">16 </span>* NUM_SPEEDS_TO_TRY)
<a href=#58 id=58 data-nosnippet>58</a> .<span class="number">0
<a href=#59 id=59 data-nosnippet>59</a></span>}
<a href=#60 id=60 data-nosnippet>60</a>
<a href=#61 id=61 data-nosnippet>61</a><span class="kw">fn </span>get_cm_cdf_high(data: <span class="kw-2">&amp;mut </span>[u16], cm_prior: usize) -&gt; <span class="kw-2">&amp;mut </span>[u16] {
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">let </span>index: usize = <span class="number">17 </span>* cm_prior;
<a href=#63 id=63 data-nosnippet>63</a> data.split_at_mut((NUM_SPEEDS_TO_TRY * index) &lt;&lt; <span class="number">4</span>)
<a href=#64 id=64 data-nosnippet>64</a> .<span class="number">1
<a href=#65 id=65 data-nosnippet>65</a> </span>.split_at_mut(<span class="number">16 </span>* NUM_SPEEDS_TO_TRY)
<a href=#66 id=66 data-nosnippet>66</a> .<span class="number">0
<a href=#67 id=67 data-nosnippet>67</a></span>}
<a href=#68 id=68 data-nosnippet>68</a><span class="kw">fn </span>init_cdfs(cdfs: <span class="kw-2">&amp;mut </span>[u16]) {
<a href=#69 id=69 data-nosnippet>69</a> <span class="macro">assert_eq!</span>(cdfs.len() % (<span class="number">16 </span>* NUM_SPEEDS_TO_TRY), <span class="number">0</span>);
<a href=#70 id=70 data-nosnippet>70</a> <span class="kw">let </span><span class="kw-2">mut </span>total_index = <span class="number">0usize</span>;
<a href=#71 id=71 data-nosnippet>71</a> <span class="kw">let </span>len = cdfs.len();
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">loop </span>{
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">for </span>cdf_index <span class="kw">in </span><span class="number">0</span>..<span class="number">16 </span>{
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">let </span>vec = cdfs
<a href=#75 id=75 data-nosnippet>75</a> .split_at_mut(total_index)
<a href=#76 id=76 data-nosnippet>76</a> .<span class="number">1
<a href=#77 id=77 data-nosnippet>77</a> </span>.split_at_mut(NUM_SPEEDS_TO_TRY)
<a href=#78 id=78 data-nosnippet>78</a> .<span class="number">0</span>;
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw">for </span>item <span class="kw">in </span>vec {
<a href=#80 id=80 data-nosnippet>80</a> <span class="kw-2">*</span>item = <span class="number">4 </span>+ <span class="number">4 </span>* cdf_index <span class="kw">as </span>u16;
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a> total_index += NUM_SPEEDS_TO_TRY;
<a href=#83 id=83 data-nosnippet>83</a> }
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">if </span>total_index == len {
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">break</span>;
<a href=#86 id=86 data-nosnippet>86</a> }
<a href=#87 id=87 data-nosnippet>87</a> }
<a href=#88 id=88 data-nosnippet>88</a>}
<a href=#89 id=89 data-nosnippet>89</a><span class="kw">fn </span>compute_combined_cost(
<a href=#90 id=90 data-nosnippet>90</a> singleton_cost: <span class="kw-2">&amp;mut </span>[floatX; NUM_SPEEDS_TO_TRY],
<a href=#91 id=91 data-nosnippet>91</a> cdfs: <span class="kw-2">&amp;</span>[u16],
<a href=#92 id=92 data-nosnippet>92</a> mixing_cdf: [u16; <span class="number">16</span>],
<a href=#93 id=93 data-nosnippet>93</a> nibble_u8: u8,
<a href=#94 id=94 data-nosnippet>94</a> _weights: <span class="kw-2">&amp;mut </span>[Weights; NUM_SPEEDS_TO_TRY],
<a href=#95 id=95 data-nosnippet>95</a>) {
<a href=#96 id=96 data-nosnippet>96</a> <span class="macro">assert_eq!</span>(cdfs.len(), <span class="number">16 </span>* NUM_SPEEDS_TO_TRY);
<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">let </span>nibble = nibble_u8 <span class="kw">as </span>usize &amp; <span class="number">0xf</span>;
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">let </span><span class="kw-2">mut </span>stride_pdf = [<span class="number">0u16</span>; NUM_SPEEDS_TO_TRY];
<a href=#99 id=99 data-nosnippet>99</a> stride_pdf.clone_from_slice(
<a href=#100 id=100 data-nosnippet>100</a> cdfs.split_at(NUM_SPEEDS_TO_TRY * nibble)
<a href=#101 id=101 data-nosnippet>101</a> .<span class="number">1
<a href=#102 id=102 data-nosnippet>102</a> </span>.split_at(NUM_SPEEDS_TO_TRY)
<a href=#103 id=103 data-nosnippet>103</a> .<span class="number">0</span>,
<a href=#104 id=104 data-nosnippet>104</a> );
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">let </span><span class="kw-2">mut </span>cm_pdf: u16 = mixing_cdf[nibble];
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">if </span><span class="macro">nibble_u8 !</span>= <span class="number">0 </span>{
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp = [<span class="number">0u16</span>; NUM_SPEEDS_TO_TRY];
<a href=#108 id=108 data-nosnippet>108</a> tmp.clone_from_slice(
<a href=#109 id=109 data-nosnippet>109</a> cdfs.split_at(NUM_SPEEDS_TO_TRY * (nibble - <span class="number">1</span>))
<a href=#110 id=110 data-nosnippet>110</a> .<span class="number">1
<a href=#111 id=111 data-nosnippet>111</a> </span>.split_at(NUM_SPEEDS_TO_TRY)
<a href=#112 id=112 data-nosnippet>112</a> .<span class="number">0</span>,
<a href=#113 id=113 data-nosnippet>113</a> );
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#115 id=115 data-nosnippet>115</a> stride_pdf[i] -= tmp[i];
<a href=#116 id=116 data-nosnippet>116</a> }
<a href=#117 id=117 data-nosnippet>117</a> cm_pdf -= mixing_cdf[nibble - <span class="number">1</span>]
<a href=#118 id=118 data-nosnippet>118</a> }
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw">let </span><span class="kw-2">mut </span>stride_max = [<span class="number">0u16</span>; NUM_SPEEDS_TO_TRY];
<a href=#120 id=120 data-nosnippet>120</a> stride_max.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * <span class="number">15</span>).<span class="number">1</span>);
<a href=#121 id=121 data-nosnippet>121</a> <span class="kw">let </span>cm_max = mixing_cdf[<span class="number">15</span>];
<a href=#122 id=122 data-nosnippet>122</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#123 id=123 data-nosnippet>123</a> <span class="kw">if </span>stride_pdf[i] == <span class="number">0 </span>{
<a href=#124 id=124 data-nosnippet>124</a> <span class="macro">assert_ne!</span>(stride_pdf[i], <span class="number">0</span>);
<a href=#125 id=125 data-nosnippet>125</a> }
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw">if </span>stride_max[i] == <span class="number">0 </span>{
<a href=#127 id=127 data-nosnippet>127</a> <span class="macro">assert_ne!</span>(stride_max[i], <span class="number">0</span>);
<a href=#128 id=128 data-nosnippet>128</a> }
<a href=#129 id=129 data-nosnippet>129</a>
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw">let </span>w = (<span class="number">1 </span>&lt;&lt; (BLEND_FIXED_POINT_PRECISION - <span class="number">2</span>)); <span class="comment">// a quarter of weight to stride
<a href=#131 id=131 data-nosnippet>131</a> </span><span class="kw">let </span>combined_pdf = w * u32::from(stride_pdf[i])
<a href=#132 id=132 data-nosnippet>132</a> + ((<span class="number">1 </span>&lt;&lt; BLEND_FIXED_POINT_PRECISION) - w) * u32::from(cm_pdf);
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span>combined_max = w * u32::from(stride_max[i])
<a href=#134 id=134 data-nosnippet>134</a> + ((<span class="number">1 </span>&lt;&lt; BLEND_FIXED_POINT_PRECISION) - w) * u32::from(cm_max);
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw">let </span>del = FastLog2u16((combined_pdf &gt;&gt; BLEND_FIXED_POINT_PRECISION) <span class="kw">as </span>u16)
<a href=#136 id=136 data-nosnippet>136</a> - FastLog2u16((combined_max &gt;&gt; BLEND_FIXED_POINT_PRECISION) <span class="kw">as </span>u16);
<a href=#137 id=137 data-nosnippet>137</a> singleton_cost[i] -= del;
<a href=#138 id=138 data-nosnippet>138</a> }
<a href=#139 id=139 data-nosnippet>139</a>}
<a href=#140 id=140 data-nosnippet>140</a><span class="kw">fn </span>compute_cost(singleton_cost: <span class="kw-2">&amp;mut </span>[floatX; NUM_SPEEDS_TO_TRY], cdfs: <span class="kw-2">&amp;</span>[u16], nibble_u8: u8) {
<a href=#141 id=141 data-nosnippet>141</a> <span class="macro">assert_eq!</span>(cdfs.len(), <span class="number">16 </span>* NUM_SPEEDS_TO_TRY);
<a href=#142 id=142 data-nosnippet>142</a> <span class="kw">let </span>nibble = nibble_u8 <span class="kw">as </span>usize &amp; <span class="number">0xf</span>;
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">let </span><span class="kw-2">mut </span>pdf = [<span class="number">0u16</span>; NUM_SPEEDS_TO_TRY];
<a href=#144 id=144 data-nosnippet>144</a> pdf.clone_from_slice(
<a href=#145 id=145 data-nosnippet>145</a> cdfs.split_at(NUM_SPEEDS_TO_TRY * nibble)
<a href=#146 id=146 data-nosnippet>146</a> .<span class="number">1
<a href=#147 id=147 data-nosnippet>147</a> </span>.split_at(NUM_SPEEDS_TO_TRY)
<a href=#148 id=148 data-nosnippet>148</a> .<span class="number">0</span>,
<a href=#149 id=149 data-nosnippet>149</a> );
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">if </span><span class="macro">nibble_u8 !</span>= <span class="number">0 </span>{
<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp = [<span class="number">0u16</span>; NUM_SPEEDS_TO_TRY];
<a href=#152 id=152 data-nosnippet>152</a> tmp.clone_from_slice(
<a href=#153 id=153 data-nosnippet>153</a> cdfs.split_at(NUM_SPEEDS_TO_TRY * (nibble - <span class="number">1</span>))
<a href=#154 id=154 data-nosnippet>154</a> .<span class="number">1
<a href=#155 id=155 data-nosnippet>155</a> </span>.split_at(NUM_SPEEDS_TO_TRY)
<a href=#156 id=156 data-nosnippet>156</a> .<span class="number">0</span>,
<a href=#157 id=157 data-nosnippet>157</a> );
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#159 id=159 data-nosnippet>159</a> pdf[i] -= tmp[i];
<a href=#160 id=160 data-nosnippet>160</a> }
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">let </span><span class="kw-2">mut </span>max = [<span class="number">0u16</span>; NUM_SPEEDS_TO_TRY];
<a href=#163 id=163 data-nosnippet>163</a> max.clone_from_slice(cdfs.split_at(NUM_SPEEDS_TO_TRY * <span class="number">15</span>).<span class="number">1</span>);
<a href=#164 id=164 data-nosnippet>164</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">if </span>pdf[i] == <span class="number">0 </span>{
<a href=#166 id=166 data-nosnippet>166</a> <span class="macro">assert_ne!</span>(pdf[i], <span class="number">0</span>);
<a href=#167 id=167 data-nosnippet>167</a> }
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">if </span>max[i] == <span class="number">0 </span>{
<a href=#169 id=169 data-nosnippet>169</a> <span class="macro">assert_ne!</span>(max[i], <span class="number">0</span>);
<a href=#170 id=170 data-nosnippet>170</a> }
<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">let </span>del = FastLog2u16(pdf[i]) - FastLog2u16(max[i]);
<a href=#172 id=172 data-nosnippet>172</a> singleton_cost[i] -= del;
<a href=#173 id=173 data-nosnippet>173</a> }
<a href=#174 id=174 data-nosnippet>174</a>}
<a href=#175 id=175 data-nosnippet>175</a><span class="kw">fn </span>update_cdf(cdfs: <span class="kw-2">&amp;mut </span>[u16], nibble_u8: u8) {
<a href=#176 id=176 data-nosnippet>176</a> <span class="macro">assert_eq!</span>(cdfs.len(), <span class="number">16 </span>* NUM_SPEEDS_TO_TRY);
<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">let </span><span class="kw-2">mut </span>overall_index = nibble_u8 <span class="kw">as </span>usize * NUM_SPEEDS_TO_TRY;
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">for </span>_nibble <span class="kw">in </span>(nibble_u8 <span class="kw">as </span>usize &amp; <span class="number">0xf</span>)..<span class="number">16 </span>{
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">for </span>speed_index <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#180 id=180 data-nosnippet>180</a> cdfs[overall_index + speed_index] += SPEEDS_TO_SEARCH[speed_index];
<a href=#181 id=181 data-nosnippet>181</a> }
<a href=#182 id=182 data-nosnippet>182</a> overall_index += NUM_SPEEDS_TO_TRY;
<a href=#183 id=183 data-nosnippet>183</a> }
<a href=#184 id=184 data-nosnippet>184</a> overall_index = <span class="number">0</span>;
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">for </span>nibble <span class="kw">in </span><span class="number">0</span>..<span class="number">16 </span>{
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw">for </span>speed_index <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#187 id=187 data-nosnippet>187</a> <span class="kw">if </span>nibble == <span class="number">0 </span>{
<a href=#188 id=188 data-nosnippet>188</a> <span class="macro">assert_ne!</span>(cdfs[overall_index + speed_index], <span class="number">0</span>);
<a href=#189 id=189 data-nosnippet>189</a> } <span class="kw">else </span>{
<a href=#190 id=190 data-nosnippet>190</a> <span class="macro">assert_ne!</span>(
<a href=#191 id=191 data-nosnippet>191</a> cdfs[overall_index + speed_index]
<a href=#192 id=192 data-nosnippet>192</a> - cdfs[overall_index + speed_index - NUM_SPEEDS_TO_TRY],
<a href=#193 id=193 data-nosnippet>193</a> <span class="number">0
<a href=#194 id=194 data-nosnippet>194</a> </span>);
<a href=#195 id=195 data-nosnippet>195</a> }
<a href=#196 id=196 data-nosnippet>196</a> }
<a href=#197 id=197 data-nosnippet>197</a> overall_index += NUM_SPEEDS_TO_TRY;
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">for </span>max_index <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#200 id=200 data-nosnippet>200</a> <span class="kw">if </span>cdfs[<span class="number">15 </span>* NUM_SPEEDS_TO_TRY + max_index] &gt;= MAXES_TO_SEARCH[max_index] {
<a href=#201 id=201 data-nosnippet>201</a> <span class="kw">const </span>CDF_BIAS: [u16; <span class="number">16</span>] = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>];
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">for </span>nibble_index <span class="kw">in </span><span class="number">0</span>..<span class="number">16 </span>{
<a href=#203 id=203 data-nosnippet>203</a> <span class="kw">let </span>tmp = <span class="kw-2">&amp;mut </span>cdfs[nibble_index * NUM_SPEEDS_TO_TRY + max_index];
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw-2">*</span>tmp = (tmp.wrapping_add(CDF_BIAS[nibble_index]))
<a href=#205 id=205 data-nosnippet>205</a> .wrapping_sub(tmp.wrapping_add(CDF_BIAS[nibble_index]) &gt;&gt; <span class="number">2</span>);
<a href=#206 id=206 data-nosnippet>206</a> }
<a href=#207 id=207 data-nosnippet>207</a> }
<a href=#208 id=208 data-nosnippet>208</a> }
<a href=#209 id=209 data-nosnippet>209</a> overall_index = <span class="number">0</span>;
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">for </span>nibble <span class="kw">in </span><span class="number">0</span>..<span class="number">16 </span>{
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">for </span>speed_index <span class="kw">in </span><span class="number">0</span>..NUM_SPEEDS_TO_TRY {
<a href=#212 id=212 data-nosnippet>212</a> <span class="kw">if </span>nibble == <span class="number">0 </span>{
<a href=#213 id=213 data-nosnippet>213</a> <span class="macro">assert_ne!</span>(cdfs[overall_index + speed_index], <span class="number">0</span>);
<a href=#214 id=214 data-nosnippet>214</a> } <span class="kw">else </span>{
<a href=#215 id=215 data-nosnippet>215</a> <span class="macro">assert_ne!</span>(
<a href=#216 id=216 data-nosnippet>216</a> cdfs[overall_index + speed_index]
<a href=#217 id=217 data-nosnippet>217</a> - cdfs[overall_index + speed_index - NUM_SPEEDS_TO_TRY],
<a href=#218 id=218 data-nosnippet>218</a> <span class="number">0
<a href=#219 id=219 data-nosnippet>219</a> </span>);
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a> }
<a href=#222 id=222 data-nosnippet>222</a> overall_index += NUM_SPEEDS_TO_TRY;
<a href=#223 id=223 data-nosnippet>223</a> }
<a href=#224 id=224 data-nosnippet>224</a>}
<a href=#225 id=225 data-nosnippet>225</a>
<a href=#226 id=226 data-nosnippet>226</a><span class="kw">fn </span>extract_single_cdf(cdf_bundle: <span class="kw-2">&amp;</span>[u16], index: usize) -&gt; [u16; <span class="number">16</span>] {
<a href=#227 id=227 data-nosnippet>227</a> <span class="macro">assert_eq!</span>(cdf_bundle.len(), <span class="number">16 </span>* NUM_SPEEDS_TO_TRY);
<a href=#228 id=228 data-nosnippet>228</a> <span class="macro">assert!</span>(index &lt; NUM_SPEEDS_TO_TRY);
<a href=#229 id=229 data-nosnippet>229</a>
<a href=#230 id=230 data-nosnippet>230</a> <span class="attr">#[allow(clippy::identity_op)]
<a href=#231 id=231 data-nosnippet>231</a> </span>[
<a href=#232 id=232 data-nosnippet>232</a> cdf_bundle[index + <span class="number">0 </span>* NUM_SPEEDS_TO_TRY],
<a href=#233 id=233 data-nosnippet>233</a> cdf_bundle[index + <span class="number">1 </span>* NUM_SPEEDS_TO_TRY],
<a href=#234 id=234 data-nosnippet>234</a> cdf_bundle[index + <span class="number">2 </span>* NUM_SPEEDS_TO_TRY],
<a href=#235 id=235 data-nosnippet>235</a> cdf_bundle[index + <span class="number">3 </span>* NUM_SPEEDS_TO_TRY],
<a href=#236 id=236 data-nosnippet>236</a> cdf_bundle[index + <span class="number">4 </span>* NUM_SPEEDS_TO_TRY],
<a href=#237 id=237 data-nosnippet>237</a> cdf_bundle[index + <span class="number">5 </span>* NUM_SPEEDS_TO_TRY],
<a href=#238 id=238 data-nosnippet>238</a> cdf_bundle[index + <span class="number">6 </span>* NUM_SPEEDS_TO_TRY],
<a href=#239 id=239 data-nosnippet>239</a> cdf_bundle[index + <span class="number">7 </span>* NUM_SPEEDS_TO_TRY],
<a href=#240 id=240 data-nosnippet>240</a> cdf_bundle[index + <span class="number">8 </span>* NUM_SPEEDS_TO_TRY],
<a href=#241 id=241 data-nosnippet>241</a> cdf_bundle[index + <span class="number">9 </span>* NUM_SPEEDS_TO_TRY],
<a href=#242 id=242 data-nosnippet>242</a> cdf_bundle[index + <span class="number">10 </span>* NUM_SPEEDS_TO_TRY],
<a href=#243 id=243 data-nosnippet>243</a> cdf_bundle[index + <span class="number">11 </span>* NUM_SPEEDS_TO_TRY],
<a href=#244 id=244 data-nosnippet>244</a> cdf_bundle[index + <span class="number">12 </span>* NUM_SPEEDS_TO_TRY],
<a href=#245 id=245 data-nosnippet>245</a> cdf_bundle[index + <span class="number">13 </span>* NUM_SPEEDS_TO_TRY],
<a href=#246 id=246 data-nosnippet>246</a> cdf_bundle[index + <span class="number">14 </span>* NUM_SPEEDS_TO_TRY],
<a href=#247 id=247 data-nosnippet>247</a> cdf_bundle[index + <span class="number">15 </span>* NUM_SPEEDS_TO_TRY],
<a href=#248 id=248 data-nosnippet>248</a> ]
<a href=#249 id=249 data-nosnippet>249</a>}
<a href=#250 id=250 data-nosnippet>250</a>
<a href=#251 id=251 data-nosnippet>251</a><span class="kw">fn </span>min_cost_index_for_speed(cost: <span class="kw-2">&amp;</span>[floatX]) -&gt; usize {
<a href=#252 id=252 data-nosnippet>252</a> <span class="macro">assert_eq!</span>(cost.len(), NUM_SPEEDS_TO_TRY);
<a href=#253 id=253 data-nosnippet>253</a> <span class="kw">let </span><span class="kw-2">mut </span>min_cost = cost[<span class="number">0</span>];
<a href=#254 id=254 data-nosnippet>254</a> <span class="kw">let </span><span class="kw-2">mut </span>best_choice = <span class="number">0</span>;
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">1</span>..NUM_SPEEDS_TO_TRY {
<a href=#256 id=256 data-nosnippet>256</a> <span class="kw">if </span>cost[i] &lt; min_cost {
<a href=#257 id=257 data-nosnippet>257</a> best_choice = i;
<a href=#258 id=258 data-nosnippet>258</a> min_cost = cost[i];
<a href=#259 id=259 data-nosnippet>259</a> }
<a href=#260 id=260 data-nosnippet>260</a> }
<a href=#261 id=261 data-nosnippet>261</a> best_choice
<a href=#262 id=262 data-nosnippet>262</a>}
<a href=#263 id=263 data-nosnippet>263</a><span class="kw">fn </span>min_cost_speed_max(cost: <span class="kw-2">&amp;</span>[floatX]) -&gt; SpeedAndMax {
<a href=#264 id=264 data-nosnippet>264</a> <span class="kw">let </span>best_choice = min_cost_index_for_speed(cost);
<a href=#265 id=265 data-nosnippet>265</a> SpeedAndMax(SPEEDS_TO_SEARCH[best_choice], MAXES_TO_SEARCH[best_choice])
<a href=#266 id=266 data-nosnippet>266</a>}
<a href=#267 id=267 data-nosnippet>267</a>
<a href=#268 id=268 data-nosnippet>268</a><span class="kw">fn </span>min_cost_value(cost: <span class="kw-2">&amp;</span>[floatX]) -&gt; floatX {
<a href=#269 id=269 data-nosnippet>269</a> <span class="kw">let </span>best_choice = min_cost_index_for_speed(cost);
<a href=#270 id=270 data-nosnippet>270</a> cost[best_choice]
<a href=#271 id=271 data-nosnippet>271</a>}
<a href=#272 id=272 data-nosnippet>272</a>
<a href=#273 id=273 data-nosnippet>273</a><span class="kw">const </span>SINGLETON_COMBINED_STRATEGY: usize = <span class="number">2</span>;
<a href=#274 id=274 data-nosnippet>274</a><span class="kw">const </span>SINGLETON_STRIDE_STRATEGY: usize = <span class="number">1</span>;
<a href=#275 id=275 data-nosnippet>275</a><span class="kw">const </span>SINGLETON_CM_STRATEGY: usize = <span class="number">0</span>;
<a href=#276 id=276 data-nosnippet>276</a>
<a href=#277 id=277 data-nosnippet>277</a><span class="kw">pub struct </span>ContextMapEntropy&lt;
<a href=#278 id=278 data-nosnippet>278</a> <span class="lifetime">'a</span>,
<a href=#279 id=279 data-nosnippet>279</a> Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;,
<a href=#280 id=280 data-nosnippet>280</a>&gt; {
<a href=#281 id=281 data-nosnippet>281</a> input: InputPair&lt;<span class="lifetime">'a</span>&gt;,
<a href=#282 id=282 data-nosnippet>282</a> context_map: interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#283 id=283 data-nosnippet>283</a> block_type: u8,
<a href=#284 id=284 data-nosnippet>284</a> cur_stride: u8,
<a href=#285 id=285 data-nosnippet>285</a> local_byte_offset: usize,
<a href=#286 id=286 data-nosnippet>286</a> weight: [[Weights; NUM_SPEEDS_TO_TRY]; <span class="number">2</span>],
<a href=#287 id=287 data-nosnippet>287</a>
<a href=#288 id=288 data-nosnippet>288</a> cm_priors: &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory,
<a href=#289 id=289 data-nosnippet>289</a> stride_priors: &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory,
<a href=#290 id=290 data-nosnippet>290</a> _stride_pyramid_leaves: [u8; find_stride::NUM_LEAF_NODES],
<a href=#291 id=291 data-nosnippet>291</a> singleton_costs: [[[floatX; NUM_SPEEDS_TO_TRY]; <span class="number">2</span>]; <span class="number">3</span>],
<a href=#292 id=292 data-nosnippet>292</a>}
<a href=#293 id=293 data-nosnippet>293</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;&gt;
<a href=#294 id=294 data-nosnippet>294</a> ContextMapEntropy&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#295 id=295 data-nosnippet>295</a>{
<a href=#296 id=296 data-nosnippet>296</a> <span class="kw">pub fn </span>new(
<a href=#297 id=297 data-nosnippet>297</a> m16: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#298 id=298 data-nosnippet>298</a> input: InputPair&lt;<span class="lifetime">'a</span>&gt;,
<a href=#299 id=299 data-nosnippet>299</a> stride: [u8; find_stride::NUM_LEAF_NODES],
<a href=#300 id=300 data-nosnippet>300</a> prediction_mode: interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#301 id=301 data-nosnippet>301</a> cdf_detection_quality: u8,
<a href=#302 id=302 data-nosnippet>302</a> ) -&gt; <span class="self">Self </span>{
<a href=#303 id=303 data-nosnippet>303</a> <span class="kw">let </span>cdf_detect = <span class="macro">cdf_detection_quality !</span>= <span class="number">0</span>;
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = ContextMapEntropy::&lt;Alloc&gt; {
<a href=#305 id=305 data-nosnippet>305</a> input,
<a href=#306 id=306 data-nosnippet>306</a> context_map: prediction_mode,
<a href=#307 id=307 data-nosnippet>307</a> block_type: <span class="number">0</span>,
<a href=#308 id=308 data-nosnippet>308</a> cur_stride: <span class="number">1</span>,
<a href=#309 id=309 data-nosnippet>309</a> local_byte_offset: <span class="number">0</span>,
<a href=#310 id=310 data-nosnippet>310</a> cm_priors: alloc_if::&lt;u16, <span class="kw">_</span>&gt;(cdf_detect, m16, CONTEXT_MAP_PRIOR_SIZE),
<a href=#311 id=311 data-nosnippet>311</a> stride_priors: alloc_if::&lt;u16, <span class="kw">_</span>&gt;(cdf_detect, m16, STRIDE_PRIOR_SIZE),
<a href=#312 id=312 data-nosnippet>312</a> _stride_pyramid_leaves: stride,
<a href=#313 id=313 data-nosnippet>313</a> weight: [
<a href=#314 id=314 data-nosnippet>314</a> [Weights::new(); NUM_SPEEDS_TO_TRY],
<a href=#315 id=315 data-nosnippet>315</a> [Weights::new(); NUM_SPEEDS_TO_TRY],
<a href=#316 id=316 data-nosnippet>316</a> ],
<a href=#317 id=317 data-nosnippet>317</a> singleton_costs: [[[<span class="number">0.0</span>; NUM_SPEEDS_TO_TRY]; <span class="number">2</span>]; <span class="number">3</span>],
<a href=#318 id=318 data-nosnippet>318</a> };
<a href=#319 id=319 data-nosnippet>319</a> <span class="kw">if </span>cdf_detect {
<a href=#320 id=320 data-nosnippet>320</a> init_cdfs(ret.cm_priors.slice_mut());
<a href=#321 id=321 data-nosnippet>321</a> init_cdfs(ret.stride_priors.slice_mut());
<a href=#322 id=322 data-nosnippet>322</a> }
<a href=#323 id=323 data-nosnippet>323</a> ret
<a href=#324 id=324 data-nosnippet>324</a> }
<a href=#325 id=325 data-nosnippet>325</a> <span class="kw">pub fn </span>take_prediction_mode(
<a href=#326 id=326 data-nosnippet>326</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#327 id=327 data-nosnippet>327</a> ) -&gt; interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#328 id=328 data-nosnippet>328</a> core::mem::replace(
<a href=#329 id=329 data-nosnippet>329</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.context_map,
<a href=#330 id=330 data-nosnippet>330</a> interface::PredictionModeContextMap::&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#331 id=331 data-nosnippet>331</a> literal_context_map: InputReferenceMut::default(),
<a href=#332 id=332 data-nosnippet>332</a> predmode_speed_and_distance_context_map: InputReferenceMut::default(),
<a href=#333 id=333 data-nosnippet>333</a> },
<a href=#334 id=334 data-nosnippet>334</a> )
<a href=#335 id=335 data-nosnippet>335</a> }
<a href=#336 id=336 data-nosnippet>336</a> <span class="kw">pub fn </span>prediction_mode_mut(
<a href=#337 id=337 data-nosnippet>337</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#338 id=338 data-nosnippet>338</a> ) -&gt; <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#339 id=339 data-nosnippet>339</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.context_map
<a href=#340 id=340 data-nosnippet>340</a> }
<a href=#341 id=341 data-nosnippet>341</a> <span class="kw">pub fn </span>best_singleton_speeds(
<a href=#342 id=342 data-nosnippet>342</a> <span class="kw-2">&amp;</span><span class="self">self</span>,
<a href=#343 id=343 data-nosnippet>343</a> cm: bool,
<a href=#344 id=344 data-nosnippet>344</a> combined: bool,
<a href=#345 id=345 data-nosnippet>345</a> ) -&gt; ([SpeedAndMax; <span class="number">2</span>], [floatX; <span class="number">2</span>]) {
<a href=#346 id=346 data-nosnippet>346</a> <span class="kw">let </span>cost_type_index = <span class="kw">if </span>combined {
<a href=#347 id=347 data-nosnippet>347</a> <span class="number">2usize
<a href=#348 id=348 data-nosnippet>348</a> </span>} <span class="kw">else if </span>cm {
<a href=#349 id=349 data-nosnippet>349</a> <span class="number">0usize
<a href=#350 id=350 data-nosnippet>350</a> </span>} <span class="kw">else </span>{
<a href=#351 id=351 data-nosnippet>351</a> <span class="number">1
<a href=#352 id=352 data-nosnippet>352</a> </span>};
<a href=#353 id=353 data-nosnippet>353</a> <span class="kw">let </span><span class="kw-2">mut </span>ret_cost = [
<a href=#354 id=354 data-nosnippet>354</a> <span class="self">self</span>.singleton_costs[cost_type_index][<span class="number">0</span>][<span class="number">0</span>],
<a href=#355 id=355 data-nosnippet>355</a> <span class="self">self</span>.singleton_costs[cost_type_index][<span class="number">1</span>][<span class="number">0</span>],
<a href=#356 id=356 data-nosnippet>356</a> ];
<a href=#357 id=357 data-nosnippet>357</a> <span class="kw">let </span><span class="kw-2">mut </span>best_indexes = [<span class="number">0</span>, <span class="number">0</span>];
<a href=#358 id=358 data-nosnippet>358</a> <span class="kw">for </span>speed_index <span class="kw">in </span><span class="number">1</span>..NUM_SPEEDS_TO_TRY {
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">for </span>highness <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">let </span>cur_cost = <span class="self">self</span>.singleton_costs[cost_type_index][highness][speed_index];
<a href=#361 id=361 data-nosnippet>361</a> <span class="kw">if </span>cur_cost &lt; ret_cost[highness] {
<a href=#362 id=362 data-nosnippet>362</a> best_indexes[highness] = speed_index;
<a href=#363 id=363 data-nosnippet>363</a> ret_cost[highness] = cur_cost;
<a href=#364 id=364 data-nosnippet>364</a> }
<a href=#365 id=365 data-nosnippet>365</a> }
<a href=#366 id=366 data-nosnippet>366</a> }
<a href=#367 id=367 data-nosnippet>367</a> <span class="kw">let </span>ret_speed = [
<a href=#368 id=368 data-nosnippet>368</a> SpeedAndMax(
<a href=#369 id=369 data-nosnippet>369</a> SPEEDS_TO_SEARCH[best_indexes[<span class="number">0</span>]],
<a href=#370 id=370 data-nosnippet>370</a> MAXES_TO_SEARCH[best_indexes[<span class="number">0</span>]],
<a href=#371 id=371 data-nosnippet>371</a> ),
<a href=#372 id=372 data-nosnippet>372</a> SpeedAndMax(
<a href=#373 id=373 data-nosnippet>373</a> SPEEDS_TO_SEARCH[best_indexes[<span class="number">1</span>]],
<a href=#374 id=374 data-nosnippet>374</a> MAXES_TO_SEARCH[best_indexes[<span class="number">1</span>]],
<a href=#375 id=375 data-nosnippet>375</a> ),
<a href=#376 id=376 data-nosnippet>376</a> ];
<a href=#377 id=377 data-nosnippet>377</a> (ret_speed, ret_cost)
<a href=#378 id=378 data-nosnippet>378</a> }
<a href=#379 id=379 data-nosnippet>379</a> <span class="kw">pub fn </span>best_speeds(
<a href=#380 id=380 data-nosnippet>380</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="comment">// mut due to helpers
<a href=#381 id=381 data-nosnippet>381</a> </span>cm: bool,
<a href=#382 id=382 data-nosnippet>382</a> combined: bool,
<a href=#383 id=383 data-nosnippet>383</a> ) -&gt; [SpeedAndMax; <span class="number">2</span>] {
<a href=#384 id=384 data-nosnippet>384</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = [SpeedAndMax(SPEEDS_TO_SEARCH[<span class="number">0</span>], MAXES_TO_SEARCH[<span class="number">0</span>]); <span class="number">2</span>];
<a href=#385 id=385 data-nosnippet>385</a> <span class="kw">let </span>cost_type_index = <span class="kw">if </span>combined {
<a href=#386 id=386 data-nosnippet>386</a> <span class="number">2usize
<a href=#387 id=387 data-nosnippet>387</a> </span>} <span class="kw">else if </span>cm {
<a href=#388 id=388 data-nosnippet>388</a> <span class="number">0usize
<a href=#389 id=389 data-nosnippet>389</a> </span>} <span class="kw">else </span>{
<a href=#390 id=390 data-nosnippet>390</a> <span class="number">1
<a href=#391 id=391 data-nosnippet>391</a> </span>};
<a href=#392 id=392 data-nosnippet>392</a> <span class="kw">for </span>high <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#393 id=393 data-nosnippet>393</a> <span class="comment">/*eprintln!("TRIAL {} {}", cm, combined);
<a href=#394 id=394 data-nosnippet>394</a> for i in 0..NUM_SPEEDS_TO_TRY {
<a href=#395 id=395 data-nosnippet>395</a> eprintln!("{},{} costs {:?}", SPEEDS_TO_SEARCH[i], MAXES_TO_SEARCH[i], self.singleton_costs[cost_type_index][high][i]);
<a href=#396 id=396 data-nosnippet>396</a> }*/
<a href=#397 id=397 data-nosnippet>397</a> </span>ret[high] = min_cost_speed_max(<span class="kw-2">&amp;</span><span class="self">self</span>.singleton_costs[cost_type_index][high][..]);
<a href=#398 id=398 data-nosnippet>398</a> }
<a href=#399 id=399 data-nosnippet>399</a> ret
<a href=#400 id=400 data-nosnippet>400</a> }
<a href=#401 id=401 data-nosnippet>401</a> <span class="kw">pub fn </span>best_speeds_costs(
<a href=#402 id=402 data-nosnippet>402</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>, <span class="comment">// mut due to helpers
<a href=#403 id=403 data-nosnippet>403</a> </span>cm: bool,
<a href=#404 id=404 data-nosnippet>404</a> combined: bool,
<a href=#405 id=405 data-nosnippet>405</a> ) -&gt; [floatX; <span class="number">2</span>] {
<a href=#406 id=406 data-nosnippet>406</a> <span class="kw">let </span>cost_type_index = <span class="kw">if </span>combined {
<a href=#407 id=407 data-nosnippet>407</a> <span class="number">2usize
<a href=#408 id=408 data-nosnippet>408</a> </span>} <span class="kw">else if </span>cm {
<a href=#409 id=409 data-nosnippet>409</a> <span class="number">0usize
<a href=#410 id=410 data-nosnippet>410</a> </span>} <span class="kw">else </span>{
<a href=#411 id=411 data-nosnippet>411</a> <span class="number">1
<a href=#412 id=412 data-nosnippet>412</a> </span>};
<a href=#413 id=413 data-nosnippet>413</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = [<span class="number">0.0</span>; <span class="number">2</span>];
<a href=#414 id=414 data-nosnippet>414</a> <span class="kw">for </span>high <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#415 id=415 data-nosnippet>415</a> ret[high] = min_cost_value(<span class="kw-2">&amp;</span><span class="self">self</span>.singleton_costs[cost_type_index][high][..]);
<a href=#416 id=416 data-nosnippet>416</a> }
<a href=#417 id=417 data-nosnippet>417</a> ret
<a href=#418 id=418 data-nosnippet>418</a> }
<a href=#419 id=419 data-nosnippet>419</a> <span class="kw">pub fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, alloc: <span class="kw-2">&amp;mut </span>Alloc) {
<a href=#420 id=420 data-nosnippet>420</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.cm_priors));
<a href=#421 id=421 data-nosnippet>421</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.stride_priors));
<a href=#422 id=422 data-nosnippet>422</a> }
<a href=#423 id=423 data-nosnippet>423</a> <span class="kw">fn </span>update_cost_base(
<a href=#424 id=424 data-nosnippet>424</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#425 id=425 data-nosnippet>425</a> stride_prior: u8,
<a href=#426 id=426 data-nosnippet>426</a> _selected_bits: u8,
<a href=#427 id=427 data-nosnippet>427</a> cm_prior: usize,
<a href=#428 id=428 data-nosnippet>428</a> literal: u8,
<a href=#429 id=429 data-nosnippet>429</a> ) {
<a href=#430 id=430 data-nosnippet>430</a> <span class="kw">let </span>upper_nibble = (literal &gt;&gt; <span class="number">4</span>);
<a href=#431 id=431 data-nosnippet>431</a> <span class="kw">let </span>lower_nibble = literal &amp; <span class="number">0xf</span>;
<a href=#432 id=432 data-nosnippet>432</a> <span class="kw">let </span>provisional_cm_high_cdf: [u16; <span class="number">16</span>];
<a href=#433 id=433 data-nosnippet>433</a> <span class="kw">let </span>provisional_cm_low_cdf: [u16; <span class="number">16</span>];
<a href=#434 id=434 data-nosnippet>434</a> {
<a href=#435 id=435 data-nosnippet>435</a> <span class="kw">let </span>cm_cdf_high = get_cm_cdf_high(<span class="self">self</span>.cm_priors.slice_mut(), cm_prior);
<a href=#436 id=436 data-nosnippet>436</a> compute_cost(
<a href=#437 id=437 data-nosnippet>437</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.singleton_costs[SINGLETON_CM_STRATEGY][<span class="number">1</span>],
<a href=#438 id=438 data-nosnippet>438</a> cm_cdf_high,
<a href=#439 id=439 data-nosnippet>439</a> upper_nibble,
<a href=#440 id=440 data-nosnippet>440</a> );
<a href=#441 id=441 data-nosnippet>441</a> <span class="comment">// choose a fairly reasonable cm speed rather than a selected one
<a href=#442 id=442 data-nosnippet>442</a> </span><span class="kw">let </span>best_cm_index = DEFAULT_CM_SPEED_INDEX; <span class="comment">// = min_cost_index_for_speed(&amp;self.singleton_costs[SINGLETON_CM_STRATEGY][1]);
<a href=#443 id=443 data-nosnippet>443</a> </span>provisional_cm_high_cdf = extract_single_cdf(cm_cdf_high, best_cm_index);
<a href=#444 id=444 data-nosnippet>444</a> }
<a href=#445 id=445 data-nosnippet>445</a> {
<a href=#446 id=446 data-nosnippet>446</a> <span class="kw">let </span>cm_cdf_low = get_cm_cdf_low(<span class="self">self</span>.cm_priors.slice_mut(), cm_prior, upper_nibble);
<a href=#447 id=447 data-nosnippet>447</a> compute_cost(
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.singleton_costs[SINGLETON_CM_STRATEGY][<span class="number">0</span>],
<a href=#449 id=449 data-nosnippet>449</a> cm_cdf_low,
<a href=#450 id=450 data-nosnippet>450</a> lower_nibble,
<a href=#451 id=451 data-nosnippet>451</a> );
<a href=#452 id=452 data-nosnippet>452</a> <span class="comment">// choose a fairly reasonable cm speed rather than a selected one
<a href=#453 id=453 data-nosnippet>453</a> </span><span class="kw">let </span>best_cm_index = DEFAULT_CM_SPEED_INDEX; <span class="comment">//min_cost_index_for_speed(&amp;self.singleton_costs[SINGLETON_CM_STRATEGY][0]);
<a href=#454 id=454 data-nosnippet>454</a> </span>provisional_cm_low_cdf = extract_single_cdf(cm_cdf_low, best_cm_index);
<a href=#455 id=455 data-nosnippet>455</a> }
<a href=#456 id=456 data-nosnippet>456</a> {
<a href=#457 id=457 data-nosnippet>457</a> <span class="kw">let </span>stride_cdf_high =
<a href=#458 id=458 data-nosnippet>458</a> get_stride_cdf_high(<span class="self">self</span>.stride_priors.slice_mut(), stride_prior, cm_prior);
<a href=#459 id=459 data-nosnippet>459</a> compute_combined_cost(
<a href=#460 id=460 data-nosnippet>460</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.singleton_costs[SINGLETON_COMBINED_STRATEGY][<span class="number">1</span>],
<a href=#461 id=461 data-nosnippet>461</a> stride_cdf_high,
<a href=#462 id=462 data-nosnippet>462</a> provisional_cm_high_cdf,
<a href=#463 id=463 data-nosnippet>463</a> upper_nibble,
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.weight[<span class="number">1</span>],
<a href=#465 id=465 data-nosnippet>465</a> );
<a href=#466 id=466 data-nosnippet>466</a> compute_cost(
<a href=#467 id=467 data-nosnippet>467</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.singleton_costs[SINGLETON_STRIDE_STRATEGY][<span class="number">1</span>],
<a href=#468 id=468 data-nosnippet>468</a> stride_cdf_high,
<a href=#469 id=469 data-nosnippet>469</a> upper_nibble,
<a href=#470 id=470 data-nosnippet>470</a> );
<a href=#471 id=471 data-nosnippet>471</a> update_cdf(stride_cdf_high, upper_nibble);
<a href=#472 id=472 data-nosnippet>472</a> }
<a href=#473 id=473 data-nosnippet>473</a> {
<a href=#474 id=474 data-nosnippet>474</a> <span class="kw">let </span>stride_cdf_low = get_stride_cdf_low(
<a href=#475 id=475 data-nosnippet>475</a> <span class="self">self</span>.stride_priors.slice_mut(),
<a href=#476 id=476 data-nosnippet>476</a> stride_prior,
<a href=#477 id=477 data-nosnippet>477</a> cm_prior,
<a href=#478 id=478 data-nosnippet>478</a> upper_nibble,
<a href=#479 id=479 data-nosnippet>479</a> );
<a href=#480 id=480 data-nosnippet>480</a> compute_combined_cost(
<a href=#481 id=481 data-nosnippet>481</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.singleton_costs[SINGLETON_COMBINED_STRATEGY][<span class="number">0</span>],
<a href=#482 id=482 data-nosnippet>482</a> stride_cdf_low,
<a href=#483 id=483 data-nosnippet>483</a> provisional_cm_low_cdf,
<a href=#484 id=484 data-nosnippet>484</a> lower_nibble,
<a href=#485 id=485 data-nosnippet>485</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.weight[<span class="number">0</span>],
<a href=#486 id=486 data-nosnippet>486</a> );
<a href=#487 id=487 data-nosnippet>487</a> compute_cost(
<a href=#488 id=488 data-nosnippet>488</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.singleton_costs[SINGLETON_STRIDE_STRATEGY][<span class="number">0</span>],
<a href=#489 id=489 data-nosnippet>489</a> stride_cdf_low,
<a href=#490 id=490 data-nosnippet>490</a> lower_nibble,
<a href=#491 id=491 data-nosnippet>491</a> );
<a href=#492 id=492 data-nosnippet>492</a> update_cdf(stride_cdf_low, lower_nibble);
<a href=#493 id=493 data-nosnippet>493</a> }
<a href=#494 id=494 data-nosnippet>494</a> {
<a href=#495 id=495 data-nosnippet>495</a> <span class="kw">let </span>cm_cdf_high = get_cm_cdf_high(<span class="self">self</span>.cm_priors.slice_mut(), cm_prior);
<a href=#496 id=496 data-nosnippet>496</a> update_cdf(cm_cdf_high, upper_nibble);
<a href=#497 id=497 data-nosnippet>497</a> }
<a href=#498 id=498 data-nosnippet>498</a> {
<a href=#499 id=499 data-nosnippet>499</a> <span class="kw">let </span>cm_cdf_low = get_cm_cdf_low(<span class="self">self</span>.cm_priors.slice_mut(), cm_prior, upper_nibble);
<a href=#500 id=500 data-nosnippet>500</a> update_cdf(cm_cdf_low, lower_nibble);
<a href=#501 id=501 data-nosnippet>501</a> }
<a href=#502 id=502 data-nosnippet>502</a> }
<a href=#503 id=503 data-nosnippet>503</a>}
<a href=#504 id=504 data-nosnippet>504</a>
<a href=#505 id=505 data-nosnippet>505</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, <span class="lifetime">'b</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;&gt;
<a href=#506 id=506 data-nosnippet>506</a> interface::CommandProcessor&lt;<span class="lifetime">'b</span>&gt; <span class="kw">for </span>ContextMapEntropy&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#507 id=507 data-nosnippet>507</a>{
<a href=#508 id=508 data-nosnippet>508</a> <span class="kw">fn </span>push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, val: interface::Command&lt;InputReference&lt;<span class="lifetime">'b</span>&gt;&gt;) {
<a href=#509 id=509 data-nosnippet>509</a> push_base(<span class="self">self</span>, val)
<a href=#510 id=510 data-nosnippet>510</a> }
<a href=#511 id=511 data-nosnippet>511</a>}
<a href=#512 id=512 data-nosnippet>512</a>
<a href=#513 id=513 data-nosnippet>513</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;&gt;
<a href=#514 id=514 data-nosnippet>514</a> IRInterpreter <span class="kw">for </span>ContextMapEntropy&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#515 id=515 data-nosnippet>515</a>{
<a href=#516 id=516 data-nosnippet>516</a> <span class="kw">fn </span>inc_local_byte_offset(<span class="kw-2">&amp;mut </span><span class="self">self</span>, inc: usize) {
<a href=#517 id=517 data-nosnippet>517</a> <span class="self">self</span>.local_byte_offset += inc;
<a href=#518 id=518 data-nosnippet>518</a> }
<a href=#519 id=519 data-nosnippet>519</a> <span class="kw">fn </span>local_byte_offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#520 id=520 data-nosnippet>520</a> <span class="self">self</span>.local_byte_offset
<a href=#521 id=521 data-nosnippet>521</a> }
<a href=#522 id=522 data-nosnippet>522</a> <span class="kw">fn </span>update_block_type(<span class="kw-2">&amp;mut </span><span class="self">self</span>, new_type: u8, stride: u8) {
<a href=#523 id=523 data-nosnippet>523</a> <span class="self">self</span>.block_type = new_type;
<a href=#524 id=524 data-nosnippet>524</a> <span class="self">self</span>.cur_stride = stride;
<a href=#525 id=525 data-nosnippet>525</a> }
<a href=#526 id=526 data-nosnippet>526</a> <span class="kw">fn </span>block_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#527 id=527 data-nosnippet>527</a> <span class="self">self</span>.block_type
<a href=#528 id=528 data-nosnippet>528</a> }
<a href=#529 id=529 data-nosnippet>529</a> <span class="kw">fn </span>literal_data_at_offset(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; u8 {
<a href=#530 id=530 data-nosnippet>530</a> <span class="self">self</span>.input[index]
<a href=#531 id=531 data-nosnippet>531</a> }
<a href=#532 id=532 data-nosnippet>532</a> <span class="kw">fn </span>literal_context_map(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#533 id=533 data-nosnippet>533</a> <span class="self">self</span>.context_map.literal_context_map.slice()
<a href=#534 id=534 data-nosnippet>534</a> }
<a href=#535 id=535 data-nosnippet>535</a> <span class="kw">fn </span>prediction_mode(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw">crate</span>::interface::LiteralPredictionModeNibble {
<a href=#536 id=536 data-nosnippet>536</a> <span class="self">self</span>.context_map.literal_prediction_mode()
<a href=#537 id=537 data-nosnippet>537</a> }
<a href=#538 id=538 data-nosnippet>538</a> <span class="kw">fn </span>update_cost(
<a href=#539 id=539 data-nosnippet>539</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#540 id=540 data-nosnippet>540</a> stride_prior: [u8; <span class="number">8</span>],
<a href=#541 id=541 data-nosnippet>541</a> stride_prior_offset: usize,
<a href=#542 id=542 data-nosnippet>542</a> selected_bits: u8,
<a href=#543 id=543 data-nosnippet>543</a> cm_prior: usize,
<a href=#544 id=544 data-nosnippet>544</a> literal: u8,
<a href=#545 id=545 data-nosnippet>545</a> ) {
<a href=#546 id=546 data-nosnippet>546</a> <span class="kw">let </span>stride = <span class="self">self</span>.cur_stride <span class="kw">as </span>usize;
<a href=#547 id=547 data-nosnippet>547</a> <span class="self">self</span>.update_cost_base(
<a href=#548 id=548 data-nosnippet>548</a> stride_prior[stride_prior_offset.wrapping_sub(stride) &amp; <span class="number">7</span>],
<a href=#549 id=549 data-nosnippet>549</a> selected_bits,
<a href=#550 id=550 data-nosnippet>550</a> cm_prior,
<a href=#551 id=551 data-nosnippet>551</a> literal,
<a href=#552 id=552 data-nosnippet>552</a> )
<a href=#553 id=553 data-nosnippet>553</a> }
<a href=#554 id=554 data-nosnippet>554</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,577 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/entropy_encode.rs`."><title>entropy_encode.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>entropy_encode.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="comment">/* Copyright 2010 Google Inc. All Rights Reserved.
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a> Distributed under MIT license.
<a href=#4 id=4 data-nosnippet>4</a> See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
<a href=#5 id=5 data-nosnippet>5</a>*/
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a>/* Entropy encoding (Huffman) utilities. */
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">use </span>core::cmp::max;
<a href=#9 id=9 data-nosnippet>9</a>
<a href=#10 id=10 data-nosnippet>10</a><span class="attr">#[derive(Clone, Copy, Default)]
<a href=#11 id=11 data-nosnippet>11</a></span><span class="kw">pub struct </span>HuffmanTree {
<a href=#12 id=12 data-nosnippet>12</a> <span class="kw">pub </span>total_count_: u32,
<a href=#13 id=13 data-nosnippet>13</a> <span class="kw">pub </span>index_left_: i16,
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw">pub </span>index_right_or_value_: i16,
<a href=#15 id=15 data-nosnippet>15</a>}
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">impl </span>HuffmanTree {
<a href=#18 id=18 data-nosnippet>18</a> <span class="kw">pub fn </span>new(count: u32, left: i16, right: i16) -&gt; <span class="self">Self </span>{
<a href=#19 id=19 data-nosnippet>19</a> <span class="self">Self </span>{
<a href=#20 id=20 data-nosnippet>20</a> total_count_: count,
<a href=#21 id=21 data-nosnippet>21</a> index_left_: left,
<a href=#22 id=22 data-nosnippet>22</a> index_right_or_value_: right,
<a href=#23 id=23 data-nosnippet>23</a> }
<a href=#24 id=24 data-nosnippet>24</a> }
<a href=#25 id=25 data-nosnippet>25</a>}
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="kw">pub fn </span>BrotliSetDepth(p0: i32, pool: <span class="kw-2">&amp;mut </span>[HuffmanTree], depth: <span class="kw-2">&amp;mut </span>[u8], max_depth: i32) -&gt; bool {
<a href=#28 id=28 data-nosnippet>28</a> <span class="kw">let </span><span class="kw-2">mut </span>stack: [i32; <span class="number">16</span>] = [<span class="number">0</span>; <span class="number">16</span>];
<a href=#29 id=29 data-nosnippet>29</a> <span class="kw">let </span><span class="kw-2">mut </span>level: i32 = <span class="number">0i32</span>;
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">let </span><span class="kw-2">mut </span>p: i32 = p0;
<a href=#31 id=31 data-nosnippet>31</a> stack[<span class="number">0</span>] = -<span class="number">1i32</span>;
<a href=#32 id=32 data-nosnippet>32</a> <span class="kw">loop </span>{
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">if </span>(pool[(p <span class="kw">as </span>usize)]).index_left_ <span class="kw">as </span>i32 &gt;= <span class="number">0i32 </span>{
<a href=#34 id=34 data-nosnippet>34</a> level += <span class="number">1</span>;
<a href=#35 id=35 data-nosnippet>35</a> <span class="kw">if </span>level &gt; max_depth {
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#37 id=37 data-nosnippet>37</a> }
<a href=#38 id=38 data-nosnippet>38</a> stack[level <span class="kw">as </span>usize] = (pool[(p <span class="kw">as </span>usize)]).index_right_or_value_ <span class="kw">as </span>i32;
<a href=#39 id=39 data-nosnippet>39</a> p = (pool[(p <span class="kw">as </span>usize)]).index_left_ <span class="kw">as </span>i32;
<a href=#40 id=40 data-nosnippet>40</a> {
<a href=#41 id=41 data-nosnippet>41</a> <span class="kw">continue</span>;
<a href=#42 id=42 data-nosnippet>42</a> }
<a href=#43 id=43 data-nosnippet>43</a> } <span class="kw">else </span>{
<a href=#44 id=44 data-nosnippet>44</a> <span class="kw">let </span>pp = pool[(p <span class="kw">as </span>usize)];
<a href=#45 id=45 data-nosnippet>45</a> depth[((pp).index_right_or_value_ <span class="kw">as </span>usize)] = level <span class="kw">as </span>u8;
<a href=#46 id=46 data-nosnippet>46</a> }
<a href=#47 id=47 data-nosnippet>47</a> <span class="kw">while </span>level &gt;= <span class="number">0i32 </span>&amp;&amp; (stack[level <span class="kw">as </span>usize] == -<span class="number">1i32</span>) {
<a href=#48 id=48 data-nosnippet>48</a> level -= <span class="number">1</span>;
<a href=#49 id=49 data-nosnippet>49</a> }
<a href=#50 id=50 data-nosnippet>50</a> <span class="kw">if </span>level &lt; <span class="number">0i32 </span>{
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">return </span><span class="bool-val">true</span>;
<a href=#52 id=52 data-nosnippet>52</a> }
<a href=#53 id=53 data-nosnippet>53</a> p = stack[level <span class="kw">as </span>usize];
<a href=#54 id=54 data-nosnippet>54</a> stack[level <span class="kw">as </span>usize] = -<span class="number">1i32</span>;
<a href=#55 id=55 data-nosnippet>55</a> }
<a href=#56 id=56 data-nosnippet>56</a>}
<a href=#57 id=57 data-nosnippet>57</a>
<a href=#58 id=58 data-nosnippet>58</a><span class="kw">pub trait </span>HuffmanComparator {
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">fn </span>Cmp(<span class="kw-2">&amp;</span><span class="self">self</span>, a: <span class="kw-2">&amp;</span>HuffmanTree, b: <span class="kw-2">&amp;</span>HuffmanTree) -&gt; bool;
<a href=#60 id=60 data-nosnippet>60</a>}
<a href=#61 id=61 data-nosnippet>61</a><span class="kw">pub struct </span>SortHuffmanTree {}
<a href=#62 id=62 data-nosnippet>62</a><span class="kw">impl </span>HuffmanComparator <span class="kw">for </span>SortHuffmanTree {
<a href=#63 id=63 data-nosnippet>63</a> <span class="kw">fn </span>Cmp(<span class="kw-2">&amp;</span><span class="self">self</span>, v0: <span class="kw-2">&amp;</span>HuffmanTree, v1: <span class="kw-2">&amp;</span>HuffmanTree) -&gt; bool {
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">if </span>v0.<span class="macro">total_count_ !</span>= v1.total_count_ {
<a href=#65 id=65 data-nosnippet>65</a> v0.total_count_ &lt; v1.total_count_
<a href=#66 id=66 data-nosnippet>66</a> } <span class="kw">else </span>{
<a href=#67 id=67 data-nosnippet>67</a> v0.index_right_or_value_ &gt; v1.index_right_or_value_
<a href=#68 id=68 data-nosnippet>68</a> }
<a href=#69 id=69 data-nosnippet>69</a> }
<a href=#70 id=70 data-nosnippet>70</a>}
<a href=#71 id=71 data-nosnippet>71</a><span class="kw">pub fn </span>SortHuffmanTreeItems&lt;Comparator: HuffmanComparator&gt;(
<a href=#72 id=72 data-nosnippet>72</a> items: <span class="kw-2">&amp;mut </span>[HuffmanTree],
<a href=#73 id=73 data-nosnippet>73</a> n: usize,
<a href=#74 id=74 data-nosnippet>74</a> comparator: Comparator,
<a href=#75 id=75 data-nosnippet>75</a>) {
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw">static </span>gaps: [usize; <span class="number">6</span>] = [<span class="number">132</span>, <span class="number">57</span>, <span class="number">23</span>, <span class="number">10</span>, <span class="number">4</span>, <span class="number">1</span>];
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">if </span>n &lt; <span class="number">13 </span>{
<a href=#78 id=78 data-nosnippet>78</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">1</span>..n {
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp: HuffmanTree = items[i];
<a href=#80 id=80 data-nosnippet>80</a> <span class="kw">let </span><span class="kw-2">mut </span>k: usize = i;
<a href=#81 id=81 data-nosnippet>81</a> <span class="kw">let </span><span class="kw-2">mut </span>j: usize = i.wrapping_sub(<span class="number">1</span>);
<a href=#82 id=82 data-nosnippet>82</a> <span class="kw">while </span>comparator.Cmp(<span class="kw-2">&amp;mut </span>tmp, <span class="kw-2">&amp;mut </span>items[j]) {
<a href=#83 id=83 data-nosnippet>83</a> items[k] = items[j];
<a href=#84 id=84 data-nosnippet>84</a> k = j;
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">if </span>{
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">let </span>_old = j;
<a href=#87 id=87 data-nosnippet>87</a> j = j.wrapping_sub(<span class="number">1</span>);
<a href=#88 id=88 data-nosnippet>88</a> _old
<a href=#89 id=89 data-nosnippet>89</a> } == <span class="number">0
<a href=#90 id=90 data-nosnippet>90</a> </span>{
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw">break</span>;
<a href=#92 id=92 data-nosnippet>92</a> }
<a href=#93 id=93 data-nosnippet>93</a> }
<a href=#94 id=94 data-nosnippet>94</a> items[k] = tmp;
<a href=#95 id=95 data-nosnippet>95</a> }
<a href=#96 id=96 data-nosnippet>96</a> } <span class="kw">else </span>{
<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">let </span><span class="kw-2">mut </span>g: i32 = <span class="kw">if </span>n &lt; <span class="number">57usize </span>{ <span class="number">2i32 </span>} <span class="kw">else </span>{ <span class="number">0i32 </span>};
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">while </span>g &lt; <span class="number">6i32 </span>{
<a href=#99 id=99 data-nosnippet>99</a> {
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">let </span>gap: usize = gaps[g <span class="kw">as </span>usize];
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">for </span>i <span class="kw">in </span>gap..n {
<a href=#102 id=102 data-nosnippet>102</a> <span class="kw">let </span><span class="kw-2">mut </span>j: usize = i;
<a href=#103 id=103 data-nosnippet>103</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp: HuffmanTree = items[i];
<a href=#104 id=104 data-nosnippet>104</a> <span class="kw">while </span>j &gt;= gap &amp;&amp; (comparator.Cmp(<span class="kw-2">&amp;mut </span>tmp, <span class="kw-2">&amp;mut </span>items[j.wrapping_sub(gap)])) {
<a href=#105 id=105 data-nosnippet>105</a> {
<a href=#106 id=106 data-nosnippet>106</a> items[j] = items[j.wrapping_sub(gap)];
<a href=#107 id=107 data-nosnippet>107</a> }
<a href=#108 id=108 data-nosnippet>108</a> j = j.wrapping_sub(gap);
<a href=#109 id=109 data-nosnippet>109</a> }
<a href=#110 id=110 data-nosnippet>110</a> items[j] = tmp;
<a href=#111 id=111 data-nosnippet>111</a> }
<a href=#112 id=112 data-nosnippet>112</a> }
<a href=#113 id=113 data-nosnippet>113</a> g += <span class="number">1</span>;
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a> }
<a href=#116 id=116 data-nosnippet>116</a>}
<a href=#117 id=117 data-nosnippet>117</a>
<a href=#118 id=118 data-nosnippet>118</a><span class="comment">/* This function will create a Huffman tree.
<a href=#119 id=119 data-nosnippet>119</a>
<a href=#120 id=120 data-nosnippet>120</a>The catch here is that the tree cannot be arbitrarily deep.
<a href=#121 id=121 data-nosnippet>121</a>Brotli specifies a maximum depth of 15 bits for "code trees"
<a href=#122 id=122 data-nosnippet>122</a>and 7 bits for "code length code trees."
<a href=#123 id=123 data-nosnippet>123</a>
<a href=#124 id=124 data-nosnippet>124</a>count_limit is the value that is to be faked as the minimum value
<a href=#125 id=125 data-nosnippet>125</a>and this minimum value is raised until the tree matches the
<a href=#126 id=126 data-nosnippet>126</a>maximum length requirement.
<a href=#127 id=127 data-nosnippet>127</a>
<a href=#128 id=128 data-nosnippet>128</a>This algorithm is not of excellent performance for very long data blocks,
<a href=#129 id=129 data-nosnippet>129</a>especially when population counts are longer than 2**tree_limit, but
<a href=#130 id=130 data-nosnippet>130</a>we are not planning to use this with extremely long blocks.
<a href=#131 id=131 data-nosnippet>131</a>
<a href=#132 id=132 data-nosnippet>132</a>See https://en.wikipedia.org/wiki/Huffman_coding */
<a href=#133 id=133 data-nosnippet>133</a></span><span class="kw">pub fn </span>BrotliCreateHuffmanTree(
<a href=#134 id=134 data-nosnippet>134</a> data: <span class="kw-2">&amp;</span>[u32],
<a href=#135 id=135 data-nosnippet>135</a> length: usize,
<a href=#136 id=136 data-nosnippet>136</a> tree_limit: i32,
<a href=#137 id=137 data-nosnippet>137</a> tree: <span class="kw-2">&amp;mut </span>[HuffmanTree],
<a href=#138 id=138 data-nosnippet>138</a> depth: <span class="kw-2">&amp;mut </span>[u8],
<a href=#139 id=139 data-nosnippet>139</a>) {
<a href=#140 id=140 data-nosnippet>140</a> <span class="kw">let </span>sentinel = HuffmanTree::new(u32::MAX, -<span class="number">1</span>, -<span class="number">1</span>);
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">let </span><span class="kw-2">mut </span>count_limit = <span class="number">1u32</span>;
<a href=#142 id=142 data-nosnippet>142</a> <span class="lifetime">'break1</span>: <span class="kw">loop </span>{
<a href=#143 id=143 data-nosnippet>143</a> {
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw">let </span><span class="kw-2">mut </span>n: usize = <span class="number">0usize</span>;
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">let </span><span class="kw-2">mut </span>j: usize;
<a href=#147 id=147 data-nosnippet>147</a> <span class="kw">let </span><span class="kw-2">mut </span>k: usize;
<a href=#148 id=148 data-nosnippet>148</a> i = length;
<a href=#149 id=149 data-nosnippet>149</a> <span class="kw">while </span><span class="macro">i !</span>= <span class="number">0usize </span>{
<a href=#150 id=150 data-nosnippet>150</a> i = i.wrapping_sub(<span class="number">1</span>);
<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">if </span>data[i] != <span class="number">0 </span>{
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">let </span>count: u32 = max(data[i], count_limit);
<a href=#153 id=153 data-nosnippet>153</a> tree[n] = HuffmanTree::new(count, -<span class="number">1</span>, i <span class="kw">as </span>i16);
<a href=#154 id=154 data-nosnippet>154</a> n = n.wrapping_add(<span class="number">1</span>);
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a> }
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw">if </span>n == <span class="number">1 </span>{
<a href=#158 id=158 data-nosnippet>158</a> depth[((tree[<span class="number">0</span>]).index_right_or_value_ <span class="kw">as </span>usize)] = <span class="number">1u8</span>;
<a href=#159 id=159 data-nosnippet>159</a> {
<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">break </span><span class="lifetime">'break1</span>;
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a> }
<a href=#163 id=163 data-nosnippet>163</a> SortHuffmanTreeItems(tree, n, SortHuffmanTree {});
<a href=#164 id=164 data-nosnippet>164</a> tree[n] = sentinel;
<a href=#165 id=165 data-nosnippet>165</a> tree[n.wrapping_add(<span class="number">1</span>)] = sentinel;
<a href=#166 id=166 data-nosnippet>166</a> i = <span class="number">0usize</span>;
<a href=#167 id=167 data-nosnippet>167</a> j = n.wrapping_add(<span class="number">1</span>);
<a href=#168 id=168 data-nosnippet>168</a> k = n.wrapping_sub(<span class="number">1</span>);
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">while </span><span class="macro">k !</span>= <span class="number">0usize </span>{
<a href=#170 id=170 data-nosnippet>170</a> {
<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">let </span>left: usize;
<a href=#172 id=172 data-nosnippet>172</a> <span class="kw">let </span>right: usize;
<a href=#173 id=173 data-nosnippet>173</a> <span class="kw">if </span>(tree[i]).total_count_ &lt;= (tree[j]).total_count_ {
<a href=#174 id=174 data-nosnippet>174</a> left = i;
<a href=#175 id=175 data-nosnippet>175</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#176 id=176 data-nosnippet>176</a> } <span class="kw">else </span>{
<a href=#177 id=177 data-nosnippet>177</a> left = j;
<a href=#178 id=178 data-nosnippet>178</a> j = j.wrapping_add(<span class="number">1</span>);
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">if </span>(tree[i]).total_count_ &lt;= (tree[j]).total_count_ {
<a href=#181 id=181 data-nosnippet>181</a> right = i;
<a href=#182 id=182 data-nosnippet>182</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#183 id=183 data-nosnippet>183</a> } <span class="kw">else </span>{
<a href=#184 id=184 data-nosnippet>184</a> right = j;
<a href=#185 id=185 data-nosnippet>185</a> j = j.wrapping_add(<span class="number">1</span>);
<a href=#186 id=186 data-nosnippet>186</a> }
<a href=#187 id=187 data-nosnippet>187</a> {
<a href=#188 id=188 data-nosnippet>188</a> <span class="kw">let </span>j_end: usize = (<span class="number">2usize</span>).wrapping_mul(n).wrapping_sub(k);
<a href=#189 id=189 data-nosnippet>189</a> (tree[j_end]).total_count_ = (tree[left])
<a href=#190 id=190 data-nosnippet>190</a> .total_count_
<a href=#191 id=191 data-nosnippet>191</a> .wrapping_add((tree[right]).total_count_);
<a href=#192 id=192 data-nosnippet>192</a> (tree[j_end]).index_left_ = left <span class="kw">as </span>i16;
<a href=#193 id=193 data-nosnippet>193</a> (tree[j_end]).index_right_or_value_ = right <span class="kw">as </span>i16;
<a href=#194 id=194 data-nosnippet>194</a> tree[j_end.wrapping_add(<span class="number">1</span>)] = sentinel;
<a href=#195 id=195 data-nosnippet>195</a> }
<a href=#196 id=196 data-nosnippet>196</a> }
<a href=#197 id=197 data-nosnippet>197</a> k = k.wrapping_sub(<span class="number">1</span>);
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">if </span>BrotliSetDepth(
<a href=#200 id=200 data-nosnippet>200</a> (<span class="number">2usize</span>).wrapping_mul(n).wrapping_sub(<span class="number">1</span>) <span class="kw">as </span>i32,
<a href=#201 id=201 data-nosnippet>201</a> tree,
<a href=#202 id=202 data-nosnippet>202</a> depth,
<a href=#203 id=203 data-nosnippet>203</a> tree_limit,
<a href=#204 id=204 data-nosnippet>204</a> ) {
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">break </span><span class="lifetime">'break1</span>;
<a href=#206 id=206 data-nosnippet>206</a> }
<a href=#207 id=207 data-nosnippet>207</a> }
<a href=#208 id=208 data-nosnippet>208</a> count_limit = count_limit.wrapping_mul(<span class="number">2</span>);
<a href=#209 id=209 data-nosnippet>209</a> }
<a href=#210 id=210 data-nosnippet>210</a>}
<a href=#211 id=211 data-nosnippet>211</a><span class="kw">pub fn </span>BrotliOptimizeHuffmanCountsForRle(
<a href=#212 id=212 data-nosnippet>212</a> <span class="kw-2">mut </span>length: usize,
<a href=#213 id=213 data-nosnippet>213</a> counts: <span class="kw-2">&amp;mut </span>[u32],
<a href=#214 id=214 data-nosnippet>214</a> good_for_rle: <span class="kw-2">&amp;mut </span>[u8],
<a href=#215 id=215 data-nosnippet>215</a>) {
<a href=#216 id=216 data-nosnippet>216</a> <span class="kw">let </span><span class="kw-2">mut </span>nonzero_count: usize = <span class="number">0usize</span>;
<a href=#217 id=217 data-nosnippet>217</a> <span class="kw">let </span><span class="kw-2">mut </span>stride: usize;
<a href=#218 id=218 data-nosnippet>218</a> <span class="kw">let </span><span class="kw-2">mut </span>limit: usize;
<a href=#219 id=219 data-nosnippet>219</a> <span class="kw">let </span><span class="kw-2">mut </span>sum: usize;
<a href=#220 id=220 data-nosnippet>220</a> <span class="kw">let </span>streak_limit: usize = <span class="number">1240usize</span>;
<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#222 id=222 data-nosnippet>222</a> <span class="kw">if </span>counts[i] != <span class="number">0 </span>{
<a href=#223 id=223 data-nosnippet>223</a> nonzero_count = nonzero_count.wrapping_add(<span class="number">1</span>);
<a href=#224 id=224 data-nosnippet>224</a> }
<a href=#225 id=225 data-nosnippet>225</a> }
<a href=#226 id=226 data-nosnippet>226</a> <span class="kw">if </span>nonzero_count &lt; <span class="number">16usize </span>{
<a href=#227 id=227 data-nosnippet>227</a> <span class="kw">return</span>;
<a href=#228 id=228 data-nosnippet>228</a> }
<a href=#229 id=229 data-nosnippet>229</a> <span class="kw">while </span><span class="macro">length !</span>= <span class="number">0usize </span>&amp;&amp; (counts[length.wrapping_sub(<span class="number">1</span>)] == <span class="number">0u32</span>) {
<a href=#230 id=230 data-nosnippet>230</a> length = length.wrapping_sub(<span class="number">1</span>);
<a href=#231 id=231 data-nosnippet>231</a> }
<a href=#232 id=232 data-nosnippet>232</a> <span class="kw">if </span>length == <span class="number">0usize </span>{
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw">return</span>;
<a href=#234 id=234 data-nosnippet>234</a> }
<a href=#235 id=235 data-nosnippet>235</a> {
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw">let </span><span class="kw-2">mut </span>nonzeros: usize = <span class="number">0usize</span>;
<a href=#237 id=237 data-nosnippet>237</a> <span class="kw">let </span><span class="kw-2">mut </span>smallest_nonzero: u32 = (<span class="number">1i32 </span>&lt;&lt; <span class="number">30</span>) <span class="kw">as </span>u32;
<a href=#238 id=238 data-nosnippet>238</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..length {
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">if </span>counts[i] != <span class="number">0u32 </span>{
<a href=#240 id=240 data-nosnippet>240</a> nonzeros = nonzeros.wrapping_add(<span class="number">1</span>);
<a href=#241 id=241 data-nosnippet>241</a> <span class="kw">if </span>smallest_nonzero &gt; counts[i] {
<a href=#242 id=242 data-nosnippet>242</a> smallest_nonzero = counts[i];
<a href=#243 id=243 data-nosnippet>243</a> }
<a href=#244 id=244 data-nosnippet>244</a> }
<a href=#245 id=245 data-nosnippet>245</a> }
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">if </span>nonzeros &lt; <span class="number">5usize </span>{
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">return</span>;
<a href=#248 id=248 data-nosnippet>248</a> }
<a href=#249 id=249 data-nosnippet>249</a> <span class="kw">if </span>smallest_nonzero &lt; <span class="number">4u32 </span>{
<a href=#250 id=250 data-nosnippet>250</a> <span class="kw">let </span>zeros: usize = length.wrapping_sub(nonzeros);
<a href=#251 id=251 data-nosnippet>251</a> <span class="kw">if </span>zeros &lt; <span class="number">6 </span>{
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">1</span>..length.wrapping_sub(<span class="number">1</span>) {
<a href=#253 id=253 data-nosnippet>253</a> <span class="kw">if </span>counts[i - <span class="number">1</span>] != <span class="number">0 </span>&amp;&amp; counts[i] == <span class="number">0 </span>&amp;&amp; counts[i + <span class="number">1</span>] != <span class="number">0 </span>{
<a href=#254 id=254 data-nosnippet>254</a> counts[i] = <span class="number">1</span>;
<a href=#255 id=255 data-nosnippet>255</a> }
<a href=#256 id=256 data-nosnippet>256</a> }
<a href=#257 id=257 data-nosnippet>257</a> }
<a href=#258 id=258 data-nosnippet>258</a> }
<a href=#259 id=259 data-nosnippet>259</a> <span class="kw">if </span>nonzeros &lt; <span class="number">28usize </span>{
<a href=#260 id=260 data-nosnippet>260</a> <span class="kw">return</span>;
<a href=#261 id=261 data-nosnippet>261</a> }
<a href=#262 id=262 data-nosnippet>262</a> }
<a href=#263 id=263 data-nosnippet>263</a> <span class="kw">for </span>rle_item <span class="kw">in </span>good_for_rle.iter_mut() {
<a href=#264 id=264 data-nosnippet>264</a> <span class="kw-2">*</span>rle_item = <span class="number">0</span>;
<a href=#265 id=265 data-nosnippet>265</a> }
<a href=#266 id=266 data-nosnippet>266</a> {
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">let </span><span class="kw-2">mut </span>symbol: u32 = counts[<span class="number">0</span>];
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw">let </span><span class="kw-2">mut </span>step: usize = <span class="number">0usize</span>;
<a href=#269 id=269 data-nosnippet>269</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..=length {
<a href=#270 id=270 data-nosnippet>270</a> <span class="kw">if </span>i == length || counts[i] != symbol {
<a href=#271 id=271 data-nosnippet>271</a> <span class="kw">if </span>symbol == <span class="number">0u32 </span>&amp;&amp; (step &gt;= <span class="number">5usize</span>) || <span class="macro">symbol !</span>= <span class="number">0u32 </span>&amp;&amp; (step &gt;= <span class="number">7usize</span>) {
<a href=#272 id=272 data-nosnippet>272</a> <span class="kw">for </span>k <span class="kw">in </span><span class="number">0usize</span>..step {
<a href=#273 id=273 data-nosnippet>273</a> good_for_rle[i.wrapping_sub(k).wrapping_sub(<span class="number">1</span>)] = <span class="number">1u8</span>;
<a href=#274 id=274 data-nosnippet>274</a> }
<a href=#275 id=275 data-nosnippet>275</a> }
<a href=#276 id=276 data-nosnippet>276</a> step = <span class="number">1</span>;
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw">if </span><span class="macro">i !</span>= length {
<a href=#278 id=278 data-nosnippet>278</a> symbol = counts[i];
<a href=#279 id=279 data-nosnippet>279</a> }
<a href=#280 id=280 data-nosnippet>280</a> } <span class="kw">else </span>{
<a href=#281 id=281 data-nosnippet>281</a> step = step.wrapping_add(<span class="number">1</span>);
<a href=#282 id=282 data-nosnippet>282</a> }
<a href=#283 id=283 data-nosnippet>283</a> }
<a href=#284 id=284 data-nosnippet>284</a> }
<a href=#285 id=285 data-nosnippet>285</a> stride = <span class="number">0usize</span>;
<a href=#286 id=286 data-nosnippet>286</a> limit = (<span class="number">256u32</span>)
<a href=#287 id=287 data-nosnippet>287</a> .wrapping_mul((counts[<span class="number">0</span>]).wrapping_add(counts[<span class="number">1</span>]).wrapping_add(counts[<span class="number">2</span>]))
<a href=#288 id=288 data-nosnippet>288</a> .wrapping_div(<span class="number">3</span>)
<a href=#289 id=289 data-nosnippet>289</a> .wrapping_add(<span class="number">420</span>) <span class="kw">as </span>usize;
<a href=#290 id=290 data-nosnippet>290</a> sum = <span class="number">0usize</span>;
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..=length {
<a href=#292 id=292 data-nosnippet>292</a> <span class="kw">if </span>i == length
<a href=#293 id=293 data-nosnippet>293</a> || good_for_rle[i] != <span class="number">0
<a href=#294 id=294 data-nosnippet>294</a> </span>|| <span class="macro">i !</span>= <span class="number">0usize </span>&amp;&amp; (good_for_rle[i.wrapping_sub(<span class="number">1</span>)] != <span class="number">0</span>)
<a href=#295 id=295 data-nosnippet>295</a> || ((<span class="number">256u32</span>).wrapping_mul(counts[i]) <span class="kw">as </span>usize)
<a href=#296 id=296 data-nosnippet>296</a> .wrapping_sub(limit)
<a href=#297 id=297 data-nosnippet>297</a> .wrapping_add(streak_limit)
<a href=#298 id=298 data-nosnippet>298</a> &gt;= (<span class="number">2usize</span>).wrapping_mul(streak_limit)
<a href=#299 id=299 data-nosnippet>299</a> {
<a href=#300 id=300 data-nosnippet>300</a> <span class="kw">if </span>stride &gt;= <span class="number">4usize </span>|| stride &gt;= <span class="number">3usize </span>&amp;&amp; (sum == <span class="number">0usize</span>) {
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw">let </span><span class="kw-2">mut </span>count: usize = sum
<a href=#302 id=302 data-nosnippet>302</a> .wrapping_add(stride.wrapping_div(<span class="number">2</span>))
<a href=#303 id=303 data-nosnippet>303</a> .wrapping_div(stride);
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw">if </span>count == <span class="number">0usize </span>{
<a href=#305 id=305 data-nosnippet>305</a> count = <span class="number">1</span>;
<a href=#306 id=306 data-nosnippet>306</a> }
<a href=#307 id=307 data-nosnippet>307</a> <span class="kw">if </span>sum == <span class="number">0usize </span>{
<a href=#308 id=308 data-nosnippet>308</a> count = <span class="number">0usize</span>;
<a href=#309 id=309 data-nosnippet>309</a> }
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">for </span>k <span class="kw">in </span><span class="number">0usize</span>..stride {
<a href=#311 id=311 data-nosnippet>311</a> counts[i.wrapping_sub(k).wrapping_sub(<span class="number">1</span>)] = count <span class="kw">as </span>u32;
<a href=#312 id=312 data-nosnippet>312</a> }
<a href=#313 id=313 data-nosnippet>313</a> }
<a href=#314 id=314 data-nosnippet>314</a> stride = <span class="number">0usize</span>;
<a href=#315 id=315 data-nosnippet>315</a> sum = <span class="number">0usize</span>;
<a href=#316 id=316 data-nosnippet>316</a> <span class="kw">if </span>i &lt; length.wrapping_sub(<span class="number">2</span>) {
<a href=#317 id=317 data-nosnippet>317</a> limit = (<span class="number">256u32</span>)
<a href=#318 id=318 data-nosnippet>318</a> .wrapping_mul(
<a href=#319 id=319 data-nosnippet>319</a> (counts[i])
<a href=#320 id=320 data-nosnippet>320</a> .wrapping_add(counts[i.wrapping_add(<span class="number">1</span>)])
<a href=#321 id=321 data-nosnippet>321</a> .wrapping_add(counts[i.wrapping_add(<span class="number">2</span>)]),
<a href=#322 id=322 data-nosnippet>322</a> )
<a href=#323 id=323 data-nosnippet>323</a> .wrapping_div(<span class="number">3</span>)
<a href=#324 id=324 data-nosnippet>324</a> .wrapping_add(<span class="number">420</span>) <span class="kw">as </span>usize;
<a href=#325 id=325 data-nosnippet>325</a> } <span class="kw">else if </span>i &lt; length {
<a href=#326 id=326 data-nosnippet>326</a> limit = (<span class="number">256u32</span>).wrapping_mul(counts[i]) <span class="kw">as </span>usize;
<a href=#327 id=327 data-nosnippet>327</a> } <span class="kw">else </span>{
<a href=#328 id=328 data-nosnippet>328</a> limit = <span class="number">0usize</span>;
<a href=#329 id=329 data-nosnippet>329</a> }
<a href=#330 id=330 data-nosnippet>330</a> }
<a href=#331 id=331 data-nosnippet>331</a> stride = stride.wrapping_add(<span class="number">1</span>);
<a href=#332 id=332 data-nosnippet>332</a> <span class="kw">if </span><span class="macro">i !</span>= length {
<a href=#333 id=333 data-nosnippet>333</a> sum = sum.wrapping_add(counts[i] <span class="kw">as </span>usize);
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">if </span>stride &gt;= <span class="number">4usize </span>{
<a href=#335 id=335 data-nosnippet>335</a> limit = (<span class="number">256usize</span>)
<a href=#336 id=336 data-nosnippet>336</a> .wrapping_mul(sum)
<a href=#337 id=337 data-nosnippet>337</a> .wrapping_add(stride.wrapping_div(<span class="number">2</span>))
<a href=#338 id=338 data-nosnippet>338</a> .wrapping_div(stride);
<a href=#339 id=339 data-nosnippet>339</a> }
<a href=#340 id=340 data-nosnippet>340</a> <span class="kw">if </span>stride == <span class="number">4usize </span>{
<a href=#341 id=341 data-nosnippet>341</a> limit = limit.wrapping_add(<span class="number">120</span>);
<a href=#342 id=342 data-nosnippet>342</a> }
<a href=#343 id=343 data-nosnippet>343</a> }
<a href=#344 id=344 data-nosnippet>344</a> }
<a href=#345 id=345 data-nosnippet>345</a>}
<a href=#346 id=346 data-nosnippet>346</a>
<a href=#347 id=347 data-nosnippet>347</a>
<a href=#348 id=348 data-nosnippet>348</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>decide_over_rle_use(depth: <span class="kw-2">&amp;</span>[u8], length: usize) -&gt; (bool, bool) {
<a href=#349 id=349 data-nosnippet>349</a> <span class="kw">let </span><span class="kw-2">mut </span>total_reps_zero: usize = <span class="number">0usize</span>;
<a href=#350 id=350 data-nosnippet>350</a> <span class="kw">let </span><span class="kw-2">mut </span>total_reps_non_zero: usize = <span class="number">0usize</span>;
<a href=#351 id=351 data-nosnippet>351</a> <span class="kw">let </span><span class="kw-2">mut </span>count_reps_zero: usize = <span class="number">1</span>;
<a href=#352 id=352 data-nosnippet>352</a> <span class="kw">let </span><span class="kw-2">mut </span>count_reps_non_zero: usize = <span class="number">1</span>;
<a href=#353 id=353 data-nosnippet>353</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#354 id=354 data-nosnippet>354</a> i = <span class="number">0usize</span>;
<a href=#355 id=355 data-nosnippet>355</a> <span class="kw">while </span>i &lt; length {
<a href=#356 id=356 data-nosnippet>356</a> <span class="kw">let </span>value: u8 = depth[i];
<a href=#357 id=357 data-nosnippet>357</a> <span class="kw">let </span><span class="kw-2">mut </span>reps: usize = <span class="number">1</span>;
<a href=#358 id=358 data-nosnippet>358</a> <span class="kw">let </span><span class="kw-2">mut </span>k: usize;
<a href=#359 id=359 data-nosnippet>359</a> k = i.wrapping_add(<span class="number">1</span>);
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">while </span>k &lt; length &amp;&amp; (depth[k] <span class="kw">as </span>i32 == value <span class="kw">as </span>i32) {
<a href=#361 id=361 data-nosnippet>361</a> {
<a href=#362 id=362 data-nosnippet>362</a> reps = reps.wrapping_add(<span class="number">1</span>);
<a href=#363 id=363 data-nosnippet>363</a> }
<a href=#364 id=364 data-nosnippet>364</a> k = k.wrapping_add(<span class="number">1</span>);
<a href=#365 id=365 data-nosnippet>365</a> }
<a href=#366 id=366 data-nosnippet>366</a> <span class="kw">if </span>reps &gt;= <span class="number">3usize </span>&amp;&amp; (value <span class="kw">as </span>i32 == <span class="number">0i32</span>) {
<a href=#367 id=367 data-nosnippet>367</a> total_reps_zero = total_reps_zero.wrapping_add(reps);
<a href=#368 id=368 data-nosnippet>368</a> count_reps_zero = count_reps_zero.wrapping_add(<span class="number">1</span>);
<a href=#369 id=369 data-nosnippet>369</a> }
<a href=#370 id=370 data-nosnippet>370</a> <span class="kw">if </span>reps &gt;= <span class="number">4usize </span>&amp;&amp; (value <span class="kw">as </span><span class="macro">i32 !</span>= <span class="number">0i32</span>) {
<a href=#371 id=371 data-nosnippet>371</a> total_reps_non_zero = total_reps_non_zero.wrapping_add(reps);
<a href=#372 id=372 data-nosnippet>372</a> count_reps_non_zero = count_reps_non_zero.wrapping_add(<span class="number">1</span>);
<a href=#373 id=373 data-nosnippet>373</a> }
<a href=#374 id=374 data-nosnippet>374</a> i = i.wrapping_add(reps);
<a href=#375 id=375 data-nosnippet>375</a> }
<a href=#376 id=376 data-nosnippet>376</a> <span class="kw">let </span>use_rle_for_non_zero = total_reps_non_zero &gt; count_reps_non_zero.wrapping_mul(<span class="number">2</span>);
<a href=#377 id=377 data-nosnippet>377</a> <span class="kw">let </span>use_rle_for_zero = total_reps_zero &gt; count_reps_zero.wrapping_mul(<span class="number">2</span>);
<a href=#378 id=378 data-nosnippet>378</a>
<a href=#379 id=379 data-nosnippet>379</a> (use_rle_for_non_zero, use_rle_for_zero)
<a href=#380 id=380 data-nosnippet>380</a>}
<a href=#381 id=381 data-nosnippet>381</a>
<a href=#382 id=382 data-nosnippet>382</a><span class="kw">fn </span>Reverse(v: <span class="kw-2">&amp;mut </span>[u8], <span class="kw-2">mut </span>start: usize, <span class="kw-2">mut </span>end: usize) {
<a href=#383 id=383 data-nosnippet>383</a> end = end.wrapping_sub(<span class="number">1</span>);
<a href=#384 id=384 data-nosnippet>384</a> <span class="kw">while </span>start &lt; end {
<a href=#385 id=385 data-nosnippet>385</a> v.swap(start, end);
<a href=#386 id=386 data-nosnippet>386</a> start = start.wrapping_add(<span class="number">1</span>);
<a href=#387 id=387 data-nosnippet>387</a> end = end.wrapping_sub(<span class="number">1</span>);
<a href=#388 id=388 data-nosnippet>388</a> }
<a href=#389 id=389 data-nosnippet>389</a>}
<a href=#390 id=390 data-nosnippet>390</a>
<a href=#391 id=391 data-nosnippet>391</a><span class="kw">fn </span>BrotliWriteHuffmanTreeRepetitions(
<a href=#392 id=392 data-nosnippet>392</a> previous_value: u8,
<a href=#393 id=393 data-nosnippet>393</a> value: u8,
<a href=#394 id=394 data-nosnippet>394</a> <span class="kw-2">mut </span>repetitions: usize,
<a href=#395 id=395 data-nosnippet>395</a> tree_size: <span class="kw-2">&amp;mut </span>usize,
<a href=#396 id=396 data-nosnippet>396</a> tree: <span class="kw-2">&amp;mut </span>[u8],
<a href=#397 id=397 data-nosnippet>397</a> extra_bits_data: <span class="kw-2">&amp;mut </span>[u8],
<a href=#398 id=398 data-nosnippet>398</a>) {
<a href=#399 id=399 data-nosnippet>399</a> <span class="kw">if </span>previous_value <span class="kw">as </span><span class="macro">i32 !</span>= value <span class="kw">as </span>i32 {
<a href=#400 id=400 data-nosnippet>400</a> tree[<span class="kw-2">*</span>tree_size] = value;
<a href=#401 id=401 data-nosnippet>401</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#402 id=402 data-nosnippet>402</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#403 id=403 data-nosnippet>403</a> repetitions = repetitions.wrapping_sub(<span class="number">1</span>);
<a href=#404 id=404 data-nosnippet>404</a> }
<a href=#405 id=405 data-nosnippet>405</a> <span class="kw">if </span>repetitions == <span class="number">7usize </span>{
<a href=#406 id=406 data-nosnippet>406</a> tree[<span class="kw-2">*</span>tree_size] = value;
<a href=#407 id=407 data-nosnippet>407</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#408 id=408 data-nosnippet>408</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#409 id=409 data-nosnippet>409</a> repetitions = repetitions.wrapping_sub(<span class="number">1</span>);
<a href=#410 id=410 data-nosnippet>410</a> }
<a href=#411 id=411 data-nosnippet>411</a> <span class="kw">if </span>repetitions &lt; <span class="number">3usize </span>{
<a href=#412 id=412 data-nosnippet>412</a> <span class="kw">for </span>_i <span class="kw">in </span><span class="number">0usize</span>..repetitions {
<a href=#413 id=413 data-nosnippet>413</a> tree[<span class="kw-2">*</span>tree_size] = value;
<a href=#414 id=414 data-nosnippet>414</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#415 id=415 data-nosnippet>415</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#416 id=416 data-nosnippet>416</a> }
<a href=#417 id=417 data-nosnippet>417</a> } <span class="kw">else </span>{
<a href=#418 id=418 data-nosnippet>418</a> <span class="kw">let </span>start: usize = <span class="kw-2">*</span>tree_size;
<a href=#419 id=419 data-nosnippet>419</a> repetitions = repetitions.wrapping_sub(<span class="number">3</span>);
<a href=#420 id=420 data-nosnippet>420</a> <span class="kw">loop </span>{
<a href=#421 id=421 data-nosnippet>421</a> tree[<span class="kw-2">*</span>tree_size] = <span class="number">16u8</span>;
<a href=#422 id=422 data-nosnippet>422</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = (repetitions &amp; <span class="number">0x03</span>) <span class="kw">as </span>u8;
<a href=#423 id=423 data-nosnippet>423</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#424 id=424 data-nosnippet>424</a> repetitions &gt;&gt;= <span class="number">2i32</span>;
<a href=#425 id=425 data-nosnippet>425</a> <span class="kw">if </span>repetitions == <span class="number">0usize </span>{
<a href=#426 id=426 data-nosnippet>426</a> <span class="kw">break</span>;
<a href=#427 id=427 data-nosnippet>427</a> }
<a href=#428 id=428 data-nosnippet>428</a> repetitions = repetitions.wrapping_sub(<span class="number">1</span>);
<a href=#429 id=429 data-nosnippet>429</a> }
<a href=#430 id=430 data-nosnippet>430</a> Reverse(tree, start, <span class="kw-2">*</span>tree_size);
<a href=#431 id=431 data-nosnippet>431</a> Reverse(extra_bits_data, start, <span class="kw-2">*</span>tree_size);
<a href=#432 id=432 data-nosnippet>432</a> }
<a href=#433 id=433 data-nosnippet>433</a>}
<a href=#434 id=434 data-nosnippet>434</a>
<a href=#435 id=435 data-nosnippet>435</a><span class="kw">fn </span>BrotliWriteHuffmanTreeRepetitionsZeros(
<a href=#436 id=436 data-nosnippet>436</a> <span class="kw-2">mut </span>repetitions: usize,
<a href=#437 id=437 data-nosnippet>437</a> tree_size: <span class="kw-2">&amp;mut </span>usize,
<a href=#438 id=438 data-nosnippet>438</a> tree: <span class="kw-2">&amp;mut </span>[u8],
<a href=#439 id=439 data-nosnippet>439</a> extra_bits_data: <span class="kw-2">&amp;mut </span>[u8],
<a href=#440 id=440 data-nosnippet>440</a>) {
<a href=#441 id=441 data-nosnippet>441</a> <span class="kw">if </span>repetitions == <span class="number">11 </span>{
<a href=#442 id=442 data-nosnippet>442</a> tree[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#443 id=443 data-nosnippet>443</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#444 id=444 data-nosnippet>444</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#445 id=445 data-nosnippet>445</a> repetitions = repetitions.wrapping_sub(<span class="number">1</span>);
<a href=#446 id=446 data-nosnippet>446</a> }
<a href=#447 id=447 data-nosnippet>447</a> <span class="kw">if </span>repetitions &lt; <span class="number">3usize </span>{
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw">for </span>_i <span class="kw">in </span><span class="number">0usize</span>..repetitions {
<a href=#449 id=449 data-nosnippet>449</a> tree[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#450 id=450 data-nosnippet>450</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = <span class="number">0u8</span>;
<a href=#451 id=451 data-nosnippet>451</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#452 id=452 data-nosnippet>452</a> }
<a href=#453 id=453 data-nosnippet>453</a> } <span class="kw">else </span>{
<a href=#454 id=454 data-nosnippet>454</a> <span class="kw">let </span>start: usize = <span class="kw-2">*</span>tree_size;
<a href=#455 id=455 data-nosnippet>455</a> repetitions = repetitions.wrapping_sub(<span class="number">3</span>);
<a href=#456 id=456 data-nosnippet>456</a> <span class="kw">loop </span>{
<a href=#457 id=457 data-nosnippet>457</a> tree[<span class="kw-2">*</span>tree_size] = <span class="number">17u8</span>;
<a href=#458 id=458 data-nosnippet>458</a> extra_bits_data[<span class="kw-2">*</span>tree_size] = (repetitions &amp; <span class="number">0x7usize</span>) <span class="kw">as </span>u8;
<a href=#459 id=459 data-nosnippet>459</a> <span class="kw-2">*</span>tree_size = tree_size.wrapping_add(<span class="number">1</span>);
<a href=#460 id=460 data-nosnippet>460</a> repetitions &gt;&gt;= <span class="number">3i32</span>;
<a href=#461 id=461 data-nosnippet>461</a> <span class="kw">if </span>repetitions == <span class="number">0usize </span>{
<a href=#462 id=462 data-nosnippet>462</a> <span class="kw">break</span>;
<a href=#463 id=463 data-nosnippet>463</a> }
<a href=#464 id=464 data-nosnippet>464</a> repetitions = repetitions.wrapping_sub(<span class="number">1</span>);
<a href=#465 id=465 data-nosnippet>465</a> }
<a href=#466 id=466 data-nosnippet>466</a> Reverse(tree, start, <span class="kw-2">*</span>tree_size);
<a href=#467 id=467 data-nosnippet>467</a> Reverse(extra_bits_data, start, <span class="kw-2">*</span>tree_size);
<a href=#468 id=468 data-nosnippet>468</a> }
<a href=#469 id=469 data-nosnippet>469</a>}
<a href=#470 id=470 data-nosnippet>470</a>
<a href=#471 id=471 data-nosnippet>471</a><span class="kw">pub fn </span>BrotliWriteHuffmanTree(
<a href=#472 id=472 data-nosnippet>472</a> depth: <span class="kw-2">&amp;</span>[u8],
<a href=#473 id=473 data-nosnippet>473</a> length: usize,
<a href=#474 id=474 data-nosnippet>474</a> tree_size: <span class="kw-2">&amp;mut </span>usize,
<a href=#475 id=475 data-nosnippet>475</a> tree: <span class="kw-2">&amp;mut </span>[u8],
<a href=#476 id=476 data-nosnippet>476</a> extra_bits_data: <span class="kw-2">&amp;mut </span>[u8],
<a href=#477 id=477 data-nosnippet>477</a>) {
<a href=#478 id=478 data-nosnippet>478</a> <span class="kw">let </span><span class="kw-2">mut </span>previous_value: u8 = <span class="number">8u8</span>;
<a href=#479 id=479 data-nosnippet>479</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#480 id=480 data-nosnippet>480</a> <span class="kw">let </span><span class="kw-2">mut </span>use_rle_for_non_zero = <span class="bool-val">false</span>;
<a href=#481 id=481 data-nosnippet>481</a> <span class="kw">let </span><span class="kw-2">mut </span>use_rle_for_zero = <span class="bool-val">false</span>;
<a href=#482 id=482 data-nosnippet>482</a> <span class="kw">let </span><span class="kw-2">mut </span>new_length: usize = length;
<a href=#483 id=483 data-nosnippet>483</a> i = <span class="number">0usize</span>;
<a href=#484 id=484 data-nosnippet>484</a> <span class="lifetime">'break27</span>: <span class="kw">while </span>i &lt; length {
<a href=#485 id=485 data-nosnippet>485</a> {
<a href=#486 id=486 data-nosnippet>486</a> <span class="kw">if </span>depth[length.wrapping_sub(i).wrapping_sub(<span class="number">1</span>)] <span class="kw">as </span>i32 == <span class="number">0i32 </span>{
<a href=#487 id=487 data-nosnippet>487</a> new_length = new_length.wrapping_sub(<span class="number">1</span>);
<a href=#488 id=488 data-nosnippet>488</a> } <span class="kw">else </span>{
<a href=#489 id=489 data-nosnippet>489</a> <span class="kw">break </span><span class="lifetime">'break27</span>;
<a href=#490 id=490 data-nosnippet>490</a> }
<a href=#491 id=491 data-nosnippet>491</a> }
<a href=#492 id=492 data-nosnippet>492</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#493 id=493 data-nosnippet>493</a> }
<a href=#494 id=494 data-nosnippet>494</a> <span class="kw">if </span>length &gt; <span class="number">50 </span>{
<a href=#495 id=495 data-nosnippet>495</a> (use_rle_for_non_zero, use_rle_for_zero) = decide_over_rle_use(depth, new_length);
<a href=#496 id=496 data-nosnippet>496</a> }
<a href=#497 id=497 data-nosnippet>497</a> i = <span class="number">0usize</span>;
<a href=#498 id=498 data-nosnippet>498</a> <span class="kw">while </span>i &lt; new_length {
<a href=#499 id=499 data-nosnippet>499</a> <span class="kw">let </span>value: u8 = depth[i];
<a href=#500 id=500 data-nosnippet>500</a> <span class="kw">let </span><span class="kw-2">mut </span>reps: usize = <span class="number">1</span>;
<a href=#501 id=501 data-nosnippet>501</a> <span class="kw">if </span><span class="macro">value !</span>= <span class="number">0 </span>&amp;&amp; use_rle_for_non_zero || value == <span class="number">0 </span>&amp;&amp; use_rle_for_zero {
<a href=#502 id=502 data-nosnippet>502</a> <span class="kw">let </span><span class="kw-2">mut </span>k: usize;
<a href=#503 id=503 data-nosnippet>503</a> k = i.wrapping_add(<span class="number">1</span>);
<a href=#504 id=504 data-nosnippet>504</a> <span class="kw">while </span>k &lt; new_length &amp;&amp; (depth[k] <span class="kw">as </span>i32 == value <span class="kw">as </span>i32) {
<a href=#505 id=505 data-nosnippet>505</a> {
<a href=#506 id=506 data-nosnippet>506</a> reps = reps.wrapping_add(<span class="number">1</span>);
<a href=#507 id=507 data-nosnippet>507</a> }
<a href=#508 id=508 data-nosnippet>508</a> k = k.wrapping_add(<span class="number">1</span>);
<a href=#509 id=509 data-nosnippet>509</a> }
<a href=#510 id=510 data-nosnippet>510</a> }
<a href=#511 id=511 data-nosnippet>511</a> <span class="kw">if </span>value <span class="kw">as </span>i32 == <span class="number">0i32 </span>{
<a href=#512 id=512 data-nosnippet>512</a> BrotliWriteHuffmanTreeRepetitionsZeros(reps, tree_size, tree, extra_bits_data);
<a href=#513 id=513 data-nosnippet>513</a> } <span class="kw">else </span>{
<a href=#514 id=514 data-nosnippet>514</a> BrotliWriteHuffmanTreeRepetitions(
<a href=#515 id=515 data-nosnippet>515</a> previous_value,
<a href=#516 id=516 data-nosnippet>516</a> value,
<a href=#517 id=517 data-nosnippet>517</a> reps,
<a href=#518 id=518 data-nosnippet>518</a> tree_size,
<a href=#519 id=519 data-nosnippet>519</a> tree,
<a href=#520 id=520 data-nosnippet>520</a> extra_bits_data,
<a href=#521 id=521 data-nosnippet>521</a> );
<a href=#522 id=522 data-nosnippet>522</a> previous_value = value;
<a href=#523 id=523 data-nosnippet>523</a> }
<a href=#524 id=524 data-nosnippet>524</a> i = i.wrapping_add(reps);
<a href=#525 id=525 data-nosnippet>525</a> }
<a href=#526 id=526 data-nosnippet>526</a>}
<a href=#527 id=527 data-nosnippet>527</a>
<a href=#528 id=528 data-nosnippet>528</a><span class="kw">fn </span>BrotliReverseBits(num_bits: usize, <span class="kw-2">mut </span>bits: u16) -&gt; u16 {
<a href=#529 id=529 data-nosnippet>529</a> <span class="kw">static </span>kLut: [usize; <span class="number">16</span>] = [
<a href=#530 id=530 data-nosnippet>530</a> <span class="number">0x0</span>, <span class="number">0x8</span>, <span class="number">0x4</span>, <span class="number">0xc</span>, <span class="number">0x2</span>, <span class="number">0xa</span>, <span class="number">0x6</span>, <span class="number">0xe</span>, <span class="number">0x1</span>, <span class="number">0x9</span>, <span class="number">0x5</span>, <span class="number">0xd</span>, <span class="number">0x3</span>, <span class="number">0xb</span>, <span class="number">0x7</span>, <span class="number">0xf</span>,
<a href=#531 id=531 data-nosnippet>531</a> ];
<a href=#532 id=532 data-nosnippet>532</a> <span class="kw">let </span><span class="kw-2">mut </span>retval: usize = kLut[(bits <span class="kw">as </span>i32 &amp; <span class="number">0xfi32</span>) <span class="kw">as </span>usize];
<a href=#533 id=533 data-nosnippet>533</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#534 id=534 data-nosnippet>534</a> i = <span class="number">4usize</span>;
<a href=#535 id=535 data-nosnippet>535</a> <span class="kw">while </span>i &lt; num_bits {
<a href=#536 id=536 data-nosnippet>536</a> {
<a href=#537 id=537 data-nosnippet>537</a> retval &lt;&lt;= <span class="number">4i32</span>;
<a href=#538 id=538 data-nosnippet>538</a> bits = (bits <span class="kw">as </span>i32 &gt;&gt; <span class="number">4</span>) <span class="kw">as </span>u16;
<a href=#539 id=539 data-nosnippet>539</a> retval |= kLut[(bits <span class="kw">as </span>i32 &amp; <span class="number">0xfi32</span>) <span class="kw">as </span>usize];
<a href=#540 id=540 data-nosnippet>540</a> }
<a href=#541 id=541 data-nosnippet>541</a> i = i.wrapping_add(<span class="number">4</span>);
<a href=#542 id=542 data-nosnippet>542</a> }
<a href=#543 id=543 data-nosnippet>543</a> retval &gt;&gt;= (<span class="number">0usize</span>.wrapping_sub(num_bits) &amp; <span class="number">0x3usize</span>);
<a href=#544 id=544 data-nosnippet>544</a> retval <span class="kw">as </span>u16
<a href=#545 id=545 data-nosnippet>545</a>}
<a href=#546 id=546 data-nosnippet>546</a><span class="kw">const </span>MAX_HUFFMAN_BITS: usize = <span class="number">16</span>;
<a href=#547 id=547 data-nosnippet>547</a><span class="kw">pub fn </span>BrotliConvertBitDepthsToSymbols(depth: <span class="kw-2">&amp;</span>[u8], len: usize, bits: <span class="kw-2">&amp;mut </span>[u16]) {
<a href=#548 id=548 data-nosnippet>548</a> <span class="comment">/* In Brotli, all bit depths are [1..15]
<a href=#549 id=549 data-nosnippet>549</a> 0 bit depth means that the symbol does not exist. */
<a href=#550 id=550 data-nosnippet>550</a>
<a href=#551 id=551 data-nosnippet>551</a> </span><span class="kw">let </span><span class="kw-2">mut </span>bl_count: [u16; MAX_HUFFMAN_BITS] = [<span class="number">0</span>; MAX_HUFFMAN_BITS];
<a href=#552 id=552 data-nosnippet>552</a> <span class="kw">let </span><span class="kw-2">mut </span>next_code: [u16; MAX_HUFFMAN_BITS] = [<span class="number">0</span>; MAX_HUFFMAN_BITS];
<a href=#553 id=553 data-nosnippet>553</a> <span class="kw">let </span><span class="kw-2">mut </span>code: i32 = <span class="number">0i32</span>;
<a href=#554 id=554 data-nosnippet>554</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..len {
<a href=#555 id=555 data-nosnippet>555</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#556 id=556 data-nosnippet>556</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>bl_count[depth[i] <span class="kw">as </span>usize];
<a href=#557 id=557 data-nosnippet>557</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs <span class="kw">as </span>i32 + _rhs) <span class="kw">as </span>u16;
<a href=#558 id=558 data-nosnippet>558</a> }
<a href=#559 id=559 data-nosnippet>559</a> bl_count[<span class="number">0</span>] = <span class="number">0u16</span>;
<a href=#560 id=560 data-nosnippet>560</a> next_code[<span class="number">0</span>] = <span class="number">0u16</span>;
<a href=#561 id=561 data-nosnippet>561</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">1</span>..MAX_HUFFMAN_BITS {
<a href=#562 id=562 data-nosnippet>562</a> code = (code + bl_count[i - <span class="number">1</span>] <span class="kw">as </span>i32) &lt;&lt; <span class="number">1</span>;
<a href=#563 id=563 data-nosnippet>563</a> next_code[i] = code <span class="kw">as </span>u16;
<a href=#564 id=564 data-nosnippet>564</a> }
<a href=#565 id=565 data-nosnippet>565</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..len {
<a href=#566 id=566 data-nosnippet>566</a> <span class="kw">if </span>depth[i] != <span class="number">0 </span>{
<a href=#567 id=567 data-nosnippet>567</a> bits[i] = BrotliReverseBits(depth[i] <span class="kw">as </span>usize, {
<a href=#568 id=568 data-nosnippet>568</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#569 id=569 data-nosnippet>569</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>next_code[depth[i] <span class="kw">as </span>usize];
<a href=#570 id=570 data-nosnippet>570</a> <span class="kw">let </span>_old = <span class="kw-2">*</span>_lhs;
<a href=#571 id=571 data-nosnippet>571</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs <span class="kw">as </span>i32 + _rhs) <span class="kw">as </span>u16;
<a href=#572 id=572 data-nosnippet>572</a> _old
<a href=#573 id=573 data-nosnippet>573</a> });
<a href=#574 id=574 data-nosnippet>574</a> }
<a href=#575 id=575 data-nosnippet>575</a> }
<a href=#576 id=576 data-nosnippet>576</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,861 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/find_stride.rs`."><title>find_stride.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>find_stride.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core::cmp::{max, min};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::ops::{Index, IndexMut, Range};
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{SliceWrapper, SliceWrapperMut};
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::input_pair::{InputPair, InputReference};
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::interface;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::util::FastLog2;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::alloc_if;
<a href=#10 id=10 data-nosnippet>10</a><span class="comment">// float32 doesn't have enough resolution for blocks of data more than 3.5 megs
<a href=#11 id=11 data-nosnippet>11</a></span><span class="kw">pub type </span>floatY = f64;
<a href=#12 id=12 data-nosnippet>12</a><span class="comment">// the cost of storing a particular population of data including the approx
<a href=#13 id=13 data-nosnippet>13</a>// cost of a huffman table to describe the frequencies of each symbol
<a href=#14 id=14 data-nosnippet>14</a></span><span class="kw">pub fn </span>HuffmanCost(population: <span class="kw-2">&amp;</span>[u32]) -&gt; floatY {
<a href=#15 id=15 data-nosnippet>15</a> <span class="macro">assert_eq!</span>(population.len(), <span class="number">256 </span>* <span class="number">256</span>);
<a href=#16 id=16 data-nosnippet>16</a> <span class="kw">let </span><span class="kw-2">mut </span>cost: floatY = <span class="number">0.0 </span><span class="kw">as </span>floatY;
<a href=#17 id=17 data-nosnippet>17</a> <span class="kw">let </span><span class="kw-2">mut </span>sum: floatY = <span class="number">0.0 </span><span class="kw">as </span>floatY;
<a href=#18 id=18 data-nosnippet>18</a> <span class="kw">let </span><span class="kw-2">mut </span>buckets: floatY = <span class="number">0.0 </span><span class="kw">as </span>floatY;
<a href=#19 id=19 data-nosnippet>19</a> <span class="kw">for </span>pop <span class="kw">in </span>population.iter() {
<a href=#20 id=20 data-nosnippet>20</a> <span class="kw">if </span><span class="kw-2">*</span>pop == <span class="number">0 </span>{
<a href=#21 id=21 data-nosnippet>21</a> <span class="kw">continue</span>;
<a href=#22 id=22 data-nosnippet>22</a> }
<a href=#23 id=23 data-nosnippet>23</a> cost -= <span class="kw-2">*</span>pop <span class="kw">as </span>floatY * FastLog2(<span class="kw-2">*</span>pop <span class="kw">as </span>u64) <span class="kw">as </span>floatY;
<a href=#24 id=24 data-nosnippet>24</a> sum += <span class="kw-2">*</span>pop <span class="kw">as </span>floatY;
<a href=#25 id=25 data-nosnippet>25</a> buckets += <span class="number">1.0 </span><span class="kw">as </span>floatY;
<a href=#26 id=26 data-nosnippet>26</a> }
<a href=#27 id=27 data-nosnippet>27</a>
<a href=#28 id=28 data-nosnippet>28</a> <span class="comment">//println!("Observed {} nonzero buckets with a sum of {}, hc={}", buckets, sum, cost);
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a> </span><span class="number">16.0 </span><span class="kw">as </span>floatY * buckets + cost + sum * FastLog2(sum <span class="kw">as </span>u64) <span class="kw">as </span>floatY
<a href=#31 id=31 data-nosnippet>31</a>}
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a><span class="comment">// this holds a population of data assuming 1 byte of prior for that data
<a href=#34 id=34 data-nosnippet>34</a>// bucket_populations is therefore a 65536-long dynamically allocated buffer
<a href=#35 id=35 data-nosnippet>35</a></span><span class="kw">pub struct </span>EntropyBucketPopulation&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; {
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">pub </span>bucket_populations: AllocU32::AllocatedMemory,
<a href=#37 id=37 data-nosnippet>37</a> <span class="kw">pub </span>cached_bit_entropy: floatY,
<a href=#38 id=38 data-nosnippet>38</a>}
<a href=#39 id=39 data-nosnippet>39</a>
<a href=#40 id=40 data-nosnippet>40</a><span class="kw">impl</span>&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; EntropyBucketPopulation&lt;AllocU32&gt; {
<a href=#41 id=41 data-nosnippet>41</a> <span class="kw">pub fn </span>new(m32: <span class="kw-2">&amp;mut </span>AllocU32) -&gt; <span class="self">Self </span>{
<a href=#42 id=42 data-nosnippet>42</a> <span class="kw">let </span>size = <span class="number">256 </span>* <span class="number">256</span>;
<a href=#43 id=43 data-nosnippet>43</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#44 id=44 data-nosnippet>44</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#45 id=45 data-nosnippet>45</a> bucket_populations: m32.alloc_cell(size),
<a href=#46 id=46 data-nosnippet>46</a> }
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a> <span class="kw">pub fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m32: <span class="kw-2">&amp;mut </span>AllocU32) {
<a href=#49 id=49 data-nosnippet>49</a> m32.free_cell(core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.bucket_populations));
<a href=#50 id=50 data-nosnippet>50</a> }
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">fn </span>clone_from(<span class="kw-2">&amp;mut </span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>EntropyBucketPopulation&lt;AllocU32&gt;) {
<a href=#52 id=52 data-nosnippet>52</a> <span class="self">self</span>.bucket_populations
<a href=#53 id=53 data-nosnippet>53</a> .slice_mut()
<a href=#54 id=54 data-nosnippet>54</a> .clone_from_slice(other.bucket_populations.slice());
<a href=#55 id=55 data-nosnippet>55</a> }
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">fn </span>add_assign(<span class="kw-2">&amp;mut </span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>EntropyBucketPopulation&lt;AllocU32&gt;) {
<a href=#57 id=57 data-nosnippet>57</a> <span class="macro">assert_eq!</span>(
<a href=#58 id=58 data-nosnippet>58</a> <span class="self">self</span>.bucket_populations.slice().len(),
<a href=#59 id=59 data-nosnippet>59</a> other.bucket_populations.slice().len()
<a href=#60 id=60 data-nosnippet>60</a> );
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">for </span>(item, other_item) <span class="kw">in </span><span class="self">self
<a href=#62 id=62 data-nosnippet>62</a> </span>.bucket_populations
<a href=#63 id=63 data-nosnippet>63</a> .slice_mut()
<a href=#64 id=64 data-nosnippet>64</a> .iter_mut()
<a href=#65 id=65 data-nosnippet>65</a> .zip(other.bucket_populations.slice().iter())
<a href=#66 id=66 data-nosnippet>66</a> {
<a href=#67 id=67 data-nosnippet>67</a> <span class="kw-2">*</span>item += <span class="kw-2">*</span>other_item;
<a href=#68 id=68 data-nosnippet>68</a> }
<a href=#69 id=69 data-nosnippet>69</a> <span class="self">self</span>.cached_bit_entropy = HuffmanCost(<span class="self">self</span>.bucket_populations.slice());
<a href=#70 id=70 data-nosnippet>70</a> }
<a href=#71 id=71 data-nosnippet>71</a> <span class="comment">// clear the allocated memory and reset literal population to zero
<a href=#72 id=72 data-nosnippet>72</a> </span><span class="kw">fn </span>bzero(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#73 id=73 data-nosnippet>73</a> <span class="self">self</span>.cached_bit_entropy = <span class="number">0.0</span>;
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">for </span>bp <span class="kw">in </span><span class="self">self</span>.bucket_populations.slice_mut().iter_mut() {
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw-2">*</span>bp = <span class="number">0</span>;
<a href=#76 id=76 data-nosnippet>76</a> }
<a href=#77 id=77 data-nosnippet>77</a> }
<a href=#78 id=78 data-nosnippet>78</a> <span class="comment">// setup population to the sum of an array of populations where the stride of that row matches. Additionally allow another optional
<a href=#79 id=79 data-nosnippet>79</a> </span><span class="kw">fn </span>initiate_from(
<a href=#80 id=80 data-nosnippet>80</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#81 id=81 data-nosnippet>81</a> rows: [<span class="kw-2">&amp;</span>[<span class="self">Self</span>]; <span class="number">2</span>],
<a href=#82 id=82 data-nosnippet>82</a> rows_stride: [<span class="kw-2">&amp;</span>[u8]; <span class="number">2</span>],
<a href=#83 id=83 data-nosnippet>83</a> stride: u8,
<a href=#84 id=84 data-nosnippet>84</a> do_clear: bool,
<a href=#85 id=85 data-nosnippet>85</a> ) {
<a href=#86 id=86 data-nosnippet>86</a> <span class="self">self</span>.cached_bit_entropy = <span class="number">0.0</span>;
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">let </span><span class="kw-2">mut </span>found_any = <span class="bool-val">false</span>;
<a href=#88 id=88 data-nosnippet>88</a> <span class="kw">for </span>(sub_row, sub_stride) <span class="kw">in </span>rows.iter().zip(rows_stride.iter()) {
<a href=#89 id=89 data-nosnippet>89</a> <span class="kw">for </span>(item, istride) <span class="kw">in </span>sub_row.iter().zip(sub_stride.iter()) {
<a href=#90 id=90 data-nosnippet>90</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">istride !</span>= stride {
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw">continue</span>; <span class="comment">// if we chain, then optional was already filtered by stride
<a href=#92 id=92 data-nosnippet>92</a> </span>}
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">if </span>do_clear &amp;&amp; !found_any {
<a href=#94 id=94 data-nosnippet>94</a> <span class="self">self</span>.bucket_populations
<a href=#95 id=95 data-nosnippet>95</a> .slice_mut()
<a href=#96 id=96 data-nosnippet>96</a> .clone_from_slice(item.bucket_populations.slice());
<a href=#97 id=97 data-nosnippet>97</a> found_any = <span class="bool-val">true</span>;
<a href=#98 id=98 data-nosnippet>98</a> } <span class="kw">else </span>{
<a href=#99 id=99 data-nosnippet>99</a> <span class="kw">for </span>(dst, src) <span class="kw">in </span><span class="self">self
<a href=#100 id=100 data-nosnippet>100</a> </span>.bucket_populations
<a href=#101 id=101 data-nosnippet>101</a> .slice_mut()
<a href=#102 id=102 data-nosnippet>102</a> .iter_mut()
<a href=#103 id=103 data-nosnippet>103</a> .zip(item.bucket_populations.slice().iter())
<a href=#104 id=104 data-nosnippet>104</a> {
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw-2">*</span>dst += <span class="kw-2">*</span>src;
<a href=#106 id=106 data-nosnippet>106</a> }
<a href=#107 id=107 data-nosnippet>107</a> }
<a href=#108 id=108 data-nosnippet>108</a> }
<a href=#109 id=109 data-nosnippet>109</a> }
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">if </span>do_clear &amp;&amp; !found_any {
<a href=#111 id=111 data-nosnippet>111</a> <span class="self">self</span>.bzero();
<a href=#112 id=112 data-nosnippet>112</a> } <span class="kw">else </span>{
<a href=#113 id=113 data-nosnippet>113</a> <span class="self">self</span>.cached_bit_entropy = HuffmanCost(<span class="self">self</span>.bucket_populations.slice());
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a> }
<a href=#116 id=116 data-nosnippet>116</a> <span class="kw">fn </span>bit_cost_of_data_subset(
<a href=#117 id=117 data-nosnippet>117</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#118 id=118 data-nosnippet>118</a> data0: <span class="kw-2">&amp;</span>[u8],
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw-2">mut </span>stride: u8,
<a href=#120 id=120 data-nosnippet>120</a> <span class="kw-2">mut </span>prev_bytes: [u8; NUM_STRIDES],
<a href=#121 id=121 data-nosnippet>121</a> scratch: <span class="kw-2">&amp;mut </span>EntropyBucketPopulation&lt;AllocU32&gt;,
<a href=#122 id=122 data-nosnippet>122</a> ) -&gt; floatY {
<a href=#123 id=123 data-nosnippet>123</a> prev_bytes.reverse();
<a href=#124 id=124 data-nosnippet>124</a> stride = max(<span class="number">1</span>, stride); <span class="comment">// we return stride=1 to mean 1 away
<a href=#125 id=125 data-nosnippet>125</a> </span>scratch
<a href=#126 id=126 data-nosnippet>126</a> .bucket_populations
<a href=#127 id=127 data-nosnippet>127</a> .slice_mut()
<a href=#128 id=128 data-nosnippet>128</a> .clone_from_slice(<span class="self">self</span>.bucket_populations.slice());
<a href=#129 id=129 data-nosnippet>129</a> scratch.bucket_populations.slice_mut()[<span class="number">65535</span>] += <span class="number">1</span>; <span class="comment">// to demonstrate that we have
<a href=#130 id=130 data-nosnippet>130</a> </span>scratch.bucket_populations.slice_mut()[<span class="number">65535</span>] -= <span class="number">1</span>; <span class="comment">// to demonstrate that we have write capability
<a href=#131 id=131 data-nosnippet>131</a> </span><span class="kw">let </span><span class="kw-2">mut </span>stray_count = <span class="number">0.0 </span><span class="kw">as </span>floatY;
<a href=#132 id=132 data-nosnippet>132</a> <span class="macro">assert_eq!</span>((NUM_STRIDES - <span class="number">1</span>) &amp; NUM_STRIDES, <span class="number">0</span>); <span class="comment">// must be power of two
<a href=#133 id=133 data-nosnippet>133</a> </span><span class="kw">for </span>(index, val) <span class="kw">in </span>data0.iter().enumerate() {
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">let </span>prior_byte =
<a href=#135 id=135 data-nosnippet>135</a> prev_bytes[(index + (NUM_STRIDES - stride <span class="kw">as </span>usize)) &amp; (NUM_STRIDES - <span class="number">1</span>)];
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">let </span>loc = <span class="kw-2">&amp;mut </span>scratch.bucket_populations.slice_mut()
<a href=#137 id=137 data-nosnippet>137</a> [prior_byte <span class="kw">as </span>usize * <span class="number">256 </span>+ <span class="kw-2">*</span>val <span class="kw">as </span>usize];
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">if </span><span class="kw-2">*</span>loc == <span class="number">0 </span>{
<a href=#139 id=139 data-nosnippet>139</a> stray_count += <span class="number">1.0</span>;
<a href=#140 id=140 data-nosnippet>140</a> } <span class="kw">else </span>{
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw-2">*</span>loc -= <span class="number">1</span>;
<a href=#142 id=142 data-nosnippet>142</a> }
<a href=#143 id=143 data-nosnippet>143</a> prev_bytes[index &amp; (NUM_STRIDES - <span class="number">1</span>)] = <span class="kw-2">*</span>val;
<a href=#144 id=144 data-nosnippet>144</a> }
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">if </span><span class="self">self</span>.cached_bit_entropy == <span class="number">0.0 </span><span class="kw">as </span>floatY {
<a href=#146 id=146 data-nosnippet>146</a> <span class="self">self</span>.cached_bit_entropy = HuffmanCost(<span class="self">self</span>.bucket_populations.slice());
<a href=#147 id=147 data-nosnippet>147</a> }
<a href=#148 id=148 data-nosnippet>148</a> <span class="macro">debug_assert_eq!</span>(
<a href=#149 id=149 data-nosnippet>149</a> HuffmanCost(<span class="self">self</span>.bucket_populations.slice()),
<a href=#150 id=150 data-nosnippet>150</a> <span class="self">self</span>.cached_bit_entropy
<a href=#151 id=151 data-nosnippet>151</a> );
<a href=#152 id=152 data-nosnippet>152</a>
<a href=#153 id=153 data-nosnippet>153</a> scratch.cached_bit_entropy = HuffmanCost(scratch.bucket_populations.slice());
<a href=#154 id=154 data-nosnippet>154</a> <span class="self">self</span>.cached_bit_entropy - scratch.cached_bit_entropy + stray_count * <span class="number">8.0
<a href=#155 id=155 data-nosnippet>155</a> </span>}
<a href=#156 id=156 data-nosnippet>156</a>}
<a href=#157 id=157 data-nosnippet>157</a>
<a href=#158 id=158 data-nosnippet>158</a><span class="kw">const </span>NUM_STRIDES: usize = <span class="number">8</span>;
<a href=#159 id=159 data-nosnippet>159</a><span class="attr">#[derive(Copy, Clone)]
<a href=#160 id=160 data-nosnippet>160</a></span><span class="kw">pub struct </span>BucketPopIndex {
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">pub </span>val: u8,
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">pub </span>six_bits: u8,
<a href=#163 id=163 data-nosnippet>163</a> <span class="kw">pub </span>stride: u8,
<a href=#164 id=164 data-nosnippet>164</a>}
<a href=#165 id=165 data-nosnippet>165</a>
<a href=#166 id=166 data-nosnippet>166</a><span class="kw">impl</span>&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; Index&lt;BucketPopIndex&gt; <span class="kw">for </span>EntropyBucketPopulation&lt;AllocU32&gt; {
<a href=#167 id=167 data-nosnippet>167</a> <span class="kw">type </span>Output = u32;
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: BucketPopIndex) -&gt; <span class="kw-2">&amp;</span>u32 {
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw-2">&amp;</span><span class="self">self</span>.bucket_populations.slice()
<a href=#170 id=170 data-nosnippet>170</a> [index.val <span class="kw">as </span>usize + index.six_bits <span class="kw">as </span>usize * <span class="number">256 </span>+ index.stride <span class="kw">as </span>usize * <span class="number">256 </span>* <span class="number">64</span>]
<a href=#171 id=171 data-nosnippet>171</a> }
<a href=#172 id=172 data-nosnippet>172</a>}
<a href=#173 id=173 data-nosnippet>173</a><span class="kw">impl</span>&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; IndexMut&lt;BucketPopIndex&gt;
<a href=#174 id=174 data-nosnippet>174</a> <span class="kw">for </span>EntropyBucketPopulation&lt;AllocU32&gt;
<a href=#175 id=175 data-nosnippet>175</a>{
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">fn </span>index_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>, index: BucketPopIndex) -&gt; <span class="kw-2">&amp;mut </span>u32 {
<a href=#177 id=177 data-nosnippet>177</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.bucket_populations.slice_mut()
<a href=#178 id=178 data-nosnippet>178</a> [index.val <span class="kw">as </span>usize + index.six_bits <span class="kw">as </span>usize * <span class="number">256 </span>+ index.stride <span class="kw">as </span>usize * <span class="number">256 </span>* <span class="number">64</span>]
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a>}
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a><span class="kw">pub struct </span>EntropyTally&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; {
<a href=#183 id=183 data-nosnippet>183</a> pop: [EntropyBucketPopulation&lt;AllocU32&gt;; NUM_STRIDES],
<a href=#184 id=184 data-nosnippet>184</a>}
<a href=#185 id=185 data-nosnippet>185</a>
<a href=#186 id=186 data-nosnippet>186</a><span class="kw">const </span>NUM_LEVELS: usize = <span class="number">4</span>;
<a href=#187 id=187 data-nosnippet>187</a><span class="kw">const </span>NUM_NODES: usize = (<span class="number">1 </span>&lt;&lt; (NUM_LEVELS)) - <span class="number">1</span>;
<a href=#188 id=188 data-nosnippet>188</a><span class="kw">pub const </span>NUM_LEAF_NODES: usize = (NUM_NODES + <span class="number">1</span>) &gt;&gt; <span class="number">1</span>;
<a href=#189 id=189 data-nosnippet>189</a>
<a href=#190 id=190 data-nosnippet>190</a><span class="kw">pub struct </span>EntropyPyramid&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; {
<a href=#191 id=191 data-nosnippet>191</a> pop: [EntropyBucketPopulation&lt;AllocU32&gt;; NUM_NODES],
<a href=#192 id=192 data-nosnippet>192</a> stride: [u8; NUM_NODES],
<a href=#193 id=193 data-nosnippet>193</a>}
<a href=#194 id=194 data-nosnippet>194</a>
<a href=#195 id=195 data-nosnippet>195</a><span class="kw">impl</span>&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; EntropyPyramid&lt;AllocU32&gt; {
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw">pub fn </span>last_level_range(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; Range&lt;usize&gt; {
<a href=#197 id=197 data-nosnippet>197</a> (NUM_NODES - (<span class="number">1 </span>&lt;&lt; (NUM_LEVELS - <span class="number">1</span>)))..NUM_NODES
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">pub fn </span>byte_index_to_pyramid_index(<span class="kw-2">&amp;</span><span class="self">self</span>, byte_index: usize, metablock_size: usize) -&gt; usize {
<a href=#200 id=200 data-nosnippet>200</a> <span class="kw">let </span>range = <span class="self">self</span>.last_level_range();
<a href=#201 id=201 data-nosnippet>201</a> min(
<a href=#202 id=202 data-nosnippet>202</a> range.start + (range.end - range.start) * byte_index / metablock_size,
<a href=#203 id=203 data-nosnippet>203</a> range.end - <span class="number">1</span>,
<a href=#204 id=204 data-nosnippet>204</a> ) <span class="comment">// since we tally after the end of the literal block, it could be after the pyramid
<a href=#205 id=205 data-nosnippet>205</a> </span>}
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">pub fn </span>reset_scratch_to_deepest_level(<span class="kw-2">&amp;</span><span class="self">self</span>, output: <span class="kw-2">&amp;mut </span>EntropyTally&lt;AllocU32&gt;) {
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">let </span><span class="kw-2">mut </span>has_modified = [<span class="bool-val">false</span>; NUM_STRIDES];
<a href=#208 id=208 data-nosnippet>208</a> <span class="comment">//println!("Last level range {:?}", self.last_level_range());
<a href=#209 id=209 data-nosnippet>209</a> </span><span class="kw">for </span>index <span class="kw">in </span><span class="self">self</span>.last_level_range() {
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">if </span>has_modified[<span class="self">self</span>.stride[index] <span class="kw">as </span>usize] {
<a href=#211 id=211 data-nosnippet>211</a> output.pop[<span class="self">self</span>.stride[index] <span class="kw">as </span>usize].add_assign(<span class="kw-2">&amp;</span><span class="self">self</span>.pop[index]);
<a href=#212 id=212 data-nosnippet>212</a> } <span class="kw">else </span>{
<a href=#213 id=213 data-nosnippet>213</a> output.pop[<span class="self">self</span>.stride[index] <span class="kw">as </span>usize].clone_from(<span class="kw-2">&amp;</span><span class="self">self</span>.pop[index]);
<a href=#214 id=214 data-nosnippet>214</a> has_modified[<span class="self">self</span>.stride[index] <span class="kw">as </span>usize] = <span class="bool-val">true</span>;
<a href=#215 id=215 data-nosnippet>215</a> }
<a href=#216 id=216 data-nosnippet>216</a> }
<a href=#217 id=217 data-nosnippet>217</a> <span class="kw">for </span>stride <span class="kw">in </span><span class="number">0</span>..NUM_STRIDES {
<a href=#218 id=218 data-nosnippet>218</a> <span class="kw">if </span>!has_modified[stride] {
<a href=#219 id=219 data-nosnippet>219</a> output.pop[stride].bzero();
<a href=#220 id=220 data-nosnippet>220</a> output.pop[stride].cached_bit_entropy = <span class="number">0.0</span>;
<a href=#221 id=221 data-nosnippet>221</a> } <span class="kw">else </span>{
<a href=#222 id=222 data-nosnippet>222</a> output.pop[stride].cached_bit_entropy =
<a href=#223 id=223 data-nosnippet>223</a> HuffmanCost(output.pop[stride].bucket_populations.slice());
<a href=#224 id=224 data-nosnippet>224</a> }
<a href=#225 id=225 data-nosnippet>225</a> <span class="comment">//println!("BASE PYRAMID {} = {}", stride,output.pop[stride].cached_bit_entropy);
<a href=#226 id=226 data-nosnippet>226</a> </span>}
<a href=#227 id=227 data-nosnippet>227</a> }
<a href=#228 id=228 data-nosnippet>228</a> <span class="kw">pub fn </span>stride_last_level_range(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [u8; NUM_LEAF_NODES] {
<a href=#229 id=229 data-nosnippet>229</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = [<span class="number">0u8</span>; NUM_LEAF_NODES];
<a href=#230 id=230 data-nosnippet>230</a> ret.clone_from_slice(<span class="self">self</span>.stride.split_at(<span class="self">self</span>.stride.len() - NUM_LEAF_NODES).<span class="number">1</span>);
<a href=#231 id=231 data-nosnippet>231</a> ret
<a href=#232 id=232 data-nosnippet>232</a> }
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw">pub fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m32: <span class="kw-2">&amp;mut </span>AllocU32) {
<a href=#234 id=234 data-nosnippet>234</a> <span class="kw">for </span>item <span class="kw">in </span><span class="self">self</span>.pop.iter_mut() {
<a href=#235 id=235 data-nosnippet>235</a> item.free(m32);
<a href=#236 id=236 data-nosnippet>236</a> }
<a href=#237 id=237 data-nosnippet>237</a> }
<a href=#238 id=238 data-nosnippet>238</a> <span class="kw">pub fn </span>disabled_placeholder(_m32: <span class="kw-2">&amp;mut </span>AllocU32) -&gt; <span class="self">Self </span>{
<a href=#239 id=239 data-nosnippet>239</a> EntropyPyramid::&lt;AllocU32&gt; {
<a href=#240 id=240 data-nosnippet>240</a> pop: [
<a href=#241 id=241 data-nosnippet>241</a> EntropyBucketPopulation {
<a href=#242 id=242 data-nosnippet>242</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#243 id=243 data-nosnippet>243</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#244 id=244 data-nosnippet>244</a> },
<a href=#245 id=245 data-nosnippet>245</a> EntropyBucketPopulation {
<a href=#246 id=246 data-nosnippet>246</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#247 id=247 data-nosnippet>247</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#248 id=248 data-nosnippet>248</a> },
<a href=#249 id=249 data-nosnippet>249</a> EntropyBucketPopulation {
<a href=#250 id=250 data-nosnippet>250</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#251 id=251 data-nosnippet>251</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#252 id=252 data-nosnippet>252</a> },
<a href=#253 id=253 data-nosnippet>253</a> EntropyBucketPopulation {
<a href=#254 id=254 data-nosnippet>254</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#255 id=255 data-nosnippet>255</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#256 id=256 data-nosnippet>256</a> },
<a href=#257 id=257 data-nosnippet>257</a> EntropyBucketPopulation {
<a href=#258 id=258 data-nosnippet>258</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#259 id=259 data-nosnippet>259</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#260 id=260 data-nosnippet>260</a> },
<a href=#261 id=261 data-nosnippet>261</a> EntropyBucketPopulation {
<a href=#262 id=262 data-nosnippet>262</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#263 id=263 data-nosnippet>263</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#264 id=264 data-nosnippet>264</a> },
<a href=#265 id=265 data-nosnippet>265</a> EntropyBucketPopulation {
<a href=#266 id=266 data-nosnippet>266</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#267 id=267 data-nosnippet>267</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#268 id=268 data-nosnippet>268</a> },
<a href=#269 id=269 data-nosnippet>269</a> EntropyBucketPopulation {
<a href=#270 id=270 data-nosnippet>270</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#271 id=271 data-nosnippet>271</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#272 id=272 data-nosnippet>272</a> },
<a href=#273 id=273 data-nosnippet>273</a> EntropyBucketPopulation {
<a href=#274 id=274 data-nosnippet>274</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#275 id=275 data-nosnippet>275</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#276 id=276 data-nosnippet>276</a> },
<a href=#277 id=277 data-nosnippet>277</a> EntropyBucketPopulation {
<a href=#278 id=278 data-nosnippet>278</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#279 id=279 data-nosnippet>279</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#280 id=280 data-nosnippet>280</a> },
<a href=#281 id=281 data-nosnippet>281</a> EntropyBucketPopulation {
<a href=#282 id=282 data-nosnippet>282</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#283 id=283 data-nosnippet>283</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#284 id=284 data-nosnippet>284</a> },
<a href=#285 id=285 data-nosnippet>285</a> EntropyBucketPopulation {
<a href=#286 id=286 data-nosnippet>286</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#287 id=287 data-nosnippet>287</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#288 id=288 data-nosnippet>288</a> },
<a href=#289 id=289 data-nosnippet>289</a> EntropyBucketPopulation {
<a href=#290 id=290 data-nosnippet>290</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#291 id=291 data-nosnippet>291</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#292 id=292 data-nosnippet>292</a> },
<a href=#293 id=293 data-nosnippet>293</a> EntropyBucketPopulation {
<a href=#294 id=294 data-nosnippet>294</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#295 id=295 data-nosnippet>295</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#296 id=296 data-nosnippet>296</a> },
<a href=#297 id=297 data-nosnippet>297</a> EntropyBucketPopulation {
<a href=#298 id=298 data-nosnippet>298</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#299 id=299 data-nosnippet>299</a> bucket_populations: AllocU32::AllocatedMemory::default(),
<a href=#300 id=300 data-nosnippet>300</a> },
<a href=#301 id=301 data-nosnippet>301</a> ],
<a href=#302 id=302 data-nosnippet>302</a> stride: [<span class="number">0</span>; NUM_NODES],
<a href=#303 id=303 data-nosnippet>303</a> }
<a href=#304 id=304 data-nosnippet>304</a> }
<a href=#305 id=305 data-nosnippet>305</a> <span class="kw">pub fn </span>new(m32: <span class="kw-2">&amp;mut </span>AllocU32) -&gt; <span class="self">Self </span>{
<a href=#306 id=306 data-nosnippet>306</a> <span class="kw">let </span>size = <span class="number">256 </span>* <span class="number">256</span>;
<a href=#307 id=307 data-nosnippet>307</a> EntropyPyramid::&lt;AllocU32&gt; {
<a href=#308 id=308 data-nosnippet>308</a> pop: [
<a href=#309 id=309 data-nosnippet>309</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#310 id=310 data-nosnippet>310</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#311 id=311 data-nosnippet>311</a> bucket_populations: m32.alloc_cell(size),
<a href=#312 id=312 data-nosnippet>312</a> },
<a href=#313 id=313 data-nosnippet>313</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#314 id=314 data-nosnippet>314</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#315 id=315 data-nosnippet>315</a> bucket_populations: m32.alloc_cell(size),
<a href=#316 id=316 data-nosnippet>316</a> },
<a href=#317 id=317 data-nosnippet>317</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#318 id=318 data-nosnippet>318</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#319 id=319 data-nosnippet>319</a> bucket_populations: m32.alloc_cell(size),
<a href=#320 id=320 data-nosnippet>320</a> },
<a href=#321 id=321 data-nosnippet>321</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#322 id=322 data-nosnippet>322</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#323 id=323 data-nosnippet>323</a> bucket_populations: m32.alloc_cell(size),
<a href=#324 id=324 data-nosnippet>324</a> },
<a href=#325 id=325 data-nosnippet>325</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#326 id=326 data-nosnippet>326</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#327 id=327 data-nosnippet>327</a> bucket_populations: m32.alloc_cell(size),
<a href=#328 id=328 data-nosnippet>328</a> },
<a href=#329 id=329 data-nosnippet>329</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#330 id=330 data-nosnippet>330</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#331 id=331 data-nosnippet>331</a> bucket_populations: m32.alloc_cell(size),
<a href=#332 id=332 data-nosnippet>332</a> },
<a href=#333 id=333 data-nosnippet>333</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#334 id=334 data-nosnippet>334</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#335 id=335 data-nosnippet>335</a> bucket_populations: m32.alloc_cell(size),
<a href=#336 id=336 data-nosnippet>336</a> },
<a href=#337 id=337 data-nosnippet>337</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#338 id=338 data-nosnippet>338</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#339 id=339 data-nosnippet>339</a> bucket_populations: m32.alloc_cell(size),
<a href=#340 id=340 data-nosnippet>340</a> },
<a href=#341 id=341 data-nosnippet>341</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#342 id=342 data-nosnippet>342</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#343 id=343 data-nosnippet>343</a> bucket_populations: m32.alloc_cell(size),
<a href=#344 id=344 data-nosnippet>344</a> },
<a href=#345 id=345 data-nosnippet>345</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#346 id=346 data-nosnippet>346</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#347 id=347 data-nosnippet>347</a> bucket_populations: m32.alloc_cell(size),
<a href=#348 id=348 data-nosnippet>348</a> },
<a href=#349 id=349 data-nosnippet>349</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#350 id=350 data-nosnippet>350</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#351 id=351 data-nosnippet>351</a> bucket_populations: m32.alloc_cell(size),
<a href=#352 id=352 data-nosnippet>352</a> },
<a href=#353 id=353 data-nosnippet>353</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#354 id=354 data-nosnippet>354</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#355 id=355 data-nosnippet>355</a> bucket_populations: m32.alloc_cell(size),
<a href=#356 id=356 data-nosnippet>356</a> },
<a href=#357 id=357 data-nosnippet>357</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#358 id=358 data-nosnippet>358</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#359 id=359 data-nosnippet>359</a> bucket_populations: m32.alloc_cell(size),
<a href=#360 id=360 data-nosnippet>360</a> },
<a href=#361 id=361 data-nosnippet>361</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#362 id=362 data-nosnippet>362</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#363 id=363 data-nosnippet>363</a> bucket_populations: m32.alloc_cell(size),
<a href=#364 id=364 data-nosnippet>364</a> },
<a href=#365 id=365 data-nosnippet>365</a> EntropyBucketPopulation::&lt;AllocU32&gt; {
<a href=#366 id=366 data-nosnippet>366</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#367 id=367 data-nosnippet>367</a> bucket_populations: m32.alloc_cell(size),
<a href=#368 id=368 data-nosnippet>368</a> },
<a href=#369 id=369 data-nosnippet>369</a> ],
<a href=#370 id=370 data-nosnippet>370</a> stride: [<span class="number">0</span>; NUM_NODES],
<a href=#371 id=371 data-nosnippet>371</a> }
<a href=#372 id=372 data-nosnippet>372</a> }
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw">pub fn </span>bit_cost_of_literals(
<a href=#374 id=374 data-nosnippet>374</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#375 id=375 data-nosnippet>375</a> data0: <span class="kw-2">&amp;</span>[u8],
<a href=#376 id=376 data-nosnippet>376</a> start_index: u32,
<a href=#377 id=377 data-nosnippet>377</a> metablock_len: usize,
<a href=#378 id=378 data-nosnippet>378</a> stride: u8,
<a href=#379 id=379 data-nosnippet>379</a> previous_bytes: [u8; NUM_STRIDES],
<a href=#380 id=380 data-nosnippet>380</a> scratch: <span class="kw-2">&amp;mut </span>EntropyTally&lt;AllocU32&gt;,
<a href=#381 id=381 data-nosnippet>381</a> ) -&gt; floatY {
<a href=#382 id=382 data-nosnippet>382</a> <span class="macro">assert!</span>(stride <span class="kw">as </span>usize &lt;= NUM_STRIDES);
<a href=#383 id=383 data-nosnippet>383</a>
<a href=#384 id=384 data-nosnippet>384</a> <span class="self">self</span>.pop[<span class="self">self</span>.byte_index_to_pyramid_index(start_index <span class="kw">as </span>usize, metablock_len)]
<a href=#385 id=385 data-nosnippet>385</a> .bit_cost_of_data_subset(data0, stride, previous_bytes, <span class="kw-2">&amp;mut </span>scratch.pop[<span class="number">0</span>])
<a href=#386 id=386 data-nosnippet>386</a> }
<a href=#387 id=387 data-nosnippet>387</a> <span class="kw">fn </span>populate_entry_stride1(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: InputPair, index: u32) {
<a href=#388 id=388 data-nosnippet>388</a> <span class="kw">let </span><span class="kw-2">mut </span>prev_val = <span class="number">0</span>;
<a href=#389 id=389 data-nosnippet>389</a> <span class="kw">let </span>pyr_item = <span class="kw-2">&amp;mut </span><span class="self">self</span>.pop[index <span class="kw">as </span>usize];
<a href=#390 id=390 data-nosnippet>390</a> pyr_item.bzero();
<a href=#391 id=391 data-nosnippet>391</a> <span class="macro">assert_eq!</span>(pyr_item.bucket_populations.slice()[<span class="number">65535</span>], <span class="number">0</span>);
<a href=#392 id=392 data-nosnippet>392</a> <span class="kw">for </span>val <span class="kw">in </span>input.<span class="number">0</span>.slice().iter().chain(input.<span class="number">1</span>.slice().iter()) {
<a href=#393 id=393 data-nosnippet>393</a> pyr_item.bucket_populations.slice_mut()[prev_val <span class="kw">as </span>usize * <span class="number">256 </span>+ <span class="kw-2">*</span>val <span class="kw">as </span>usize] += <span class="number">1</span>;
<a href=#394 id=394 data-nosnippet>394</a> prev_val = <span class="kw-2">*</span>val;
<a href=#395 id=395 data-nosnippet>395</a> }
<a href=#396 id=396 data-nosnippet>396</a> pyr_item.cached_bit_entropy = HuffmanCost(pyr_item.bucket_populations.slice());
<a href=#397 id=397 data-nosnippet>397</a> <span class="self">self</span>.stride[index <span class="kw">as </span>usize] = <span class="number">0</span>;
<a href=#398 id=398 data-nosnippet>398</a> }
<a href=#399 id=399 data-nosnippet>399</a> <span class="kw">fn </span>populate_entry(
<a href=#400 id=400 data-nosnippet>400</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#401 id=401 data-nosnippet>401</a> input: InputPair,
<a href=#402 id=402 data-nosnippet>402</a> scratch: <span class="kw-2">&amp;mut </span>EntropyTally&lt;AllocU32&gt;,
<a href=#403 id=403 data-nosnippet>403</a> index: u32,
<a href=#404 id=404 data-nosnippet>404</a> mirror_range: <span class="prelude-ty">Option</span>&lt;Range&lt;usize&gt;&gt;,
<a href=#405 id=405 data-nosnippet>405</a> prev_range: <span class="prelude-ty">Option</span>&lt;Range&lt;usize&gt;&gt;,
<a href=#406 id=406 data-nosnippet>406</a> ) {
<a href=#407 id=407 data-nosnippet>407</a> <span class="kw">let </span><span class="kw-2">mut </span>initial_entropies = [<span class="number">0.0 </span><span class="kw">as </span>floatY; NUM_STRIDES];
<a href=#408 id=408 data-nosnippet>408</a> <span class="kw">let </span>nothing: <span class="kw-2">&amp;</span>[EntropyBucketPopulation&lt;AllocU32&gt;] = <span class="kw-2">&amp;</span>[];
<a href=#409 id=409 data-nosnippet>409</a> <span class="kw">let </span>nothing_u8: <span class="kw-2">&amp;</span>[u8] = <span class="kw-2">&amp;</span>[];
<a href=#410 id=410 data-nosnippet>410</a> {
<a href=#411 id=411 data-nosnippet>411</a> <span class="kw">let </span>pop_ranges = [
<a href=#412 id=412 data-nosnippet>412</a> <span class="kw">match </span>mirror_range {
<a href=#413 id=413 data-nosnippet>413</a> <span class="prelude-val">None </span>=&gt; nothing,
<a href=#414 id=414 data-nosnippet>414</a> <span class="prelude-val">Some</span>(<span class="kw-2">ref </span>ir) =&gt; <span class="kw-2">&amp;</span><span class="self">self</span>.pop[ir.clone()],
<a href=#415 id=415 data-nosnippet>415</a> },
<a href=#416 id=416 data-nosnippet>416</a> <span class="kw">match </span>prev_range {
<a href=#417 id=417 data-nosnippet>417</a> <span class="prelude-val">None </span>=&gt; nothing,
<a href=#418 id=418 data-nosnippet>418</a> <span class="prelude-val">Some</span>(<span class="kw-2">ref </span>pr) =&gt; <span class="kw-2">&amp;</span><span class="self">self</span>.pop[pr.clone()],
<a href=#419 id=419 data-nosnippet>419</a> },
<a href=#420 id=420 data-nosnippet>420</a> ];
<a href=#421 id=421 data-nosnippet>421</a> <span class="kw">let </span>stride_ranges = [
<a href=#422 id=422 data-nosnippet>422</a> <span class="kw">match </span>mirror_range {
<a href=#423 id=423 data-nosnippet>423</a> <span class="prelude-val">None </span>=&gt; nothing_u8,
<a href=#424 id=424 data-nosnippet>424</a> <span class="prelude-val">Some</span>(<span class="kw-2">ref </span>ir) =&gt; <span class="kw-2">&amp;</span><span class="self">self</span>.stride[ir.clone()],
<a href=#425 id=425 data-nosnippet>425</a> },
<a href=#426 id=426 data-nosnippet>426</a> <span class="kw">match </span>prev_range {
<a href=#427 id=427 data-nosnippet>427</a> <span class="prelude-val">None </span>=&gt; nothing_u8,
<a href=#428 id=428 data-nosnippet>428</a> <span class="prelude-val">Some</span>(<span class="kw-2">ref </span>pr) =&gt; <span class="kw-2">&amp;</span><span class="self">self</span>.stride[pr.clone()],
<a href=#429 id=429 data-nosnippet>429</a> },
<a href=#430 id=430 data-nosnippet>430</a> ];
<a href=#431 id=431 data-nosnippet>431</a> <span class="kw">for </span>stride <span class="kw">in </span><span class="number">0</span>..NUM_STRIDES {
<a href=#432 id=432 data-nosnippet>432</a> scratch.pop[stride].initiate_from(pop_ranges, stride_ranges, stride <span class="kw">as </span>u8, <span class="bool-val">true</span>);
<a href=#433 id=433 data-nosnippet>433</a> initial_entropies[stride] = scratch.pop[stride].cached_bit_entropy;
<a href=#434 id=434 data-nosnippet>434</a> }
<a href=#435 id=435 data-nosnippet>435</a> }
<a href=#436 id=436 data-nosnippet>436</a> scratch.observe_input_stream(input.<span class="number">0</span>.slice(), input.<span class="number">1</span>.slice());
<a href=#437 id=437 data-nosnippet>437</a> <span class="kw">let </span><span class="kw-2">mut </span>best_entropy_index = <span class="number">0</span>;
<a href=#438 id=438 data-nosnippet>438</a> <span class="kw">let </span><span class="kw-2">mut </span>min_entropy_value = (scratch.pop[<span class="number">0</span>].cached_bit_entropy - initial_entropies[<span class="number">0</span>]);
<a href=#439 id=439 data-nosnippet>439</a> <span class="comment">//println!("{} OLD ENTROPY {:} NEW_ENTROPY {:}", best_entropy_index, scratch.pop[0].cached_bit_entropy, initial_entropies[0]);
<a href=#440 id=440 data-nosnippet>440</a> </span><span class="kw">for </span>stride <span class="kw">in </span><span class="number">1</span>..NUM_STRIDES {
<a href=#441 id=441 data-nosnippet>441</a> <span class="kw">let </span>entropy_value = scratch.pop[stride].cached_bit_entropy - initial_entropies[stride];
<a href=#442 id=442 data-nosnippet>442</a> <span class="comment">//println!("{} OLD ENTROPY {:} NEW_ENTROPY {:}", stride, scratch.pop[stride].cached_bit_entropy, initial_entropies[stride]);
<a href=#443 id=443 data-nosnippet>443</a> </span><span class="kw">if </span>entropy_value &lt; min_entropy_value {
<a href=#444 id=444 data-nosnippet>444</a> best_entropy_index = stride;
<a href=#445 id=445 data-nosnippet>445</a> min_entropy_value = entropy_value;
<a href=#446 id=446 data-nosnippet>446</a> }
<a href=#447 id=447 data-nosnippet>447</a> }
<a href=#448 id=448 data-nosnippet>448</a> <span class="self">self</span>.pop[index <span class="kw">as </span>usize].clone_from(<span class="kw-2">&amp;</span>scratch.pop[best_entropy_index]);
<a href=#449 id=449 data-nosnippet>449</a> <span class="self">self</span>.stride[index <span class="kw">as </span>usize] = best_entropy_index <span class="kw">as </span>u8;
<a href=#450 id=450 data-nosnippet>450</a> }
<a href=#451 id=451 data-nosnippet>451</a> <span class="kw">pub fn </span>populate_stride1(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input0: <span class="kw-2">&amp;</span>[u8], input1: <span class="kw-2">&amp;</span>[u8]) {
<a href=#452 id=452 data-nosnippet>452</a> <span class="kw">let </span>input = InputPair(
<a href=#453 id=453 data-nosnippet>453</a> InputReference {
<a href=#454 id=454 data-nosnippet>454</a> data: input0,
<a href=#455 id=455 data-nosnippet>455</a> orig_offset: <span class="number">0</span>,
<a href=#456 id=456 data-nosnippet>456</a> },
<a href=#457 id=457 data-nosnippet>457</a> InputReference {
<a href=#458 id=458 data-nosnippet>458</a> data: input1,
<a href=#459 id=459 data-nosnippet>459</a> orig_offset: input0.len(),
<a href=#460 id=460 data-nosnippet>460</a> },
<a href=#461 id=461 data-nosnippet>461</a> );
<a href=#462 id=462 data-nosnippet>462</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#463 id=463 data-nosnippet>463</a> <span class="kw">let </span>first_range = <span class="kw">if </span>i == <span class="number">0 </span>{
<a href=#464 id=464 data-nosnippet>464</a> input.split_at(input.len() &gt;&gt; <span class="number">1</span>).<span class="number">0
<a href=#465 id=465 data-nosnippet>465</a> </span>} <span class="kw">else </span>{
<a href=#466 id=466 data-nosnippet>466</a> input.split_at(input.len() &gt;&gt; <span class="number">1</span>).<span class="number">1
<a href=#467 id=467 data-nosnippet>467</a> </span>};
<a href=#468 id=468 data-nosnippet>468</a> <span class="kw">for </span>j <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#469 id=469 data-nosnippet>469</a> <span class="kw">let </span>second_range = <span class="kw">if </span>j == <span class="number">0 </span>{
<a href=#470 id=470 data-nosnippet>470</a> first_range.split_at(input.len() &gt;&gt; <span class="number">2</span>).<span class="number">0
<a href=#471 id=471 data-nosnippet>471</a> </span>} <span class="kw">else </span>{
<a href=#472 id=472 data-nosnippet>472</a> first_range.split_at(input.len() &gt;&gt; <span class="number">2</span>).<span class="number">1
<a href=#473 id=473 data-nosnippet>473</a> </span>};
<a href=#474 id=474 data-nosnippet>474</a> <span class="kw">if </span>NUM_LEVELS == <span class="number">4 </span>{
<a href=#475 id=475 data-nosnippet>475</a> <span class="kw">for </span>k <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#476 id=476 data-nosnippet>476</a> <span class="kw">let </span>third_range = <span class="kw">if </span>j == <span class="number">0 </span>{
<a href=#477 id=477 data-nosnippet>477</a> second_range.split_at(input.len() &gt;&gt; <span class="number">3</span>).<span class="number">0
<a href=#478 id=478 data-nosnippet>478</a> </span>} <span class="kw">else </span>{
<a href=#479 id=479 data-nosnippet>479</a> second_range.split_at(input.len() &gt;&gt; <span class="number">3</span>).<span class="number">1
<a href=#480 id=480 data-nosnippet>480</a> </span>};
<a href=#481 id=481 data-nosnippet>481</a> <span class="self">self</span>.populate_entry_stride1(third_range, <span class="number">7 </span>+ ((i &lt;&lt; <span class="number">2</span>) + (j &lt;&lt; <span class="number">1</span>) + k));
<a href=#482 id=482 data-nosnippet>482</a> }
<a href=#483 id=483 data-nosnippet>483</a> } <span class="kw">else </span>{
<a href=#484 id=484 data-nosnippet>484</a> <span class="macro">assert_eq!</span>(NUM_LEVELS, <span class="number">3</span>); <span class="comment">// we hard coded the 3 levels for now... we can add more later or make this into some kind of recursion
<a href=#485 id=485 data-nosnippet>485</a> </span><span class="self">self</span>.populate_entry_stride1(second_range, <span class="number">3 </span>+ ((i &lt;&lt; <span class="number">1</span>) + j));
<a href=#486 id=486 data-nosnippet>486</a> }
<a href=#487 id=487 data-nosnippet>487</a> }
<a href=#488 id=488 data-nosnippet>488</a> }
<a href=#489 id=489 data-nosnippet>489</a> }
<a href=#490 id=490 data-nosnippet>490</a> <span class="kw">pub fn </span>populate(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input0: <span class="kw-2">&amp;</span>[u8], input1: <span class="kw-2">&amp;</span>[u8], scratch: <span class="kw-2">&amp;mut </span>EntropyTally&lt;AllocU32&gt;) {
<a href=#491 id=491 data-nosnippet>491</a> <span class="kw">let </span>input = InputPair(
<a href=#492 id=492 data-nosnippet>492</a> InputReference {
<a href=#493 id=493 data-nosnippet>493</a> data: input0,
<a href=#494 id=494 data-nosnippet>494</a> orig_offset: <span class="number">0</span>,
<a href=#495 id=495 data-nosnippet>495</a> },
<a href=#496 id=496 data-nosnippet>496</a> InputReference {
<a href=#497 id=497 data-nosnippet>497</a> data: input1,
<a href=#498 id=498 data-nosnippet>498</a> orig_offset: input0.len(),
<a href=#499 id=499 data-nosnippet>499</a> },
<a href=#500 id=500 data-nosnippet>500</a> );
<a href=#501 id=501 data-nosnippet>501</a> <span class="self">self</span>.populate_entry(input, scratch, <span class="number">0</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>); <span class="comment">// BASE
<a href=#502 id=502 data-nosnippet>502</a>
<a href=#503 id=503 data-nosnippet>503</a> // LEVEL 1
<a href=#504 id=504 data-nosnippet>504</a> </span><span class="self">self</span>.populate_entry(
<a href=#505 id=505 data-nosnippet>505</a> input.split_at(input.len() &gt;&gt; <span class="number">1</span>).<span class="number">0</span>,
<a href=#506 id=506 data-nosnippet>506</a> scratch,
<a href=#507 id=507 data-nosnippet>507</a> <span class="number">1</span>,
<a href=#508 id=508 data-nosnippet>508</a> <span class="prelude-val">Some</span>(<span class="number">0</span>..<span class="number">1</span>),
<a href=#509 id=509 data-nosnippet>509</a> <span class="prelude-val">None</span>,
<a href=#510 id=510 data-nosnippet>510</a> );
<a href=#511 id=511 data-nosnippet>511</a> <span class="self">self</span>.populate_entry(
<a href=#512 id=512 data-nosnippet>512</a> input.split_at(input.len() &gt;&gt; <span class="number">1</span>).<span class="number">1</span>,
<a href=#513 id=513 data-nosnippet>513</a> scratch,
<a href=#514 id=514 data-nosnippet>514</a> <span class="number">2</span>,
<a href=#515 id=515 data-nosnippet>515</a> <span class="prelude-val">None</span>,
<a href=#516 id=516 data-nosnippet>516</a> <span class="prelude-val">Some</span>(<span class="number">1</span>..<span class="number">2</span>),
<a href=#517 id=517 data-nosnippet>517</a> ); <span class="comment">// should we use the range from 0..1??
<a href=#518 id=518 data-nosnippet>518</a>
<a href=#519 id=519 data-nosnippet>519</a> // LEVEL 2
<a href=#520 id=520 data-nosnippet>520</a> </span><span class="self">self</span>.populate_entry(
<a href=#521 id=521 data-nosnippet>521</a> input.split_at(input.len() &gt;&gt; <span class="number">2</span>).<span class="number">0</span>,
<a href=#522 id=522 data-nosnippet>522</a> scratch,
<a href=#523 id=523 data-nosnippet>523</a> <span class="number">3</span>,
<a href=#524 id=524 data-nosnippet>524</a> <span class="prelude-val">Some</span>(<span class="number">1</span>..<span class="number">3</span>),
<a href=#525 id=525 data-nosnippet>525</a> <span class="prelude-val">None</span>,
<a href=#526 id=526 data-nosnippet>526</a> );
<a href=#527 id=527 data-nosnippet>527</a> <span class="self">self</span>.populate_entry(
<a href=#528 id=528 data-nosnippet>528</a> input
<a href=#529 id=529 data-nosnippet>529</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#530 id=530 data-nosnippet>530</a> .<span class="number">0
<a href=#531 id=531 data-nosnippet>531</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#532 id=532 data-nosnippet>532</a> .<span class="number">1</span>,
<a href=#533 id=533 data-nosnippet>533</a> scratch,
<a href=#534 id=534 data-nosnippet>534</a> <span class="number">4</span>,
<a href=#535 id=535 data-nosnippet>535</a> <span class="prelude-val">Some</span>(<span class="number">2</span>..<span class="number">3</span>),
<a href=#536 id=536 data-nosnippet>536</a> <span class="prelude-val">Some</span>(<span class="number">3</span>..<span class="number">4</span>),
<a href=#537 id=537 data-nosnippet>537</a> );
<a href=#538 id=538 data-nosnippet>538</a> <span class="self">self</span>.populate_entry(
<a href=#539 id=539 data-nosnippet>539</a> input
<a href=#540 id=540 data-nosnippet>540</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#541 id=541 data-nosnippet>541</a> .<span class="number">1
<a href=#542 id=542 data-nosnippet>542</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#543 id=543 data-nosnippet>543</a> .<span class="number">0</span>,
<a href=#544 id=544 data-nosnippet>544</a> scratch,
<a href=#545 id=545 data-nosnippet>545</a> <span class="number">5</span>,
<a href=#546 id=546 data-nosnippet>546</a> <span class="prelude-val">Some</span>(<span class="number">3</span>..<span class="number">5</span>),
<a href=#547 id=547 data-nosnippet>547</a> <span class="prelude-val">None</span>,
<a href=#548 id=548 data-nosnippet>548</a> );
<a href=#549 id=549 data-nosnippet>549</a> <span class="self">self</span>.populate_entry(
<a href=#550 id=550 data-nosnippet>550</a> input
<a href=#551 id=551 data-nosnippet>551</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#552 id=552 data-nosnippet>552</a> .<span class="number">1
<a href=#553 id=553 data-nosnippet>553</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#554 id=554 data-nosnippet>554</a> .<span class="number">1</span>,
<a href=#555 id=555 data-nosnippet>555</a> scratch,
<a href=#556 id=556 data-nosnippet>556</a> <span class="number">6</span>,
<a href=#557 id=557 data-nosnippet>557</a> <span class="prelude-val">Some</span>(<span class="number">3</span>..<span class="number">6</span>),
<a href=#558 id=558 data-nosnippet>558</a> <span class="prelude-val">None</span>,
<a href=#559 id=559 data-nosnippet>559</a> );
<a href=#560 id=560 data-nosnippet>560</a> <span class="kw">if </span>NUM_LEVELS == <span class="number">4 </span>{
<a href=#561 id=561 data-nosnippet>561</a> <span class="comment">// level 4
<a href=#562 id=562 data-nosnippet>562</a> </span><span class="self">self</span>.populate_entry(
<a href=#563 id=563 data-nosnippet>563</a> input
<a href=#564 id=564 data-nosnippet>564</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#565 id=565 data-nosnippet>565</a> .<span class="number">0
<a href=#566 id=566 data-nosnippet>566</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#567 id=567 data-nosnippet>567</a> .<span class="number">0
<a href=#568 id=568 data-nosnippet>568</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#569 id=569 data-nosnippet>569</a> .<span class="number">0</span>,
<a href=#570 id=570 data-nosnippet>570</a> scratch,
<a href=#571 id=571 data-nosnippet>571</a> <span class="number">7</span>,
<a href=#572 id=572 data-nosnippet>572</a> <span class="prelude-val">Some</span>(<span class="number">4</span>..<span class="number">7</span>),
<a href=#573 id=573 data-nosnippet>573</a> <span class="prelude-val">None</span>,
<a href=#574 id=574 data-nosnippet>574</a> );
<a href=#575 id=575 data-nosnippet>575</a> <span class="self">self</span>.populate_entry(
<a href=#576 id=576 data-nosnippet>576</a> input
<a href=#577 id=577 data-nosnippet>577</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#578 id=578 data-nosnippet>578</a> .<span class="number">0
<a href=#579 id=579 data-nosnippet>579</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#580 id=580 data-nosnippet>580</a> .<span class="number">0
<a href=#581 id=581 data-nosnippet>581</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#582 id=582 data-nosnippet>582</a> .<span class="number">1</span>,
<a href=#583 id=583 data-nosnippet>583</a> scratch,
<a href=#584 id=584 data-nosnippet>584</a> <span class="number">8</span>,
<a href=#585 id=585 data-nosnippet>585</a> <span class="prelude-val">Some</span>(<span class="number">4</span>..<span class="number">7</span>),
<a href=#586 id=586 data-nosnippet>586</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">8</span>),
<a href=#587 id=587 data-nosnippet>587</a> );
<a href=#588 id=588 data-nosnippet>588</a> <span class="self">self</span>.populate_entry(
<a href=#589 id=589 data-nosnippet>589</a> input
<a href=#590 id=590 data-nosnippet>590</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#591 id=591 data-nosnippet>591</a> .<span class="number">0
<a href=#592 id=592 data-nosnippet>592</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#593 id=593 data-nosnippet>593</a> .<span class="number">1
<a href=#594 id=594 data-nosnippet>594</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#595 id=595 data-nosnippet>595</a> .<span class="number">0</span>,
<a href=#596 id=596 data-nosnippet>596</a> scratch,
<a href=#597 id=597 data-nosnippet>597</a> <span class="number">9</span>,
<a href=#598 id=598 data-nosnippet>598</a> <span class="prelude-val">Some</span>(<span class="number">5</span>..<span class="number">7</span>),
<a href=#599 id=599 data-nosnippet>599</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">9</span>),
<a href=#600 id=600 data-nosnippet>600</a> );
<a href=#601 id=601 data-nosnippet>601</a> <span class="self">self</span>.populate_entry(
<a href=#602 id=602 data-nosnippet>602</a> input
<a href=#603 id=603 data-nosnippet>603</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#604 id=604 data-nosnippet>604</a> .<span class="number">0
<a href=#605 id=605 data-nosnippet>605</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#606 id=606 data-nosnippet>606</a> .<span class="number">1
<a href=#607 id=607 data-nosnippet>607</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#608 id=608 data-nosnippet>608</a> .<span class="number">1</span>,
<a href=#609 id=609 data-nosnippet>609</a> scratch,
<a href=#610 id=610 data-nosnippet>610</a> <span class="number">0x0a</span>,
<a href=#611 id=611 data-nosnippet>611</a> <span class="prelude-val">Some</span>(<span class="number">5</span>..<span class="number">7</span>),
<a href=#612 id=612 data-nosnippet>612</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">0xa</span>),
<a href=#613 id=613 data-nosnippet>613</a> );
<a href=#614 id=614 data-nosnippet>614</a>
<a href=#615 id=615 data-nosnippet>615</a> <span class="self">self</span>.populate_entry(
<a href=#616 id=616 data-nosnippet>616</a> input
<a href=#617 id=617 data-nosnippet>617</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#618 id=618 data-nosnippet>618</a> .<span class="number">1
<a href=#619 id=619 data-nosnippet>619</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#620 id=620 data-nosnippet>620</a> .<span class="number">0
<a href=#621 id=621 data-nosnippet>621</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#622 id=622 data-nosnippet>622</a> .<span class="number">0</span>,
<a href=#623 id=623 data-nosnippet>623</a> scratch,
<a href=#624 id=624 data-nosnippet>624</a> <span class="number">0xb</span>,
<a href=#625 id=625 data-nosnippet>625</a> <span class="prelude-val">Some</span>(<span class="number">6</span>..<span class="number">7</span>),
<a href=#626 id=626 data-nosnippet>626</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">0xb</span>),
<a href=#627 id=627 data-nosnippet>627</a> );
<a href=#628 id=628 data-nosnippet>628</a> <span class="self">self</span>.populate_entry(
<a href=#629 id=629 data-nosnippet>629</a> input
<a href=#630 id=630 data-nosnippet>630</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#631 id=631 data-nosnippet>631</a> .<span class="number">1
<a href=#632 id=632 data-nosnippet>632</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#633 id=633 data-nosnippet>633</a> .<span class="number">0
<a href=#634 id=634 data-nosnippet>634</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#635 id=635 data-nosnippet>635</a> .<span class="number">1</span>,
<a href=#636 id=636 data-nosnippet>636</a> scratch,
<a href=#637 id=637 data-nosnippet>637</a> <span class="number">0xc</span>,
<a href=#638 id=638 data-nosnippet>638</a> <span class="prelude-val">Some</span>(<span class="number">6</span>..<span class="number">7</span>),
<a href=#639 id=639 data-nosnippet>639</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">0xc</span>),
<a href=#640 id=640 data-nosnippet>640</a> );
<a href=#641 id=641 data-nosnippet>641</a> <span class="self">self</span>.populate_entry(
<a href=#642 id=642 data-nosnippet>642</a> input
<a href=#643 id=643 data-nosnippet>643</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#644 id=644 data-nosnippet>644</a> .<span class="number">1
<a href=#645 id=645 data-nosnippet>645</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#646 id=646 data-nosnippet>646</a> .<span class="number">1
<a href=#647 id=647 data-nosnippet>647</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#648 id=648 data-nosnippet>648</a> .<span class="number">0</span>,
<a href=#649 id=649 data-nosnippet>649</a> scratch,
<a href=#650 id=650 data-nosnippet>650</a> <span class="number">0xd</span>,
<a href=#651 id=651 data-nosnippet>651</a> <span class="prelude-val">None</span>,
<a href=#652 id=652 data-nosnippet>652</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">0xd</span>),
<a href=#653 id=653 data-nosnippet>653</a> );
<a href=#654 id=654 data-nosnippet>654</a> <span class="self">self</span>.populate_entry(
<a href=#655 id=655 data-nosnippet>655</a> input
<a href=#656 id=656 data-nosnippet>656</a> .split_at(input.len() &gt;&gt; <span class="number">1</span>)
<a href=#657 id=657 data-nosnippet>657</a> .<span class="number">1
<a href=#658 id=658 data-nosnippet>658</a> </span>.split_at(input.len() &gt;&gt; <span class="number">2</span>)
<a href=#659 id=659 data-nosnippet>659</a> .<span class="number">1
<a href=#660 id=660 data-nosnippet>660</a> </span>.split_at(input.len() &gt;&gt; <span class="number">3</span>)
<a href=#661 id=661 data-nosnippet>661</a> .<span class="number">1</span>,
<a href=#662 id=662 data-nosnippet>662</a> scratch,
<a href=#663 id=663 data-nosnippet>663</a> <span class="number">0xe</span>,
<a href=#664 id=664 data-nosnippet>664</a> <span class="prelude-val">None</span>,
<a href=#665 id=665 data-nosnippet>665</a> <span class="prelude-val">Some</span>(<span class="number">7</span>..<span class="number">0xe</span>),
<a href=#666 id=666 data-nosnippet>666</a> );
<a href=#667 id=667 data-nosnippet>667</a> } <span class="kw">else </span>{
<a href=#668 id=668 data-nosnippet>668</a> <span class="macro">assert_eq!</span>(NUM_LEVELS, <span class="number">3</span>); <span class="comment">// we hard coded the 3 levels for now... we can add more later or make this into some kind of recursion
<a href=#669 id=669 data-nosnippet>669</a> </span>}
<a href=#670 id=670 data-nosnippet>670</a> }
<a href=#671 id=671 data-nosnippet>671</a>}
<a href=#672 id=672 data-nosnippet>672</a>
<a href=#673 id=673 data-nosnippet>673</a><span class="kw">impl</span>&lt;AllocU32: alloc::Allocator&lt;u32&gt;&gt; EntropyTally&lt;AllocU32&gt; {
<a href=#674 id=674 data-nosnippet>674</a> <span class="kw">pub fn </span>new(m32: <span class="kw-2">&amp;mut </span>AllocU32, max_stride_arg: <span class="prelude-ty">Option</span>&lt;u8&gt;) -&gt; EntropyTally&lt;AllocU32&gt; {
<a href=#675 id=675 data-nosnippet>675</a> <span class="kw">let </span>size = <span class="number">256 </span>* <span class="number">256</span>;
<a href=#676 id=676 data-nosnippet>676</a> <span class="kw">let </span>max_stride = max_stride_arg.unwrap_or(NUM_STRIDES <span class="kw">as </span>u8);
<a href=#677 id=677 data-nosnippet>677</a> EntropyTally::&lt;AllocU32&gt; {
<a href=#678 id=678 data-nosnippet>678</a> pop: [
<a href=#679 id=679 data-nosnippet>679</a> EntropyBucketPopulation {
<a href=#680 id=680 data-nosnippet>680</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#681 id=681 data-nosnippet>681</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">0</span>, m32, size),
<a href=#682 id=682 data-nosnippet>682</a> },
<a href=#683 id=683 data-nosnippet>683</a> EntropyBucketPopulation {
<a href=#684 id=684 data-nosnippet>684</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#685 id=685 data-nosnippet>685</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">1</span>, m32, size),
<a href=#686 id=686 data-nosnippet>686</a> },
<a href=#687 id=687 data-nosnippet>687</a> EntropyBucketPopulation {
<a href=#688 id=688 data-nosnippet>688</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#689 id=689 data-nosnippet>689</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">2</span>, m32, size),
<a href=#690 id=690 data-nosnippet>690</a> },
<a href=#691 id=691 data-nosnippet>691</a> EntropyBucketPopulation {
<a href=#692 id=692 data-nosnippet>692</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#693 id=693 data-nosnippet>693</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">3</span>, m32, size),
<a href=#694 id=694 data-nosnippet>694</a> },
<a href=#695 id=695 data-nosnippet>695</a> EntropyBucketPopulation {
<a href=#696 id=696 data-nosnippet>696</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#697 id=697 data-nosnippet>697</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">4</span>, m32, size),
<a href=#698 id=698 data-nosnippet>698</a> },
<a href=#699 id=699 data-nosnippet>699</a> EntropyBucketPopulation {
<a href=#700 id=700 data-nosnippet>700</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#701 id=701 data-nosnippet>701</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">5</span>, m32, size),
<a href=#702 id=702 data-nosnippet>702</a> },
<a href=#703 id=703 data-nosnippet>703</a> EntropyBucketPopulation {
<a href=#704 id=704 data-nosnippet>704</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#705 id=705 data-nosnippet>705</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">6</span>, m32, size),
<a href=#706 id=706 data-nosnippet>706</a> },
<a href=#707 id=707 data-nosnippet>707</a> EntropyBucketPopulation {
<a href=#708 id=708 data-nosnippet>708</a> cached_bit_entropy: <span class="number">0.0</span>,
<a href=#709 id=709 data-nosnippet>709</a> bucket_populations: alloc_if(max_stride &gt; <span class="number">7</span>, m32, size),
<a href=#710 id=710 data-nosnippet>710</a> },
<a href=#711 id=711 data-nosnippet>711</a> ],
<a href=#712 id=712 data-nosnippet>712</a> }
<a href=#713 id=713 data-nosnippet>713</a> }
<a href=#714 id=714 data-nosnippet>714</a> <span class="kw">pub fn </span>disabled_placeholder(m32: <span class="kw-2">&amp;mut </span>AllocU32) -&gt; EntropyTally&lt;AllocU32&gt; {
<a href=#715 id=715 data-nosnippet>715</a> <span class="self">Self</span>::new(m32, <span class="prelude-val">Some</span>(<span class="number">0</span>))
<a href=#716 id=716 data-nosnippet>716</a> }
<a href=#717 id=717 data-nosnippet>717</a> <span class="kw">fn </span>observe_input_stream(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input0: <span class="kw-2">&amp;</span>[u8], input1: <span class="kw-2">&amp;</span>[u8]) {
<a href=#718 id=718 data-nosnippet>718</a> <span class="kw">let </span><span class="kw-2">mut </span>priors = [<span class="number">0u8</span>; NUM_STRIDES];
<a href=#719 id=719 data-nosnippet>719</a> <span class="kw">for </span>val <span class="kw">in </span>input0.iter().chain(input1.iter()) {
<a href=#720 id=720 data-nosnippet>720</a> <span class="kw">for </span>stride <span class="kw">in </span><span class="number">0</span>..NUM_STRIDES {
<a href=#721 id=721 data-nosnippet>721</a> <span class="self">self</span>.pop[stride].bucket_populations.slice_mut()
<a href=#722 id=722 data-nosnippet>722</a> [priors[stride] <span class="kw">as </span>usize * <span class="number">256 </span>+ (<span class="kw-2">*</span>val <span class="kw">as </span>usize)] += <span class="number">1</span>;
<a href=#723 id=723 data-nosnippet>723</a> }
<a href=#724 id=724 data-nosnippet>724</a> {
<a href=#725 id=725 data-nosnippet>725</a> <span class="kw">let </span><span class="kw-2">mut </span>tmp = [<span class="number">0u8</span>; NUM_STRIDES - <span class="number">1</span>];
<a href=#726 id=726 data-nosnippet>726</a> tmp.clone_from_slice(<span class="kw-2">&amp;</span>priors[..(NUM_STRIDES - <span class="number">1</span>)]);
<a href=#727 id=727 data-nosnippet>727</a> priors[<span class="number">1</span>..].clone_from_slice(<span class="kw-2">&amp;</span>tmp[..]);
<a href=#728 id=728 data-nosnippet>728</a> priors[<span class="number">0</span>] = <span class="kw-2">*</span>val;
<a href=#729 id=729 data-nosnippet>729</a> }
<a href=#730 id=730 data-nosnippet>730</a> }
<a href=#731 id=731 data-nosnippet>731</a> <span class="kw">for </span>stride <span class="kw">in </span><span class="number">0</span>..NUM_STRIDES {
<a href=#732 id=732 data-nosnippet>732</a> <span class="self">self</span>.pop[stride].cached_bit_entropy =
<a href=#733 id=733 data-nosnippet>733</a> HuffmanCost(<span class="self">self</span>.pop[stride].bucket_populations.slice());
<a href=#734 id=734 data-nosnippet>734</a> }
<a href=#735 id=735 data-nosnippet>735</a> }
<a href=#736 id=736 data-nosnippet>736</a> <span class="kw">fn </span>identify_best_population_and_update_cache(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; u8 {
<a href=#737 id=737 data-nosnippet>737</a> <span class="kw">let </span><span class="kw-2">mut </span>old_bit_entropy: [floatY; NUM_STRIDES] = [<span class="number">0.0</span>; NUM_STRIDES];
<a href=#738 id=738 data-nosnippet>738</a> <span class="kw">for </span>(obe, be) <span class="kw">in </span>old_bit_entropy.iter_mut().zip(<span class="self">self</span>.pop.iter_mut()) {
<a href=#739 id=739 data-nosnippet>739</a> <span class="kw-2">*</span>obe = be.cached_bit_entropy;
<a href=#740 id=740 data-nosnippet>740</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">obe !</span>= <span class="number">0.0 </span>{
<a href=#741 id=741 data-nosnippet>741</a> be.cached_bit_entropy = HuffmanCost(be.bucket_populations.slice());
<a href=#742 id=742 data-nosnippet>742</a> }
<a href=#743 id=743 data-nosnippet>743</a> }
<a href=#744 id=744 data-nosnippet>744</a> <span class="kw">let </span><span class="kw-2">mut </span>best_stride = <span class="number">0u8</span>;
<a href=#745 id=745 data-nosnippet>745</a> <span class="kw">let </span><span class="kw-2">mut </span>best_entropy = <span class="self">self</span>.pop[<span class="number">0</span>].cached_bit_entropy - old_bit_entropy[<span class="number">0</span>];
<a href=#746 id=746 data-nosnippet>746</a> <span class="comment">//println!("Weighing {} as {}", best_stride, best_entropy);
<a href=#747 id=747 data-nosnippet>747</a> </span><span class="kw">for </span>index <span class="kw">in </span><span class="number">1</span>..NUM_STRIDES {
<a href=#748 id=748 data-nosnippet>748</a> <span class="kw">let </span>cur = <span class="self">self</span>.pop[index].cached_bit_entropy - old_bit_entropy[index];
<a href=#749 id=749 data-nosnippet>749</a> <span class="comment">//println!("Weighing {} as {} = [{} - {}]", index, cur, self.pop[index].cached_bit_entropy, old_bit_entropy[index]);
<a href=#750 id=750 data-nosnippet>750</a> </span><span class="kw">if </span>(best_entropy == <span class="number">0.0 </span>|| cur &lt; best_entropy) &amp;&amp; old_bit_entropy[index] &gt; <span class="number">0.0 </span>{
<a href=#751 id=751 data-nosnippet>751</a> best_stride = index <span class="kw">as </span>u8;
<a href=#752 id=752 data-nosnippet>752</a> best_entropy = cur;
<a href=#753 id=753 data-nosnippet>753</a> }
<a href=#754 id=754 data-nosnippet>754</a> }
<a href=#755 id=755 data-nosnippet>755</a> best_stride
<a href=#756 id=756 data-nosnippet>756</a> }
<a href=#757 id=757 data-nosnippet>757</a> <span class="kw">pub fn </span>peek(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>EntropyBucketPopulation&lt;AllocU32&gt; {
<a href=#758 id=758 data-nosnippet>758</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.pop[<span class="number">0</span>]
<a href=#759 id=759 data-nosnippet>759</a> }
<a href=#760 id=760 data-nosnippet>760</a> <span class="kw">pub fn </span>get_previous_bytes(
<a href=#761 id=761 data-nosnippet>761</a> <span class="kw-2">&amp;</span><span class="self">self</span>,
<a href=#762 id=762 data-nosnippet>762</a> input0: <span class="kw-2">&amp;</span>[u8],
<a href=#763 id=763 data-nosnippet>763</a> input1: <span class="kw-2">&amp;</span>[u8],
<a href=#764 id=764 data-nosnippet>764</a> bytes_processed: usize,
<a href=#765 id=765 data-nosnippet>765</a> ) -&gt; [u8; NUM_STRIDES] {
<a href=#766 id=766 data-nosnippet>766</a> <span class="kw">let </span><span class="kw-2">mut </span>retval = [<span class="number">0u8</span>; NUM_STRIDES];
<a href=#767 id=767 data-nosnippet>767</a> <span class="kw">for </span>index <span class="kw">in </span><span class="number">0</span>..NUM_STRIDES {
<a href=#768 id=768 data-nosnippet>768</a> <span class="kw">let </span>bp_offset = index + <span class="number">1</span>;
<a href=#769 id=769 data-nosnippet>769</a> <span class="kw">if </span>bp_offset &lt;= bytes_processed {
<a href=#770 id=770 data-nosnippet>770</a> <span class="kw">let </span>offset = bytes_processed - bp_offset;
<a href=#771 id=771 data-nosnippet>771</a> <span class="kw">if </span>offset &gt;= input0.len() {
<a href=#772 id=772 data-nosnippet>772</a> retval[index] = input1[offset - input0.len()];
<a href=#773 id=773 data-nosnippet>773</a> } <span class="kw">else </span>{
<a href=#774 id=774 data-nosnippet>774</a> retval[index] = input0[offset];
<a href=#775 id=775 data-nosnippet>775</a> }
<a href=#776 id=776 data-nosnippet>776</a> }
<a href=#777 id=777 data-nosnippet>777</a> }
<a href=#778 id=778 data-nosnippet>778</a> retval
<a href=#779 id=779 data-nosnippet>779</a> }
<a href=#780 id=780 data-nosnippet>780</a> <span class="kw">pub fn </span>pick_best_stride&lt;InputReference: SliceWrapper&lt;u8&gt;&gt;(
<a href=#781 id=781 data-nosnippet>781</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#782 id=782 data-nosnippet>782</a> commands: <span class="kw-2">&amp;</span>[interface::Command&lt;InputReference&gt;],
<a href=#783 id=783 data-nosnippet>783</a> input0: <span class="kw-2">&amp;</span>[u8],
<a href=#784 id=784 data-nosnippet>784</a> input1: <span class="kw-2">&amp;</span>[u8],
<a href=#785 id=785 data-nosnippet>785</a> bytes_processed: <span class="kw-2">&amp;mut </span>usize,
<a href=#786 id=786 data-nosnippet>786</a> entropy_pyramid: <span class="kw-2">&amp;</span>EntropyPyramid&lt;AllocU32&gt;,
<a href=#787 id=787 data-nosnippet>787</a> stride_detection_quality: u8,
<a href=#788 id=788 data-nosnippet>788</a> ) -&gt; u8 {
<a href=#789 id=789 data-nosnippet>789</a> <span class="kw">if </span>stride_detection_quality == <span class="number">0 </span>{
<a href=#790 id=790 data-nosnippet>790</a> <span class="kw">return </span><span class="number">0</span>;
<a href=#791 id=791 data-nosnippet>791</a> }
<a href=#792 id=792 data-nosnippet>792</a> <span class="comment">//println!("ENTROPY PYRAMID {:?}", entropy_pyramid.stride);
<a href=#793 id=793 data-nosnippet>793</a> </span><span class="kw">if </span>stride_detection_quality &gt; <span class="number">1 </span>{
<a href=#794 id=794 data-nosnippet>794</a> entropy_pyramid.reset_scratch_to_deepest_level(<span class="self">self</span>);
<a href=#795 id=795 data-nosnippet>795</a> }
<a href=#796 id=796 data-nosnippet>796</a> <span class="kw">let </span><span class="kw-2">mut </span>pyramid_byte_index: usize = <span class="number">0</span>;
<a href=#797 id=797 data-nosnippet>797</a> <span class="kw">for </span>cmd <span class="kw">in </span>commands.iter() {
<a href=#798 id=798 data-nosnippet>798</a> <span class="kw">match </span><span class="kw-2">*</span>cmd {
<a href=#799 id=799 data-nosnippet>799</a> interface::Command::Copy(<span class="kw-2">ref </span>copy) =&gt; {
<a href=#800 id=800 data-nosnippet>800</a> <span class="kw-2">*</span>bytes_processed += copy.num_bytes <span class="kw">as </span>usize;
<a href=#801 id=801 data-nosnippet>801</a> }
<a href=#802 id=802 data-nosnippet>802</a> interface::Command::Dict(<span class="kw-2">ref </span>dict) =&gt; {
<a href=#803 id=803 data-nosnippet>803</a> <span class="kw-2">*</span>bytes_processed += dict.final_size <span class="kw">as </span>usize;
<a href=#804 id=804 data-nosnippet>804</a> }
<a href=#805 id=805 data-nosnippet>805</a> interface::Command::Literal(<span class="kw-2">ref </span>lit) =&gt; {
<a href=#806 id=806 data-nosnippet>806</a> <span class="kw">if </span>stride_detection_quality &gt; <span class="number">1 </span>{
<a href=#807 id=807 data-nosnippet>807</a> <span class="kw">let </span><span class="kw-2">mut </span>priors = <span class="self">self</span>.get_previous_bytes(input0, input1, <span class="kw-2">*</span>bytes_processed);
<a href=#808 id=808 data-nosnippet>808</a> <span class="kw">for </span>(lindex, val) <span class="kw">in </span>lit.data.slice().iter().enumerate() {
<a href=#809 id=809 data-nosnippet>809</a> <span class="kw">if </span>lindex == NUM_STRIDES {
<a href=#810 id=810 data-nosnippet>810</a> <span class="kw">let </span>vpriors = <span class="self">self</span>.get_previous_bytes(
<a href=#811 id=811 data-nosnippet>811</a> input0,
<a href=#812 id=812 data-nosnippet>812</a> input1,
<a href=#813 id=813 data-nosnippet>813</a> NUM_STRIDES + <span class="kw-2">*</span>bytes_processed,
<a href=#814 id=814 data-nosnippet>814</a> );
<a href=#815 id=815 data-nosnippet>815</a> <span class="macro">assert_eq!</span>(vpriors, priors);
<a href=#816 id=816 data-nosnippet>816</a> }
<a href=#817 id=817 data-nosnippet>817</a> <span class="kw">for </span>(index, prior) <span class="kw">in </span>priors.iter().enumerate() {
<a href=#818 id=818 data-nosnippet>818</a> <span class="self">self</span>.pop[index].bucket_populations.slice_mut()
<a href=#819 id=819 data-nosnippet>819</a> [<span class="number">256 </span>* (<span class="kw-2">*</span>prior <span class="kw">as </span>usize) + <span class="kw-2">*</span>val <span class="kw">as </span>usize] += <span class="number">1</span>;
<a href=#820 id=820 data-nosnippet>820</a> <span class="comment">// increment the population value of this literal
<a href=#821 id=821 data-nosnippet>821</a> // for the respective prior for the stride index
<a href=#822 id=822 data-nosnippet>822</a> </span>}
<a href=#823 id=823 data-nosnippet>823</a> {
<a href=#824 id=824 data-nosnippet>824</a> <span class="comment">//reset prior values for the next item
<a href=#825 id=825 data-nosnippet>825</a> </span><span class="kw">let </span><span class="kw-2">mut </span>tmp = [<span class="number">0u8</span>; <span class="number">7</span>];
<a href=#826 id=826 data-nosnippet>826</a> tmp.clone_from_slice(<span class="kw-2">&amp;</span>priors[..<span class="number">7</span>]);
<a href=#827 id=827 data-nosnippet>827</a> priors[<span class="number">1</span>..].clone_from_slice(<span class="kw-2">&amp;</span>tmp[..]);
<a href=#828 id=828 data-nosnippet>828</a> priors[<span class="number">0</span>] = <span class="kw-2">*</span>val;
<a href=#829 id=829 data-nosnippet>829</a> }
<a href=#830 id=830 data-nosnippet>830</a> }
<a href=#831 id=831 data-nosnippet>831</a> }
<a href=#832 id=832 data-nosnippet>832</a> <span class="kw-2">*</span>bytes_processed += lit.data.slice().len();
<a href=#833 id=833 data-nosnippet>833</a> pyramid_byte_index = <span class="kw-2">*</span>bytes_processed;
<a href=#834 id=834 data-nosnippet>834</a> }
<a href=#835 id=835 data-nosnippet>835</a> interface::Command::BlockSwitchCommand(<span class="kw">_</span>)
<a href=#836 id=836 data-nosnippet>836</a> | interface::Command::BlockSwitchLiteral(<span class="kw">_</span>)
<a href=#837 id=837 data-nosnippet>837</a> | interface::Command::BlockSwitchDistance(<span class="kw">_</span>)
<a href=#838 id=838 data-nosnippet>838</a> | interface::Command::PredictionMode(<span class="kw">_</span>) =&gt; {}
<a href=#839 id=839 data-nosnippet>839</a> }
<a href=#840 id=840 data-nosnippet>840</a> }
<a href=#841 id=841 data-nosnippet>841</a>
<a href=#842 id=842 data-nosnippet>842</a> <span class="comment">//println!("ENTROPY PYRAMID {:?} selected {}", entropy_pyramid.stride, best_stride);
<a href=#843 id=843 data-nosnippet>843</a>
<a href=#844 id=844 data-nosnippet>844</a> </span><span class="kw">if </span>stride_detection_quality &gt; <span class="number">1 </span>{
<a href=#845 id=845 data-nosnippet>845</a> <span class="self">self</span>.identify_best_population_and_update_cache() + <span class="number">1
<a href=#846 id=846 data-nosnippet>846</a> </span>} <span class="kw">else </span>{
<a href=#847 id=847 data-nosnippet>847</a> entropy_pyramid.stride[entropy_pyramid
<a href=#848 id=848 data-nosnippet>848</a> .byte_index_to_pyramid_index(pyramid_byte_index, input0.len() + input1.len())]
<a href=#849 id=849 data-nosnippet>849</a> + <span class="number">1
<a href=#850 id=850 data-nosnippet>850</a> </span>}
<a href=#851 id=851 data-nosnippet>851</a> }
<a href=#852 id=852 data-nosnippet>852</a> <span class="kw">pub fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, m32: <span class="kw-2">&amp;mut </span>AllocU32) {
<a href=#853 id=853 data-nosnippet>853</a> <span class="kw">for </span>item <span class="kw">in </span><span class="self">self</span>.pop.iter_mut() {
<a href=#854 id=854 data-nosnippet>854</a> m32.free_cell(core::mem::take(<span class="kw-2">&amp;mut </span>item.bucket_populations))
<a href=#855 id=855 data-nosnippet>855</a> }
<a href=#856 id=856 data-nosnippet>856</a> }
<a href=#857 id=857 data-nosnippet>857</a> <span class="kw">pub fn </span>is_free(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; bool {
<a href=#858 id=858 data-nosnippet>858</a> <span class="self">self</span>.pop[<span class="number">0</span>].bucket_populations.slice().is_empty()
<a href=#859 id=859 data-nosnippet>859</a> }
<a href=#860 id=860 data-nosnippet>860</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,72 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/fixed_queue.rs`."><title>fixed_queue.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>fixed_queue.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">pub const </span>MAX_THREADS: usize = <span class="number">16</span>;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">pub struct </span>FixedQueue&lt;T: Sized&gt; {
<a href=#4 id=4 data-nosnippet>4</a> data: [<span class="prelude-ty">Option</span>&lt;T&gt;; MAX_THREADS],
<a href=#5 id=5 data-nosnippet>5</a> size: usize,
<a href=#6 id=6 data-nosnippet>6</a> start: usize,
<a href=#7 id=7 data-nosnippet>7</a>}
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">impl</span>&lt;T: Sized&gt; Default <span class="kw">for </span>FixedQueue&lt;T&gt; {
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#10 id=10 data-nosnippet>10</a> <span class="self">Self</span>::new()
<a href=#11 id=11 data-nosnippet>11</a> }
<a href=#12 id=12 data-nosnippet>12</a>}
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">impl</span>&lt;T: Sized&gt; FixedQueue&lt;T&gt; {
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw">pub fn </span>new() -&gt; <span class="self">Self </span>{
<a href=#15 id=15 data-nosnippet>15</a> FixedQueue {
<a href=#16 id=16 data-nosnippet>16</a> data: [
<a href=#17 id=17 data-nosnippet>17</a> <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>, <span class="prelude-val">None</span>,
<a href=#18 id=18 data-nosnippet>18</a> <span class="prelude-val">None</span>, <span class="prelude-val">None</span>,
<a href=#19 id=19 data-nosnippet>19</a> ],
<a href=#20 id=20 data-nosnippet>20</a> size: <span class="number">0</span>,
<a href=#21 id=21 data-nosnippet>21</a> start: <span class="number">0</span>,
<a href=#22 id=22 data-nosnippet>22</a> }
<a href=#23 id=23 data-nosnippet>23</a> }
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">pub fn </span>can_push(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#25 id=25 data-nosnippet>25</a> <span class="self">self</span>.size &lt; <span class="self">self</span>.data.len()
<a href=#26 id=26 data-nosnippet>26</a> }
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">pub fn </span>size(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#28 id=28 data-nosnippet>28</a> <span class="self">self</span>.size
<a href=#29 id=29 data-nosnippet>29</a> }
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">pub fn </span>push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, item: T) -&gt; <span class="prelude-ty">Result</span>&lt;(), ()&gt; {
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">if </span><span class="self">self</span>.size == <span class="self">self</span>.data.len() {
<a href=#32 id=32 data-nosnippet>32</a> <span class="kw">return </span><span class="prelude-val">Err</span>(());
<a href=#33 id=33 data-nosnippet>33</a> }
<a href=#34 id=34 data-nosnippet>34</a> <span class="kw">let </span>index = (<span class="self">self</span>.start + <span class="self">self</span>.size) % <span class="self">self</span>.data.len();
<a href=#35 id=35 data-nosnippet>35</a> <span class="self">self</span>.data[index] = <span class="prelude-val">Some</span>(item);
<a href=#36 id=36 data-nosnippet>36</a> <span class="self">self</span>.size += <span class="number">1</span>;
<a href=#37 id=37 data-nosnippet>37</a> <span class="prelude-val">Ok</span>(())
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a> <span class="kw">pub fn </span>pop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;T&gt; {
<a href=#40 id=40 data-nosnippet>40</a> <span class="kw">if </span><span class="self">self</span>.size == <span class="number">0 </span>{
<a href=#41 id=41 data-nosnippet>41</a> <span class="kw">return </span><span class="prelude-val">None</span>;
<a href=#42 id=42 data-nosnippet>42</a> }
<a href=#43 id=43 data-nosnippet>43</a> <span class="kw">let </span>index = <span class="self">self</span>.start % <span class="self">self</span>.data.len();
<a href=#44 id=44 data-nosnippet>44</a> <span class="kw">let </span>ret = <span class="self">self</span>.data[index].take();
<a href=#45 id=45 data-nosnippet>45</a> <span class="self">self</span>.start += <span class="number">1</span>;
<a href=#46 id=46 data-nosnippet>46</a> <span class="self">self</span>.size -= <span class="number">1</span>;
<a href=#47 id=47 data-nosnippet>47</a> ret
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a> <span class="kw">pub fn </span>how_much_free_space(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#50 id=50 data-nosnippet>50</a> <span class="self">self</span>.data.len() - <span class="self">self</span>.size
<a href=#51 id=51 data-nosnippet>51</a> }
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">pub fn </span>remove&lt;F: Fn(<span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;T&gt;) -&gt; bool&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, f: F) -&gt; <span class="prelude-ty">Option</span>&lt;T&gt; {
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">if </span><span class="self">self</span>.size == <span class="number">0 </span>{
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">return </span><span class="prelude-val">None</span>;
<a href=#55 id=55 data-nosnippet>55</a> }
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">for </span>index <span class="kw">in </span><span class="number">0</span>..<span class="self">self</span>.size {
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw">if </span>f(<span class="kw-2">&amp;</span><span class="self">self</span>.data[(<span class="self">self</span>.start + index) % <span class="self">self</span>.data.len()]) {
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">let </span>start_index = <span class="self">self</span>.start % <span class="self">self</span>.data.len();
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">let </span>target_index = (<span class="self">self</span>.start + index) % <span class="self">self</span>.data.len();
<a href=#60 id=60 data-nosnippet>60</a> <span class="kw">let </span>ret = <span class="self">self</span>.data[target_index].take();
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">let </span>replace = <span class="self">self</span>.data[start_index].take();
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">let </span>is_none = core::mem::replace(<span class="kw-2">&amp;mut </span><span class="self">self</span>.data[target_index], replace);
<a href=#63 id=63 data-nosnippet>63</a> <span class="macro">assert!</span>(is_none.is_none());
<a href=#64 id=64 data-nosnippet>64</a> <span class="self">self</span>.start += <span class="number">1</span>;
<a href=#65 id=65 data-nosnippet>65</a> <span class="self">self</span>.size -= <span class="number">1</span>;
<a href=#66 id=66 data-nosnippet>66</a> <span class="kw">return </span>ret;
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a> }
<a href=#69 id=69 data-nosnippet>69</a> <span class="prelude-val">None
<a href=#70 id=70 data-nosnippet>70</a> </span>}
<a href=#71 id=71 data-nosnippet>71</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,535 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/histogram.rs`."><title>histogram.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>histogram.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::min;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{SliceWrapper, SliceWrapperMut};
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::block_split::BlockSplit;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::command::Command;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::constants::{kSigned3BitContextLookup, kUTF8ContextLookup};
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">super</span>::util::floatX;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">super</span>::vectorization::Mem256i;
<a href=#11 id=11 data-nosnippet>11</a>
<a href=#12 id=12 data-nosnippet>12</a><span class="comment">//#[derive(Clone)] clone is broken for arrays &gt; 32
<a href=#13 id=13 data-nosnippet>13</a></span><span class="kw">pub struct </span>HistogramLiteral {
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw">pub </span>data_: [u32; <span class="number">256</span>],
<a href=#15 id=15 data-nosnippet>15</a> <span class="kw">pub </span>total_count_: usize,
<a href=#16 id=16 data-nosnippet>16</a> <span class="kw">pub </span>bit_cost_: floatX,
<a href=#17 id=17 data-nosnippet>17</a>}
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">impl </span>Clone <span class="kw">for </span>HistogramLiteral {
<a href=#19 id=19 data-nosnippet>19</a> <span class="attr">#[inline(always)]
<a href=#20 id=20 data-nosnippet>20</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; HistogramLiteral {
<a href=#21 id=21 data-nosnippet>21</a> HistogramLiteral {
<a href=#22 id=22 data-nosnippet>22</a> data_: <span class="self">self</span>.data_,
<a href=#23 id=23 data-nosnippet>23</a> total_count_: <span class="self">self</span>.total_count_,
<a href=#24 id=24 data-nosnippet>24</a> bit_cost_: <span class="self">self</span>.bit_cost_,
<a href=#25 id=25 data-nosnippet>25</a> }
<a href=#26 id=26 data-nosnippet>26</a> }
<a href=#27 id=27 data-nosnippet>27</a>}
<a href=#28 id=28 data-nosnippet>28</a><span class="kw">impl </span>Default <span class="kw">for </span>HistogramLiteral {
<a href=#29 id=29 data-nosnippet>29</a> <span class="attr">#[inline(always)]
<a href=#30 id=30 data-nosnippet>30</a> </span><span class="kw">fn </span>default() -&gt; HistogramLiteral {
<a href=#31 id=31 data-nosnippet>31</a> HistogramLiteral {
<a href=#32 id=32 data-nosnippet>32</a> data_: [<span class="number">0</span>; <span class="number">256</span>],
<a href=#33 id=33 data-nosnippet>33</a> total_count_: <span class="number">0</span>,
<a href=#34 id=34 data-nosnippet>34</a> bit_cost_: <span class="number">3.402e+38</span>,
<a href=#35 id=35 data-nosnippet>35</a> }
<a href=#36 id=36 data-nosnippet>36</a> }
<a href=#37 id=37 data-nosnippet>37</a>}
<a href=#38 id=38 data-nosnippet>38</a><span class="comment">//#[derive(Clone)] clone is broken for arrays &gt; 32
<a href=#39 id=39 data-nosnippet>39</a></span><span class="kw">pub struct </span>HistogramCommand {
<a href=#40 id=40 data-nosnippet>40</a> <span class="kw">pub </span>data_: [u32; <span class="number">704</span>],
<a href=#41 id=41 data-nosnippet>41</a> <span class="kw">pub </span>total_count_: usize,
<a href=#42 id=42 data-nosnippet>42</a> <span class="kw">pub </span>bit_cost_: floatX,
<a href=#43 id=43 data-nosnippet>43</a>}
<a href=#44 id=44 data-nosnippet>44</a><span class="kw">impl </span>Clone <span class="kw">for </span>HistogramCommand {
<a href=#45 id=45 data-nosnippet>45</a> <span class="attr">#[inline(always)]
<a href=#46 id=46 data-nosnippet>46</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; HistogramCommand {
<a href=#47 id=47 data-nosnippet>47</a> HistogramCommand {
<a href=#48 id=48 data-nosnippet>48</a> data_: <span class="self">self</span>.data_,
<a href=#49 id=49 data-nosnippet>49</a> total_count_: <span class="self">self</span>.total_count_,
<a href=#50 id=50 data-nosnippet>50</a> bit_cost_: <span class="self">self</span>.bit_cost_,
<a href=#51 id=51 data-nosnippet>51</a> }
<a href=#52 id=52 data-nosnippet>52</a> }
<a href=#53 id=53 data-nosnippet>53</a>}
<a href=#54 id=54 data-nosnippet>54</a><span class="kw">impl </span>Default <span class="kw">for </span>HistogramCommand {
<a href=#55 id=55 data-nosnippet>55</a> <span class="attr">#[inline(always)]
<a href=#56 id=56 data-nosnippet>56</a> </span><span class="kw">fn </span>default() -&gt; HistogramCommand {
<a href=#57 id=57 data-nosnippet>57</a> HistogramCommand {
<a href=#58 id=58 data-nosnippet>58</a> data_: [<span class="number">0</span>; <span class="number">704</span>],
<a href=#59 id=59 data-nosnippet>59</a> total_count_: <span class="number">0</span>,
<a href=#60 id=60 data-nosnippet>60</a> bit_cost_: <span class="number">3.402e+38</span>,
<a href=#61 id=61 data-nosnippet>61</a> }
<a href=#62 id=62 data-nosnippet>62</a> }
<a href=#63 id=63 data-nosnippet>63</a>}
<a href=#64 id=64 data-nosnippet>64</a><span class="comment">//#[derive(Clone)] // #derive is broken for arrays &gt; 32
<a href=#65 id=65 data-nosnippet>65</a>
<a href=#66 id=66 data-nosnippet>66</a></span><span class="attr">#[cfg(not(feature = <span class="string">"disallow_large_window_size"</span>))]
<a href=#67 id=67 data-nosnippet>67</a></span><span class="kw">const </span>BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS: usize = <span class="number">544</span>;
<a href=#68 id=68 data-nosnippet>68</a><span class="attr">#[cfg(feature = <span class="string">"disallow_large_window_size"</span>)]
<a href=#69 id=69 data-nosnippet>69</a></span><span class="kw">const </span>BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS: usize = <span class="number">520</span>;
<a href=#70 id=70 data-nosnippet>70</a>
<a href=#71 id=71 data-nosnippet>71</a><span class="kw">pub struct </span>HistogramDistance {
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">pub </span>data_: [u32; BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS],
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">pub </span>total_count_: usize,
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">pub </span>bit_cost_: floatX,
<a href=#75 id=75 data-nosnippet>75</a>}
<a href=#76 id=76 data-nosnippet>76</a><span class="kw">impl </span>Clone <span class="kw">for </span>HistogramDistance {
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; HistogramDistance {
<a href=#78 id=78 data-nosnippet>78</a> HistogramDistance {
<a href=#79 id=79 data-nosnippet>79</a> data_: <span class="self">self</span>.data_,
<a href=#80 id=80 data-nosnippet>80</a> total_count_: <span class="self">self</span>.total_count_,
<a href=#81 id=81 data-nosnippet>81</a> bit_cost_: <span class="self">self</span>.bit_cost_,
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a> }
<a href=#84 id=84 data-nosnippet>84</a>}
<a href=#85 id=85 data-nosnippet>85</a><span class="kw">impl </span>Default <span class="kw">for </span>HistogramDistance {
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">fn </span>default() -&gt; HistogramDistance {
<a href=#87 id=87 data-nosnippet>87</a> HistogramDistance {
<a href=#88 id=88 data-nosnippet>88</a> data_: [<span class="number">0</span>; BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS],
<a href=#89 id=89 data-nosnippet>89</a> total_count_: <span class="number">0</span>,
<a href=#90 id=90 data-nosnippet>90</a> bit_cost_: <span class="number">3.402e+38</span>,
<a href=#91 id=91 data-nosnippet>91</a> }
<a href=#92 id=92 data-nosnippet>92</a> }
<a href=#93 id=93 data-nosnippet>93</a>}
<a href=#94 id=94 data-nosnippet>94</a>
<a href=#95 id=95 data-nosnippet>95</a><span class="kw">pub trait </span>CostAccessors {
<a href=#96 id=96 data-nosnippet>96</a> <span class="kw">type </span>i32vec: Sized + SliceWrapper&lt;Mem256i&gt; + SliceWrapperMut&lt;Mem256i&gt;;
<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">fn </span>make_nnz_storage() -&gt; <span class="self">Self</span>::i32vec;
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">fn </span>total_count(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize;
<a href=#99 id=99 data-nosnippet>99</a> <span class="kw">fn </span>bit_cost(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; floatX;
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">fn </span>set_bit_cost(<span class="kw-2">&amp;mut </span><span class="self">self</span>, cost: floatX);
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">fn </span>set_total_count(<span class="kw-2">&amp;mut </span><span class="self">self</span>, count: usize);
<a href=#102 id=102 data-nosnippet>102</a>}
<a href=#103 id=103 data-nosnippet>103</a><span class="kw">impl </span>SliceWrapper&lt;u32&gt; <span class="kw">for </span>HistogramLiteral {
<a href=#104 id=104 data-nosnippet>104</a> <span class="attr">#[inline(always)]
<a href=#105 id=105 data-nosnippet>105</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u32] {
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw-2">&amp;</span><span class="self">self</span>.data_[..]
<a href=#107 id=107 data-nosnippet>107</a> }
<a href=#108 id=108 data-nosnippet>108</a>}
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">impl </span>SliceWrapperMut&lt;u32&gt; <span class="kw">for </span>HistogramLiteral {
<a href=#110 id=110 data-nosnippet>110</a> <span class="attr">#[inline(always)]
<a href=#111 id=111 data-nosnippet>111</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u32] {
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.data_[..]
<a href=#113 id=113 data-nosnippet>113</a> }
<a href=#114 id=114 data-nosnippet>114</a>}
<a href=#115 id=115 data-nosnippet>115</a><span class="kw">pub struct </span>Array264i([Mem256i; <span class="number">33</span>]);
<a href=#116 id=116 data-nosnippet>116</a><span class="kw">impl </span>SliceWrapperMut&lt;Mem256i&gt; <span class="kw">for </span>Array264i {
<a href=#117 id=117 data-nosnippet>117</a> <span class="attr">#[inline(always)]
<a href=#118 id=118 data-nosnippet>118</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[Mem256i] {
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>[..]
<a href=#120 id=120 data-nosnippet>120</a> }
<a href=#121 id=121 data-nosnippet>121</a>}
<a href=#122 id=122 data-nosnippet>122</a>
<a href=#123 id=123 data-nosnippet>123</a><span class="kw">impl </span>SliceWrapper&lt;Mem256i&gt; <span class="kw">for </span>Array264i {
<a href=#124 id=124 data-nosnippet>124</a> <span class="attr">#[inline(always)]
<a href=#125 id=125 data-nosnippet>125</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[Mem256i] {
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>[..]
<a href=#127 id=127 data-nosnippet>127</a> }
<a href=#128 id=128 data-nosnippet>128</a>}
<a href=#129 id=129 data-nosnippet>129</a><span class="kw">impl </span>Default <span class="kw">for </span>Array264i {
<a href=#130 id=130 data-nosnippet>130</a> <span class="attr">#[inline(always)]
<a href=#131 id=131 data-nosnippet>131</a> </span><span class="kw">fn </span>default() -&gt; Array264i {
<a href=#132 id=132 data-nosnippet>132</a> Array264i([Mem256i::default(); <span class="number">33</span>])
<a href=#133 id=133 data-nosnippet>133</a> }
<a href=#134 id=134 data-nosnippet>134</a>}
<a href=#135 id=135 data-nosnippet>135</a><span class="kw">pub struct </span>Array528i([Mem256i; <span class="number">66</span>]);
<a href=#136 id=136 data-nosnippet>136</a><span class="kw">impl </span>SliceWrapperMut&lt;Mem256i&gt; <span class="kw">for </span>Array528i {
<a href=#137 id=137 data-nosnippet>137</a> <span class="attr">#[inline(always)]
<a href=#138 id=138 data-nosnippet>138</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[Mem256i] {
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>[..]
<a href=#140 id=140 data-nosnippet>140</a> }
<a href=#141 id=141 data-nosnippet>141</a>}
<a href=#142 id=142 data-nosnippet>142</a><span class="kw">impl </span>SliceWrapper&lt;Mem256i&gt; <span class="kw">for </span>Array528i {
<a href=#143 id=143 data-nosnippet>143</a> <span class="attr">#[inline(always)]
<a href=#144 id=144 data-nosnippet>144</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[Mem256i] {
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>[..]
<a href=#146 id=146 data-nosnippet>146</a> }
<a href=#147 id=147 data-nosnippet>147</a>}
<a href=#148 id=148 data-nosnippet>148</a><span class="kw">impl </span>Default <span class="kw">for </span>Array528i {
<a href=#149 id=149 data-nosnippet>149</a> <span class="attr">#[inline(always)]
<a href=#150 id=150 data-nosnippet>150</a> </span><span class="kw">fn </span>default() -&gt; Array528i {
<a href=#151 id=151 data-nosnippet>151</a> Array528i([Mem256i::default(); <span class="number">66</span>])
<a href=#152 id=152 data-nosnippet>152</a> }
<a href=#153 id=153 data-nosnippet>153</a>}
<a href=#154 id=154 data-nosnippet>154</a>
<a href=#155 id=155 data-nosnippet>155</a><span class="kw">pub struct </span>Array712i([Mem256i; <span class="number">89</span>]);
<a href=#156 id=156 data-nosnippet>156</a><span class="kw">impl </span>SliceWrapperMut&lt;Mem256i&gt; <span class="kw">for </span>Array712i {
<a href=#157 id=157 data-nosnippet>157</a> <span class="attr">#[inline(always)]
<a href=#158 id=158 data-nosnippet>158</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[Mem256i] {
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>[..]
<a href=#160 id=160 data-nosnippet>160</a> }
<a href=#161 id=161 data-nosnippet>161</a>}
<a href=#162 id=162 data-nosnippet>162</a><span class="kw">impl </span>SliceWrapper&lt;Mem256i&gt; <span class="kw">for </span>Array712i {
<a href=#163 id=163 data-nosnippet>163</a> <span class="attr">#[inline(always)]
<a href=#164 id=164 data-nosnippet>164</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[Mem256i] {
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>[..]
<a href=#166 id=166 data-nosnippet>166</a> }
<a href=#167 id=167 data-nosnippet>167</a>}
<a href=#168 id=168 data-nosnippet>168</a><span class="kw">impl </span>Default <span class="kw">for </span>Array712i {
<a href=#169 id=169 data-nosnippet>169</a> <span class="attr">#[inline(always)]
<a href=#170 id=170 data-nosnippet>170</a> </span><span class="kw">fn </span>default() -&gt; Array712i {
<a href=#171 id=171 data-nosnippet>171</a> Array712i([Mem256i::default(); <span class="number">89</span>])
<a href=#172 id=172 data-nosnippet>172</a> }
<a href=#173 id=173 data-nosnippet>173</a>}
<a href=#174 id=174 data-nosnippet>174</a>
<a href=#175 id=175 data-nosnippet>175</a><span class="kw">pub struct </span>EmptyIVec {}
<a href=#176 id=176 data-nosnippet>176</a>
<a href=#177 id=177 data-nosnippet>177</a><span class="kw">impl </span>SliceWrapperMut&lt;Mem256i&gt; <span class="kw">for </span>EmptyIVec {
<a href=#178 id=178 data-nosnippet>178</a> <span class="attr">#[inline(always)]
<a href=#179 id=179 data-nosnippet>179</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[Mem256i] {
<a href=#180 id=180 data-nosnippet>180</a> <span class="kw-2">&amp;mut </span>[]
<a href=#181 id=181 data-nosnippet>181</a> }
<a href=#182 id=182 data-nosnippet>182</a>}
<a href=#183 id=183 data-nosnippet>183</a><span class="kw">impl </span>SliceWrapper&lt;Mem256i&gt; <span class="kw">for </span>EmptyIVec {
<a href=#184 id=184 data-nosnippet>184</a> <span class="attr">#[inline(always)]
<a href=#185 id=185 data-nosnippet>185</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[Mem256i] {
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw-2">&amp;</span>[]
<a href=#187 id=187 data-nosnippet>187</a> }
<a href=#188 id=188 data-nosnippet>188</a>}
<a href=#189 id=189 data-nosnippet>189</a>
<a href=#190 id=190 data-nosnippet>190</a><span class="kw">impl </span>Default <span class="kw">for </span>EmptyIVec {
<a href=#191 id=191 data-nosnippet>191</a> <span class="attr">#[inline(always)]
<a href=#192 id=192 data-nosnippet>192</a> </span><span class="kw">fn </span>default() -&gt; EmptyIVec {
<a href=#193 id=193 data-nosnippet>193</a> EmptyIVec {}
<a href=#194 id=194 data-nosnippet>194</a> }
<a href=#195 id=195 data-nosnippet>195</a>}
<a href=#196 id=196 data-nosnippet>196</a>
<a href=#197 id=197 data-nosnippet>197</a><span class="attr">#[cfg(feature = <span class="string">"vector_scratch_space"</span>)]
<a href=#198 id=198 data-nosnippet>198</a></span><span class="kw">pub type </span>HistogramLiteralScratch = Array264i;
<a href=#199 id=199 data-nosnippet>199</a>
<a href=#200 id=200 data-nosnippet>200</a><span class="attr">#[cfg(not(feature = <span class="string">"vector_scratch_space"</span>))]
<a href=#201 id=201 data-nosnippet>201</a></span><span class="kw">pub type </span>HistogramLiteralScratch = EmptyIVec;
<a href=#202 id=202 data-nosnippet>202</a>
<a href=#203 id=203 data-nosnippet>203</a><span class="kw">impl </span>CostAccessors <span class="kw">for </span>HistogramLiteral {
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">type </span>i32vec = HistogramLiteralScratch;
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">fn </span>make_nnz_storage() -&gt; <span class="self">Self</span>::i32vec {
<a href=#206 id=206 data-nosnippet>206</a> HistogramLiteralScratch::default()
<a href=#207 id=207 data-nosnippet>207</a> }
<a href=#208 id=208 data-nosnippet>208</a> <span class="attr">#[inline(always)]
<a href=#209 id=209 data-nosnippet>209</a> </span><span class="kw">fn </span>total_count(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#210 id=210 data-nosnippet>210</a> <span class="self">self</span>.total_count_
<a href=#211 id=211 data-nosnippet>211</a> }
<a href=#212 id=212 data-nosnippet>212</a> <span class="attr">#[inline(always)]
<a href=#213 id=213 data-nosnippet>213</a> </span><span class="kw">fn </span>bit_cost(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; floatX {
<a href=#214 id=214 data-nosnippet>214</a> <span class="self">self</span>.bit_cost_
<a href=#215 id=215 data-nosnippet>215</a> }
<a href=#216 id=216 data-nosnippet>216</a> <span class="attr">#[inline(always)]
<a href=#217 id=217 data-nosnippet>217</a> </span><span class="kw">fn </span>set_bit_cost(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: floatX) {
<a href=#218 id=218 data-nosnippet>218</a> <span class="self">self</span>.bit_cost_ = data;
<a href=#219 id=219 data-nosnippet>219</a> }
<a href=#220 id=220 data-nosnippet>220</a> <span class="attr">#[inline(always)]
<a href=#221 id=221 data-nosnippet>221</a> </span><span class="kw">fn </span>set_total_count(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: usize) {
<a href=#222 id=222 data-nosnippet>222</a> <span class="self">self</span>.total_count_ = data;
<a href=#223 id=223 data-nosnippet>223</a> }
<a href=#224 id=224 data-nosnippet>224</a>}
<a href=#225 id=225 data-nosnippet>225</a>
<a href=#226 id=226 data-nosnippet>226</a><span class="kw">impl </span>SliceWrapper&lt;u32&gt; <span class="kw">for </span>HistogramCommand {
<a href=#227 id=227 data-nosnippet>227</a> <span class="attr">#[inline(always)]
<a href=#228 id=228 data-nosnippet>228</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u32] {
<a href=#229 id=229 data-nosnippet>229</a> <span class="kw-2">&amp;</span><span class="self">self</span>.data_[..]
<a href=#230 id=230 data-nosnippet>230</a> }
<a href=#231 id=231 data-nosnippet>231</a>}
<a href=#232 id=232 data-nosnippet>232</a><span class="kw">impl </span>SliceWrapperMut&lt;u32&gt; <span class="kw">for </span>HistogramCommand {
<a href=#233 id=233 data-nosnippet>233</a> <span class="attr">#[inline(always)]
<a href=#234 id=234 data-nosnippet>234</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u32] {
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.data_[..]
<a href=#236 id=236 data-nosnippet>236</a> }
<a href=#237 id=237 data-nosnippet>237</a>}
<a href=#238 id=238 data-nosnippet>238</a>
<a href=#239 id=239 data-nosnippet>239</a><span class="attr">#[cfg(feature = <span class="string">"vector_scratch_space"</span>)]
<a href=#240 id=240 data-nosnippet>240</a></span><span class="kw">pub type </span>HistogramCommandScratch = Array712i;
<a href=#241 id=241 data-nosnippet>241</a>
<a href=#242 id=242 data-nosnippet>242</a><span class="attr">#[cfg(not(feature = <span class="string">"vector_scratch_space"</span>))]
<a href=#243 id=243 data-nosnippet>243</a></span><span class="kw">pub type </span>HistogramCommandScratch = EmptyIVec;
<a href=#244 id=244 data-nosnippet>244</a>
<a href=#245 id=245 data-nosnippet>245</a><span class="kw">impl </span>CostAccessors <span class="kw">for </span>HistogramCommand {
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">type </span>i32vec = HistogramCommandScratch;
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">fn </span>make_nnz_storage() -&gt; <span class="self">Self</span>::i32vec {
<a href=#248 id=248 data-nosnippet>248</a> HistogramCommandScratch::default()
<a href=#249 id=249 data-nosnippet>249</a> }
<a href=#250 id=250 data-nosnippet>250</a> <span class="attr">#[inline(always)]
<a href=#251 id=251 data-nosnippet>251</a> </span><span class="kw">fn </span>total_count(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#252 id=252 data-nosnippet>252</a> <span class="self">self</span>.total_count_
<a href=#253 id=253 data-nosnippet>253</a> }
<a href=#254 id=254 data-nosnippet>254</a> <span class="attr">#[inline(always)]
<a href=#255 id=255 data-nosnippet>255</a> </span><span class="kw">fn </span>bit_cost(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; floatX {
<a href=#256 id=256 data-nosnippet>256</a> <span class="self">self</span>.bit_cost_
<a href=#257 id=257 data-nosnippet>257</a> }
<a href=#258 id=258 data-nosnippet>258</a> <span class="attr">#[inline(always)]
<a href=#259 id=259 data-nosnippet>259</a> </span><span class="kw">fn </span>set_bit_cost(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: floatX) {
<a href=#260 id=260 data-nosnippet>260</a> <span class="self">self</span>.bit_cost_ = data;
<a href=#261 id=261 data-nosnippet>261</a> }
<a href=#262 id=262 data-nosnippet>262</a> <span class="attr">#[inline(always)]
<a href=#263 id=263 data-nosnippet>263</a> </span><span class="kw">fn </span>set_total_count(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: usize) {
<a href=#264 id=264 data-nosnippet>264</a> <span class="self">self</span>.total_count_ = data;
<a href=#265 id=265 data-nosnippet>265</a> }
<a href=#266 id=266 data-nosnippet>266</a>}
<a href=#267 id=267 data-nosnippet>267</a>
<a href=#268 id=268 data-nosnippet>268</a><span class="kw">impl </span>SliceWrapper&lt;u32&gt; <span class="kw">for </span>HistogramDistance {
<a href=#269 id=269 data-nosnippet>269</a> <span class="attr">#[inline(always)]
<a href=#270 id=270 data-nosnippet>270</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u32] {
<a href=#271 id=271 data-nosnippet>271</a> <span class="kw-2">&amp;</span><span class="self">self</span>.data_[..]
<a href=#272 id=272 data-nosnippet>272</a> }
<a href=#273 id=273 data-nosnippet>273</a>}
<a href=#274 id=274 data-nosnippet>274</a><span class="kw">impl </span>SliceWrapperMut&lt;u32&gt; <span class="kw">for </span>HistogramDistance {
<a href=#275 id=275 data-nosnippet>275</a> <span class="attr">#[inline(always)]
<a href=#276 id=276 data-nosnippet>276</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u32] {
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.data_[..]
<a href=#278 id=278 data-nosnippet>278</a> }
<a href=#279 id=279 data-nosnippet>279</a>}
<a href=#280 id=280 data-nosnippet>280</a>
<a href=#281 id=281 data-nosnippet>281</a><span class="attr">#[cfg(feature = <span class="string">"vector_scratch_space"</span>)]
<a href=#282 id=282 data-nosnippet>282</a></span><span class="kw">pub type </span>HistogramDistanceScratch = Array528i;
<a href=#283 id=283 data-nosnippet>283</a>
<a href=#284 id=284 data-nosnippet>284</a><span class="attr">#[cfg(not(feature = <span class="string">"vector_scratch_space"</span>))]
<a href=#285 id=285 data-nosnippet>285</a></span><span class="kw">pub type </span>HistogramDistanceScratch = EmptyIVec;
<a href=#286 id=286 data-nosnippet>286</a>
<a href=#287 id=287 data-nosnippet>287</a><span class="kw">impl </span>CostAccessors <span class="kw">for </span>HistogramDistance {
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">type </span>i32vec = HistogramDistanceScratch;
<a href=#289 id=289 data-nosnippet>289</a> <span class="kw">fn </span>make_nnz_storage() -&gt; <span class="self">Self</span>::i32vec {
<a href=#290 id=290 data-nosnippet>290</a> HistogramDistanceScratch::default()
<a href=#291 id=291 data-nosnippet>291</a> }
<a href=#292 id=292 data-nosnippet>292</a>
<a href=#293 id=293 data-nosnippet>293</a> <span class="attr">#[inline(always)]
<a href=#294 id=294 data-nosnippet>294</a> </span><span class="kw">fn </span>total_count(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#295 id=295 data-nosnippet>295</a> <span class="self">self</span>.total_count_
<a href=#296 id=296 data-nosnippet>296</a> }
<a href=#297 id=297 data-nosnippet>297</a> <span class="attr">#[inline(always)]
<a href=#298 id=298 data-nosnippet>298</a> </span><span class="kw">fn </span>bit_cost(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; floatX {
<a href=#299 id=299 data-nosnippet>299</a> <span class="self">self</span>.bit_cost_
<a href=#300 id=300 data-nosnippet>300</a> }
<a href=#301 id=301 data-nosnippet>301</a> <span class="attr">#[inline(always)]
<a href=#302 id=302 data-nosnippet>302</a> </span><span class="kw">fn </span>set_bit_cost(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: floatX) {
<a href=#303 id=303 data-nosnippet>303</a> <span class="self">self</span>.bit_cost_ = data;
<a href=#304 id=304 data-nosnippet>304</a> }
<a href=#305 id=305 data-nosnippet>305</a> <span class="attr">#[inline(always)]
<a href=#306 id=306 data-nosnippet>306</a> </span><span class="kw">fn </span>set_total_count(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: usize) {
<a href=#307 id=307 data-nosnippet>307</a> <span class="self">self</span>.total_count_ = data;
<a href=#308 id=308 data-nosnippet>308</a> }
<a href=#309 id=309 data-nosnippet>309</a>}
<a href=#310 id=310 data-nosnippet>310</a>
<a href=#311 id=311 data-nosnippet>311</a><span class="attr">#[derive(Copy, Clone)]
<a href=#312 id=312 data-nosnippet>312</a></span><span class="kw">pub enum </span>ContextType {
<a href=#313 id=313 data-nosnippet>313</a> CONTEXT_LSB6 = <span class="number">0</span>,
<a href=#314 id=314 data-nosnippet>314</a> CONTEXT_MSB6 = <span class="number">1</span>,
<a href=#315 id=315 data-nosnippet>315</a> CONTEXT_UTF8 = <span class="number">2</span>,
<a href=#316 id=316 data-nosnippet>316</a> CONTEXT_SIGNED = <span class="number">3</span>,
<a href=#317 id=317 data-nosnippet>317</a>}
<a href=#318 id=318 data-nosnippet>318</a>
<a href=#319 id=319 data-nosnippet>319</a><span class="kw">impl </span>Default <span class="kw">for </span>ContextType {
<a href=#320 id=320 data-nosnippet>320</a> <span class="attr">#[inline(always)]
<a href=#321 id=321 data-nosnippet>321</a> </span><span class="kw">fn </span>default() -&gt; ContextType {
<a href=#322 id=322 data-nosnippet>322</a> ContextType::CONTEXT_LSB6
<a href=#323 id=323 data-nosnippet>323</a> }
<a href=#324 id=324 data-nosnippet>324</a>}
<a href=#325 id=325 data-nosnippet>325</a>
<a href=#326 id=326 data-nosnippet>326</a><span class="kw">pub struct </span>BlockSplitIterator&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u8&gt; + <span class="lifetime">'a </span>+ alloc::Allocator&lt;u32&gt; + <span class="lifetime">'a</span>&gt; {
<a href=#327 id=327 data-nosnippet>327</a> <span class="kw">pub </span>split_: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>BlockSplit&lt;Alloc&gt;,
<a href=#328 id=328 data-nosnippet>328</a> <span class="kw">pub </span>idx_: usize,
<a href=#329 id=329 data-nosnippet>329</a> <span class="kw">pub </span>type_: usize,
<a href=#330 id=330 data-nosnippet>330</a> <span class="kw">pub </span>length_: usize,
<a href=#331 id=331 data-nosnippet>331</a>}
<a href=#332 id=332 data-nosnippet>332</a>
<a href=#333 id=333 data-nosnippet>333</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u8&gt; + alloc::Allocator&lt;u32&gt; + <span class="lifetime">'a</span>&gt; BlockSplitIterator&lt;<span class="lifetime">'a</span>, Alloc&gt; {
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">fn </span>new(split: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>BlockSplit&lt;Alloc&gt;) -&gt; <span class="self">Self </span>{
<a href=#335 id=335 data-nosnippet>335</a> <span class="self">Self </span>{
<a href=#336 id=336 data-nosnippet>336</a> split_: split,
<a href=#337 id=337 data-nosnippet>337</a> idx_: <span class="number">0</span>,
<a href=#338 id=338 data-nosnippet>338</a> type_: <span class="number">0</span>,
<a href=#339 id=339 data-nosnippet>339</a> length_: <span class="kw">if </span>!split.lengths.slice().is_empty() {
<a href=#340 id=340 data-nosnippet>340</a> split.lengths.slice()[<span class="number">0</span>] <span class="kw">as </span>usize
<a href=#341 id=341 data-nosnippet>341</a> } <span class="kw">else </span>{
<a href=#342 id=342 data-nosnippet>342</a> <span class="number">0
<a href=#343 id=343 data-nosnippet>343</a> </span>},
<a href=#344 id=344 data-nosnippet>344</a> }
<a href=#345 id=345 data-nosnippet>345</a> }
<a href=#346 id=346 data-nosnippet>346</a>
<a href=#347 id=347 data-nosnippet>347</a> <span class="kw">fn </span>next(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#348 id=348 data-nosnippet>348</a> <span class="kw">if </span><span class="self">self</span>.length_ == <span class="number">0 </span>{
<a href=#349 id=349 data-nosnippet>349</a> <span class="self">self</span>.idx_ = <span class="self">self</span>.idx_.wrapping_add(<span class="number">1</span>);
<a href=#350 id=350 data-nosnippet>350</a> <span class="self">self</span>.type_ = <span class="self">self</span>.split_.types.slice()[<span class="self">self</span>.idx_] <span class="kw">as </span>usize;
<a href=#351 id=351 data-nosnippet>351</a> <span class="self">self</span>.length_ = <span class="self">self</span>.split_.lengths.slice()[<span class="self">self</span>.idx_] <span class="kw">as </span>usize;
<a href=#352 id=352 data-nosnippet>352</a> }
<a href=#353 id=353 data-nosnippet>353</a> <span class="self">self</span>.length_ = <span class="self">self</span>.length_.wrapping_sub(<span class="number">1</span>);
<a href=#354 id=354 data-nosnippet>354</a> }
<a href=#355 id=355 data-nosnippet>355</a>}
<a href=#356 id=356 data-nosnippet>356</a>
<a href=#357 id=357 data-nosnippet>357</a><span class="kw">pub fn </span>HistogramAddItem&lt;HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors&gt;(
<a href=#358 id=358 data-nosnippet>358</a> xself: <span class="kw-2">&amp;mut </span>HistogramType,
<a href=#359 id=359 data-nosnippet>359</a> val: usize,
<a href=#360 id=360 data-nosnippet>360</a>) {
<a href=#361 id=361 data-nosnippet>361</a> {
<a href=#362 id=362 data-nosnippet>362</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#363 id=363 data-nosnippet>363</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>xself.slice_mut()[val];
<a href=#364 id=364 data-nosnippet>364</a> <span class="kw">let </span>val = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#365 id=365 data-nosnippet>365</a> <span class="kw-2">*</span>_lhs = val;
<a href=#366 id=366 data-nosnippet>366</a> }
<a href=#367 id=367 data-nosnippet>367</a> <span class="kw">let </span>new_count = xself.total_count().wrapping_add(<span class="number">1</span>);
<a href=#368 id=368 data-nosnippet>368</a> xself.set_total_count(new_count);
<a href=#369 id=369 data-nosnippet>369</a>}
<a href=#370 id=370 data-nosnippet>370</a><span class="kw">pub fn </span>HistogramAddVector&lt;
<a href=#371 id=371 data-nosnippet>371</a> HistogramType: SliceWrapper&lt;u32&gt; + SliceWrapperMut&lt;u32&gt; + CostAccessors,
<a href=#372 id=372 data-nosnippet>372</a> IntegerType: Sized + Clone,
<a href=#373 id=373 data-nosnippet>373</a>&gt;(
<a href=#374 id=374 data-nosnippet>374</a> xself: <span class="kw-2">&amp;mut </span>HistogramType,
<a href=#375 id=375 data-nosnippet>375</a> p: <span class="kw-2">&amp;</span>[IntegerType],
<a href=#376 id=376 data-nosnippet>376</a> n: usize,
<a href=#377 id=377 data-nosnippet>377</a>) <span class="kw">where
<a href=#378 id=378 data-nosnippet>378</a> </span>u64: core::convert::From&lt;IntegerType&gt;,
<a href=#379 id=379 data-nosnippet>379</a>{
<a href=#380 id=380 data-nosnippet>380</a> <span class="kw">let </span>new_tc = xself.total_count().wrapping_add(n);
<a href=#381 id=381 data-nosnippet>381</a> xself.set_total_count(new_tc);
<a href=#382 id=382 data-nosnippet>382</a> <span class="kw">for </span>p_item <span class="kw">in </span>p[..n].iter() {
<a href=#383 id=383 data-nosnippet>383</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#384 id=384 data-nosnippet>384</a> <span class="kw">let </span>index: usize = u64::from(p_item.clone()) <span class="kw">as </span>usize;
<a href=#385 id=385 data-nosnippet>385</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>xself.slice_mut()[index];
<a href=#386 id=386 data-nosnippet>386</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>u32);
<a href=#387 id=387 data-nosnippet>387</a> }
<a href=#388 id=388 data-nosnippet>388</a>}
<a href=#389 id=389 data-nosnippet>389</a>
<a href=#390 id=390 data-nosnippet>390</a><span class="attr">#[inline(always)]
<a href=#391 id=391 data-nosnippet>391</a></span><span class="kw">pub fn </span>HistogramClear&lt;HistogramType: SliceWrapperMut&lt;u32&gt; + CostAccessors&gt;(
<a href=#392 id=392 data-nosnippet>392</a> xself: <span class="kw-2">&amp;mut </span>HistogramType,
<a href=#393 id=393 data-nosnippet>393</a>) {
<a href=#394 id=394 data-nosnippet>394</a> <span class="kw">for </span>data_elem <span class="kw">in </span>xself.slice_mut().iter_mut() {
<a href=#395 id=395 data-nosnippet>395</a> <span class="kw-2">*</span>data_elem = <span class="number">0</span>;
<a href=#396 id=396 data-nosnippet>396</a> }
<a href=#397 id=397 data-nosnippet>397</a> xself.set_total_count(<span class="number">0</span>);
<a href=#398 id=398 data-nosnippet>398</a> xself.set_bit_cost(<span class="number">3.402e+38</span>);
<a href=#399 id=399 data-nosnippet>399</a>}
<a href=#400 id=400 data-nosnippet>400</a><span class="kw">pub fn </span>ClearHistograms&lt;HistogramType: SliceWrapperMut&lt;u32&gt; + CostAccessors&gt;(
<a href=#401 id=401 data-nosnippet>401</a> array: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#402 id=402 data-nosnippet>402</a> length: usize,
<a href=#403 id=403 data-nosnippet>403</a>) {
<a href=#404 id=404 data-nosnippet>404</a> <span class="kw">for </span>item <span class="kw">in </span>array[..length].iter_mut() {
<a href=#405 id=405 data-nosnippet>405</a> HistogramClear(item)
<a href=#406 id=406 data-nosnippet>406</a> }
<a href=#407 id=407 data-nosnippet>407</a>}
<a href=#408 id=408 data-nosnippet>408</a>
<a href=#409 id=409 data-nosnippet>409</a><span class="attr">#[inline(always)]
<a href=#410 id=410 data-nosnippet>410</a></span><span class="kw">pub fn </span>HistogramAddHistogram&lt;
<a href=#411 id=411 data-nosnippet>411</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors,
<a href=#412 id=412 data-nosnippet>412</a>&gt;(
<a href=#413 id=413 data-nosnippet>413</a> xself: <span class="kw-2">&amp;mut </span>HistogramType,
<a href=#414 id=414 data-nosnippet>414</a> v: <span class="kw-2">&amp;</span>HistogramType,
<a href=#415 id=415 data-nosnippet>415</a>) {
<a href=#416 id=416 data-nosnippet>416</a> <span class="kw">let </span>old_total_count = xself.total_count();
<a href=#417 id=417 data-nosnippet>417</a> xself.set_total_count(old_total_count + (<span class="kw-2">*</span>v).total_count());
<a href=#418 id=418 data-nosnippet>418</a> <span class="kw">let </span>h0 = xself.slice_mut();
<a href=#419 id=419 data-nosnippet>419</a> <span class="kw">let </span>h1 = v.slice();
<a href=#420 id=420 data-nosnippet>420</a> <span class="kw">let </span>n = min(h0.len(), h1.len());
<a href=#421 id=421 data-nosnippet>421</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..n {
<a href=#422 id=422 data-nosnippet>422</a> <span class="kw">let </span>h0val = <span class="kw-2">&amp;mut </span>h0[i];
<a href=#423 id=423 data-nosnippet>423</a> <span class="kw">let </span>val = h0val.wrapping_add(h1[i]);
<a href=#424 id=424 data-nosnippet>424</a> <span class="kw-2">*</span>h0val = val;
<a href=#425 id=425 data-nosnippet>425</a> }
<a href=#426 id=426 data-nosnippet>426</a>}
<a href=#427 id=427 data-nosnippet>427</a><span class="kw">pub fn </span>HistogramSelfAddHistogram&lt;
<a href=#428 id=428 data-nosnippet>428</a> HistogramType: SliceWrapperMut&lt;u32&gt; + SliceWrapper&lt;u32&gt; + CostAccessors,
<a href=#429 id=429 data-nosnippet>429</a>&gt;(
<a href=#430 id=430 data-nosnippet>430</a> xself: <span class="kw-2">&amp;mut </span>[HistogramType],
<a href=#431 id=431 data-nosnippet>431</a> i0: usize,
<a href=#432 id=432 data-nosnippet>432</a> i1: usize,
<a href=#433 id=433 data-nosnippet>433</a>) {
<a href=#434 id=434 data-nosnippet>434</a> <span class="kw">let </span>tc_new = xself[i1].total_count();
<a href=#435 id=435 data-nosnippet>435</a> <span class="kw">let </span>tc_old = xself[i0].total_count();
<a href=#436 id=436 data-nosnippet>436</a> xself[i0].set_total_count(tc_old.wrapping_add(tc_new));
<a href=#437 id=437 data-nosnippet>437</a> <span class="kw">let </span>h0 = xself[i0].slice().len();
<a href=#438 id=438 data-nosnippet>438</a> <span class="kw">let </span>h0a = xself[i0].slice().len();
<a href=#439 id=439 data-nosnippet>439</a> <span class="kw">let </span>h1 = xself[i1].slice().len();
<a href=#440 id=440 data-nosnippet>440</a> <span class="kw">let </span>n = min(h0, min(h0a, h1));
<a href=#441 id=441 data-nosnippet>441</a> <span class="kw">for </span>h_index <span class="kw">in </span><span class="number">0</span>..n {
<a href=#442 id=442 data-nosnippet>442</a> <span class="kw">let </span>val = xself[i0].slice()[h_index].wrapping_add(xself[i1].slice()[h_index]);
<a href=#443 id=443 data-nosnippet>443</a> xself[i0].slice_mut()[h_index] = val;
<a href=#444 id=444 data-nosnippet>444</a> }
<a href=#445 id=445 data-nosnippet>445</a>}
<a href=#446 id=446 data-nosnippet>446</a>
<a href=#447 id=447 data-nosnippet>447</a><span class="attr">#[inline(always)]
<a href=#448 id=448 data-nosnippet>448</a></span><span class="kw">pub fn </span>Context(p1: u8, p2: u8, mode: ContextType) -&gt; u8 {
<a href=#449 id=449 data-nosnippet>449</a> <span class="kw">match </span>mode {
<a href=#450 id=450 data-nosnippet>450</a> ContextType::CONTEXT_SIGNED =&gt; {
<a href=#451 id=451 data-nosnippet>451</a> (((kSigned3BitContextLookup[p1 <span class="kw">as </span>usize] <span class="kw">as </span>i32) &lt;&lt; <span class="number">3</span>)
<a href=#452 id=452 data-nosnippet>452</a> + kSigned3BitContextLookup[p2 <span class="kw">as </span>usize] <span class="kw">as </span>i32) <span class="kw">as </span>u8
<a href=#453 id=453 data-nosnippet>453</a> }
<a href=#454 id=454 data-nosnippet>454</a> ContextType::CONTEXT_UTF8 =&gt; {
<a href=#455 id=455 data-nosnippet>455</a> (kUTF8ContextLookup[p1 <span class="kw">as </span>usize] <span class="kw">as </span>i32
<a href=#456 id=456 data-nosnippet>456</a> | kUTF8ContextLookup[(p2 <span class="kw">as </span>i32 + <span class="number">256i32</span>) <span class="kw">as </span>usize] <span class="kw">as </span>i32) <span class="kw">as </span>u8
<a href=#457 id=457 data-nosnippet>457</a> }
<a href=#458 id=458 data-nosnippet>458</a> ContextType::CONTEXT_MSB6 =&gt; (p1 <span class="kw">as </span>i32 &gt;&gt; <span class="number">2</span>) <span class="kw">as </span>u8,
<a href=#459 id=459 data-nosnippet>459</a> ContextType::CONTEXT_LSB6 =&gt; (p1 <span class="kw">as </span>i32 &amp; <span class="number">0x3fi32</span>) <span class="kw">as </span>u8, <span class="comment">/* else {
<a href=#460 id=460 data-nosnippet>460</a> 0u8
<a href=#461 id=461 data-nosnippet>461</a> }*/
<a href=#462 id=462 data-nosnippet>462</a> </span>}
<a href=#463 id=463 data-nosnippet>463</a>}
<a href=#464 id=464 data-nosnippet>464</a>
<a href=#465 id=465 data-nosnippet>465</a><span class="kw">pub fn </span>BrotliBuildHistogramsWithContext&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u8&gt; + alloc::Allocator&lt;u32&gt;&gt;(
<a href=#466 id=466 data-nosnippet>466</a> cmds: <span class="kw-2">&amp;</span>[Command],
<a href=#467 id=467 data-nosnippet>467</a> num_commands: usize,
<a href=#468 id=468 data-nosnippet>468</a> literal_split: <span class="kw-2">&amp;</span>BlockSplit&lt;Alloc&gt;,
<a href=#469 id=469 data-nosnippet>469</a> insert_and_copy_split: <span class="kw-2">&amp;</span>BlockSplit&lt;Alloc&gt;,
<a href=#470 id=470 data-nosnippet>470</a> dist_split: <span class="kw-2">&amp;</span>BlockSplit&lt;Alloc&gt;,
<a href=#471 id=471 data-nosnippet>471</a> ringbuffer: <span class="kw-2">&amp;</span>[u8],
<a href=#472 id=472 data-nosnippet>472</a> start_pos: usize,
<a href=#473 id=473 data-nosnippet>473</a> mask: usize,
<a href=#474 id=474 data-nosnippet>474</a> <span class="kw-2">mut </span>prev_byte: u8,
<a href=#475 id=475 data-nosnippet>475</a> <span class="kw-2">mut </span>prev_byte2: u8,
<a href=#476 id=476 data-nosnippet>476</a> context_modes: <span class="kw-2">&amp;</span>[ContextType],
<a href=#477 id=477 data-nosnippet>477</a> literal_histograms: <span class="kw-2">&amp;mut </span>[HistogramLiteral],
<a href=#478 id=478 data-nosnippet>478</a> insert_and_copy_histograms: <span class="kw-2">&amp;mut </span>[HistogramCommand],
<a href=#479 id=479 data-nosnippet>479</a> copy_dist_histograms: <span class="kw-2">&amp;mut </span>[HistogramDistance],
<a href=#480 id=480 data-nosnippet>480</a>) {
<a href=#481 id=481 data-nosnippet>481</a> <span class="kw">let </span><span class="kw-2">mut </span>pos: usize = start_pos;
<a href=#482 id=482 data-nosnippet>482</a> <span class="kw">let </span><span class="kw-2">mut </span>literal_it: BlockSplitIterator&lt;Alloc&gt;;
<a href=#483 id=483 data-nosnippet>483</a> <span class="kw">let </span><span class="kw-2">mut </span>insert_and_copy_it: BlockSplitIterator&lt;Alloc&gt;;
<a href=#484 id=484 data-nosnippet>484</a> <span class="kw">let </span><span class="kw-2">mut </span>dist_it: BlockSplitIterator&lt;Alloc&gt;;
<a href=#485 id=485 data-nosnippet>485</a> literal_it = BlockSplitIterator::new(literal_split);
<a href=#486 id=486 data-nosnippet>486</a> insert_and_copy_it = BlockSplitIterator::new(insert_and_copy_split);
<a href=#487 id=487 data-nosnippet>487</a> dist_it = BlockSplitIterator::new(dist_split);
<a href=#488 id=488 data-nosnippet>488</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..num_commands {
<a href=#489 id=489 data-nosnippet>489</a> <span class="kw">let </span>cmd = <span class="kw-2">&amp;</span>cmds[i];
<a href=#490 id=490 data-nosnippet>490</a> <span class="kw">let </span><span class="kw-2">mut </span>j: usize;
<a href=#491 id=491 data-nosnippet>491</a> insert_and_copy_it.next();
<a href=#492 id=492 data-nosnippet>492</a> HistogramAddItem(
<a href=#493 id=493 data-nosnippet>493</a> <span class="kw-2">&amp;mut </span>insert_and_copy_histograms[insert_and_copy_it.type_],
<a href=#494 id=494 data-nosnippet>494</a> cmd.cmd_prefix_ <span class="kw">as </span>usize,
<a href=#495 id=495 data-nosnippet>495</a> );
<a href=#496 id=496 data-nosnippet>496</a> j = cmd.insert_len_ <span class="kw">as </span>usize;
<a href=#497 id=497 data-nosnippet>497</a> <span class="kw">while </span><span class="macro">j !</span>= <span class="number">0usize </span>{
<a href=#498 id=498 data-nosnippet>498</a> {
<a href=#499 id=499 data-nosnippet>499</a> literal_it.next();
<a href=#500 id=500 data-nosnippet>500</a> <span class="kw">let </span>context: usize = <span class="kw">if </span>!context_modes.is_empty() {
<a href=#501 id=501 data-nosnippet>501</a> (literal_it.type_ &lt;&lt; <span class="number">6</span>).wrapping_add(Context(
<a href=#502 id=502 data-nosnippet>502</a> prev_byte,
<a href=#503 id=503 data-nosnippet>503</a> prev_byte2,
<a href=#504 id=504 data-nosnippet>504</a> context_modes[literal_it.type_],
<a href=#505 id=505 data-nosnippet>505</a> ) <span class="kw">as </span>usize)
<a href=#506 id=506 data-nosnippet>506</a> } <span class="kw">else </span>{
<a href=#507 id=507 data-nosnippet>507</a> literal_it.type_
<a href=#508 id=508 data-nosnippet>508</a> };
<a href=#509 id=509 data-nosnippet>509</a> HistogramAddItem(
<a href=#510 id=510 data-nosnippet>510</a> <span class="kw-2">&amp;mut </span>literal_histograms[(context <span class="kw">as </span>usize)],
<a href=#511 id=511 data-nosnippet>511</a> ringbuffer[(pos &amp; mask)] <span class="kw">as </span>usize,
<a href=#512 id=512 data-nosnippet>512</a> );
<a href=#513 id=513 data-nosnippet>513</a> prev_byte2 = prev_byte;
<a href=#514 id=514 data-nosnippet>514</a> prev_byte = ringbuffer[(pos &amp; mask)];
<a href=#515 id=515 data-nosnippet>515</a> pos = pos.wrapping_add(<span class="number">1</span>);
<a href=#516 id=516 data-nosnippet>516</a> }
<a href=#517 id=517 data-nosnippet>517</a> j = j.wrapping_sub(<span class="number">1</span>);
<a href=#518 id=518 data-nosnippet>518</a> }
<a href=#519 id=519 data-nosnippet>519</a> pos = pos.wrapping_add(cmd.copy_len() <span class="kw">as </span>usize);
<a href=#520 id=520 data-nosnippet>520</a> <span class="kw">if </span>cmd.copy_len() != <span class="number">0 </span>{
<a href=#521 id=521 data-nosnippet>521</a> prev_byte2 = ringbuffer[(pos.wrapping_sub(<span class="number">2</span>) &amp; mask)];
<a href=#522 id=522 data-nosnippet>522</a> prev_byte = ringbuffer[(pos.wrapping_sub(<span class="number">1</span>) &amp; mask)];
<a href=#523 id=523 data-nosnippet>523</a> <span class="kw">if </span>cmd.cmd_prefix_ <span class="kw">as </span>i32 &gt;= <span class="number">128i32 </span>{
<a href=#524 id=524 data-nosnippet>524</a> dist_it.next();
<a href=#525 id=525 data-nosnippet>525</a> <span class="kw">let </span>context: usize =
<a href=#526 id=526 data-nosnippet>526</a> (dist_it.type_ &lt;&lt; <span class="number">2</span>).wrapping_add(cmd.distance_context() <span class="kw">as </span>usize);
<a href=#527 id=527 data-nosnippet>527</a> HistogramAddItem(
<a href=#528 id=528 data-nosnippet>528</a> <span class="kw-2">&amp;mut </span>copy_dist_histograms[(context <span class="kw">as </span>usize)],
<a href=#529 id=529 data-nosnippet>529</a> cmd.dist_prefix_ <span class="kw">as </span>usize &amp; <span class="number">0x3ff</span>,
<a href=#530 id=530 data-nosnippet>530</a> );
<a href=#531 id=531 data-nosnippet>531</a> }
<a href=#532 id=532 data-nosnippet>532</a> }
<a href=#533 id=533 data-nosnippet>533</a> }
<a href=#534 id=534 data-nosnippet>534</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,147 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/input_pair.rs`."><title>input_pair.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>input_pair.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::min;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{SliceWrapper, SliceWrapperMut};
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::interface::Freezable;
<a href=#6 id=6 data-nosnippet>6</a><span class="attr">#[derive(Copy, Clone, Default, Debug)]
<a href=#7 id=7 data-nosnippet>7</a></span><span class="kw">pub struct </span>InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#8 id=8 data-nosnippet>8</a> <span class="kw">pub </span>data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8],
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">pub </span>orig_offset: usize, <span class="comment">// offset into the original slice of data
<a href=#10 id=10 data-nosnippet>10</a></span>}
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; SliceWrapper&lt;u8&gt; <span class="kw">for </span>InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#12 id=12 data-nosnippet>12</a> <span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#13 id=13 data-nosnippet>13</a> <span class="self">self</span>.data
<a href=#14 id=14 data-nosnippet>14</a> }
<a href=#15 id=15 data-nosnippet>15</a>}
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Freezable <span class="kw">for </span>InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#18 id=18 data-nosnippet>18</a> <span class="kw">fn </span>freeze(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw">super</span>::interface::SliceOffset {
<a href=#19 id=19 data-nosnippet>19</a> <span class="macro">debug_assert!</span>(<span class="self">self</span>.data.len() &lt;= <span class="number">0xffff_ffff</span>);
<a href=#20 id=20 data-nosnippet>20</a> <span class="kw">super</span>::interface::SliceOffset(<span class="self">self</span>.orig_offset, <span class="self">self</span>.data.len() <span class="kw">as </span>u32)
<a href=#21 id=21 data-nosnippet>21</a> }
<a href=#22 id=22 data-nosnippet>22</a>}
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a><span class="attr">#[derive(Default)]
<a href=#25 id=25 data-nosnippet>25</a></span><span class="kw">pub struct </span>InputReferenceMut&lt;<span class="lifetime">'a</span>&gt; {
<a href=#26 id=26 data-nosnippet>26</a> <span class="kw">pub </span>data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u8],
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">pub </span>orig_offset: usize, <span class="comment">// offset into the original slice of data
<a href=#28 id=28 data-nosnippet>28</a></span>}
<a href=#29 id=29 data-nosnippet>29</a>
<a href=#30 id=30 data-nosnippet>30</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; SliceWrapper&lt;u8&gt; <span class="kw">for </span>InputReferenceMut&lt;<span class="lifetime">'a</span>&gt; {
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#32 id=32 data-nosnippet>32</a> <span class="self">self</span>.data
<a href=#33 id=33 data-nosnippet>33</a> }
<a href=#34 id=34 data-nosnippet>34</a>}
<a href=#35 id=35 data-nosnippet>35</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; SliceWrapperMut&lt;u8&gt; <span class="kw">for </span>InputReferenceMut&lt;<span class="lifetime">'a</span>&gt; {
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u8] {
<a href=#37 id=37 data-nosnippet>37</a> <span class="self">self</span>.data
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a>}
<a href=#40 id=40 data-nosnippet>40</a>
<a href=#41 id=41 data-nosnippet>41</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; <span class="kw">for </span>InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#42 id=42 data-nosnippet>42</a> <span class="kw">fn </span>from(val: InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;) -&gt; InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#43 id=43 data-nosnippet>43</a> InputReference {
<a href=#44 id=44 data-nosnippet>44</a> data: val.data,
<a href=#45 id=45 data-nosnippet>45</a> orig_offset: val.orig_offset,
<a href=#46 id=46 data-nosnippet>46</a> }
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a>}
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; <span class="kw">for </span>InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">fn </span>from(val: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;) -&gt; InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#52 id=52 data-nosnippet>52</a> InputReference {
<a href=#53 id=53 data-nosnippet>53</a> data: val.data,
<a href=#54 id=54 data-nosnippet>54</a> orig_offset: val.orig_offset,
<a href=#55 id=55 data-nosnippet>55</a> }
<a href=#56 id=56 data-nosnippet>56</a> }
<a href=#57 id=57 data-nosnippet>57</a>}
<a href=#58 id=58 data-nosnippet>58</a>
<a href=#59 id=59 data-nosnippet>59</a><span class="attr">#[derive(Clone, Debug, Copy)]
<a href=#60 id=60 data-nosnippet>60</a></span><span class="kw">pub struct </span>InputPair&lt;<span class="lifetime">'a</span>&gt;(<span class="kw">pub </span>InputReference&lt;<span class="lifetime">'a</span>&gt;, <span class="kw">pub </span>InputReference&lt;<span class="lifetime">'a</span>&gt;);
<a href=#61 id=61 data-nosnippet>61</a>
<a href=#62 id=62 data-nosnippet>62</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; PartialEq <span class="kw">for </span>InputPair&lt;<span class="lifetime">'a</span>&gt; {
<a href=#63 id=63 data-nosnippet>63</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>InputPair&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0</span>.len() + <span class="self">self</span>.<span class="number">1</span>.len() != other.<span class="number">0</span>.len() + other.<span class="number">1</span>.len() {
<a href=#65 id=65 data-nosnippet>65</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#66 id=66 data-nosnippet>66</a> }
<a href=#67 id=67 data-nosnippet>67</a> <span class="kw">for </span>(a_iter, b_iter) <span class="kw">in </span><span class="self">self
<a href=#68 id=68 data-nosnippet>68</a> </span>.<span class="number">0
<a href=#69 id=69 data-nosnippet>69</a> </span>.data
<a href=#70 id=70 data-nosnippet>70</a> .iter()
<a href=#71 id=71 data-nosnippet>71</a> .chain(<span class="self">self</span>.<span class="number">1</span>.data.iter())
<a href=#72 id=72 data-nosnippet>72</a> .zip(other.<span class="number">0</span>.data.iter().chain(other.<span class="number">1</span>.data.iter()))
<a href=#73 id=73 data-nosnippet>73</a> {
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">a_iter !</span>= <span class="kw-2">*</span>b_iter {
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#76 id=76 data-nosnippet>76</a> }
<a href=#77 id=77 data-nosnippet>77</a> }
<a href=#78 id=78 data-nosnippet>78</a> <span class="bool-val">true
<a href=#79 id=79 data-nosnippet>79</a> </span>}
<a href=#80 id=80 data-nosnippet>80</a>}
<a href=#81 id=81 data-nosnippet>81</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; core::ops::Index&lt;usize&gt; <span class="kw">for </span>InputPair&lt;<span class="lifetime">'a</span>&gt; {
<a href=#82 id=82 data-nosnippet>82</a> <span class="kw">type </span>Output = u8;
<a href=#83 id=83 data-nosnippet>83</a> <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; <span class="kw-2">&amp;</span>u8 {
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">if </span>index &gt;= <span class="self">self</span>.<span class="number">0</span>.len() {
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">1</span>.data[index - <span class="self">self</span>.<span class="number">0</span>.len()]
<a href=#86 id=86 data-nosnippet>86</a> } <span class="kw">else </span>{
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>.data[index]
<a href=#88 id=88 data-nosnippet>88</a> }
<a href=#89 id=89 data-nosnippet>89</a> }
<a href=#90 id=90 data-nosnippet>90</a>}
<a href=#91 id=91 data-nosnippet>91</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; core::fmt::LowerHex <span class="kw">for </span>InputPair&lt;<span class="lifetime">'a</span>&gt; {
<a href=#92 id=92 data-nosnippet>92</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, fmtr: <span class="kw-2">&amp;mut </span>core::fmt::Formatter) -&gt; <span class="prelude-ty">Result</span>&lt;(), core::fmt::Error&gt; {
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">for </span>item <span class="kw">in </span><span class="self">self</span>.<span class="number">0</span>.data {
<a href=#94 id=94 data-nosnippet>94</a> fmtr.write_fmt(<span class="macro">format_args!</span>(<span class="string">"{:02x}"</span>, item))<span class="question-mark">?
<a href=#95 id=95 data-nosnippet>95</a> </span>}
<a href=#96 id=96 data-nosnippet>96</a> <span class="kw">for </span>item <span class="kw">in </span><span class="self">self</span>.<span class="number">1</span>.data {
<a href=#97 id=97 data-nosnippet>97</a> fmtr.write_fmt(<span class="macro">format_args!</span>(<span class="string">"{:02x}"</span>, item))<span class="question-mark">?
<a href=#98 id=98 data-nosnippet>98</a> </span>}
<a href=#99 id=99 data-nosnippet>99</a> <span class="prelude-val">Ok</span>(())
<a href=#100 id=100 data-nosnippet>100</a> }
<a href=#101 id=101 data-nosnippet>101</a>}
<a href=#102 id=102 data-nosnippet>102</a>
<a href=#103 id=103 data-nosnippet>103</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; InputPair&lt;<span class="lifetime">'a</span>&gt; {
<a href=#104 id=104 data-nosnippet>104</a> <span class="kw">pub fn </span>split_at(<span class="kw-2">&amp;</span><span class="self">self</span>, loc: usize) -&gt; (InputPair&lt;<span class="lifetime">'a</span>&gt;, InputPair&lt;<span class="lifetime">'a</span>&gt;) {
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">if </span>loc &gt;= <span class="self">self</span>.<span class="number">0</span>.len() {
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">let </span>offset_from_self_1 = loc - <span class="self">self</span>.<span class="number">0</span>.len();
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span>(first, second) = <span class="self">self</span>.<span class="number">1</span>.data.split_at(min(offset_from_self_1, <span class="self">self</span>.<span class="number">1</span>.len()));
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">return </span>(
<a href=#109 id=109 data-nosnippet>109</a> InputPair::&lt;<span class="lifetime">'a</span>&gt;(
<a href=#110 id=110 data-nosnippet>110</a> <span class="self">self</span>.<span class="number">0</span>,
<a href=#111 id=111 data-nosnippet>111</a> InputReference::&lt;<span class="lifetime">'a</span>&gt; {
<a href=#112 id=112 data-nosnippet>112</a> data: first,
<a href=#113 id=113 data-nosnippet>113</a> orig_offset: <span class="self">self</span>.<span class="number">1</span>.orig_offset,
<a href=#114 id=114 data-nosnippet>114</a> },
<a href=#115 id=115 data-nosnippet>115</a> ),
<a href=#116 id=116 data-nosnippet>116</a> InputPair::&lt;<span class="lifetime">'a</span>&gt;(
<a href=#117 id=117 data-nosnippet>117</a> InputReference::&lt;<span class="lifetime">'a</span>&gt;::default(),
<a href=#118 id=118 data-nosnippet>118</a> InputReference::&lt;<span class="lifetime">'a</span>&gt; {
<a href=#119 id=119 data-nosnippet>119</a> data: second,
<a href=#120 id=120 data-nosnippet>120</a> orig_offset: offset_from_self_1 + <span class="self">self</span>.<span class="number">1</span>.orig_offset,
<a href=#121 id=121 data-nosnippet>121</a> },
<a href=#122 id=122 data-nosnippet>122</a> ),
<a href=#123 id=123 data-nosnippet>123</a> );
<a href=#124 id=124 data-nosnippet>124</a> }
<a href=#125 id=125 data-nosnippet>125</a> <span class="kw">let </span>(first, second) = <span class="self">self</span>.<span class="number">0</span>.data.split_at(min(loc, <span class="self">self</span>.<span class="number">0</span>.len()));
<a href=#126 id=126 data-nosnippet>126</a> (
<a href=#127 id=127 data-nosnippet>127</a> InputPair::&lt;<span class="lifetime">'a</span>&gt;(
<a href=#128 id=128 data-nosnippet>128</a> InputReference::&lt;<span class="lifetime">'a</span>&gt; {
<a href=#129 id=129 data-nosnippet>129</a> data: first,
<a href=#130 id=130 data-nosnippet>130</a> orig_offset: <span class="self">self</span>.<span class="number">0</span>.orig_offset,
<a href=#131 id=131 data-nosnippet>131</a> },
<a href=#132 id=132 data-nosnippet>132</a> InputReference::&lt;<span class="lifetime">'a</span>&gt;::default(),
<a href=#133 id=133 data-nosnippet>133</a> ),
<a href=#134 id=134 data-nosnippet>134</a> InputPair::&lt;<span class="lifetime">'a</span>&gt;(
<a href=#135 id=135 data-nosnippet>135</a> InputReference::&lt;<span class="lifetime">'a</span>&gt; {
<a href=#136 id=136 data-nosnippet>136</a> data: second,
<a href=#137 id=137 data-nosnippet>137</a> orig_offset: <span class="self">self</span>.<span class="number">0</span>.orig_offset + loc,
<a href=#138 id=138 data-nosnippet>138</a> },
<a href=#139 id=139 data-nosnippet>139</a> <span class="self">self</span>.<span class="number">1</span>,
<a href=#140 id=140 data-nosnippet>140</a> ),
<a href=#141 id=141 data-nosnippet>141</a> )
<a href=#142 id=142 data-nosnippet>142</a> }
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">pub fn </span>len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#144 id=144 data-nosnippet>144</a> <span class="self">self</span>.<span class="number">0</span>.len() + <span class="self">self</span>.<span class="number">1</span>.len()
<a href=#145 id=145 data-nosnippet>145</a> }
<a href=#146 id=146 data-nosnippet>146</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,796 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/interface.rs`."><title>interface.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>interface.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::histogram;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">pub use </span><span class="kw">super</span>::input_pair::{InputPair, InputReference, InputReferenceMut};
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="attr">#[derive(Debug, Copy, Clone, Default)]
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">pub struct </span>BlockSwitch(<span class="kw">pub </span>u8);
<a href=#9 id=9 data-nosnippet>9</a>
<a href=#10 id=10 data-nosnippet>10</a><span class="doccomment">/// Commands that can instantiate as a no-op should implement this.
<a href=#11 id=11 data-nosnippet>11</a></span><span class="kw">pub trait </span>Nop&lt;T&gt; {
<a href=#12 id=12 data-nosnippet>12</a> <span class="kw">fn </span>nop() -&gt; T;
<a href=#13 id=13 data-nosnippet>13</a>}
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">impl </span>BlockSwitch {
<a href=#16 id=16 data-nosnippet>16</a> <span class="attr">#[inline(always)]
<a href=#17 id=17 data-nosnippet>17</a> </span><span class="kw">pub fn </span>new(block_type: u8) -&gt; <span class="self">Self </span>{
<a href=#18 id=18 data-nosnippet>18</a> BlockSwitch(block_type)
<a href=#19 id=19 data-nosnippet>19</a> }
<a href=#20 id=20 data-nosnippet>20</a> <span class="attr">#[inline(always)]
<a href=#21 id=21 data-nosnippet>21</a> </span><span class="kw">pub fn </span>block_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#22 id=22 data-nosnippet>22</a> <span class="self">self</span>.<span class="number">0
<a href=#23 id=23 data-nosnippet>23</a> </span>}
<a href=#24 id=24 data-nosnippet>24</a>}
<a href=#25 id=25 data-nosnippet>25</a>
<a href=#26 id=26 data-nosnippet>26</a><span class="attr">#[derive(Debug, Copy, Clone, Default)]
<a href=#27 id=27 data-nosnippet>27</a></span><span class="kw">pub struct </span>LiteralBlockSwitch(<span class="kw">pub </span>BlockSwitch, <span class="kw">pub </span>u8);
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a><span class="kw">impl </span>LiteralBlockSwitch {
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">pub fn </span>new(block_type: u8, stride: u8) -&gt; <span class="self">Self </span>{
<a href=#31 id=31 data-nosnippet>31</a> LiteralBlockSwitch(BlockSwitch::new(block_type), stride)
<a href=#32 id=32 data-nosnippet>32</a> }
<a href=#33 id=33 data-nosnippet>33</a> <span class="attr">#[inline(always)]
<a href=#34 id=34 data-nosnippet>34</a> </span><span class="kw">pub fn </span>block_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#35 id=35 data-nosnippet>35</a> <span class="self">self</span>.<span class="number">0</span>.block_type()
<a href=#36 id=36 data-nosnippet>36</a> }
<a href=#37 id=37 data-nosnippet>37</a> <span class="attr">#[inline(always)]
<a href=#38 id=38 data-nosnippet>38</a> </span><span class="kw">pub fn </span>stride(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#39 id=39 data-nosnippet>39</a> <span class="self">self</span>.<span class="number">1
<a href=#40 id=40 data-nosnippet>40</a> </span>}
<a href=#41 id=41 data-nosnippet>41</a> <span class="attr">#[inline(always)]
<a href=#42 id=42 data-nosnippet>42</a> </span><span class="kw">pub fn </span>update_stride(<span class="kw-2">&amp;mut </span><span class="self">self</span>, new_stride: u8) {
<a href=#43 id=43 data-nosnippet>43</a> <span class="self">self</span>.<span class="number">1 </span>= new_stride;
<a href=#44 id=44 data-nosnippet>44</a> }
<a href=#45 id=45 data-nosnippet>45</a>}
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a><span class="kw">pub const </span>LITERAL_PREDICTION_MODE_SIGN: u8 = <span class="number">3</span>;
<a href=#48 id=48 data-nosnippet>48</a><span class="kw">pub const </span>LITERAL_PREDICTION_MODE_UTF8: u8 = <span class="number">2</span>;
<a href=#49 id=49 data-nosnippet>49</a><span class="kw">pub const </span>LITERAL_PREDICTION_MODE_MSB6: u8 = <span class="number">1</span>;
<a href=#50 id=50 data-nosnippet>50</a><span class="kw">pub const </span>LITERAL_PREDICTION_MODE_LSB6: u8 = <span class="number">0</span>;
<a href=#51 id=51 data-nosnippet>51</a>
<a href=#52 id=52 data-nosnippet>52</a><span class="attr">#[derive(Default, Copy, Clone, Debug, PartialEq, Eq, Hash)]
<a href=#53 id=53 data-nosnippet>53</a></span><span class="kw">pub struct </span>LiteralPredictionModeNibble(<span class="kw">pub </span>u8);
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a><span class="kw">impl </span>LiteralPredictionModeNibble {
<a href=#56 id=56 data-nosnippet>56</a> <span class="attr">#[inline(always)]
<a href=#57 id=57 data-nosnippet>57</a> </span><span class="kw">pub fn </span>new(prediction_mode: u8) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>, ()&gt; {
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">if </span>prediction_mode &lt; <span class="number">16 </span>{
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(LiteralPredictionModeNibble(prediction_mode));
<a href=#60 id=60 data-nosnippet>60</a> }
<a href=#61 id=61 data-nosnippet>61</a> <span class="prelude-val">Err</span>(())
<a href=#62 id=62 data-nosnippet>62</a> }
<a href=#63 id=63 data-nosnippet>63</a> <span class="attr">#[inline(always)]
<a href=#64 id=64 data-nosnippet>64</a> </span><span class="kw">pub fn </span>prediction_mode(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#65 id=65 data-nosnippet>65</a> <span class="self">self</span>.<span class="number">0
<a href=#66 id=66 data-nosnippet>66</a> </span>}
<a href=#67 id=67 data-nosnippet>67</a> <span class="attr">#[inline(always)]
<a href=#68 id=68 data-nosnippet>68</a> </span><span class="kw">pub fn </span>signed() -&gt; <span class="self">Self </span>{
<a href=#69 id=69 data-nosnippet>69</a> LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_SIGN)
<a href=#70 id=70 data-nosnippet>70</a> }
<a href=#71 id=71 data-nosnippet>71</a> <span class="attr">#[inline(always)]
<a href=#72 id=72 data-nosnippet>72</a> </span><span class="kw">pub fn </span>utf8() -&gt; <span class="self">Self </span>{
<a href=#73 id=73 data-nosnippet>73</a> LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_UTF8)
<a href=#74 id=74 data-nosnippet>74</a> }
<a href=#75 id=75 data-nosnippet>75</a> <span class="attr">#[inline(always)]
<a href=#76 id=76 data-nosnippet>76</a> </span><span class="kw">pub fn </span>msb6() -&gt; <span class="self">Self </span>{
<a href=#77 id=77 data-nosnippet>77</a> LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_MSB6)
<a href=#78 id=78 data-nosnippet>78</a> }
<a href=#79 id=79 data-nosnippet>79</a> <span class="attr">#[inline(always)]
<a href=#80 id=80 data-nosnippet>80</a> </span><span class="kw">pub fn </span>lsb6() -&gt; <span class="self">Self </span>{
<a href=#81 id=81 data-nosnippet>81</a> LiteralPredictionModeNibble(LITERAL_PREDICTION_MODE_LSB6)
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a> <span class="attr">#[inline(always)]
<a href=#84 id=84 data-nosnippet>84</a> </span><span class="kw">pub fn </span>to_context_enum(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;histogram::ContextType, ()&gt; {
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0 </span>{
<a href=#86 id=86 data-nosnippet>86</a> LITERAL_PREDICTION_MODE_LSB6 =&gt; <span class="prelude-val">Ok</span>(histogram::ContextType::CONTEXT_LSB6),
<a href=#87 id=87 data-nosnippet>87</a> LITERAL_PREDICTION_MODE_MSB6 =&gt; <span class="prelude-val">Ok</span>(histogram::ContextType::CONTEXT_MSB6),
<a href=#88 id=88 data-nosnippet>88</a> LITERAL_PREDICTION_MODE_UTF8 =&gt; <span class="prelude-val">Ok</span>(histogram::ContextType::CONTEXT_UTF8),
<a href=#89 id=89 data-nosnippet>89</a> LITERAL_PREDICTION_MODE_SIGN =&gt; <span class="prelude-val">Ok</span>(histogram::ContextType::CONTEXT_SIGNED),
<a href=#90 id=90 data-nosnippet>90</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(()),
<a href=#91 id=91 data-nosnippet>91</a> }
<a href=#92 id=92 data-nosnippet>92</a> }
<a href=#93 id=93 data-nosnippet>93</a>}
<a href=#94 id=94 data-nosnippet>94</a><span class="kw">pub const </span>NUM_SPEED_VALUES: usize = <span class="number">12</span>;
<a href=#95 id=95 data-nosnippet>95</a><span class="kw">pub const </span>NUM_MIXING_VALUES: usize = <span class="number">16 </span>* <span class="number">256 </span>+ <span class="number">16 </span>* <span class="number">256</span>;
<a href=#96 id=96 data-nosnippet>96</a><span class="kw">pub const </span>NUM_PREDMODE_SETUP_VALUES: usize = <span class="number">4</span>;
<a href=#97 id=97 data-nosnippet>97</a><span class="kw">pub const </span>RESERVED_OFFSET: usize = <span class="number">3</span>;
<a href=#98 id=98 data-nosnippet>98</a><span class="kw">pub const </span>ADV_CONTEXT_MAP_OFFSET: usize = <span class="number">2</span>;
<a href=#99 id=99 data-nosnippet>99</a><span class="kw">pub const </span>MIXING_MATH_OFFSET: usize = <span class="number">1</span>;
<a href=#100 id=100 data-nosnippet>100</a><span class="kw">pub const </span>PREDMODE_OFFSET: usize = <span class="number">0</span>;
<a href=#101 id=101 data-nosnippet>101</a><span class="kw">pub const </span>MIXING_OFFSET: usize = NUM_PREDMODE_SETUP_VALUES + PREDMODE_OFFSET;
<a href=#102 id=102 data-nosnippet>102</a><span class="kw">pub const </span>SPEED_OFFSET: usize = MIXING_OFFSET + NUM_MIXING_VALUES;
<a href=#103 id=103 data-nosnippet>103</a><span class="kw">pub const </span>DISTANCE_CONTEXT_MAP_OFFSET: usize = SPEED_OFFSET + NUM_SPEED_VALUES;
<a href=#104 id=104 data-nosnippet>104</a><span class="kw">pub const </span>MAX_PREDMODE_SPEED_AND_DISTANCE_CONTEXT_MAP_SIZE: usize =
<a href=#105 id=105 data-nosnippet>105</a> DISTANCE_CONTEXT_MAP_OFFSET + <span class="number">256 </span>* <span class="number">4</span>;
<a href=#106 id=106 data-nosnippet>106</a><span class="kw">pub const </span>MAX_LITERAL_CONTEXT_MAP_SIZE: usize = <span class="number">256 </span>* <span class="number">64</span>;
<a href=#107 id=107 data-nosnippet>107</a><span class="kw">pub const </span>MAX_ADV_LITERAL_CONTEXT_MAP_SIZE: usize = <span class="number">256 </span>* <span class="number">64 </span>* <span class="number">2</span>;
<a href=#108 id=108 data-nosnippet>108</a><span class="attr">#[derive(Debug)]
<a href=#109 id=109 data-nosnippet>109</a></span><span class="kw">pub struct </span>PredictionModeContextMap&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; {
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">pub </span>literal_context_map: SliceType,
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">pub </span>predmode_speed_and_distance_context_map: SliceType,
<a href=#112 id=112 data-nosnippet>112</a>}
<a href=#113 id=113 data-nosnippet>113</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + SliceWrapperMut&lt;u8&gt;&gt; PredictionModeContextMap&lt;SliceType&gt; {
<a href=#114 id=114 data-nosnippet>114</a> <span class="attr">#[inline]
<a href=#115 id=115 data-nosnippet>115</a> </span><span class="kw">pub fn </span>distance_context_map_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u8] {
<a href=#116 id=116 data-nosnippet>116</a> <span class="self">self</span>.predmode_speed_and_distance_context_map
<a href=#117 id=117 data-nosnippet>117</a> .slice_mut()
<a href=#118 id=118 data-nosnippet>118</a> .split_at_mut(DISTANCE_CONTEXT_MAP_OFFSET)
<a href=#119 id=119 data-nosnippet>119</a> .<span class="number">1
<a href=#120 id=120 data-nosnippet>120</a> </span>}
<a href=#121 id=121 data-nosnippet>121</a> <span class="attr">#[inline]
<a href=#122 id=122 data-nosnippet>122</a> </span><span class="kw">pub fn </span>set_stride_context_speed(<span class="kw-2">&amp;mut </span><span class="self">self</span>, speed_max: [(u16, u16); <span class="number">2</span>]) {
<a href=#123 id=123 data-nosnippet>123</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">for </span>high <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#125 id=125 data-nosnippet>125</a> cm_slice[<span class="self">Self</span>::stride_context_speed_offset() + high] =
<a href=#126 id=126 data-nosnippet>126</a> <span class="self">Self</span>::u16_to_f8(speed_max[high].<span class="number">0</span>);
<a href=#127 id=127 data-nosnippet>127</a> cm_slice[<span class="self">Self</span>::stride_context_speed_max_offset() + high] =
<a href=#128 id=128 data-nosnippet>128</a> <span class="self">Self</span>::u16_to_f8(speed_max[high].<span class="number">1</span>);
<a href=#129 id=129 data-nosnippet>129</a> }
<a href=#130 id=130 data-nosnippet>130</a> }
<a href=#131 id=131 data-nosnippet>131</a> <span class="attr">#[inline]
<a href=#132 id=132 data-nosnippet>132</a> </span><span class="kw">pub fn </span>set_context_map_speed(<span class="kw-2">&amp;mut </span><span class="self">self</span>, speed_max: [(u16, u16); <span class="number">2</span>]) {
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">for </span>high <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#135 id=135 data-nosnippet>135</a> cm_slice[<span class="self">Self</span>::context_map_speed_offset() + high] = <span class="self">Self</span>::u16_to_f8(speed_max[high].<span class="number">0</span>);
<a href=#136 id=136 data-nosnippet>136</a> cm_slice[<span class="self">Self</span>::context_map_speed_max_offset() + high] =
<a href=#137 id=137 data-nosnippet>137</a> <span class="self">Self</span>::u16_to_f8(speed_max[high].<span class="number">1</span>);
<a href=#138 id=138 data-nosnippet>138</a> }
<a href=#139 id=139 data-nosnippet>139</a> }
<a href=#140 id=140 data-nosnippet>140</a> <span class="kw">pub fn </span>set_mixing_math(<span class="kw-2">&amp;mut </span><span class="self">self</span>, math_enum: u8) {
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#142 id=142 data-nosnippet>142</a> cm_slice[MIXING_MATH_OFFSET] = math_enum;
<a href=#143 id=143 data-nosnippet>143</a> }
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw">pub fn </span>set_adv_context_map(<span class="kw-2">&amp;mut </span><span class="self">self</span>, is_adv: u8) {
<a href=#145 id=145 data-nosnippet>145</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#146 id=146 data-nosnippet>146</a> cm_slice[ADV_CONTEXT_MAP_OFFSET] = is_adv;
<a href=#147 id=147 data-nosnippet>147</a> }
<a href=#148 id=148 data-nosnippet>148</a> <span class="attr">#[inline]
<a href=#149 id=149 data-nosnippet>149</a> </span><span class="kw">pub fn </span>set_mixing_values(<span class="kw-2">&amp;mut </span><span class="self">self</span>, mixing_mask: <span class="kw-2">&amp;</span>[u8; NUM_MIXING_VALUES]) {
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#151 id=151 data-nosnippet>151</a> cm_slice[MIXING_OFFSET..(MIXING_OFFSET + NUM_MIXING_VALUES)]
<a href=#152 id=152 data-nosnippet>152</a> .clone_from_slice(<span class="kw-2">&amp;</span>mixing_mask[..]);
<a href=#153 id=153 data-nosnippet>153</a> }
<a href=#154 id=154 data-nosnippet>154</a> <span class="attr">#[inline]
<a href=#155 id=155 data-nosnippet>155</a> </span><span class="kw">pub fn </span>get_mixing_values_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u8] {
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw-2">&amp;mut </span>cm_slice[MIXING_OFFSET..(MIXING_OFFSET + NUM_MIXING_VALUES)]
<a href=#158 id=158 data-nosnippet>158</a> }
<a href=#159 id=159 data-nosnippet>159</a> <span class="attr">#[inline]
<a href=#160 id=160 data-nosnippet>160</a> </span><span class="kw">pub fn </span>set_combined_stride_context_speed(<span class="kw-2">&amp;mut </span><span class="self">self</span>, speed_max: [(u16, u16); <span class="number">2</span>]) {
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">for </span>high <span class="kw">in </span><span class="number">0</span>..<span class="number">2 </span>{
<a href=#163 id=163 data-nosnippet>163</a> cm_slice[<span class="self">Self</span>::combined_stride_context_speed_offset() + high] =
<a href=#164 id=164 data-nosnippet>164</a> <span class="self">Self</span>::u16_to_f8(speed_max[high].<span class="number">0</span>);
<a href=#165 id=165 data-nosnippet>165</a> cm_slice[<span class="self">Self</span>::combined_stride_context_speed_max_offset() + high] =
<a href=#166 id=166 data-nosnippet>166</a> <span class="self">Self</span>::u16_to_f8(speed_max[high].<span class="number">1</span>);
<a href=#167 id=167 data-nosnippet>167</a> }
<a href=#168 id=168 data-nosnippet>168</a> }
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">pub fn </span>set_literal_prediction_mode(<span class="kw-2">&amp;mut </span><span class="self">self</span>, val: LiteralPredictionModeNibble) {
<a href=#170 id=170 data-nosnippet>170</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice_mut();
<a href=#171 id=171 data-nosnippet>171</a> cm_slice[PREDMODE_OFFSET] = val.<span class="number">0</span>;
<a href=#172 id=172 data-nosnippet>172</a> }
<a href=#173 id=173 data-nosnippet>173</a>}
<a href=#174 id=174 data-nosnippet>174</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; PredictionModeContextMap&lt;SliceType&gt; {
<a href=#175 id=175 data-nosnippet>175</a> <span class="attr">#[inline]
<a href=#176 id=176 data-nosnippet>176</a> </span><span class="kw">pub fn </span>from_mut&lt;Other: SliceWrapper&lt;u8&gt;&gt;(
<a href=#177 id=177 data-nosnippet>177</a> other: PredictionModeContextMap&lt;Other&gt;,
<a href=#178 id=178 data-nosnippet>178</a> ) -&gt; PredictionModeContextMap&lt;SliceType&gt;
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">where
<a href=#180 id=180 data-nosnippet>180</a> </span>SliceType: From&lt;Other&gt;,
<a href=#181 id=181 data-nosnippet>181</a> {
<a href=#182 id=182 data-nosnippet>182</a> PredictionModeContextMap::&lt;SliceType&gt; {
<a href=#183 id=183 data-nosnippet>183</a> literal_context_map: SliceType::from(other.literal_context_map),
<a href=#184 id=184 data-nosnippet>184</a> predmode_speed_and_distance_context_map: SliceType::from(
<a href=#185 id=185 data-nosnippet>185</a> other.predmode_speed_and_distance_context_map,
<a href=#186 id=186 data-nosnippet>186</a> ),
<a href=#187 id=187 data-nosnippet>187</a> }
<a href=#188 id=188 data-nosnippet>188</a> }
<a href=#189 id=189 data-nosnippet>189</a> <span class="attr">#[inline]
<a href=#190 id=190 data-nosnippet>190</a> </span><span class="kw">pub fn </span>get_mixing_values(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#191 id=191 data-nosnippet>191</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#192 id=192 data-nosnippet>192</a> <span class="kw-2">&amp;</span>cm_slice[MIXING_OFFSET..(MIXING_OFFSET + NUM_MIXING_VALUES)]
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a> <span class="attr">#[inline]
<a href=#195 id=195 data-nosnippet>195</a> </span><span class="kw">pub fn </span>get_mixing_math(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">if </span>cm_slice.len() &lt;= MIXING_MATH_OFFSET {
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw">return </span><span class="number">1</span>;
<a href=#199 id=199 data-nosnippet>199</a> }
<a href=#200 id=200 data-nosnippet>200</a> cm_slice[MIXING_MATH_OFFSET]
<a href=#201 id=201 data-nosnippet>201</a> }
<a href=#202 id=202 data-nosnippet>202</a> <span class="attr">#[inline]
<a href=#203 id=203 data-nosnippet>203</a> </span><span class="kw">pub fn </span>get_is_adv_context_map(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">if </span>cm_slice.len() &lt;= ADV_CONTEXT_MAP_OFFSET {
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">return </span><span class="number">0</span>;
<a href=#207 id=207 data-nosnippet>207</a> }
<a href=#208 id=208 data-nosnippet>208</a> cm_slice[ADV_CONTEXT_MAP_OFFSET]
<a href=#209 id=209 data-nosnippet>209</a> }
<a href=#210 id=210 data-nosnippet>210</a> <span class="attr">#[inline]
<a href=#211 id=211 data-nosnippet>211</a> </span><span class="kw">pub fn </span>has_context_speeds(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#212 id=212 data-nosnippet>212</a> <span class="self">self</span>.predmode_speed_and_distance_context_map.slice().len() &gt;= DISTANCE_CONTEXT_MAP_OFFSET
<a href=#213 id=213 data-nosnippet>213</a> }
<a href=#214 id=214 data-nosnippet>214</a> <span class="attr">#[inline]
<a href=#215 id=215 data-nosnippet>215</a> </span><span class="kw">pub fn </span>size_of_combined_array(distance_context_map_size: usize) -&gt; usize {
<a href=#216 id=216 data-nosnippet>216</a> distance_context_map_size + DISTANCE_CONTEXT_MAP_OFFSET
<a href=#217 id=217 data-nosnippet>217</a> }
<a href=#218 id=218 data-nosnippet>218</a> <span class="attr">#[inline]
<a href=#219 id=219 data-nosnippet>219</a> </span><span class="kw">pub fn </span>context_speeds_standard_len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#220 id=220 data-nosnippet>220</a> NUM_SPEED_VALUES
<a href=#221 id=221 data-nosnippet>221</a> }
<a href=#222 id=222 data-nosnippet>222</a> <span class="attr">#[inline]
<a href=#223 id=223 data-nosnippet>223</a> </span><span class="kw">pub fn </span>context_speeds_f8(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#224 id=224 data-nosnippet>224</a> <span class="kw-2">&amp;</span><span class="self">self</span>.predmode_speed_and_distance_context_map.slice()
<a href=#225 id=225 data-nosnippet>225</a> [SPEED_OFFSET..DISTANCE_CONTEXT_MAP_OFFSET]
<a href=#226 id=226 data-nosnippet>226</a> }
<a href=#227 id=227 data-nosnippet>227</a> <span class="attr">#[inline]
<a href=#228 id=228 data-nosnippet>228</a> </span><span class="kw">pub fn </span>distance_context_map(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#229 id=229 data-nosnippet>229</a> <span class="self">self</span>.predmode_speed_and_distance_context_map
<a href=#230 id=230 data-nosnippet>230</a> .slice()
<a href=#231 id=231 data-nosnippet>231</a> .split_at(DISTANCE_CONTEXT_MAP_OFFSET)
<a href=#232 id=232 data-nosnippet>232</a> .<span class="number">1
<a href=#233 id=233 data-nosnippet>233</a> </span>}
<a href=#234 id=234 data-nosnippet>234</a> <span class="attr">#[inline]
<a href=#235 id=235 data-nosnippet>235</a> </span><span class="kw">pub fn </span>f8_to_u16(data: u8) -&gt; u16 {
<a href=#236 id=236 data-nosnippet>236</a> <span class="self">self</span>::u8_to_speed(data)
<a href=#237 id=237 data-nosnippet>237</a> }
<a href=#238 id=238 data-nosnippet>238</a> <span class="attr">#[inline]
<a href=#239 id=239 data-nosnippet>239</a> </span><span class="kw">pub fn </span>u16_to_f8(data: u16) -&gt; u8 {
<a href=#240 id=240 data-nosnippet>240</a> <span class="self">self</span>::speed_to_u8(data)
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a> <span class="attr">#[inline]
<a href=#243 id=243 data-nosnippet>243</a> </span><span class="kw">pub fn </span>stride_context_speed_offset() -&gt; usize {
<a href=#244 id=244 data-nosnippet>244</a> SPEED_OFFSET
<a href=#245 id=245 data-nosnippet>245</a> }
<a href=#246 id=246 data-nosnippet>246</a> <span class="attr">#[inline]
<a href=#247 id=247 data-nosnippet>247</a> </span><span class="kw">pub fn </span>stride_context_speed_max_offset() -&gt; usize {
<a href=#248 id=248 data-nosnippet>248</a> SPEED_OFFSET + <span class="number">2
<a href=#249 id=249 data-nosnippet>249</a> </span>}
<a href=#250 id=250 data-nosnippet>250</a> <span class="attr">#[inline]
<a href=#251 id=251 data-nosnippet>251</a> </span><span class="kw">pub fn </span>context_map_speed_offset() -&gt; usize {
<a href=#252 id=252 data-nosnippet>252</a> SPEED_OFFSET + <span class="number">4
<a href=#253 id=253 data-nosnippet>253</a> </span>}
<a href=#254 id=254 data-nosnippet>254</a> <span class="attr">#[inline]
<a href=#255 id=255 data-nosnippet>255</a> </span><span class="kw">pub fn </span>context_map_speed_max_offset() -&gt; usize {
<a href=#256 id=256 data-nosnippet>256</a> SPEED_OFFSET + <span class="number">6
<a href=#257 id=257 data-nosnippet>257</a> </span>}
<a href=#258 id=258 data-nosnippet>258</a> <span class="attr">#[inline]
<a href=#259 id=259 data-nosnippet>259</a> </span><span class="kw">pub fn </span>combined_stride_context_speed_offset() -&gt; usize {
<a href=#260 id=260 data-nosnippet>260</a> SPEED_OFFSET + <span class="number">8
<a href=#261 id=261 data-nosnippet>261</a> </span>}
<a href=#262 id=262 data-nosnippet>262</a> <span class="attr">#[inline]
<a href=#263 id=263 data-nosnippet>263</a> </span><span class="kw">pub fn </span>combined_stride_context_speed_max_offset() -&gt; usize {
<a href=#264 id=264 data-nosnippet>264</a> SPEED_OFFSET + <span class="number">10
<a href=#265 id=265 data-nosnippet>265</a> </span>}
<a href=#266 id=266 data-nosnippet>266</a> <span class="attr">#[inline]
<a href=#267 id=267 data-nosnippet>267</a> </span><span class="kw">pub fn </span>literal_prediction_mode(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; LiteralPredictionModeNibble {
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#269 id=269 data-nosnippet>269</a> <span class="kw">if </span>PREDMODE_OFFSET &lt; cm_slice.len() {
<a href=#270 id=270 data-nosnippet>270</a> LiteralPredictionModeNibble(cm_slice[PREDMODE_OFFSET])
<a href=#271 id=271 data-nosnippet>271</a> } <span class="kw">else </span>{
<a href=#272 id=272 data-nosnippet>272</a> LiteralPredictionModeNibble::default()
<a href=#273 id=273 data-nosnippet>273</a> }
<a href=#274 id=274 data-nosnippet>274</a> }
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">pub fn </span>stride_context_speed(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [(u16, u16); <span class="number">2</span>] {
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">let </span>v = <span class="self">self</span>.stride_context_speed_f8();
<a href=#277 id=277 data-nosnippet>277</a> [
<a href=#278 id=278 data-nosnippet>278</a> (<span class="self">self</span>::u8_to_speed(v[<span class="number">0</span>].<span class="number">0</span>), <span class="self">self</span>::u8_to_speed(v[<span class="number">0</span>].<span class="number">1</span>)),
<a href=#279 id=279 data-nosnippet>279</a> (<span class="self">self</span>::u8_to_speed(v[<span class="number">1</span>].<span class="number">0</span>), <span class="self">self</span>::u8_to_speed(v[<span class="number">1</span>].<span class="number">1</span>)),
<a href=#280 id=280 data-nosnippet>280</a> ]
<a href=#281 id=281 data-nosnippet>281</a> }
<a href=#282 id=282 data-nosnippet>282</a> <span class="kw">pub fn </span>context_map_speed(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [(u16, u16); <span class="number">2</span>] {
<a href=#283 id=283 data-nosnippet>283</a> <span class="kw">let </span>v = <span class="self">self</span>.context_map_speed_f8();
<a href=#284 id=284 data-nosnippet>284</a> [
<a href=#285 id=285 data-nosnippet>285</a> (<span class="self">self</span>::u8_to_speed(v[<span class="number">0</span>].<span class="number">0</span>), <span class="self">self</span>::u8_to_speed(v[<span class="number">0</span>].<span class="number">1</span>)),
<a href=#286 id=286 data-nosnippet>286</a> (<span class="self">self</span>::u8_to_speed(v[<span class="number">1</span>].<span class="number">0</span>), <span class="self">self</span>::u8_to_speed(v[<span class="number">1</span>].<span class="number">1</span>)),
<a href=#287 id=287 data-nosnippet>287</a> ]
<a href=#288 id=288 data-nosnippet>288</a> }
<a href=#289 id=289 data-nosnippet>289</a> <span class="kw">pub fn </span>combined_stride_context_speed(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [(u16, u16); <span class="number">2</span>] {
<a href=#290 id=290 data-nosnippet>290</a> <span class="kw">let </span>v = <span class="self">self</span>.combined_stride_context_speed_f8();
<a href=#291 id=291 data-nosnippet>291</a> [
<a href=#292 id=292 data-nosnippet>292</a> (<span class="self">self</span>::u8_to_speed(v[<span class="number">0</span>].<span class="number">0</span>), <span class="self">self</span>::u8_to_speed(v[<span class="number">0</span>].<span class="number">1</span>)),
<a href=#293 id=293 data-nosnippet>293</a> (<span class="self">self</span>::u8_to_speed(v[<span class="number">1</span>].<span class="number">0</span>), <span class="self">self</span>::u8_to_speed(v[<span class="number">1</span>].<span class="number">1</span>)),
<a href=#294 id=294 data-nosnippet>294</a> ]
<a href=#295 id=295 data-nosnippet>295</a> }
<a href=#296 id=296 data-nosnippet>296</a> <span class="attr">#[inline]
<a href=#297 id=297 data-nosnippet>297</a> </span><span class="kw">pub fn </span>stride_context_speed_f8(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [(u8, u8); <span class="number">2</span>] {
<a href=#298 id=298 data-nosnippet>298</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#299 id=299 data-nosnippet>299</a> <span class="kw">let </span>low_speed = cm_slice[<span class="self">Self</span>::stride_context_speed_offset()];
<a href=#300 id=300 data-nosnippet>300</a> <span class="kw">let </span>high_speed = cm_slice[<span class="self">Self</span>::stride_context_speed_offset() + <span class="number">1</span>];
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw">let </span>low_max = cm_slice[<span class="self">Self</span>::stride_context_speed_max_offset()];
<a href=#302 id=302 data-nosnippet>302</a> <span class="kw">let </span>high_max = cm_slice[<span class="self">Self</span>::stride_context_speed_max_offset() + <span class="number">1</span>];
<a href=#303 id=303 data-nosnippet>303</a> [(low_speed, low_max), (high_speed, high_max)]
<a href=#304 id=304 data-nosnippet>304</a> }
<a href=#305 id=305 data-nosnippet>305</a> <span class="attr">#[inline]
<a href=#306 id=306 data-nosnippet>306</a> </span><span class="kw">pub fn </span>combined_stride_context_speed_f8(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [(u8, u8); <span class="number">2</span>] {
<a href=#307 id=307 data-nosnippet>307</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#308 id=308 data-nosnippet>308</a> <span class="kw">let </span>low_speed = cm_slice[<span class="self">Self</span>::combined_stride_context_speed_offset()];
<a href=#309 id=309 data-nosnippet>309</a> <span class="kw">let </span>high_speed = cm_slice[<span class="self">Self</span>::combined_stride_context_speed_offset() + <span class="number">1</span>];
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">let </span>low_max = cm_slice[<span class="self">Self</span>::combined_stride_context_speed_max_offset()];
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">let </span>high_max = cm_slice[<span class="self">Self</span>::combined_stride_context_speed_max_offset() + <span class="number">1</span>];
<a href=#312 id=312 data-nosnippet>312</a> [(low_speed, low_max), (high_speed, high_max)]
<a href=#313 id=313 data-nosnippet>313</a> }
<a href=#314 id=314 data-nosnippet>314</a> <span class="attr">#[inline]
<a href=#315 id=315 data-nosnippet>315</a> </span><span class="kw">pub fn </span>context_map_speed_f8(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; [(u8, u8); <span class="number">2</span>] {
<a href=#316 id=316 data-nosnippet>316</a> <span class="kw">let </span>cm_slice = <span class="self">self</span>.predmode_speed_and_distance_context_map.slice();
<a href=#317 id=317 data-nosnippet>317</a> <span class="kw">let </span>low_speed = cm_slice[<span class="self">Self</span>::context_map_speed_offset()];
<a href=#318 id=318 data-nosnippet>318</a> <span class="kw">let </span>high_speed = cm_slice[<span class="self">Self</span>::context_map_speed_offset() + <span class="number">1</span>];
<a href=#319 id=319 data-nosnippet>319</a> <span class="kw">let </span>low_max = cm_slice[<span class="self">Self</span>::context_map_speed_max_offset()];
<a href=#320 id=320 data-nosnippet>320</a> <span class="kw">let </span>high_max = cm_slice[<span class="self">Self</span>::context_map_speed_max_offset() + <span class="number">1</span>];
<a href=#321 id=321 data-nosnippet>321</a> [(low_speed, low_max), (high_speed, high_max)]
<a href=#322 id=322 data-nosnippet>322</a> }
<a href=#323 id=323 data-nosnippet>323</a>}
<a href=#324 id=324 data-nosnippet>324</a>
<a href=#325 id=325 data-nosnippet>325</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone&gt; Clone <span class="kw">for </span>PredictionModeContextMap&lt;SliceType&gt; {
<a href=#326 id=326 data-nosnippet>326</a> <span class="attr">#[inline(always)]
<a href=#327 id=327 data-nosnippet>327</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#328 id=328 data-nosnippet>328</a> PredictionModeContextMap::&lt;SliceType&gt; {
<a href=#329 id=329 data-nosnippet>329</a> literal_context_map: <span class="self">self</span>.literal_context_map.clone(),
<a href=#330 id=330 data-nosnippet>330</a> predmode_speed_and_distance_context_map: <span class="self">self
<a href=#331 id=331 data-nosnippet>331</a> </span>.predmode_speed_and_distance_context_map
<a href=#332 id=332 data-nosnippet>332</a> .clone(),
<a href=#333 id=333 data-nosnippet>333</a> }
<a href=#334 id=334 data-nosnippet>334</a> }
<a href=#335 id=335 data-nosnippet>335</a>}
<a href=#336 id=336 data-nosnippet>336</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone + Copy&gt; Copy <span class="kw">for </span>PredictionModeContextMap&lt;SliceType&gt; {}
<a href=#337 id=337 data-nosnippet>337</a>
<a href=#338 id=338 data-nosnippet>338</a><span class="attr">#[derive(Debug, Clone, Copy)]
<a href=#339 id=339 data-nosnippet>339</a></span><span class="kw">pub struct </span>CopyCommand {
<a href=#340 id=340 data-nosnippet>340</a> <span class="kw">pub </span>distance: u32,
<a href=#341 id=341 data-nosnippet>341</a> <span class="kw">pub </span>num_bytes: u32,
<a href=#342 id=342 data-nosnippet>342</a>}
<a href=#343 id=343 data-nosnippet>343</a>
<a href=#344 id=344 data-nosnippet>344</a><span class="kw">impl </span>Nop&lt;CopyCommand&gt; <span class="kw">for </span>CopyCommand {
<a href=#345 id=345 data-nosnippet>345</a> <span class="attr">#[inline(always)]
<a href=#346 id=346 data-nosnippet>346</a> </span><span class="kw">fn </span>nop() -&gt; <span class="self">Self </span>{
<a href=#347 id=347 data-nosnippet>347</a> CopyCommand {
<a href=#348 id=348 data-nosnippet>348</a> distance: <span class="number">1</span>,
<a href=#349 id=349 data-nosnippet>349</a> num_bytes: <span class="number">0</span>,
<a href=#350 id=350 data-nosnippet>350</a> }
<a href=#351 id=351 data-nosnippet>351</a> }
<a href=#352 id=352 data-nosnippet>352</a>}
<a href=#353 id=353 data-nosnippet>353</a>
<a href=#354 id=354 data-nosnippet>354</a><span class="attr">#[derive(Debug, Clone, Copy)]
<a href=#355 id=355 data-nosnippet>355</a></span><span class="kw">pub struct </span>DictCommand {
<a href=#356 id=356 data-nosnippet>356</a> <span class="kw">pub </span>word_size: u8,
<a href=#357 id=357 data-nosnippet>357</a> <span class="kw">pub </span>transform: u8,
<a href=#358 id=358 data-nosnippet>358</a> <span class="kw">pub </span>final_size: u8,
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">pub </span>empty: u8,
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">pub </span>word_id: u32,
<a href=#361 id=361 data-nosnippet>361</a>}
<a href=#362 id=362 data-nosnippet>362</a>
<a href=#363 id=363 data-nosnippet>363</a><span class="kw">impl </span>Nop&lt;DictCommand&gt; <span class="kw">for </span>DictCommand {
<a href=#364 id=364 data-nosnippet>364</a> <span class="attr">#[inline(always)]
<a href=#365 id=365 data-nosnippet>365</a> </span><span class="kw">fn </span>nop() -&gt; <span class="self">Self </span>{
<a href=#366 id=366 data-nosnippet>366</a> DictCommand {
<a href=#367 id=367 data-nosnippet>367</a> word_size: <span class="number">0</span>,
<a href=#368 id=368 data-nosnippet>368</a> transform: <span class="number">0</span>,
<a href=#369 id=369 data-nosnippet>369</a> final_size: <span class="number">0</span>,
<a href=#370 id=370 data-nosnippet>370</a> empty: <span class="number">1</span>,
<a href=#371 id=371 data-nosnippet>371</a> word_id: <span class="number">0</span>,
<a href=#372 id=372 data-nosnippet>372</a> }
<a href=#373 id=373 data-nosnippet>373</a> }
<a href=#374 id=374 data-nosnippet>374</a>}
<a href=#375 id=375 data-nosnippet>375</a>
<a href=#376 id=376 data-nosnippet>376</a><span class="attr">#[derive(Debug)]
<a href=#377 id=377 data-nosnippet>377</a>#[cfg(not(feature = <span class="string">"external-literal-probability"</span>))]
<a href=#378 id=378 data-nosnippet>378</a></span><span class="kw">pub struct </span>FeatureFlagSliceType&lt;SliceType: SliceWrapper&lt;u8&gt;&gt;(core::marker::PhantomData&lt;SliceType&gt;);
<a href=#379 id=379 data-nosnippet>379</a>
<a href=#380 id=380 data-nosnippet>380</a><span class="attr">#[cfg(not(feature = <span class="string">"external-literal-probability"</span>))]
<a href=#381 id=381 data-nosnippet>381</a></span><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; SliceWrapper&lt;u8&gt; <span class="kw">for </span>FeatureFlagSliceType&lt;SliceType&gt; {
<a href=#382 id=382 data-nosnippet>382</a> <span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#383 id=383 data-nosnippet>383</a> <span class="kw-2">&amp;</span>[]
<a href=#384 id=384 data-nosnippet>384</a> }
<a href=#385 id=385 data-nosnippet>385</a>}
<a href=#386 id=386 data-nosnippet>386</a>
<a href=#387 id=387 data-nosnippet>387</a><span class="attr">#[cfg(not(feature = <span class="string">"external-literal-probability"</span>))]
<a href=#388 id=388 data-nosnippet>388</a></span><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Default&gt; Default <span class="kw">for </span>FeatureFlagSliceType&lt;SliceType&gt; {
<a href=#389 id=389 data-nosnippet>389</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#390 id=390 data-nosnippet>390</a> FeatureFlagSliceType::&lt;SliceType&gt;(core::marker::PhantomData::&lt;SliceType&gt;)
<a href=#391 id=391 data-nosnippet>391</a> }
<a href=#392 id=392 data-nosnippet>392</a>}
<a href=#393 id=393 data-nosnippet>393</a>
<a href=#394 id=394 data-nosnippet>394</a><span class="attr">#[derive(Debug)]
<a href=#395 id=395 data-nosnippet>395</a>#[cfg(feature = <span class="string">"external-literal-probability"</span>)]
<a href=#396 id=396 data-nosnippet>396</a></span><span class="kw">pub struct </span>FeatureFlagSliceType&lt;SliceType: SliceWrapper&lt;u8&gt;&gt;(<span class="kw">pub </span>SliceType);
<a href=#397 id=397 data-nosnippet>397</a>
<a href=#398 id=398 data-nosnippet>398</a><span class="attr">#[cfg(feature = <span class="string">"external-literal-probability"</span>)]
<a href=#399 id=399 data-nosnippet>399</a></span><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; SliceWrapper&lt;u8&gt; <span class="kw">for </span>FeatureFlagSliceType&lt;SliceType&gt; {
<a href=#400 id=400 data-nosnippet>400</a> <span class="attr">#[inline(always)]
<a href=#401 id=401 data-nosnippet>401</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#402 id=402 data-nosnippet>402</a> <span class="self">self</span>.<span class="number">0</span>.slice()
<a href=#403 id=403 data-nosnippet>403</a> }
<a href=#404 id=404 data-nosnippet>404</a>}
<a href=#405 id=405 data-nosnippet>405</a>
<a href=#406 id=406 data-nosnippet>406</a><span class="attr">#[cfg(feature = <span class="string">"external-literal-probability"</span>)]
<a href=#407 id=407 data-nosnippet>407</a></span><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Default&gt; Default <span class="kw">for </span>FeatureFlagSliceType&lt;SliceType&gt; {
<a href=#408 id=408 data-nosnippet>408</a> <span class="attr">#[inline(always)]
<a href=#409 id=409 data-nosnippet>409</a> </span><span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#410 id=410 data-nosnippet>410</a> FeatureFlagSliceType::&lt;SliceType&gt;(SliceType::default())
<a href=#411 id=411 data-nosnippet>411</a> }
<a href=#412 id=412 data-nosnippet>412</a>}
<a href=#413 id=413 data-nosnippet>413</a>
<a href=#414 id=414 data-nosnippet>414</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone&gt; Clone <span class="kw">for </span>FeatureFlagSliceType&lt;SliceType&gt; {
<a href=#415 id=415 data-nosnippet>415</a> <span class="attr">#[inline(always)]
<a href=#416 id=416 data-nosnippet>416</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#417 id=417 data-nosnippet>417</a> FeatureFlagSliceType::&lt;SliceType&gt;(<span class="self">self</span>.<span class="number">0</span>)
<a href=#418 id=418 data-nosnippet>418</a> }
<a href=#419 id=419 data-nosnippet>419</a>}
<a href=#420 id=420 data-nosnippet>420</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone + Copy&gt; Copy <span class="kw">for </span>FeatureFlagSliceType&lt;SliceType&gt; {}
<a href=#421 id=421 data-nosnippet>421</a>
<a href=#422 id=422 data-nosnippet>422</a><span class="attr">#[derive(Debug)]
<a href=#423 id=423 data-nosnippet>423</a></span><span class="kw">pub struct </span>LiteralCommand&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; {
<a href=#424 id=424 data-nosnippet>424</a> <span class="kw">pub </span>data: SliceType,
<a href=#425 id=425 data-nosnippet>425</a> <span class="kw">pub </span>prob: FeatureFlagSliceType&lt;SliceType&gt;,
<a href=#426 id=426 data-nosnippet>426</a> <span class="kw">pub </span>high_entropy: bool, <span class="comment">// this block of bytes is high entropy with a few patterns never seen again; adapt slower
<a href=#427 id=427 data-nosnippet>427</a></span>}
<a href=#428 id=428 data-nosnippet>428</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; SliceWrapper&lt;u8&gt; <span class="kw">for </span>LiteralCommand&lt;SliceType&gt; {
<a href=#429 id=429 data-nosnippet>429</a> <span class="attr">#[inline(always)]
<a href=#430 id=430 data-nosnippet>430</a> </span><span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#431 id=431 data-nosnippet>431</a> <span class="self">self</span>.data.slice()
<a href=#432 id=432 data-nosnippet>432</a> }
<a href=#433 id=433 data-nosnippet>433</a>}
<a href=#434 id=434 data-nosnippet>434</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + SliceWrapperMut&lt;u8&gt;&gt; SliceWrapperMut&lt;u8&gt;
<a href=#435 id=435 data-nosnippet>435</a> <span class="kw">for </span>LiteralCommand&lt;SliceType&gt;
<a href=#436 id=436 data-nosnippet>436</a>{
<a href=#437 id=437 data-nosnippet>437</a> <span class="attr">#[inline(always)]
<a href=#438 id=438 data-nosnippet>438</a> </span><span class="kw">fn </span>slice_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>[u8] {
<a href=#439 id=439 data-nosnippet>439</a> <span class="self">self</span>.data.slice_mut()
<a href=#440 id=440 data-nosnippet>440</a> }
<a href=#441 id=441 data-nosnippet>441</a>}
<a href=#442 id=442 data-nosnippet>442</a>
<a href=#443 id=443 data-nosnippet>443</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Default&gt; Nop&lt;LiteralCommand&lt;SliceType&gt;&gt;
<a href=#444 id=444 data-nosnippet>444</a> <span class="kw">for </span>LiteralCommand&lt;SliceType&gt;
<a href=#445 id=445 data-nosnippet>445</a>{
<a href=#446 id=446 data-nosnippet>446</a> <span class="attr">#[inline(always)]
<a href=#447 id=447 data-nosnippet>447</a> </span><span class="kw">fn </span>nop() -&gt; <span class="self">Self </span>{
<a href=#448 id=448 data-nosnippet>448</a> LiteralCommand {
<a href=#449 id=449 data-nosnippet>449</a> data: SliceType::default(),
<a href=#450 id=450 data-nosnippet>450</a> prob: FeatureFlagSliceType::&lt;SliceType&gt;::default(),
<a href=#451 id=451 data-nosnippet>451</a> high_entropy: <span class="bool-val">false</span>,
<a href=#452 id=452 data-nosnippet>452</a> }
<a href=#453 id=453 data-nosnippet>453</a> }
<a href=#454 id=454 data-nosnippet>454</a>}
<a href=#455 id=455 data-nosnippet>455</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone&gt; Clone <span class="kw">for </span>LiteralCommand&lt;SliceType&gt; {
<a href=#456 id=456 data-nosnippet>456</a> <span class="attr">#[inline(always)]
<a href=#457 id=457 data-nosnippet>457</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; LiteralCommand&lt;SliceType&gt; {
<a href=#458 id=458 data-nosnippet>458</a> LiteralCommand::&lt;SliceType&gt; {
<a href=#459 id=459 data-nosnippet>459</a> data: <span class="self">self</span>.data.clone(),
<a href=#460 id=460 data-nosnippet>460</a> prob: <span class="self">self</span>.prob.clone(),
<a href=#461 id=461 data-nosnippet>461</a> high_entropy: <span class="self">self</span>.high_entropy,
<a href=#462 id=462 data-nosnippet>462</a> }
<a href=#463 id=463 data-nosnippet>463</a> }
<a href=#464 id=464 data-nosnippet>464</a>}
<a href=#465 id=465 data-nosnippet>465</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone + Copy&gt; Copy <span class="kw">for </span>LiteralCommand&lt;SliceType&gt; {}
<a href=#466 id=466 data-nosnippet>466</a>
<a href=#467 id=467 data-nosnippet>467</a><span class="attr">#[derive(Debug)]
<a href=#468 id=468 data-nosnippet>468</a></span><span class="kw">pub enum </span>Command&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; {
<a href=#469 id=469 data-nosnippet>469</a> Copy(CopyCommand),
<a href=#470 id=470 data-nosnippet>470</a> Dict(DictCommand),
<a href=#471 id=471 data-nosnippet>471</a> Literal(LiteralCommand&lt;SliceType&gt;),
<a href=#472 id=472 data-nosnippet>472</a> BlockSwitchCommand(BlockSwitch),
<a href=#473 id=473 data-nosnippet>473</a> BlockSwitchLiteral(LiteralBlockSwitch),
<a href=#474 id=474 data-nosnippet>474</a> BlockSwitchDistance(BlockSwitch),
<a href=#475 id=475 data-nosnippet>475</a> PredictionMode(PredictionModeContextMap&lt;SliceType&gt;),
<a href=#476 id=476 data-nosnippet>476</a>}
<a href=#477 id=477 data-nosnippet>477</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Default&gt; Command&lt;SliceType&gt; {
<a href=#478 id=478 data-nosnippet>478</a> <span class="attr">#[inline]
<a href=#479 id=479 data-nosnippet>479</a> </span><span class="kw">pub fn </span>free_array&lt;F&gt;(<span class="kw-2">&amp;mut </span><span class="self">self</span>, apply_func: <span class="kw-2">&amp;mut </span>F)
<a href=#480 id=480 data-nosnippet>480</a> <span class="kw">where
<a href=#481 id=481 data-nosnippet>481</a> </span>F: FnMut(SliceType),
<a href=#482 id=482 data-nosnippet>482</a> {
<a href=#483 id=483 data-nosnippet>483</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#484 id=484 data-nosnippet>484</a> Command::Literal(<span class="kw-2">ref mut </span>lit) =&gt; apply_func(core::mem::take(<span class="kw-2">&amp;mut </span>lit.data)),
<a href=#485 id=485 data-nosnippet>485</a> Command::PredictionMode(<span class="kw-2">ref mut </span>pm) =&gt; {
<a href=#486 id=486 data-nosnippet>486</a> apply_func(core::mem::take(<span class="kw-2">&amp;mut </span>pm.literal_context_map));
<a href=#487 id=487 data-nosnippet>487</a> apply_func(core::mem::take(
<a href=#488 id=488 data-nosnippet>488</a> <span class="kw-2">&amp;mut </span>pm.predmode_speed_and_distance_context_map,
<a href=#489 id=489 data-nosnippet>489</a> ));
<a href=#490 id=490 data-nosnippet>490</a> }
<a href=#491 id=491 data-nosnippet>491</a> <span class="kw">_ </span>=&gt; {}
<a href=#492 id=492 data-nosnippet>492</a> }
<a href=#493 id=493 data-nosnippet>493</a> }
<a href=#494 id=494 data-nosnippet>494</a>}
<a href=#495 id=495 data-nosnippet>495</a>
<a href=#496 id=496 data-nosnippet>496</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; Default <span class="kw">for </span>Command&lt;SliceType&gt; {
<a href=#497 id=497 data-nosnippet>497</a> <span class="attr">#[inline(always)]
<a href=#498 id=498 data-nosnippet>498</a> </span><span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#499 id=499 data-nosnippet>499</a> Command::&lt;SliceType&gt;::nop()
<a href=#500 id=500 data-nosnippet>500</a> }
<a href=#501 id=501 data-nosnippet>501</a>}
<a href=#502 id=502 data-nosnippet>502</a>
<a href=#503 id=503 data-nosnippet>503</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt;&gt; Nop&lt;Command&lt;SliceType&gt;&gt; <span class="kw">for </span>Command&lt;SliceType&gt; {
<a href=#504 id=504 data-nosnippet>504</a> <span class="attr">#[inline(always)]
<a href=#505 id=505 data-nosnippet>505</a> </span><span class="kw">fn </span>nop() -&gt; Command&lt;SliceType&gt; {
<a href=#506 id=506 data-nosnippet>506</a> Command::Copy(CopyCommand::nop())
<a href=#507 id=507 data-nosnippet>507</a> }
<a href=#508 id=508 data-nosnippet>508</a>}
<a href=#509 id=509 data-nosnippet>509</a>
<a href=#510 id=510 data-nosnippet>510</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone&gt; Clone <span class="kw">for </span>Command&lt;SliceType&gt; {
<a href=#511 id=511 data-nosnippet>511</a> <span class="attr">#[inline]
<a href=#512 id=512 data-nosnippet>512</a> </span><span class="kw">fn </span>clone(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; Command&lt;SliceType&gt; {
<a href=#513 id=513 data-nosnippet>513</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#514 id=514 data-nosnippet>514</a> Command::Copy(copy) =&gt; Command::Copy(<span class="kw-2">*</span>copy),
<a href=#515 id=515 data-nosnippet>515</a> Command::Dict(dict) =&gt; Command::Dict(<span class="kw-2">*</span>dict),
<a href=#516 id=516 data-nosnippet>516</a> Command::Literal(literal) =&gt; Command::Literal(literal.clone()),
<a href=#517 id=517 data-nosnippet>517</a> Command::BlockSwitchCommand(switch) =&gt; Command::BlockSwitchCommand(<span class="kw-2">*</span>switch),
<a href=#518 id=518 data-nosnippet>518</a> Command::BlockSwitchLiteral(switch) =&gt; Command::BlockSwitchLiteral(<span class="kw-2">*</span>switch),
<a href=#519 id=519 data-nosnippet>519</a> Command::BlockSwitchDistance(switch) =&gt; Command::BlockSwitchDistance(<span class="kw-2">*</span>switch),
<a href=#520 id=520 data-nosnippet>520</a> Command::PredictionMode(pm) =&gt; Command::PredictionMode(pm.clone()),
<a href=#521 id=521 data-nosnippet>521</a> }
<a href=#522 id=522 data-nosnippet>522</a> }
<a href=#523 id=523 data-nosnippet>523</a>}
<a href=#524 id=524 data-nosnippet>524</a>
<a href=#525 id=525 data-nosnippet>525</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Clone + Copy&gt; Copy <span class="kw">for </span>Command&lt;SliceType&gt; {}
<a href=#526 id=526 data-nosnippet>526</a>
<a href=#527 id=527 data-nosnippet>527</a><span class="attr">#[inline(always)]
<a href=#528 id=528 data-nosnippet>528</a></span><span class="kw">pub fn </span>free_cmd_inline&lt;SliceTypeAllocator: Allocator&lt;u8&gt;&gt;(
<a href=#529 id=529 data-nosnippet>529</a> xself: <span class="kw-2">&amp;mut </span>Command&lt;SliceTypeAllocator::AllocatedMemory&gt;,
<a href=#530 id=530 data-nosnippet>530</a> m8: <span class="kw-2">&amp;mut </span>SliceTypeAllocator,
<a href=#531 id=531 data-nosnippet>531</a>) {
<a href=#532 id=532 data-nosnippet>532</a> <span class="kw">match </span><span class="kw-2">*</span>xself {
<a href=#533 id=533 data-nosnippet>533</a> Command::Literal(<span class="kw-2">ref mut </span>lit) =&gt; m8.free_cell(core::mem::take(<span class="kw-2">&amp;mut </span>lit.data)),
<a href=#534 id=534 data-nosnippet>534</a> Command::PredictionMode(<span class="kw-2">ref mut </span>pm) =&gt; {
<a href=#535 id=535 data-nosnippet>535</a> m8.free_cell(core::mem::take(<span class="kw-2">&amp;mut </span>pm.literal_context_map));
<a href=#536 id=536 data-nosnippet>536</a> m8.free_cell(core::mem::take(
<a href=#537 id=537 data-nosnippet>537</a> <span class="kw-2">&amp;mut </span>pm.predmode_speed_and_distance_context_map,
<a href=#538 id=538 data-nosnippet>538</a> ));
<a href=#539 id=539 data-nosnippet>539</a> }
<a href=#540 id=540 data-nosnippet>540</a> Command::Dict(<span class="kw">_</span>)
<a href=#541 id=541 data-nosnippet>541</a> | Command::Copy(<span class="kw">_</span>)
<a href=#542 id=542 data-nosnippet>542</a> | Command::BlockSwitchCommand(<span class="kw">_</span>)
<a href=#543 id=543 data-nosnippet>543</a> | Command::BlockSwitchLiteral(<span class="kw">_</span>)
<a href=#544 id=544 data-nosnippet>544</a> | Command::BlockSwitchDistance(<span class="kw">_</span>) =&gt; {}
<a href=#545 id=545 data-nosnippet>545</a> }
<a href=#546 id=546 data-nosnippet>546</a>}
<a href=#547 id=547 data-nosnippet>547</a>
<a href=#548 id=548 data-nosnippet>548</a><span class="attr">#[inline(never)]
<a href=#549 id=549 data-nosnippet>549</a></span><span class="kw">pub fn </span>free_cmd&lt;SliceTypeAllocator: Allocator&lt;u8&gt;&gt;(
<a href=#550 id=550 data-nosnippet>550</a> xself: <span class="kw-2">&amp;mut </span>Command&lt;SliceTypeAllocator::AllocatedMemory&gt;,
<a href=#551 id=551 data-nosnippet>551</a> m8: <span class="kw-2">&amp;mut </span>SliceTypeAllocator,
<a href=#552 id=552 data-nosnippet>552</a>) {
<a href=#553 id=553 data-nosnippet>553</a> free_cmd_inline(xself, m8)
<a href=#554 id=554 data-nosnippet>554</a>}
<a href=#555 id=555 data-nosnippet>555</a>
<a href=#556 id=556 data-nosnippet>556</a><span class="attr">#[derive(Clone, Copy, Default, Debug)]
<a href=#557 id=557 data-nosnippet>557</a></span><span class="kw">pub struct </span>SliceOffset(<span class="kw">pub </span>usize, <span class="kw">pub </span>u32);
<a href=#558 id=558 data-nosnippet>558</a><span class="kw">impl </span>SliceWrapper&lt;u8&gt; <span class="kw">for </span>SliceOffset {
<a href=#559 id=559 data-nosnippet>559</a> <span class="kw">fn </span>slice(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#560 id=560 data-nosnippet>560</a> <span class="comment">// not perfect--shouldn't be calling this without thawing the wrapper
<a href=#561 id=561 data-nosnippet>561</a> </span><span class="kw-2">&amp;</span>[]
<a href=#562 id=562 data-nosnippet>562</a> }
<a href=#563 id=563 data-nosnippet>563</a>}
<a href=#564 id=564 data-nosnippet>564</a>
<a href=#565 id=565 data-nosnippet>565</a><span class="kw">pub trait </span>Freezable {
<a href=#566 id=566 data-nosnippet>566</a> <span class="kw">fn </span>freeze(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; SliceOffset;
<a href=#567 id=567 data-nosnippet>567</a>}
<a href=#568 id=568 data-nosnippet>568</a>
<a href=#569 id=569 data-nosnippet>569</a><span class="kw">pub trait </span>Unfreezable {
<a href=#570 id=570 data-nosnippet>570</a> <span class="kw">fn </span>thaw&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8]) -&gt; InputReference&lt;<span class="lifetime">'a</span>&gt;;
<a href=#571 id=571 data-nosnippet>571</a> <span class="kw">fn </span>thaw_mut&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u8]) -&gt; InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;;
<a href=#572 id=572 data-nosnippet>572</a> <span class="kw">fn </span>thaw_pair&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, pair: <span class="kw-2">&amp;</span>InputPair&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;InputReference&lt;<span class="lifetime">'a</span>&gt;, ()&gt;;
<a href=#573 id=573 data-nosnippet>573</a>}
<a href=#574 id=574 data-nosnippet>574</a>
<a href=#575 id=575 data-nosnippet>575</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;InputReference&lt;<span class="lifetime">'a</span>&gt;&gt; <span class="kw">for </span>SliceOffset {
<a href=#576 id=576 data-nosnippet>576</a> <span class="kw">fn </span>from(f: InputReference&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#577 id=577 data-nosnippet>577</a> <span class="macro">debug_assert!</span>(f.data.len() &lt;= <span class="number">0xffff_ffff</span>);
<a href=#578 id=578 data-nosnippet>578</a> SliceOffset(f.orig_offset, f.data.len() <span class="kw">as </span>u32)
<a href=#579 id=579 data-nosnippet>579</a> }
<a href=#580 id=580 data-nosnippet>580</a>}
<a href=#581 id=581 data-nosnippet>581</a><span class="kw">impl </span>Unfreezable <span class="kw">for </span>SliceOffset {
<a href=#582 id=582 data-nosnippet>582</a> <span class="kw">fn </span>thaw&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8]) -&gt; InputReference&lt;<span class="lifetime">'a</span>&gt; {
<a href=#583 id=583 data-nosnippet>583</a> InputReference {
<a href=#584 id=584 data-nosnippet>584</a> data: data.split_at(<span class="self">self</span>.<span class="number">0</span>).<span class="number">1</span>.split_at(<span class="self">self</span>.<span class="number">1 </span><span class="kw">as </span>usize).<span class="number">0</span>,
<a href=#585 id=585 data-nosnippet>585</a> orig_offset: <span class="self">self</span>.<span class="number">0</span>,
<a href=#586 id=586 data-nosnippet>586</a> }
<a href=#587 id=587 data-nosnippet>587</a> }
<a href=#588 id=588 data-nosnippet>588</a> <span class="kw">fn </span>thaw_mut&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u8]) -&gt; InputReferenceMut&lt;<span class="lifetime">'a</span>&gt; {
<a href=#589 id=589 data-nosnippet>589</a> InputReferenceMut {
<a href=#590 id=590 data-nosnippet>590</a> data: data.split_at_mut(<span class="self">self</span>.<span class="number">0</span>).<span class="number">1</span>.split_at_mut(<span class="self">self</span>.<span class="number">1 </span><span class="kw">as </span>usize).<span class="number">0</span>,
<a href=#591 id=591 data-nosnippet>591</a> orig_offset: <span class="self">self</span>.<span class="number">0</span>,
<a href=#592 id=592 data-nosnippet>592</a> }
<a href=#593 id=593 data-nosnippet>593</a> }
<a href=#594 id=594 data-nosnippet>594</a> <span class="kw">fn </span>thaw_pair&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, pair: <span class="kw-2">&amp;</span>InputPair&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;InputReference&lt;<span class="lifetime">'a</span>&gt;, ()&gt; {
<a href=#595 id=595 data-nosnippet>595</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>&gt;= pair.<span class="number">1</span>.orig_offset {
<a href=#596 id=596 data-nosnippet>596</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(InputReference {
<a href=#597 id=597 data-nosnippet>597</a> data: pair
<a href=#598 id=598 data-nosnippet>598</a> .<span class="number">1
<a href=#599 id=599 data-nosnippet>599</a> </span>.data
<a href=#600 id=600 data-nosnippet>600</a> .split_at(<span class="self">self</span>.<span class="number">0 </span>- pair.<span class="number">1</span>.orig_offset)
<a href=#601 id=601 data-nosnippet>601</a> .<span class="number">1
<a href=#602 id=602 data-nosnippet>602</a> </span>.split_at(<span class="self">self</span>.<span class="number">1 </span><span class="kw">as </span>usize)
<a href=#603 id=603 data-nosnippet>603</a> .<span class="number">0</span>,
<a href=#604 id=604 data-nosnippet>604</a> orig_offset: <span class="self">self</span>.<span class="number">0</span>,
<a href=#605 id=605 data-nosnippet>605</a> });
<a href=#606 id=606 data-nosnippet>606</a> }
<a href=#607 id=607 data-nosnippet>607</a> <span class="kw">let </span>offset = <span class="self">self</span>.<span class="number">0 </span>- pair.<span class="number">0</span>.orig_offset;
<a href=#608 id=608 data-nosnippet>608</a> <span class="kw">if </span>offset + <span class="self">self</span>.<span class="number">1 </span><span class="kw">as </span>usize &lt;= pair.<span class="number">0</span>.data.len() {
<a href=#609 id=609 data-nosnippet>609</a> <span class="comment">// overlap
<a href=#610 id=610 data-nosnippet>610</a> </span><span class="prelude-val">Ok</span>(InputReference {
<a href=#611 id=611 data-nosnippet>611</a> data: pair.<span class="number">0</span>.data.split_at(offset).<span class="number">1</span>.split_at(<span class="self">self</span>.<span class="number">1 </span><span class="kw">as </span>usize).<span class="number">0</span>,
<a href=#612 id=612 data-nosnippet>612</a> orig_offset: <span class="self">self</span>.<span class="number">0</span>,
<a href=#613 id=613 data-nosnippet>613</a> })
<a href=#614 id=614 data-nosnippet>614</a> } <span class="kw">else </span>{
<a href=#615 id=615 data-nosnippet>615</a> <span class="prelude-val">Err</span>(())
<a href=#616 id=616 data-nosnippet>616</a> }
<a href=#617 id=617 data-nosnippet>617</a> }
<a href=#618 id=618 data-nosnippet>618</a>}
<a href=#619 id=619 data-nosnippet>619</a><span class="kw">impl </span>SliceOffset {
<a href=#620 id=620 data-nosnippet>620</a> <span class="kw">pub fn </span>offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#621 id=621 data-nosnippet>621</a> <span class="self">self</span>.<span class="number">0
<a href=#622 id=622 data-nosnippet>622</a> </span>}
<a href=#623 id=623 data-nosnippet>623</a> <span class="kw">pub fn </span>len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#624 id=624 data-nosnippet>624</a> <span class="self">self</span>.<span class="number">1 </span><span class="kw">as </span>usize
<a href=#625 id=625 data-nosnippet>625</a> }
<a href=#626 id=626 data-nosnippet>626</a> <span class="kw">pub fn </span>len32(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u32 {
<a href=#627 id=627 data-nosnippet>627</a> <span class="self">self</span>.<span class="number">1
<a href=#628 id=628 data-nosnippet>628</a> </span>}
<a href=#629 id=629 data-nosnippet>629</a>}
<a href=#630 id=630 data-nosnippet>630</a>
<a href=#631 id=631 data-nosnippet>631</a><span class="kw">pub type </span>StaticCommand = Command&lt;SliceOffset&gt;;
<a href=#632 id=632 data-nosnippet>632</a>
<a href=#633 id=633 data-nosnippet>633</a><span class="kw">pub trait </span>CommandProcessor&lt;<span class="lifetime">'a</span>&gt; {
<a href=#634 id=634 data-nosnippet>634</a> <span class="kw">fn </span>push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, val: Command&lt;InputReference&lt;<span class="lifetime">'a</span>&gt;&gt;);
<a href=#635 id=635 data-nosnippet>635</a> <span class="kw">fn </span>push_literals(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>InputPair&lt;<span class="lifetime">'a</span>&gt;) {
<a href=#636 id=636 data-nosnippet>636</a> <span class="kw">if </span>data.<span class="number">0</span>.len() != <span class="number">0 </span>{
<a href=#637 id=637 data-nosnippet>637</a> <span class="self">self</span>.push(Command::Literal(LiteralCommand {
<a href=#638 id=638 data-nosnippet>638</a> data: data.<span class="number">0</span>,
<a href=#639 id=639 data-nosnippet>639</a> prob: FeatureFlagSliceType::&lt;InputReference&gt;::default(),
<a href=#640 id=640 data-nosnippet>640</a> high_entropy: <span class="bool-val">false</span>,
<a href=#641 id=641 data-nosnippet>641</a> }));
<a href=#642 id=642 data-nosnippet>642</a> }
<a href=#643 id=643 data-nosnippet>643</a> <span class="kw">if </span>data.<span class="number">1</span>.len() != <span class="number">0 </span>{
<a href=#644 id=644 data-nosnippet>644</a> <span class="self">self</span>.push(Command::Literal(LiteralCommand {
<a href=#645 id=645 data-nosnippet>645</a> data: data.<span class="number">1</span>,
<a href=#646 id=646 data-nosnippet>646</a> prob: FeatureFlagSliceType::&lt;InputReference&gt;::default(),
<a href=#647 id=647 data-nosnippet>647</a> high_entropy: <span class="bool-val">false</span>,
<a href=#648 id=648 data-nosnippet>648</a> }));
<a href=#649 id=649 data-nosnippet>649</a> }
<a href=#650 id=650 data-nosnippet>650</a> }
<a href=#651 id=651 data-nosnippet>651</a> <span class="kw">fn </span>push_rand_literals(<span class="kw-2">&amp;mut </span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>InputPair&lt;<span class="lifetime">'a</span>&gt;) {
<a href=#652 id=652 data-nosnippet>652</a> <span class="kw">if </span>data.<span class="number">0</span>.len() != <span class="number">0 </span>{
<a href=#653 id=653 data-nosnippet>653</a> <span class="self">self</span>.push(Command::Literal(LiteralCommand {
<a href=#654 id=654 data-nosnippet>654</a> data: data.<span class="number">0</span>,
<a href=#655 id=655 data-nosnippet>655</a> prob: FeatureFlagSliceType::&lt;InputReference&gt;::default(),
<a href=#656 id=656 data-nosnippet>656</a> high_entropy: <span class="bool-val">true</span>,
<a href=#657 id=657 data-nosnippet>657</a> }));
<a href=#658 id=658 data-nosnippet>658</a> }
<a href=#659 id=659 data-nosnippet>659</a> <span class="kw">if </span>data.<span class="number">1</span>.len() != <span class="number">0 </span>{
<a href=#660 id=660 data-nosnippet>660</a> <span class="self">self</span>.push(Command::Literal(LiteralCommand {
<a href=#661 id=661 data-nosnippet>661</a> data: data.<span class="number">1</span>,
<a href=#662 id=662 data-nosnippet>662</a> prob: FeatureFlagSliceType::&lt;InputReference&gt;::default(),
<a href=#663 id=663 data-nosnippet>663</a> high_entropy: <span class="bool-val">true</span>,
<a href=#664 id=664 data-nosnippet>664</a> }));
<a href=#665 id=665 data-nosnippet>665</a> }
<a href=#666 id=666 data-nosnippet>666</a> }
<a href=#667 id=667 data-nosnippet>667</a> <span class="kw">fn </span>push_block_switch_literal(<span class="kw-2">&amp;mut </span><span class="self">self</span>, block_type: u8) {
<a href=#668 id=668 data-nosnippet>668</a> <span class="self">self</span>.push(Command::BlockSwitchLiteral(LiteralBlockSwitch::new(
<a href=#669 id=669 data-nosnippet>669</a> block_type, <span class="number">0</span>,
<a href=#670 id=670 data-nosnippet>670</a> )))
<a href=#671 id=671 data-nosnippet>671</a> }
<a href=#672 id=672 data-nosnippet>672</a>}
<a href=#673 id=673 data-nosnippet>673</a>
<a href=#674 id=674 data-nosnippet>674</a><span class="kw">impl</span>&lt;SliceType: Unfreezable + SliceWrapper&lt;u8&gt;&gt; Command&lt;SliceType&gt; {
<a href=#675 id=675 data-nosnippet>675</a> <span class="kw">pub fn </span>thaw_pair&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span>InputPair&lt;<span class="lifetime">'a</span>&gt;) -&gt; Command&lt;InputReference&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#676 id=676 data-nosnippet>676</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#677 id=677 data-nosnippet>677</a> Command::Literal(<span class="kw-2">ref </span>lit) =&gt; Command::Literal(LiteralCommand {
<a href=#678 id=678 data-nosnippet>678</a> data: lit.data.thaw_pair(data).unwrap(),
<a href=#679 id=679 data-nosnippet>679</a> prob: FeatureFlagSliceType::default(),
<a href=#680 id=680 data-nosnippet>680</a> high_entropy: lit.high_entropy,
<a href=#681 id=681 data-nosnippet>681</a> }),
<a href=#682 id=682 data-nosnippet>682</a> Command::PredictionMode(<span class="kw-2">ref </span>pm) =&gt; Command::PredictionMode(PredictionModeContextMap {
<a href=#683 id=683 data-nosnippet>683</a> literal_context_map: pm.literal_context_map.thaw_pair(data).unwrap(),
<a href=#684 id=684 data-nosnippet>684</a> predmode_speed_and_distance_context_map: pm
<a href=#685 id=685 data-nosnippet>685</a> .predmode_speed_and_distance_context_map
<a href=#686 id=686 data-nosnippet>686</a> .thaw_pair(data)
<a href=#687 id=687 data-nosnippet>687</a> .unwrap(),
<a href=#688 id=688 data-nosnippet>688</a> }),
<a href=#689 id=689 data-nosnippet>689</a> Command::Dict(<span class="kw-2">ref </span>d) =&gt; Command::Dict(<span class="kw-2">*</span>d),
<a href=#690 id=690 data-nosnippet>690</a> Command::Copy(<span class="kw-2">ref </span>c) =&gt; Command::Copy(<span class="kw-2">*</span>c),
<a href=#691 id=691 data-nosnippet>691</a> Command::BlockSwitchCommand(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchCommand(<span class="kw-2">*</span>c),
<a href=#692 id=692 data-nosnippet>692</a> Command::BlockSwitchLiteral(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchLiteral(<span class="kw-2">*</span>c),
<a href=#693 id=693 data-nosnippet>693</a> Command::BlockSwitchDistance(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchDistance(<span class="kw-2">*</span>c),
<a href=#694 id=694 data-nosnippet>694</a> }
<a href=#695 id=695 data-nosnippet>695</a> }
<a href=#696 id=696 data-nosnippet>696</a>
<a href=#697 id=697 data-nosnippet>697</a> <span class="kw">pub fn </span>thaw&lt;<span class="lifetime">'a</span>&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, data: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>[u8]) -&gt; Command&lt;InputReference&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#698 id=698 data-nosnippet>698</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#699 id=699 data-nosnippet>699</a> Command::Literal(<span class="kw-2">ref </span>lit) =&gt; Command::Literal(LiteralCommand {
<a href=#700 id=700 data-nosnippet>700</a> data: lit.data.thaw(data),
<a href=#701 id=701 data-nosnippet>701</a> prob: FeatureFlagSliceType::default(),
<a href=#702 id=702 data-nosnippet>702</a> high_entropy: lit.high_entropy,
<a href=#703 id=703 data-nosnippet>703</a> }),
<a href=#704 id=704 data-nosnippet>704</a> Command::PredictionMode(<span class="kw-2">ref </span>pm) =&gt; Command::PredictionMode(PredictionModeContextMap {
<a href=#705 id=705 data-nosnippet>705</a> literal_context_map: pm.literal_context_map.thaw(data),
<a href=#706 id=706 data-nosnippet>706</a> predmode_speed_and_distance_context_map: pm
<a href=#707 id=707 data-nosnippet>707</a> .predmode_speed_and_distance_context_map
<a href=#708 id=708 data-nosnippet>708</a> .thaw(data),
<a href=#709 id=709 data-nosnippet>709</a> }),
<a href=#710 id=710 data-nosnippet>710</a> Command::Dict(<span class="kw-2">ref </span>d) =&gt; Command::Dict(<span class="kw-2">*</span>d),
<a href=#711 id=711 data-nosnippet>711</a> Command::Copy(<span class="kw-2">ref </span>c) =&gt; Command::Copy(<span class="kw-2">*</span>c),
<a href=#712 id=712 data-nosnippet>712</a> Command::BlockSwitchCommand(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchCommand(<span class="kw-2">*</span>c),
<a href=#713 id=713 data-nosnippet>713</a> Command::BlockSwitchLiteral(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchLiteral(<span class="kw-2">*</span>c),
<a href=#714 id=714 data-nosnippet>714</a> Command::BlockSwitchDistance(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchDistance(<span class="kw-2">*</span>c),
<a href=#715 id=715 data-nosnippet>715</a> }
<a href=#716 id=716 data-nosnippet>716</a> }
<a href=#717 id=717 data-nosnippet>717</a>}
<a href=#718 id=718 data-nosnippet>718</a>
<a href=#719 id=719 data-nosnippet>719</a><span class="kw">impl</span>&lt;SliceType: SliceWrapper&lt;u8&gt; + Freezable&gt; Command&lt;SliceType&gt; {
<a href=#720 id=720 data-nosnippet>720</a> <span class="kw">pub fn </span>freeze(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; Command&lt;SliceOffset&gt; {
<a href=#721 id=721 data-nosnippet>721</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#722 id=722 data-nosnippet>722</a> Command::Literal(<span class="kw-2">ref </span>lit) =&gt; Command::Literal(LiteralCommand {
<a href=#723 id=723 data-nosnippet>723</a> data: lit.data.freeze(),
<a href=#724 id=724 data-nosnippet>724</a> prob: FeatureFlagSliceType::default(),
<a href=#725 id=725 data-nosnippet>725</a> high_entropy: lit.high_entropy,
<a href=#726 id=726 data-nosnippet>726</a> }),
<a href=#727 id=727 data-nosnippet>727</a> Command::PredictionMode(<span class="kw-2">ref </span>pm) =&gt; Command::PredictionMode(PredictionModeContextMap {
<a href=#728 id=728 data-nosnippet>728</a> literal_context_map: pm.literal_context_map.freeze(),
<a href=#729 id=729 data-nosnippet>729</a> predmode_speed_and_distance_context_map: pm
<a href=#730 id=730 data-nosnippet>730</a> .predmode_speed_and_distance_context_map
<a href=#731 id=731 data-nosnippet>731</a> .freeze(),
<a href=#732 id=732 data-nosnippet>732</a> }),
<a href=#733 id=733 data-nosnippet>733</a> Command::Dict(<span class="kw-2">ref </span>d) =&gt; Command::Dict(<span class="kw-2">*</span>d),
<a href=#734 id=734 data-nosnippet>734</a> Command::Copy(<span class="kw-2">ref </span>c) =&gt; Command::Copy(<span class="kw-2">*</span>c),
<a href=#735 id=735 data-nosnippet>735</a> Command::BlockSwitchCommand(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchCommand(<span class="kw-2">*</span>c),
<a href=#736 id=736 data-nosnippet>736</a> Command::BlockSwitchLiteral(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchLiteral(<span class="kw-2">*</span>c),
<a href=#737 id=737 data-nosnippet>737</a> Command::BlockSwitchDistance(<span class="kw-2">ref </span>c) =&gt; Command::BlockSwitchDistance(<span class="kw-2">*</span>c),
<a href=#738 id=738 data-nosnippet>738</a> }
<a href=#739 id=739 data-nosnippet>739</a> }
<a href=#740 id=740 data-nosnippet>740</a>}
<a href=#741 id=741 data-nosnippet>741</a>
<a href=#742 id=742 data-nosnippet>742</a><span class="attr">#[inline(always)]
<a href=#743 id=743 data-nosnippet>743</a></span><span class="kw">pub fn </span>speed_to_u8(data: u16) -&gt; u8 {
<a href=#744 id=744 data-nosnippet>744</a> <span class="kw">let </span>length = <span class="number">16 </span>- data.leading_zeros() <span class="kw">as </span>u8;
<a href=#745 id=745 data-nosnippet>745</a> <span class="kw">let </span>mantissa = <span class="kw">if </span><span class="macro">data !</span>= <span class="number">0 </span>{
<a href=#746 id=746 data-nosnippet>746</a> <span class="kw">let </span>rem = data - (<span class="number">1 </span>&lt;&lt; (length - <span class="number">1</span>));
<a href=#747 id=747 data-nosnippet>747</a> (rem &lt;&lt; <span class="number">3</span>) &gt;&gt; (length - <span class="number">1</span>)
<a href=#748 id=748 data-nosnippet>748</a> } <span class="kw">else </span>{
<a href=#749 id=749 data-nosnippet>749</a> <span class="number">0
<a href=#750 id=750 data-nosnippet>750</a> </span>};
<a href=#751 id=751 data-nosnippet>751</a> (length &lt;&lt; <span class="number">3</span>) | mantissa <span class="kw">as </span>u8
<a href=#752 id=752 data-nosnippet>752</a>}
<a href=#753 id=753 data-nosnippet>753</a>
<a href=#754 id=754 data-nosnippet>754</a><span class="attr">#[inline(always)]
<a href=#755 id=755 data-nosnippet>755</a></span><span class="kw">pub fn </span>u8_to_speed(data: u8) -&gt; u16 {
<a href=#756 id=756 data-nosnippet>756</a> <span class="kw">if </span>data &lt; <span class="number">8 </span>{
<a href=#757 id=757 data-nosnippet>757</a> <span class="number">0
<a href=#758 id=758 data-nosnippet>758</a> </span>} <span class="kw">else </span>{
<a href=#759 id=759 data-nosnippet>759</a> <span class="kw">let </span>log_val = (data &gt;&gt; <span class="number">3</span>) - <span class="number">1</span>;
<a href=#760 id=760 data-nosnippet>760</a> <span class="kw">let </span>rem = (u16::from(data) &amp; <span class="number">0x07</span>) &lt;&lt; log_val;
<a href=#761 id=761 data-nosnippet>761</a> (<span class="number">1u16 </span>&lt;&lt; log_val) | (rem &gt;&gt; <span class="number">3</span>)
<a href=#762 id=762 data-nosnippet>762</a> }
<a href=#763 id=763 data-nosnippet>763</a>}
<a href=#764 id=764 data-nosnippet>764</a>
<a href=#765 id=765 data-nosnippet>765</a><span class="attr">#[cfg(test)]
<a href=#766 id=766 data-nosnippet>766</a></span><span class="kw">mod </span>test {
<a href=#767 id=767 data-nosnippet>767</a> <span class="kw">use super</span>::{speed_to_u8, u8_to_speed};
<a href=#768 id=768 data-nosnippet>768</a> <span class="kw">fn </span>tst_u8_to_speed(data: u16) {
<a href=#769 id=769 data-nosnippet>769</a> <span class="macro">assert_eq!</span>(u8_to_speed(speed_to_u8(data)), data);
<a href=#770 id=770 data-nosnippet>770</a> }
<a href=#771 id=771 data-nosnippet>771</a> <span class="attr">#[test]
<a href=#772 id=772 data-nosnippet>772</a> </span><span class="kw">fn </span>test_u8_to_speed() {
<a href=#773 id=773 data-nosnippet>773</a> tst_u8_to_speed(<span class="number">0</span>);
<a href=#774 id=774 data-nosnippet>774</a> tst_u8_to_speed(<span class="number">1</span>);
<a href=#775 id=775 data-nosnippet>775</a> tst_u8_to_speed(<span class="number">2</span>);
<a href=#776 id=776 data-nosnippet>776</a> tst_u8_to_speed(<span class="number">3</span>);
<a href=#777 id=777 data-nosnippet>777</a> tst_u8_to_speed(<span class="number">4</span>);
<a href=#778 id=778 data-nosnippet>778</a> tst_u8_to_speed(<span class="number">5</span>);
<a href=#779 id=779 data-nosnippet>779</a> tst_u8_to_speed(<span class="number">6</span>);
<a href=#780 id=780 data-nosnippet>780</a> tst_u8_to_speed(<span class="number">7</span>);
<a href=#781 id=781 data-nosnippet>781</a> tst_u8_to_speed(<span class="number">8</span>);
<a href=#782 id=782 data-nosnippet>782</a> tst_u8_to_speed(<span class="number">10</span>);
<a href=#783 id=783 data-nosnippet>783</a> tst_u8_to_speed(<span class="number">12</span>);
<a href=#784 id=784 data-nosnippet>784</a> tst_u8_to_speed(<span class="number">16</span>);
<a href=#785 id=785 data-nosnippet>785</a> tst_u8_to_speed(<span class="number">24</span>);
<a href=#786 id=786 data-nosnippet>786</a> tst_u8_to_speed(<span class="number">32</span>);
<a href=#787 id=787 data-nosnippet>787</a> tst_u8_to_speed(<span class="number">48</span>);
<a href=#788 id=788 data-nosnippet>788</a> tst_u8_to_speed(<span class="number">64</span>);
<a href=#789 id=789 data-nosnippet>789</a> tst_u8_to_speed(<span class="number">96</span>);
<a href=#790 id=790 data-nosnippet>790</a> tst_u8_to_speed(<span class="number">768</span>);
<a href=#791 id=791 data-nosnippet>791</a> tst_u8_to_speed(<span class="number">1280</span>);
<a href=#792 id=792 data-nosnippet>792</a> tst_u8_to_speed(<span class="number">1536</span>);
<a href=#793 id=793 data-nosnippet>793</a> tst_u8_to_speed(<span class="number">1664</span>);
<a href=#794 id=794 data-nosnippet>794</a> }
<a href=#795 id=795 data-nosnippet>795</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,122 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/ir_interpret.rs`."><title>ir_interpret.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>ir_interpret.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::SliceWrapper;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span><span class="kw">super</span>::constants::{kSigned3BitContextLookup, kUTF8ContextLookup};
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">super</span>::histogram::ContextType;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::input_pair::InputReference;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::interface;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::interface::LiteralPredictionModeNibble;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">pub trait </span>IRInterpreter {
<a href=#8 id=8 data-nosnippet>8</a> <span class="kw">fn </span>inc_local_byte_offset(<span class="kw-2">&amp;mut </span><span class="self">self</span>, inc: usize);
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">fn </span>local_byte_offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize;
<a href=#10 id=10 data-nosnippet>10</a> <span class="kw">fn </span>update_block_type(<span class="kw-2">&amp;mut </span><span class="self">self</span>, new_type: u8, new_stride: u8);
<a href=#11 id=11 data-nosnippet>11</a> <span class="kw">fn </span>block_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8;
<a href=#12 id=12 data-nosnippet>12</a> <span class="kw">fn </span>literal_data_at_offset(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; u8;
<a href=#13 id=13 data-nosnippet>13</a> <span class="kw">fn </span>literal_context_map(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8];
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw">fn </span>prediction_mode(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw">crate</span>::interface::LiteralPredictionModeNibble;
<a href=#15 id=15 data-nosnippet>15</a> <span class="kw">fn </span>update_cost(
<a href=#16 id=16 data-nosnippet>16</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#17 id=17 data-nosnippet>17</a> stride_prior: [u8; <span class="number">8</span>],
<a href=#18 id=18 data-nosnippet>18</a> stride_byte_offset: usize,
<a href=#19 id=19 data-nosnippet>19</a> selected_bits: u8,
<a href=#20 id=20 data-nosnippet>20</a> cm_prior: usize,
<a href=#21 id=21 data-nosnippet>21</a> literal: u8,
<a href=#22 id=22 data-nosnippet>22</a> );
<a href=#23 id=23 data-nosnippet>23</a>}
<a href=#24 id=24 data-nosnippet>24</a>
<a href=#25 id=25 data-nosnippet>25</a><span class="kw">pub fn </span>push_base&lt;Interpreter: IRInterpreter&gt;(
<a href=#26 id=26 data-nosnippet>26</a> xself: <span class="kw-2">&amp;mut </span>Interpreter,
<a href=#27 id=27 data-nosnippet>27</a> val: interface::Command&lt;InputReference&lt;<span class="lifetime">'_</span>&gt;&gt;,
<a href=#28 id=28 data-nosnippet>28</a>) {
<a href=#29 id=29 data-nosnippet>29</a> <span class="kw">match </span>val {
<a href=#30 id=30 data-nosnippet>30</a> interface::Command::BlockSwitchCommand(<span class="kw">_</span>)
<a href=#31 id=31 data-nosnippet>31</a> | interface::Command::BlockSwitchDistance(<span class="kw">_</span>)
<a href=#32 id=32 data-nosnippet>32</a> | interface::Command::PredictionMode(<span class="kw">_</span>) =&gt; {}
<a href=#33 id=33 data-nosnippet>33</a> interface::Command::Copy(<span class="kw-2">ref </span>copy) =&gt; {
<a href=#34 id=34 data-nosnippet>34</a> xself.inc_local_byte_offset(copy.num_bytes <span class="kw">as </span>usize);
<a href=#35 id=35 data-nosnippet>35</a> }
<a href=#36 id=36 data-nosnippet>36</a> interface::Command::Dict(<span class="kw-2">ref </span>dict) =&gt; {
<a href=#37 id=37 data-nosnippet>37</a> xself.inc_local_byte_offset(dict.final_size <span class="kw">as </span>usize);
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a> interface::Command::BlockSwitchLiteral(block_type) =&gt; {
<a href=#40 id=40 data-nosnippet>40</a> xself.update_block_type(block_type.block_type(), block_type.stride())
<a href=#41 id=41 data-nosnippet>41</a> }
<a href=#42 id=42 data-nosnippet>42</a> interface::Command::Literal(<span class="kw-2">ref </span>lit) =&gt; {
<a href=#43 id=43 data-nosnippet>43</a> <span class="comment">//let stride = xself.get_stride(xself.local_byte_offset()) as usize;
<a href=#44 id=44 data-nosnippet>44</a> </span><span class="kw">let </span><span class="kw-2">mut </span>priors = [<span class="number">0u8</span>; <span class="number">8</span>];
<a href=#45 id=45 data-nosnippet>45</a> <span class="kw">for </span>poffset <span class="kw">in </span><span class="number">0</span>..<span class="number">8 </span>{
<a href=#46 id=46 data-nosnippet>46</a> <span class="kw">if </span>xself.local_byte_offset() &gt; poffset {
<a href=#47 id=47 data-nosnippet>47</a> <span class="kw">let </span>input_offset = xself.local_byte_offset() - poffset - <span class="number">1</span>;
<a href=#48 id=48 data-nosnippet>48</a> priors[<span class="number">7 </span>- poffset] = xself.literal_data_at_offset(input_offset);
<a href=#49 id=49 data-nosnippet>49</a> }
<a href=#50 id=50 data-nosnippet>50</a> }
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">let </span><span class="kw-2">mut </span>cur = <span class="number">0usize</span>;
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">for </span>literal <span class="kw">in </span>lit.data.slice().iter() {
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">let </span>(huffman_table_index, selected_bits) =
<a href=#54 id=54 data-nosnippet>54</a> compute_huffman_table_index_for_context_map(
<a href=#55 id=55 data-nosnippet>55</a> priors[(cur + <span class="number">7</span>) &amp; <span class="number">7</span>],
<a href=#56 id=56 data-nosnippet>56</a> priors[(cur + <span class="number">6</span>) &amp; <span class="number">7</span>],
<a href=#57 id=57 data-nosnippet>57</a> xself.literal_context_map(),
<a href=#58 id=58 data-nosnippet>58</a> xself.prediction_mode(),
<a href=#59 id=59 data-nosnippet>59</a> xself.block_type(),
<a href=#60 id=60 data-nosnippet>60</a> );
<a href=#61 id=61 data-nosnippet>61</a> xself.update_cost(
<a href=#62 id=62 data-nosnippet>62</a> priors,
<a href=#63 id=63 data-nosnippet>63</a> (cur + <span class="number">7</span>) &amp; <span class="number">7</span>,
<a href=#64 id=64 data-nosnippet>64</a> selected_bits,
<a href=#65 id=65 data-nosnippet>65</a> huffman_table_index,
<a href=#66 id=66 data-nosnippet>66</a> <span class="kw-2">*</span>literal,
<a href=#67 id=67 data-nosnippet>67</a> );
<a href=#68 id=68 data-nosnippet>68</a> priors[cur &amp; <span class="number">7</span>] = <span class="kw-2">*</span>literal;
<a href=#69 id=69 data-nosnippet>69</a> cur += <span class="number">1</span>;
<a href=#70 id=70 data-nosnippet>70</a> cur &amp;= <span class="number">7</span>;
<a href=#71 id=71 data-nosnippet>71</a> }
<a href=#72 id=72 data-nosnippet>72</a> xself.inc_local_byte_offset(lit.data.slice().len());
<a href=#73 id=73 data-nosnippet>73</a> }
<a href=#74 id=74 data-nosnippet>74</a> }
<a href=#75 id=75 data-nosnippet>75</a>}
<a href=#76 id=76 data-nosnippet>76</a>
<a href=#77 id=77 data-nosnippet>77</a><span class="comment">// not sure why this fails
<a href=#78 id=78 data-nosnippet>78</a>//impl&lt;'a&gt; interface::CommandProcessor&lt;'a&gt; for IRInterpreter {
<a href=#79 id=79 data-nosnippet>79</a>// fn push&lt;Cb: FnMut(&amp;[interface::Command&lt;InputReference&gt;])&gt;(&amp;mut self,
<a href=#80 id=80 data-nosnippet>80</a>// val: interface::Command&lt;InputReference&lt;'a&gt;&gt;,
<a href=#81 id=81 data-nosnippet>81</a>// callback: &amp;mut Cb) {
<a href=#82 id=82 data-nosnippet>82</a>// push_base(self, val, callback)
<a href=#83 id=83 data-nosnippet>83</a>// }
<a href=#84 id=84 data-nosnippet>84</a>//}
<a href=#85 id=85 data-nosnippet>85</a>
<a href=#86 id=86 data-nosnippet>86</a></span><span class="kw">fn </span>compute_huffman_table_index_for_context_map(
<a href=#87 id=87 data-nosnippet>87</a> prev_byte: u8,
<a href=#88 id=88 data-nosnippet>88</a> prev_prev_byte: u8,
<a href=#89 id=89 data-nosnippet>89</a> literal_context_map: <span class="kw-2">&amp;</span>[u8], <span class="comment">//interface::PredictionModeContextMap&lt;SliceType&gt;,
<a href=#90 id=90 data-nosnippet>90</a> </span>prediction_mode: LiteralPredictionModeNibble,
<a href=#91 id=91 data-nosnippet>91</a> block_type: u8,
<a href=#92 id=92 data-nosnippet>92</a>) -&gt; (usize, u8) {
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">let </span>prior = Context(
<a href=#94 id=94 data-nosnippet>94</a> prev_byte,
<a href=#95 id=95 data-nosnippet>95</a> prev_prev_byte,
<a href=#96 id=96 data-nosnippet>96</a> prediction_mode.to_context_enum().unwrap(),
<a href=#97 id=97 data-nosnippet>97</a> );
<a href=#98 id=98 data-nosnippet>98</a> <span class="macro">assert!</span>(prior &lt; <span class="number">64</span>);
<a href=#99 id=99 data-nosnippet>99</a> <span class="kw">let </span>context_map_index = ((block_type <span class="kw">as </span>usize) &lt;&lt; <span class="number">6</span>) | prior <span class="kw">as </span>usize;
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">if </span>context_map_index &lt; literal_context_map.len() {
<a href=#101 id=101 data-nosnippet>101</a> (literal_context_map[context_map_index] <span class="kw">as </span>usize, prior)
<a href=#102 id=102 data-nosnippet>102</a> } <span class="kw">else </span>{
<a href=#103 id=103 data-nosnippet>103</a> (prior <span class="kw">as </span>usize, prior)
<a href=#104 id=104 data-nosnippet>104</a> }
<a href=#105 id=105 data-nosnippet>105</a>}
<a href=#106 id=106 data-nosnippet>106</a>
<a href=#107 id=107 data-nosnippet>107</a><span class="kw">pub fn </span>Context(p1: u8, p2: u8, mode: ContextType) -&gt; u8 {
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">match </span>mode {
<a href=#109 id=109 data-nosnippet>109</a> ContextType::CONTEXT_LSB6 =&gt; p1 &amp; <span class="number">0x3f</span>,
<a href=#110 id=110 data-nosnippet>110</a> ContextType::CONTEXT_MSB6 =&gt; (p1 <span class="kw">as </span>i32 &gt;&gt; <span class="number">2</span>) <span class="kw">as </span>u8,
<a href=#111 id=111 data-nosnippet>111</a> ContextType::CONTEXT_UTF8 =&gt; {
<a href=#112 id=112 data-nosnippet>112</a> (kUTF8ContextLookup[p1 <span class="kw">as </span>usize] <span class="kw">as </span>i32
<a href=#113 id=113 data-nosnippet>113</a> | kUTF8ContextLookup[(p2 <span class="kw">as </span>i32 + <span class="number">256i32</span>) <span class="kw">as </span>usize] <span class="kw">as </span>i32) <span class="kw">as </span>u8
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a> ContextType::CONTEXT_SIGNED =&gt; {
<a href=#116 id=116 data-nosnippet>116</a> (((kSigned3BitContextLookup[p1 <span class="kw">as </span>usize] <span class="kw">as </span>i32) &lt;&lt; <span class="number">3</span>)
<a href=#117 id=117 data-nosnippet>117</a> + kSigned3BitContextLookup[p2 <span class="kw">as </span>usize] <span class="kw">as </span>i32) <span class="kw">as </span>u8
<a href=#118 id=118 data-nosnippet>118</a> }
<a href=#119 id=119 data-nosnippet>119</a> }
<a href=#120 id=120 data-nosnippet>120</a> <span class="comment">// 0u8
<a href=#121 id=121 data-nosnippet>121</a></span>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,240 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/literal_cost.rs`."><title>literal_cost.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>literal_cost.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core::cmp::min;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">super</span>::util::{floatX, FastLog2f64};
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">crate</span>::enc::utf8_util::is_mostly_utf8;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">static </span>kMinUTF8Ratio: floatX = <span class="number">0.75</span>;
<a href=#7 id=7 data-nosnippet>7</a>
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">fn </span>UTF8Position(last: usize, c: usize, clamp: usize) -&gt; usize {
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">if </span>c &lt; <span class="number">128usize </span>{
<a href=#10 id=10 data-nosnippet>10</a> <span class="number">0usize
<a href=#11 id=11 data-nosnippet>11</a> </span>} <span class="kw">else if </span>c &gt;= <span class="number">192usize </span>{
<a href=#12 id=12 data-nosnippet>12</a> min(<span class="number">1usize</span>, clamp)
<a href=#13 id=13 data-nosnippet>13</a> } <span class="kw">else if </span>last &lt; <span class="number">0xe0usize </span>{
<a href=#14 id=14 data-nosnippet>14</a> <span class="number">0usize
<a href=#15 id=15 data-nosnippet>15</a> </span>} <span class="kw">else </span>{
<a href=#16 id=16 data-nosnippet>16</a> min(<span class="number">2usize</span>, clamp)
<a href=#17 id=17 data-nosnippet>17</a> }
<a href=#18 id=18 data-nosnippet>18</a>}
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">fn </span>DecideMultiByteStatsLevel(pos: usize, len: usize, mask: usize, data: <span class="kw-2">&amp;</span>[u8]) -&gt; usize {
<a href=#21 id=21 data-nosnippet>21</a> <span class="kw">let </span><span class="kw-2">mut </span>counts = [<span class="number">0usize</span>; <span class="number">3</span>];
<a href=#22 id=22 data-nosnippet>22</a> <span class="kw">let </span><span class="kw-2">mut </span>max_utf8: usize = <span class="number">1</span>;
<a href=#23 id=23 data-nosnippet>23</a> <span class="kw">let </span><span class="kw-2">mut </span>last_c: usize = <span class="number">0usize</span>;
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#25 id=25 data-nosnippet>25</a> i = <span class="number">0usize</span>;
<a href=#26 id=26 data-nosnippet>26</a> <span class="kw">while </span>i &lt; len {
<a href=#27 id=27 data-nosnippet>27</a> {
<a href=#28 id=28 data-nosnippet>28</a> <span class="kw">let </span>c: usize = data[(pos.wrapping_add(i) &amp; mask)] <span class="kw">as </span>usize;
<a href=#29 id=29 data-nosnippet>29</a> {
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>counts[UTF8Position(last_c, c, <span class="number">2usize</span>)];
<a href=#32 id=32 data-nosnippet>32</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#33 id=33 data-nosnippet>33</a> }
<a href=#34 id=34 data-nosnippet>34</a> last_c = c;
<a href=#35 id=35 data-nosnippet>35</a> }
<a href=#36 id=36 data-nosnippet>36</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#37 id=37 data-nosnippet>37</a> }
<a href=#38 id=38 data-nosnippet>38</a> <span class="kw">if </span>counts[<span class="number">2</span>] &lt; <span class="number">500usize </span>{
<a href=#39 id=39 data-nosnippet>39</a> max_utf8 = <span class="number">1</span>;
<a href=#40 id=40 data-nosnippet>40</a> }
<a href=#41 id=41 data-nosnippet>41</a> <span class="kw">if </span>counts[<span class="number">1</span>].wrapping_add(counts[<span class="number">2</span>]) &lt; <span class="number">25usize </span>{
<a href=#42 id=42 data-nosnippet>42</a> max_utf8 = <span class="number">0usize</span>;
<a href=#43 id=43 data-nosnippet>43</a> }
<a href=#44 id=44 data-nosnippet>44</a> max_utf8
<a href=#45 id=45 data-nosnippet>45</a>}
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a><span class="kw">fn </span>EstimateBitCostsForLiteralsUTF8(
<a href=#48 id=48 data-nosnippet>48</a> pos: usize,
<a href=#49 id=49 data-nosnippet>49</a> len: usize,
<a href=#50 id=50 data-nosnippet>50</a> mask: usize,
<a href=#51 id=51 data-nosnippet>51</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#52 id=52 data-nosnippet>52</a> cost: <span class="kw-2">&amp;mut </span>[floatX],
<a href=#53 id=53 data-nosnippet>53</a>) {
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">let </span>max_utf8: usize = DecideMultiByteStatsLevel(pos, len, mask, data);
<a href=#55 id=55 data-nosnippet>55</a> <span class="kw">let </span><span class="kw-2">mut </span>histogram = [[<span class="number">0usize</span>; <span class="number">256</span>]; <span class="number">3</span>];
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">let </span>window_half: usize = <span class="number">495usize</span>;
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw">let </span>in_window: usize = min(window_half, len);
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">let </span><span class="kw-2">mut </span>in_window_utf8 = [<span class="number">0usize</span>; <span class="number">3</span>];
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#60 id=60 data-nosnippet>60</a> {
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">let </span><span class="kw-2">mut </span>last_c: usize = <span class="number">0usize</span>;
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">let </span><span class="kw-2">mut </span>utf8_pos: usize = <span class="number">0usize</span>;
<a href=#63 id=63 data-nosnippet>63</a> i = <span class="number">0usize</span>;
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">while </span>i &lt; in_window {
<a href=#65 id=65 data-nosnippet>65</a> {
<a href=#66 id=66 data-nosnippet>66</a> <span class="kw">let </span>c: usize = data[(pos.wrapping_add(i) &amp; mask)] <span class="kw">as </span>usize;
<a href=#67 id=67 data-nosnippet>67</a> {
<a href=#68 id=68 data-nosnippet>68</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#69 id=69 data-nosnippet>69</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>histogram[utf8_pos][c];
<a href=#70 id=70 data-nosnippet>70</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#71 id=71 data-nosnippet>71</a> }
<a href=#72 id=72 data-nosnippet>72</a> {
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>in_window_utf8[utf8_pos];
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#76 id=76 data-nosnippet>76</a> }
<a href=#77 id=77 data-nosnippet>77</a> utf8_pos = UTF8Position(last_c, c, max_utf8);
<a href=#78 id=78 data-nosnippet>78</a> last_c = c;
<a href=#79 id=79 data-nosnippet>79</a> }
<a href=#80 id=80 data-nosnippet>80</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a> i = <span class="number">0usize</span>;
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">while </span>i &lt; len {
<a href=#85 id=85 data-nosnippet>85</a> {
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">if </span>i &gt;= window_half {
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">let </span>c: usize = (<span class="kw">if </span>i &lt; window_half.wrapping_add(<span class="number">1</span>) {
<a href=#88 id=88 data-nosnippet>88</a> <span class="number">0i32
<a href=#89 id=89 data-nosnippet>89</a> </span>} <span class="kw">else </span>{
<a href=#90 id=90 data-nosnippet>90</a> data[(pos
<a href=#91 id=91 data-nosnippet>91</a> .wrapping_add(i)
<a href=#92 id=92 data-nosnippet>92</a> .wrapping_sub(window_half)
<a href=#93 id=93 data-nosnippet>93</a> .wrapping_sub(<span class="number">1</span>)
<a href=#94 id=94 data-nosnippet>94</a> &amp; mask)] <span class="kw">as </span>i32
<a href=#95 id=95 data-nosnippet>95</a> }) <span class="kw">as </span>usize;
<a href=#96 id=96 data-nosnippet>96</a> <span class="kw">let </span>last_c: usize = (<span class="kw">if </span>i &lt; window_half.wrapping_add(<span class="number">2</span>) {
<a href=#97 id=97 data-nosnippet>97</a> <span class="number">0i32
<a href=#98 id=98 data-nosnippet>98</a> </span>} <span class="kw">else </span>{
<a href=#99 id=99 data-nosnippet>99</a> data[(pos
<a href=#100 id=100 data-nosnippet>100</a> .wrapping_add(i)
<a href=#101 id=101 data-nosnippet>101</a> .wrapping_sub(window_half)
<a href=#102 id=102 data-nosnippet>102</a> .wrapping_sub(<span class="number">2</span>)
<a href=#103 id=103 data-nosnippet>103</a> &amp; mask)] <span class="kw">as </span>i32
<a href=#104 id=104 data-nosnippet>104</a> }) <span class="kw">as </span>usize;
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">let </span>utf8_pos2: usize = UTF8Position(last_c, c, max_utf8);
<a href=#106 id=106 data-nosnippet>106</a> {
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>histogram[utf8_pos2]
<a href=#109 id=109 data-nosnippet>109</a> [data[(pos.wrapping_add(i).wrapping_sub(window_half) &amp; mask)] <span class="kw">as </span>usize];
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_sub(_rhs <span class="kw">as </span>usize);
<a href=#111 id=111 data-nosnippet>111</a> }
<a href=#112 id=112 data-nosnippet>112</a> {
<a href=#113 id=113 data-nosnippet>113</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>in_window_utf8[utf8_pos2];
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_sub(_rhs <span class="kw">as </span>usize);
<a href=#116 id=116 data-nosnippet>116</a> }
<a href=#117 id=117 data-nosnippet>117</a> }
<a href=#118 id=118 data-nosnippet>118</a> <span class="kw">if </span>i.wrapping_add(window_half) &lt; len {
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw">let </span>c: usize = data[(pos
<a href=#120 id=120 data-nosnippet>120</a> .wrapping_add(i)
<a href=#121 id=121 data-nosnippet>121</a> .wrapping_add(window_half)
<a href=#122 id=122 data-nosnippet>122</a> .wrapping_sub(<span class="number">1</span>)
<a href=#123 id=123 data-nosnippet>123</a> &amp; mask)] <span class="kw">as </span>usize;
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">let </span>last_c: usize = data[(pos
<a href=#125 id=125 data-nosnippet>125</a> .wrapping_add(i)
<a href=#126 id=126 data-nosnippet>126</a> .wrapping_add(window_half)
<a href=#127 id=127 data-nosnippet>127</a> .wrapping_sub(<span class="number">2</span>)
<a href=#128 id=128 data-nosnippet>128</a> &amp; mask)] <span class="kw">as </span>usize;
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw">let </span>utf8_pos2: usize = UTF8Position(last_c, c, max_utf8);
<a href=#130 id=130 data-nosnippet>130</a> {
<a href=#131 id=131 data-nosnippet>131</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>histogram[utf8_pos2]
<a href=#133 id=133 data-nosnippet>133</a> [data[(pos.wrapping_add(i).wrapping_add(window_half) &amp; mask)] <span class="kw">as </span>usize];
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a> {
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>in_window_utf8[utf8_pos2];
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#140 id=140 data-nosnippet>140</a> }
<a href=#141 id=141 data-nosnippet>141</a> }
<a href=#142 id=142 data-nosnippet>142</a> {
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">let </span>c: usize = (<span class="kw">if </span>i &lt; <span class="number">1 </span>{
<a href=#144 id=144 data-nosnippet>144</a> <span class="number">0i32
<a href=#145 id=145 data-nosnippet>145</a> </span>} <span class="kw">else </span>{
<a href=#146 id=146 data-nosnippet>146</a> data[(pos.wrapping_add(i).wrapping_sub(<span class="number">1</span>) &amp; mask)] <span class="kw">as </span>i32
<a href=#147 id=147 data-nosnippet>147</a> }) <span class="kw">as </span>usize;
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">let </span>last_c: usize = (<span class="kw">if </span>i &lt; <span class="number">2usize </span>{
<a href=#149 id=149 data-nosnippet>149</a> <span class="number">0i32
<a href=#150 id=150 data-nosnippet>150</a> </span>} <span class="kw">else </span>{
<a href=#151 id=151 data-nosnippet>151</a> data[(pos.wrapping_add(i).wrapping_sub(<span class="number">2</span>) &amp; mask)] <span class="kw">as </span>i32
<a href=#152 id=152 data-nosnippet>152</a> }) <span class="kw">as </span>usize;
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">let </span>utf8_pos: usize = UTF8Position(last_c, c, max_utf8);
<a href=#154 id=154 data-nosnippet>154</a> <span class="kw">let </span>masked_pos: usize = pos.wrapping_add(i) &amp; mask;
<a href=#155 id=155 data-nosnippet>155</a> <span class="kw">let </span><span class="kw-2">mut </span>histo: usize = histogram[utf8_pos][data[masked_pos] <span class="kw">as </span>usize];
<a href=#156 id=156 data-nosnippet>156</a> <span class="comment">//precision is vital here: lets keep double precision
<a href=#157 id=157 data-nosnippet>157</a> </span><span class="kw">let </span><span class="kw-2">mut </span>lit_cost: f64;
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">if </span>histo == <span class="number">0usize </span>{
<a href=#159 id=159 data-nosnippet>159</a> histo = <span class="number">1</span>;
<a href=#160 id=160 data-nosnippet>160</a> }
<a href=#161 id=161 data-nosnippet>161</a> lit_cost = FastLog2f64(in_window_utf8[utf8_pos] <span class="kw">as </span>u64) <span class="kw">as </span>f64
<a href=#162 id=162 data-nosnippet>162</a> - FastLog2f64(histo <span class="kw">as </span>u64) <span class="kw">as </span>f64;
<a href=#163 id=163 data-nosnippet>163</a> lit_cost += <span class="number">0.02905</span>;
<a href=#164 id=164 data-nosnippet>164</a> <span class="kw">if </span>lit_cost &lt; <span class="number">1.0 </span>{
<a href=#165 id=165 data-nosnippet>165</a> lit_cost <span class="kw-2">*</span>= <span class="number">0.5</span>;
<a href=#166 id=166 data-nosnippet>166</a> lit_cost += <span class="number">0.5</span>;
<a href=#167 id=167 data-nosnippet>167</a> }
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">if </span>i &lt; <span class="number">2000usize </span>{
<a href=#169 id=169 data-nosnippet>169</a> lit_cost += (<span class="number">0.7 </span>- (<span class="number">2000usize</span>).wrapping_sub(i) <span class="kw">as </span>(f64) / <span class="number">2000.0 </span>* <span class="number">0.35</span>);
<a href=#170 id=170 data-nosnippet>170</a> }
<a href=#171 id=171 data-nosnippet>171</a> cost[i] = lit_cost <span class="kw">as </span>floatX;
<a href=#172 id=172 data-nosnippet>172</a> }
<a href=#173 id=173 data-nosnippet>173</a> }
<a href=#174 id=174 data-nosnippet>174</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#175 id=175 data-nosnippet>175</a> }
<a href=#176 id=176 data-nosnippet>176</a>}
<a href=#177 id=177 data-nosnippet>177</a>
<a href=#178 id=178 data-nosnippet>178</a><span class="kw">pub fn </span>BrotliEstimateBitCostsForLiterals(
<a href=#179 id=179 data-nosnippet>179</a> pos: usize,
<a href=#180 id=180 data-nosnippet>180</a> len: usize,
<a href=#181 id=181 data-nosnippet>181</a> mask: usize,
<a href=#182 id=182 data-nosnippet>182</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#183 id=183 data-nosnippet>183</a> cost: <span class="kw-2">&amp;mut </span>[floatX],
<a href=#184 id=184 data-nosnippet>184</a>) {
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">if </span>is_mostly_utf8(data, pos, mask, len, kMinUTF8Ratio) {
<a href=#186 id=186 data-nosnippet>186</a> EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, cost);
<a href=#187 id=187 data-nosnippet>187</a> } <span class="kw">else </span>{
<a href=#188 id=188 data-nosnippet>188</a> <span class="kw">let </span><span class="kw-2">mut </span>histogram: [usize; <span class="number">256</span>] = [<span class="number">0</span>; <span class="number">256</span>];
<a href=#189 id=189 data-nosnippet>189</a>
<a href=#190 id=190 data-nosnippet>190</a> <span class="kw">let </span>window_half: usize = <span class="number">2000usize</span>;
<a href=#191 id=191 data-nosnippet>191</a> <span class="kw">let </span><span class="kw-2">mut </span>in_window: usize = min(window_half, len);
<a href=#192 id=192 data-nosnippet>192</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize;
<a href=#193 id=193 data-nosnippet>193</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0usize</span>..in_window {
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#195 id=195 data-nosnippet>195</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>histogram[data[(pos.wrapping_add(i) &amp; mask)] <span class="kw">as </span>usize];
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#197 id=197 data-nosnippet>197</a> }
<a href=#198 id=198 data-nosnippet>198</a> i = <span class="number">0usize</span>;
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">while </span>i &lt; len {
<a href=#200 id=200 data-nosnippet>200</a> {
<a href=#201 id=201 data-nosnippet>201</a> <span class="kw">let </span><span class="kw-2">mut </span>histo: usize;
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">if </span>i &gt;= window_half {
<a href=#203 id=203 data-nosnippet>203</a> {
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>histogram
<a href=#206 id=206 data-nosnippet>206</a> [data[(pos.wrapping_add(i).wrapping_sub(window_half) &amp; mask)] <span class="kw">as </span>usize];
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_sub(_rhs <span class="kw">as </span>usize);
<a href=#208 id=208 data-nosnippet>208</a> }
<a href=#209 id=209 data-nosnippet>209</a> in_window = in_window.wrapping_sub(<span class="number">1</span>);
<a href=#210 id=210 data-nosnippet>210</a> }
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">if </span>i.wrapping_add(window_half) &lt; len {
<a href=#212 id=212 data-nosnippet>212</a> {
<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">let </span>_rhs = <span class="number">1</span>;
<a href=#214 id=214 data-nosnippet>214</a> <span class="kw">let </span>_lhs = <span class="kw-2">&amp;mut </span>histogram
<a href=#215 id=215 data-nosnippet>215</a> [data[(pos.wrapping_add(i).wrapping_add(window_half) &amp; mask)] <span class="kw">as </span>usize];
<a href=#216 id=216 data-nosnippet>216</a> <span class="kw-2">*</span>_lhs = (<span class="kw-2">*</span>_lhs).wrapping_add(_rhs <span class="kw">as </span>usize);
<a href=#217 id=217 data-nosnippet>217</a> }
<a href=#218 id=218 data-nosnippet>218</a> in_window = in_window.wrapping_add(<span class="number">1</span>);
<a href=#219 id=219 data-nosnippet>219</a> }
<a href=#220 id=220 data-nosnippet>220</a> histo = histogram[data[(pos.wrapping_add(i) &amp; mask)] <span class="kw">as </span>usize];
<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">if </span>histo == <span class="number">0usize </span>{
<a href=#222 id=222 data-nosnippet>222</a> histo = <span class="number">1</span>;
<a href=#223 id=223 data-nosnippet>223</a> }
<a href=#224 id=224 data-nosnippet>224</a> {
<a href=#225 id=225 data-nosnippet>225</a> <span class="comment">//precision is vital here: lets keep double precision
<a href=#226 id=226 data-nosnippet>226</a> </span><span class="kw">let </span><span class="kw-2">mut </span>lit_cost: f64 =
<a href=#227 id=227 data-nosnippet>227</a> FastLog2f64(in_window <span class="kw">as </span>u64) <span class="kw">as </span>f64 - FastLog2f64(histo <span class="kw">as </span>u64) <span class="kw">as </span>f64;
<a href=#228 id=228 data-nosnippet>228</a> lit_cost += <span class="number">0.029</span>;
<a href=#229 id=229 data-nosnippet>229</a> <span class="kw">if </span>lit_cost &lt; <span class="number">1.0 </span>{
<a href=#230 id=230 data-nosnippet>230</a> lit_cost <span class="kw-2">*</span>= <span class="number">0.5</span>;
<a href=#231 id=231 data-nosnippet>231</a> lit_cost += <span class="number">0.5</span>;
<a href=#232 id=232 data-nosnippet>232</a> }
<a href=#233 id=233 data-nosnippet>233</a> cost[i] = lit_cost <span class="kw">as </span>floatX;
<a href=#234 id=234 data-nosnippet>234</a> }
<a href=#235 id=235 data-nosnippet>235</a> }
<a href=#236 id=236 data-nosnippet>236</a> i = i.wrapping_add(<span class="number">1</span>);
<a href=#237 id=237 data-nosnippet>237</a> }
<a href=#238 id=238 data-nosnippet>238</a> }
<a href=#239 id=239 data-nosnippet>239</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,262 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/log_table_8.rs`."><title>log_table_8.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>log_table_8.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">crate</span>::enc::floatX;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[allow(clippy::excessive_precision)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">pub static </span>logs_8: [floatX; <span class="number">256</span>] = [
<a href=#5 id=5 data-nosnippet>5</a> <span class="number">0.0000000000000000</span>,
<a href=#6 id=6 data-nosnippet>6</a> <span class="number">0.0000000000000000</span>,
<a href=#7 id=7 data-nosnippet>7</a> <span class="number">1.0000000000000000</span>,
<a href=#8 id=8 data-nosnippet>8</a> <span class="number">1.5849625007211563</span>,
<a href=#9 id=9 data-nosnippet>9</a> <span class="number">2.0000000000000000</span>,
<a href=#10 id=10 data-nosnippet>10</a> <span class="number">2.3219280948873622</span>,
<a href=#11 id=11 data-nosnippet>11</a> <span class="number">2.5849625007211561</span>,
<a href=#12 id=12 data-nosnippet>12</a> <span class="number">2.8073549220576042</span>,
<a href=#13 id=13 data-nosnippet>13</a> <span class="number">3.0000000000000000</span>,
<a href=#14 id=14 data-nosnippet>14</a> <span class="number">3.1699250014423126</span>,
<a href=#15 id=15 data-nosnippet>15</a> <span class="number">3.3219280948873626</span>,
<a href=#16 id=16 data-nosnippet>16</a> <span class="number">3.4594316186372978</span>,
<a href=#17 id=17 data-nosnippet>17</a> <span class="number">3.5849625007211565</span>,
<a href=#18 id=18 data-nosnippet>18</a> <span class="number">3.7004397181410922</span>,
<a href=#19 id=19 data-nosnippet>19</a> <span class="number">3.8073549220576037</span>,
<a href=#20 id=20 data-nosnippet>20</a> <span class="number">3.9068905956085187</span>,
<a href=#21 id=21 data-nosnippet>21</a> <span class="number">4.0000000000000000</span>,
<a href=#22 id=22 data-nosnippet>22</a> <span class="number">4.0874628412503400</span>,
<a href=#23 id=23 data-nosnippet>23</a> <span class="number">4.1699250014423122</span>,
<a href=#24 id=24 data-nosnippet>24</a> <span class="number">4.2479275134435852</span>,
<a href=#25 id=25 data-nosnippet>25</a> <span class="number">4.3219280948873626</span>,
<a href=#26 id=26 data-nosnippet>26</a> <span class="number">4.3923174227787607</span>,
<a href=#27 id=27 data-nosnippet>27</a> <span class="number">4.4594316186372973</span>,
<a href=#28 id=28 data-nosnippet>28</a> <span class="number">4.5235619560570131</span>,
<a href=#29 id=29 data-nosnippet>29</a> <span class="number">4.5849625007211570</span>,
<a href=#30 id=30 data-nosnippet>30</a> <span class="number">4.6438561897747244</span>,
<a href=#31 id=31 data-nosnippet>31</a> <span class="number">4.7004397181410926</span>,
<a href=#32 id=32 data-nosnippet>32</a> <span class="number">4.7548875021634691</span>,
<a href=#33 id=33 data-nosnippet>33</a> <span class="number">4.8073549220576037</span>,
<a href=#34 id=34 data-nosnippet>34</a> <span class="number">4.8579809951275728</span>,
<a href=#35 id=35 data-nosnippet>35</a> <span class="number">4.9068905956085187</span>,
<a href=#36 id=36 data-nosnippet>36</a> <span class="number">4.9541963103868758</span>,
<a href=#37 id=37 data-nosnippet>37</a> <span class="number">5.0000000000000000</span>,
<a href=#38 id=38 data-nosnippet>38</a> <span class="number">5.0443941193584534</span>,
<a href=#39 id=39 data-nosnippet>39</a> <span class="number">5.0874628412503400</span>,
<a href=#40 id=40 data-nosnippet>40</a> <span class="number">5.1292830169449664</span>,
<a href=#41 id=41 data-nosnippet>41</a> <span class="number">5.1699250014423122</span>,
<a href=#42 id=42 data-nosnippet>42</a> <span class="number">5.2094533656289501</span>,
<a href=#43 id=43 data-nosnippet>43</a> <span class="number">5.2479275134435852</span>,
<a href=#44 id=44 data-nosnippet>44</a> <span class="number">5.2854022188622487</span>,
<a href=#45 id=45 data-nosnippet>45</a> <span class="number">5.3219280948873626</span>,
<a href=#46 id=46 data-nosnippet>46</a> <span class="number">5.3575520046180838</span>,
<a href=#47 id=47 data-nosnippet>47</a> <span class="number">5.3923174227787607</span>,
<a href=#48 id=48 data-nosnippet>48</a> <span class="number">5.4262647547020979</span>,
<a href=#49 id=49 data-nosnippet>49</a> <span class="number">5.4594316186372973</span>,
<a href=#50 id=50 data-nosnippet>50</a> <span class="number">5.4918530963296748</span>,
<a href=#51 id=51 data-nosnippet>51</a> <span class="number">5.5235619560570131</span>,
<a href=#52 id=52 data-nosnippet>52</a> <span class="number">5.5545888516776376</span>,
<a href=#53 id=53 data-nosnippet>53</a> <span class="number">5.5849625007211570</span>,
<a href=#54 id=54 data-nosnippet>54</a> <span class="number">5.6147098441152083</span>,
<a href=#55 id=55 data-nosnippet>55</a> <span class="number">5.6438561897747244</span>,
<a href=#56 id=56 data-nosnippet>56</a> <span class="number">5.6724253419714961</span>,
<a href=#57 id=57 data-nosnippet>57</a> <span class="number">5.7004397181410926</span>,
<a href=#58 id=58 data-nosnippet>58</a> <span class="number">5.7279204545631996</span>,
<a href=#59 id=59 data-nosnippet>59</a> <span class="number">5.7548875021634691</span>,
<a href=#60 id=60 data-nosnippet>60</a> <span class="number">5.7813597135246599</span>,
<a href=#61 id=61 data-nosnippet>61</a> <span class="number">5.8073549220576046</span>,
<a href=#62 id=62 data-nosnippet>62</a> <span class="number">5.8328900141647422</span>,
<a href=#63 id=63 data-nosnippet>63</a> <span class="number">5.8579809951275719</span>,
<a href=#64 id=64 data-nosnippet>64</a> <span class="number">5.8826430493618416</span>,
<a href=#65 id=65 data-nosnippet>65</a> <span class="number">5.9068905956085187</span>,
<a href=#66 id=66 data-nosnippet>66</a> <span class="number">5.9307373375628867</span>,
<a href=#67 id=67 data-nosnippet>67</a> <span class="number">5.9541963103868758</span>,
<a href=#68 id=68 data-nosnippet>68</a> <span class="number">5.9772799234999168</span>,
<a href=#69 id=69 data-nosnippet>69</a> <span class="number">6.0000000000000000</span>,
<a href=#70 id=70 data-nosnippet>70</a> <span class="number">6.0223678130284544</span>,
<a href=#71 id=71 data-nosnippet>71</a> <span class="number">6.0443941193584534</span>,
<a href=#72 id=72 data-nosnippet>72</a> <span class="number">6.0660891904577721</span>,
<a href=#73 id=73 data-nosnippet>73</a> <span class="number">6.0874628412503400</span>,
<a href=#74 id=74 data-nosnippet>74</a> <span class="number">6.1085244567781700</span>,
<a href=#75 id=75 data-nosnippet>75</a> <span class="number">6.1292830169449672</span>,
<a href=#76 id=76 data-nosnippet>76</a> <span class="number">6.1497471195046822</span>,
<a href=#77 id=77 data-nosnippet>77</a> <span class="number">6.1699250014423122</span>,
<a href=#78 id=78 data-nosnippet>78</a> <span class="number">6.1898245588800176</span>,
<a href=#79 id=79 data-nosnippet>79</a> <span class="number">6.2094533656289510</span>,
<a href=#80 id=80 data-nosnippet>80</a> <span class="number">6.2288186904958804</span>,
<a href=#81 id=81 data-nosnippet>81</a> <span class="number">6.2479275134435861</span>,
<a href=#82 id=82 data-nosnippet>82</a> <span class="number">6.2667865406949019</span>,
<a href=#83 id=83 data-nosnippet>83</a> <span class="number">6.2854022188622487</span>,
<a href=#84 id=84 data-nosnippet>84</a> <span class="number">6.3037807481771031</span>,
<a href=#85 id=85 data-nosnippet>85</a> <span class="number">6.3219280948873617</span>,
<a href=#86 id=86 data-nosnippet>86</a> <span class="number">6.3398500028846252</span>,
<a href=#87 id=87 data-nosnippet>87</a> <span class="number">6.3575520046180847</span>,
<a href=#88 id=88 data-nosnippet>88</a> <span class="number">6.3750394313469254</span>,
<a href=#89 id=89 data-nosnippet>89</a> <span class="number">6.3923174227787598</span>,
<a href=#90 id=90 data-nosnippet>90</a> <span class="number">6.4093909361377026</span>,
<a href=#91 id=91 data-nosnippet>91</a> <span class="number">6.4262647547020979</span>,
<a href=#92 id=92 data-nosnippet>92</a> <span class="number">6.4429434958487288</span>,
<a href=#93 id=93 data-nosnippet>93</a> <span class="number">6.4594316186372982</span>,
<a href=#94 id=94 data-nosnippet>94</a> <span class="number">6.4757334309663976</span>,
<a href=#95 id=95 data-nosnippet>95</a> <span class="number">6.4918530963296748</span>,
<a href=#96 id=96 data-nosnippet>96</a> <span class="number">6.5077946401986964</span>,
<a href=#97 id=97 data-nosnippet>97</a> <span class="number">6.5235619560570131</span>,
<a href=#98 id=98 data-nosnippet>98</a> <span class="number">6.5391588111080319</span>,
<a href=#99 id=99 data-nosnippet>99</a> <span class="number">6.5545888516776376</span>,
<a href=#100 id=100 data-nosnippet>100</a> <span class="number">6.5698556083309478</span>,
<a href=#101 id=101 data-nosnippet>101</a> <span class="number">6.5849625007211561</span>,
<a href=#102 id=102 data-nosnippet>102</a> <span class="number">6.5999128421871278</span>,
<a href=#103 id=103 data-nosnippet>103</a> <span class="number">6.6147098441152092</span>,
<a href=#104 id=104 data-nosnippet>104</a> <span class="number">6.6293566200796095</span>,
<a href=#105 id=105 data-nosnippet>105</a> <span class="number">6.6438561897747253</span>,
<a href=#106 id=106 data-nosnippet>106</a> <span class="number">6.6582114827517955</span>,
<a href=#107 id=107 data-nosnippet>107</a> <span class="number">6.6724253419714952</span>,
<a href=#108 id=108 data-nosnippet>108</a> <span class="number">6.6865005271832185</span>,
<a href=#109 id=109 data-nosnippet>109</a> <span class="number">6.7004397181410917</span>,
<a href=#110 id=110 data-nosnippet>110</a> <span class="number">6.7142455176661224</span>,
<a href=#111 id=111 data-nosnippet>111</a> <span class="number">6.7279204545631988</span>,
<a href=#112 id=112 data-nosnippet>112</a> <span class="number">6.7414669864011465</span>,
<a href=#113 id=113 data-nosnippet>113</a> <span class="number">6.7548875021634691</span>,
<a href=#114 id=114 data-nosnippet>114</a> <span class="number">6.7681843247769260</span>,
<a href=#115 id=115 data-nosnippet>115</a> <span class="number">6.7813597135246599</span>,
<a href=#116 id=116 data-nosnippet>116</a> <span class="number">6.7944158663501062</span>,
<a href=#117 id=117 data-nosnippet>117</a> <span class="number">6.8073549220576037</span>,
<a href=#118 id=118 data-nosnippet>118</a> <span class="number">6.8201789624151887</span>,
<a href=#119 id=119 data-nosnippet>119</a> <span class="number">6.8328900141647422</span>,
<a href=#120 id=120 data-nosnippet>120</a> <span class="number">6.8454900509443757</span>,
<a href=#121 id=121 data-nosnippet>121</a> <span class="number">6.8579809951275719</span>,
<a href=#122 id=122 data-nosnippet>122</a> <span class="number">6.8703647195834048</span>,
<a href=#123 id=123 data-nosnippet>123</a> <span class="number">6.8826430493618416</span>,
<a href=#124 id=124 data-nosnippet>124</a> <span class="number">6.8948177633079437</span>,
<a href=#125 id=125 data-nosnippet>125</a> <span class="number">6.9068905956085187</span>,
<a href=#126 id=126 data-nosnippet>126</a> <span class="number">6.9188632372745955</span>,
<a href=#127 id=127 data-nosnippet>127</a> <span class="number">6.9307373375628867</span>,
<a href=#128 id=128 data-nosnippet>128</a> <span class="number">6.9425145053392399</span>,
<a href=#129 id=129 data-nosnippet>129</a> <span class="number">6.9541963103868758</span>,
<a href=#130 id=130 data-nosnippet>130</a> <span class="number">6.9657842846620879</span>,
<a href=#131 id=131 data-nosnippet>131</a> <span class="number">6.9772799234999168</span>,
<a href=#132 id=132 data-nosnippet>132</a> <span class="number">6.9886846867721664</span>,
<a href=#133 id=133 data-nosnippet>133</a> <span class="number">7.0000000000000000</span>,
<a href=#134 id=134 data-nosnippet>134</a> <span class="number">7.0112272554232540</span>,
<a href=#135 id=135 data-nosnippet>135</a> <span class="number">7.0223678130284544</span>,
<a href=#136 id=136 data-nosnippet>136</a> <span class="number">7.0334230015374501</span>,
<a href=#137 id=137 data-nosnippet>137</a> <span class="number">7.0443941193584534</span>,
<a href=#138 id=138 data-nosnippet>138</a> <span class="number">7.0552824355011898</span>,
<a href=#139 id=139 data-nosnippet>139</a> <span class="number">7.0660891904577721</span>,
<a href=#140 id=140 data-nosnippet>140</a> <span class="number">7.0768155970508317</span>,
<a href=#141 id=141 data-nosnippet>141</a> <span class="number">7.0874628412503400</span>,
<a href=#142 id=142 data-nosnippet>142</a> <span class="number">7.0980320829605272</span>,
<a href=#143 id=143 data-nosnippet>143</a> <span class="number">7.1085244567781700</span>,
<a href=#144 id=144 data-nosnippet>144</a> <span class="number">7.1189410727235076</span>,
<a href=#145 id=145 data-nosnippet>145</a> <span class="number">7.1292830169449664</span>,
<a href=#146 id=146 data-nosnippet>146</a> <span class="number">7.1395513523987937</span>,
<a href=#147 id=147 data-nosnippet>147</a> <span class="number">7.1497471195046822</span>,
<a href=#148 id=148 data-nosnippet>148</a> <span class="number">7.1598713367783891</span>,
<a href=#149 id=149 data-nosnippet>149</a> <span class="number">7.1699250014423130</span>,
<a href=#150 id=150 data-nosnippet>150</a> <span class="number">7.1799090900149345</span>,
<a href=#151 id=151 data-nosnippet>151</a> <span class="number">7.1898245588800176</span>,
<a href=#152 id=152 data-nosnippet>152</a> <span class="number">7.1996723448363644</span>,
<a href=#153 id=153 data-nosnippet>153</a> <span class="number">7.2094533656289492</span>,
<a href=#154 id=154 data-nosnippet>154</a> <span class="number">7.2191685204621621</span>,
<a href=#155 id=155 data-nosnippet>155</a> <span class="number">7.2288186904958804</span>,
<a href=#156 id=156 data-nosnippet>156</a> <span class="number">7.2384047393250794</span>,
<a href=#157 id=157 data-nosnippet>157</a> <span class="number">7.2479275134435861</span>,
<a href=#158 id=158 data-nosnippet>158</a> <span class="number">7.2573878426926521</span>,
<a href=#159 id=159 data-nosnippet>159</a> <span class="number">7.2667865406949019</span>,
<a href=#160 id=160 data-nosnippet>160</a> <span class="number">7.2761244052742384</span>,
<a href=#161 id=161 data-nosnippet>161</a> <span class="number">7.2854022188622487</span>,
<a href=#162 id=162 data-nosnippet>162</a> <span class="number">7.2946207488916270</span>,
<a href=#163 id=163 data-nosnippet>163</a> <span class="number">7.3037807481771031</span>,
<a href=#164 id=164 data-nosnippet>164</a> <span class="number">7.3128829552843557</span>,
<a href=#165 id=165 data-nosnippet>165</a> <span class="number">7.3219280948873617</span>,
<a href=#166 id=166 data-nosnippet>166</a> <span class="number">7.3309168781146177</span>,
<a href=#167 id=167 data-nosnippet>167</a> <span class="number">7.3398500028846243</span>,
<a href=#168 id=168 data-nosnippet>168</a> <span class="number">7.3487281542310781</span>,
<a href=#169 id=169 data-nosnippet>169</a> <span class="number">7.3575520046180847</span>,
<a href=#170 id=170 data-nosnippet>170</a> <span class="number">7.3663222142458151</span>,
<a href=#171 id=171 data-nosnippet>171</a> <span class="number">7.3750394313469254</span>,
<a href=#172 id=172 data-nosnippet>172</a> <span class="number">7.3837042924740528</span>,
<a href=#173 id=173 data-nosnippet>173</a> <span class="number">7.3923174227787607</span>,
<a href=#174 id=174 data-nosnippet>174</a> <span class="number">7.4008794362821844</span>,
<a href=#175 id=175 data-nosnippet>175</a> <span class="number">7.4093909361377026</span>,
<a href=#176 id=176 data-nosnippet>176</a> <span class="number">7.4178525148858991</span>,
<a href=#177 id=177 data-nosnippet>177</a> <span class="number">7.4262647547020979</span>,
<a href=#178 id=178 data-nosnippet>178</a> <span class="number">7.4346282276367255</span>,
<a href=#179 id=179 data-nosnippet>179</a> <span class="number">7.4429434958487288</span>,
<a href=#180 id=180 data-nosnippet>180</a> <span class="number">7.4512111118323299</span>,
<a href=#181 id=181 data-nosnippet>181</a> <span class="number">7.4594316186372973</span>,
<a href=#182 id=182 data-nosnippet>182</a> <span class="number">7.4676055500829976</span>,
<a href=#183 id=183 data-nosnippet>183</a> <span class="number">7.4757334309663976</span>,
<a href=#184 id=184 data-nosnippet>184</a> <span class="number">7.4838157772642564</span>,
<a href=#185 id=185 data-nosnippet>185</a> <span class="number">7.4918530963296748</span>,
<a href=#186 id=186 data-nosnippet>186</a> <span class="number">7.4998458870832057</span>,
<a href=#187 id=187 data-nosnippet>187</a> <span class="number">7.5077946401986964</span>,
<a href=#188 id=188 data-nosnippet>188</a> <span class="number">7.5156998382840436</span>,
<a href=#189 id=189 data-nosnippet>189</a> <span class="number">7.5235619560570131</span>,
<a href=#190 id=190 data-nosnippet>190</a> <span class="number">7.5313814605163119</span>,
<a href=#191 id=191 data-nosnippet>191</a> <span class="number">7.5391588111080319</span>,
<a href=#192 id=192 data-nosnippet>192</a> <span class="number">7.5468944598876373</span>,
<a href=#193 id=193 data-nosnippet>193</a> <span class="number">7.5545888516776376</span>,
<a href=#194 id=194 data-nosnippet>194</a> <span class="number">7.5622424242210728</span>,
<a href=#195 id=195 data-nosnippet>195</a> <span class="number">7.5698556083309478</span>,
<a href=#196 id=196 data-nosnippet>196</a> <span class="number">7.5774288280357487</span>,
<a href=#197 id=197 data-nosnippet>197</a> <span class="number">7.5849625007211561</span>,
<a href=#198 id=198 data-nosnippet>198</a> <span class="number">7.5924570372680806</span>,
<a href=#199 id=199 data-nosnippet>199</a> <span class="number">7.5999128421871278</span>,
<a href=#200 id=200 data-nosnippet>200</a> <span class="number">7.6073303137496113</span>,
<a href=#201 id=201 data-nosnippet>201</a> <span class="number">7.6147098441152075</span>,
<a href=#202 id=202 data-nosnippet>202</a> <span class="number">7.6220518194563764</span>,
<a href=#203 id=203 data-nosnippet>203</a> <span class="number">7.6293566200796095</span>,
<a href=#204 id=204 data-nosnippet>204</a> <span class="number">7.6366246205436488</span>,
<a href=#205 id=205 data-nosnippet>205</a> <span class="number">7.6438561897747244</span>,
<a href=#206 id=206 data-nosnippet>206</a> <span class="number">7.6510516911789290</span>,
<a href=#207 id=207 data-nosnippet>207</a> <span class="number">7.6582114827517955</span>,
<a href=#208 id=208 data-nosnippet>208</a> <span class="number">7.6653359171851765</span>,
<a href=#209 id=209 data-nosnippet>209</a> <span class="number">7.6724253419714952</span>,
<a href=#210 id=210 data-nosnippet>210</a> <span class="number">7.6794800995054464</span>,
<a href=#211 id=211 data-nosnippet>211</a> <span class="number">7.6865005271832185</span>,
<a href=#212 id=212 data-nosnippet>212</a> <span class="number">7.6934869574993252</span>,
<a href=#213 id=213 data-nosnippet>213</a> <span class="number">7.7004397181410926</span>,
<a href=#214 id=214 data-nosnippet>214</a> <span class="number">7.7073591320808825</span>,
<a href=#215 id=215 data-nosnippet>215</a> <span class="number">7.7142455176661224</span>,
<a href=#216 id=216 data-nosnippet>216</a> <span class="number">7.7210991887071856</span>,
<a href=#217 id=217 data-nosnippet>217</a> <span class="number">7.7279204545631996</span>,
<a href=#218 id=218 data-nosnippet>218</a> <span class="number">7.7347096202258392</span>,
<a href=#219 id=219 data-nosnippet>219</a> <span class="number">7.7414669864011465</span>,
<a href=#220 id=220 data-nosnippet>220</a> <span class="number">7.7481928495894596</span>,
<a href=#221 id=221 data-nosnippet>221</a> <span class="number">7.7548875021634691</span>,
<a href=#222 id=222 data-nosnippet>222</a> <span class="number">7.7615512324444795</span>,
<a href=#223 id=223 data-nosnippet>223</a> <span class="number">7.7681843247769260</span>,
<a href=#224 id=224 data-nosnippet>224</a> <span class="number">7.7747870596011737</span>,
<a href=#225 id=225 data-nosnippet>225</a> <span class="number">7.7813597135246608</span>,
<a href=#226 id=226 data-nosnippet>226</a> <span class="number">7.7879025593914317</span>,
<a href=#227 id=227 data-nosnippet>227</a> <span class="number">7.7944158663501062</span>,
<a href=#228 id=228 data-nosnippet>228</a> <span class="number">7.8008998999203047</span>,
<a href=#229 id=229 data-nosnippet>229</a> <span class="number">7.8073549220576037</span>,
<a href=#230 id=230 data-nosnippet>230</a> <span class="number">7.8137811912170374</span>,
<a href=#231 id=231 data-nosnippet>231</a> <span class="number">7.8201789624151887</span>,
<a href=#232 id=232 data-nosnippet>232</a> <span class="number">7.8265484872909159</span>,
<a href=#233 id=233 data-nosnippet>233</a> <span class="number">7.8328900141647422</span>,
<a href=#234 id=234 data-nosnippet>234</a> <span class="number">7.8392037880969445</span>,
<a href=#235 id=235 data-nosnippet>235</a> <span class="number">7.8454900509443757</span>,
<a href=#236 id=236 data-nosnippet>236</a> <span class="number">7.8517490414160571</span>,
<a href=#237 id=237 data-nosnippet>237</a> <span class="number">7.8579809951275719</span>,
<a href=#238 id=238 data-nosnippet>238</a> <span class="number">7.8641861446542798</span>,
<a href=#239 id=239 data-nosnippet>239</a> <span class="number">7.8703647195834048</span>,
<a href=#240 id=240 data-nosnippet>240</a> <span class="number">7.8765169465650002</span>,
<a href=#241 id=241 data-nosnippet>241</a> <span class="number">7.8826430493618425</span>,
<a href=#242 id=242 data-nosnippet>242</a> <span class="number">7.8887432488982601</span>,
<a href=#243 id=243 data-nosnippet>243</a> <span class="number">7.8948177633079446</span>,
<a href=#244 id=244 data-nosnippet>244</a> <span class="number">7.9008668079807496</span>,
<a href=#245 id=245 data-nosnippet>245</a> <span class="number">7.9068905956085187</span>,
<a href=#246 id=246 data-nosnippet>246</a> <span class="number">7.9128893362299619</span>,
<a href=#247 id=247 data-nosnippet>247</a> <span class="number">7.9188632372745955</span>,
<a href=#248 id=248 data-nosnippet>248</a> <span class="number">7.9248125036057813</span>,
<a href=#249 id=249 data-nosnippet>249</a> <span class="number">7.9307373375628867</span>,
<a href=#250 id=250 data-nosnippet>250</a> <span class="number">7.9366379390025719</span>,
<a href=#251 id=251 data-nosnippet>251</a> <span class="number">7.9425145053392399</span>,
<a href=#252 id=252 data-nosnippet>252</a> <span class="number">7.9483672315846778</span>,
<a href=#253 id=253 data-nosnippet>253</a> <span class="number">7.9541963103868758</span>,
<a href=#254 id=254 data-nosnippet>254</a> <span class="number">7.9600019320680806</span>,
<a href=#255 id=255 data-nosnippet>255</a> <span class="number">7.9657842846620870</span>,
<a href=#256 id=256 data-nosnippet>256</a> <span class="number">7.9715435539507720</span>,
<a href=#257 id=257 data-nosnippet>257</a> <span class="number">7.9772799234999168</span>,
<a href=#258 id=258 data-nosnippet>258</a> <span class="number">7.9829935746943104</span>,
<a href=#259 id=259 data-nosnippet>259</a> <span class="number">7.9886846867721664</span>,
<a href=#260 id=260 data-nosnippet>260</a> <span class="number">7.9943534368588578</span>,
<a href=#261 id=261 data-nosnippet>261</a>];
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,345 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/mod.rs`."><title>mod.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>mod.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#[macro_use]
<a href=#2 id=2 data-nosnippet>2</a></span><span class="kw">pub mod </span>vectorization;
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">pub mod </span>backward_references;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">pub mod </span>bit_cost;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">pub mod </span>block_split;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">pub mod </span>block_splitter;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">pub mod </span>brotli_bit_stream;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">pub mod </span>cluster;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">pub mod </span>combined_alloc;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">pub mod </span>command;
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">mod </span>compat;
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">pub mod </span>compress_fragment;
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">pub mod </span>compress_fragment_two_pass;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">pub mod </span>constants;
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">pub mod </span>context_map_entropy;
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">pub mod </span>dictionary_hash;
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">pub mod </span>encode;
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">pub mod </span>entropy_encode;
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">pub mod </span>find_stride;
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">pub mod </span>fixed_queue;
<a href=#21 id=21 data-nosnippet>21</a><span class="kw">pub mod </span>histogram;
<a href=#22 id=22 data-nosnippet>22</a><span class="kw">pub mod </span>input_pair;
<a href=#23 id=23 data-nosnippet>23</a><span class="kw">pub mod </span>interface;
<a href=#24 id=24 data-nosnippet>24</a><span class="kw">pub mod </span>ir_interpret;
<a href=#25 id=25 data-nosnippet>25</a><span class="kw">pub mod </span>literal_cost;
<a href=#26 id=26 data-nosnippet>26</a><span class="kw">mod </span>log_table_16;
<a href=#27 id=27 data-nosnippet>27</a><span class="kw">mod </span>log_table_8;
<a href=#28 id=28 data-nosnippet>28</a><span class="kw">pub mod </span>metablock;
<a href=#29 id=29 data-nosnippet>29</a><span class="kw">pub mod </span>multithreading;
<a href=#30 id=30 data-nosnippet>30</a><span class="kw">mod </span>parameters;
<a href=#31 id=31 data-nosnippet>31</a><span class="kw">pub mod </span>pdf;
<a href=#32 id=32 data-nosnippet>32</a><span class="kw">pub mod </span>prior_eval;
<a href=#33 id=33 data-nosnippet>33</a><span class="kw">pub mod </span>reader;
<a href=#34 id=34 data-nosnippet>34</a><span class="kw">pub mod </span>singlethreading;
<a href=#35 id=35 data-nosnippet>35</a><span class="kw">pub mod </span>static_dict;
<a href=#36 id=36 data-nosnippet>36</a><span class="kw">pub mod </span>static_dict_lut;
<a href=#37 id=37 data-nosnippet>37</a><span class="kw">pub mod </span>stride_eval;
<a href=#38 id=38 data-nosnippet>38</a><span class="kw">mod </span>test;
<a href=#39 id=39 data-nosnippet>39</a><span class="kw">pub mod </span>threading;
<a href=#40 id=40 data-nosnippet>40</a><span class="kw">pub mod </span>utf8_util;
<a href=#41 id=41 data-nosnippet>41</a><span class="kw">pub mod </span>util;
<a href=#42 id=42 data-nosnippet>42</a><span class="kw">mod </span>weights;
<a href=#43 id=43 data-nosnippet>43</a><span class="kw">pub mod </span>worker_pool;
<a href=#44 id=44 data-nosnippet>44</a><span class="kw">pub mod </span>writer;
<a href=#45 id=45 data-nosnippet>45</a>
<a href=#46 id=46 data-nosnippet>46</a><span class="kw">pub use </span>alloc::{AllocatedStackMemory, Allocator, SliceWrapper, SliceWrapperMut, StackAllocator};
<a href=#47 id=47 data-nosnippet>47</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#48 id=48 data-nosnippet>48</a></span><span class="kw">use </span>std::io;
<a href=#49 id=49 data-nosnippet>49</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#50 id=50 data-nosnippet>50</a></span><span class="kw">use </span>std::io::{Error, ErrorKind, Read, Write};
<a href=#51 id=51 data-nosnippet>51</a>
<a href=#52 id=52 data-nosnippet>52</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#53 id=53 data-nosnippet>53</a></span><span class="kw">pub use </span>alloc_stdlib::StandardAlloc;
<a href=#54 id=54 data-nosnippet>54</a><span class="kw">use </span>brotli_decompressor::{CustomRead, CustomWrite};
<a href=#55 id=55 data-nosnippet>55</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#56 id=56 data-nosnippet>56</a></span><span class="kw">pub use </span>brotli_decompressor::{IntoIoReader, IoReaderWrapper, IoWriterWrapper};
<a href=#57 id=57 data-nosnippet>57</a><span class="kw">pub use </span>interface::{InputPair, InputReference, InputReferenceMut};
<a href=#58 id=58 data-nosnippet>58</a>
<a href=#59 id=59 data-nosnippet>59</a><span class="kw">pub use </span><span class="self">self</span>::backward_references::{
<a href=#60 id=60 data-nosnippet>60</a> hash_to_binary_tree, hq <span class="kw">as </span>backward_references_hq, BrotliEncoderParams, UnionHasher,
<a href=#61 id=61 data-nosnippet>61</a>};
<a href=#62 id=62 data-nosnippet>62</a><span class="kw">pub use </span><span class="self">self</span>::combined_alloc::{BrotliAlloc, CombiningAllocator};
<a href=#63 id=63 data-nosnippet>63</a><span class="kw">use </span><span class="self">self</span>::encode::{BrotliEncoderDestroyInstance, BrotliEncoderOperation};
<a href=#64 id=64 data-nosnippet>64</a><span class="kw">pub use </span><span class="self">self</span>::encode::{
<a href=#65 id=65 data-nosnippet>65</a> BrotliEncoderInitParams, BrotliEncoderMaxCompressedSize, BrotliEncoderMaxCompressedSizeMulti,
<a href=#66 id=66 data-nosnippet>66</a>};
<a href=#67 id=67 data-nosnippet>67</a><span class="kw">pub use </span><span class="self">self</span>::hash_to_binary_tree::ZopfliNode;
<a href=#68 id=68 data-nosnippet>68</a><span class="kw">pub use </span><span class="self">self</span>::interface::StaticCommand;
<a href=#69 id=69 data-nosnippet>69</a><span class="kw">pub use </span><span class="self">self</span>::pdf::PDF;
<a href=#70 id=70 data-nosnippet>70</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#71 id=71 data-nosnippet>71</a></span><span class="kw">pub use </span><span class="self">self</span>::singlethreading::{compress_worker_pool, new_work_pool, WorkerPool};
<a href=#72 id=72 data-nosnippet>72</a><span class="kw">pub use </span><span class="self">self</span>::threading::{
<a href=#73 id=73 data-nosnippet>73</a> BatchSpawnableLite, BrotliEncoderThreadError, CompressionThreadResult, Owned, SendAlloc,
<a href=#74 id=74 data-nosnippet>74</a>};
<a href=#75 id=75 data-nosnippet>75</a><span class="kw">pub use </span><span class="self">self</span>::util::floatX;
<a href=#76 id=76 data-nosnippet>76</a><span class="kw">pub use </span><span class="self">self</span>::vectorization::{v256, v256i, Mem256f};
<a href=#77 id=77 data-nosnippet>77</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#78 id=78 data-nosnippet>78</a></span><span class="kw">pub use </span><span class="self">self</span>::worker_pool::{compress_worker_pool, new_work_pool, WorkerPool};
<a href=#79 id=79 data-nosnippet>79</a><span class="kw">use </span><span class="kw">crate</span>::enc::encode::BrotliEncoderStateStruct;
<a href=#80 id=80 data-nosnippet>80</a>
<a href=#81 id=81 data-nosnippet>81</a><span class="attr">#[cfg(feature = <span class="string">"simd"</span>)]
<a href=#82 id=82 data-nosnippet>82</a></span><span class="kw">pub type </span>s16 = core::simd::i16x16;
<a href=#83 id=83 data-nosnippet>83</a><span class="attr">#[cfg(feature = <span class="string">"simd"</span>)]
<a href=#84 id=84 data-nosnippet>84</a></span><span class="kw">pub type </span>v8 = core::simd::f32x8;
<a href=#85 id=85 data-nosnippet>85</a><span class="attr">#[cfg(feature = <span class="string">"simd"</span>)]
<a href=#86 id=86 data-nosnippet>86</a></span><span class="kw">pub type </span>s8 = core::simd::i32x8;
<a href=#87 id=87 data-nosnippet>87</a><span class="attr">#[cfg(not(feature = <span class="string">"simd"</span>))]
<a href=#88 id=88 data-nosnippet>88</a></span><span class="kw">pub type </span>s16 = compat::Compat16x16;
<a href=#89 id=89 data-nosnippet>89</a><span class="attr">#[cfg(not(feature = <span class="string">"simd"</span>))]
<a href=#90 id=90 data-nosnippet>90</a></span><span class="kw">pub type </span>v8 = compat::CompatF8;
<a href=#91 id=91 data-nosnippet>91</a><span class="attr">#[cfg(not(feature = <span class="string">"simd"</span>))]
<a href=#92 id=92 data-nosnippet>92</a></span><span class="kw">pub type </span>s8 = compat::Compat32x8;
<a href=#93 id=93 data-nosnippet>93</a>
<a href=#94 id=94 data-nosnippet>94</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#95 id=95 data-nosnippet>95</a></span><span class="kw">pub fn </span>compress_multi&lt;
<a href=#96 id=96 data-nosnippet>96</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#97 id=97 data-nosnippet>97</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#98 id=98 data-nosnippet>98</a>&gt;(
<a href=#99 id=99 data-nosnippet>99</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#100 id=100 data-nosnippet>100</a> owned_input: <span class="kw-2">&amp;mut </span>Owned&lt;SliceW&gt;,
<a href=#101 id=101 data-nosnippet>101</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#102 id=102 data-nosnippet>102</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#103 id=103 data-nosnippet>103</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#104 id=104 data-nosnippet>104</a> backward_references::UnionHasher&lt;Alloc&gt;,
<a href=#105 id=105 data-nosnippet>105</a> Alloc,
<a href=#106 id=106 data-nosnippet>106</a> &lt;WorkerPool&lt;
<a href=#107 id=107 data-nosnippet>107</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#108 id=108 data-nosnippet>108</a> backward_references::UnionHasher&lt;Alloc&gt;,
<a href=#109 id=109 data-nosnippet>109</a> Alloc,
<a href=#110 id=110 data-nosnippet>110</a> (SliceW, BrotliEncoderParams),
<a href=#111 id=111 data-nosnippet>111</a> &gt; <span class="kw">as </span>BatchSpawnableLite&lt;
<a href=#112 id=112 data-nosnippet>112</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#113 id=113 data-nosnippet>113</a> backward_references::UnionHasher&lt;Alloc&gt;,
<a href=#114 id=114 data-nosnippet>114</a> Alloc,
<a href=#115 id=115 data-nosnippet>115</a> (SliceW, BrotliEncoderParams),
<a href=#116 id=116 data-nosnippet>116</a> &gt;&gt;::JoinHandle,
<a href=#117 id=117 data-nosnippet>117</a> &gt;],
<a href=#118 id=118 data-nosnippet>118</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#119 id=119 data-nosnippet>119</a><span class="kw">where
<a href=#120 id=120 data-nosnippet>120</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#121 id=121 data-nosnippet>121</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#122 id=122 data-nosnippet>122</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#123 id=123 data-nosnippet>123</a>{
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">let </span><span class="kw-2">mut </span>work_pool = <span class="self">self</span>::worker_pool::new_work_pool(alloc_per_thread.len() - <span class="number">1</span>);
<a href=#125 id=125 data-nosnippet>125</a> compress_worker_pool(
<a href=#126 id=126 data-nosnippet>126</a> params,
<a href=#127 id=127 data-nosnippet>127</a> owned_input,
<a href=#128 id=128 data-nosnippet>128</a> output,
<a href=#129 id=129 data-nosnippet>129</a> alloc_per_thread,
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw-2">&amp;mut </span>work_pool,
<a href=#131 id=131 data-nosnippet>131</a> )
<a href=#132 id=132 data-nosnippet>132</a>}
<a href=#133 id=133 data-nosnippet>133</a>
<a href=#134 id=134 data-nosnippet>134</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#135 id=135 data-nosnippet>135</a></span><span class="kw">pub use </span><span class="self">self</span>::multithreading::compress_multi <span class="kw">as </span>compress_multi_no_threadpool;
<a href=#136 id=136 data-nosnippet>136</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#137 id=137 data-nosnippet>137</a></span><span class="kw">pub use </span><span class="self">self</span>::singlethreading::compress_multi;
<a href=#138 id=138 data-nosnippet>138</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#139 id=139 data-nosnippet>139</a></span><span class="kw">pub use </span><span class="self">self</span>::singlethreading::compress_multi <span class="kw">as </span>compress_multi_no_threadpool;
<a href=#140 id=140 data-nosnippet>140</a>
<a href=#141 id=141 data-nosnippet>141</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#142 id=142 data-nosnippet>142</a></span><span class="kw">pub fn </span>BrotliCompress&lt;InputType, OutputType&gt;(
<a href=#143 id=143 data-nosnippet>143</a> r: <span class="kw-2">&amp;mut </span>InputType,
<a href=#144 id=144 data-nosnippet>144</a> w: <span class="kw-2">&amp;mut </span>OutputType,
<a href=#145 id=145 data-nosnippet>145</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#146 id=146 data-nosnippet>146</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, io::Error&gt;
<a href=#147 id=147 data-nosnippet>147</a><span class="kw">where
<a href=#148 id=148 data-nosnippet>148</a> </span>InputType: Read,
<a href=#149 id=149 data-nosnippet>149</a> OutputType: Write,
<a href=#150 id=150 data-nosnippet>150</a>{
<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">let </span><span class="kw-2">mut </span>input_buffer: [u8; <span class="number">4096</span>] = [<span class="number">0</span>; <span class="number">4096</span>];
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">let </span><span class="kw-2">mut </span>output_buffer: [u8; <span class="number">4096</span>] = [<span class="number">0</span>; <span class="number">4096</span>];
<a href=#153 id=153 data-nosnippet>153</a> BrotliCompressCustomAlloc(
<a href=#154 id=154 data-nosnippet>154</a> r,
<a href=#155 id=155 data-nosnippet>155</a> w,
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw-2">&amp;mut </span>input_buffer[..],
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw-2">&amp;mut </span>output_buffer[..],
<a href=#158 id=158 data-nosnippet>158</a> params,
<a href=#159 id=159 data-nosnippet>159</a> StandardAlloc::default(),
<a href=#160 id=160 data-nosnippet>160</a> )
<a href=#161 id=161 data-nosnippet>161</a>}
<a href=#162 id=162 data-nosnippet>162</a>
<a href=#163 id=163 data-nosnippet>163</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#164 id=164 data-nosnippet>164</a></span><span class="kw">pub fn </span>BrotliCompressCustomAlloc&lt;InputType, OutputType, Alloc: BrotliAlloc&gt;(
<a href=#165 id=165 data-nosnippet>165</a> r: <span class="kw-2">&amp;mut </span>InputType,
<a href=#166 id=166 data-nosnippet>166</a> w: <span class="kw-2">&amp;mut </span>OutputType,
<a href=#167 id=167 data-nosnippet>167</a> input_buffer: <span class="kw-2">&amp;mut </span>[u8],
<a href=#168 id=168 data-nosnippet>168</a> output_buffer: <span class="kw-2">&amp;mut </span>[u8],
<a href=#169 id=169 data-nosnippet>169</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#170 id=170 data-nosnippet>170</a> alloc: Alloc,
<a href=#171 id=171 data-nosnippet>171</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, io::Error&gt;
<a href=#172 id=172 data-nosnippet>172</a><span class="kw">where
<a href=#173 id=173 data-nosnippet>173</a> </span>InputType: Read,
<a href=#174 id=174 data-nosnippet>174</a> OutputType: Write,
<a href=#175 id=175 data-nosnippet>175</a>{
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">let </span><span class="kw-2">mut </span>nop_callback = |_data: <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;InputReferenceMut&gt;,
<a href=#177 id=177 data-nosnippet>177</a> _cmds: <span class="kw-2">&amp;mut </span>[interface::StaticCommand],
<a href=#178 id=178 data-nosnippet>178</a> _mb: interface::InputPair,
<a href=#179 id=179 data-nosnippet>179</a> _m: <span class="kw-2">&amp;mut </span>Alloc| ();
<a href=#180 id=180 data-nosnippet>180</a> BrotliCompressCustomIo(
<a href=#181 id=181 data-nosnippet>181</a> <span class="kw-2">&amp;mut </span>IoReaderWrapper::&lt;InputType&gt;(r),
<a href=#182 id=182 data-nosnippet>182</a> <span class="kw-2">&amp;mut </span>IoWriterWrapper::&lt;OutputType&gt;(w),
<a href=#183 id=183 data-nosnippet>183</a> input_buffer,
<a href=#184 id=184 data-nosnippet>184</a> output_buffer,
<a href=#185 id=185 data-nosnippet>185</a> params,
<a href=#186 id=186 data-nosnippet>186</a> alloc,
<a href=#187 id=187 data-nosnippet>187</a> <span class="kw-2">&amp;mut </span>nop_callback,
<a href=#188 id=188 data-nosnippet>188</a> Error::new(ErrorKind::UnexpectedEof, <span class="string">"Unexpected EOF"</span>),
<a href=#189 id=189 data-nosnippet>189</a> )
<a href=#190 id=190 data-nosnippet>190</a>}
<a href=#191 id=191 data-nosnippet>191</a>
<a href=#192 id=192 data-nosnippet>192</a><span class="kw">pub fn </span>BrotliCompressCustomIo&lt;
<a href=#193 id=193 data-nosnippet>193</a> ErrType,
<a href=#194 id=194 data-nosnippet>194</a> InputType,
<a href=#195 id=195 data-nosnippet>195</a> OutputType,
<a href=#196 id=196 data-nosnippet>196</a> Alloc: BrotliAlloc,
<a href=#197 id=197 data-nosnippet>197</a> MetablockCallback: FnMut(
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;InputReferenceMut&gt;,
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw-2">&amp;mut </span>[interface::StaticCommand],
<a href=#200 id=200 data-nosnippet>200</a> interface::InputPair,
<a href=#201 id=201 data-nosnippet>201</a> <span class="kw-2">&amp;mut </span>Alloc,
<a href=#202 id=202 data-nosnippet>202</a> ),
<a href=#203 id=203 data-nosnippet>203</a>&gt;(
<a href=#204 id=204 data-nosnippet>204</a> r: <span class="kw-2">&amp;mut </span>InputType,
<a href=#205 id=205 data-nosnippet>205</a> w: <span class="kw-2">&amp;mut </span>OutputType,
<a href=#206 id=206 data-nosnippet>206</a> input_buffer: <span class="kw-2">&amp;mut </span>[u8],
<a href=#207 id=207 data-nosnippet>207</a> output_buffer: <span class="kw-2">&amp;mut </span>[u8],
<a href=#208 id=208 data-nosnippet>208</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#209 id=209 data-nosnippet>209</a> alloc: Alloc,
<a href=#210 id=210 data-nosnippet>210</a> metablock_callback: <span class="kw-2">&amp;mut </span>MetablockCallback,
<a href=#211 id=211 data-nosnippet>211</a> unexpected_eof_error_constant: ErrType,
<a href=#212 id=212 data-nosnippet>212</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, ErrType&gt;
<a href=#213 id=213 data-nosnippet>213</a><span class="kw">where
<a href=#214 id=214 data-nosnippet>214</a> </span>InputType: CustomRead&lt;ErrType&gt;,
<a href=#215 id=215 data-nosnippet>215</a> OutputType: CustomWrite&lt;ErrType&gt;,
<a href=#216 id=216 data-nosnippet>216</a>{
<a href=#217 id=217 data-nosnippet>217</a> BrotliCompressCustomIoCustomDict(
<a href=#218 id=218 data-nosnippet>218</a> r,
<a href=#219 id=219 data-nosnippet>219</a> w,
<a href=#220 id=220 data-nosnippet>220</a> input_buffer,
<a href=#221 id=221 data-nosnippet>221</a> output_buffer,
<a href=#222 id=222 data-nosnippet>222</a> params,
<a href=#223 id=223 data-nosnippet>223</a> alloc,
<a href=#224 id=224 data-nosnippet>224</a> metablock_callback,
<a href=#225 id=225 data-nosnippet>225</a> <span class="kw-2">&amp;</span>[],
<a href=#226 id=226 data-nosnippet>226</a> unexpected_eof_error_constant,
<a href=#227 id=227 data-nosnippet>227</a> )
<a href=#228 id=228 data-nosnippet>228</a>}
<a href=#229 id=229 data-nosnippet>229</a><span class="kw">pub fn </span>BrotliCompressCustomIoCustomDict&lt;
<a href=#230 id=230 data-nosnippet>230</a> ErrType,
<a href=#231 id=231 data-nosnippet>231</a> InputType,
<a href=#232 id=232 data-nosnippet>232</a> OutputType,
<a href=#233 id=233 data-nosnippet>233</a> Alloc: BrotliAlloc,
<a href=#234 id=234 data-nosnippet>234</a> MetablockCallback: FnMut(
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;InputReferenceMut&gt;,
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw-2">&amp;mut </span>[interface::StaticCommand],
<a href=#237 id=237 data-nosnippet>237</a> interface::InputPair,
<a href=#238 id=238 data-nosnippet>238</a> <span class="kw-2">&amp;mut </span>Alloc,
<a href=#239 id=239 data-nosnippet>239</a> ),
<a href=#240 id=240 data-nosnippet>240</a>&gt;(
<a href=#241 id=241 data-nosnippet>241</a> r: <span class="kw-2">&amp;mut </span>InputType,
<a href=#242 id=242 data-nosnippet>242</a> w: <span class="kw-2">&amp;mut </span>OutputType,
<a href=#243 id=243 data-nosnippet>243</a> input_buffer: <span class="kw-2">&amp;mut </span>[u8],
<a href=#244 id=244 data-nosnippet>244</a> output_buffer: <span class="kw-2">&amp;mut </span>[u8],
<a href=#245 id=245 data-nosnippet>245</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#246 id=246 data-nosnippet>246</a> alloc: Alloc,
<a href=#247 id=247 data-nosnippet>247</a> metablock_callback: <span class="kw-2">&amp;mut </span>MetablockCallback,
<a href=#248 id=248 data-nosnippet>248</a> dict: <span class="kw-2">&amp;</span>[u8],
<a href=#249 id=249 data-nosnippet>249</a> unexpected_eof_error_constant: ErrType,
<a href=#250 id=250 data-nosnippet>250</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, ErrType&gt;
<a href=#251 id=251 data-nosnippet>251</a><span class="kw">where
<a href=#252 id=252 data-nosnippet>252</a> </span>InputType: CustomRead&lt;ErrType&gt;,
<a href=#253 id=253 data-nosnippet>253</a> OutputType: CustomWrite&lt;ErrType&gt;,
<a href=#254 id=254 data-nosnippet>254</a>{
<a href=#255 id=255 data-nosnippet>255</a> <span class="macro">assert!</span>(!input_buffer.is_empty());
<a href=#256 id=256 data-nosnippet>256</a> <span class="macro">assert!</span>(!output_buffer.is_empty());
<a href=#257 id=257 data-nosnippet>257</a> <span class="kw">let </span><span class="kw-2">mut </span>s_orig = BrotliEncoderStateStruct::new(alloc);
<a href=#258 id=258 data-nosnippet>258</a> s_orig.params = params.clone();
<a href=#259 id=259 data-nosnippet>259</a> <span class="kw">if </span>!dict.is_empty() {
<a href=#260 id=260 data-nosnippet>260</a> s_orig.set_custom_dictionary(dict.len(), dict);
<a href=#261 id=261 data-nosnippet>261</a> }
<a href=#262 id=262 data-nosnippet>262</a> <span class="kw">let </span><span class="kw-2">mut </span>next_in_offset: usize = <span class="number">0</span>;
<a href=#263 id=263 data-nosnippet>263</a> <span class="kw">let </span><span class="kw-2">mut </span>next_out_offset: usize = <span class="number">0</span>;
<a href=#264 id=264 data-nosnippet>264</a> <span class="kw">let </span><span class="kw-2">mut </span>total_out = <span class="prelude-val">Some</span>(<span class="number">0</span>);
<a href=#265 id=265 data-nosnippet>265</a> <span class="kw">let </span><span class="kw-2">mut </span>read_err: <span class="prelude-ty">Result</span>&lt;(), ErrType&gt; = <span class="prelude-val">Ok</span>(());
<a href=#266 id=266 data-nosnippet>266</a> {
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">let </span>s = <span class="kw-2">&amp;mut </span>s_orig;
<a href=#268 id=268 data-nosnippet>268</a>
<a href=#269 id=269 data-nosnippet>269</a> <span class="comment">//BrotliEncoderSetParameter(s, BrotliEncoderParameter::BROTLI_PARAM_MODE, 0 as u32); // gen, text, font
<a href=#270 id=270 data-nosnippet>270</a> //BrotliEncoderSetParameter(s,
<a href=#271 id=271 data-nosnippet>271</a> // BrotliEncoderParameter::BROTLI_PARAM_SIZE_HINT,
<a href=#272 id=272 data-nosnippet>272</a> // input.len() as u32);
<a href=#273 id=273 data-nosnippet>273</a> </span><span class="kw">let </span><span class="kw-2">mut </span>available_in: usize = <span class="number">0</span>;
<a href=#274 id=274 data-nosnippet>274</a> <span class="kw">let </span><span class="kw-2">mut </span>available_out: usize = output_buffer.len();
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">let </span><span class="kw-2">mut </span>eof = <span class="bool-val">false</span>;
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">loop </span>{
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw">if </span>available_in == <span class="number">0 </span>&amp;&amp; !eof {
<a href=#278 id=278 data-nosnippet>278</a> next_in_offset = <span class="number">0</span>;
<a href=#279 id=279 data-nosnippet>279</a> <span class="kw">match </span>r.read(input_buffer) {
<a href=#280 id=280 data-nosnippet>280</a> <span class="prelude-val">Err</span>(e) =&gt; {
<a href=#281 id=281 data-nosnippet>281</a> read_err = <span class="prelude-val">Err</span>(e);
<a href=#282 id=282 data-nosnippet>282</a> available_in = <span class="number">0</span>;
<a href=#283 id=283 data-nosnippet>283</a> eof = <span class="bool-val">true</span>;
<a href=#284 id=284 data-nosnippet>284</a> }
<a href=#285 id=285 data-nosnippet>285</a> <span class="prelude-val">Ok</span>(size) =&gt; {
<a href=#286 id=286 data-nosnippet>286</a> <span class="kw">if </span>size == <span class="number">0 </span>{
<a href=#287 id=287 data-nosnippet>287</a> eof = <span class="bool-val">true</span>;
<a href=#288 id=288 data-nosnippet>288</a> }
<a href=#289 id=289 data-nosnippet>289</a> available_in = size;
<a href=#290 id=290 data-nosnippet>290</a> }
<a href=#291 id=291 data-nosnippet>291</a> }
<a href=#292 id=292 data-nosnippet>292</a> }
<a href=#293 id=293 data-nosnippet>293</a> <span class="kw">let </span>op: BrotliEncoderOperation;
<a href=#294 id=294 data-nosnippet>294</a> <span class="kw">if </span>available_in == <span class="number">0 </span>{
<a href=#295 id=295 data-nosnippet>295</a> op = BrotliEncoderOperation::BROTLI_OPERATION_FINISH;
<a href=#296 id=296 data-nosnippet>296</a> } <span class="kw">else </span>{
<a href=#297 id=297 data-nosnippet>297</a> op = BrotliEncoderOperation::BROTLI_OPERATION_PROCESS;
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a> <span class="kw">let </span>result = s.compress_stream(
<a href=#300 id=300 data-nosnippet>300</a> op,
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw-2">&amp;mut </span>available_in,
<a href=#302 id=302 data-nosnippet>302</a> input_buffer,
<a href=#303 id=303 data-nosnippet>303</a> <span class="kw-2">&amp;mut </span>next_in_offset,
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw-2">&amp;mut </span>available_out,
<a href=#305 id=305 data-nosnippet>305</a> output_buffer,
<a href=#306 id=306 data-nosnippet>306</a> <span class="kw-2">&amp;mut </span>next_out_offset,
<a href=#307 id=307 data-nosnippet>307</a> <span class="kw-2">&amp;mut </span>total_out,
<a href=#308 id=308 data-nosnippet>308</a> metablock_callback,
<a href=#309 id=309 data-nosnippet>309</a> );
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">let </span>fin = s.is_finished();
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">if </span>available_out == <span class="number">0 </span>|| fin {
<a href=#312 id=312 data-nosnippet>312</a> <span class="kw">let </span>lim = output_buffer.len() - available_out;
<a href=#313 id=313 data-nosnippet>313</a> <span class="macro">assert_eq!</span>(next_out_offset, lim);
<a href=#314 id=314 data-nosnippet>314</a> next_out_offset = <span class="number">0</span>;
<a href=#315 id=315 data-nosnippet>315</a> <span class="kw">while </span>next_out_offset &lt; lim {
<a href=#316 id=316 data-nosnippet>316</a> <span class="kw">match </span>w.write(<span class="kw-2">&amp;mut </span>output_buffer[next_out_offset..lim]) {
<a href=#317 id=317 data-nosnippet>317</a> <span class="prelude-val">Err</span>(e) =&gt; {
<a href=#318 id=318 data-nosnippet>318</a> BrotliEncoderDestroyInstance(s);
<a href=#319 id=319 data-nosnippet>319</a> read_err<span class="question-mark">?</span>;
<a href=#320 id=320 data-nosnippet>320</a> <span class="kw">return </span><span class="prelude-val">Err</span>(e);
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a> <span class="prelude-val">Ok</span>(size) =&gt; {
<a href=#323 id=323 data-nosnippet>323</a> next_out_offset += size;
<a href=#324 id=324 data-nosnippet>324</a> }
<a href=#325 id=325 data-nosnippet>325</a> }
<a href=#326 id=326 data-nosnippet>326</a> }
<a href=#327 id=327 data-nosnippet>327</a> available_out = output_buffer.len();
<a href=#328 id=328 data-nosnippet>328</a> next_out_offset = <span class="number">0</span>;
<a href=#329 id=329 data-nosnippet>329</a> }
<a href=#330 id=330 data-nosnippet>330</a> <span class="kw">if </span>!result {
<a href=#331 id=331 data-nosnippet>331</a> <span class="kw">if </span>read_err.is_ok() {
<a href=#332 id=332 data-nosnippet>332</a> read_err = <span class="prelude-val">Err</span>(unexpected_eof_error_constant);
<a href=#333 id=333 data-nosnippet>333</a> }
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">break</span>;
<a href=#335 id=335 data-nosnippet>335</a> }
<a href=#336 id=336 data-nosnippet>336</a> <span class="kw">if </span>fin {
<a href=#337 id=337 data-nosnippet>337</a> <span class="kw">break</span>;
<a href=#338 id=338 data-nosnippet>338</a> }
<a href=#339 id=339 data-nosnippet>339</a> }
<a href=#340 id=340 data-nosnippet>340</a> BrotliEncoderDestroyInstance(s);
<a href=#341 id=341 data-nosnippet>341</a> }
<a href=#342 id=342 data-nosnippet>342</a> read_err<span class="question-mark">?</span>;
<a href=#343 id=343 data-nosnippet>343</a> <span class="prelude-val">Ok</span>(total_out.unwrap())
<a href=#344 id=344 data-nosnippet>344</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,187 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/multithreading.rs`."><title>multithreading.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>multithreading.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#![cfg(feature = <span class="string">"std"</span>)]
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>alloc::{Allocator, SliceWrapper};
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>core::marker::PhantomData;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span>core::mem;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span>std;
<a href=#7 id=7 data-nosnippet>7</a><span class="comment">// in-place thread create
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">use </span>std::sync::RwLock;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span>std::thread::JoinHandle;
<a href=#10 id=10 data-nosnippet>10</a>
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">crate</span>::enc::backward_references::UnionHasher;
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use </span><span class="kw">crate</span>::enc::threading::{
<a href=#13 id=13 data-nosnippet>13</a> AnyBoxConstructor, BatchSpawnable, BatchSpawnableLite, BrotliEncoderThreadError, CompressMulti,
<a href=#14 id=14 data-nosnippet>14</a> CompressionThreadResult, InternalOwned, InternalSendAlloc, Joinable, Owned, OwnedRetriever,
<a href=#15 id=15 data-nosnippet>15</a> PoisonedThreadError, SendAlloc,
<a href=#16 id=16 data-nosnippet>16</a>};
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">use </span><span class="kw">crate</span>::enc::{BrotliAlloc, BrotliEncoderParams};
<a href=#18 id=18 data-nosnippet>18</a>
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">pub struct </span>MultiThreadedJoinable&lt;T: Send + <span class="lifetime">'static</span>, U: Send + <span class="lifetime">'static</span>&gt;(
<a href=#20 id=20 data-nosnippet>20</a> JoinHandle&lt;T&gt;,
<a href=#21 id=21 data-nosnippet>21</a> PhantomData&lt;U&gt;,
<a href=#22 id=22 data-nosnippet>22</a>);
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a><span class="kw">impl</span>&lt;T: Send + <span class="lifetime">'static</span>, U: Send + <span class="lifetime">'static </span>+ AnyBoxConstructor&gt; Joinable&lt;T, U&gt;
<a href=#25 id=25 data-nosnippet>25</a> <span class="kw">for </span>MultiThreadedJoinable&lt;T, U&gt;
<a href=#26 id=26 data-nosnippet>26</a>{
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">fn </span>join(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;T, U&gt; {
<a href=#28 id=28 data-nosnippet>28</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0</span>.join() {
<a href=#29 id=29 data-nosnippet>29</a> <span class="prelude-val">Ok</span>(t) =&gt; <span class="prelude-val">Ok</span>(t),
<a href=#30 id=30 data-nosnippet>30</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="prelude-val">Err</span>(&lt;U <span class="kw">as </span>AnyBoxConstructor&gt;::new(e)),
<a href=#31 id=31 data-nosnippet>31</a> }
<a href=#32 id=32 data-nosnippet>32</a> }
<a href=#33 id=33 data-nosnippet>33</a>}
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a><span class="kw">pub struct </span>MultiThreadedOwnedRetriever&lt;U: Send + <span class="lifetime">'static</span>&gt;(RwLock&lt;U&gt;);
<a href=#36 id=36 data-nosnippet>36</a>
<a href=#37 id=37 data-nosnippet>37</a><span class="kw">impl</span>&lt;U: Send + <span class="lifetime">'static</span>&gt; OwnedRetriever&lt;U&gt; <span class="kw">for </span>MultiThreadedOwnedRetriever&lt;U&gt; {
<a href=#38 id=38 data-nosnippet>38</a> <span class="kw">fn </span>view&lt;T, F: FnOnce(<span class="kw-2">&amp;</span>U) -&gt; T&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, f: F) -&gt; <span class="prelude-ty">Result</span>&lt;T, PoisonedThreadError&gt; {
<a href=#39 id=39 data-nosnippet>39</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0</span>.read() {
<a href=#40 id=40 data-nosnippet>40</a> <span class="prelude-val">Ok</span>(u) =&gt; <span class="prelude-val">Ok</span>(f(<span class="kw-2">&amp;*</span>u)),
<a href=#41 id=41 data-nosnippet>41</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(PoisonedThreadError::default()),
<a href=#42 id=42 data-nosnippet>42</a> }
<a href=#43 id=43 data-nosnippet>43</a> }
<a href=#44 id=44 data-nosnippet>44</a> <span class="kw">fn </span>unwrap(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;U, PoisonedThreadError&gt; {
<a href=#45 id=45 data-nosnippet>45</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0</span>.into_inner() {
<a href=#46 id=46 data-nosnippet>46</a> <span class="prelude-val">Ok</span>(u) =&gt; <span class="prelude-val">Ok</span>(u),
<a href=#47 id=47 data-nosnippet>47</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(PoisonedThreadError::default()),
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a> }
<a href=#50 id=50 data-nosnippet>50</a>}
<a href=#51 id=51 data-nosnippet>51</a>
<a href=#52 id=52 data-nosnippet>52</a><span class="attr">#[derive(Default)]
<a href=#53 id=53 data-nosnippet>53</a></span><span class="kw">pub struct </span>MultiThreadedSpawner {}
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a><span class="kw">fn </span>spawn_work&lt;
<a href=#56 id=56 data-nosnippet>56</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#57 id=57 data-nosnippet>57</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#58 id=58 data-nosnippet>58</a> F: Fn(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue + Send + <span class="lifetime">'static</span>,
<a href=#59 id=59 data-nosnippet>59</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#60 id=60 data-nosnippet>60</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#61 id=61 data-nosnippet>61</a>&gt;(
<a href=#62 id=62 data-nosnippet>62</a> extra_input: ExtraInput,
<a href=#63 id=63 data-nosnippet>63</a> index: usize,
<a href=#64 id=64 data-nosnippet>64</a> num_threads: usize,
<a href=#65 id=65 data-nosnippet>65</a> locked_input: std::sync::Arc&lt;RwLock&lt;U&gt;&gt;,
<a href=#66 id=66 data-nosnippet>66</a> alloc: Alloc,
<a href=#67 id=67 data-nosnippet>67</a> f: F,
<a href=#68 id=68 data-nosnippet>68</a>) -&gt; std::thread::JoinHandle&lt;ReturnValue&gt;
<a href=#69 id=69 data-nosnippet>69</a><span class="kw">where
<a href=#70 id=70 data-nosnippet>70</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#71 id=71 data-nosnippet>71</a>{
<a href=#72 id=72 data-nosnippet>72</a> std::thread::spawn(<span class="kw">move </span>|| {
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">let </span>t: ReturnValue = locked_input
<a href=#74 id=74 data-nosnippet>74</a> .view(<span class="kw">move </span>|guard: <span class="kw-2">&amp;</span>U| -&gt; ReturnValue {
<a href=#75 id=75 data-nosnippet>75</a> f(extra_input, index, num_threads, guard, alloc)
<a href=#76 id=76 data-nosnippet>76</a> })
<a href=#77 id=77 data-nosnippet>77</a> .unwrap();
<a href=#78 id=78 data-nosnippet>78</a> t
<a href=#79 id=79 data-nosnippet>79</a> })
<a href=#80 id=80 data-nosnippet>80</a>}
<a href=#81 id=81 data-nosnippet>81</a>
<a href=#82 id=82 data-nosnippet>82</a><span class="kw">impl</span>&lt;
<a href=#83 id=83 data-nosnippet>83</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#84 id=84 data-nosnippet>84</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#85 id=85 data-nosnippet>85</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#86 id=86 data-nosnippet>86</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#87 id=87 data-nosnippet>87</a> &gt; BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt; <span class="kw">for </span>MultiThreadedSpawner
<a href=#88 id=88 data-nosnippet>88</a><span class="kw">where
<a href=#89 id=89 data-nosnippet>89</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#90 id=90 data-nosnippet>90</a>{
<a href=#91 id=91 data-nosnippet>91</a> <span class="kw">type </span>JoinHandle = MultiThreadedJoinable&lt;ReturnValue, BrotliEncoderThreadError&gt;;
<a href=#92 id=92 data-nosnippet>92</a> <span class="kw">type </span>FinalJoinHandle = std::sync::Arc&lt;RwLock&lt;U&gt;&gt;;
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle {
<a href=#94 id=94 data-nosnippet>94</a> std::sync::Arc::&lt;RwLock&lt;U&gt;&gt;::new(RwLock::new(
<a href=#95 id=95 data-nosnippet>95</a> mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap(),
<a href=#96 id=96 data-nosnippet>96</a> ))
<a href=#97 id=97 data-nosnippet>97</a> }
<a href=#98 id=98 data-nosnippet>98</a> <span class="kw">fn </span>spawn&lt;F: Fn(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue + Send + <span class="lifetime">'static </span>+ Copy&gt;(
<a href=#99 id=99 data-nosnippet>99</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#100 id=100 data-nosnippet>100</a> input: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#101 id=101 data-nosnippet>101</a> work: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#102 id=102 data-nosnippet>102</a> index: usize,
<a href=#103 id=103 data-nosnippet>103</a> num_threads: usize,
<a href=#104 id=104 data-nosnippet>104</a> f: F,
<a href=#105 id=105 data-nosnippet>105</a> ) {
<a href=#106 id=106 data-nosnippet>106</a> <span class="kw">let </span>(alloc, extra_input) = work.replace_with_default();
<a href=#107 id=107 data-nosnippet>107</a> <span class="kw">let </span>ret = spawn_work(extra_input, index, num_threads, input.clone(), alloc, f);
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw-2">*</span>work = SendAlloc(InternalSendAlloc::Join(MultiThreadedJoinable(
<a href=#109 id=109 data-nosnippet>109</a> ret,
<a href=#110 id=110 data-nosnippet>110</a> PhantomData,
<a href=#111 id=111 data-nosnippet>111</a> )));
<a href=#112 id=112 data-nosnippet>112</a> }
<a href=#113 id=113 data-nosnippet>113</a>}
<a href=#114 id=114 data-nosnippet>114</a><span class="kw">impl</span>&lt;
<a href=#115 id=115 data-nosnippet>115</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#116 id=116 data-nosnippet>116</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#117 id=117 data-nosnippet>117</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#118 id=118 data-nosnippet>118</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#119 id=119 data-nosnippet>119</a> &gt; BatchSpawnableLite&lt;ReturnValue, ExtraInput, Alloc, U&gt; <span class="kw">for </span>MultiThreadedSpawner
<a href=#120 id=120 data-nosnippet>120</a><span class="kw">where
<a href=#121 id=121 data-nosnippet>121</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#122 id=122 data-nosnippet>122</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#123 id=123 data-nosnippet>123</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#124 id=124 data-nosnippet>124</a>{
<a href=#125 id=125 data-nosnippet>125</a> <span class="kw">type </span>JoinHandle =
<a href=#126 id=126 data-nosnippet>126</a> &lt;MultiThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::JoinHandle;
<a href=#127 id=127 data-nosnippet>127</a> <span class="kw">type </span>FinalJoinHandle = &lt;MultiThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;
<a href=#128 id=128 data-nosnippet>128</a> ReturnValue,
<a href=#129 id=129 data-nosnippet>129</a> ExtraInput,
<a href=#130 id=130 data-nosnippet>130</a> Alloc,
<a href=#131 id=131 data-nosnippet>131</a> U,
<a href=#132 id=132 data-nosnippet>132</a> &gt;&gt;::FinalJoinHandle;
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle {
<a href=#134 id=134 data-nosnippet>134</a> &lt;<span class="self">Self </span><span class="kw">as </span>BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::make_spawner(<span class="self">self</span>, input)
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">fn </span>spawn(
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#138 id=138 data-nosnippet>138</a> handle: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#139 id=139 data-nosnippet>139</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#140 id=140 data-nosnippet>140</a> index: usize,
<a href=#141 id=141 data-nosnippet>141</a> num_threads: usize,
<a href=#142 id=142 data-nosnippet>142</a> f: <span class="kw">fn</span>(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue,
<a href=#143 id=143 data-nosnippet>143</a> ) {
<a href=#144 id=144 data-nosnippet>144</a> &lt;<span class="self">Self </span><span class="kw">as </span>BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::spawn(
<a href=#145 id=145 data-nosnippet>145</a> <span class="self">self</span>,
<a href=#146 id=146 data-nosnippet>146</a> handle,
<a href=#147 id=147 data-nosnippet>147</a> alloc_per_thread,
<a href=#148 id=148 data-nosnippet>148</a> index,
<a href=#149 id=149 data-nosnippet>149</a> num_threads,
<a href=#150 id=150 data-nosnippet>150</a> f,
<a href=#151 id=151 data-nosnippet>151</a> )
<a href=#152 id=152 data-nosnippet>152</a> }
<a href=#153 id=153 data-nosnippet>153</a>}
<a href=#154 id=154 data-nosnippet>154</a>
<a href=#155 id=155 data-nosnippet>155</a><span class="kw">pub fn </span>compress_multi&lt;
<a href=#156 id=156 data-nosnippet>156</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#157 id=157 data-nosnippet>157</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#158 id=158 data-nosnippet>158</a>&gt;(
<a href=#159 id=159 data-nosnippet>159</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#160 id=160 data-nosnippet>160</a> owned_input: <span class="kw-2">&amp;mut </span>Owned&lt;SliceW&gt;,
<a href=#161 id=161 data-nosnippet>161</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#162 id=162 data-nosnippet>162</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#163 id=163 data-nosnippet>163</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#164 id=164 data-nosnippet>164</a> UnionHasher&lt;Alloc&gt;,
<a href=#165 id=165 data-nosnippet>165</a> Alloc,
<a href=#166 id=166 data-nosnippet>166</a> &lt;MultiThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;
<a href=#167 id=167 data-nosnippet>167</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#168 id=168 data-nosnippet>168</a> UnionHasher&lt;Alloc&gt;,
<a href=#169 id=169 data-nosnippet>169</a> Alloc,
<a href=#170 id=170 data-nosnippet>170</a> SliceW,
<a href=#171 id=171 data-nosnippet>171</a> &gt;&gt;::JoinHandle,
<a href=#172 id=172 data-nosnippet>172</a> &gt;],
<a href=#173 id=173 data-nosnippet>173</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#174 id=174 data-nosnippet>174</a><span class="kw">where
<a href=#175 id=175 data-nosnippet>175</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#176 id=176 data-nosnippet>176</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#177 id=177 data-nosnippet>177</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#178 id=178 data-nosnippet>178</a>{
<a href=#179 id=179 data-nosnippet>179</a> CompressMulti(
<a href=#180 id=180 data-nosnippet>180</a> params,
<a href=#181 id=181 data-nosnippet>181</a> owned_input,
<a href=#182 id=182 data-nosnippet>182</a> output,
<a href=#183 id=183 data-nosnippet>183</a> alloc_per_thread,
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw-2">&amp;mut </span>MultiThreadedSpawner::default(),
<a href=#185 id=185 data-nosnippet>185</a> )
<a href=#186 id=186 data-nosnippet>186</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,260 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/parameters.rs`."><title>parameters.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>parameters.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#[derive(PartialEq, Eq, Copy, Clone, Debug)]
<a href=#2 id=2 data-nosnippet>2</a>#[repr(C)]
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">pub enum </span>BrotliEncoderParameter {
<a href=#4 id=4 data-nosnippet>4</a> BROTLI_PARAM_MODE = <span class="number">0</span>,
<a href=#5 id=5 data-nosnippet>5</a> BROTLI_PARAM_QUALITY = <span class="number">1</span>,
<a href=#6 id=6 data-nosnippet>6</a> BROTLI_PARAM_LGWIN = <span class="number">2</span>,
<a href=#7 id=7 data-nosnippet>7</a> BROTLI_PARAM_LGBLOCK = <span class="number">3</span>,
<a href=#8 id=8 data-nosnippet>8</a> BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING = <span class="number">4</span>,
<a href=#9 id=9 data-nosnippet>9</a> BROTLI_PARAM_SIZE_HINT = <span class="number">5</span>,
<a href=#10 id=10 data-nosnippet>10</a> BROTLI_PARAM_LARGE_WINDOW = <span class="number">6</span>,
<a href=#11 id=11 data-nosnippet>11</a> BROTLI_PARAM_Q9_5 = <span class="number">150</span>,
<a href=#12 id=12 data-nosnippet>12</a> BROTLI_METABLOCK_CALLBACK = <span class="number">151</span>,
<a href=#13 id=13 data-nosnippet>13</a> BROTLI_PARAM_STRIDE_DETECTION_QUALITY = <span class="number">152</span>,
<a href=#14 id=14 data-nosnippet>14</a> BROTLI_PARAM_HIGH_ENTROPY_DETECTION_QUALITY = <span class="number">153</span>,
<a href=#15 id=15 data-nosnippet>15</a> BROTLI_PARAM_LITERAL_BYTE_SCORE = <span class="number">154</span>,
<a href=#16 id=16 data-nosnippet>16</a> BROTLI_PARAM_CDF_ADAPTATION_DETECTION = <span class="number">155</span>,
<a href=#17 id=17 data-nosnippet>17</a> BROTLI_PARAM_PRIOR_BITMASK_DETECTION = <span class="number">156</span>,
<a href=#18 id=18 data-nosnippet>18</a> BROTLI_PARAM_SPEED = <span class="number">157</span>,
<a href=#19 id=19 data-nosnippet>19</a> BROTLI_PARAM_SPEED_MAX = <span class="number">158</span>,
<a href=#20 id=20 data-nosnippet>20</a> BROTLI_PARAM_CM_SPEED = <span class="number">159</span>,
<a href=#21 id=21 data-nosnippet>21</a> BROTLI_PARAM_CM_SPEED_MAX = <span class="number">160</span>,
<a href=#22 id=22 data-nosnippet>22</a> BROTLI_PARAM_SPEED_LOW = <span class="number">161</span>,
<a href=#23 id=23 data-nosnippet>23</a> BROTLI_PARAM_SPEED_LOW_MAX = <span class="number">162</span>,
<a href=#24 id=24 data-nosnippet>24</a> BROTLI_PARAM_CM_SPEED_LOW = <span class="number">164</span>,
<a href=#25 id=25 data-nosnippet>25</a> BROTLI_PARAM_CM_SPEED_LOW_MAX = <span class="number">165</span>,
<a href=#26 id=26 data-nosnippet>26</a> BROTLI_PARAM_AVOID_DISTANCE_PREFIX_SEARCH = <span class="number">166</span>,
<a href=#27 id=27 data-nosnippet>27</a> BROTLI_PARAM_CATABLE = <span class="number">167</span>,
<a href=#28 id=28 data-nosnippet>28</a> BROTLI_PARAM_APPENDABLE = <span class="number">168</span>,
<a href=#29 id=29 data-nosnippet>29</a> BROTLI_PARAM_MAGIC_NUMBER = <span class="number">169</span>,
<a href=#30 id=30 data-nosnippet>30</a> BROTLI_PARAM_NO_DICTIONARY = <span class="number">170</span>,
<a href=#31 id=31 data-nosnippet>31</a> BROTLI_PARAM_FAVOR_EFFICIENCY = <span class="number">171</span>,
<a href=#32 id=32 data-nosnippet>32</a> UNUSED7 = <span class="number">7</span>,
<a href=#33 id=33 data-nosnippet>33</a> UNUSED8 = <span class="number">8</span>,
<a href=#34 id=34 data-nosnippet>34</a> UNUSED9 = <span class="number">9</span>,
<a href=#35 id=35 data-nosnippet>35</a> UNUSED10 = <span class="number">10</span>,
<a href=#36 id=36 data-nosnippet>36</a> UNUSED11 = <span class="number">11</span>,
<a href=#37 id=37 data-nosnippet>37</a> UNUSED12 = <span class="number">12</span>,
<a href=#38 id=38 data-nosnippet>38</a> UNUSED13 = <span class="number">13</span>,
<a href=#39 id=39 data-nosnippet>39</a> UNUSED14 = <span class="number">14</span>,
<a href=#40 id=40 data-nosnippet>40</a> UNUSED15 = <span class="number">15</span>,
<a href=#41 id=41 data-nosnippet>41</a> UNUSED16 = <span class="number">16</span>,
<a href=#42 id=42 data-nosnippet>42</a> UNUSED17 = <span class="number">17</span>,
<a href=#43 id=43 data-nosnippet>43</a> UNUSED18 = <span class="number">18</span>,
<a href=#44 id=44 data-nosnippet>44</a> UNUSED19 = <span class="number">19</span>,
<a href=#45 id=45 data-nosnippet>45</a> UNUSED20 = <span class="number">20</span>,
<a href=#46 id=46 data-nosnippet>46</a> UNUSED21 = <span class="number">21</span>,
<a href=#47 id=47 data-nosnippet>47</a> UNUSED22 = <span class="number">22</span>,
<a href=#48 id=48 data-nosnippet>48</a> UNUSED23 = <span class="number">23</span>,
<a href=#49 id=49 data-nosnippet>49</a> UNUSED24 = <span class="number">24</span>,
<a href=#50 id=50 data-nosnippet>50</a> UNUSED25 = <span class="number">25</span>,
<a href=#51 id=51 data-nosnippet>51</a> UNUSED26 = <span class="number">26</span>,
<a href=#52 id=52 data-nosnippet>52</a> UNUSED27 = <span class="number">27</span>,
<a href=#53 id=53 data-nosnippet>53</a> UNUSED28 = <span class="number">28</span>,
<a href=#54 id=54 data-nosnippet>54</a> UNUSED29 = <span class="number">29</span>,
<a href=#55 id=55 data-nosnippet>55</a> UNUSED30 = <span class="number">30</span>,
<a href=#56 id=56 data-nosnippet>56</a> UNUSED31 = <span class="number">31</span>,
<a href=#57 id=57 data-nosnippet>57</a> UNUSED32 = <span class="number">32</span>,
<a href=#58 id=58 data-nosnippet>58</a> UNUSED33 = <span class="number">33</span>,
<a href=#59 id=59 data-nosnippet>59</a> UNUSED34 = <span class="number">34</span>,
<a href=#60 id=60 data-nosnippet>60</a> UNUSED35 = <span class="number">35</span>,
<a href=#61 id=61 data-nosnippet>61</a> UNUSED36 = <span class="number">36</span>,
<a href=#62 id=62 data-nosnippet>62</a> UNUSED37 = <span class="number">37</span>,
<a href=#63 id=63 data-nosnippet>63</a> UNUSED38 = <span class="number">38</span>,
<a href=#64 id=64 data-nosnippet>64</a> UNUSED39 = <span class="number">39</span>,
<a href=#65 id=65 data-nosnippet>65</a> UNUSED40 = <span class="number">40</span>,
<a href=#66 id=66 data-nosnippet>66</a> UNUSED41 = <span class="number">41</span>,
<a href=#67 id=67 data-nosnippet>67</a> UNUSED42 = <span class="number">42</span>,
<a href=#68 id=68 data-nosnippet>68</a> UNUSED43 = <span class="number">43</span>,
<a href=#69 id=69 data-nosnippet>69</a> UNUSED44 = <span class="number">44</span>,
<a href=#70 id=70 data-nosnippet>70</a> UNUSED45 = <span class="number">45</span>,
<a href=#71 id=71 data-nosnippet>71</a> UNUSED46 = <span class="number">46</span>,
<a href=#72 id=72 data-nosnippet>72</a> UNUSED47 = <span class="number">47</span>,
<a href=#73 id=73 data-nosnippet>73</a> UNUSED48 = <span class="number">48</span>,
<a href=#74 id=74 data-nosnippet>74</a> UNUSED49 = <span class="number">49</span>,
<a href=#75 id=75 data-nosnippet>75</a> UNUSED50 = <span class="number">50</span>,
<a href=#76 id=76 data-nosnippet>76</a> UNUSED51 = <span class="number">51</span>,
<a href=#77 id=77 data-nosnippet>77</a> UNUSED52 = <span class="number">52</span>,
<a href=#78 id=78 data-nosnippet>78</a> UNUSED53 = <span class="number">53</span>,
<a href=#79 id=79 data-nosnippet>79</a> UNUSED54 = <span class="number">54</span>,
<a href=#80 id=80 data-nosnippet>80</a> UNUSED55 = <span class="number">55</span>,
<a href=#81 id=81 data-nosnippet>81</a> UNUSED56 = <span class="number">56</span>,
<a href=#82 id=82 data-nosnippet>82</a> UNUSED57 = <span class="number">57</span>,
<a href=#83 id=83 data-nosnippet>83</a> UNUSED58 = <span class="number">58</span>,
<a href=#84 id=84 data-nosnippet>84</a> UNUSED59 = <span class="number">59</span>,
<a href=#85 id=85 data-nosnippet>85</a> UNUSED60 = <span class="number">60</span>,
<a href=#86 id=86 data-nosnippet>86</a> UNUSED61 = <span class="number">61</span>,
<a href=#87 id=87 data-nosnippet>87</a> UNUSED62 = <span class="number">62</span>,
<a href=#88 id=88 data-nosnippet>88</a> UNUSED63 = <span class="number">63</span>,
<a href=#89 id=89 data-nosnippet>89</a> UNUSED64 = <span class="number">64</span>,
<a href=#90 id=90 data-nosnippet>90</a> UNUSED65 = <span class="number">65</span>,
<a href=#91 id=91 data-nosnippet>91</a> UNUSED66 = <span class="number">66</span>,
<a href=#92 id=92 data-nosnippet>92</a> UNUSED67 = <span class="number">67</span>,
<a href=#93 id=93 data-nosnippet>93</a> UNUSED68 = <span class="number">68</span>,
<a href=#94 id=94 data-nosnippet>94</a> UNUSED69 = <span class="number">69</span>,
<a href=#95 id=95 data-nosnippet>95</a> UNUSED70 = <span class="number">70</span>,
<a href=#96 id=96 data-nosnippet>96</a> UNUSED71 = <span class="number">71</span>,
<a href=#97 id=97 data-nosnippet>97</a> UNUSED72 = <span class="number">72</span>,
<a href=#98 id=98 data-nosnippet>98</a> UNUSED73 = <span class="number">73</span>,
<a href=#99 id=99 data-nosnippet>99</a> UNUSED74 = <span class="number">74</span>,
<a href=#100 id=100 data-nosnippet>100</a> UNUSED75 = <span class="number">75</span>,
<a href=#101 id=101 data-nosnippet>101</a> UNUSED76 = <span class="number">76</span>,
<a href=#102 id=102 data-nosnippet>102</a> UNUSED77 = <span class="number">77</span>,
<a href=#103 id=103 data-nosnippet>103</a> UNUSED78 = <span class="number">78</span>,
<a href=#104 id=104 data-nosnippet>104</a> UNUSED79 = <span class="number">79</span>,
<a href=#105 id=105 data-nosnippet>105</a> UNUSED80 = <span class="number">80</span>,
<a href=#106 id=106 data-nosnippet>106</a> UNUSED81 = <span class="number">81</span>,
<a href=#107 id=107 data-nosnippet>107</a> UNUSED82 = <span class="number">82</span>,
<a href=#108 id=108 data-nosnippet>108</a> UNUSED83 = <span class="number">83</span>,
<a href=#109 id=109 data-nosnippet>109</a> UNUSED84 = <span class="number">84</span>,
<a href=#110 id=110 data-nosnippet>110</a> UNUSED85 = <span class="number">85</span>,
<a href=#111 id=111 data-nosnippet>111</a> UNUSED86 = <span class="number">86</span>,
<a href=#112 id=112 data-nosnippet>112</a> UNUSED87 = <span class="number">87</span>,
<a href=#113 id=113 data-nosnippet>113</a> UNUSED88 = <span class="number">88</span>,
<a href=#114 id=114 data-nosnippet>114</a> UNUSED89 = <span class="number">89</span>,
<a href=#115 id=115 data-nosnippet>115</a> UNUSED90 = <span class="number">90</span>,
<a href=#116 id=116 data-nosnippet>116</a> UNUSED91 = <span class="number">91</span>,
<a href=#117 id=117 data-nosnippet>117</a> UNUSED92 = <span class="number">92</span>,
<a href=#118 id=118 data-nosnippet>118</a> UNUSED93 = <span class="number">93</span>,
<a href=#119 id=119 data-nosnippet>119</a> UNUSED94 = <span class="number">94</span>,
<a href=#120 id=120 data-nosnippet>120</a> UNUSED95 = <span class="number">95</span>,
<a href=#121 id=121 data-nosnippet>121</a> UNUSED96 = <span class="number">96</span>,
<a href=#122 id=122 data-nosnippet>122</a> UNUSED97 = <span class="number">97</span>,
<a href=#123 id=123 data-nosnippet>123</a> UNUSED98 = <span class="number">98</span>,
<a href=#124 id=124 data-nosnippet>124</a> UNUSED99 = <span class="number">99</span>,
<a href=#125 id=125 data-nosnippet>125</a> UNUSED100 = <span class="number">100</span>,
<a href=#126 id=126 data-nosnippet>126</a> UNUSED101 = <span class="number">101</span>,
<a href=#127 id=127 data-nosnippet>127</a> UNUSED102 = <span class="number">102</span>,
<a href=#128 id=128 data-nosnippet>128</a> UNUSED103 = <span class="number">103</span>,
<a href=#129 id=129 data-nosnippet>129</a> UNUSED104 = <span class="number">104</span>,
<a href=#130 id=130 data-nosnippet>130</a> UNUSED105 = <span class="number">105</span>,
<a href=#131 id=131 data-nosnippet>131</a> UNUSED106 = <span class="number">106</span>,
<a href=#132 id=132 data-nosnippet>132</a> UNUSED107 = <span class="number">107</span>,
<a href=#133 id=133 data-nosnippet>133</a> UNUSED108 = <span class="number">108</span>,
<a href=#134 id=134 data-nosnippet>134</a> UNUSED109 = <span class="number">109</span>,
<a href=#135 id=135 data-nosnippet>135</a> UNUSED110 = <span class="number">110</span>,
<a href=#136 id=136 data-nosnippet>136</a> UNUSED111 = <span class="number">111</span>,
<a href=#137 id=137 data-nosnippet>137</a> UNUSED112 = <span class="number">112</span>,
<a href=#138 id=138 data-nosnippet>138</a> UNUSED113 = <span class="number">113</span>,
<a href=#139 id=139 data-nosnippet>139</a> UNUSED114 = <span class="number">114</span>,
<a href=#140 id=140 data-nosnippet>140</a> UNUSED115 = <span class="number">115</span>,
<a href=#141 id=141 data-nosnippet>141</a> UNUSED116 = <span class="number">116</span>,
<a href=#142 id=142 data-nosnippet>142</a> UNUSED117 = <span class="number">117</span>,
<a href=#143 id=143 data-nosnippet>143</a> UNUSED118 = <span class="number">118</span>,
<a href=#144 id=144 data-nosnippet>144</a> UNUSED119 = <span class="number">119</span>,
<a href=#145 id=145 data-nosnippet>145</a> UNUSED120 = <span class="number">120</span>,
<a href=#146 id=146 data-nosnippet>146</a> UNUSED121 = <span class="number">121</span>,
<a href=#147 id=147 data-nosnippet>147</a> UNUSED122 = <span class="number">122</span>,
<a href=#148 id=148 data-nosnippet>148</a> UNUSED123 = <span class="number">123</span>,
<a href=#149 id=149 data-nosnippet>149</a> UNUSED124 = <span class="number">124</span>,
<a href=#150 id=150 data-nosnippet>150</a> UNUSED125 = <span class="number">125</span>,
<a href=#151 id=151 data-nosnippet>151</a> UNUSED126 = <span class="number">126</span>,
<a href=#152 id=152 data-nosnippet>152</a> UNUSED127 = <span class="number">127</span>,
<a href=#153 id=153 data-nosnippet>153</a> UNUSED128 = <span class="number">128</span>,
<a href=#154 id=154 data-nosnippet>154</a> UNUSED129 = <span class="number">129</span>,
<a href=#155 id=155 data-nosnippet>155</a> UNUSED130 = <span class="number">130</span>,
<a href=#156 id=156 data-nosnippet>156</a> UNUSED131 = <span class="number">131</span>,
<a href=#157 id=157 data-nosnippet>157</a> UNUSED132 = <span class="number">132</span>,
<a href=#158 id=158 data-nosnippet>158</a> UNUSED133 = <span class="number">133</span>,
<a href=#159 id=159 data-nosnippet>159</a> UNUSED134 = <span class="number">134</span>,
<a href=#160 id=160 data-nosnippet>160</a> UNUSED135 = <span class="number">135</span>,
<a href=#161 id=161 data-nosnippet>161</a> UNUSED136 = <span class="number">136</span>,
<a href=#162 id=162 data-nosnippet>162</a> UNUSED137 = <span class="number">137</span>,
<a href=#163 id=163 data-nosnippet>163</a> UNUSED138 = <span class="number">138</span>,
<a href=#164 id=164 data-nosnippet>164</a> UNUSED139 = <span class="number">139</span>,
<a href=#165 id=165 data-nosnippet>165</a> UNUSED140 = <span class="number">140</span>,
<a href=#166 id=166 data-nosnippet>166</a> UNUSED141 = <span class="number">141</span>,
<a href=#167 id=167 data-nosnippet>167</a> UNUSED142 = <span class="number">142</span>,
<a href=#168 id=168 data-nosnippet>168</a> UNUSED143 = <span class="number">143</span>,
<a href=#169 id=169 data-nosnippet>169</a> UNUSED144 = <span class="number">144</span>,
<a href=#170 id=170 data-nosnippet>170</a> UNUSED145 = <span class="number">145</span>,
<a href=#171 id=171 data-nosnippet>171</a> UNUSED146 = <span class="number">146</span>,
<a href=#172 id=172 data-nosnippet>172</a> UNUSED147 = <span class="number">147</span>,
<a href=#173 id=173 data-nosnippet>173</a> UNUSED148 = <span class="number">148</span>,
<a href=#174 id=174 data-nosnippet>174</a> UNUSED149 = <span class="number">149</span>,
<a href=#175 id=175 data-nosnippet>175</a> UNUSED172 = <span class="number">172</span>,
<a href=#176 id=176 data-nosnippet>176</a> UNUSED173 = <span class="number">173</span>,
<a href=#177 id=177 data-nosnippet>177</a> UNUSED174 = <span class="number">174</span>,
<a href=#178 id=178 data-nosnippet>178</a> UNUSED175 = <span class="number">175</span>,
<a href=#179 id=179 data-nosnippet>179</a> UNUSED176 = <span class="number">176</span>,
<a href=#180 id=180 data-nosnippet>180</a> UNUSED177 = <span class="number">177</span>,
<a href=#181 id=181 data-nosnippet>181</a> UNUSED178 = <span class="number">178</span>,
<a href=#182 id=182 data-nosnippet>182</a> UNUSED179 = <span class="number">179</span>,
<a href=#183 id=183 data-nosnippet>183</a> UNUSED180 = <span class="number">180</span>,
<a href=#184 id=184 data-nosnippet>184</a> UNUSED181 = <span class="number">181</span>,
<a href=#185 id=185 data-nosnippet>185</a> UNUSED182 = <span class="number">182</span>,
<a href=#186 id=186 data-nosnippet>186</a> UNUSED183 = <span class="number">183</span>,
<a href=#187 id=187 data-nosnippet>187</a> UNUSED184 = <span class="number">184</span>,
<a href=#188 id=188 data-nosnippet>188</a> UNUSED185 = <span class="number">185</span>,
<a href=#189 id=189 data-nosnippet>189</a> UNUSED186 = <span class="number">186</span>,
<a href=#190 id=190 data-nosnippet>190</a> UNUSED187 = <span class="number">187</span>,
<a href=#191 id=191 data-nosnippet>191</a> UNUSED188 = <span class="number">188</span>,
<a href=#192 id=192 data-nosnippet>192</a> UNUSED189 = <span class="number">189</span>,
<a href=#193 id=193 data-nosnippet>193</a> UNUSED190 = <span class="number">190</span>,
<a href=#194 id=194 data-nosnippet>194</a> UNUSED191 = <span class="number">191</span>,
<a href=#195 id=195 data-nosnippet>195</a> UNUSED192 = <span class="number">192</span>,
<a href=#196 id=196 data-nosnippet>196</a> UNUSED193 = <span class="number">193</span>,
<a href=#197 id=197 data-nosnippet>197</a> UNUSED194 = <span class="number">194</span>,
<a href=#198 id=198 data-nosnippet>198</a> UNUSED195 = <span class="number">195</span>,
<a href=#199 id=199 data-nosnippet>199</a> UNUSED196 = <span class="number">196</span>,
<a href=#200 id=200 data-nosnippet>200</a> UNUSED197 = <span class="number">197</span>,
<a href=#201 id=201 data-nosnippet>201</a> UNUSED198 = <span class="number">198</span>,
<a href=#202 id=202 data-nosnippet>202</a> UNUSED199 = <span class="number">199</span>,
<a href=#203 id=203 data-nosnippet>203</a> UNUSED200 = <span class="number">200</span>,
<a href=#204 id=204 data-nosnippet>204</a> UNUSED201 = <span class="number">201</span>,
<a href=#205 id=205 data-nosnippet>205</a> UNUSED202 = <span class="number">202</span>,
<a href=#206 id=206 data-nosnippet>206</a> UNUSED203 = <span class="number">203</span>,
<a href=#207 id=207 data-nosnippet>207</a> UNUSED204 = <span class="number">204</span>,
<a href=#208 id=208 data-nosnippet>208</a> UNUSED205 = <span class="number">205</span>,
<a href=#209 id=209 data-nosnippet>209</a> UNUSED206 = <span class="number">206</span>,
<a href=#210 id=210 data-nosnippet>210</a> UNUSED207 = <span class="number">207</span>,
<a href=#211 id=211 data-nosnippet>211</a> UNUSED208 = <span class="number">208</span>,
<a href=#212 id=212 data-nosnippet>212</a> UNUSED209 = <span class="number">209</span>,
<a href=#213 id=213 data-nosnippet>213</a> UNUSED210 = <span class="number">210</span>,
<a href=#214 id=214 data-nosnippet>214</a> UNUSED211 = <span class="number">211</span>,
<a href=#215 id=215 data-nosnippet>215</a> UNUSED212 = <span class="number">212</span>,
<a href=#216 id=216 data-nosnippet>216</a> UNUSED213 = <span class="number">213</span>,
<a href=#217 id=217 data-nosnippet>217</a> UNUSED214 = <span class="number">214</span>,
<a href=#218 id=218 data-nosnippet>218</a> UNUSED215 = <span class="number">215</span>,
<a href=#219 id=219 data-nosnippet>219</a> UNUSED216 = <span class="number">216</span>,
<a href=#220 id=220 data-nosnippet>220</a> UNUSED217 = <span class="number">217</span>,
<a href=#221 id=221 data-nosnippet>221</a> UNUSED218 = <span class="number">218</span>,
<a href=#222 id=222 data-nosnippet>222</a> UNUSED219 = <span class="number">219</span>,
<a href=#223 id=223 data-nosnippet>223</a> UNUSED220 = <span class="number">220</span>,
<a href=#224 id=224 data-nosnippet>224</a> UNUSED221 = <span class="number">221</span>,
<a href=#225 id=225 data-nosnippet>225</a> UNUSED222 = <span class="number">222</span>,
<a href=#226 id=226 data-nosnippet>226</a> UNUSED223 = <span class="number">223</span>,
<a href=#227 id=227 data-nosnippet>227</a> UNUSED224 = <span class="number">224</span>,
<a href=#228 id=228 data-nosnippet>228</a> UNUSED225 = <span class="number">225</span>,
<a href=#229 id=229 data-nosnippet>229</a> UNUSED226 = <span class="number">226</span>,
<a href=#230 id=230 data-nosnippet>230</a> UNUSED227 = <span class="number">227</span>,
<a href=#231 id=231 data-nosnippet>231</a> UNUSED228 = <span class="number">228</span>,
<a href=#232 id=232 data-nosnippet>232</a> UNUSED229 = <span class="number">229</span>,
<a href=#233 id=233 data-nosnippet>233</a> UNUSED230 = <span class="number">230</span>,
<a href=#234 id=234 data-nosnippet>234</a> UNUSED231 = <span class="number">231</span>,
<a href=#235 id=235 data-nosnippet>235</a> UNUSED232 = <span class="number">232</span>,
<a href=#236 id=236 data-nosnippet>236</a> UNUSED233 = <span class="number">233</span>,
<a href=#237 id=237 data-nosnippet>237</a> UNUSED234 = <span class="number">234</span>,
<a href=#238 id=238 data-nosnippet>238</a> UNUSED235 = <span class="number">235</span>,
<a href=#239 id=239 data-nosnippet>239</a> UNUSED236 = <span class="number">236</span>,
<a href=#240 id=240 data-nosnippet>240</a> UNUSED237 = <span class="number">237</span>,
<a href=#241 id=241 data-nosnippet>241</a> UNUSED238 = <span class="number">238</span>,
<a href=#242 id=242 data-nosnippet>242</a> UNUSED239 = <span class="number">239</span>,
<a href=#243 id=243 data-nosnippet>243</a> UNUSED240 = <span class="number">240</span>,
<a href=#244 id=244 data-nosnippet>244</a> UNUSED241 = <span class="number">241</span>,
<a href=#245 id=245 data-nosnippet>245</a> UNUSED242 = <span class="number">242</span>,
<a href=#246 id=246 data-nosnippet>246</a> UNUSED243 = <span class="number">243</span>,
<a href=#247 id=247 data-nosnippet>247</a> UNUSED244 = <span class="number">244</span>,
<a href=#248 id=248 data-nosnippet>248</a> UNUSED245 = <span class="number">245</span>,
<a href=#249 id=249 data-nosnippet>249</a> UNUSED246 = <span class="number">246</span>,
<a href=#250 id=250 data-nosnippet>250</a> UNUSED247 = <span class="number">247</span>,
<a href=#251 id=251 data-nosnippet>251</a> UNUSED248 = <span class="number">248</span>,
<a href=#252 id=252 data-nosnippet>252</a> UNUSED249 = <span class="number">249</span>,
<a href=#253 id=253 data-nosnippet>253</a> UNUSED250 = <span class="number">250</span>,
<a href=#254 id=254 data-nosnippet>254</a> UNUSED251 = <span class="number">251</span>,
<a href=#255 id=255 data-nosnippet>255</a> UNUSED252 = <span class="number">252</span>,
<a href=#256 id=256 data-nosnippet>256</a> UNUSED253 = <span class="number">253</span>,
<a href=#257 id=257 data-nosnippet>257</a> UNUSED254 = <span class="number">254</span>,
<a href=#258 id=258 data-nosnippet>258</a> UNUSED255 = <span class="number">255</span>,
<a href=#259 id=259 data-nosnippet>259</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,7 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/pdf.rs`."><title>pdf.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>pdf.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-1"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="comment">//TODO: replace with builtin SIMD type
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a>// FIXME!!!
<a href=#4 id=4 data-nosnippet>4</a></span><span class="attr">#[allow(dead_code)]
<a href=#5 id=5 data-nosnippet>5</a>#[derive(Copy, Clone, Default, Debug)]
<a href=#6 id=6 data-nosnippet>6</a></span><span class="kw">pub struct </span>PDF([i16; <span class="number">16</span>]);
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,855 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/prior_eval.rs`."><title>prior_eval.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>prior_eval.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::cmp::min;
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[cfg(feature = <span class="string">"simd"</span>)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">use </span>core::simd::prelude::SimdPartialOrd;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::backward_references::BrotliEncoderParams;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">super</span>::input_pair::{InputPair, InputReference, InputReferenceMut};
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">super</span>::ir_interpret::{push_base, IRInterpreter};
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">super</span>::util::{floatX, FastLog2u16};
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use super</span>::{find_stride, interface, s16, v8};
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::{alloc_default, alloc_if};
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="comment">// the high nibble, followed by the low nibbles
<a href=#16 id=16 data-nosnippet>16</a></span><span class="kw">pub const </span>CONTEXT_MAP_PRIOR_SIZE: usize = <span class="number">256 </span>* <span class="number">17</span>;
<a href=#17 id=17 data-nosnippet>17</a><span class="kw">pub const </span>STRIDE_PRIOR_SIZE: usize = <span class="number">256 </span>* <span class="number">256 </span>* <span class="number">2</span>;
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">pub const </span>ADV_PRIOR_SIZE: usize = <span class="number">65536 </span>+ (<span class="number">20 </span>&lt;&lt; <span class="number">16</span>);
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">pub const </span>DEFAULT_SPEED: (u16, u16) = (<span class="number">8</span>, <span class="number">8192</span>);
<a href=#20 id=20 data-nosnippet>20</a>
<a href=#21 id=21 data-nosnippet>21</a><span class="kw">pub enum </span>WhichPrior {
<a href=#22 id=22 data-nosnippet>22</a> CM = <span class="number">0</span>,
<a href=#23 id=23 data-nosnippet>23</a> ADV = <span class="number">1</span>,
<a href=#24 id=24 data-nosnippet>24</a> SLOW_CM = <span class="number">2</span>,
<a href=#25 id=25 data-nosnippet>25</a> FAST_CM = <span class="number">3</span>,
<a href=#26 id=26 data-nosnippet>26</a> STRIDE1 = <span class="number">4</span>,
<a href=#27 id=27 data-nosnippet>27</a> STRIDE2 = <span class="number">5</span>,
<a href=#28 id=28 data-nosnippet>28</a> STRIDE3 = <span class="number">6</span>,
<a href=#29 id=29 data-nosnippet>29</a> STRIDE4 = <span class="number">7</span>,
<a href=#30 id=30 data-nosnippet>30</a> <span class="comment">// STRIDE8 = 8,
<a href=#31 id=31 data-nosnippet>31</a> </span>NUM_PRIORS = <span class="number">8</span>,
<a href=#32 id=32 data-nosnippet>32</a> <span class="comment">// future ideas
<a href=#33 id=33 data-nosnippet>33</a></span>}
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a><span class="kw">pub trait </span>Prior {
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">fn </span>lookup_lin(
<a href=#37 id=37 data-nosnippet>37</a> stride_byte: u8,
<a href=#38 id=38 data-nosnippet>38</a> selected_context: u8,
<a href=#39 id=39 data-nosnippet>39</a> actual_context: usize,
<a href=#40 id=40 data-nosnippet>40</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#41 id=41 data-nosnippet>41</a> ) -&gt; usize;
<a href=#42 id=42 data-nosnippet>42</a> <span class="attr">#[inline(always)]
<a href=#43 id=43 data-nosnippet>43</a> </span><span class="kw">fn </span>lookup_mut(
<a href=#44 id=44 data-nosnippet>44</a> data: <span class="kw-2">&amp;mut </span>[s16],
<a href=#45 id=45 data-nosnippet>45</a> stride_byte: u8,
<a href=#46 id=46 data-nosnippet>46</a> selected_context: u8,
<a href=#47 id=47 data-nosnippet>47</a> actual_context: usize,
<a href=#48 id=48 data-nosnippet>48</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#49 id=49 data-nosnippet>49</a> ) -&gt; CDF {
<a href=#50 id=50 data-nosnippet>50</a> <span class="kw">let </span>index = <span class="self">Self</span>::lookup_lin(stride_byte, selected_context, actual_context, high_nibble);
<a href=#51 id=51 data-nosnippet>51</a> CDF::from(<span class="kw-2">&amp;mut </span>data[index])
<a href=#52 id=52 data-nosnippet>52</a> }
<a href=#53 id=53 data-nosnippet>53</a> <span class="attr">#[inline(always)]
<a href=#54 id=54 data-nosnippet>54</a> </span><span class="kw">fn </span>lookup(
<a href=#55 id=55 data-nosnippet>55</a> data: <span class="kw-2">&amp;</span>[s16],
<a href=#56 id=56 data-nosnippet>56</a> stride_byte: u8,
<a href=#57 id=57 data-nosnippet>57</a> selected_context: u8,
<a href=#58 id=58 data-nosnippet>58</a> actual_context: usize,
<a href=#59 id=59 data-nosnippet>59</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#60 id=60 data-nosnippet>60</a> ) -&gt; <span class="kw-2">&amp;</span>s16 {
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">let </span>index = <span class="self">Self</span>::lookup_lin(stride_byte, selected_context, actual_context, high_nibble);
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw-2">&amp;</span>data[index]
<a href=#63 id=63 data-nosnippet>63</a> }
<a href=#64 id=64 data-nosnippet>64</a> <span class="attr">#[allow(unused_variables)]
<a href=#65 id=65 data-nosnippet>65</a> #[inline(always)]
<a href=#66 id=66 data-nosnippet>66</a> </span><span class="kw">fn </span>score_index(
<a href=#67 id=67 data-nosnippet>67</a> stride_byte: u8,
<a href=#68 id=68 data-nosnippet>68</a> selected_context: u8,
<a href=#69 id=69 data-nosnippet>69</a> actual_context: usize,
<a href=#70 id=70 data-nosnippet>70</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#71 id=71 data-nosnippet>71</a> ) -&gt; usize {
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">let </span>which = <span class="self">Self</span>::which();
<a href=#73 id=73 data-nosnippet>73</a> <span class="macro">assert!</span>(which &lt; WhichPrior::NUM_PRIORS <span class="kw">as </span>usize);
<a href=#74 id=74 data-nosnippet>74</a> <span class="macro">assert!</span>(actual_context &lt; <span class="number">256</span>);
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#76 id=76 data-nosnippet>76</a> WhichPrior::NUM_PRIORS <span class="kw">as </span>usize * (actual_context + <span class="number">4096 </span>+ <span class="number">256 </span>* nibble <span class="kw">as </span>usize)
<a href=#77 id=77 data-nosnippet>77</a> + which
<a href=#78 id=78 data-nosnippet>78</a> } <span class="kw">else </span>{
<a href=#79 id=79 data-nosnippet>79</a> WhichPrior::NUM_PRIORS <span class="kw">as </span>usize * (actual_context + <span class="number">256 </span>* (stride_byte &gt;&gt; <span class="number">4</span>) <span class="kw">as </span>usize)
<a href=#80 id=80 data-nosnippet>80</a> + which
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a> <span class="kw">fn </span>which() -&gt; usize;
<a href=#84 id=84 data-nosnippet>84</a>}
<a href=#85 id=85 data-nosnippet>85</a>
<a href=#86 id=86 data-nosnippet>86</a><span class="attr">#[inline(always)]
<a href=#87 id=87 data-nosnippet>87</a></span><span class="kw">fn </span>upper_score_index(stride_byte: u8, _selected_context: u8, actual_context: usize) -&gt; usize {
<a href=#88 id=88 data-nosnippet>88</a> actual_context + <span class="number">256 </span>* (stride_byte &gt;&gt; <span class="number">4</span>) <span class="kw">as </span>usize
<a href=#89 id=89 data-nosnippet>89</a>}
<a href=#90 id=90 data-nosnippet>90</a><span class="attr">#[inline(always)]
<a href=#91 id=91 data-nosnippet>91</a></span><span class="kw">fn </span>lower_score_index(
<a href=#92 id=92 data-nosnippet>92</a> _stride_byte: u8,
<a href=#93 id=93 data-nosnippet>93</a> _selected_context: u8,
<a href=#94 id=94 data-nosnippet>94</a> actual_context: usize,
<a href=#95 id=95 data-nosnippet>95</a> high_nibble: u8,
<a href=#96 id=96 data-nosnippet>96</a>) -&gt; usize {
<a href=#97 id=97 data-nosnippet>97</a> <span class="macro">debug_assert!</span>(actual_context &lt; <span class="number">256</span>);
<a href=#98 id=98 data-nosnippet>98</a> <span class="macro">debug_assert!</span>(high_nibble &lt; <span class="number">16</span>);
<a href=#99 id=99 data-nosnippet>99</a> actual_context + <span class="number">4096 </span>+ <span class="number">256 </span>* high_nibble <span class="kw">as </span>usize
<a href=#100 id=100 data-nosnippet>100</a>}
<a href=#101 id=101 data-nosnippet>101</a>
<a href=#102 id=102 data-nosnippet>102</a><span class="attr">#[allow(unused_variables)]
<a href=#103 id=103 data-nosnippet>103</a>#[inline(always)]
<a href=#104 id=104 data-nosnippet>104</a></span><span class="kw">fn </span>stride_lookup_lin(
<a href=#105 id=105 data-nosnippet>105</a> stride_byte: u8,
<a href=#106 id=106 data-nosnippet>106</a> selected_context: u8,
<a href=#107 id=107 data-nosnippet>107</a> actual_context: usize,
<a href=#108 id=108 data-nosnippet>108</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#109 id=109 data-nosnippet>109</a>) -&gt; usize {
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#111 id=111 data-nosnippet>111</a> <span class="number">1 </span>+ <span class="number">2 </span>* (actual_context | ((stride_byte <span class="kw">as </span>usize &amp; <span class="number">0x0f</span>) &lt;&lt; <span class="number">8</span>) | ((nibble <span class="kw">as </span>usize) &lt;&lt; <span class="number">12</span>))
<a href=#112 id=112 data-nosnippet>112</a> } <span class="kw">else </span>{
<a href=#113 id=113 data-nosnippet>113</a> <span class="number">2 </span>* (actual_context | ((stride_byte <span class="kw">as </span>usize) &lt;&lt; <span class="number">8</span>))
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a>}
<a href=#116 id=116 data-nosnippet>116</a><span class="kw">pub struct </span>Stride1Prior {}
<a href=#117 id=117 data-nosnippet>117</a><span class="kw">impl </span>Stride1Prior {
<a href=#118 id=118 data-nosnippet>118</a> <span class="attr">#[inline(always)]
<a href=#119 id=119 data-nosnippet>119</a> </span><span class="kw">pub fn </span>offset() -&gt; usize {
<a href=#120 id=120 data-nosnippet>120</a> <span class="number">0
<a href=#121 id=121 data-nosnippet>121</a> </span>}
<a href=#122 id=122 data-nosnippet>122</a>}
<a href=#123 id=123 data-nosnippet>123</a>
<a href=#124 id=124 data-nosnippet>124</a><span class="kw">impl </span>Prior <span class="kw">for </span>Stride1Prior {
<a href=#125 id=125 data-nosnippet>125</a> <span class="attr">#[inline(always)]
<a href=#126 id=126 data-nosnippet>126</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#127 id=127 data-nosnippet>127</a> stride_byte: u8,
<a href=#128 id=128 data-nosnippet>128</a> selected_context: u8,
<a href=#129 id=129 data-nosnippet>129</a> actual_context: usize,
<a href=#130 id=130 data-nosnippet>130</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#131 id=131 data-nosnippet>131</a> ) -&gt; usize {
<a href=#132 id=132 data-nosnippet>132</a> stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#133 id=133 data-nosnippet>133</a> }
<a href=#134 id=134 data-nosnippet>134</a> <span class="attr">#[inline(always)]
<a href=#135 id=135 data-nosnippet>135</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#136 id=136 data-nosnippet>136</a> WhichPrior::STRIDE1 <span class="kw">as </span>usize
<a href=#137 id=137 data-nosnippet>137</a> }
<a href=#138 id=138 data-nosnippet>138</a>}
<a href=#139 id=139 data-nosnippet>139</a><span class="comment">/*impl StridePrior for Stride1Prior {
<a href=#140 id=140 data-nosnippet>140</a> const STRIDE_OFFSET:usize = 0;
<a href=#141 id=141 data-nosnippet>141</a>}*/
<a href=#142 id=142 data-nosnippet>142</a></span><span class="kw">pub struct </span>Stride2Prior {}
<a href=#143 id=143 data-nosnippet>143</a><span class="kw">impl </span>Stride2Prior {
<a href=#144 id=144 data-nosnippet>144</a> <span class="attr">#[inline(always)]
<a href=#145 id=145 data-nosnippet>145</a> </span><span class="kw">pub fn </span>offset() -&gt; usize {
<a href=#146 id=146 data-nosnippet>146</a> <span class="number">1
<a href=#147 id=147 data-nosnippet>147</a> </span>}
<a href=#148 id=148 data-nosnippet>148</a>}
<a href=#149 id=149 data-nosnippet>149</a>
<a href=#150 id=150 data-nosnippet>150</a><span class="kw">impl </span>Prior <span class="kw">for </span>Stride2Prior {
<a href=#151 id=151 data-nosnippet>151</a> <span class="attr">#[inline(always)]
<a href=#152 id=152 data-nosnippet>152</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#153 id=153 data-nosnippet>153</a> stride_byte: u8,
<a href=#154 id=154 data-nosnippet>154</a> selected_context: u8,
<a href=#155 id=155 data-nosnippet>155</a> actual_context: usize,
<a href=#156 id=156 data-nosnippet>156</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#157 id=157 data-nosnippet>157</a> ) -&gt; usize {
<a href=#158 id=158 data-nosnippet>158</a> stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#159 id=159 data-nosnippet>159</a> }
<a href=#160 id=160 data-nosnippet>160</a> <span class="attr">#[inline]
<a href=#161 id=161 data-nosnippet>161</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#162 id=162 data-nosnippet>162</a> WhichPrior::STRIDE2 <span class="kw">as </span>usize
<a href=#163 id=163 data-nosnippet>163</a> }
<a href=#164 id=164 data-nosnippet>164</a>}
<a href=#165 id=165 data-nosnippet>165</a><span class="comment">/*impl StridePrior for Stride2Prior {
<a href=#166 id=166 data-nosnippet>166</a> const STRIDE_OFFSET:usize = 1;
<a href=#167 id=167 data-nosnippet>167</a>}*/
<a href=#168 id=168 data-nosnippet>168</a></span><span class="kw">pub struct </span>Stride3Prior {}
<a href=#169 id=169 data-nosnippet>169</a><span class="kw">impl </span>Stride3Prior {
<a href=#170 id=170 data-nosnippet>170</a> <span class="attr">#[inline(always)]
<a href=#171 id=171 data-nosnippet>171</a> </span><span class="kw">pub fn </span>offset() -&gt; usize {
<a href=#172 id=172 data-nosnippet>172</a> <span class="number">2
<a href=#173 id=173 data-nosnippet>173</a> </span>}
<a href=#174 id=174 data-nosnippet>174</a>}
<a href=#175 id=175 data-nosnippet>175</a>
<a href=#176 id=176 data-nosnippet>176</a><span class="kw">impl </span>Prior <span class="kw">for </span>Stride3Prior {
<a href=#177 id=177 data-nosnippet>177</a> <span class="attr">#[inline(always)]
<a href=#178 id=178 data-nosnippet>178</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#179 id=179 data-nosnippet>179</a> stride_byte: u8,
<a href=#180 id=180 data-nosnippet>180</a> selected_context: u8,
<a href=#181 id=181 data-nosnippet>181</a> actual_context: usize,
<a href=#182 id=182 data-nosnippet>182</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#183 id=183 data-nosnippet>183</a> ) -&gt; usize {
<a href=#184 id=184 data-nosnippet>184</a> stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#185 id=185 data-nosnippet>185</a> }
<a href=#186 id=186 data-nosnippet>186</a> <span class="attr">#[inline(always)]
<a href=#187 id=187 data-nosnippet>187</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#188 id=188 data-nosnippet>188</a> WhichPrior::STRIDE3 <span class="kw">as </span>usize
<a href=#189 id=189 data-nosnippet>189</a> }
<a href=#190 id=190 data-nosnippet>190</a>}
<a href=#191 id=191 data-nosnippet>191</a>
<a href=#192 id=192 data-nosnippet>192</a><span class="comment">/*impl StridePrior for Stride3Prior {
<a href=#193 id=193 data-nosnippet>193</a> const STRIDE_OFFSET:usize = 2;
<a href=#194 id=194 data-nosnippet>194</a>}*/
<a href=#195 id=195 data-nosnippet>195</a></span><span class="kw">pub struct </span>Stride4Prior {}
<a href=#196 id=196 data-nosnippet>196</a><span class="kw">impl </span>Stride4Prior {
<a href=#197 id=197 data-nosnippet>197</a> <span class="attr">#[inline(always)]
<a href=#198 id=198 data-nosnippet>198</a> </span><span class="kw">pub fn </span>offset() -&gt; usize {
<a href=#199 id=199 data-nosnippet>199</a> <span class="number">3
<a href=#200 id=200 data-nosnippet>200</a> </span>}
<a href=#201 id=201 data-nosnippet>201</a>}
<a href=#202 id=202 data-nosnippet>202</a><span class="kw">impl </span>Prior <span class="kw">for </span>Stride4Prior {
<a href=#203 id=203 data-nosnippet>203</a> <span class="attr">#[inline(always)]
<a href=#204 id=204 data-nosnippet>204</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#205 id=205 data-nosnippet>205</a> stride_byte: u8,
<a href=#206 id=206 data-nosnippet>206</a> selected_context: u8,
<a href=#207 id=207 data-nosnippet>207</a> actual_context: usize,
<a href=#208 id=208 data-nosnippet>208</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#209 id=209 data-nosnippet>209</a> ) -&gt; usize {
<a href=#210 id=210 data-nosnippet>210</a> stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#211 id=211 data-nosnippet>211</a> }
<a href=#212 id=212 data-nosnippet>212</a> <span class="attr">#[inline]
<a href=#213 id=213 data-nosnippet>213</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#214 id=214 data-nosnippet>214</a> WhichPrior::STRIDE4 <span class="kw">as </span>usize
<a href=#215 id=215 data-nosnippet>215</a> }
<a href=#216 id=216 data-nosnippet>216</a>}
<a href=#217 id=217 data-nosnippet>217</a>
<a href=#218 id=218 data-nosnippet>218</a><span class="comment">/*impl StridePrior for Stride4Prior {
<a href=#219 id=219 data-nosnippet>219</a> const STRIDE_OFFSET:usize = 3;
<a href=#220 id=220 data-nosnippet>220</a>}*/
<a href=#221 id=221 data-nosnippet>221</a>/*pub struct Stride8Prior{
<a href=#222 id=222 data-nosnippet>222</a>}
<a href=#223 id=223 data-nosnippet>223</a>impl StridePrior for Stride8Prior {
<a href=#224 id=224 data-nosnippet>224</a> const STRIDE_OFFSET:usize = 7;
<a href=#225 id=225 data-nosnippet>225</a>}
<a href=#226 id=226 data-nosnippet>226</a>impl Stride8Prior {
<a href=#227 id=227 data-nosnippet>227</a> #[inline(always)]
<a href=#228 id=228 data-nosnippet>228</a> pub fn offset() -&gt; usize{
<a href=#229 id=229 data-nosnippet>229</a> 7
<a href=#230 id=230 data-nosnippet>230</a> }
<a href=#231 id=231 data-nosnippet>231</a>}
<a href=#232 id=232 data-nosnippet>232</a>impl Prior for Stride8Prior {
<a href=#233 id=233 data-nosnippet>233</a> fn lookup_lin(stride_byte:u8, selected_context:u8, actual_context:usize, high_nibble: Option&lt;u8&gt;) -&gt; usize {
<a href=#234 id=234 data-nosnippet>234</a> stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#235 id=235 data-nosnippet>235</a> }
<a href=#236 id=236 data-nosnippet>236</a> #[inline]
<a href=#237 id=237 data-nosnippet>237</a> fn which() -&gt; usize {
<a href=#238 id=238 data-nosnippet>238</a> WhichPrior::STRIDE8 as usize
<a href=#239 id=239 data-nosnippet>239</a> }
<a href=#240 id=240 data-nosnippet>240</a>}
<a href=#241 id=241 data-nosnippet>241</a>*/
<a href=#242 id=242 data-nosnippet>242</a></span><span class="kw">pub struct </span>CMPrior {}
<a href=#243 id=243 data-nosnippet>243</a><span class="kw">impl </span>Prior <span class="kw">for </span>CMPrior {
<a href=#244 id=244 data-nosnippet>244</a> <span class="attr">#[allow(unused_variables)]
<a href=#245 id=245 data-nosnippet>245</a> #[inline(always)]
<a href=#246 id=246 data-nosnippet>246</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#247 id=247 data-nosnippet>247</a> stride_byte: u8,
<a href=#248 id=248 data-nosnippet>248</a> selected_context: u8,
<a href=#249 id=249 data-nosnippet>249</a> actual_context: usize,
<a href=#250 id=250 data-nosnippet>250</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#251 id=251 data-nosnippet>251</a> ) -&gt; usize {
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#253 id=253 data-nosnippet>253</a> (nibble <span class="kw">as </span>usize + <span class="number">1</span>) + <span class="number">17 </span>* actual_context
<a href=#254 id=254 data-nosnippet>254</a> } <span class="kw">else </span>{
<a href=#255 id=255 data-nosnippet>255</a> <span class="number">17 </span>* actual_context
<a href=#256 id=256 data-nosnippet>256</a> }
<a href=#257 id=257 data-nosnippet>257</a> }
<a href=#258 id=258 data-nosnippet>258</a> <span class="attr">#[inline(always)]
<a href=#259 id=259 data-nosnippet>259</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#260 id=260 data-nosnippet>260</a> WhichPrior::CM <span class="kw">as </span>usize
<a href=#261 id=261 data-nosnippet>261</a> }
<a href=#262 id=262 data-nosnippet>262</a>}
<a href=#263 id=263 data-nosnippet>263</a><span class="kw">pub struct </span>FastCMPrior {}
<a href=#264 id=264 data-nosnippet>264</a><span class="kw">impl </span>Prior <span class="kw">for </span>FastCMPrior {
<a href=#265 id=265 data-nosnippet>265</a> <span class="attr">#[allow(unused_variables)]
<a href=#266 id=266 data-nosnippet>266</a> #[inline(always)]
<a href=#267 id=267 data-nosnippet>267</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#268 id=268 data-nosnippet>268</a> stride_byte: u8,
<a href=#269 id=269 data-nosnippet>269</a> selected_context: u8,
<a href=#270 id=270 data-nosnippet>270</a> actual_context: usize,
<a href=#271 id=271 data-nosnippet>271</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#272 id=272 data-nosnippet>272</a> ) -&gt; usize {
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#274 id=274 data-nosnippet>274</a> <span class="number">2 </span>* actual_context
<a href=#275 id=275 data-nosnippet>275</a> } <span class="kw">else </span>{
<a href=#276 id=276 data-nosnippet>276</a> <span class="number">2 </span>* actual_context + <span class="number">1
<a href=#277 id=277 data-nosnippet>277</a> </span>}
<a href=#278 id=278 data-nosnippet>278</a> }
<a href=#279 id=279 data-nosnippet>279</a> <span class="attr">#[inline(always)]
<a href=#280 id=280 data-nosnippet>280</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#281 id=281 data-nosnippet>281</a> WhichPrior::FAST_CM <span class="kw">as </span>usize
<a href=#282 id=282 data-nosnippet>282</a> }
<a href=#283 id=283 data-nosnippet>283</a>}
<a href=#284 id=284 data-nosnippet>284</a>
<a href=#285 id=285 data-nosnippet>285</a><span class="kw">pub struct </span>SlowCMPrior {}
<a href=#286 id=286 data-nosnippet>286</a><span class="kw">impl </span>Prior <span class="kw">for </span>SlowCMPrior {
<a href=#287 id=287 data-nosnippet>287</a> <span class="attr">#[allow(unused_variables)]
<a href=#288 id=288 data-nosnippet>288</a> #[inline(always)]
<a href=#289 id=289 data-nosnippet>289</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#290 id=290 data-nosnippet>290</a> stride_byte: u8,
<a href=#291 id=291 data-nosnippet>291</a> selected_context: u8,
<a href=#292 id=292 data-nosnippet>292</a> actual_context: usize,
<a href=#293 id=293 data-nosnippet>293</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#294 id=294 data-nosnippet>294</a> ) -&gt; usize {
<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#296 id=296 data-nosnippet>296</a> (nibble <span class="kw">as </span>usize + <span class="number">1</span>) + <span class="number">17 </span>* actual_context
<a href=#297 id=297 data-nosnippet>297</a> } <span class="kw">else </span>{
<a href=#298 id=298 data-nosnippet>298</a> <span class="number">17 </span>* actual_context
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a> }
<a href=#301 id=301 data-nosnippet>301</a> <span class="attr">#[inline]
<a href=#302 id=302 data-nosnippet>302</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#303 id=303 data-nosnippet>303</a> WhichPrior::SLOW_CM <span class="kw">as </span>usize
<a href=#304 id=304 data-nosnippet>304</a> }
<a href=#305 id=305 data-nosnippet>305</a>}
<a href=#306 id=306 data-nosnippet>306</a>
<a href=#307 id=307 data-nosnippet>307</a><span class="kw">pub struct </span>AdvPrior {}
<a href=#308 id=308 data-nosnippet>308</a><span class="kw">impl </span>Prior <span class="kw">for </span>AdvPrior {
<a href=#309 id=309 data-nosnippet>309</a> <span class="attr">#[allow(unused_variables)]
<a href=#310 id=310 data-nosnippet>310</a> #[inline(always)]
<a href=#311 id=311 data-nosnippet>311</a> </span><span class="kw">fn </span>lookup_lin(
<a href=#312 id=312 data-nosnippet>312</a> stride_byte: u8,
<a href=#313 id=313 data-nosnippet>313</a> selected_context: u8,
<a href=#314 id=314 data-nosnippet>314</a> actual_context: usize,
<a href=#315 id=315 data-nosnippet>315</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#316 id=316 data-nosnippet>316</a> ) -&gt; usize {
<a href=#317 id=317 data-nosnippet>317</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#318 id=318 data-nosnippet>318</a> <span class="number">65536
<a href=#319 id=319 data-nosnippet>319</a> </span>+ (actual_context | ((stride_byte <span class="kw">as </span>usize) &lt;&lt; <span class="number">8</span>) | ((nibble <span class="kw">as </span>usize &amp; <span class="number">0xf</span>) &lt;&lt; <span class="number">16</span>))
<a href=#320 id=320 data-nosnippet>320</a> } <span class="kw">else </span>{
<a href=#321 id=321 data-nosnippet>321</a> actual_context | ((stride_byte <span class="kw">as </span>usize &amp; <span class="number">0xf0</span>) &lt;&lt; <span class="number">8</span>)
<a href=#322 id=322 data-nosnippet>322</a> }
<a href=#323 id=323 data-nosnippet>323</a> }
<a href=#324 id=324 data-nosnippet>324</a> <span class="attr">#[inline(always)]
<a href=#325 id=325 data-nosnippet>325</a> </span><span class="kw">fn </span>which() -&gt; usize {
<a href=#326 id=326 data-nosnippet>326</a> WhichPrior::ADV <span class="kw">as </span>usize
<a href=#327 id=327 data-nosnippet>327</a> }
<a href=#328 id=328 data-nosnippet>328</a>}
<a href=#329 id=329 data-nosnippet>329</a>
<a href=#330 id=330 data-nosnippet>330</a><span class="kw">pub struct </span>CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#331 id=331 data-nosnippet>331</a> cdf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>s16,
<a href=#332 id=332 data-nosnippet>332</a>}
<a href=#333 id=333 data-nosnippet>333</a>
<a href=#334 id=334 data-nosnippet>334</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#335 id=335 data-nosnippet>335</a> <span class="attr">#[inline(always)]
<a href=#336 id=336 data-nosnippet>336</a> </span><span class="kw">pub fn </span>cost(<span class="kw-2">&amp;</span><span class="self">self</span>, nibble_u8: u8) -&gt; floatX {
<a href=#337 id=337 data-nosnippet>337</a> <span class="kw">let </span>nibble = nibble_u8 <span class="kw">as </span>usize &amp; <span class="number">0xf</span>;
<a href=#338 id=338 data-nosnippet>338</a> <span class="kw">let </span><span class="kw-2">mut </span>pdf = <span class="self">self</span>.cdf[nibble];
<a href=#339 id=339 data-nosnippet>339</a> <span class="kw">if </span><span class="macro">nibble_u8 !</span>= <span class="number">0 </span>{
<a href=#340 id=340 data-nosnippet>340</a> pdf -= <span class="self">self</span>.cdf[(nibble - <span class="number">1</span>)];
<a href=#341 id=341 data-nosnippet>341</a> }
<a href=#342 id=342 data-nosnippet>342</a> FastLog2u16(<span class="self">self</span>.cdf[<span class="number">15</span>] <span class="kw">as </span>u16) - FastLog2u16(pdf <span class="kw">as </span>u16)
<a href=#343 id=343 data-nosnippet>343</a> }
<a href=#344 id=344 data-nosnippet>344</a> <span class="attr">#[inline(always)]
<a href=#345 id=345 data-nosnippet>345</a> </span><span class="kw">pub fn </span>update(<span class="kw-2">&amp;mut </span><span class="self">self</span>, nibble_u8: u8, speed: (u16, u16)) {
<a href=#346 id=346 data-nosnippet>346</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = <span class="kw-2">*</span><span class="self">self</span>.cdf;
<a href=#347 id=347 data-nosnippet>347</a> <span class="kw">let </span>increment_v = s16::splat(speed.<span class="number">0 </span><span class="kw">as </span>i16);
<a href=#348 id=348 data-nosnippet>348</a> <span class="kw">let </span>one_to_16 = s16::from([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>]);
<a href=#349 id=349 data-nosnippet>349</a> <span class="kw">let </span>mask_v: s16 = one_to_16.simd_gt(s16::splat(i16::from(nibble_u8))).to_int();
<a href=#350 id=350 data-nosnippet>350</a> cdf = cdf + (increment_v &amp; mask_v);
<a href=#351 id=351 data-nosnippet>351</a> <span class="kw">if </span>cdf[<span class="number">15</span>] &gt;= speed.<span class="number">1 </span><span class="kw">as </span>i16 {
<a href=#352 id=352 data-nosnippet>352</a> <span class="kw">let </span>cdf_bias = one_to_16;
<a href=#353 id=353 data-nosnippet>353</a> cdf = cdf + cdf_bias - ((cdf + cdf_bias) &gt;&gt; <span class="number">2</span>);
<a href=#354 id=354 data-nosnippet>354</a> }
<a href=#355 id=355 data-nosnippet>355</a> <span class="kw-2">*</span><span class="self">self</span>.cdf = cdf;
<a href=#356 id=356 data-nosnippet>356</a> }
<a href=#357 id=357 data-nosnippet>357</a>}
<a href=#358 id=358 data-nosnippet>358</a>
<a href=#359 id=359 data-nosnippet>359</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>s16&gt; <span class="kw">for </span>CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#360 id=360 data-nosnippet>360</a> <span class="attr">#[inline(always)]
<a href=#361 id=361 data-nosnippet>361</a> </span><span class="kw">fn </span>from(cdf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>s16) -&gt; CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#362 id=362 data-nosnippet>362</a> CDF { cdf }
<a href=#363 id=363 data-nosnippet>363</a> }
<a href=#364 id=364 data-nosnippet>364</a>}
<a href=#365 id=365 data-nosnippet>365</a>
<a href=#366 id=366 data-nosnippet>366</a><span class="kw">pub fn </span>init_cdfs(cdfs: <span class="kw-2">&amp;mut </span>[s16]) {
<a href=#367 id=367 data-nosnippet>367</a> <span class="kw">for </span>item <span class="kw">in </span>cdfs.iter_mut() {
<a href=#368 id=368 data-nosnippet>368</a> <span class="kw-2">*</span>item = s16::from([<span class="number">4</span>, <span class="number">8</span>, <span class="number">12</span>, <span class="number">16</span>, <span class="number">20</span>, <span class="number">24</span>, <span class="number">28</span>, <span class="number">32</span>, <span class="number">36</span>, <span class="number">40</span>, <span class="number">44</span>, <span class="number">48</span>, <span class="number">52</span>, <span class="number">56</span>, <span class="number">60</span>, <span class="number">64</span>]);
<a href=#369 id=369 data-nosnippet>369</a> }
<a href=#370 id=370 data-nosnippet>370</a>}
<a href=#371 id=371 data-nosnippet>371</a>
<a href=#372 id=372 data-nosnippet>372</a><span class="kw">pub struct </span>PriorEval&lt;
<a href=#373 id=373 data-nosnippet>373</a> <span class="lifetime">'a</span>,
<a href=#374 id=374 data-nosnippet>374</a> Alloc: alloc::Allocator&lt;s16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;v8&gt;,
<a href=#375 id=375 data-nosnippet>375</a>&gt; {
<a href=#376 id=376 data-nosnippet>376</a> input: InputPair&lt;<span class="lifetime">'a</span>&gt;,
<a href=#377 id=377 data-nosnippet>377</a> context_map: interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#378 id=378 data-nosnippet>378</a> block_type: u8,
<a href=#379 id=379 data-nosnippet>379</a> local_byte_offset: usize,
<a href=#380 id=380 data-nosnippet>380</a> _nop: &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory,
<a href=#381 id=381 data-nosnippet>381</a> cm_priors: &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::AllocatedMemory,
<a href=#382 id=382 data-nosnippet>382</a> slow_cm_priors: &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::AllocatedMemory,
<a href=#383 id=383 data-nosnippet>383</a> fast_cm_priors: &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::AllocatedMemory,
<a href=#384 id=384 data-nosnippet>384</a> stride_priors: [&lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::AllocatedMemory; <span class="number">4</span>],
<a href=#385 id=385 data-nosnippet>385</a> adv_priors: &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::AllocatedMemory,
<a href=#386 id=386 data-nosnippet>386</a> _stride_pyramid_leaves: [u8; find_stride::NUM_LEAF_NODES],
<a href=#387 id=387 data-nosnippet>387</a> score: &lt;Alloc <span class="kw">as </span>Allocator&lt;v8&gt;&gt;::AllocatedMemory,
<a href=#388 id=388 data-nosnippet>388</a> cm_speed: [(u16, u16); <span class="number">2</span>],
<a href=#389 id=389 data-nosnippet>389</a> stride_speed: [(u16, u16); <span class="number">2</span>],
<a href=#390 id=390 data-nosnippet>390</a> cur_stride: u8,
<a href=#391 id=391 data-nosnippet>391</a>}
<a href=#392 id=392 data-nosnippet>392</a>
<a href=#393 id=393 data-nosnippet>393</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;s16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;v8&gt;&gt;
<a href=#394 id=394 data-nosnippet>394</a> PriorEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#395 id=395 data-nosnippet>395</a>{
<a href=#396 id=396 data-nosnippet>396</a> <span class="kw">pub fn </span>new(
<a href=#397 id=397 data-nosnippet>397</a> alloc: <span class="kw-2">&amp;mut </span>Alloc,
<a href=#398 id=398 data-nosnippet>398</a> input: InputPair&lt;<span class="lifetime">'a</span>&gt;,
<a href=#399 id=399 data-nosnippet>399</a> stride: [u8; find_stride::NUM_LEAF_NODES],
<a href=#400 id=400 data-nosnippet>400</a> prediction_mode: interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#401 id=401 data-nosnippet>401</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#402 id=402 data-nosnippet>402</a> ) -&gt; <span class="self">Self </span>{
<a href=#403 id=403 data-nosnippet>403</a> <span class="kw">let </span>do_alloc = params.<span class="macro">prior_bitmask_detection !</span>= <span class="number">0</span>;
<a href=#404 id=404 data-nosnippet>404</a> <span class="kw">let </span><span class="kw-2">mut </span>cm_speed = prediction_mode.context_map_speed();
<a href=#405 id=405 data-nosnippet>405</a> <span class="kw">let </span><span class="kw-2">mut </span>stride_speed = prediction_mode.stride_context_speed();
<a href=#406 id=406 data-nosnippet>406</a> <span class="kw">if </span>cm_speed[<span class="number">0</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#407 id=407 data-nosnippet>407</a> cm_speed[<span class="number">0</span>] = params.literal_adaptation[<span class="number">2</span>]
<a href=#408 id=408 data-nosnippet>408</a> }
<a href=#409 id=409 data-nosnippet>409</a> <span class="kw">if </span>cm_speed[<span class="number">0</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#410 id=410 data-nosnippet>410</a> cm_speed[<span class="number">0</span>] = DEFAULT_SPEED;
<a href=#411 id=411 data-nosnippet>411</a> }
<a href=#412 id=412 data-nosnippet>412</a> <span class="kw">if </span>cm_speed[<span class="number">1</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#413 id=413 data-nosnippet>413</a> cm_speed[<span class="number">1</span>] = params.literal_adaptation[<span class="number">3</span>]
<a href=#414 id=414 data-nosnippet>414</a> }
<a href=#415 id=415 data-nosnippet>415</a> <span class="kw">if </span>cm_speed[<span class="number">1</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#416 id=416 data-nosnippet>416</a> cm_speed[<span class="number">1</span>] = cm_speed[<span class="number">0</span>];
<a href=#417 id=417 data-nosnippet>417</a> }
<a href=#418 id=418 data-nosnippet>418</a> <span class="kw">if </span>stride_speed[<span class="number">0</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#419 id=419 data-nosnippet>419</a> stride_speed[<span class="number">0</span>] = params.literal_adaptation[<span class="number">0</span>]
<a href=#420 id=420 data-nosnippet>420</a> }
<a href=#421 id=421 data-nosnippet>421</a> <span class="kw">if </span>stride_speed[<span class="number">0</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#422 id=422 data-nosnippet>422</a> stride_speed[<span class="number">0</span>] = DEFAULT_SPEED;
<a href=#423 id=423 data-nosnippet>423</a> }
<a href=#424 id=424 data-nosnippet>424</a> <span class="kw">if </span>stride_speed[<span class="number">1</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#425 id=425 data-nosnippet>425</a> stride_speed[<span class="number">1</span>] = params.literal_adaptation[<span class="number">1</span>]
<a href=#426 id=426 data-nosnippet>426</a> }
<a href=#427 id=427 data-nosnippet>427</a> <span class="kw">if </span>stride_speed[<span class="number">1</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#428 id=428 data-nosnippet>428</a> stride_speed[<span class="number">1</span>] = stride_speed[<span class="number">0</span>];
<a href=#429 id=429 data-nosnippet>429</a> }
<a href=#430 id=430 data-nosnippet>430</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = PriorEval::&lt;Alloc&gt; {
<a href=#431 id=431 data-nosnippet>431</a> input,
<a href=#432 id=432 data-nosnippet>432</a> context_map: prediction_mode,
<a href=#433 id=433 data-nosnippet>433</a> block_type: <span class="number">0</span>,
<a href=#434 id=434 data-nosnippet>434</a> cur_stride: <span class="number">1</span>,
<a href=#435 id=435 data-nosnippet>435</a> local_byte_offset: <span class="number">0</span>,
<a href=#436 id=436 data-nosnippet>436</a> _nop: alloc_default::&lt;u32, Alloc&gt;(),
<a href=#437 id=437 data-nosnippet>437</a> cm_priors: alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, CONTEXT_MAP_PRIOR_SIZE),
<a href=#438 id=438 data-nosnippet>438</a> slow_cm_priors: alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, CONTEXT_MAP_PRIOR_SIZE),
<a href=#439 id=439 data-nosnippet>439</a> fast_cm_priors: alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, CONTEXT_MAP_PRIOR_SIZE),
<a href=#440 id=440 data-nosnippet>440</a> stride_priors: [
<a href=#441 id=441 data-nosnippet>441</a> alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, STRIDE_PRIOR_SIZE),
<a href=#442 id=442 data-nosnippet>442</a> alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, STRIDE_PRIOR_SIZE),
<a href=#443 id=443 data-nosnippet>443</a> alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, STRIDE_PRIOR_SIZE),
<a href=#444 id=444 data-nosnippet>444</a> alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, STRIDE_PRIOR_SIZE),
<a href=#445 id=445 data-nosnippet>445</a> <span class="comment">/*if do_alloc {m16x16.alloc_cell(STRIDE_PRIOR_SIZE)} else {
<a href=#446 id=446 data-nosnippet>446</a> Alloc16x16::AllocatedMemory::default()},*/
<a href=#447 id=447 data-nosnippet>447</a> </span>],
<a href=#448 id=448 data-nosnippet>448</a> adv_priors: alloc_if::&lt;s16, <span class="kw">_</span>&gt;(do_alloc, alloc, ADV_PRIOR_SIZE),
<a href=#449 id=449 data-nosnippet>449</a> _stride_pyramid_leaves: stride,
<a href=#450 id=450 data-nosnippet>450</a> score: alloc_if::&lt;v8, <span class="kw">_</span>&gt;(do_alloc, alloc, <span class="number">8192</span>),
<a href=#451 id=451 data-nosnippet>451</a> cm_speed,
<a href=#452 id=452 data-nosnippet>452</a> stride_speed,
<a href=#453 id=453 data-nosnippet>453</a> };
<a href=#454 id=454 data-nosnippet>454</a> init_cdfs(ret.cm_priors.slice_mut());
<a href=#455 id=455 data-nosnippet>455</a> init_cdfs(ret.slow_cm_priors.slice_mut());
<a href=#456 id=456 data-nosnippet>456</a> init_cdfs(ret.fast_cm_priors.slice_mut());
<a href=#457 id=457 data-nosnippet>457</a> init_cdfs(ret.stride_priors[<span class="number">0</span>].slice_mut());
<a href=#458 id=458 data-nosnippet>458</a> init_cdfs(ret.stride_priors[<span class="number">1</span>].slice_mut());
<a href=#459 id=459 data-nosnippet>459</a> init_cdfs(ret.stride_priors[<span class="number">2</span>].slice_mut());
<a href=#460 id=460 data-nosnippet>460</a> init_cdfs(ret.stride_priors[<span class="number">3</span>].slice_mut());
<a href=#461 id=461 data-nosnippet>461</a> <span class="comment">//init_cdfs(ret.stride_priors[4].slice_mut());
<a href=#462 id=462 data-nosnippet>462</a> </span>init_cdfs(ret.adv_priors.slice_mut());
<a href=#463 id=463 data-nosnippet>463</a> ret
<a href=#464 id=464 data-nosnippet>464</a> }
<a href=#465 id=465 data-nosnippet>465</a> <span class="kw">pub fn </span>choose_bitmask(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#466 id=466 data-nosnippet>466</a> <span class="kw">let </span>epsilon = <span class="number">6.0</span>;
<a href=#467 id=467 data-nosnippet>467</a> <span class="kw">let </span><span class="kw-2">mut </span>max_popularity = <span class="number">0u32</span>;
<a href=#468 id=468 data-nosnippet>468</a> <span class="kw">let </span><span class="kw-2">mut </span>max_popularity_index = <span class="number">0u8</span>;
<a href=#469 id=469 data-nosnippet>469</a> <span class="macro">assert_eq!</span>(WhichPrior::NUM_PRIORS <span class="kw">as </span>usize, <span class="number">8</span>);
<a href=#470 id=470 data-nosnippet>470</a> <span class="kw">let </span><span class="kw-2">mut </span>popularity = [<span class="number">0u32</span>; <span class="number">8</span>];
<a href=#471 id=471 data-nosnippet>471</a> <span class="kw">let </span><span class="kw-2">mut </span>bitmask = [<span class="number">0u8</span>; <span class="kw">super</span>::interface::NUM_MIXING_VALUES];
<a href=#472 id=472 data-nosnippet>472</a> <span class="kw">for </span>(i, score) <span class="kw">in </span><span class="self">self</span>.score.slice().iter().enumerate() {
<a href=#473 id=473 data-nosnippet>473</a> <span class="kw">let </span>cm_score = score[WhichPrior::CM <span class="kw">as </span>usize];
<a href=#474 id=474 data-nosnippet>474</a> <span class="kw">let </span>slow_cm_score = score[WhichPrior::SLOW_CM <span class="kw">as </span>usize];
<a href=#475 id=475 data-nosnippet>475</a> <span class="kw">let </span>fast_cm_score = score[WhichPrior::FAST_CM <span class="kw">as </span>usize] + <span class="number">16.0</span>;
<a href=#476 id=476 data-nosnippet>476</a> <span class="kw">let </span>stride1_score = score[WhichPrior::STRIDE1 <span class="kw">as </span>usize];
<a href=#477 id=477 data-nosnippet>477</a> <span class="kw">let </span>stride2_score = score[WhichPrior::STRIDE2 <span class="kw">as </span>usize];
<a href=#478 id=478 data-nosnippet>478</a> <span class="kw">let </span>stride3_score = score[WhichPrior::STRIDE3 <span class="kw">as </span>usize] + <span class="number">16.0</span>;
<a href=#479 id=479 data-nosnippet>479</a> <span class="kw">let </span>stride4_score = score[WhichPrior::STRIDE4 <span class="kw">as </span>usize];
<a href=#480 id=480 data-nosnippet>480</a> <span class="comment">//let stride8_score = score[WhichPrior::STRIDE8] * 1.125 + 16.0;
<a href=#481 id=481 data-nosnippet>481</a> </span><span class="kw">let </span>stride8_score = stride4_score + <span class="number">1.0</span>; <span class="comment">// FIXME: never lowest -- ignore stride 8
<a href=#482 id=482 data-nosnippet>482</a> </span><span class="kw">let </span>stride_score = min(
<a href=#483 id=483 data-nosnippet>483</a> stride1_score <span class="kw">as </span>u64,
<a href=#484 id=484 data-nosnippet>484</a> min(
<a href=#485 id=485 data-nosnippet>485</a> stride2_score <span class="kw">as </span>u64,
<a href=#486 id=486 data-nosnippet>486</a> min(
<a href=#487 id=487 data-nosnippet>487</a> stride3_score <span class="kw">as </span>u64,
<a href=#488 id=488 data-nosnippet>488</a> min(stride4_score <span class="kw">as </span>u64, stride8_score <span class="kw">as </span>u64),
<a href=#489 id=489 data-nosnippet>489</a> ),
<a href=#490 id=490 data-nosnippet>490</a> ),
<a href=#491 id=491 data-nosnippet>491</a> );
<a href=#492 id=492 data-nosnippet>492</a>
<a href=#493 id=493 data-nosnippet>493</a> <span class="kw">let </span>adv_score = score[WhichPrior::ADV <span class="kw">as </span>usize];
<a href=#494 id=494 data-nosnippet>494</a> <span class="kw">if </span>adv_score + epsilon &lt; (stride_score <span class="kw">as </span>floatX)
<a href=#495 id=495 data-nosnippet>495</a> &amp;&amp; adv_score + epsilon &lt; cm_score
<a href=#496 id=496 data-nosnippet>496</a> &amp;&amp; adv_score + epsilon &lt; slow_cm_score
<a href=#497 id=497 data-nosnippet>497</a> &amp;&amp; adv_score + epsilon &lt; fast_cm_score
<a href=#498 id=498 data-nosnippet>498</a> {
<a href=#499 id=499 data-nosnippet>499</a> bitmask[i] = <span class="number">1</span>;
<a href=#500 id=500 data-nosnippet>500</a> } <span class="kw">else if </span>slow_cm_score + epsilon &lt; (stride_score <span class="kw">as </span>floatX)
<a href=#501 id=501 data-nosnippet>501</a> &amp;&amp; slow_cm_score + epsilon &lt; cm_score
<a href=#502 id=502 data-nosnippet>502</a> &amp;&amp; slow_cm_score + epsilon &lt; fast_cm_score
<a href=#503 id=503 data-nosnippet>503</a> {
<a href=#504 id=504 data-nosnippet>504</a> bitmask[i] = <span class="number">2</span>;
<a href=#505 id=505 data-nosnippet>505</a> } <span class="kw">else if </span>fast_cm_score + epsilon &lt; (stride_score <span class="kw">as </span>floatX)
<a href=#506 id=506 data-nosnippet>506</a> &amp;&amp; fast_cm_score + epsilon &lt; cm_score
<a href=#507 id=507 data-nosnippet>507</a> {
<a href=#508 id=508 data-nosnippet>508</a> bitmask[i] = <span class="number">3</span>;
<a href=#509 id=509 data-nosnippet>509</a> } <span class="kw">else if </span>epsilon + (stride_score <span class="kw">as </span>floatX) &lt; cm_score {
<a href=#510 id=510 data-nosnippet>510</a> bitmask[i] = WhichPrior::STRIDE1 <span class="kw">as </span>u8;
<a href=#511 id=511 data-nosnippet>511</a> <span class="kw">if </span>stride_score == stride8_score <span class="kw">as </span>u64 {
<a href=#512 id=512 data-nosnippet>512</a> <span class="comment">//bitmask[i] = WhichPrior::STRIDE8 as u8;
<a href=#513 id=513 data-nosnippet>513</a> </span>}
<a href=#514 id=514 data-nosnippet>514</a> <span class="kw">if </span>stride_score == stride4_score <span class="kw">as </span>u64 {
<a href=#515 id=515 data-nosnippet>515</a> bitmask[i] = WhichPrior::STRIDE4 <span class="kw">as </span>u8;
<a href=#516 id=516 data-nosnippet>516</a> }
<a href=#517 id=517 data-nosnippet>517</a> <span class="kw">if </span>stride_score == stride3_score <span class="kw">as </span>u64 {
<a href=#518 id=518 data-nosnippet>518</a> bitmask[i] = WhichPrior::STRIDE3 <span class="kw">as </span>u8;
<a href=#519 id=519 data-nosnippet>519</a> }
<a href=#520 id=520 data-nosnippet>520</a> <span class="kw">if </span>stride_score == stride2_score <span class="kw">as </span>u64 {
<a href=#521 id=521 data-nosnippet>521</a> bitmask[i] = WhichPrior::STRIDE2 <span class="kw">as </span>u8;
<a href=#522 id=522 data-nosnippet>522</a> }
<a href=#523 id=523 data-nosnippet>523</a> <span class="kw">if </span>stride_score == stride1_score <span class="kw">as </span>u64 {
<a href=#524 id=524 data-nosnippet>524</a> bitmask[i] = WhichPrior::STRIDE1 <span class="kw">as </span>u8;
<a href=#525 id=525 data-nosnippet>525</a> }
<a href=#526 id=526 data-nosnippet>526</a> } <span class="kw">else </span>{
<a href=#527 id=527 data-nosnippet>527</a> bitmask[i] = <span class="number">0</span>;
<a href=#528 id=528 data-nosnippet>528</a> }
<a href=#529 id=529 data-nosnippet>529</a> <span class="kw">if </span>stride_score == <span class="number">0 </span>{
<a href=#530 id=530 data-nosnippet>530</a> bitmask[i] = max_popularity_index;
<a href=#531 id=531 data-nosnippet>531</a> <span class="comment">//eprintln!("Miss {}[{}] ~ {}", bitmask[i], i, max_popularity_index);
<a href=#532 id=532 data-nosnippet>532</a> </span>} <span class="kw">else </span>{
<a href=#533 id=533 data-nosnippet>533</a> popularity[bitmask[i] <span class="kw">as </span>usize] += <span class="number">1</span>;
<a href=#534 id=534 data-nosnippet>534</a> <span class="kw">if </span>popularity[bitmask[i] <span class="kw">as </span>usize] &gt; max_popularity {
<a href=#535 id=535 data-nosnippet>535</a> max_popularity = popularity[bitmask[i] <span class="kw">as </span>usize];
<a href=#536 id=536 data-nosnippet>536</a> max_popularity_index = bitmask[i];
<a href=#537 id=537 data-nosnippet>537</a> }
<a href=#538 id=538 data-nosnippet>538</a> <span class="comment">//eprintln!("Score {} {} {} {} {}: {}[{}] max={},{}", cm_score, adv_score, slow_cm_score, fast_cm_score, stride_score, bitmask[i], i, max_popularity, max_popularity_index);
<a href=#539 id=539 data-nosnippet>539</a> </span>}
<a href=#540 id=540 data-nosnippet>540</a> }
<a href=#541 id=541 data-nosnippet>541</a> <span class="self">self</span>.context_map.set_mixing_values(<span class="kw-2">&amp;</span>bitmask);
<a href=#542 id=542 data-nosnippet>542</a> }
<a href=#543 id=543 data-nosnippet>543</a> <span class="kw">pub fn </span>free(<span class="kw-2">&amp;mut </span><span class="self">self</span>, alloc: <span class="kw-2">&amp;mut </span>Alloc) {
<a href=#544 id=544 data-nosnippet>544</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;v8&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.score));
<a href=#545 id=545 data-nosnippet>545</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.cm_priors));
<a href=#546 id=546 data-nosnippet>546</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.slow_cm_priors));
<a href=#547 id=547 data-nosnippet>547</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.fast_cm_priors));
<a href=#548 id=548 data-nosnippet>548</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.stride_priors[<span class="number">0</span>]));
<a href=#549 id=549 data-nosnippet>549</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.stride_priors[<span class="number">1</span>]));
<a href=#550 id=550 data-nosnippet>550</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.stride_priors[<span class="number">2</span>]));
<a href=#551 id=551 data-nosnippet>551</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.stride_priors[<span class="number">3</span>]));
<a href=#552 id=552 data-nosnippet>552</a> <span class="comment">//&lt;Alloc as Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::replace(&amp;mut self.stride_priors[4], alloc_default::&lt;s16, Alloc&gt;()));
<a href=#553 id=553 data-nosnippet>553</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;s16&gt;&gt;::free_cell(alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.adv_priors));
<a href=#554 id=554 data-nosnippet>554</a> }
<a href=#555 id=555 data-nosnippet>555</a>
<a href=#556 id=556 data-nosnippet>556</a> <span class="kw">pub fn </span>take_prediction_mode(
<a href=#557 id=557 data-nosnippet>557</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#558 id=558 data-nosnippet>558</a> ) -&gt; interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#559 id=559 data-nosnippet>559</a> core::mem::replace(
<a href=#560 id=560 data-nosnippet>560</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.context_map,
<a href=#561 id=561 data-nosnippet>561</a> interface::PredictionModeContextMap::&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt; {
<a href=#562 id=562 data-nosnippet>562</a> literal_context_map: InputReferenceMut::default(),
<a href=#563 id=563 data-nosnippet>563</a> predmode_speed_and_distance_context_map: InputReferenceMut::default(),
<a href=#564 id=564 data-nosnippet>564</a> },
<a href=#565 id=565 data-nosnippet>565</a> )
<a href=#566 id=566 data-nosnippet>566</a> }
<a href=#567 id=567 data-nosnippet>567</a> <span class="kw">fn </span>update_cost_base(
<a href=#568 id=568 data-nosnippet>568</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#569 id=569 data-nosnippet>569</a> stride_prior: [u8; <span class="number">8</span>],
<a href=#570 id=570 data-nosnippet>570</a> stride_prior_offset: usize,
<a href=#571 id=571 data-nosnippet>571</a> selected_bits: u8,
<a href=#572 id=572 data-nosnippet>572</a> cm_prior: usize,
<a href=#573 id=573 data-nosnippet>573</a> literal: u8,
<a href=#574 id=574 data-nosnippet>574</a> ) {
<a href=#575 id=575 data-nosnippet>575</a> <span class="kw">let </span><span class="kw-2">mut </span>l_score = v8::splat(<span class="number">0.0</span>);
<a href=#576 id=576 data-nosnippet>576</a> <span class="kw">let </span><span class="kw-2">mut </span>h_score = v8::splat(<span class="number">0.0</span>);
<a href=#577 id=577 data-nosnippet>577</a> <span class="kw">let </span>base_stride_prior =
<a href=#578 id=578 data-nosnippet>578</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="self">self</span>.cur_stride <span class="kw">as </span>usize) &amp; <span class="number">7</span>];
<a href=#579 id=579 data-nosnippet>579</a> <span class="kw">let </span>hscore_index = upper_score_index(base_stride_prior, selected_bits, cm_prior);
<a href=#580 id=580 data-nosnippet>580</a> <span class="kw">let </span>lscore_index =
<a href=#581 id=581 data-nosnippet>581</a> lower_score_index(base_stride_prior, selected_bits, cm_prior, literal &gt;&gt; <span class="number">4</span>);
<a href=#582 id=582 data-nosnippet>582</a> {
<a href=#583 id=583 data-nosnippet>583</a> <span class="kw">type </span>CurPrior = CMPrior;
<a href=#584 id=584 data-nosnippet>584</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#585 id=585 data-nosnippet>585</a> <span class="self">self</span>.cm_priors.slice_mut(),
<a href=#586 id=586 data-nosnippet>586</a> base_stride_prior,
<a href=#587 id=587 data-nosnippet>587</a> selected_bits,
<a href=#588 id=588 data-nosnippet>588</a> cm_prior,
<a href=#589 id=589 data-nosnippet>589</a> <span class="prelude-val">None</span>,
<a href=#590 id=590 data-nosnippet>590</a> );
<a href=#591 id=591 data-nosnippet>591</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#592 id=592 data-nosnippet>592</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.cm_speed[<span class="number">1</span>]);
<a href=#593 id=593 data-nosnippet>593</a> }
<a href=#594 id=594 data-nosnippet>594</a> {
<a href=#595 id=595 data-nosnippet>595</a> <span class="kw">type </span>CurPrior = CMPrior;
<a href=#596 id=596 data-nosnippet>596</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#597 id=597 data-nosnippet>597</a> <span class="self">self</span>.cm_priors.slice_mut(),
<a href=#598 id=598 data-nosnippet>598</a> base_stride_prior,
<a href=#599 id=599 data-nosnippet>599</a> selected_bits,
<a href=#600 id=600 data-nosnippet>600</a> cm_prior,
<a href=#601 id=601 data-nosnippet>601</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#602 id=602 data-nosnippet>602</a> );
<a href=#603 id=603 data-nosnippet>603</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#604 id=604 data-nosnippet>604</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.cm_speed[<span class="number">0</span>]);
<a href=#605 id=605 data-nosnippet>605</a> }
<a href=#606 id=606 data-nosnippet>606</a> {
<a href=#607 id=607 data-nosnippet>607</a> <span class="kw">type </span>CurPrior = SlowCMPrior;
<a href=#608 id=608 data-nosnippet>608</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#609 id=609 data-nosnippet>609</a> <span class="self">self</span>.slow_cm_priors.slice_mut(),
<a href=#610 id=610 data-nosnippet>610</a> base_stride_prior,
<a href=#611 id=611 data-nosnippet>611</a> selected_bits,
<a href=#612 id=612 data-nosnippet>612</a> cm_prior,
<a href=#613 id=613 data-nosnippet>613</a> <span class="prelude-val">None</span>,
<a href=#614 id=614 data-nosnippet>614</a> );
<a href=#615 id=615 data-nosnippet>615</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#616 id=616 data-nosnippet>616</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, (<span class="number">0</span>, <span class="number">1024</span>));
<a href=#617 id=617 data-nosnippet>617</a> }
<a href=#618 id=618 data-nosnippet>618</a> {
<a href=#619 id=619 data-nosnippet>619</a> <span class="kw">type </span>CurPrior = SlowCMPrior;
<a href=#620 id=620 data-nosnippet>620</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#621 id=621 data-nosnippet>621</a> <span class="self">self</span>.slow_cm_priors.slice_mut(),
<a href=#622 id=622 data-nosnippet>622</a> base_stride_prior,
<a href=#623 id=623 data-nosnippet>623</a> selected_bits,
<a href=#624 id=624 data-nosnippet>624</a> cm_prior,
<a href=#625 id=625 data-nosnippet>625</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#626 id=626 data-nosnippet>626</a> );
<a href=#627 id=627 data-nosnippet>627</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#628 id=628 data-nosnippet>628</a> cdf.update(literal &amp; <span class="number">0xf</span>, (<span class="number">0</span>, <span class="number">1024</span>));
<a href=#629 id=629 data-nosnippet>629</a> }
<a href=#630 id=630 data-nosnippet>630</a> {
<a href=#631 id=631 data-nosnippet>631</a> <span class="kw">type </span>CurPrior = FastCMPrior;
<a href=#632 id=632 data-nosnippet>632</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#633 id=633 data-nosnippet>633</a> <span class="self">self</span>.fast_cm_priors.slice_mut(),
<a href=#634 id=634 data-nosnippet>634</a> base_stride_prior,
<a href=#635 id=635 data-nosnippet>635</a> selected_bits,
<a href=#636 id=636 data-nosnippet>636</a> cm_prior,
<a href=#637 id=637 data-nosnippet>637</a> <span class="prelude-val">None</span>,
<a href=#638 id=638 data-nosnippet>638</a> );
<a href=#639 id=639 data-nosnippet>639</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#640 id=640 data-nosnippet>640</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.cm_speed[<span class="number">0</span>]);
<a href=#641 id=641 data-nosnippet>641</a> }
<a href=#642 id=642 data-nosnippet>642</a> {
<a href=#643 id=643 data-nosnippet>643</a> <span class="kw">type </span>CurPrior = FastCMPrior;
<a href=#644 id=644 data-nosnippet>644</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#645 id=645 data-nosnippet>645</a> <span class="self">self</span>.fast_cm_priors.slice_mut(),
<a href=#646 id=646 data-nosnippet>646</a> base_stride_prior,
<a href=#647 id=647 data-nosnippet>647</a> selected_bits,
<a href=#648 id=648 data-nosnippet>648</a> cm_prior,
<a href=#649 id=649 data-nosnippet>649</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#650 id=650 data-nosnippet>650</a> );
<a href=#651 id=651 data-nosnippet>651</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#652 id=652 data-nosnippet>652</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.cm_speed[<span class="number">0</span>]);
<a href=#653 id=653 data-nosnippet>653</a> }
<a href=#654 id=654 data-nosnippet>654</a> {
<a href=#655 id=655 data-nosnippet>655</a> <span class="kw">type </span>CurPrior = Stride1Prior;
<a href=#656 id=656 data-nosnippet>656</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#657 id=657 data-nosnippet>657</a> <span class="self">self</span>.stride_priors[<span class="number">0</span>].slice_mut(),
<a href=#658 id=658 data-nosnippet>658</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#659 id=659 data-nosnippet>659</a> selected_bits,
<a href=#660 id=660 data-nosnippet>660</a> cm_prior,
<a href=#661 id=661 data-nosnippet>661</a> <span class="prelude-val">None</span>,
<a href=#662 id=662 data-nosnippet>662</a> );
<a href=#663 id=663 data-nosnippet>663</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#664 id=664 data-nosnippet>664</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.stride_speed[<span class="number">1</span>]);
<a href=#665 id=665 data-nosnippet>665</a> }
<a href=#666 id=666 data-nosnippet>666</a> {
<a href=#667 id=667 data-nosnippet>667</a> <span class="kw">type </span>CurPrior = Stride1Prior;
<a href=#668 id=668 data-nosnippet>668</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#669 id=669 data-nosnippet>669</a> <span class="self">self</span>.stride_priors[<span class="number">0</span>].slice_mut(),
<a href=#670 id=670 data-nosnippet>670</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#671 id=671 data-nosnippet>671</a> selected_bits,
<a href=#672 id=672 data-nosnippet>672</a> cm_prior,
<a href=#673 id=673 data-nosnippet>673</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#674 id=674 data-nosnippet>674</a> );
<a href=#675 id=675 data-nosnippet>675</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#676 id=676 data-nosnippet>676</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.stride_speed[<span class="number">0</span>]);
<a href=#677 id=677 data-nosnippet>677</a> }
<a href=#678 id=678 data-nosnippet>678</a> {
<a href=#679 id=679 data-nosnippet>679</a> <span class="kw">type </span>CurPrior = Stride2Prior;
<a href=#680 id=680 data-nosnippet>680</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#681 id=681 data-nosnippet>681</a> <span class="self">self</span>.stride_priors[<span class="number">1</span>].slice_mut(),
<a href=#682 id=682 data-nosnippet>682</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#683 id=683 data-nosnippet>683</a> selected_bits,
<a href=#684 id=684 data-nosnippet>684</a> cm_prior,
<a href=#685 id=685 data-nosnippet>685</a> <span class="prelude-val">None</span>,
<a href=#686 id=686 data-nosnippet>686</a> );
<a href=#687 id=687 data-nosnippet>687</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#688 id=688 data-nosnippet>688</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.stride_speed[<span class="number">1</span>]);
<a href=#689 id=689 data-nosnippet>689</a> }
<a href=#690 id=690 data-nosnippet>690</a> {
<a href=#691 id=691 data-nosnippet>691</a> <span class="kw">type </span>CurPrior = Stride2Prior;
<a href=#692 id=692 data-nosnippet>692</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#693 id=693 data-nosnippet>693</a> <span class="self">self</span>.stride_priors[<span class="number">1</span>].slice_mut(),
<a href=#694 id=694 data-nosnippet>694</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#695 id=695 data-nosnippet>695</a> selected_bits,
<a href=#696 id=696 data-nosnippet>696</a> cm_prior,
<a href=#697 id=697 data-nosnippet>697</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#698 id=698 data-nosnippet>698</a> );
<a href=#699 id=699 data-nosnippet>699</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#700 id=700 data-nosnippet>700</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.stride_speed[<span class="number">0</span>]);
<a href=#701 id=701 data-nosnippet>701</a> }
<a href=#702 id=702 data-nosnippet>702</a> {
<a href=#703 id=703 data-nosnippet>703</a> <span class="kw">type </span>CurPrior = Stride3Prior;
<a href=#704 id=704 data-nosnippet>704</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#705 id=705 data-nosnippet>705</a> <span class="self">self</span>.stride_priors[<span class="number">2</span>].slice_mut(),
<a href=#706 id=706 data-nosnippet>706</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#707 id=707 data-nosnippet>707</a> selected_bits,
<a href=#708 id=708 data-nosnippet>708</a> cm_prior,
<a href=#709 id=709 data-nosnippet>709</a> <span class="prelude-val">None</span>,
<a href=#710 id=710 data-nosnippet>710</a> );
<a href=#711 id=711 data-nosnippet>711</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#712 id=712 data-nosnippet>712</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.stride_speed[<span class="number">1</span>]);
<a href=#713 id=713 data-nosnippet>713</a> }
<a href=#714 id=714 data-nosnippet>714</a> {
<a href=#715 id=715 data-nosnippet>715</a> <span class="kw">type </span>CurPrior = Stride3Prior;
<a href=#716 id=716 data-nosnippet>716</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#717 id=717 data-nosnippet>717</a> <span class="self">self</span>.stride_priors[<span class="number">2</span>].slice_mut(),
<a href=#718 id=718 data-nosnippet>718</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#719 id=719 data-nosnippet>719</a> selected_bits,
<a href=#720 id=720 data-nosnippet>720</a> cm_prior,
<a href=#721 id=721 data-nosnippet>721</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#722 id=722 data-nosnippet>722</a> );
<a href=#723 id=723 data-nosnippet>723</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#724 id=724 data-nosnippet>724</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.stride_speed[<span class="number">0</span>]);
<a href=#725 id=725 data-nosnippet>725</a> }
<a href=#726 id=726 data-nosnippet>726</a> {
<a href=#727 id=727 data-nosnippet>727</a> <span class="kw">type </span>CurPrior = Stride4Prior;
<a href=#728 id=728 data-nosnippet>728</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#729 id=729 data-nosnippet>729</a> <span class="self">self</span>.stride_priors[<span class="number">3</span>].slice_mut(),
<a href=#730 id=730 data-nosnippet>730</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#731 id=731 data-nosnippet>731</a> selected_bits,
<a href=#732 id=732 data-nosnippet>732</a> cm_prior,
<a href=#733 id=733 data-nosnippet>733</a> <span class="prelude-val">None</span>,
<a href=#734 id=734 data-nosnippet>734</a> );
<a href=#735 id=735 data-nosnippet>735</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#736 id=736 data-nosnippet>736</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.stride_speed[<span class="number">1</span>]);
<a href=#737 id=737 data-nosnippet>737</a> }
<a href=#738 id=738 data-nosnippet>738</a> {
<a href=#739 id=739 data-nosnippet>739</a> <span class="kw">type </span>CurPrior = Stride4Prior;
<a href=#740 id=740 data-nosnippet>740</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#741 id=741 data-nosnippet>741</a> <span class="self">self</span>.stride_priors[<span class="number">3</span>].slice_mut(),
<a href=#742 id=742 data-nosnippet>742</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; <span class="number">7</span>],
<a href=#743 id=743 data-nosnippet>743</a> selected_bits,
<a href=#744 id=744 data-nosnippet>744</a> cm_prior,
<a href=#745 id=745 data-nosnippet>745</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#746 id=746 data-nosnippet>746</a> );
<a href=#747 id=747 data-nosnippet>747</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#748 id=748 data-nosnippet>748</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.stride_speed[<span class="number">0</span>]);
<a href=#749 id=749 data-nosnippet>749</a> }
<a href=#750 id=750 data-nosnippet>750</a> <span class="comment">/* {
<a href=#751 id=751 data-nosnippet>751</a> type CurPrior = Stride8Prior;
<a href=#752 id=752 data-nosnippet>752</a> let mut cdf = CurPrior::lookup_mut(self.stride_priors[4].slice_mut(),
<a href=#753 id=753 data-nosnippet>753</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset())&amp;7], selected_bits, cm_prior, None);
<a href=#754 id=754 data-nosnippet>754</a> h_score[CurPrior::which()] = cdf.cost(literal&gt;&gt;4);
<a href=#755 id=755 data-nosnippet>755</a> cdf.update(literal &gt;&gt; 4, self.stride_speed[1]);
<a href=#756 id=756 data-nosnippet>756</a> }
<a href=#757 id=757 data-nosnippet>757</a> {
<a href=#758 id=758 data-nosnippet>758</a> type CurPrior = Stride8Prior;
<a href=#759 id=759 data-nosnippet>759</a> let mut cdf = CurPrior::lookup_mut(self.stride_priors[4].slice_mut(),
<a href=#760 id=760 data-nosnippet>760</a> stride_prior[stride_prior_offset.wrapping_sub(CurPrior::offset()) &amp; 7],
<a href=#761 id=761 data-nosnippet>761</a> selected_bits,
<a href=#762 id=762 data-nosnippet>762</a> cm_prior,
<a href=#763 id=763 data-nosnippet>763</a> Some(literal &gt;&gt; 4));
<a href=#764 id=764 data-nosnippet>764</a> l_score[CurPrior::which()] = cdf.cost(literal&amp;0xf);
<a href=#765 id=765 data-nosnippet>765</a> cdf.update(literal&amp;0xf, self.stride_speed[0]);
<a href=#766 id=766 data-nosnippet>766</a> }
<a href=#767 id=767 data-nosnippet>767</a> */
<a href=#768 id=768 data-nosnippet>768</a> </span><span class="kw">type </span>CurPrior = AdvPrior;
<a href=#769 id=769 data-nosnippet>769</a> {
<a href=#770 id=770 data-nosnippet>770</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#771 id=771 data-nosnippet>771</a> <span class="self">self</span>.adv_priors.slice_mut(),
<a href=#772 id=772 data-nosnippet>772</a> base_stride_prior,
<a href=#773 id=773 data-nosnippet>773</a> selected_bits,
<a href=#774 id=774 data-nosnippet>774</a> cm_prior,
<a href=#775 id=775 data-nosnippet>775</a> <span class="prelude-val">None</span>,
<a href=#776 id=776 data-nosnippet>776</a> );
<a href=#777 id=777 data-nosnippet>777</a> h_score[CurPrior::which()] = cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#778 id=778 data-nosnippet>778</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.stride_speed[<span class="number">1</span>]);
<a href=#779 id=779 data-nosnippet>779</a> }
<a href=#780 id=780 data-nosnippet>780</a> {
<a href=#781 id=781 data-nosnippet>781</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#782 id=782 data-nosnippet>782</a> <span class="self">self</span>.adv_priors.slice_mut(),
<a href=#783 id=783 data-nosnippet>783</a> base_stride_prior,
<a href=#784 id=784 data-nosnippet>784</a> selected_bits,
<a href=#785 id=785 data-nosnippet>785</a> cm_prior,
<a href=#786 id=786 data-nosnippet>786</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#787 id=787 data-nosnippet>787</a> );
<a href=#788 id=788 data-nosnippet>788</a> l_score[CurPrior::which()] = cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#789 id=789 data-nosnippet>789</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.stride_speed[<span class="number">0</span>]);
<a href=#790 id=790 data-nosnippet>790</a> }
<a href=#791 id=791 data-nosnippet>791</a> <span class="self">self</span>.score.slice_mut()[lscore_index] += l_score;
<a href=#792 id=792 data-nosnippet>792</a> <span class="self">self</span>.score.slice_mut()[hscore_index] += h_score;
<a href=#793 id=793 data-nosnippet>793</a> }
<a href=#794 id=794 data-nosnippet>794</a>}
<a href=#795 id=795 data-nosnippet>795</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;s16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;v8&gt;&gt; IRInterpreter
<a href=#796 id=796 data-nosnippet>796</a> <span class="kw">for </span>PriorEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#797 id=797 data-nosnippet>797</a>{
<a href=#798 id=798 data-nosnippet>798</a> <span class="attr">#[inline]
<a href=#799 id=799 data-nosnippet>799</a> </span><span class="kw">fn </span>inc_local_byte_offset(<span class="kw-2">&amp;mut </span><span class="self">self</span>, inc: usize) {
<a href=#800 id=800 data-nosnippet>800</a> <span class="self">self</span>.local_byte_offset += inc;
<a href=#801 id=801 data-nosnippet>801</a> }
<a href=#802 id=802 data-nosnippet>802</a> <span class="attr">#[inline]
<a href=#803 id=803 data-nosnippet>803</a> </span><span class="kw">fn </span>local_byte_offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#804 id=804 data-nosnippet>804</a> <span class="self">self</span>.local_byte_offset
<a href=#805 id=805 data-nosnippet>805</a> }
<a href=#806 id=806 data-nosnippet>806</a> <span class="attr">#[inline]
<a href=#807 id=807 data-nosnippet>807</a> </span><span class="kw">fn </span>update_block_type(<span class="kw-2">&amp;mut </span><span class="self">self</span>, new_type: u8, stride: u8) {
<a href=#808 id=808 data-nosnippet>808</a> <span class="self">self</span>.block_type = new_type;
<a href=#809 id=809 data-nosnippet>809</a> <span class="self">self</span>.cur_stride = stride;
<a href=#810 id=810 data-nosnippet>810</a> }
<a href=#811 id=811 data-nosnippet>811</a> <span class="attr">#[inline]
<a href=#812 id=812 data-nosnippet>812</a> </span><span class="kw">fn </span>block_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#813 id=813 data-nosnippet>813</a> <span class="self">self</span>.block_type
<a href=#814 id=814 data-nosnippet>814</a> }
<a href=#815 id=815 data-nosnippet>815</a> <span class="attr">#[inline]
<a href=#816 id=816 data-nosnippet>816</a> </span><span class="kw">fn </span>literal_data_at_offset(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; u8 {
<a href=#817 id=817 data-nosnippet>817</a> <span class="self">self</span>.input[index]
<a href=#818 id=818 data-nosnippet>818</a> }
<a href=#819 id=819 data-nosnippet>819</a> <span class="attr">#[inline]
<a href=#820 id=820 data-nosnippet>820</a> </span><span class="kw">fn </span>literal_context_map(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#821 id=821 data-nosnippet>821</a> <span class="self">self</span>.context_map.literal_context_map.slice()
<a href=#822 id=822 data-nosnippet>822</a> }
<a href=#823 id=823 data-nosnippet>823</a> <span class="attr">#[inline]
<a href=#824 id=824 data-nosnippet>824</a> </span><span class="kw">fn </span>prediction_mode(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw">crate</span>::interface::LiteralPredictionModeNibble {
<a href=#825 id=825 data-nosnippet>825</a> <span class="self">self</span>.context_map.literal_prediction_mode()
<a href=#826 id=826 data-nosnippet>826</a> }
<a href=#827 id=827 data-nosnippet>827</a> <span class="attr">#[inline]
<a href=#828 id=828 data-nosnippet>828</a> </span><span class="kw">fn </span>update_cost(
<a href=#829 id=829 data-nosnippet>829</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#830 id=830 data-nosnippet>830</a> stride_prior: [u8; <span class="number">8</span>],
<a href=#831 id=831 data-nosnippet>831</a> stride_prior_offset: usize,
<a href=#832 id=832 data-nosnippet>832</a> selected_bits: u8,
<a href=#833 id=833 data-nosnippet>833</a> cm_prior: usize,
<a href=#834 id=834 data-nosnippet>834</a> literal: u8,
<a href=#835 id=835 data-nosnippet>835</a> ) {
<a href=#836 id=836 data-nosnippet>836</a> <span class="comment">//let stride = self.cur_stride as usize;
<a href=#837 id=837 data-nosnippet>837</a> </span><span class="self">self</span>.update_cost_base(
<a href=#838 id=838 data-nosnippet>838</a> stride_prior,
<a href=#839 id=839 data-nosnippet>839</a> stride_prior_offset,
<a href=#840 id=840 data-nosnippet>840</a> selected_bits,
<a href=#841 id=841 data-nosnippet>841</a> cm_prior,
<a href=#842 id=842 data-nosnippet>842</a> literal,
<a href=#843 id=843 data-nosnippet>843</a> )
<a href=#844 id=844 data-nosnippet>844</a> }
<a href=#845 id=845 data-nosnippet>845</a>}
<a href=#846 id=846 data-nosnippet>846</a>
<a href=#847 id=847 data-nosnippet>847</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, <span class="lifetime">'b</span>, Alloc: alloc::Allocator&lt;s16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;v8&gt;&gt;
<a href=#848 id=848 data-nosnippet>848</a> interface::CommandProcessor&lt;<span class="lifetime">'b</span>&gt; <span class="kw">for </span>PriorEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#849 id=849 data-nosnippet>849</a>{
<a href=#850 id=850 data-nosnippet>850</a> <span class="attr">#[inline]
<a href=#851 id=851 data-nosnippet>851</a> </span><span class="kw">fn </span>push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, val: interface::Command&lt;InputReference&lt;<span class="lifetime">'b</span>&gt;&gt;) {
<a href=#852 id=852 data-nosnippet>852</a> push_base(<span class="self">self</span>, val)
<a href=#853 id=853 data-nosnippet>853</a> }
<a href=#854 id=854 data-nosnippet>854</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,252 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/reader.rs`."><title>reader.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>reader.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapperMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>std::io;
<a href=#4 id=4 data-nosnippet>4</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#5 id=5 data-nosnippet>5</a></span><span class="kw">use </span>std::io::{Error, ErrorKind, Read};
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">pub use </span>alloc_stdlib::StandardAlloc;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span>brotli_decompressor::CustomRead;
<a href=#10 id=10 data-nosnippet>10</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#11 id=11 data-nosnippet>11</a></span><span class="kw">pub use </span>brotli_decompressor::{IntoIoReader, IoReaderWrapper, IoWriterWrapper};
<a href=#12 id=12 data-nosnippet>12</a>
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span><span class="kw">super</span>::backward_references::BrotliEncoderParams;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">use </span><span class="kw">super</span>::combined_alloc::BrotliAlloc;
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">use </span><span class="kw">super</span>::encode::{
<a href=#16 id=16 data-nosnippet>16</a> BrotliEncoderDestroyInstance, BrotliEncoderOperation, BrotliEncoderParameter,
<a href=#17 id=17 data-nosnippet>17</a> BrotliEncoderStateStruct,
<a href=#18 id=18 data-nosnippet>18</a>};
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">use </span><span class="kw">super</span>::interface;
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::allocate;
<a href=#21 id=21 data-nosnippet>21</a>
<a href=#22 id=22 data-nosnippet>22</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#23 id=23 data-nosnippet>23</a></span><span class="kw">pub struct </span>CompressorReaderCustomAlloc&lt;R: Read, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;(
<a href=#24 id=24 data-nosnippet>24</a> CompressorReaderCustomIo&lt;io::Error, IntoIoReader&lt;R&gt;, BufferType, Alloc&gt;,
<a href=#25 id=25 data-nosnippet>25</a>);
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#28 id=28 data-nosnippet>28</a></span><span class="kw">impl</span>&lt;R: Read, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;
<a href=#29 id=29 data-nosnippet>29</a> CompressorReaderCustomAlloc&lt;R, BufferType, Alloc&gt;
<a href=#30 id=30 data-nosnippet>30</a>{
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">pub fn </span>new(r: R, buffer: BufferType, alloc: Alloc, q: u32, lgwin: u32) -&gt; <span class="self">Self </span>{
<a href=#32 id=32 data-nosnippet>32</a> CompressorReaderCustomAlloc::&lt;R, BufferType, Alloc&gt;(CompressorReaderCustomIo::&lt;
<a href=#33 id=33 data-nosnippet>33</a> Error,
<a href=#34 id=34 data-nosnippet>34</a> IntoIoReader&lt;R&gt;,
<a href=#35 id=35 data-nosnippet>35</a> BufferType,
<a href=#36 id=36 data-nosnippet>36</a> Alloc,
<a href=#37 id=37 data-nosnippet>37</a> &gt;::new(
<a href=#38 id=38 data-nosnippet>38</a> IntoIoReader::&lt;R&gt;(r),
<a href=#39 id=39 data-nosnippet>39</a> buffer,
<a href=#40 id=40 data-nosnippet>40</a> alloc,
<a href=#41 id=41 data-nosnippet>41</a> Error::new(ErrorKind::InvalidData, <span class="string">"Invalid Data"</span>),
<a href=#42 id=42 data-nosnippet>42</a> q,
<a href=#43 id=43 data-nosnippet>43</a> lgwin,
<a href=#44 id=44 data-nosnippet>44</a> ))
<a href=#45 id=45 data-nosnippet>45</a> }
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a> <span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>R {
<a href=#48 id=48 data-nosnippet>48</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>.get_ref().<span class="number">0
<a href=#49 id=49 data-nosnippet>49</a> </span>}
<a href=#50 id=50 data-nosnippet>50</a> <span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; R {
<a href=#51 id=51 data-nosnippet>51</a> <span class="self">self</span>.<span class="number">0</span>.into_inner().<span class="number">0
<a href=#52 id=52 data-nosnippet>52</a> </span>}
<a href=#53 id=53 data-nosnippet>53</a>}
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#56 id=56 data-nosnippet>56</a></span><span class="kw">impl</span>&lt;R: Read, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt; Read
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw">for </span>CompressorReaderCustomAlloc&lt;R, BufferType, Alloc&gt;
<a href=#58 id=58 data-nosnippet>58</a>{
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize, Error&gt; {
<a href=#60 id=60 data-nosnippet>60</a> <span class="self">self</span>.<span class="number">0</span>.read(buf)
<a href=#61 id=61 data-nosnippet>61</a> }
<a href=#62 id=62 data-nosnippet>62</a>}
<a href=#63 id=63 data-nosnippet>63</a>
<a href=#64 id=64 data-nosnippet>64</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#65 id=65 data-nosnippet>65</a></span><span class="kw">pub struct </span>CompressorReader&lt;R: Read&gt;(
<a href=#66 id=66 data-nosnippet>66</a> CompressorReaderCustomAlloc&lt;
<a href=#67 id=67 data-nosnippet>67</a> R,
<a href=#68 id=68 data-nosnippet>68</a> &lt;StandardAlloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory,
<a href=#69 id=69 data-nosnippet>69</a> StandardAlloc,
<a href=#70 id=70 data-nosnippet>70</a> &gt;,
<a href=#71 id=71 data-nosnippet>71</a>);
<a href=#72 id=72 data-nosnippet>72</a>
<a href=#73 id=73 data-nosnippet>73</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#74 id=74 data-nosnippet>74</a></span><span class="kw">impl</span>&lt;R: Read&gt; CompressorReader&lt;R&gt; {
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">pub fn </span>new(r: R, buffer_size: usize, q: u32, lgwin: u32) -&gt; <span class="self">Self </span>{
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw">let </span><span class="kw-2">mut </span>alloc = StandardAlloc::default();
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">let </span>buffer = allocate::&lt;u8, <span class="kw">_</span>&gt;(
<a href=#78 id=78 data-nosnippet>78</a> <span class="kw-2">&amp;mut </span>alloc,
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw">if </span>buffer_size == <span class="number">0 </span>{ <span class="number">4096 </span>} <span class="kw">else </span>{ buffer_size },
<a href=#80 id=80 data-nosnippet>80</a> );
<a href=#81 id=81 data-nosnippet>81</a> CompressorReader::&lt;R&gt;(CompressorReaderCustomAlloc::new(r, buffer, alloc, q, lgwin))
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a>
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">pub fn </span>with_params(r: R, buffer_size: usize, params: <span class="kw-2">&amp;</span>BrotliEncoderParams) -&gt; <span class="self">Self </span>{
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">let </span><span class="kw-2">mut </span>reader = <span class="self">Self</span>::new(r, buffer_size, params.quality <span class="kw">as </span>u32, params.lgwin <span class="kw">as </span>u32);
<a href=#86 id=86 data-nosnippet>86</a> (reader.<span class="number">0</span>).<span class="number">0</span>.state.<span class="number">0</span>.params = params.clone();
<a href=#87 id=87 data-nosnippet>87</a> reader
<a href=#88 id=88 data-nosnippet>88</a> }
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a> <span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>R {
<a href=#91 id=91 data-nosnippet>91</a> <span class="self">self</span>.<span class="number">0</span>.get_ref()
<a href=#92 id=92 data-nosnippet>92</a> }
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; R {
<a href=#94 id=94 data-nosnippet>94</a> <span class="self">self</span>.<span class="number">0</span>.into_inner()
<a href=#95 id=95 data-nosnippet>95</a> }
<a href=#96 id=96 data-nosnippet>96</a>}
<a href=#97 id=97 data-nosnippet>97</a>
<a href=#98 id=98 data-nosnippet>98</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#99 id=99 data-nosnippet>99</a></span><span class="kw">impl</span>&lt;R: Read&gt; Read <span class="kw">for </span>CompressorReader&lt;R&gt; {
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize, Error&gt; {
<a href=#101 id=101 data-nosnippet>101</a> <span class="self">self</span>.<span class="number">0</span>.read(buf)
<a href=#102 id=102 data-nosnippet>102</a> }
<a href=#103 id=103 data-nosnippet>103</a>}
<a href=#104 id=104 data-nosnippet>104</a>
<a href=#105 id=105 data-nosnippet>105</a><span class="kw">pub struct </span>CompressorReaderCustomIo&lt;
<a href=#106 id=106 data-nosnippet>106</a> ErrType,
<a href=#107 id=107 data-nosnippet>107</a> R: CustomRead&lt;ErrType&gt;,
<a href=#108 id=108 data-nosnippet>108</a> BufferType: SliceWrapperMut&lt;u8&gt;,
<a href=#109 id=109 data-nosnippet>109</a> Alloc: BrotliAlloc,
<a href=#110 id=110 data-nosnippet>110</a>&gt; {
<a href=#111 id=111 data-nosnippet>111</a> input_buffer: BufferType,
<a href=#112 id=112 data-nosnippet>112</a> total_out: <span class="prelude-ty">Option</span>&lt;usize&gt;,
<a href=#113 id=113 data-nosnippet>113</a> input_offset: usize,
<a href=#114 id=114 data-nosnippet>114</a> input_len: usize,
<a href=#115 id=115 data-nosnippet>115</a> input: R,
<a href=#116 id=116 data-nosnippet>116</a> input_eof: bool,
<a href=#117 id=117 data-nosnippet>117</a> error_if_invalid_data: <span class="prelude-ty">Option</span>&lt;ErrType&gt;,
<a href=#118 id=118 data-nosnippet>118</a> state: StateWrapper&lt;Alloc&gt;,
<a href=#119 id=119 data-nosnippet>119</a>}
<a href=#120 id=120 data-nosnippet>120</a><span class="kw">struct </span>StateWrapper&lt;Alloc: BrotliAlloc&gt;(BrotliEncoderStateStruct&lt;Alloc&gt;);
<a href=#121 id=121 data-nosnippet>121</a>
<a href=#122 id=122 data-nosnippet>122</a><span class="kw">impl</span>&lt;Alloc: BrotliAlloc&gt; Drop <span class="kw">for </span>StateWrapper&lt;Alloc&gt; {
<a href=#123 id=123 data-nosnippet>123</a> <span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#124 id=124 data-nosnippet>124</a> BrotliEncoderDestroyInstance(<span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>);
<a href=#125 id=125 data-nosnippet>125</a> }
<a href=#126 id=126 data-nosnippet>126</a>}
<a href=#127 id=127 data-nosnippet>127</a>
<a href=#128 id=128 data-nosnippet>128</a><span class="kw">impl</span>&lt;ErrType, R: CustomRead&lt;ErrType&gt;, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;
<a href=#129 id=129 data-nosnippet>129</a> CompressorReaderCustomIo&lt;ErrType, R, BufferType, Alloc&gt;
<a href=#130 id=130 data-nosnippet>130</a>{
<a href=#131 id=131 data-nosnippet>131</a> <span class="kw">pub fn </span>new(
<a href=#132 id=132 data-nosnippet>132</a> r: R,
<a href=#133 id=133 data-nosnippet>133</a> buffer: BufferType,
<a href=#134 id=134 data-nosnippet>134</a> alloc: Alloc,
<a href=#135 id=135 data-nosnippet>135</a> invalid_data_error_type: ErrType,
<a href=#136 id=136 data-nosnippet>136</a> q: u32,
<a href=#137 id=137 data-nosnippet>137</a> lgwin: u32,
<a href=#138 id=138 data-nosnippet>138</a> ) -&gt; <span class="self">Self </span>{
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = CompressorReaderCustomIo {
<a href=#140 id=140 data-nosnippet>140</a> input_buffer: buffer,
<a href=#141 id=141 data-nosnippet>141</a> total_out: <span class="prelude-val">Some</span>(<span class="number">0</span>),
<a href=#142 id=142 data-nosnippet>142</a> input_offset: <span class="number">0</span>,
<a href=#143 id=143 data-nosnippet>143</a> input_len: <span class="number">0</span>,
<a href=#144 id=144 data-nosnippet>144</a> input_eof: <span class="bool-val">false</span>,
<a href=#145 id=145 data-nosnippet>145</a> input: r,
<a href=#146 id=146 data-nosnippet>146</a> state: StateWrapper(BrotliEncoderStateStruct::new(alloc)),
<a href=#147 id=147 data-nosnippet>147</a> error_if_invalid_data: <span class="prelude-val">Some</span>(invalid_data_error_type),
<a href=#148 id=148 data-nosnippet>148</a> };
<a href=#149 id=149 data-nosnippet>149</a> ret.state
<a href=#150 id=150 data-nosnippet>150</a> .<span class="number">0
<a href=#151 id=151 data-nosnippet>151</a> </span>.set_parameter(BrotliEncoderParameter::BROTLI_PARAM_QUALITY, q);
<a href=#152 id=152 data-nosnippet>152</a> ret.state
<a href=#153 id=153 data-nosnippet>153</a> .<span class="number">0
<a href=#154 id=154 data-nosnippet>154</a> </span>.set_parameter(BrotliEncoderParameter::BROTLI_PARAM_LGWIN, lgwin);
<a href=#155 id=155 data-nosnippet>155</a>
<a href=#156 id=156 data-nosnippet>156</a> ret
<a href=#157 id=157 data-nosnippet>157</a> }
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">pub fn </span>copy_to_front(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">let </span>avail_in = <span class="self">self</span>.input_len - <span class="self">self</span>.input_offset;
<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">if </span><span class="self">self</span>.input_offset == <span class="self">self</span>.input_buffer.slice_mut().len() {
<a href=#161 id=161 data-nosnippet>161</a> <span class="self">self</span>.input_offset = <span class="number">0</span>;
<a href=#162 id=162 data-nosnippet>162</a> <span class="self">self</span>.input_len = <span class="number">0</span>;
<a href=#163 id=163 data-nosnippet>163</a> } <span class="kw">else if </span><span class="self">self</span>.input_offset + <span class="number">256 </span>&gt; <span class="self">self</span>.input_buffer.slice_mut().len()
<a href=#164 id=164 data-nosnippet>164</a> &amp;&amp; avail_in &lt; <span class="self">self</span>.input_offset
<a href=#165 id=165 data-nosnippet>165</a> {
<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">let </span>(first, second) = <span class="self">self
<a href=#167 id=167 data-nosnippet>167</a> </span>.input_buffer
<a href=#168 id=168 data-nosnippet>168</a> .slice_mut()
<a href=#169 id=169 data-nosnippet>169</a> .split_at_mut(<span class="self">self</span>.input_offset);
<a href=#170 id=170 data-nosnippet>170</a> first[<span class="number">0</span>..avail_in].clone_from_slice(<span class="kw-2">&amp;</span>second[<span class="number">0</span>..avail_in]);
<a href=#171 id=171 data-nosnippet>171</a> <span class="self">self</span>.input_len -= <span class="self">self</span>.input_offset;
<a href=#172 id=172 data-nosnippet>172</a> <span class="self">self</span>.input_offset = <span class="number">0</span>;
<a href=#173 id=173 data-nosnippet>173</a> }
<a href=#174 id=174 data-nosnippet>174</a> }
<a href=#175 id=175 data-nosnippet>175</a> <span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; R {
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#177 id=177 data-nosnippet>177</a> CompressorReaderCustomIo {
<a href=#178 id=178 data-nosnippet>178</a> input_buffer: _ib,
<a href=#179 id=179 data-nosnippet>179</a> total_out: _to,
<a href=#180 id=180 data-nosnippet>180</a> input_offset: _io,
<a href=#181 id=181 data-nosnippet>181</a> input_len: _len,
<a href=#182 id=182 data-nosnippet>182</a> input,
<a href=#183 id=183 data-nosnippet>183</a> input_eof: _ieof,
<a href=#184 id=184 data-nosnippet>184</a> error_if_invalid_data: _eiid,
<a href=#185 id=185 data-nosnippet>185</a> state: _state,
<a href=#186 id=186 data-nosnippet>186</a> } =&gt; input,
<a href=#187 id=187 data-nosnippet>187</a> }
<a href=#188 id=188 data-nosnippet>188</a> }
<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>R {
<a href=#190 id=190 data-nosnippet>190</a> <span class="kw-2">&amp;</span><span class="self">self</span>.input
<a href=#191 id=191 data-nosnippet>191</a> }
<a href=#192 id=192 data-nosnippet>192</a>}
<a href=#193 id=193 data-nosnippet>193</a><span class="kw">impl</span>&lt;ErrType, R: CustomRead&lt;ErrType&gt;, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;
<a href=#194 id=194 data-nosnippet>194</a> CustomRead&lt;ErrType&gt; <span class="kw">for </span>CompressorReaderCustomIo&lt;ErrType, R, BufferType, Alloc&gt;
<a href=#195 id=195 data-nosnippet>195</a>{
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw">fn </span>read(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize, ErrType&gt; {
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">let </span><span class="kw-2">mut </span>nop_callback =
<a href=#198 id=198 data-nosnippet>198</a> |_data: <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;interface::InputReferenceMut&gt;,
<a href=#199 id=199 data-nosnippet>199</a> _cmds: <span class="kw-2">&amp;mut </span>[interface::StaticCommand],
<a href=#200 id=200 data-nosnippet>200</a> _mb: interface::InputPair,
<a href=#201 id=201 data-nosnippet>201</a> _mfv: <span class="kw-2">&amp;mut </span>Alloc| ();
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">let </span><span class="kw-2">mut </span>output_offset: usize = <span class="number">0</span>;
<a href=#203 id=203 data-nosnippet>203</a> <span class="kw">let </span><span class="kw-2">mut </span>avail_out = buf.len();
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">let </span><span class="kw-2">mut </span>avail_in = <span class="self">self</span>.input_len - <span class="self">self</span>.input_offset;
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">while </span>output_offset == <span class="number">0 </span>{
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">if </span><span class="self">self</span>.input_len &lt; <span class="self">self</span>.input_buffer.slice_mut().len() &amp;&amp; !<span class="self">self</span>.input_eof {
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">match </span><span class="self">self
<a href=#208 id=208 data-nosnippet>208</a> </span>.input
<a href=#209 id=209 data-nosnippet>209</a> .read(<span class="kw-2">&amp;mut </span><span class="self">self</span>.input_buffer.slice_mut()[<span class="self">self</span>.input_len..])
<a href=#210 id=210 data-nosnippet>210</a> {
<a href=#211 id=211 data-nosnippet>211</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
<a href=#212 id=212 data-nosnippet>212</a> <span class="prelude-val">Ok</span>(size) =&gt; {
<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">if </span>size == <span class="number">0 </span>{
<a href=#214 id=214 data-nosnippet>214</a> <span class="self">self</span>.input_eof = <span class="bool-val">true</span>;
<a href=#215 id=215 data-nosnippet>215</a> } <span class="kw">else </span>{
<a href=#216 id=216 data-nosnippet>216</a> <span class="self">self</span>.input_len += size;
<a href=#217 id=217 data-nosnippet>217</a> avail_in = <span class="self">self</span>.input_len - <span class="self">self</span>.input_offset;
<a href=#218 id=218 data-nosnippet>218</a> }
<a href=#219 id=219 data-nosnippet>219</a> }
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a> }
<a href=#222 id=222 data-nosnippet>222</a> <span class="kw">let </span>op: BrotliEncoderOperation;
<a href=#223 id=223 data-nosnippet>223</a> <span class="kw">if </span>avail_in == <span class="number">0 </span>{
<a href=#224 id=224 data-nosnippet>224</a> op = BrotliEncoderOperation::BROTLI_OPERATION_FINISH;
<a href=#225 id=225 data-nosnippet>225</a> } <span class="kw">else </span>{
<a href=#226 id=226 data-nosnippet>226</a> op = BrotliEncoderOperation::BROTLI_OPERATION_PROCESS;
<a href=#227 id=227 data-nosnippet>227</a> }
<a href=#228 id=228 data-nosnippet>228</a> <span class="kw">let </span>ret = <span class="self">self</span>.state.<span class="number">0</span>.compress_stream(
<a href=#229 id=229 data-nosnippet>229</a> op,
<a href=#230 id=230 data-nosnippet>230</a> <span class="kw-2">&amp;mut </span>avail_in,
<a href=#231 id=231 data-nosnippet>231</a> <span class="self">self</span>.input_buffer.slice_mut(),
<a href=#232 id=232 data-nosnippet>232</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.input_offset,
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw-2">&amp;mut </span>avail_out,
<a href=#234 id=234 data-nosnippet>234</a> buf,
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw-2">&amp;mut </span>output_offset,
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.total_out,
<a href=#237 id=237 data-nosnippet>237</a> <span class="kw-2">&amp;mut </span>nop_callback,
<a href=#238 id=238 data-nosnippet>238</a> );
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">if </span>avail_in == <span class="number">0 </span>{
<a href=#240 id=240 data-nosnippet>240</a> <span class="self">self</span>.copy_to_front();
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a> <span class="kw">if </span>!ret {
<a href=#243 id=243 data-nosnippet>243</a> <span class="kw">return </span><span class="prelude-val">Err</span>(<span class="self">self</span>.error_if_invalid_data.take().unwrap());
<a href=#244 id=244 data-nosnippet>244</a> }
<a href=#245 id=245 data-nosnippet>245</a> <span class="kw">if </span><span class="self">self</span>.state.<span class="number">0</span>.is_finished() {
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">break</span>;
<a href=#247 id=247 data-nosnippet>247</a> }
<a href=#248 id=248 data-nosnippet>248</a> }
<a href=#249 id=249 data-nosnippet>249</a> <span class="prelude-val">Ok</span>(output_offset)
<a href=#250 id=250 data-nosnippet>250</a> }
<a href=#251 id=251 data-nosnippet>251</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,214 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/singlethreading.rs`."><title>singlethreading.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>singlethreading.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapper};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::marker::PhantomData;
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span>core::mem;
<a href=#4 id=4 data-nosnippet>4</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#5 id=5 data-nosnippet>5</a></span><span class="kw">use </span>std;
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::backward_references::UnionHasher;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">crate</span>::enc::threading::{
<a href=#9 id=9 data-nosnippet>9</a> BatchSpawnable, BatchSpawnableLite, BrotliEncoderThreadError, CompressMulti,
<a href=#10 id=10 data-nosnippet>10</a> CompressionThreadResult, InternalOwned, InternalSendAlloc, Joinable, Owned, OwnedRetriever,
<a href=#11 id=11 data-nosnippet>11</a> PoisonedThreadError, SendAlloc,
<a href=#12 id=12 data-nosnippet>12</a>};
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span><span class="kw">crate</span>::enc::{BrotliAlloc, BrotliEncoderParams};
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">pub struct </span>SingleThreadedJoinable&lt;T: Send + <span class="lifetime">'static</span>, U: Send + <span class="lifetime">'static</span>&gt; {
<a href=#16 id=16 data-nosnippet>16</a> result: <span class="prelude-ty">Result</span>&lt;T, U&gt;,
<a href=#17 id=17 data-nosnippet>17</a>}
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">impl</span>&lt;T: Send + <span class="lifetime">'static</span>, U: Send + <span class="lifetime">'static</span>&gt; Joinable&lt;T, U&gt; <span class="kw">for </span>SingleThreadedJoinable&lt;T, U&gt; {
<a href=#19 id=19 data-nosnippet>19</a> <span class="kw">fn </span>join(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;T, U&gt; {
<a href=#20 id=20 data-nosnippet>20</a> <span class="self">self</span>.result
<a href=#21 id=21 data-nosnippet>21</a> }
<a href=#22 id=22 data-nosnippet>22</a>}
<a href=#23 id=23 data-nosnippet>23</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#24 id=24 data-nosnippet>24</a></span><span class="kw">pub struct </span>SingleThreadedOwnedRetriever&lt;U: Send + <span class="lifetime">'static</span>&gt;(std::sync::RwLock&lt;U&gt;);
<a href=#25 id=25 data-nosnippet>25</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#26 id=26 data-nosnippet>26</a></span><span class="kw">impl</span>&lt;U: Send + <span class="lifetime">'static</span>&gt; OwnedRetriever&lt;U&gt; <span class="kw">for </span>SingleThreadedOwnedRetriever&lt;U&gt; {
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">fn </span>view&lt;T, F: FnOnce(<span class="kw-2">&amp;</span>U) -&gt; T&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, f: F) -&gt; <span class="prelude-ty">Result</span>&lt;T, PoisonedThreadError&gt; {
<a href=#28 id=28 data-nosnippet>28</a> <span class="prelude-val">Ok</span>(f(<span class="kw-2">&amp;*</span><span class="self">self</span>.<span class="number">0</span>.read().unwrap()))
<a href=#29 id=29 data-nosnippet>29</a> }
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">fn </span>unwrap(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;U, PoisonedThreadError&gt; {
<a href=#31 id=31 data-nosnippet>31</a> <span class="prelude-val">Ok</span>(<span class="self">self</span>.<span class="number">0</span>.into_inner().unwrap())
<a href=#32 id=32 data-nosnippet>32</a> }
<a href=#33 id=33 data-nosnippet>33</a>}
<a href=#34 id=34 data-nosnippet>34</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#35 id=35 data-nosnippet>35</a></span><span class="kw">impl</span>&lt;U: Send + <span class="lifetime">'static</span>&gt; SingleThreadedOwnedRetriever&lt;U&gt; {
<a href=#36 id=36 data-nosnippet>36</a> <span class="kw">fn </span>new(u: U) -&gt; <span class="self">Self </span>{
<a href=#37 id=37 data-nosnippet>37</a> SingleThreadedOwnedRetriever(std::sync::RwLock::new(u))
<a href=#38 id=38 data-nosnippet>38</a> }
<a href=#39 id=39 data-nosnippet>39</a>}
<a href=#40 id=40 data-nosnippet>40</a>
<a href=#41 id=41 data-nosnippet>41</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#42 id=42 data-nosnippet>42</a></span><span class="kw">pub struct </span>SingleThreadedOwnedRetriever&lt;U: Send + <span class="lifetime">'static</span>&gt;(U);
<a href=#43 id=43 data-nosnippet>43</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#44 id=44 data-nosnippet>44</a></span><span class="kw">impl</span>&lt;U: Send + <span class="lifetime">'static</span>&gt; SingleThreadedOwnedRetriever&lt;U&gt; {
<a href=#45 id=45 data-nosnippet>45</a> <span class="kw">fn </span>new(u: U) -&gt; <span class="self">Self </span>{
<a href=#46 id=46 data-nosnippet>46</a> SingleThreadedOwnedRetriever(u)
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a>}
<a href=#49 id=49 data-nosnippet>49</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#50 id=50 data-nosnippet>50</a></span><span class="kw">impl</span>&lt;U: Send + <span class="lifetime">'static</span>&gt; OwnedRetriever&lt;U&gt; <span class="kw">for </span>SingleThreadedOwnedRetriever&lt;U&gt; {
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw">fn </span>view&lt;T, F: FnOnce(<span class="kw-2">&amp;</span>U) -&gt; T&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, f: F) -&gt; <span class="prelude-ty">Result</span>&lt;T, PoisonedThreadError&gt; {
<a href=#52 id=52 data-nosnippet>52</a> <span class="prelude-val">Ok</span>(f(<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>))
<a href=#53 id=53 data-nosnippet>53</a> }
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">fn </span>unwrap(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;U, PoisonedThreadError&gt; {
<a href=#55 id=55 data-nosnippet>55</a> <span class="prelude-val">Ok</span>(<span class="self">self</span>.<span class="number">0</span>)
<a href=#56 id=56 data-nosnippet>56</a> }
<a href=#57 id=57 data-nosnippet>57</a>}
<a href=#58 id=58 data-nosnippet>58</a>
<a href=#59 id=59 data-nosnippet>59</a><span class="attr">#[derive(Default)]
<a href=#60 id=60 data-nosnippet>60</a></span><span class="kw">pub struct </span>SingleThreadedSpawner {}
<a href=#61 id=61 data-nosnippet>61</a>
<a href=#62 id=62 data-nosnippet>62</a><span class="kw">impl</span>&lt;
<a href=#63 id=63 data-nosnippet>63</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#64 id=64 data-nosnippet>64</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#65 id=65 data-nosnippet>65</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#66 id=66 data-nosnippet>66</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#67 id=67 data-nosnippet>67</a> &gt; BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt; <span class="kw">for </span>SingleThreadedSpawner
<a href=#68 id=68 data-nosnippet>68</a><span class="kw">where
<a href=#69 id=69 data-nosnippet>69</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#70 id=70 data-nosnippet>70</a>{
<a href=#71 id=71 data-nosnippet>71</a> <span class="kw">type </span>JoinHandle = SingleThreadedJoinable&lt;ReturnValue, BrotliEncoderThreadError&gt;;
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">type </span>FinalJoinHandle = SingleThreadedOwnedRetriever&lt;U&gt;;
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle {
<a href=#74 id=74 data-nosnippet>74</a> SingleThreadedOwnedRetriever::&lt;U&gt;::new(
<a href=#75 id=75 data-nosnippet>75</a> mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap(),
<a href=#76 id=76 data-nosnippet>76</a> )
<a href=#77 id=77 data-nosnippet>77</a> }
<a href=#78 id=78 data-nosnippet>78</a> <span class="kw">fn </span>spawn&lt;F: Fn(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue + Send + <span class="lifetime">'static </span>+ Copy&gt;(
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#80 id=80 data-nosnippet>80</a> handle: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#81 id=81 data-nosnippet>81</a> work: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#82 id=82 data-nosnippet>82</a> index: usize,
<a href=#83 id=83 data-nosnippet>83</a> num_threads: usize,
<a href=#84 id=84 data-nosnippet>84</a> f: F,
<a href=#85 id=85 data-nosnippet>85</a> ) {
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">let </span>(alloc, extra_input) = work.replace_with_default();
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">let </span>ret = handle.view(|sub_view| f(extra_input, index, num_threads, sub_view, alloc));
<a href=#88 id=88 data-nosnippet>88</a> <span class="kw-2">*</span>work = SendAlloc(InternalSendAlloc::Join(SingleThreadedJoinable {
<a href=#89 id=89 data-nosnippet>89</a> result: <span class="prelude-val">Ok</span>(ret.unwrap()),
<a href=#90 id=90 data-nosnippet>90</a> }));
<a href=#91 id=91 data-nosnippet>91</a> }
<a href=#92 id=92 data-nosnippet>92</a>}
<a href=#93 id=93 data-nosnippet>93</a>
<a href=#94 id=94 data-nosnippet>94</a><span class="kw">impl</span>&lt;
<a href=#95 id=95 data-nosnippet>95</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#96 id=96 data-nosnippet>96</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#97 id=97 data-nosnippet>97</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#98 id=98 data-nosnippet>98</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#99 id=99 data-nosnippet>99</a> &gt; BatchSpawnableLite&lt;ReturnValue, ExtraInput, Alloc, U&gt; <span class="kw">for </span>SingleThreadedSpawner
<a href=#100 id=100 data-nosnippet>100</a><span class="kw">where
<a href=#101 id=101 data-nosnippet>101</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#102 id=102 data-nosnippet>102</a>{
<a href=#103 id=103 data-nosnippet>103</a> <span class="kw">type </span>JoinHandle =
<a href=#104 id=104 data-nosnippet>104</a> &lt;SingleThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::JoinHandle;
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">type </span>FinalJoinHandle = &lt;SingleThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;
<a href=#106 id=106 data-nosnippet>106</a> ReturnValue,
<a href=#107 id=107 data-nosnippet>107</a> ExtraInput,
<a href=#108 id=108 data-nosnippet>108</a> Alloc,
<a href=#109 id=109 data-nosnippet>109</a> U,
<a href=#110 id=110 data-nosnippet>110</a> &gt;&gt;::FinalJoinHandle;
<a href=#111 id=111 data-nosnippet>111</a>
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle {
<a href=#113 id=113 data-nosnippet>113</a> &lt;<span class="self">Self </span><span class="kw">as </span>BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::make_spawner(<span class="self">self</span>, input)
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw">fn </span>spawn(
<a href=#116 id=116 data-nosnippet>116</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#117 id=117 data-nosnippet>117</a> handle: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#118 id=118 data-nosnippet>118</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#119 id=119 data-nosnippet>119</a> index: usize,
<a href=#120 id=120 data-nosnippet>120</a> num_threads: usize,
<a href=#121 id=121 data-nosnippet>121</a> f: <span class="kw">fn</span>(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue,
<a href=#122 id=122 data-nosnippet>122</a> ) {
<a href=#123 id=123 data-nosnippet>123</a> &lt;<span class="self">Self </span><span class="kw">as </span>BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::spawn(
<a href=#124 id=124 data-nosnippet>124</a> <span class="self">self</span>,
<a href=#125 id=125 data-nosnippet>125</a> handle,
<a href=#126 id=126 data-nosnippet>126</a> alloc_per_thread,
<a href=#127 id=127 data-nosnippet>127</a> index,
<a href=#128 id=128 data-nosnippet>128</a> num_threads,
<a href=#129 id=129 data-nosnippet>129</a> f,
<a href=#130 id=130 data-nosnippet>130</a> )
<a href=#131 id=131 data-nosnippet>131</a> }
<a href=#132 id=132 data-nosnippet>132</a>}
<a href=#133 id=133 data-nosnippet>133</a>
<a href=#134 id=134 data-nosnippet>134</a><span class="kw">pub fn </span>compress_multi&lt;
<a href=#135 id=135 data-nosnippet>135</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#136 id=136 data-nosnippet>136</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#137 id=137 data-nosnippet>137</a>&gt;(
<a href=#138 id=138 data-nosnippet>138</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#139 id=139 data-nosnippet>139</a> owned_input: <span class="kw-2">&amp;mut </span>Owned&lt;SliceW&gt;,
<a href=#140 id=140 data-nosnippet>140</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#141 id=141 data-nosnippet>141</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#142 id=142 data-nosnippet>142</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#143 id=143 data-nosnippet>143</a> UnionHasher&lt;Alloc&gt;,
<a href=#144 id=144 data-nosnippet>144</a> Alloc,
<a href=#145 id=145 data-nosnippet>145</a> &lt;SingleThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;
<a href=#146 id=146 data-nosnippet>146</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#147 id=147 data-nosnippet>147</a> UnionHasher&lt;Alloc&gt;,
<a href=#148 id=148 data-nosnippet>148</a> Alloc,
<a href=#149 id=149 data-nosnippet>149</a> SliceW,
<a href=#150 id=150 data-nosnippet>150</a> &gt;&gt;::JoinHandle,
<a href=#151 id=151 data-nosnippet>151</a> &gt;],
<a href=#152 id=152 data-nosnippet>152</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#153 id=153 data-nosnippet>153</a><span class="kw">where
<a href=#154 id=154 data-nosnippet>154</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#155 id=155 data-nosnippet>155</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send,
<a href=#156 id=156 data-nosnippet>156</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send,
<a href=#157 id=157 data-nosnippet>157</a>{
<a href=#158 id=158 data-nosnippet>158</a> CompressMulti(
<a href=#159 id=159 data-nosnippet>159</a> params,
<a href=#160 id=160 data-nosnippet>160</a> owned_input,
<a href=#161 id=161 data-nosnippet>161</a> output,
<a href=#162 id=162 data-nosnippet>162</a> alloc_per_thread,
<a href=#163 id=163 data-nosnippet>163</a> <span class="kw-2">&amp;mut </span>SingleThreadedSpawner::default(),
<a href=#164 id=164 data-nosnippet>164</a> )
<a href=#165 id=165 data-nosnippet>165</a>}
<a href=#166 id=166 data-nosnippet>166</a>
<a href=#167 id=167 data-nosnippet>167</a><span class="kw">pub struct </span>WorkerPool&lt;A, B, C, D&gt; {
<a href=#168 id=168 data-nosnippet>168</a> a: PhantomData&lt;A&gt;,
<a href=#169 id=169 data-nosnippet>169</a> b: PhantomData&lt;B&gt;,
<a href=#170 id=170 data-nosnippet>170</a> c: PhantomData&lt;C&gt;,
<a href=#171 id=171 data-nosnippet>171</a> d: PhantomData&lt;D&gt;,
<a href=#172 id=172 data-nosnippet>172</a>}
<a href=#173 id=173 data-nosnippet>173</a><span class="kw">pub fn </span>new_work_pool&lt;A, B, C, D&gt;(_num_threads: usize) -&gt; WorkerPool&lt;A, B, C, D&gt; {
<a href=#174 id=174 data-nosnippet>174</a> WorkerPool::&lt;A, B, C, D&gt; {
<a href=#175 id=175 data-nosnippet>175</a> a: PhantomData,
<a href=#176 id=176 data-nosnippet>176</a> b: PhantomData,
<a href=#177 id=177 data-nosnippet>177</a> c: PhantomData,
<a href=#178 id=178 data-nosnippet>178</a> d: PhantomData,
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a>}
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a><span class="kw">pub fn </span>compress_worker_pool&lt;
<a href=#183 id=183 data-nosnippet>183</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#184 id=184 data-nosnippet>184</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#185 id=185 data-nosnippet>185</a>&gt;(
<a href=#186 id=186 data-nosnippet>186</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#187 id=187 data-nosnippet>187</a> owned_input: <span class="kw-2">&amp;mut </span>Owned&lt;SliceW&gt;,
<a href=#188 id=188 data-nosnippet>188</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#189 id=189 data-nosnippet>189</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#190 id=190 data-nosnippet>190</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#191 id=191 data-nosnippet>191</a> UnionHasher&lt;Alloc&gt;,
<a href=#192 id=192 data-nosnippet>192</a> Alloc,
<a href=#193 id=193 data-nosnippet>193</a> &lt;SingleThreadedSpawner <span class="kw">as </span>BatchSpawnable&lt;
<a href=#194 id=194 data-nosnippet>194</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#195 id=195 data-nosnippet>195</a> UnionHasher&lt;Alloc&gt;,
<a href=#196 id=196 data-nosnippet>196</a> Alloc,
<a href=#197 id=197 data-nosnippet>197</a> SliceW,
<a href=#198 id=198 data-nosnippet>198</a> &gt;&gt;::JoinHandle,
<a href=#199 id=199 data-nosnippet>199</a> &gt;],
<a href=#200 id=200 data-nosnippet>200</a> _worker_pool: <span class="kw-2">&amp;mut </span>WorkerPool&lt;
<a href=#201 id=201 data-nosnippet>201</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#202 id=202 data-nosnippet>202</a> UnionHasher&lt;Alloc&gt;,
<a href=#203 id=203 data-nosnippet>203</a> Alloc,
<a href=#204 id=204 data-nosnippet>204</a> (SliceW, BrotliEncoderParams),
<a href=#205 id=205 data-nosnippet>205</a> &gt;,
<a href=#206 id=206 data-nosnippet>206</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#207 id=207 data-nosnippet>207</a><span class="kw">where
<a href=#208 id=208 data-nosnippet>208</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#209 id=209 data-nosnippet>209</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send,
<a href=#210 id=210 data-nosnippet>210</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send,
<a href=#211 id=211 data-nosnippet>211</a>{
<a href=#212 id=212 data-nosnippet>212</a> compress_multi(params, owned_input, output, alloc_per_thread)
<a href=#213 id=213 data-nosnippet>213</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,329 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/stride_eval.rs`."><title>stride_eval.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>stride_eval.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">super</span>::<span class="kw">super</span>::alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">super</span>::backward_references::BrotliEncoderParams;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">super</span>::input_pair::{InputPair, InputReference, InputReferenceMut};
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use </span><span class="kw">super</span>::interface;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::ir_interpret::{push_base, IRInterpreter};
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">super</span>::prior_eval::DEFAULT_SPEED;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">super</span>::util::{floatX, FastLog2u16};
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::{alloc_default, allocate};
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">const </span>NIBBLE_PRIOR_SIZE: usize = <span class="number">16</span>;
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">pub const </span>STRIDE_PRIOR_SIZE: usize = <span class="number">256 </span>* <span class="number">256 </span>* NIBBLE_PRIOR_SIZE * <span class="number">2</span>;
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">pub fn </span>local_init_cdfs(cdfs: <span class="kw-2">&amp;mut </span>[u16]) {
<a href=#16 id=16 data-nosnippet>16</a> <span class="kw">for </span>(index, item) <span class="kw">in </span>cdfs.iter_mut().enumerate() {
<a href=#17 id=17 data-nosnippet>17</a> <span class="kw-2">*</span>item = <span class="number">4 </span>+ <span class="number">4 </span>* (index <span class="kw">as </span>u16 &amp; <span class="number">0x0f</span>);
<a href=#18 id=18 data-nosnippet>18</a> }
<a href=#19 id=19 data-nosnippet>19</a>}
<a href=#20 id=20 data-nosnippet>20</a><span class="attr">#[allow(unused_variables)]
<a href=#21 id=21 data-nosnippet>21</a></span><span class="kw">fn </span>stride_lookup_lin(
<a href=#22 id=22 data-nosnippet>22</a> stride_byte: u8,
<a href=#23 id=23 data-nosnippet>23</a> selected_context: u8,
<a href=#24 id=24 data-nosnippet>24</a> actual_context: usize,
<a href=#25 id=25 data-nosnippet>25</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#26 id=26 data-nosnippet>26</a>) -&gt; usize {
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(nibble) = high_nibble {
<a href=#28 id=28 data-nosnippet>28</a> <span class="number">1 </span>+ <span class="number">2 </span>* (actual_context | ((stride_byte <span class="kw">as </span>usize &amp; <span class="number">0xf</span>) &lt;&lt; <span class="number">8</span>) | ((nibble <span class="kw">as </span>usize) &lt;&lt; <span class="number">12</span>))
<a href=#29 id=29 data-nosnippet>29</a> } <span class="kw">else </span>{
<a href=#30 id=30 data-nosnippet>30</a> <span class="number">2 </span>* (actual_context | ((stride_byte <span class="kw">as </span>usize) &lt;&lt; <span class="number">8</span>))
<a href=#31 id=31 data-nosnippet>31</a> }
<a href=#32 id=32 data-nosnippet>32</a>}
<a href=#33 id=33 data-nosnippet>33</a>
<a href=#34 id=34 data-nosnippet>34</a><span class="kw">struct </span>CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#35 id=35 data-nosnippet>35</a> cdf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u16],
<a href=#36 id=36 data-nosnippet>36</a>}
<a href=#37 id=37 data-nosnippet>37</a><span class="kw">struct </span>Stride1Prior {}
<a href=#38 id=38 data-nosnippet>38</a><span class="kw">impl </span>Stride1Prior {
<a href=#39 id=39 data-nosnippet>39</a> <span class="kw">fn </span>lookup_lin(
<a href=#40 id=40 data-nosnippet>40</a> stride_byte: u8,
<a href=#41 id=41 data-nosnippet>41</a> selected_context: u8,
<a href=#42 id=42 data-nosnippet>42</a> actual_context: usize,
<a href=#43 id=43 data-nosnippet>43</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#44 id=44 data-nosnippet>44</a> ) -&gt; usize {
<a href=#45 id=45 data-nosnippet>45</a> stride_lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#46 id=46 data-nosnippet>46</a> }
<a href=#47 id=47 data-nosnippet>47</a> <span class="kw">fn </span>lookup_mut(
<a href=#48 id=48 data-nosnippet>48</a> data: <span class="kw-2">&amp;mut </span>[u16],
<a href=#49 id=49 data-nosnippet>49</a> stride_byte: u8,
<a href=#50 id=50 data-nosnippet>50</a> selected_context: u8,
<a href=#51 id=51 data-nosnippet>51</a> actual_context: usize,
<a href=#52 id=52 data-nosnippet>52</a> high_nibble: <span class="prelude-ty">Option</span>&lt;u8&gt;,
<a href=#53 id=53 data-nosnippet>53</a> ) -&gt; CDF {
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">let </span>index = <span class="self">Self</span>::lookup_lin(stride_byte, selected_context, actual_context, high_nibble)
<a href=#55 id=55 data-nosnippet>55</a> * NIBBLE_PRIOR_SIZE;
<a href=#56 id=56 data-nosnippet>56</a> CDF::from(data.split_at_mut(index).<span class="number">1</span>.split_at_mut(<span class="number">16</span>).<span class="number">0</span>)
<a href=#57 id=57 data-nosnippet>57</a> }
<a href=#58 id=58 data-nosnippet>58</a>}
<a href=#59 id=59 data-nosnippet>59</a>
<a href=#60 id=60 data-nosnippet>60</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">pub fn </span>cost(<span class="kw-2">&amp;</span><span class="self">self</span>, nibble_u8: u8) -&gt; floatX {
<a href=#62 id=62 data-nosnippet>62</a> <span class="macro">assert_eq!</span>(<span class="self">self</span>.cdf.len(), <span class="number">16</span>);
<a href=#63 id=63 data-nosnippet>63</a> <span class="kw">let </span>nibble = nibble_u8 <span class="kw">as </span>usize &amp; <span class="number">0xf</span>;
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">let </span><span class="kw-2">mut </span>pdf = <span class="self">self</span>.cdf[nibble];
<a href=#65 id=65 data-nosnippet>65</a> <span class="kw">if </span><span class="macro">nibble_u8 !</span>= <span class="number">0 </span>{
<a href=#66 id=66 data-nosnippet>66</a> pdf -= <span class="self">self</span>.cdf[nibble - <span class="number">1</span>];
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a> FastLog2u16(<span class="self">self</span>.cdf[<span class="number">15</span>]) - FastLog2u16(pdf)
<a href=#69 id=69 data-nosnippet>69</a> }
<a href=#70 id=70 data-nosnippet>70</a> <span class="kw">pub fn </span>update(<span class="kw-2">&amp;mut </span><span class="self">self</span>, nibble_u8: u8, speed: (u16, u16)) {
<a href=#71 id=71 data-nosnippet>71</a> <span class="macro">assert_eq!</span>(<span class="self">self</span>.cdf.len(), <span class="number">16</span>);
<a href=#72 id=72 data-nosnippet>72</a> <span class="kw">for </span>nib_range <span class="kw">in </span>(nibble_u8 <span class="kw">as </span>usize &amp; <span class="number">0xf</span>)..<span class="number">16 </span>{
<a href=#73 id=73 data-nosnippet>73</a> <span class="self">self</span>.cdf[nib_range] += speed.<span class="number">0</span>;
<a href=#74 id=74 data-nosnippet>74</a> }
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">if </span><span class="self">self</span>.cdf[<span class="number">15</span>] &gt;= speed.<span class="number">1 </span>{
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw">const </span>CDF_BIAS: [u16; <span class="number">16</span>] = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>];
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">for </span>nibble_index <span class="kw">in </span><span class="number">0</span>..<span class="number">16 </span>{
<a href=#78 id=78 data-nosnippet>78</a> <span class="kw">let </span>tmp = <span class="kw-2">&amp;mut </span><span class="self">self</span>.cdf[nibble_index];
<a href=#79 id=79 data-nosnippet>79</a> <span class="kw-2">*</span>tmp = (tmp.wrapping_add(CDF_BIAS[nibble_index]))
<a href=#80 id=80 data-nosnippet>80</a> .wrapping_sub(tmp.wrapping_add(CDF_BIAS[nibble_index]) &gt;&gt; <span class="number">2</span>);
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a> }
<a href=#83 id=83 data-nosnippet>83</a> }
<a href=#84 id=84 data-nosnippet>84</a>}
<a href=#85 id=85 data-nosnippet>85</a>
<a href=#86 id=86 data-nosnippet>86</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u16]&gt; <span class="kw">for </span>CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw">fn </span>from(cdf: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>[u16]) -&gt; CDF&lt;<span class="lifetime">'a</span>&gt; {
<a href=#88 id=88 data-nosnippet>88</a> <span class="macro">assert_eq!</span>(cdf.len(), <span class="number">16</span>);
<a href=#89 id=89 data-nosnippet>89</a> CDF { cdf }
<a href=#90 id=90 data-nosnippet>90</a> }
<a href=#91 id=91 data-nosnippet>91</a>}
<a href=#92 id=92 data-nosnippet>92</a>
<a href=#93 id=93 data-nosnippet>93</a><span class="kw">pub struct </span>StrideEval&lt;
<a href=#94 id=94 data-nosnippet>94</a> <span class="lifetime">'a</span>,
<a href=#95 id=95 data-nosnippet>95</a> Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt; + <span class="lifetime">'a</span>,
<a href=#96 id=96 data-nosnippet>96</a>&gt; {
<a href=#97 id=97 data-nosnippet>97</a> input: InputPair&lt;<span class="lifetime">'a</span>&gt;,
<a href=#98 id=98 data-nosnippet>98</a> alloc: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>Alloc,
<a href=#99 id=99 data-nosnippet>99</a> context_map: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#100 id=100 data-nosnippet>100</a> block_type: u8,
<a href=#101 id=101 data-nosnippet>101</a> local_byte_offset: usize,
<a href=#102 id=102 data-nosnippet>102</a> stride_priors: [&lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory; <span class="number">8</span>],
<a href=#103 id=103 data-nosnippet>103</a> score: &lt;Alloc <span class="kw">as </span>Allocator&lt;floatX&gt;&gt;::AllocatedMemory,
<a href=#104 id=104 data-nosnippet>104</a> cur_score_epoch: usize,
<a href=#105 id=105 data-nosnippet>105</a> stride_speed: [(u16, u16); <span class="number">2</span>],
<a href=#106 id=106 data-nosnippet>106</a> cur_stride: u8,
<a href=#107 id=107 data-nosnippet>107</a>}
<a href=#108 id=108 data-nosnippet>108</a>
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt; + <span class="lifetime">'a</span>&gt;
<a href=#110 id=110 data-nosnippet>110</a> StrideEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#111 id=111 data-nosnippet>111</a>{
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw">pub fn </span>new(
<a href=#113 id=113 data-nosnippet>113</a> alloc: <span class="kw-2">&amp;</span><span class="lifetime">'a </span><span class="kw-2">mut </span>Alloc,
<a href=#114 id=114 data-nosnippet>114</a> input: InputPair&lt;<span class="lifetime">'a</span>&gt;,
<a href=#115 id=115 data-nosnippet>115</a> prediction_mode: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>interface::PredictionModeContextMap&lt;InputReferenceMut&lt;<span class="lifetime">'a</span>&gt;&gt;,
<a href=#116 id=116 data-nosnippet>116</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#117 id=117 data-nosnippet>117</a> ) -&gt; <span class="self">Self </span>{
<a href=#118 id=118 data-nosnippet>118</a> <span class="kw">let </span>do_alloc = <span class="bool-val">true</span>;
<a href=#119 id=119 data-nosnippet>119</a> <span class="kw">let </span><span class="kw-2">mut </span>stride_speed = prediction_mode.stride_context_speed();
<a href=#120 id=120 data-nosnippet>120</a> <span class="kw">if </span>stride_speed[<span class="number">0</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#121 id=121 data-nosnippet>121</a> stride_speed[<span class="number">0</span>] = params.literal_adaptation[<span class="number">0</span>]
<a href=#122 id=122 data-nosnippet>122</a> }
<a href=#123 id=123 data-nosnippet>123</a> <span class="kw">if </span>stride_speed[<span class="number">0</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#124 id=124 data-nosnippet>124</a> stride_speed[<span class="number">0</span>] = DEFAULT_SPEED;
<a href=#125 id=125 data-nosnippet>125</a> }
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw">if </span>stride_speed[<span class="number">1</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#127 id=127 data-nosnippet>127</a> stride_speed[<span class="number">1</span>] = params.literal_adaptation[<span class="number">1</span>]
<a href=#128 id=128 data-nosnippet>128</a> }
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw">if </span>stride_speed[<span class="number">1</span>] == (<span class="number">0</span>, <span class="number">0</span>) {
<a href=#130 id=130 data-nosnippet>130</a> stride_speed[<span class="number">1</span>] = stride_speed[<span class="number">0</span>];
<a href=#131 id=131 data-nosnippet>131</a> }
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">let </span>score = <span class="kw">if </span>do_alloc {
<a href=#133 id=133 data-nosnippet>133</a> allocate::&lt;floatX, <span class="kw">_</span>&gt;(alloc, <span class="number">8 </span>* <span class="number">4</span>) <span class="comment">// FIXME make this bigger than just 4
<a href=#134 id=134 data-nosnippet>134</a> </span>} <span class="kw">else </span>{
<a href=#135 id=135 data-nosnippet>135</a> alloc_default::&lt;floatX, Alloc&gt;()
<a href=#136 id=136 data-nosnippet>136</a> };
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">let </span>stride_priors = <span class="kw">if </span>do_alloc {
<a href=#138 id=138 data-nosnippet>138</a> [
<a href=#139 id=139 data-nosnippet>139</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#140 id=140 data-nosnippet>140</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#141 id=141 data-nosnippet>141</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#142 id=142 data-nosnippet>142</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#143 id=143 data-nosnippet>143</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#144 id=144 data-nosnippet>144</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#145 id=145 data-nosnippet>145</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#146 id=146 data-nosnippet>146</a> allocate::&lt;u16, <span class="kw">_</span>&gt;(alloc, STRIDE_PRIOR_SIZE),
<a href=#147 id=147 data-nosnippet>147</a> ]
<a href=#148 id=148 data-nosnippet>148</a> } <span class="kw">else </span>{
<a href=#149 id=149 data-nosnippet>149</a> [
<a href=#150 id=150 data-nosnippet>150</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#151 id=151 data-nosnippet>151</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#152 id=152 data-nosnippet>152</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#153 id=153 data-nosnippet>153</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#154 id=154 data-nosnippet>154</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#155 id=155 data-nosnippet>155</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#156 id=156 data-nosnippet>156</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#157 id=157 data-nosnippet>157</a> alloc_default::&lt;u16, Alloc&gt;(),
<a href=#158 id=158 data-nosnippet>158</a> ]
<a href=#159 id=159 data-nosnippet>159</a> };
<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = StrideEval::&lt;Alloc&gt; {
<a href=#161 id=161 data-nosnippet>161</a> input,
<a href=#162 id=162 data-nosnippet>162</a> context_map: prediction_mode,
<a href=#163 id=163 data-nosnippet>163</a> block_type: <span class="number">0</span>,
<a href=#164 id=164 data-nosnippet>164</a> alloc,
<a href=#165 id=165 data-nosnippet>165</a> cur_stride: <span class="number">1</span>,
<a href=#166 id=166 data-nosnippet>166</a> cur_score_epoch: <span class="number">0</span>,
<a href=#167 id=167 data-nosnippet>167</a> local_byte_offset: <span class="number">0</span>,
<a href=#168 id=168 data-nosnippet>168</a> stride_priors,
<a href=#169 id=169 data-nosnippet>169</a> score,
<a href=#170 id=170 data-nosnippet>170</a> stride_speed,
<a href=#171 id=171 data-nosnippet>171</a> };
<a href=#172 id=172 data-nosnippet>172</a> <span class="kw">for </span>stride_prior <span class="kw">in </span>ret.stride_priors.iter_mut() {
<a href=#173 id=173 data-nosnippet>173</a> local_init_cdfs(stride_prior.slice_mut());
<a href=#174 id=174 data-nosnippet>174</a> }
<a href=#175 id=175 data-nosnippet>175</a> ret
<a href=#176 id=176 data-nosnippet>176</a> }
<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">pub fn </span>alloc(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>Alloc {
<a href=#178 id=178 data-nosnippet>178</a> <span class="self">self</span>.alloc
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">pub fn </span>choose_stride(<span class="kw-2">&amp;</span><span class="self">self</span>, stride_data: <span class="kw-2">&amp;mut </span>[u8]) {
<a href=#181 id=181 data-nosnippet>181</a> <span class="macro">assert_eq!</span>(stride_data.len(), <span class="self">self</span>.cur_score_epoch);
<a href=#182 id=182 data-nosnippet>182</a> <span class="macro">assert!</span>(<span class="self">self</span>.score.slice().len() &gt; stride_data.len());
<a href=#183 id=183 data-nosnippet>183</a> <span class="macro">assert!</span>(<span class="self">self</span>.score.slice().len() &gt; (stride_data.len() &lt;&lt; <span class="number">3</span>) + <span class="number">7 </span>+ <span class="number">8</span>);
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">for </span>(index, choice) <span class="kw">in </span>stride_data.iter_mut().enumerate() {
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">let </span>choices = <span class="self">self
<a href=#186 id=186 data-nosnippet>186</a> </span>.score
<a href=#187 id=187 data-nosnippet>187</a> .slice()
<a href=#188 id=188 data-nosnippet>188</a> .split_at((<span class="number">1 </span>+ index) &lt;&lt; <span class="number">3</span>)
<a href=#189 id=189 data-nosnippet>189</a> .<span class="number">1
<a href=#190 id=190 data-nosnippet>190</a> </span>.split_at(<span class="number">8</span>)
<a href=#191 id=191 data-nosnippet>191</a> .<span class="number">0</span>;
<a href=#192 id=192 data-nosnippet>192</a> <span class="kw">let </span><span class="kw-2">mut </span>best_choice: u8 = <span class="number">0</span>;
<a href=#193 id=193 data-nosnippet>193</a> <span class="kw">let </span><span class="kw-2">mut </span>best_score = choices[<span class="number">0</span>];
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">for </span>(cur_index, cur_score) <span class="kw">in </span>choices.iter().enumerate() {
<a href=#195 id=195 data-nosnippet>195</a> <span class="kw">if </span><span class="kw-2">*</span>cur_score + <span class="number">2.0 </span>&lt; best_score {
<a href=#196 id=196 data-nosnippet>196</a> <span class="comment">// needs to be 2 bits better to be worth the type switch
<a href=#197 id=197 data-nosnippet>197</a> </span>best_score = <span class="kw-2">*</span>cur_score;
<a href=#198 id=198 data-nosnippet>198</a> best_choice = cur_index <span class="kw">as </span>u8;
<a href=#199 id=199 data-nosnippet>199</a> }
<a href=#200 id=200 data-nosnippet>200</a> }
<a href=#201 id=201 data-nosnippet>201</a> <span class="kw-2">*</span>choice = best_choice;
<a href=#202 id=202 data-nosnippet>202</a> }
<a href=#203 id=203 data-nosnippet>203</a> }
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">pub fn </span>num_types(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#205 id=205 data-nosnippet>205</a> <span class="self">self</span>.cur_score_epoch
<a href=#206 id=206 data-nosnippet>206</a> }
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">fn </span>update_cost_base(
<a href=#208 id=208 data-nosnippet>208</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#209 id=209 data-nosnippet>209</a> stride_prior: [u8; <span class="number">8</span>],
<a href=#210 id=210 data-nosnippet>210</a> selected_bits: u8,
<a href=#211 id=211 data-nosnippet>211</a> cm_prior: usize,
<a href=#212 id=212 data-nosnippet>212</a> literal: u8,
<a href=#213 id=213 data-nosnippet>213</a> ) {
<a href=#214 id=214 data-nosnippet>214</a> <span class="kw">type </span>CurPrior = Stride1Prior;
<a href=#215 id=215 data-nosnippet>215</a> {
<a href=#216 id=216 data-nosnippet>216</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">8 </span>{
<a href=#217 id=217 data-nosnippet>217</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#218 id=218 data-nosnippet>218</a> <span class="self">self</span>.stride_priors[i].slice_mut(),
<a href=#219 id=219 data-nosnippet>219</a> stride_prior[i],
<a href=#220 id=220 data-nosnippet>220</a> selected_bits,
<a href=#221 id=221 data-nosnippet>221</a> cm_prior,
<a href=#222 id=222 data-nosnippet>222</a> <span class="prelude-val">None</span>,
<a href=#223 id=223 data-nosnippet>223</a> );
<a href=#224 id=224 data-nosnippet>224</a> <span class="self">self</span>.score.slice_mut()[<span class="self">self</span>.cur_score_epoch * <span class="number">8 </span>+ i] += cdf.cost(literal &gt;&gt; <span class="number">4</span>);
<a href=#225 id=225 data-nosnippet>225</a> cdf.update(literal &gt;&gt; <span class="number">4</span>, <span class="self">self</span>.stride_speed[<span class="number">1</span>]);
<a href=#226 id=226 data-nosnippet>226</a> }
<a href=#227 id=227 data-nosnippet>227</a> }
<a href=#228 id=228 data-nosnippet>228</a> {
<a href=#229 id=229 data-nosnippet>229</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">8 </span>{
<a href=#230 id=230 data-nosnippet>230</a> <span class="kw">let </span><span class="kw-2">mut </span>cdf = CurPrior::lookup_mut(
<a href=#231 id=231 data-nosnippet>231</a> <span class="self">self</span>.stride_priors[i].slice_mut(),
<a href=#232 id=232 data-nosnippet>232</a> stride_prior[i],
<a href=#233 id=233 data-nosnippet>233</a> selected_bits,
<a href=#234 id=234 data-nosnippet>234</a> cm_prior,
<a href=#235 id=235 data-nosnippet>235</a> <span class="prelude-val">Some</span>(literal &gt;&gt; <span class="number">4</span>),
<a href=#236 id=236 data-nosnippet>236</a> );
<a href=#237 id=237 data-nosnippet>237</a> <span class="self">self</span>.score.slice_mut()[<span class="self">self</span>.cur_score_epoch * <span class="number">8 </span>+ i] += cdf.cost(literal &amp; <span class="number">0xf</span>);
<a href=#238 id=238 data-nosnippet>238</a> cdf.update(literal &amp; <span class="number">0xf</span>, <span class="self">self</span>.stride_speed[<span class="number">0</span>]);
<a href=#239 id=239 data-nosnippet>239</a> }
<a href=#240 id=240 data-nosnippet>240</a> }
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a>}
<a href=#243 id=243 data-nosnippet>243</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;&gt; Drop
<a href=#244 id=244 data-nosnippet>244</a> <span class="kw">for </span>StrideEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#245 id=245 data-nosnippet>245</a>{
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#247 id=247 data-nosnippet>247</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;floatX&gt;&gt;::free_cell(<span class="self">self</span>.alloc, core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.score));
<a href=#248 id=248 data-nosnippet>248</a> <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">8 </span>{
<a href=#249 id=249 data-nosnippet>249</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::free_cell(
<a href=#250 id=250 data-nosnippet>250</a> <span class="self">self</span>.alloc,
<a href=#251 id=251 data-nosnippet>251</a> core::mem::take(<span class="kw-2">&amp;mut </span><span class="self">self</span>.stride_priors[i]),
<a href=#252 id=252 data-nosnippet>252</a> );
<a href=#253 id=253 data-nosnippet>253</a> }
<a href=#254 id=254 data-nosnippet>254</a> }
<a href=#255 id=255 data-nosnippet>255</a>}
<a href=#256 id=256 data-nosnippet>256</a>
<a href=#257 id=257 data-nosnippet>257</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;&gt;
<a href=#258 id=258 data-nosnippet>258</a> IRInterpreter <span class="kw">for </span>StrideEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#259 id=259 data-nosnippet>259</a>{
<a href=#260 id=260 data-nosnippet>260</a> <span class="kw">fn </span>inc_local_byte_offset(<span class="kw-2">&amp;mut </span><span class="self">self</span>, inc: usize) {
<a href=#261 id=261 data-nosnippet>261</a> <span class="self">self</span>.local_byte_offset += inc;
<a href=#262 id=262 data-nosnippet>262</a> }
<a href=#263 id=263 data-nosnippet>263</a> <span class="kw">fn </span>local_byte_offset(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#264 id=264 data-nosnippet>264</a> <span class="self">self</span>.local_byte_offset
<a href=#265 id=265 data-nosnippet>265</a> }
<a href=#266 id=266 data-nosnippet>266</a> <span class="kw">fn </span>update_block_type(<span class="kw-2">&amp;mut </span><span class="self">self</span>, new_type: u8, stride: u8) {
<a href=#267 id=267 data-nosnippet>267</a> <span class="self">self</span>.block_type = new_type;
<a href=#268 id=268 data-nosnippet>268</a> <span class="self">self</span>.cur_stride = stride;
<a href=#269 id=269 data-nosnippet>269</a> <span class="self">self</span>.cur_score_epoch += <span class="number">1</span>;
<a href=#270 id=270 data-nosnippet>270</a> <span class="kw">if </span><span class="self">self</span>.cur_score_epoch * <span class="number">8 </span>+ <span class="number">7 </span>&gt;= <span class="self">self</span>.score.slice().len() {
<a href=#271 id=271 data-nosnippet>271</a> <span class="kw">let </span>new_len = <span class="self">self</span>.score.slice().len() * <span class="number">2</span>;
<a href=#272 id=272 data-nosnippet>272</a> <span class="kw">let </span><span class="kw-2">mut </span>new_score = allocate::&lt;floatX, <span class="kw">_</span>&gt;(<span class="self">self</span>.alloc, new_len);
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">for </span>(src, dst) <span class="kw">in </span><span class="self">self</span>.score.slice().iter().zip(
<a href=#274 id=274 data-nosnippet>274</a> new_score
<a href=#275 id=275 data-nosnippet>275</a> .slice_mut()
<a href=#276 id=276 data-nosnippet>276</a> .split_at_mut(<span class="self">self</span>.score.slice().len())
<a href=#277 id=277 data-nosnippet>277</a> .<span class="number">0
<a href=#278 id=278 data-nosnippet>278</a> </span>.iter_mut(),
<a href=#279 id=279 data-nosnippet>279</a> ) {
<a href=#280 id=280 data-nosnippet>280</a> <span class="kw-2">*</span>dst = <span class="kw-2">*</span>src;
<a href=#281 id=281 data-nosnippet>281</a> }
<a href=#282 id=282 data-nosnippet>282</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;floatX&gt;&gt;::free_cell(
<a href=#283 id=283 data-nosnippet>283</a> <span class="self">self</span>.alloc,
<a href=#284 id=284 data-nosnippet>284</a> core::mem::replace(<span class="kw-2">&amp;mut </span><span class="self">self</span>.score, new_score),
<a href=#285 id=285 data-nosnippet>285</a> );
<a href=#286 id=286 data-nosnippet>286</a> }
<a href=#287 id=287 data-nosnippet>287</a> }
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">fn </span>block_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u8 {
<a href=#289 id=289 data-nosnippet>289</a> <span class="self">self</span>.block_type
<a href=#290 id=290 data-nosnippet>290</a> }
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw">fn </span>literal_data_at_offset(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; u8 {
<a href=#292 id=292 data-nosnippet>292</a> <span class="self">self</span>.input[index]
<a href=#293 id=293 data-nosnippet>293</a> }
<a href=#294 id=294 data-nosnippet>294</a> <span class="kw">fn </span>literal_context_map(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[u8] {
<a href=#295 id=295 data-nosnippet>295</a> <span class="self">self</span>.context_map.literal_context_map.slice()
<a href=#296 id=296 data-nosnippet>296</a> }
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw">fn </span>prediction_mode(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw">crate</span>::interface::LiteralPredictionModeNibble {
<a href=#298 id=298 data-nosnippet>298</a> <span class="self">self</span>.context_map.literal_prediction_mode()
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a> <span class="kw">fn </span>update_cost(
<a href=#301 id=301 data-nosnippet>301</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#302 id=302 data-nosnippet>302</a> stride_prior: [u8; <span class="number">8</span>],
<a href=#303 id=303 data-nosnippet>303</a> stride_prior_offset: usize,
<a href=#304 id=304 data-nosnippet>304</a> selected_bits: u8,
<a href=#305 id=305 data-nosnippet>305</a> cm_prior: usize,
<a href=#306 id=306 data-nosnippet>306</a> literal: u8,
<a href=#307 id=307 data-nosnippet>307</a> ) {
<a href=#308 id=308 data-nosnippet>308</a> <span class="kw">let </span>reversed_stride_priors = [
<a href=#309 id=309 data-nosnippet>309</a> stride_prior[stride_prior_offset &amp; <span class="number">7</span>],
<a href=#310 id=310 data-nosnippet>310</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">1</span>) &amp; <span class="number">7</span>],
<a href=#311 id=311 data-nosnippet>311</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">2</span>) &amp; <span class="number">7</span>],
<a href=#312 id=312 data-nosnippet>312</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">3</span>) &amp; <span class="number">7</span>],
<a href=#313 id=313 data-nosnippet>313</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">4</span>) &amp; <span class="number">7</span>],
<a href=#314 id=314 data-nosnippet>314</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">5</span>) &amp; <span class="number">7</span>],
<a href=#315 id=315 data-nosnippet>315</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">6</span>) &amp; <span class="number">7</span>],
<a href=#316 id=316 data-nosnippet>316</a> stride_prior[stride_prior_offset.wrapping_sub(<span class="number">7</span>) &amp; <span class="number">7</span>],
<a href=#317 id=317 data-nosnippet>317</a> ];
<a href=#318 id=318 data-nosnippet>318</a> <span class="self">self</span>.update_cost_base(reversed_stride_priors, selected_bits, cm_prior, literal)
<a href=#319 id=319 data-nosnippet>319</a> }
<a href=#320 id=320 data-nosnippet>320</a>}
<a href=#321 id=321 data-nosnippet>321</a>
<a href=#322 id=322 data-nosnippet>322</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>, <span class="lifetime">'b</span>, Alloc: alloc::Allocator&lt;u16&gt; + alloc::Allocator&lt;u32&gt; + alloc::Allocator&lt;floatX&gt;&gt;
<a href=#323 id=323 data-nosnippet>323</a> interface::CommandProcessor&lt;<span class="lifetime">'b</span>&gt; <span class="kw">for </span>StrideEval&lt;<span class="lifetime">'a</span>, Alloc&gt;
<a href=#324 id=324 data-nosnippet>324</a>{
<a href=#325 id=325 data-nosnippet>325</a> <span class="kw">fn </span>push(<span class="kw-2">&amp;mut </span><span class="self">self</span>, val: interface::Command&lt;InputReference&lt;<span class="lifetime">'b</span>&gt;&gt;) {
<a href=#326 id=326 data-nosnippet>326</a> push_base(<span class="self">self</span>, val)
<a href=#327 id=327 data-nosnippet>327</a> }
<a href=#328 id=328 data-nosnippet>328</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,601 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/threading.rs`."><title>threading.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>threading.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapper, SliceWrapperMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">use </span>core::marker::PhantomData;
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span>core::ops::Range;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>core::{any, mem};
<a href=#5 id=5 data-nosnippet>5</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#6 id=6 data-nosnippet>6</a></span><span class="kw">use </span>std;
<a href=#7 id=7 data-nosnippet>7</a>
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span><span class="kw">super</span>::backward_references::{AnyHasher, BrotliEncoderParams, CloneWithAlloc, UnionHasher};
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span><span class="kw">super</span>::encode::{
<a href=#10 id=10 data-nosnippet>10</a> hasher_setup, BrotliEncoderDestroyInstance, BrotliEncoderMaxCompressedSize,
<a href=#11 id=11 data-nosnippet>11</a> BrotliEncoderOperation, SanitizeParams,
<a href=#12 id=12 data-nosnippet>12</a>};
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span><span class="kw">super</span>::BrotliAlloc;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">use </span><span class="kw">crate</span>::concat::{BroCatli, BroCatliResult};
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::{alloc_default, allocate};
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">use </span><span class="kw">crate</span>::enc::encode::BrotliEncoderStateStruct;
<a href=#17 id=17 data-nosnippet>17</a>
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">pub type </span>PoisonedThreadError = ();
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#21 id=21 data-nosnippet>21</a></span><span class="kw">pub type </span>LowLevelThreadError = std::boxed::Box&lt;<span class="kw">dyn </span>any::Any + Send + <span class="lifetime">'static</span>&gt;;
<a href=#22 id=22 data-nosnippet>22</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#23 id=23 data-nosnippet>23</a></span><span class="kw">pub type </span>LowLevelThreadError = ();
<a href=#24 id=24 data-nosnippet>24</a>
<a href=#25 id=25 data-nosnippet>25</a><span class="kw">pub trait </span>AnyBoxConstructor {
<a href=#26 id=26 data-nosnippet>26</a> <span class="kw">fn </span>new(data: LowLevelThreadError) -&gt; <span class="self">Self</span>;
<a href=#27 id=27 data-nosnippet>27</a>}
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a><span class="kw">pub trait </span>Joinable&lt;T: Send + <span class="lifetime">'static</span>, U: Send + <span class="lifetime">'static</span>&gt;: Sized {
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">fn </span>join(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;T, U&gt;;
<a href=#31 id=31 data-nosnippet>31</a>}
<a href=#32 id=32 data-nosnippet>32</a><span class="attr">#[derive(Debug)]
<a href=#33 id=33 data-nosnippet>33</a></span><span class="kw">pub enum </span>BrotliEncoderThreadError {
<a href=#34 id=34 data-nosnippet>34</a> InsufficientOutputSpace,
<a href=#35 id=35 data-nosnippet>35</a> ConcatenationDidNotProcessFullFile,
<a href=#36 id=36 data-nosnippet>36</a> ConcatenationError(BroCatliResult),
<a href=#37 id=37 data-nosnippet>37</a> ConcatenationFinalizationError(BroCatliResult),
<a href=#38 id=38 data-nosnippet>38</a> OtherThreadPanic,
<a href=#39 id=39 data-nosnippet>39</a> ThreadExecError(LowLevelThreadError),
<a href=#40 id=40 data-nosnippet>40</a>}
<a href=#41 id=41 data-nosnippet>41</a>
<a href=#42 id=42 data-nosnippet>42</a><span class="kw">impl </span>AnyBoxConstructor <span class="kw">for </span>BrotliEncoderThreadError {
<a href=#43 id=43 data-nosnippet>43</a> <span class="kw">fn </span>new(data: LowLevelThreadError) -&gt; <span class="self">Self </span>{
<a href=#44 id=44 data-nosnippet>44</a> BrotliEncoderThreadError::ThreadExecError(data)
<a href=#45 id=45 data-nosnippet>45</a> }
<a href=#46 id=46 data-nosnippet>46</a>}
<a href=#47 id=47 data-nosnippet>47</a>
<a href=#48 id=48 data-nosnippet>48</a><span class="kw">pub struct </span>CompressedFileChunk&lt;Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>&gt;
<a href=#49 id=49 data-nosnippet>49</a><span class="kw">where
<a href=#50 id=50 data-nosnippet>50</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#51 id=51 data-nosnippet>51</a>{
<a href=#52 id=52 data-nosnippet>52</a> data_backing: &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory,
<a href=#53 id=53 data-nosnippet>53</a> data_size: usize,
<a href=#54 id=54 data-nosnippet>54</a>}
<a href=#55 id=55 data-nosnippet>55</a><span class="kw">pub struct </span>CompressionThreadResult&lt;Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>&gt;
<a href=#56 id=56 data-nosnippet>56</a><span class="kw">where
<a href=#57 id=57 data-nosnippet>57</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#58 id=58 data-nosnippet>58</a>{
<a href=#59 id=59 data-nosnippet>59</a> compressed: <span class="prelude-ty">Result</span>&lt;CompressedFileChunk&lt;Alloc&gt;, BrotliEncoderThreadError&gt;,
<a href=#60 id=60 data-nosnippet>60</a> alloc: Alloc,
<a href=#61 id=61 data-nosnippet>61</a>}
<a href=#62 id=62 data-nosnippet>62</a><span class="kw">pub enum </span>InternalSendAlloc&lt;
<a href=#63 id=63 data-nosnippet>63</a> ReturnVal: Send + <span class="lifetime">'static</span>,
<a href=#64 id=64 data-nosnippet>64</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#65 id=65 data-nosnippet>65</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#66 id=66 data-nosnippet>66</a> Join: Joinable&lt;ReturnVal, BrotliEncoderThreadError&gt;,
<a href=#67 id=67 data-nosnippet>67</a>&gt; <span class="kw">where
<a href=#68 id=68 data-nosnippet>68</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#69 id=69 data-nosnippet>69</a>{
<a href=#70 id=70 data-nosnippet>70</a> A(Alloc, ExtraInput),
<a href=#71 id=71 data-nosnippet>71</a> Join(Join),
<a href=#72 id=72 data-nosnippet>72</a> SpawningOrJoining(PhantomData&lt;ReturnVal&gt;),
<a href=#73 id=73 data-nosnippet>73</a>}
<a href=#74 id=74 data-nosnippet>74</a><span class="kw">impl</span>&lt;
<a href=#75 id=75 data-nosnippet>75</a> ReturnVal: Send + <span class="lifetime">'static</span>,
<a href=#76 id=76 data-nosnippet>76</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#77 id=77 data-nosnippet>77</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#78 id=78 data-nosnippet>78</a> Join: Joinable&lt;ReturnVal, BrotliEncoderThreadError&gt;,
<a href=#79 id=79 data-nosnippet>79</a> &gt; InternalSendAlloc&lt;ReturnVal, ExtraInput, Alloc, Join&gt;
<a href=#80 id=80 data-nosnippet>80</a><span class="kw">where
<a href=#81 id=81 data-nosnippet>81</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#82 id=82 data-nosnippet>82</a>{
<a href=#83 id=83 data-nosnippet>83</a> <span class="kw">fn </span>unwrap_input(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; (<span class="kw-2">&amp;mut </span>Alloc, <span class="kw-2">&amp;mut </span>ExtraInput) {
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">match </span><span class="kw-2">*</span><span class="self">self </span>{
<a href=#85 id=85 data-nosnippet>85</a> InternalSendAlloc::A(<span class="kw-2">ref mut </span>alloc, <span class="kw-2">ref mut </span>extra) =&gt; (alloc, extra),
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">_ </span>=&gt; <span class="macro">panic!</span>(<span class="string">"Bad state for allocator"</span>),
<a href=#87 id=87 data-nosnippet>87</a> }
<a href=#88 id=88 data-nosnippet>88</a> }
<a href=#89 id=89 data-nosnippet>89</a>}
<a href=#90 id=90 data-nosnippet>90</a>
<a href=#91 id=91 data-nosnippet>91</a><span class="kw">pub struct </span>SendAlloc&lt;
<a href=#92 id=92 data-nosnippet>92</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#93 id=93 data-nosnippet>93</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#94 id=94 data-nosnippet>94</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#95 id=95 data-nosnippet>95</a> Join: Joinable&lt;ReturnValue, BrotliEncoderThreadError&gt;,
<a href=#96 id=96 data-nosnippet>96</a>&gt;(<span class="kw">pub </span>InternalSendAlloc&lt;ReturnValue, ExtraInput, Alloc, Join&gt;)
<a href=#97 id=97 data-nosnippet>97</a><span class="comment">//FIXME pub
<a href=#98 id=98 data-nosnippet>98</a></span><span class="kw">where
<a href=#99 id=99 data-nosnippet>99</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send;
<a href=#100 id=100 data-nosnippet>100</a>
<a href=#101 id=101 data-nosnippet>101</a><span class="kw">impl</span>&lt;
<a href=#102 id=102 data-nosnippet>102</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#103 id=103 data-nosnippet>103</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#104 id=104 data-nosnippet>104</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#105 id=105 data-nosnippet>105</a> Join: Joinable&lt;ReturnValue, BrotliEncoderThreadError&gt;,
<a href=#106 id=106 data-nosnippet>106</a> &gt; SendAlloc&lt;ReturnValue, ExtraInput, Alloc, Join&gt;
<a href=#107 id=107 data-nosnippet>107</a><span class="kw">where
<a href=#108 id=108 data-nosnippet>108</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#109 id=109 data-nosnippet>109</a>{
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">pub fn </span>new(alloc: Alloc, extra_input: ExtraInput) -&gt; <span class="self">Self </span>{
<a href=#111 id=111 data-nosnippet>111</a> SendAlloc::&lt;ReturnValue, ExtraInput, Alloc, Join&gt;(InternalSendAlloc::A(alloc, extra_input))
<a href=#112 id=112 data-nosnippet>112</a> }
<a href=#113 id=113 data-nosnippet>113</a> <span class="kw">pub fn </span>unwrap_or(<span class="self">self</span>, other: Alloc, other_extra: ExtraInput) -&gt; (Alloc, ExtraInput) {
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0 </span>{
<a href=#115 id=115 data-nosnippet>115</a> InternalSendAlloc::A(alloc, extra_input) =&gt; (alloc, extra_input),
<a href=#116 id=116 data-nosnippet>116</a> InternalSendAlloc::SpawningOrJoining(<span class="kw">_</span>) | InternalSendAlloc::Join(<span class="kw">_</span>) =&gt; {
<a href=#117 id=117 data-nosnippet>117</a> (other, other_extra)
<a href=#118 id=118 data-nosnippet>118</a> }
<a href=#119 id=119 data-nosnippet>119</a> }
<a href=#120 id=120 data-nosnippet>120</a> }
<a href=#121 id=121 data-nosnippet>121</a> <span class="kw">fn </span>unwrap_view_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; (<span class="kw-2">&amp;mut </span>Alloc, <span class="kw-2">&amp;mut </span>ExtraInput) {
<a href=#122 id=122 data-nosnippet>122</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0 </span>{
<a href=#123 id=123 data-nosnippet>123</a> InternalSendAlloc::A(<span class="kw-2">ref mut </span>alloc, <span class="kw-2">ref mut </span>extra_input) =&gt; (alloc, extra_input),
<a href=#124 id=124 data-nosnippet>124</a> InternalSendAlloc::SpawningOrJoining(<span class="kw">_</span>) | InternalSendAlloc::Join(<span class="kw">_</span>) =&gt; {
<a href=#125 id=125 data-nosnippet>125</a> <span class="macro">panic!</span>(<span class="string">"Item permanently borrowed/leaked"</span>)
<a href=#126 id=126 data-nosnippet>126</a> }
<a href=#127 id=127 data-nosnippet>127</a> }
<a href=#128 id=128 data-nosnippet>128</a> }
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw">pub fn </span>unwrap(<span class="self">self</span>) -&gt; (Alloc, ExtraInput) {
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw">match </span><span class="self">self</span>.<span class="number">0 </span>{
<a href=#131 id=131 data-nosnippet>131</a> InternalSendAlloc::A(alloc, extra_input) =&gt; (alloc, extra_input),
<a href=#132 id=132 data-nosnippet>132</a> InternalSendAlloc::SpawningOrJoining(<span class="kw">_</span>) | InternalSendAlloc::Join(<span class="kw">_</span>) =&gt; {
<a href=#133 id=133 data-nosnippet>133</a> <span class="macro">panic!</span>(<span class="string">"Item permanently borrowed/leaked"</span>)
<a href=#134 id=134 data-nosnippet>134</a> }
<a href=#135 id=135 data-nosnippet>135</a> }
<a href=#136 id=136 data-nosnippet>136</a> }
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">pub fn </span>replace_with_default(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; (Alloc, ExtraInput) {
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">match </span>mem::replace(
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>,
<a href=#140 id=140 data-nosnippet>140</a> InternalSendAlloc::SpawningOrJoining(PhantomData),
<a href=#141 id=141 data-nosnippet>141</a> ) {
<a href=#142 id=142 data-nosnippet>142</a> InternalSendAlloc::A(alloc, extra_input) =&gt; (alloc, extra_input),
<a href=#143 id=143 data-nosnippet>143</a> InternalSendAlloc::SpawningOrJoining(<span class="kw">_</span>) | InternalSendAlloc::Join(<span class="kw">_</span>) =&gt; {
<a href=#144 id=144 data-nosnippet>144</a> <span class="macro">panic!</span>(<span class="string">"Item permanently borrowed/leaked"</span>)
<a href=#145 id=145 data-nosnippet>145</a> }
<a href=#146 id=146 data-nosnippet>146</a> }
<a href=#147 id=147 data-nosnippet>147</a> }
<a href=#148 id=148 data-nosnippet>148</a>}
<a href=#149 id=149 data-nosnippet>149</a>
<a href=#150 id=150 data-nosnippet>150</a><span class="kw">pub enum </span>InternalOwned&lt;T&gt; {
<a href=#151 id=151 data-nosnippet>151</a> <span class="comment">// FIXME pub
<a href=#152 id=152 data-nosnippet>152</a> </span>Item(T),
<a href=#153 id=153 data-nosnippet>153</a> Borrowed,
<a href=#154 id=154 data-nosnippet>154</a>}
<a href=#155 id=155 data-nosnippet>155</a>
<a href=#156 id=156 data-nosnippet>156</a><span class="kw">pub struct </span>Owned&lt;T&gt;(<span class="kw">pub </span>InternalOwned&lt;T&gt;); <span class="comment">// FIXME pub
<a href=#157 id=157 data-nosnippet>157</a></span><span class="kw">impl</span>&lt;T&gt; Owned&lt;T&gt; {
<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">pub fn </span>new(data: T) -&gt; <span class="self">Self </span>{
<a href=#159 id=159 data-nosnippet>159</a> Owned::&lt;T&gt;(InternalOwned::Item(data))
<a href=#160 id=160 data-nosnippet>160</a> }
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">pub fn </span>unwrap_or(<span class="self">self</span>, other: T) -&gt; T {
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">if let </span>InternalOwned::Item(x) = <span class="self">self</span>.<span class="number">0 </span>{
<a href=#163 id=163 data-nosnippet>163</a> x
<a href=#164 id=164 data-nosnippet>164</a> } <span class="kw">else </span>{
<a href=#165 id=165 data-nosnippet>165</a> other
<a href=#166 id=166 data-nosnippet>166</a> }
<a href=#167 id=167 data-nosnippet>167</a> }
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">pub fn </span>unwrap(<span class="self">self</span>) -&gt; T {
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">if let </span>InternalOwned::Item(x) = <span class="self">self</span>.<span class="number">0 </span>{
<a href=#170 id=170 data-nosnippet>170</a> x
<a href=#171 id=171 data-nosnippet>171</a> } <span class="kw">else </span>{
<a href=#172 id=172 data-nosnippet>172</a> <span class="macro">panic!</span>(<span class="string">"Item permanently borrowed"</span>)
<a href=#173 id=173 data-nosnippet>173</a> }
<a href=#174 id=174 data-nosnippet>174</a> }
<a href=#175 id=175 data-nosnippet>175</a> <span class="kw">pub fn </span>view(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>T {
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">if let </span>InternalOwned::Item(<span class="kw-2">ref </span>x) = <span class="self">self</span>.<span class="number">0 </span>{
<a href=#177 id=177 data-nosnippet>177</a> x
<a href=#178 id=178 data-nosnippet>178</a> } <span class="kw">else </span>{
<a href=#179 id=179 data-nosnippet>179</a> <span class="macro">panic!</span>(<span class="string">"Item permanently borrowed"</span>)
<a href=#180 id=180 data-nosnippet>180</a> }
<a href=#181 id=181 data-nosnippet>181</a> }
<a href=#182 id=182 data-nosnippet>182</a>}
<a href=#183 id=183 data-nosnippet>183</a>
<a href=#184 id=184 data-nosnippet>184</a><span class="kw">pub trait </span>OwnedRetriever&lt;U: Send + <span class="lifetime">'static</span>&gt; {
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">fn </span>view&lt;T, F: FnOnce(<span class="kw-2">&amp;</span>U) -&gt; T&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, f: F) -&gt; <span class="prelude-ty">Result</span>&lt;T, PoisonedThreadError&gt;;
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw">fn </span>unwrap(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;U, PoisonedThreadError&gt;;
<a href=#187 id=187 data-nosnippet>187</a>}
<a href=#188 id=188 data-nosnippet>188</a>
<a href=#189 id=189 data-nosnippet>189</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#190 id=190 data-nosnippet>190</a></span><span class="kw">impl</span>&lt;U: Send + <span class="lifetime">'static</span>&gt; OwnedRetriever&lt;U&gt; <span class="kw">for </span>std::sync::Arc&lt;std::sync::RwLock&lt;U&gt;&gt; {
<a href=#191 id=191 data-nosnippet>191</a> <span class="kw">fn </span>view&lt;T, F: FnOnce(<span class="kw-2">&amp;</span>U) -&gt; T&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, f: F) -&gt; <span class="prelude-ty">Result</span>&lt;T, PoisonedThreadError&gt; {
<a href=#192 id=192 data-nosnippet>192</a> <span class="kw">match </span><span class="self">self</span>.read() {
<a href=#193 id=193 data-nosnippet>193</a> <span class="prelude-val">Ok</span>(<span class="kw-2">ref </span>u) =&gt; <span class="prelude-val">Ok</span>(f(u)),
<a href=#194 id=194 data-nosnippet>194</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(PoisonedThreadError::default()),
<a href=#195 id=195 data-nosnippet>195</a> }
<a href=#196 id=196 data-nosnippet>196</a> }
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">fn </span>unwrap(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;U, PoisonedThreadError&gt; {
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw">match </span>std::sync::Arc::try_unwrap(<span class="self">self</span>) {
<a href=#199 id=199 data-nosnippet>199</a> <span class="prelude-val">Ok</span>(rwlock) =&gt; <span class="kw">match </span>rwlock.into_inner() {
<a href=#200 id=200 data-nosnippet>200</a> <span class="prelude-val">Ok</span>(u) =&gt; <span class="prelude-val">Ok</span>(u),
<a href=#201 id=201 data-nosnippet>201</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(PoisonedThreadError::default()),
<a href=#202 id=202 data-nosnippet>202</a> },
<a href=#203 id=203 data-nosnippet>203</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(PoisonedThreadError::default()),
<a href=#204 id=204 data-nosnippet>204</a> }
<a href=#205 id=205 data-nosnippet>205</a> }
<a href=#206 id=206 data-nosnippet>206</a>}
<a href=#207 id=207 data-nosnippet>207</a>
<a href=#208 id=208 data-nosnippet>208</a><span class="kw">pub trait </span>BatchSpawnable&lt;
<a href=#209 id=209 data-nosnippet>209</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#210 id=210 data-nosnippet>210</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#211 id=211 data-nosnippet>211</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#212 id=212 data-nosnippet>212</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#213 id=213 data-nosnippet>213</a>&gt; <span class="kw">where
<a href=#214 id=214 data-nosnippet>214</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#215 id=215 data-nosnippet>215</a>{
<a href=#216 id=216 data-nosnippet>216</a> <span class="kw">type </span>JoinHandle: Joinable&lt;ReturnValue, BrotliEncoderThreadError&gt;;
<a href=#217 id=217 data-nosnippet>217</a> <span class="kw">type </span>FinalJoinHandle: OwnedRetriever&lt;U&gt;;
<a href=#218 id=218 data-nosnippet>218</a> <span class="comment">// this function takes in an input slice
<a href=#219 id=219 data-nosnippet>219</a> // a SendAlloc per thread and converts them all into JoinHandle
<a href=#220 id=220 data-nosnippet>220</a> // the input is borrowed until the joins complete
<a href=#221 id=221 data-nosnippet>221</a> // owned is set to borrowed
<a href=#222 id=222 data-nosnippet>222</a> // the final join handle is a r/w lock which will return the SliceW to the owner
<a href=#223 id=223 data-nosnippet>223</a> // the FinalJoinHandle is only to be called when each individual JoinHandle has been examined
<a href=#224 id=224 data-nosnippet>224</a> // the function is called with the thread_index, the num_threads, a reference to the slice under a read lock,
<a href=#225 id=225 data-nosnippet>225</a> // and an allocator from the alloc_per_thread
<a href=#226 id=226 data-nosnippet>226</a> </span><span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle;
<a href=#227 id=227 data-nosnippet>227</a> <span class="kw">fn </span>spawn&lt;F: Fn(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue + Send + <span class="lifetime">'static </span>+ Copy&gt;(
<a href=#228 id=228 data-nosnippet>228</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#229 id=229 data-nosnippet>229</a> handle: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#230 id=230 data-nosnippet>230</a> alloc: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#231 id=231 data-nosnippet>231</a> index: usize,
<a href=#232 id=232 data-nosnippet>232</a> num_threads: usize,
<a href=#233 id=233 data-nosnippet>233</a> f: F,
<a href=#234 id=234 data-nosnippet>234</a> );
<a href=#235 id=235 data-nosnippet>235</a>}
<a href=#236 id=236 data-nosnippet>236</a>
<a href=#237 id=237 data-nosnippet>237</a><span class="kw">pub trait </span>BatchSpawnableLite&lt;
<a href=#238 id=238 data-nosnippet>238</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#239 id=239 data-nosnippet>239</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#240 id=240 data-nosnippet>240</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#241 id=241 data-nosnippet>241</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#242 id=242 data-nosnippet>242</a>&gt; <span class="kw">where
<a href=#243 id=243 data-nosnippet>243</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#244 id=244 data-nosnippet>244</a>{
<a href=#245 id=245 data-nosnippet>245</a> <span class="kw">type </span>JoinHandle: Joinable&lt;ReturnValue, BrotliEncoderThreadError&gt;;
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">type </span>FinalJoinHandle: OwnedRetriever&lt;U&gt;;
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle;
<a href=#248 id=248 data-nosnippet>248</a> <span class="kw">fn </span>spawn(
<a href=#249 id=249 data-nosnippet>249</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#250 id=250 data-nosnippet>250</a> handle: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#251 id=251 data-nosnippet>251</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#252 id=252 data-nosnippet>252</a> index: usize,
<a href=#253 id=253 data-nosnippet>253</a> num_threads: usize,
<a href=#254 id=254 data-nosnippet>254</a> f: <span class="kw">fn</span>(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue,
<a href=#255 id=255 data-nosnippet>255</a> );
<a href=#256 id=256 data-nosnippet>256</a>}
<a href=#257 id=257 data-nosnippet>257</a><span class="comment">/*
<a href=#258 id=258 data-nosnippet>258</a>impl&lt;ReturnValue:Send+'static,
<a href=#259 id=259 data-nosnippet>259</a> ExtraInput:Send+'static,
<a href=#260 id=260 data-nosnippet>260</a> Alloc:BrotliAlloc+Send+'static,
<a href=#261 id=261 data-nosnippet>261</a> U:Send+'static+Sync&gt;
<a href=#262 id=262 data-nosnippet>262</a> BatchSpawnableLite&lt;T, Alloc, U&gt; for BatchSpawnable&lt;T, Alloc, U&gt; {
<a href=#263 id=263 data-nosnippet>263</a> type JoinHandle = &lt;Self as BatchSpawnable&lt;T, Alloc, U&gt;&gt;::JoinHandle;
<a href=#264 id=264 data-nosnippet>264</a> type FinalJoinHandle = &lt;Self as BatchSpawnable&lt;T, Alloc, U&gt;&gt;::FinalJoinHandle;
<a href=#265 id=265 data-nosnippet>265</a> fn batch_spawn(
<a href=#266 id=266 data-nosnippet>266</a> &amp;mut self,
<a href=#267 id=267 data-nosnippet>267</a> input: &amp;mut Owned&lt;U&gt;,
<a href=#268 id=268 data-nosnippet>268</a> alloc_per_thread:&amp;mut [SendAlloc&lt;ReturnValue, ExtraInput, Alloc, Self::JoinHandle&gt;],
<a href=#269 id=269 data-nosnippet>269</a> f: fn(usize, usize, &amp;U, Alloc) -&gt; T,
<a href=#270 id=270 data-nosnippet>270</a> ) -&gt; Self::FinalJoinHandle {
<a href=#271 id=271 data-nosnippet>271</a> &lt;Self as BatchSpawnable&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;::batch_spawn(self, input, alloc_per_thread, f)
<a href=#272 id=272 data-nosnippet>272</a> }
<a href=#273 id=273 data-nosnippet>273</a>}*/
<a href=#274 id=274 data-nosnippet>274</a>
<a href=#275 id=275 data-nosnippet>275</a></span><span class="kw">pub fn </span>CompressMultiSlice&lt;
<a href=#276 id=276 data-nosnippet>276</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#277 id=277 data-nosnippet>277</a> Spawner: BatchSpawnableLite&lt;
<a href=#278 id=278 data-nosnippet>278</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#279 id=279 data-nosnippet>279</a> UnionHasher&lt;Alloc&gt;,
<a href=#280 id=280 data-nosnippet>280</a> Alloc,
<a href=#281 id=281 data-nosnippet>281</a> (
<a href=#282 id=282 data-nosnippet>282</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory,
<a href=#283 id=283 data-nosnippet>283</a> BrotliEncoderParams,
<a href=#284 id=284 data-nosnippet>284</a> ),
<a href=#285 id=285 data-nosnippet>285</a> &gt;,
<a href=#286 id=286 data-nosnippet>286</a>&gt;(
<a href=#287 id=287 data-nosnippet>287</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#288 id=288 data-nosnippet>288</a> input_slice: <span class="kw-2">&amp;</span>[u8],
<a href=#289 id=289 data-nosnippet>289</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#290 id=290 data-nosnippet>290</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#291 id=291 data-nosnippet>291</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#292 id=292 data-nosnippet>292</a> UnionHasher&lt;Alloc&gt;,
<a href=#293 id=293 data-nosnippet>293</a> Alloc,
<a href=#294 id=294 data-nosnippet>294</a> Spawner::JoinHandle,
<a href=#295 id=295 data-nosnippet>295</a> &gt;],
<a href=#296 id=296 data-nosnippet>296</a> thread_spawner: <span class="kw-2">&amp;mut </span>Spawner,
<a href=#297 id=297 data-nosnippet>297</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#298 id=298 data-nosnippet>298</a><span class="kw">where
<a href=#299 id=299 data-nosnippet>299</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#300 id=300 data-nosnippet>300</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#301 id=301 data-nosnippet>301</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#302 id=302 data-nosnippet>302</a>{
<a href=#303 id=303 data-nosnippet>303</a> <span class="kw">let </span>input = <span class="kw">if let </span>InternalSendAlloc::A(<span class="kw-2">ref mut </span>alloc, <span class="kw-2">ref </span>_extra) = alloc_per_thread[<span class="number">0</span>].<span class="number">0 </span>{
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw">let </span><span class="kw-2">mut </span>input = allocate::&lt;u8, <span class="kw">_</span>&gt;(alloc, input_slice.len());
<a href=#305 id=305 data-nosnippet>305</a> input.slice_mut().clone_from_slice(input_slice);
<a href=#306 id=306 data-nosnippet>306</a> input
<a href=#307 id=307 data-nosnippet>307</a> } <span class="kw">else </span>{
<a href=#308 id=308 data-nosnippet>308</a> alloc_default::&lt;u8, Alloc&gt;()
<a href=#309 id=309 data-nosnippet>309</a> };
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">let </span><span class="kw-2">mut </span>owned_input = Owned::new(input);
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">let </span>ret = CompressMulti(
<a href=#312 id=312 data-nosnippet>312</a> params,
<a href=#313 id=313 data-nosnippet>313</a> <span class="kw-2">&amp;mut </span>owned_input,
<a href=#314 id=314 data-nosnippet>314</a> output,
<a href=#315 id=315 data-nosnippet>315</a> alloc_per_thread,
<a href=#316 id=316 data-nosnippet>316</a> thread_spawner,
<a href=#317 id=317 data-nosnippet>317</a> );
<a href=#318 id=318 data-nosnippet>318</a> <span class="kw">if let </span>InternalSendAlloc::A(<span class="kw-2">ref mut </span>alloc, <span class="kw-2">ref </span>_extra) = alloc_per_thread[<span class="number">0</span>].<span class="number">0 </span>{
<a href=#319 id=319 data-nosnippet>319</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(alloc, owned_input.unwrap());
<a href=#320 id=320 data-nosnippet>320</a> }
<a href=#321 id=321 data-nosnippet>321</a> ret
<a href=#322 id=322 data-nosnippet>322</a>}
<a href=#323 id=323 data-nosnippet>323</a>
<a href=#324 id=324 data-nosnippet>324</a><span class="kw">fn </span>get_range(thread_index: usize, num_threads: usize, file_size: usize) -&gt; Range&lt;usize&gt; {
<a href=#325 id=325 data-nosnippet>325</a> ((thread_index * file_size) / num_threads)..(((thread_index + <span class="number">1</span>) * file_size) / num_threads)
<a href=#326 id=326 data-nosnippet>326</a>}
<a href=#327 id=327 data-nosnippet>327</a>
<a href=#328 id=328 data-nosnippet>328</a><span class="kw">fn </span>compress_part&lt;Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>, SliceW: SliceWrapper&lt;u8&gt;&gt;(
<a href=#329 id=329 data-nosnippet>329</a> hasher: UnionHasher&lt;Alloc&gt;,
<a href=#330 id=330 data-nosnippet>330</a> thread_index: usize,
<a href=#331 id=331 data-nosnippet>331</a> num_threads: usize,
<a href=#332 id=332 data-nosnippet>332</a> input_and_params: <span class="kw-2">&amp;</span>(SliceW, BrotliEncoderParams),
<a href=#333 id=333 data-nosnippet>333</a> <span class="kw-2">mut </span>alloc: Alloc,
<a href=#334 id=334 data-nosnippet>334</a>) -&gt; CompressionThreadResult&lt;Alloc&gt;
<a href=#335 id=335 data-nosnippet>335</a><span class="kw">where
<a href=#336 id=336 data-nosnippet>336</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#337 id=337 data-nosnippet>337</a>{
<a href=#338 id=338 data-nosnippet>338</a> <span class="kw">let </span><span class="kw-2">mut </span>range = get_range(thread_index, num_threads, input_and_params.<span class="number">0</span>.len());
<a href=#339 id=339 data-nosnippet>339</a> <span class="kw">let </span><span class="kw-2">mut </span>mem = allocate::&lt;u8, <span class="kw">_</span>&gt;(
<a href=#340 id=340 data-nosnippet>340</a> <span class="kw-2">&amp;mut </span>alloc,
<a href=#341 id=341 data-nosnippet>341</a> BrotliEncoderMaxCompressedSize(range.end - range.start),
<a href=#342 id=342 data-nosnippet>342</a> );
<a href=#343 id=343 data-nosnippet>343</a> <span class="kw">let </span><span class="kw-2">mut </span>state = BrotliEncoderStateStruct::new(alloc);
<a href=#344 id=344 data-nosnippet>344</a> state.params = input_and_params.<span class="number">1</span>.clone();
<a href=#345 id=345 data-nosnippet>345</a> <span class="kw">if </span><span class="macro">thread_index !</span>= <span class="number">0 </span>{
<a href=#346 id=346 data-nosnippet>346</a> state.params.catable = <span class="bool-val">true</span>; <span class="comment">// make sure we can concatenate this to the other work results
<a href=#347 id=347 data-nosnippet>347</a> </span>state.params.magic_number = <span class="bool-val">false</span>; <span class="comment">// no reason to pepper this around
<a href=#348 id=348 data-nosnippet>348</a> </span>}
<a href=#349 id=349 data-nosnippet>349</a> state.params.appendable = <span class="bool-val">true</span>; <span class="comment">// make sure we are at least appendable, so that future items can be catted in
<a href=#350 id=350 data-nosnippet>350</a> </span><span class="kw">if </span><span class="macro">thread_index !</span>= <span class="number">0 </span>{
<a href=#351 id=351 data-nosnippet>351</a> state.set_custom_dictionary_with_optional_precomputed_hasher(
<a href=#352 id=352 data-nosnippet>352</a> range.start,
<a href=#353 id=353 data-nosnippet>353</a> <span class="kw-2">&amp;</span>input_and_params.<span class="number">0</span>.slice()[..range.start],
<a href=#354 id=354 data-nosnippet>354</a> hasher,
<a href=#355 id=355 data-nosnippet>355</a> <span class="bool-val">true</span>,
<a href=#356 id=356 data-nosnippet>356</a> );
<a href=#357 id=357 data-nosnippet>357</a> }
<a href=#358 id=358 data-nosnippet>358</a> <span class="kw">let </span><span class="kw-2">mut </span>out_offset = <span class="number">0usize</span>;
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">let </span>compression_result;
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">let </span><span class="kw-2">mut </span>available_out = mem.len();
<a href=#361 id=361 data-nosnippet>361</a> <span class="kw">loop </span>{
<a href=#362 id=362 data-nosnippet>362</a> <span class="kw">let </span><span class="kw-2">mut </span>next_in_offset = <span class="number">0usize</span>;
<a href=#363 id=363 data-nosnippet>363</a> <span class="kw">let </span><span class="kw-2">mut </span>available_in = range.end - range.start;
<a href=#364 id=364 data-nosnippet>364</a> <span class="kw">let </span>result = state.compress_stream(
<a href=#365 id=365 data-nosnippet>365</a> BrotliEncoderOperation::BROTLI_OPERATION_FINISH,
<a href=#366 id=366 data-nosnippet>366</a> <span class="kw-2">&amp;mut </span>available_in,
<a href=#367 id=367 data-nosnippet>367</a> <span class="kw-2">&amp;</span>input_and_params.<span class="number">0</span>.slice()[range.clone()],
<a href=#368 id=368 data-nosnippet>368</a> <span class="kw-2">&amp;mut </span>next_in_offset,
<a href=#369 id=369 data-nosnippet>369</a> <span class="kw-2">&amp;mut </span>available_out,
<a href=#370 id=370 data-nosnippet>370</a> mem.slice_mut(),
<a href=#371 id=371 data-nosnippet>371</a> <span class="kw-2">&amp;mut </span>out_offset,
<a href=#372 id=372 data-nosnippet>372</a> <span class="kw-2">&amp;mut </span><span class="prelude-val">None</span>,
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw-2">&amp;mut </span>|_a, _b, _c, _d| (),
<a href=#374 id=374 data-nosnippet>374</a> );
<a href=#375 id=375 data-nosnippet>375</a> <span class="kw">let </span>new_range = range.start + next_in_offset..range.end;
<a href=#376 id=376 data-nosnippet>376</a> range = new_range;
<a href=#377 id=377 data-nosnippet>377</a> <span class="kw">if </span>result {
<a href=#378 id=378 data-nosnippet>378</a> compression_result = <span class="prelude-val">Ok</span>(out_offset);
<a href=#379 id=379 data-nosnippet>379</a> <span class="kw">break</span>;
<a href=#380 id=380 data-nosnippet>380</a> } <span class="kw">else if </span>available_out == <span class="number">0 </span>{
<a href=#381 id=381 data-nosnippet>381</a> compression_result = <span class="prelude-val">Err</span>(BrotliEncoderThreadError::InsufficientOutputSpace); <span class="comment">// mark no space??
<a href=#382 id=382 data-nosnippet>382</a> </span><span class="kw">break</span>;
<a href=#383 id=383 data-nosnippet>383</a> }
<a href=#384 id=384 data-nosnippet>384</a> }
<a href=#385 id=385 data-nosnippet>385</a> BrotliEncoderDestroyInstance(<span class="kw-2">&amp;mut </span>state);
<a href=#386 id=386 data-nosnippet>386</a> <span class="kw">match </span>compression_result {
<a href=#387 id=387 data-nosnippet>387</a> <span class="prelude-val">Ok</span>(size) =&gt; CompressionThreadResult::&lt;Alloc&gt; {
<a href=#388 id=388 data-nosnippet>388</a> compressed: <span class="prelude-val">Ok</span>(CompressedFileChunk {
<a href=#389 id=389 data-nosnippet>389</a> data_backing: mem,
<a href=#390 id=390 data-nosnippet>390</a> data_size: size,
<a href=#391 id=391 data-nosnippet>391</a> }),
<a href=#392 id=392 data-nosnippet>392</a> alloc: state.m8,
<a href=#393 id=393 data-nosnippet>393</a> },
<a href=#394 id=394 data-nosnippet>394</a> <span class="prelude-val">Err</span>(e) =&gt; {
<a href=#395 id=395 data-nosnippet>395</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(<span class="kw-2">&amp;mut </span>state.m8, mem);
<a href=#396 id=396 data-nosnippet>396</a> CompressionThreadResult::&lt;Alloc&gt; {
<a href=#397 id=397 data-nosnippet>397</a> compressed: <span class="prelude-val">Err</span>(e),
<a href=#398 id=398 data-nosnippet>398</a> alloc: state.m8,
<a href=#399 id=399 data-nosnippet>399</a> }
<a href=#400 id=400 data-nosnippet>400</a> }
<a href=#401 id=401 data-nosnippet>401</a> }
<a href=#402 id=402 data-nosnippet>402</a>}
<a href=#403 id=403 data-nosnippet>403</a>
<a href=#404 id=404 data-nosnippet>404</a><span class="kw">pub fn </span>CompressMulti&lt;
<a href=#405 id=405 data-nosnippet>405</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#406 id=406 data-nosnippet>406</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#407 id=407 data-nosnippet>407</a> Spawner: BatchSpawnableLite&lt;
<a href=#408 id=408 data-nosnippet>408</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#409 id=409 data-nosnippet>409</a> UnionHasher&lt;Alloc&gt;,
<a href=#410 id=410 data-nosnippet>410</a> Alloc,
<a href=#411 id=411 data-nosnippet>411</a> (SliceW, BrotliEncoderParams),
<a href=#412 id=412 data-nosnippet>412</a> &gt;,
<a href=#413 id=413 data-nosnippet>413</a>&gt;(
<a href=#414 id=414 data-nosnippet>414</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#415 id=415 data-nosnippet>415</a> owned_input: <span class="kw-2">&amp;mut </span>Owned&lt;SliceW&gt;,
<a href=#416 id=416 data-nosnippet>416</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#417 id=417 data-nosnippet>417</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#418 id=418 data-nosnippet>418</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#419 id=419 data-nosnippet>419</a> UnionHasher&lt;Alloc&gt;,
<a href=#420 id=420 data-nosnippet>420</a> Alloc,
<a href=#421 id=421 data-nosnippet>421</a> Spawner::JoinHandle,
<a href=#422 id=422 data-nosnippet>422</a> &gt;],
<a href=#423 id=423 data-nosnippet>423</a> thread_spawner: <span class="kw-2">&amp;mut </span>Spawner,
<a href=#424 id=424 data-nosnippet>424</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#425 id=425 data-nosnippet>425</a><span class="kw">where
<a href=#426 id=426 data-nosnippet>426</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#427 id=427 data-nosnippet>427</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send,
<a href=#428 id=428 data-nosnippet>428</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send,
<a href=#429 id=429 data-nosnippet>429</a>{
<a href=#430 id=430 data-nosnippet>430</a> <span class="kw">let </span>num_threads = alloc_per_thread.len();
<a href=#431 id=431 data-nosnippet>431</a> <span class="kw">let </span>actually_owned_mem = mem::replace(owned_input, Owned(InternalOwned::Borrowed));
<a href=#432 id=432 data-nosnippet>432</a> <span class="kw">let </span><span class="kw-2">mut </span>owned_input_pair = Owned::new((actually_owned_mem.unwrap(), params.clone()));
<a href=#433 id=433 data-nosnippet>433</a> <span class="comment">// start thread spawner
<a href=#434 id=434 data-nosnippet>434</a> </span><span class="kw">let </span><span class="kw-2">mut </span>spawner_and_input = thread_spawner.make_spawner(<span class="kw-2">&amp;mut </span>owned_input_pair);
<a href=#435 id=435 data-nosnippet>435</a> <span class="kw">if </span>num_threads &gt; <span class="number">1 </span>{
<a href=#436 id=436 data-nosnippet>436</a> <span class="comment">// spawn first thread without "custom dictionary" while we compute the custom dictionary for other work items
<a href=#437 id=437 data-nosnippet>437</a> </span>thread_spawner.spawn(
<a href=#438 id=438 data-nosnippet>438</a> <span class="kw-2">&amp;mut </span>spawner_and_input,
<a href=#439 id=439 data-nosnippet>439</a> <span class="kw-2">&amp;mut </span>alloc_per_thread[<span class="number">0</span>],
<a href=#440 id=440 data-nosnippet>440</a> <span class="number">0</span>,
<a href=#441 id=441 data-nosnippet>441</a> num_threads,
<a href=#442 id=442 data-nosnippet>442</a> compress_part,
<a href=#443 id=443 data-nosnippet>443</a> );
<a href=#444 id=444 data-nosnippet>444</a> }
<a href=#445 id=445 data-nosnippet>445</a> <span class="comment">// populate all hashers at once, cloning them one by one
<a href=#446 id=446 data-nosnippet>446</a> </span><span class="kw">let </span><span class="kw-2">mut </span>compression_last_thread_result;
<a href=#447 id=447 data-nosnippet>447</a> <span class="kw">if </span>num_threads &gt; <span class="number">1 </span>&amp;&amp; params.favor_cpu_efficiency {
<a href=#448 id=448 data-nosnippet>448</a> <span class="kw">let </span><span class="kw-2">mut </span>local_params = params.clone();
<a href=#449 id=449 data-nosnippet>449</a> SanitizeParams(<span class="kw-2">&amp;mut </span>local_params);
<a href=#450 id=450 data-nosnippet>450</a> <span class="kw">let </span><span class="kw-2">mut </span>hasher = UnionHasher::Uninit;
<a href=#451 id=451 data-nosnippet>451</a> hasher_setup(
<a href=#452 id=452 data-nosnippet>452</a> alloc_per_thread[num_threads - <span class="number">1</span>].<span class="number">0</span>.unwrap_input().<span class="number">0</span>,
<a href=#453 id=453 data-nosnippet>453</a> <span class="kw-2">&amp;mut </span>hasher,
<a href=#454 id=454 data-nosnippet>454</a> <span class="kw-2">&amp;mut </span>local_params,
<a href=#455 id=455 data-nosnippet>455</a> <span class="prelude-val">None</span>, <span class="comment">// No unwrappable custom dict used here.
<a href=#456 id=456 data-nosnippet>456</a> </span><span class="kw-2">&amp;</span>[],
<a href=#457 id=457 data-nosnippet>457</a> <span class="number">0</span>,
<a href=#458 id=458 data-nosnippet>458</a> <span class="number">0</span>,
<a href=#459 id=459 data-nosnippet>459</a> <span class="bool-val">false</span>,
<a href=#460 id=460 data-nosnippet>460</a> );
<a href=#461 id=461 data-nosnippet>461</a> <span class="kw">for </span>thread_index <span class="kw">in </span><span class="number">1</span>..num_threads {
<a href=#462 id=462 data-nosnippet>462</a> <span class="kw">let </span>res = spawner_and_input.view(|input_and_params: <span class="kw-2">&amp;</span>(SliceW, BrotliEncoderParams)| {
<a href=#463 id=463 data-nosnippet>463</a> <span class="kw">let </span>range = get_range(thread_index - <span class="number">1</span>, num_threads, input_and_params.<span class="number">0</span>.len());
<a href=#464 id=464 data-nosnippet>464</a> <span class="kw">let </span>overlap = hasher.StoreLookahead().wrapping_sub(<span class="number">1</span>);
<a href=#465 id=465 data-nosnippet>465</a> <span class="kw">if </span>range.end - range.start &gt; overlap {
<a href=#466 id=466 data-nosnippet>466</a> hasher.BulkStoreRange(
<a href=#467 id=467 data-nosnippet>467</a> input_and_params.<span class="number">0</span>.slice(),
<a href=#468 id=468 data-nosnippet>468</a> usize::MAX,
<a href=#469 id=469 data-nosnippet>469</a> <span class="kw">if </span>range.start &gt; overlap {
<a href=#470 id=470 data-nosnippet>470</a> range.start - overlap
<a href=#471 id=471 data-nosnippet>471</a> } <span class="kw">else </span>{
<a href=#472 id=472 data-nosnippet>472</a> <span class="number">0
<a href=#473 id=473 data-nosnippet>473</a> </span>},
<a href=#474 id=474 data-nosnippet>474</a> range.end - overlap,
<a href=#475 id=475 data-nosnippet>475</a> );
<a href=#476 id=476 data-nosnippet>476</a> }
<a href=#477 id=477 data-nosnippet>477</a> });
<a href=#478 id=478 data-nosnippet>478</a> <span class="kw">if let </span><span class="prelude-val">Err</span>(_e) = res {
<a href=#479 id=479 data-nosnippet>479</a> <span class="kw">return </span><span class="prelude-val">Err</span>(BrotliEncoderThreadError::OtherThreadPanic);
<a href=#480 id=480 data-nosnippet>480</a> }
<a href=#481 id=481 data-nosnippet>481</a> <span class="kw">if </span>thread_index + <span class="number">1 </span>!= num_threads {
<a href=#482 id=482 data-nosnippet>482</a> {
<a href=#483 id=483 data-nosnippet>483</a> <span class="kw">let </span>(alloc, out_hasher) = alloc_per_thread[thread_index].unwrap_view_mut();
<a href=#484 id=484 data-nosnippet>484</a> <span class="kw-2">*</span>out_hasher = hasher.clone_with_alloc(alloc);
<a href=#485 id=485 data-nosnippet>485</a> }
<a href=#486 id=486 data-nosnippet>486</a> thread_spawner.spawn(
<a href=#487 id=487 data-nosnippet>487</a> <span class="kw-2">&amp;mut </span>spawner_and_input,
<a href=#488 id=488 data-nosnippet>488</a> <span class="kw-2">&amp;mut </span>alloc_per_thread[thread_index],
<a href=#489 id=489 data-nosnippet>489</a> thread_index,
<a href=#490 id=490 data-nosnippet>490</a> num_threads,
<a href=#491 id=491 data-nosnippet>491</a> compress_part,
<a href=#492 id=492 data-nosnippet>492</a> );
<a href=#493 id=493 data-nosnippet>493</a> }
<a href=#494 id=494 data-nosnippet>494</a> }
<a href=#495 id=495 data-nosnippet>495</a> <span class="kw">let </span>(alloc, _extra) = alloc_per_thread[num_threads - <span class="number">1</span>].replace_with_default();
<a href=#496 id=496 data-nosnippet>496</a> compression_last_thread_result = spawner_and_input.view(<span class="kw">move </span>|input_and_params:<span class="kw-2">&amp;</span>(SliceW, BrotliEncoderParams)| -&gt; CompressionThreadResult&lt;Alloc&gt; {
<a href=#497 id=497 data-nosnippet>497</a> compress_part(hasher,
<a href=#498 id=498 data-nosnippet>498</a> num_threads - <span class="number">1</span>,
<a href=#499 id=499 data-nosnippet>499</a> num_threads,
<a href=#500 id=500 data-nosnippet>500</a> input_and_params,
<a href=#501 id=501 data-nosnippet>501</a> alloc,
<a href=#502 id=502 data-nosnippet>502</a> )
<a href=#503 id=503 data-nosnippet>503</a> });
<a href=#504 id=504 data-nosnippet>504</a> } <span class="kw">else </span>{
<a href=#505 id=505 data-nosnippet>505</a> <span class="kw">if </span>num_threads &gt; <span class="number">1 </span>{
<a href=#506 id=506 data-nosnippet>506</a> <span class="kw">for </span>thread_index <span class="kw">in </span><span class="number">1</span>..num_threads - <span class="number">1 </span>{
<a href=#507 id=507 data-nosnippet>507</a> thread_spawner.spawn(
<a href=#508 id=508 data-nosnippet>508</a> <span class="kw-2">&amp;mut </span>spawner_and_input,
<a href=#509 id=509 data-nosnippet>509</a> <span class="kw-2">&amp;mut </span>alloc_per_thread[thread_index],
<a href=#510 id=510 data-nosnippet>510</a> thread_index,
<a href=#511 id=511 data-nosnippet>511</a> num_threads,
<a href=#512 id=512 data-nosnippet>512</a> compress_part,
<a href=#513 id=513 data-nosnippet>513</a> );
<a href=#514 id=514 data-nosnippet>514</a> }
<a href=#515 id=515 data-nosnippet>515</a> }
<a href=#516 id=516 data-nosnippet>516</a> <span class="kw">let </span>(alloc, _extra) = alloc_per_thread[num_threads - <span class="number">1</span>].replace_with_default();
<a href=#517 id=517 data-nosnippet>517</a> compression_last_thread_result = spawner_and_input.view(<span class="kw">move </span>|input_and_params:<span class="kw-2">&amp;</span>(SliceW, BrotliEncoderParams)| -&gt; CompressionThreadResult&lt;Alloc&gt; {
<a href=#518 id=518 data-nosnippet>518</a> compress_part(UnionHasher::Uninit,
<a href=#519 id=519 data-nosnippet>519</a> num_threads - <span class="number">1</span>,
<a href=#520 id=520 data-nosnippet>520</a> num_threads,
<a href=#521 id=521 data-nosnippet>521</a> input_and_params,
<a href=#522 id=522 data-nosnippet>522</a> alloc,
<a href=#523 id=523 data-nosnippet>523</a> )
<a href=#524 id=524 data-nosnippet>524</a> });
<a href=#525 id=525 data-nosnippet>525</a> }
<a href=#526 id=526 data-nosnippet>526</a> <span class="kw">let </span><span class="kw-2">mut </span>compression_result = <span class="prelude-val">Err</span>(BrotliEncoderThreadError::InsufficientOutputSpace);
<a href=#527 id=527 data-nosnippet>527</a> <span class="kw">let </span><span class="kw-2">mut </span>out_file_size = <span class="number">0usize</span>;
<a href=#528 id=528 data-nosnippet>528</a> <span class="kw">let </span><span class="kw-2">mut </span>bro_cat_li = BroCatli::new();
<a href=#529 id=529 data-nosnippet>529</a> <span class="kw">for </span>(index, thread) <span class="kw">in </span>alloc_per_thread.iter_mut().enumerate() {
<a href=#530 id=530 data-nosnippet>530</a> <span class="kw">let </span><span class="kw-2">mut </span>cur_result = <span class="kw">if </span>index + <span class="number">1 </span>== num_threads {
<a href=#531 id=531 data-nosnippet>531</a> <span class="kw">match </span>mem::replace(<span class="kw-2">&amp;mut </span>compression_last_thread_result, <span class="prelude-val">Err</span>(())) {
<a href=#532 id=532 data-nosnippet>532</a> <span class="prelude-val">Ok</span>(result) =&gt; result,
<a href=#533 id=533 data-nosnippet>533</a> <span class="prelude-val">Err</span>(_err) =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(BrotliEncoderThreadError::OtherThreadPanic),
<a href=#534 id=534 data-nosnippet>534</a> }
<a href=#535 id=535 data-nosnippet>535</a> } <span class="kw">else </span>{
<a href=#536 id=536 data-nosnippet>536</a> <span class="kw">match </span>mem::replace(
<a href=#537 id=537 data-nosnippet>537</a> <span class="kw-2">&amp;mut </span>thread.<span class="number">0</span>,
<a href=#538 id=538 data-nosnippet>538</a> InternalSendAlloc::SpawningOrJoining(PhantomData),
<a href=#539 id=539 data-nosnippet>539</a> ) {
<a href=#540 id=540 data-nosnippet>540</a> InternalSendAlloc::A(<span class="kw">_</span>, <span class="kw">_</span>) | InternalSendAlloc::SpawningOrJoining(<span class="kw">_</span>) =&gt; {
<a href=#541 id=541 data-nosnippet>541</a> <span class="macro">panic!</span>(<span class="string">"Thread not properly spawned"</span>)
<a href=#542 id=542 data-nosnippet>542</a> }
<a href=#543 id=543 data-nosnippet>543</a> InternalSendAlloc::Join(join) =&gt; <span class="kw">match </span>join.join() {
<a href=#544 id=544 data-nosnippet>544</a> <span class="prelude-val">Ok</span>(result) =&gt; result,
<a href=#545 id=545 data-nosnippet>545</a> <span class="prelude-val">Err</span>(err) =&gt; {
<a href=#546 id=546 data-nosnippet>546</a> <span class="kw">return </span><span class="prelude-val">Err</span>(err);
<a href=#547 id=547 data-nosnippet>547</a> }
<a href=#548 id=548 data-nosnippet>548</a> },
<a href=#549 id=549 data-nosnippet>549</a> }
<a href=#550 id=550 data-nosnippet>550</a> };
<a href=#551 id=551 data-nosnippet>551</a> <span class="kw">match </span>cur_result.compressed {
<a href=#552 id=552 data-nosnippet>552</a> <span class="prelude-val">Ok</span>(compressed_out) =&gt; {
<a href=#553 id=553 data-nosnippet>553</a> bro_cat_li.new_brotli_file();
<a href=#554 id=554 data-nosnippet>554</a> <span class="kw">let </span><span class="kw-2">mut </span>in_offset = <span class="number">0usize</span>;
<a href=#555 id=555 data-nosnippet>555</a> <span class="kw">let </span>cat_result = bro_cat_li.stream(
<a href=#556 id=556 data-nosnippet>556</a> <span class="kw-2">&amp;</span>compressed_out.data_backing.slice()[..compressed_out.data_size],
<a href=#557 id=557 data-nosnippet>557</a> <span class="kw-2">&amp;mut </span>in_offset,
<a href=#558 id=558 data-nosnippet>558</a> output,
<a href=#559 id=559 data-nosnippet>559</a> <span class="kw-2">&amp;mut </span>out_file_size,
<a href=#560 id=560 data-nosnippet>560</a> );
<a href=#561 id=561 data-nosnippet>561</a> <span class="kw">match </span>cat_result {
<a href=#562 id=562 data-nosnippet>562</a> BroCatliResult::Success | BroCatliResult::NeedsMoreInput =&gt; {
<a href=#563 id=563 data-nosnippet>563</a> compression_result = <span class="prelude-val">Ok</span>(out_file_size);
<a href=#564 id=564 data-nosnippet>564</a> }
<a href=#565 id=565 data-nosnippet>565</a> BroCatliResult::NeedsMoreOutput =&gt; {
<a href=#566 id=566 data-nosnippet>566</a> compression_result = <span class="prelude-val">Err</span>(BrotliEncoderThreadError::InsufficientOutputSpace);
<a href=#567 id=567 data-nosnippet>567</a> <span class="comment">// not enough space
<a href=#568 id=568 data-nosnippet>568</a> </span>}
<a href=#569 id=569 data-nosnippet>569</a> err =&gt; {
<a href=#570 id=570 data-nosnippet>570</a> compression_result = <span class="prelude-val">Err</span>(BrotliEncoderThreadError::ConcatenationError(err));
<a href=#571 id=571 data-nosnippet>571</a> <span class="comment">// misc error
<a href=#572 id=572 data-nosnippet>572</a> </span>}
<a href=#573 id=573 data-nosnippet>573</a> }
<a href=#574 id=574 data-nosnippet>574</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::free_cell(
<a href=#575 id=575 data-nosnippet>575</a> <span class="kw-2">&amp;mut </span>cur_result.alloc,
<a href=#576 id=576 data-nosnippet>576</a> compressed_out.data_backing,
<a href=#577 id=577 data-nosnippet>577</a> );
<a href=#578 id=578 data-nosnippet>578</a> }
<a href=#579 id=579 data-nosnippet>579</a> <span class="prelude-val">Err</span>(e) =&gt; {
<a href=#580 id=580 data-nosnippet>580</a> compression_result = <span class="prelude-val">Err</span>(e);
<a href=#581 id=581 data-nosnippet>581</a> }
<a href=#582 id=582 data-nosnippet>582</a> }
<a href=#583 id=583 data-nosnippet>583</a> thread.<span class="number">0 </span>= InternalSendAlloc::A(cur_result.alloc, UnionHasher::Uninit);
<a href=#584 id=584 data-nosnippet>584</a> }
<a href=#585 id=585 data-nosnippet>585</a> compression_result<span class="question-mark">?</span>;
<a href=#586 id=586 data-nosnippet>586</a> <span class="kw">match </span>bro_cat_li.finish(output, <span class="kw-2">&amp;mut </span>out_file_size) {
<a href=#587 id=587 data-nosnippet>587</a> BroCatliResult::Success =&gt; compression_result = <span class="prelude-val">Ok</span>(out_file_size),
<a href=#588 id=588 data-nosnippet>588</a> err =&gt; {
<a href=#589 id=589 data-nosnippet>589</a> compression_result = <span class="prelude-val">Err</span>(BrotliEncoderThreadError::ConcatenationFinalizationError(
<a href=#590 id=590 data-nosnippet>590</a> err,
<a href=#591 id=591 data-nosnippet>591</a> ))
<a href=#592 id=592 data-nosnippet>592</a> }
<a href=#593 id=593 data-nosnippet>593</a> }
<a href=#594 id=594 data-nosnippet>594</a> <span class="kw">if let </span><span class="prelude-val">Ok</span>(retrieved_owned_input) = spawner_and_input.unwrap() {
<a href=#595 id=595 data-nosnippet>595</a> <span class="kw-2">*</span>owned_input = Owned::new(retrieved_owned_input.<span class="number">0</span>); <span class="comment">// return the input to its rightful owner before returning
<a href=#596 id=596 data-nosnippet>596</a> </span>} <span class="kw">else if </span>compression_result.is_ok() {
<a href=#597 id=597 data-nosnippet>597</a> compression_result = <span class="prelude-val">Err</span>(BrotliEncoderThreadError::OtherThreadPanic);
<a href=#598 id=598 data-nosnippet>598</a> }
<a href=#599 id=599 data-nosnippet>599</a> compression_result
<a href=#600 id=600 data-nosnippet>600</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,63 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/utf8_util.rs`."><title>utf8_util.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>utf8_util.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">crate</span>::enc::floatX;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">fn </span>parse_as_utf8(input: <span class="kw-2">&amp;</span>[u8], size: usize) -&gt; (usize, i32) {
<a href=#4 id=4 data-nosnippet>4</a> <span class="kw">if </span>(input[<span class="number">0</span>] &amp; <span class="number">0x80</span>) == <span class="number">0 </span>{
<a href=#5 id=5 data-nosnippet>5</a> <span class="kw">if </span>input[<span class="number">0</span>] &gt; <span class="number">0 </span>{
<a href=#6 id=6 data-nosnippet>6</a> <span class="kw">return </span>(<span class="number">1</span>, i32::from(input[<span class="number">0</span>]));
<a href=#7 id=7 data-nosnippet>7</a> }
<a href=#8 id=8 data-nosnippet>8</a> }
<a href=#9 id=9 data-nosnippet>9</a> <span class="kw">if </span>size &gt; <span class="number">1 </span>&amp;&amp; (input[<span class="number">0</span>] &amp; <span class="number">0xe0</span>) == <span class="number">0xc0 </span>&amp;&amp; (input[<span class="number">1</span>] &amp; <span class="number">0xc0</span>) == <span class="number">0x80 </span>{
<a href=#10 id=10 data-nosnippet>10</a> <span class="kw">let </span>symbol = (input[<span class="number">0</span>] <span class="kw">as </span>i32 &amp; <span class="number">0x1f</span>) &lt;&lt; <span class="number">6 </span>| input[<span class="number">1</span>] <span class="kw">as </span>i32 &amp; <span class="number">0x3f</span>;
<a href=#11 id=11 data-nosnippet>11</a> <span class="kw">if </span>symbol &gt; <span class="number">0x7f </span>{
<a href=#12 id=12 data-nosnippet>12</a> <span class="kw">return </span>(<span class="number">2</span>, symbol);
<a href=#13 id=13 data-nosnippet>13</a> }
<a href=#14 id=14 data-nosnippet>14</a> }
<a href=#15 id=15 data-nosnippet>15</a> <span class="kw">if </span>size &gt; <span class="number">2
<a href=#16 id=16 data-nosnippet>16</a> </span>&amp;&amp; (input[<span class="number">0</span>] &amp; <span class="number">0xf0</span>) == <span class="number">0xe0
<a href=#17 id=17 data-nosnippet>17</a> </span>&amp;&amp; (input[<span class="number">1</span>] &amp; <span class="number">0xc0</span>) == <span class="number">0x80
<a href=#18 id=18 data-nosnippet>18</a> </span>&amp;&amp; (input[<span class="number">2</span>] &amp; <span class="number">0xc0</span>) == <span class="number">0x80
<a href=#19 id=19 data-nosnippet>19</a> </span>{
<a href=#20 id=20 data-nosnippet>20</a> <span class="kw">let </span>symbol = (i32::from(input[<span class="number">0</span>]) &amp; <span class="number">0x0f</span>) &lt;&lt; <span class="number">12
<a href=#21 id=21 data-nosnippet>21</a> </span>| (i32::from(input[<span class="number">1</span>]) &amp; <span class="number">0x3f</span>) &lt;&lt; <span class="number">6
<a href=#22 id=22 data-nosnippet>22</a> </span>| i32::from(input[<span class="number">2</span>]) &amp; <span class="number">0x3f</span>;
<a href=#23 id=23 data-nosnippet>23</a> <span class="kw">if </span>symbol &gt; <span class="number">0x7ff </span>{
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">return </span>(<span class="number">3</span>, symbol);
<a href=#25 id=25 data-nosnippet>25</a> }
<a href=#26 id=26 data-nosnippet>26</a> }
<a href=#27 id=27 data-nosnippet>27</a> <span class="kw">if </span>size &gt; <span class="number">3
<a href=#28 id=28 data-nosnippet>28</a> </span>&amp;&amp; (input[<span class="number">0</span>] &amp; <span class="number">0xf8</span>) == <span class="number">0xf0
<a href=#29 id=29 data-nosnippet>29</a> </span>&amp;&amp; (input[<span class="number">1</span>] &amp; <span class="number">0xc0</span>) == <span class="number">0x80
<a href=#30 id=30 data-nosnippet>30</a> </span>&amp;&amp; (input[<span class="number">2</span>] &amp; <span class="number">0xc0</span>) == <span class="number">0x80
<a href=#31 id=31 data-nosnippet>31</a> </span>&amp;&amp; (input[<span class="number">3</span>] &amp; <span class="number">0xc0</span>) == <span class="number">0x80
<a href=#32 id=32 data-nosnippet>32</a> </span>{
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">let </span>symbol = (i32::from(input[<span class="number">0</span>]) &amp; <span class="number">0x07</span>) &lt;&lt; <span class="number">18
<a href=#34 id=34 data-nosnippet>34</a> </span>| (i32::from(input[<span class="number">1</span>]) &amp; <span class="number">0x3f</span>) &lt;&lt; <span class="number">12
<a href=#35 id=35 data-nosnippet>35</a> </span>| (i32::from(input[<span class="number">2</span>]) &amp; <span class="number">0x3f</span>) &lt;&lt; <span class="number">6
<a href=#36 id=36 data-nosnippet>36</a> </span>| i32::from(input[<span class="number">3</span>]) &amp; <span class="number">0x3f</span>;
<a href=#37 id=37 data-nosnippet>37</a> <span class="kw">if </span>symbol &gt; <span class="number">0xffff </span>&amp;&amp; symbol &lt;= <span class="number">0x10_ffff </span>{
<a href=#38 id=38 data-nosnippet>38</a> <span class="kw">return </span>(<span class="number">4</span>, symbol);
<a href=#39 id=39 data-nosnippet>39</a> }
<a href=#40 id=40 data-nosnippet>40</a> }
<a href=#41 id=41 data-nosnippet>41</a>
<a href=#42 id=42 data-nosnippet>42</a> (<span class="number">1</span>, <span class="number">0x11_0000 </span>| i32::from(input[<span class="number">0</span>]))
<a href=#43 id=43 data-nosnippet>43</a>}
<a href=#44 id=44 data-nosnippet>44</a>
<a href=#45 id=45 data-nosnippet>45</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>is_mostly_utf8(
<a href=#46 id=46 data-nosnippet>46</a> data: <span class="kw-2">&amp;</span>[u8],
<a href=#47 id=47 data-nosnippet>47</a> pos: usize,
<a href=#48 id=48 data-nosnippet>48</a> mask: usize,
<a href=#49 id=49 data-nosnippet>49</a> length: usize,
<a href=#50 id=50 data-nosnippet>50</a> min_fraction: floatX,
<a href=#51 id=51 data-nosnippet>51</a>) -&gt; bool {
<a href=#52 id=52 data-nosnippet>52</a> <span class="kw">let </span><span class="kw-2">mut </span>size_utf8: usize = <span class="number">0</span>;
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">let </span><span class="kw-2">mut </span>i: usize = <span class="number">0</span>;
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw">while </span>i &lt; length {
<a href=#55 id=55 data-nosnippet>55</a> <span class="kw">let </span>(bytes_read, symbol) = parse_as_utf8(<span class="kw-2">&amp;</span>data[(pos.wrapping_add(i) &amp; mask)..], length - i);
<a href=#56 id=56 data-nosnippet>56</a> i = i.wrapping_add(bytes_read);
<a href=#57 id=57 data-nosnippet>57</a> <span class="kw">if </span>symbol &lt; <span class="number">0x11_0000 </span>{
<a href=#58 id=58 data-nosnippet>58</a> size_utf8 = size_utf8.wrapping_add(bytes_read);
<a href=#59 id=59 data-nosnippet>59</a> }
<a href=#60 id=60 data-nosnippet>60</a> }
<a href=#61 id=61 data-nosnippet>61</a> size_utf8 <span class="kw">as </span>floatX &gt; min_fraction * length <span class="kw">as </span>floatX
<a href=#62 id=62 data-nosnippet>62</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,196 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/util.rs`."><title>util.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>util.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#![allow(clippy::excessive_precision)]
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span><span class="kw">crate</span>::enc::log_table_16::logs_16;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span><span class="kw">crate</span>::enc::log_table_8::logs_8;
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="attr">#[cfg(feature = <span class="string">"float64"</span>)]
<a href=#7 id=7 data-nosnippet>7</a></span><span class="kw">pub type </span>floatX = f64;
<a href=#8 id=8 data-nosnippet>8</a>
<a href=#9 id=9 data-nosnippet>9</a><span class="attr">#[cfg(not(feature = <span class="string">"float64"</span>))]
<a href=#10 id=10 data-nosnippet>10</a></span><span class="kw">pub type </span>floatX = f32;
<a href=#11 id=11 data-nosnippet>11</a>
<a href=#12 id=12 data-nosnippet>12</a><span class="attr">#[inline(always)]
<a href=#13 id=13 data-nosnippet>13</a></span><span class="kw">pub fn </span>FastLog2u16(v: u16) -&gt; floatX {
<a href=#14 id=14 data-nosnippet>14</a> logs_16[v <span class="kw">as </span>usize]
<a href=#15 id=15 data-nosnippet>15</a>}
<a href=#16 id=16 data-nosnippet>16</a>
<a href=#17 id=17 data-nosnippet>17</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#18 id=18 data-nosnippet>18</a>#[inline(always)]
<a href=#19 id=19 data-nosnippet>19</a></span><span class="kw">pub fn </span>FastLog2(v: u64) -&gt; floatX {
<a href=#20 id=20 data-nosnippet>20</a> <span class="kw">if </span>v &lt; <span class="number">256 </span>{
<a href=#21 id=21 data-nosnippet>21</a> logs_8[v <span class="kw">as </span>usize]
<a href=#22 id=22 data-nosnippet>22</a> } <span class="kw">else </span>{
<a href=#23 id=23 data-nosnippet>23</a> (v <span class="kw">as </span>f32).log2() <span class="kw">as </span>floatX
<a href=#24 id=24 data-nosnippet>24</a> }
<a href=#25 id=25 data-nosnippet>25</a>}
<a href=#26 id=26 data-nosnippet>26</a>
<a href=#27 id=27 data-nosnippet>27</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#28 id=28 data-nosnippet>28</a>#[inline(always)]
<a href=#29 id=29 data-nosnippet>29</a></span><span class="kw">pub fn </span>FastLog2(v: u64) -&gt; floatX {
<a href=#30 id=30 data-nosnippet>30</a> <span class="kw">if </span>v &lt; <span class="number">256 </span>{
<a href=#31 id=31 data-nosnippet>31</a> logs_8[v <span class="kw">as </span>usize]
<a href=#32 id=32 data-nosnippet>32</a> } <span class="kw">else </span>{
<a href=#33 id=33 data-nosnippet>33</a> FastLog2u64(v)
<a href=#34 id=34 data-nosnippet>34</a> }
<a href=#35 id=35 data-nosnippet>35</a>}
<a href=#36 id=36 data-nosnippet>36</a>
<a href=#37 id=37 data-nosnippet>37</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#38 id=38 data-nosnippet>38</a>#[inline(always)]
<a href=#39 id=39 data-nosnippet>39</a></span><span class="kw">pub fn </span>FastLog2f64(v: u64) -&gt; floatX {
<a href=#40 id=40 data-nosnippet>40</a> <span class="kw">if </span>v &lt; <span class="number">256 </span>{
<a href=#41 id=41 data-nosnippet>41</a> logs_8[v <span class="kw">as </span>usize]
<a href=#42 id=42 data-nosnippet>42</a> } <span class="kw">else </span>{
<a href=#43 id=43 data-nosnippet>43</a> (v <span class="kw">as </span>floatX).log2()
<a href=#44 id=44 data-nosnippet>44</a> }
<a href=#45 id=45 data-nosnippet>45</a>}
<a href=#46 id=46 data-nosnippet>46</a>
<a href=#47 id=47 data-nosnippet>47</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#48 id=48 data-nosnippet>48</a>#[inline(always)]
<a href=#49 id=49 data-nosnippet>49</a></span><span class="kw">pub fn </span>FastLog2f64(v: u64) -&gt; floatX {
<a href=#50 id=50 data-nosnippet>50</a> FastLog2(v) <span class="kw">as </span>floatX
<a href=#51 id=51 data-nosnippet>51</a>}
<a href=#52 id=52 data-nosnippet>52</a>
<a href=#53 id=53 data-nosnippet>53</a><span class="attr">#[inline]
<a href=#54 id=54 data-nosnippet>54</a></span><span class="kw">pub fn </span>FastLog2u64(v: u64) -&gt; floatX {
<a href=#55 id=55 data-nosnippet>55</a> <span class="kw">let </span>bsr_8 = <span class="number">56i8 </span>- v.leading_zeros() <span class="kw">as </span>i8;
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">let </span>offset = bsr_8 &amp; -((bsr_8 &gt;= <span class="number">0</span>) <span class="kw">as </span>i8);
<a href=#57 id=57 data-nosnippet>57</a> (offset <span class="kw">as </span>floatX) + logs_8[(v &gt;&gt; offset) <span class="kw">as </span>usize]
<a href=#58 id=58 data-nosnippet>58</a>}
<a href=#59 id=59 data-nosnippet>59</a>
<a href=#60 id=60 data-nosnippet>60</a><span class="attr">#[inline(always)]
<a href=#61 id=61 data-nosnippet>61</a></span><span class="kw">pub fn </span>FastLog2u32(v: i32) -&gt; floatX {
<a href=#62 id=62 data-nosnippet>62</a> <span class="kw">let </span>bsr_8 = <span class="number">24i8 </span>- v.leading_zeros() <span class="kw">as </span>i8;
<a href=#63 id=63 data-nosnippet>63</a> <span class="kw">let </span>offset = bsr_8 &amp; -((bsr_8 &gt;= <span class="number">0</span>) <span class="kw">as </span>i8);
<a href=#64 id=64 data-nosnippet>64</a> (offset <span class="kw">as </span>floatX) + logs_8[(v &gt;&gt; offset) <span class="kw">as </span>usize]
<a href=#65 id=65 data-nosnippet>65</a>}
<a href=#66 id=66 data-nosnippet>66</a>
<a href=#67 id=67 data-nosnippet>67</a><span class="attr">#[inline(always)]
<a href=#68 id=68 data-nosnippet>68</a></span><span class="kw">pub fn </span>xFastLog2u16(v: u16) -&gt; floatX {
<a href=#69 id=69 data-nosnippet>69</a> <span class="kw">let </span>bsr_8 = <span class="number">8i8 </span>- v.leading_zeros() <span class="kw">as </span>i8;
<a href=#70 id=70 data-nosnippet>70</a> <span class="kw">let </span>offset = (bsr_8 &amp; -((bsr_8 &gt;= <span class="number">0</span>) <span class="kw">as </span>i8));
<a href=#71 id=71 data-nosnippet>71</a> (offset <span class="kw">as </span>floatX) + logs_8[(v &gt;&gt; offset) <span class="kw">as </span>usize]
<a href=#72 id=72 data-nosnippet>72</a>}
<a href=#73 id=73 data-nosnippet>73</a>
<a href=#74 id=74 data-nosnippet>74</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#75 id=75 data-nosnippet>75</a>#[inline(always)]
<a href=#76 id=76 data-nosnippet>76</a></span><span class="kw">pub fn </span>FastPow2(v: floatX) -&gt; floatX {
<a href=#77 id=77 data-nosnippet>77</a> (<span class="number">2 </span><span class="kw">as </span>floatX).powf(v)
<a href=#78 id=78 data-nosnippet>78</a>}
<a href=#79 id=79 data-nosnippet>79</a>
<a href=#80 id=80 data-nosnippet>80</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#81 id=81 data-nosnippet>81</a>#[inline(always)]
<a href=#82 id=82 data-nosnippet>82</a></span><span class="kw">pub fn </span>FastPow2(v: floatX) -&gt; floatX {
<a href=#83 id=83 data-nosnippet>83</a> <span class="macro">assert!</span>(v &gt;= <span class="number">0 </span><span class="kw">as </span>floatX);
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">let </span>round_down = v <span class="kw">as </span>i32;
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">let </span>remainder = v - round_down <span class="kw">as </span>floatX;
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">let </span><span class="kw-2">mut </span>x = <span class="number">1 </span><span class="kw">as </span>floatX;
<a href=#87 id=87 data-nosnippet>87</a> <span class="comment">// (1 + (x/n) * ln2) ^ n
<a href=#88 id=88 data-nosnippet>88</a> // let n = 8
<a href=#89 id=89 data-nosnippet>89</a> </span>x += remainder * (<span class="number">0.693147180559945309417232121458 </span>/ <span class="number">256.0</span>) <span class="kw">as </span>floatX;
<a href=#90 id=90 data-nosnippet>90</a> x <span class="kw-2">*</span>= x;
<a href=#91 id=91 data-nosnippet>91</a> x <span class="kw-2">*</span>= x;
<a href=#92 id=92 data-nosnippet>92</a> x <span class="kw-2">*</span>= x;
<a href=#93 id=93 data-nosnippet>93</a> x <span class="kw-2">*</span>= x;
<a href=#94 id=94 data-nosnippet>94</a> x <span class="kw-2">*</span>= x;
<a href=#95 id=95 data-nosnippet>95</a> x <span class="kw-2">*</span>= x;
<a href=#96 id=96 data-nosnippet>96</a> x <span class="kw-2">*</span>= x;
<a href=#97 id=97 data-nosnippet>97</a> x <span class="kw-2">*</span>= x;
<a href=#98 id=98 data-nosnippet>98</a>
<a href=#99 id=99 data-nosnippet>99</a> (<span class="number">1 </span>&lt;&lt; round_down) <span class="kw">as </span>floatX * x
<a href=#100 id=100 data-nosnippet>100</a>}
<a href=#101 id=101 data-nosnippet>101</a>
<a href=#102 id=102 data-nosnippet>102</a><span class="attr">#[inline(always)]
<a href=#103 id=103 data-nosnippet>103</a></span><span class="kw">pub fn </span>Log2FloorNonZero(v: u64) -&gt; u32 {
<a href=#104 id=104 data-nosnippet>104</a> <span class="number">63u32 </span>^ v.leading_zeros()
<a href=#105 id=105 data-nosnippet>105</a>}
<a href=#106 id=106 data-nosnippet>106</a>
<a href=#107 id=107 data-nosnippet>107</a><span class="attr">#[cfg(test)]
<a href=#108 id=108 data-nosnippet>108</a></span><span class="kw">mod </span>test {
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">fn </span>baseline_log2_floor_non_zero(<span class="kw-2">mut </span>n: u64) -&gt; u32 {
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">let </span><span class="kw-2">mut </span>result: u32 = <span class="number">0</span>;
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">while </span>{
<a href=#112 id=112 data-nosnippet>112</a> n &gt;&gt;= <span class="number">1i32</span>;
<a href=#113 id=113 data-nosnippet>113</a> n
<a href=#114 id=114 data-nosnippet>114</a> } != <span class="number">0
<a href=#115 id=115 data-nosnippet>115</a> </span>{
<a href=#116 id=116 data-nosnippet>116</a> result = result.wrapping_add(<span class="number">1</span>);
<a href=#117 id=117 data-nosnippet>117</a> }
<a href=#118 id=118 data-nosnippet>118</a> result
<a href=#119 id=119 data-nosnippet>119</a> }
<a href=#120 id=120 data-nosnippet>120</a>
<a href=#121 id=121 data-nosnippet>121</a> <span class="attr">#[test]
<a href=#122 id=122 data-nosnippet>122</a> </span><span class="kw">fn </span>log2floor_non_zero_works() {
<a href=#123 id=123 data-nosnippet>123</a> <span class="kw">let </span>examples = [
<a href=#124 id=124 data-nosnippet>124</a> <span class="number">4u64</span>,
<a href=#125 id=125 data-nosnippet>125</a> <span class="number">254</span>,
<a href=#126 id=126 data-nosnippet>126</a> <span class="number">256</span>,
<a href=#127 id=127 data-nosnippet>127</a> <span class="number">1428</span>,
<a href=#128 id=128 data-nosnippet>128</a> <span class="number">25412509</span>,
<a href=#129 id=129 data-nosnippet>129</a> <span class="number">21350891256</span>,
<a href=#130 id=130 data-nosnippet>130</a> <span class="number">65536</span>,
<a href=#131 id=131 data-nosnippet>131</a> <span class="number">1258912591</span>,
<a href=#132 id=132 data-nosnippet>132</a> <span class="number">60968101</span>,
<a href=#133 id=133 data-nosnippet>133</a> <span class="number">1</span>,
<a href=#134 id=134 data-nosnippet>134</a> <span class="number">12589125190825</span>,
<a href=#135 id=135 data-nosnippet>135</a> <span class="number">105912059215091</span>,
<a href=#136 id=136 data-nosnippet>136</a> <span class="number">0</span>,
<a href=#137 id=137 data-nosnippet>137</a> ];
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">for </span>example <span class="kw">in </span>examples.iter() {
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">let </span>fast_version = <span class="kw">super</span>::Log2FloorNonZero(<span class="kw-2">*</span>example);
<a href=#140 id=140 data-nosnippet>140</a> <span class="kw">let </span>baseline_version = baseline_log2_floor_non_zero(<span class="kw-2">*</span>example);
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">example !</span>= <span class="number">0 </span>{
<a href=#142 id=142 data-nosnippet>142</a> <span class="comment">// make sure we don't panic when computing...but don't care about result
<a href=#143 id=143 data-nosnippet>143</a> </span><span class="macro">assert_eq!</span>(fast_version, baseline_version);
<a href=#144 id=144 data-nosnippet>144</a> }
<a href=#145 id=145 data-nosnippet>145</a> }
<a href=#146 id=146 data-nosnippet>146</a> }
<a href=#147 id=147 data-nosnippet>147</a> <span class="kw">pub fn </span>approx_eq(a: f64, b: f64, tol: f64) {
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">let </span><span class="kw-2">mut </span>t0 = a - b;
<a href=#149 id=149 data-nosnippet>149</a> <span class="kw">let </span><span class="kw-2">mut </span>t1 = b - a;
<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">if </span>t0 &lt; <span class="number">0.0 </span>{
<a href=#151 id=151 data-nosnippet>151</a> t0 = -t0;
<a href=#152 id=152 data-nosnippet>152</a> }
<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">if </span>t1 &lt; <span class="number">0.0 </span>{
<a href=#154 id=154 data-nosnippet>154</a> t1 = -t1;
<a href=#155 id=155 data-nosnippet>155</a> }
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw">if </span>(!(t1 &lt; tol)) {
<a href=#157 id=157 data-nosnippet>157</a> <span class="macro">assert_eq!</span>(a, b);
<a href=#158 id=158 data-nosnippet>158</a> }
<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">if </span>(!(t0 &lt; tol)) {
<a href=#160 id=160 data-nosnippet>160</a> <span class="macro">assert_eq!</span>(a, b);
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a> }
<a href=#163 id=163 data-nosnippet>163</a> <span class="attr">#[test]
<a href=#164 id=164 data-nosnippet>164</a> </span><span class="kw">fn </span>fast_log2_works() {
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">let </span>examples = [
<a href=#166 id=166 data-nosnippet>166</a> <span class="number">4u64</span>,
<a href=#167 id=167 data-nosnippet>167</a> <span class="number">254</span>,
<a href=#168 id=168 data-nosnippet>168</a> <span class="number">256</span>,
<a href=#169 id=169 data-nosnippet>169</a> <span class="number">1428</span>,
<a href=#170 id=170 data-nosnippet>170</a> <span class="number">25412509</span>,
<a href=#171 id=171 data-nosnippet>171</a> <span class="number">21350891256</span>,
<a href=#172 id=172 data-nosnippet>172</a> <span class="number">65536</span>,
<a href=#173 id=173 data-nosnippet>173</a> <span class="number">1258912591</span>,
<a href=#174 id=174 data-nosnippet>174</a> <span class="number">60968101</span>,
<a href=#175 id=175 data-nosnippet>175</a> <span class="number">1</span>,
<a href=#176 id=176 data-nosnippet>176</a> <span class="number">12589125190825</span>,
<a href=#177 id=177 data-nosnippet>177</a> <span class="number">105912059215091</span>,
<a href=#178 id=178 data-nosnippet>178</a> <span class="number">0</span>,
<a href=#179 id=179 data-nosnippet>179</a> ];
<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">let </span>tol = [
<a href=#181 id=181 data-nosnippet>181</a> <span class="number">0.00001</span>, <span class="number">0.0001</span>, <span class="number">0.0001</span>, <span class="number">0.005</span>, <span class="number">0.007</span>, <span class="number">0.008</span>, <span class="number">0.01</span>, <span class="number">0.01</span>, <span class="number">0.01</span>, <span class="number">0.000001</span>, <span class="number">0.01</span>, <span class="number">0.01</span>,
<a href=#182 id=182 data-nosnippet>182</a> <span class="number">0.0001</span>,
<a href=#183 id=183 data-nosnippet>183</a> ];
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">for </span>(index, example) <span class="kw">in </span>examples.iter().enumerate() {
<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">let </span>fast_version = <span class="kw">super</span>::FastLog2(<span class="kw-2">*</span>example);
<a href=#186 id=186 data-nosnippet>186</a> <span class="kw">if </span><span class="kw-2">*</span><span class="macro">example !</span>= <span class="number">0 </span>{
<a href=#187 id=187 data-nosnippet>187</a> <span class="comment">// make sure we don't panic when computing...but don't care about result
<a href=#188 id=188 data-nosnippet>188</a> </span><span class="kw">let </span>baseline_version = (<span class="kw-2">*</span>example <span class="kw">as </span>f64).log2();
<a href=#189 id=189 data-nosnippet>189</a> approx_eq(fast_version <span class="kw">as </span>f64, baseline_version, tol[index]);
<a href=#190 id=190 data-nosnippet>190</a> } <span class="kw">else </span>{
<a href=#191 id=191 data-nosnippet>191</a> <span class="comment">//assert_eq!(fast_version as f64, 0.0 as f64);
<a href=#192 id=192 data-nosnippet>192</a> </span>}
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a> }
<a href=#195 id=195 data-nosnippet>195</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,63 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/vectorization.rs`."><title>vectorization.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>vectorization.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#![allow(unknown_lints)]
<a href=#2 id=2 data-nosnippet>2</a>#![allow(unused_macros)]
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">use </span><span class="kw">crate</span>::enc::util::FastLog2;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">crate</span>::enc::{s8, v8};
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">pub type </span>Mem256f = v8;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">pub type </span>Mem256i = s8;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">pub type </span>v256 = v8;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">pub type </span>v256i = s8;
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">pub fn </span>sum8(x: v256) -&gt; f32 {
<a href=#11 id=11 data-nosnippet>11</a> x[<span class="number">0</span>] + x[<span class="number">1</span>] + x[<span class="number">2</span>] + x[<span class="number">3</span>] + x[<span class="number">4</span>] + x[<span class="number">5</span>] + x[<span class="number">6</span>] + x[<span class="number">7</span>]
<a href=#12 id=12 data-nosnippet>12</a>}
<a href=#13 id=13 data-nosnippet>13</a>
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">pub fn </span>sum8i(x: v256i) -&gt; i32 {
<a href=#15 id=15 data-nosnippet>15</a> x[<span class="number">0</span>].wrapping_add(x[<span class="number">1</span>])
<a href=#16 id=16 data-nosnippet>16</a> .wrapping_add(x[<span class="number">2</span>])
<a href=#17 id=17 data-nosnippet>17</a> .wrapping_add(x[<span class="number">3</span>])
<a href=#18 id=18 data-nosnippet>18</a> .wrapping_add(x[<span class="number">4</span>])
<a href=#19 id=19 data-nosnippet>19</a> .wrapping_add(x[<span class="number">5</span>])
<a href=#20 id=20 data-nosnippet>20</a> .wrapping_add(x[<span class="number">6</span>])
<a href=#21 id=21 data-nosnippet>21</a> .wrapping_add(x[<span class="number">7</span>])
<a href=#22 id=22 data-nosnippet>22</a>}
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a><span class="kw">pub fn </span>log2i(x: v256i) -&gt; v256 {
<a href=#25 id=25 data-nosnippet>25</a> [
<a href=#26 id=26 data-nosnippet>26</a> FastLog2(x[<span class="number">0</span>] <span class="kw">as </span>u64),
<a href=#27 id=27 data-nosnippet>27</a> FastLog2(x[<span class="number">1</span>] <span class="kw">as </span>u64),
<a href=#28 id=28 data-nosnippet>28</a> FastLog2(x[<span class="number">2</span>] <span class="kw">as </span>u64),
<a href=#29 id=29 data-nosnippet>29</a> FastLog2(x[<span class="number">3</span>] <span class="kw">as </span>u64),
<a href=#30 id=30 data-nosnippet>30</a> FastLog2(x[<span class="number">4</span>] <span class="kw">as </span>u64),
<a href=#31 id=31 data-nosnippet>31</a> FastLog2(x[<span class="number">5</span>] <span class="kw">as </span>u64),
<a href=#32 id=32 data-nosnippet>32</a> FastLog2(x[<span class="number">6</span>] <span class="kw">as </span>u64),
<a href=#33 id=33 data-nosnippet>33</a> FastLog2(x[<span class="number">7</span>] <span class="kw">as </span>u64),
<a href=#34 id=34 data-nosnippet>34</a> ]
<a href=#35 id=35 data-nosnippet>35</a> .into()
<a href=#36 id=36 data-nosnippet>36</a>}
<a href=#37 id=37 data-nosnippet>37</a><span class="kw">pub fn </span>cast_i32_to_f32(x: v256i) -&gt; v256 {
<a href=#38 id=38 data-nosnippet>38</a> [
<a href=#39 id=39 data-nosnippet>39</a> x[<span class="number">0</span>] <span class="kw">as </span>f32,
<a href=#40 id=40 data-nosnippet>40</a> x[<span class="number">1</span>] <span class="kw">as </span>f32,
<a href=#41 id=41 data-nosnippet>41</a> x[<span class="number">2</span>] <span class="kw">as </span>f32,
<a href=#42 id=42 data-nosnippet>42</a> x[<span class="number">3</span>] <span class="kw">as </span>f32,
<a href=#43 id=43 data-nosnippet>43</a> x[<span class="number">4</span>] <span class="kw">as </span>f32,
<a href=#44 id=44 data-nosnippet>44</a> x[<span class="number">5</span>] <span class="kw">as </span>f32,
<a href=#45 id=45 data-nosnippet>45</a> x[<span class="number">6</span>] <span class="kw">as </span>f32,
<a href=#46 id=46 data-nosnippet>46</a> x[<span class="number">7</span>] <span class="kw">as </span>f32,
<a href=#47 id=47 data-nosnippet>47</a> ]
<a href=#48 id=48 data-nosnippet>48</a> .into()
<a href=#49 id=49 data-nosnippet>49</a>}
<a href=#50 id=50 data-nosnippet>50</a><span class="kw">pub fn </span>cast_f32_to_i32(x: v256) -&gt; v256i {
<a href=#51 id=51 data-nosnippet>51</a> [
<a href=#52 id=52 data-nosnippet>52</a> x[<span class="number">0</span>] <span class="kw">as </span>i32,
<a href=#53 id=53 data-nosnippet>53</a> x[<span class="number">1</span>] <span class="kw">as </span>i32,
<a href=#54 id=54 data-nosnippet>54</a> x[<span class="number">2</span>] <span class="kw">as </span>i32,
<a href=#55 id=55 data-nosnippet>55</a> x[<span class="number">3</span>] <span class="kw">as </span>i32,
<a href=#56 id=56 data-nosnippet>56</a> x[<span class="number">4</span>] <span class="kw">as </span>i32,
<a href=#57 id=57 data-nosnippet>57</a> x[<span class="number">5</span>] <span class="kw">as </span>i32,
<a href=#58 id=58 data-nosnippet>58</a> x[<span class="number">6</span>] <span class="kw">as </span>i32,
<a href=#59 id=59 data-nosnippet>59</a> x[<span class="number">7</span>] <span class="kw">as </span>i32,
<a href=#60 id=60 data-nosnippet>60</a> ]
<a href=#61 id=61 data-nosnippet>61</a> .into()
<a href=#62 id=62 data-nosnippet>62</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,148 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/weights.rs`."><title>weights.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>weights.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>core::cmp::{max, min};
<a href=#2 id=2 data-nosnippet>2</a><span class="kw">pub type </span>Prob = u16;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">pub const </span>BLEND_FIXED_POINT_PRECISION: i8 = <span class="number">15</span>;
<a href=#5 id=5 data-nosnippet>5</a><span class="attr">#[allow(dead_code)]
<a href=#6 id=6 data-nosnippet>6</a></span><span class="kw">pub const </span>LOG2_SCALE: i32 = <span class="number">15</span>;
<a href=#7 id=7 data-nosnippet>7</a><span class="attr">#[derive(Debug, Copy, Clone)]
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">pub struct </span>Weights {
<a href=#9 id=9 data-nosnippet>9</a> model_weights: [i32; <span class="number">2</span>],
<a href=#10 id=10 data-nosnippet>10</a> mixing_param: u8,
<a href=#11 id=11 data-nosnippet>11</a> normalized_weight: Prob,
<a href=#12 id=12 data-nosnippet>12</a>}
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">impl </span>Default <span class="kw">for </span>Weights {
<a href=#14 id=14 data-nosnippet>14</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#15 id=15 data-nosnippet>15</a> <span class="self">Self</span>::new()
<a href=#16 id=16 data-nosnippet>16</a> }
<a href=#17 id=17 data-nosnippet>17</a>}
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">impl </span>Weights {
<a href=#19 id=19 data-nosnippet>19</a> <span class="kw">pub fn </span>new() -&gt; <span class="self">Self </span>{
<a href=#20 id=20 data-nosnippet>20</a> Weights {
<a href=#21 id=21 data-nosnippet>21</a> model_weights: [<span class="number">1</span>; <span class="number">2</span>],
<a href=#22 id=22 data-nosnippet>22</a> mixing_param: <span class="number">1</span>,
<a href=#23 id=23 data-nosnippet>23</a> normalized_weight: <span class="number">1 </span>&lt;&lt; (BLEND_FIXED_POINT_PRECISION - <span class="number">1</span>),
<a href=#24 id=24 data-nosnippet>24</a> }
<a href=#25 id=25 data-nosnippet>25</a> }
<a href=#26 id=26 data-nosnippet>26</a> <span class="attr">#[allow(unused)]
<a href=#27 id=27 data-nosnippet>27</a> #[inline(always)]
<a href=#28 id=28 data-nosnippet>28</a> </span><span class="kw">pub fn </span>update(<span class="kw-2">&amp;mut </span><span class="self">self</span>, model_probs: [Prob; <span class="number">2</span>], weighted_prob: Prob) {
<a href=#29 id=29 data-nosnippet>29</a> <span class="macro">debug_assert!</span>(<span class="self">self</span>.<span class="macro">mixing_param !</span>= <span class="number">0</span>);
<a href=#30 id=30 data-nosnippet>30</a> normalize_weights(<span class="kw-2">&amp;mut </span><span class="self">self</span>.model_weights);
<a href=#31 id=31 data-nosnippet>31</a> <span class="kw">let </span>w0new = compute_new_weight(
<a href=#32 id=32 data-nosnippet>32</a> model_probs,
<a href=#33 id=33 data-nosnippet>33</a> weighted_prob,
<a href=#34 id=34 data-nosnippet>34</a> <span class="self">self</span>.model_weights,
<a href=#35 id=35 data-nosnippet>35</a> <span class="bool-val">false</span>,
<a href=#36 id=36 data-nosnippet>36</a> <span class="self">self</span>.mixing_param - <span class="number">1</span>,
<a href=#37 id=37 data-nosnippet>37</a> );
<a href=#38 id=38 data-nosnippet>38</a> <span class="kw">let </span>w1new = compute_new_weight(
<a href=#39 id=39 data-nosnippet>39</a> model_probs,
<a href=#40 id=40 data-nosnippet>40</a> weighted_prob,
<a href=#41 id=41 data-nosnippet>41</a> <span class="self">self</span>.model_weights,
<a href=#42 id=42 data-nosnippet>42</a> <span class="bool-val">true</span>,
<a href=#43 id=43 data-nosnippet>43</a> <span class="self">self</span>.mixing_param - <span class="number">1</span>,
<a href=#44 id=44 data-nosnippet>44</a> );
<a href=#45 id=45 data-nosnippet>45</a> <span class="self">self</span>.model_weights = [w0new, w1new];
<a href=#46 id=46 data-nosnippet>46</a> <span class="self">self</span>.normalized_weight = compute_normalized_weight(<span class="self">self</span>.model_weights);
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a> <span class="attr">#[allow(dead_code)]
<a href=#49 id=49 data-nosnippet>49</a> #[inline(always)]
<a href=#50 id=50 data-nosnippet>50</a> </span><span class="kw">pub fn </span>norm_weight(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; Prob {
<a href=#51 id=51 data-nosnippet>51</a> <span class="self">self</span>.normalized_weight
<a href=#52 id=52 data-nosnippet>52</a> }
<a href=#53 id=53 data-nosnippet>53</a>}
<a href=#54 id=54 data-nosnippet>54</a>
<a href=#55 id=55 data-nosnippet>55</a><span class="attr">#[allow(dead_code)]
<a href=#56 id=56 data-nosnippet>56</a>#[inline(always)]
<a href=#57 id=57 data-nosnippet>57</a></span><span class="kw">fn </span>compute_normalized_weight(model_weights: [i32; <span class="number">2</span>]) -&gt; Prob {
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">let </span>total = i64::from(model_weights[<span class="number">0</span>]) + i64::from(model_weights[<span class="number">1</span>]);
<a href=#59 id=59 data-nosnippet>59</a> <span class="kw">let </span>leading_zeros = total.leading_zeros();
<a href=#60 id=60 data-nosnippet>60</a> <span class="kw">let </span>shift = max(<span class="number">56 </span>- (leading_zeros <span class="kw">as </span>i8), <span class="number">0</span>);
<a href=#61 id=61 data-nosnippet>61</a> <span class="kw">let </span>total_8bit = total &gt;&gt; shift;
<a href=#62 id=62 data-nosnippet>62</a> <span class="comment">/*::probability::numeric::fast_divide_16bit_by_8bit(
<a href=#63 id=63 data-nosnippet>63</a> ((model_weights[0] &gt;&gt; shift) as u16)&lt;&lt; 8,
<a href=#64 id=64 data-nosnippet>64</a> ::probability::numeric::lookup_divisor8(total_8bit as u8)) &lt;&lt; (BLEND_FIXED_POINT_PRECISION - 8)
<a href=#65 id=65 data-nosnippet>65</a> */
<a href=#66 id=66 data-nosnippet>66</a> </span>((((model_weights[<span class="number">0</span>] &gt;&gt; shift) <span class="kw">as </span>u16) &lt;&lt; <span class="number">8</span>) / total_8bit <span class="kw">as </span>u16<span class="comment">/*fixme??*/</span>)
<a href=#67 id=67 data-nosnippet>67</a> &lt;&lt; (BLEND_FIXED_POINT_PRECISION - <span class="number">8</span>)
<a href=#68 id=68 data-nosnippet>68</a>}
<a href=#69 id=69 data-nosnippet>69</a>
<a href=#70 id=70 data-nosnippet>70</a><span class="attr">#[allow(dead_code)]
<a href=#71 id=71 data-nosnippet>71</a>#[cold]
<a href=#72 id=72 data-nosnippet>72</a></span><span class="kw">fn </span>fix_weights(weights: <span class="kw-2">&amp;mut </span>[i32; <span class="number">2</span>]) {
<a href=#73 id=73 data-nosnippet>73</a> <span class="kw">let </span>ilog = <span class="number">32 </span>- min(weights[<span class="number">0</span>].leading_zeros(), weights[<span class="number">1</span>].leading_zeros());
<a href=#74 id=74 data-nosnippet>74</a> <span class="kw">let </span>max_log = <span class="number">24</span>;
<a href=#75 id=75 data-nosnippet>75</a> <span class="kw">if </span>ilog &gt;= max_log {
<a href=#76 id=76 data-nosnippet>76</a> weights[<span class="number">0</span>] &gt;&gt;= ilog - max_log;
<a href=#77 id=77 data-nosnippet>77</a> weights[<span class="number">1</span>] &gt;&gt;= ilog - max_log;
<a href=#78 id=78 data-nosnippet>78</a> }
<a href=#79 id=79 data-nosnippet>79</a>}
<a href=#80 id=80 data-nosnippet>80</a>
<a href=#81 id=81 data-nosnippet>81</a><span class="attr">#[allow(dead_code)]
<a href=#82 id=82 data-nosnippet>82</a>#[inline(always)]
<a href=#83 id=83 data-nosnippet>83</a></span><span class="kw">fn </span>normalize_weights(weights: <span class="kw-2">&amp;mut </span>[i32; <span class="number">2</span>]) {
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">if </span>((weights[<span class="number">0</span>] | weights[<span class="number">1</span>]) &amp; <span class="number">0x7f00_0000</span>) != <span class="number">0 </span>{
<a href=#85 id=85 data-nosnippet>85</a> fix_weights(weights);
<a href=#86 id=86 data-nosnippet>86</a> }
<a href=#87 id=87 data-nosnippet>87</a>}
<a href=#88 id=88 data-nosnippet>88</a>
<a href=#89 id=89 data-nosnippet>89</a><span class="attr">#[allow(dead_code)]
<a href=#90 id=90 data-nosnippet>90</a>#[cfg(feature = <span class="string">"floating_point_context_mixing"</span>)]
<a href=#91 id=91 data-nosnippet>91</a></span><span class="kw">fn </span>compute_new_weight(
<a href=#92 id=92 data-nosnippet>92</a> probs: [Prob; <span class="number">2</span>],
<a href=#93 id=93 data-nosnippet>93</a> weighted_prob: Prob,
<a href=#94 id=94 data-nosnippet>94</a> weights: [i32; <span class="number">2</span>],
<a href=#95 id=95 data-nosnippet>95</a> index_equal_1: bool,
<a href=#96 id=96 data-nosnippet>96</a> _speed: u8,
<a href=#97 id=97 data-nosnippet>97</a>) -&gt; i32 {
<a href=#98 id=98 data-nosnippet>98</a> <span class="comment">// speed ranges from 1 to 14 inclusive
<a href=#99 id=99 data-nosnippet>99</a> </span><span class="kw">let </span>index = index_equal_1 <span class="kw">as </span>usize;
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">let </span>n1i = probs[index] <span class="kw">as </span>f64 / ((<span class="number">1i64 </span>&lt;&lt; LOG2_SCALE) <span class="kw">as </span>f64);
<a href=#101 id=101 data-nosnippet>101</a> <span class="comment">//let n0i = 1.0f64 - n1i;
<a href=#102 id=102 data-nosnippet>102</a> </span><span class="kw">let </span>ni = <span class="number">1.0f64</span>;
<a href=#103 id=103 data-nosnippet>103</a> <span class="kw">let </span>s1 = weighted_prob <span class="kw">as </span>f64 / ((<span class="number">1i64 </span>&lt;&lt; LOG2_SCALE) <span class="kw">as </span>f64);
<a href=#104 id=104 data-nosnippet>104</a> <span class="kw">let </span>s0 = <span class="number">1.0f64 </span>- s1;
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">let </span>s = <span class="number">1.0f64</span>;
<a href=#106 id=106 data-nosnippet>106</a> <span class="comment">//let p0 = s0;
<a href=#107 id=107 data-nosnippet>107</a> </span><span class="kw">let </span>p1 = s1;
<a href=#108 id=108 data-nosnippet>108</a> <span class="kw">let </span>wi = weights[index] <span class="kw">as </span>f64 / ((<span class="number">1i64 </span>&lt;&lt; LOG2_SCALE) <span class="kw">as </span>f64);
<a href=#109 id=109 data-nosnippet>109</a> <span class="kw">let </span><span class="kw-2">mut </span>wi_new = wi + (<span class="number">1.0 </span>- p1) * (s * n1i - s1 * ni) / (s0 * s1);
<a href=#110 id=110 data-nosnippet>110</a> <span class="kw">let </span>eps = <span class="number">0.00001f64</span>;
<a href=#111 id=111 data-nosnippet>111</a> <span class="kw">if </span>!(wi_new &gt; eps) {
<a href=#112 id=112 data-nosnippet>112</a> wi_new = eps;
<a href=#113 id=113 data-nosnippet>113</a> }
<a href=#114 id=114 data-nosnippet>114</a> (wi_new * ((<span class="number">1i64 </span>&lt;&lt; LOG2_SCALE) <span class="kw">as </span>f64)) <span class="kw">as </span>i32
<a href=#115 id=115 data-nosnippet>115</a>}
<a href=#116 id=116 data-nosnippet>116</a>
<a href=#117 id=117 data-nosnippet>117</a><span class="attr">#[allow(dead_code)]
<a href=#118 id=118 data-nosnippet>118</a>#[cfg(not(feature = <span class="string">"floating_point_context_mixing"</span>))]
<a href=#119 id=119 data-nosnippet>119</a>#[inline(always)]
<a href=#120 id=120 data-nosnippet>120</a></span><span class="kw">fn </span>compute_new_weight(
<a href=#121 id=121 data-nosnippet>121</a> probs: [Prob; <span class="number">2</span>],
<a href=#122 id=122 data-nosnippet>122</a> weighted_prob: Prob,
<a href=#123 id=123 data-nosnippet>123</a> weights: [i32; <span class="number">2</span>],
<a href=#124 id=124 data-nosnippet>124</a> index_equal_1: bool,
<a href=#125 id=125 data-nosnippet>125</a> _speed: u8,
<a href=#126 id=126 data-nosnippet>126</a>) -&gt; i32 {
<a href=#127 id=127 data-nosnippet>127</a> <span class="comment">// speed ranges from 1 to 14 inclusive
<a href=#128 id=128 data-nosnippet>128</a> </span><span class="kw">let </span>index = index_equal_1 <span class="kw">as </span>usize;
<a href=#129 id=129 data-nosnippet>129</a> <span class="kw">let </span>full_model_sum_p1 = i64::from(weighted_prob);
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw">let </span>full_model_total = <span class="number">1i64 </span>&lt;&lt; LOG2_SCALE;
<a href=#131 id=131 data-nosnippet>131</a> <span class="kw">let </span>full_model_sum_p0 = full_model_total.wrapping_sub(i64::from(weighted_prob));
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">let </span>n1i = i64::from(probs[index]);
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">let </span>ni = <span class="number">1i64 </span>&lt;&lt; LOG2_SCALE;
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">let </span>error = full_model_total.wrapping_sub(full_model_sum_p1);
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw">let </span>wi = i64::from(weights[index]);
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">let </span>efficacy = full_model_total.wrapping_mul(n1i) - full_model_sum_p1.wrapping_mul(ni);
<a href=#137 id=137 data-nosnippet>137</a> <span class="comment">//let geometric_probabilities = full_model_sum_p1 * full_model_sum_p0;
<a href=#138 id=138 data-nosnippet>138</a> </span><span class="kw">let </span>log_geometric_probabilities =
<a href=#139 id=139 data-nosnippet>139</a> <span class="number">64 </span>- (full_model_sum_p1.wrapping_mul(full_model_sum_p0)).leading_zeros();
<a href=#140 id=140 data-nosnippet>140</a> <span class="comment">//let scaled_geometric_probabilities = geometric_probabilities * S;
<a href=#141 id=141 data-nosnippet>141</a> //let new_weight_adj = (error * efficacy) &gt;&gt; log_geometric_probabilities;// / geometric_probabilities;
<a href=#142 id=142 data-nosnippet>142</a> //let new_weight_adj = (error * efficacy)/(full_model_sum_p1 * full_model_sum_p0);
<a href=#143 id=143 data-nosnippet>143</a> </span><span class="kw">let </span>new_weight_adj = (error.wrapping_mul(efficacy)) &gt;&gt; log_geometric_probabilities;
<a href=#144 id=144 data-nosnippet>144</a> <span class="comment">// assert!(wi + new_weight_adj &lt; (1i64 &lt;&lt; 31));
<a href=#145 id=145 data-nosnippet>145</a> //print!("{} -&gt; {} due to {:?} vs {}\n", wi as f64 / (weights[0] + weights[1]) as f64, (wi + new_weight_adj) as f64 /(weights[0] as i64 + new_weight_adj as i64 + weights[1] as i64) as f64, probs[index], weighted_prob);
<a href=#146 id=146 data-nosnippet>146</a> </span>max(<span class="number">1</span>, wi.wrapping_add(new_weight_adj) <span class="kw">as </span>i32)
<a href=#147 id=147 data-nosnippet>147</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,443 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/worker_pool.rs`."><title>worker_pool.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>worker_pool.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#![cfg(feature = <span class="string">"std"</span>)]
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>alloc::{Allocator, SliceWrapper};
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>core::mem;
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span>std;
<a href=#6 id=6 data-nosnippet>6</a><span class="comment">// in-place thread create
<a href=#7 id=7 data-nosnippet>7</a></span><span class="kw">use </span>std::sync::RwLock;
<a href=#8 id=8 data-nosnippet>8</a><span class="kw">use </span>std::sync::{Arc, Condvar, Mutex};
<a href=#9 id=9 data-nosnippet>9</a>
<a href=#10 id=10 data-nosnippet>10</a><span class="kw">use </span><span class="kw">crate</span>::enc::backward_references::UnionHasher;
<a href=#11 id=11 data-nosnippet>11</a><span class="kw">use </span><span class="kw">crate</span>::enc::fixed_queue::{FixedQueue, MAX_THREADS};
<a href=#12 id=12 data-nosnippet>12</a><span class="kw">use </span><span class="kw">crate</span>::enc::threading::{
<a href=#13 id=13 data-nosnippet>13</a> BatchSpawnableLite, BrotliEncoderThreadError, CompressMulti, CompressionThreadResult,
<a href=#14 id=14 data-nosnippet>14</a> InternalOwned, InternalSendAlloc, Joinable, Owned, SendAlloc,
<a href=#15 id=15 data-nosnippet>15</a>};
<a href=#16 id=16 data-nosnippet>16</a><span class="kw">use </span><span class="kw">crate</span>::enc::{BrotliAlloc, BrotliEncoderParams};
<a href=#17 id=17 data-nosnippet>17</a>
<a href=#18 id=18 data-nosnippet>18</a><span class="kw">struct </span>JobReply&lt;T: Send + <span class="lifetime">'static</span>&gt; {
<a href=#19 id=19 data-nosnippet>19</a> result: T,
<a href=#20 id=20 data-nosnippet>20</a> work_id: u64,
<a href=#21 id=21 data-nosnippet>21</a>}
<a href=#22 id=22 data-nosnippet>22</a>
<a href=#23 id=23 data-nosnippet>23</a><span class="kw">struct </span>JobRequest&lt;
<a href=#24 id=24 data-nosnippet>24</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#25 id=25 data-nosnippet>25</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#26 id=26 data-nosnippet>26</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#27 id=27 data-nosnippet>27</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#28 id=28 data-nosnippet>28</a>&gt; {
<a href=#29 id=29 data-nosnippet>29</a> func: <span class="kw">fn</span>(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue,
<a href=#30 id=30 data-nosnippet>30</a> extra_input: ExtraInput,
<a href=#31 id=31 data-nosnippet>31</a> index: usize,
<a href=#32 id=32 data-nosnippet>32</a> thread_size: usize,
<a href=#33 id=33 data-nosnippet>33</a> data: Arc&lt;RwLock&lt;U&gt;&gt;,
<a href=#34 id=34 data-nosnippet>34</a> alloc: Alloc,
<a href=#35 id=35 data-nosnippet>35</a> work_id: u64,
<a href=#36 id=36 data-nosnippet>36</a>}
<a href=#37 id=37 data-nosnippet>37</a>
<a href=#38 id=38 data-nosnippet>38</a><span class="kw">struct </span>WorkQueue&lt;
<a href=#39 id=39 data-nosnippet>39</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#40 id=40 data-nosnippet>40</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#41 id=41 data-nosnippet>41</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#42 id=42 data-nosnippet>42</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#43 id=43 data-nosnippet>43</a>&gt; {
<a href=#44 id=44 data-nosnippet>44</a> jobs: FixedQueue&lt;JobRequest&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;,
<a href=#45 id=45 data-nosnippet>45</a> results: FixedQueue&lt;JobReply&lt;ReturnValue&gt;&gt;,
<a href=#46 id=46 data-nosnippet>46</a> shutdown: bool,
<a href=#47 id=47 data-nosnippet>47</a> immediate_shutdown: bool,
<a href=#48 id=48 data-nosnippet>48</a> num_in_progress: usize,
<a href=#49 id=49 data-nosnippet>49</a> cur_work_id: u64,
<a href=#50 id=50 data-nosnippet>50</a>}
<a href=#51 id=51 data-nosnippet>51</a><span class="kw">impl</span>&lt;
<a href=#52 id=52 data-nosnippet>52</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#53 id=53 data-nosnippet>53</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#54 id=54 data-nosnippet>54</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#55 id=55 data-nosnippet>55</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#56 id=56 data-nosnippet>56</a> &gt; Default <span class="kw">for </span>WorkQueue&lt;ReturnValue, ExtraInput, Alloc, U&gt;
<a href=#57 id=57 data-nosnippet>57</a>{
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">fn </span>default() -&gt; <span class="self">Self </span>{
<a href=#59 id=59 data-nosnippet>59</a> WorkQueue {
<a href=#60 id=60 data-nosnippet>60</a> jobs: FixedQueue::default(),
<a href=#61 id=61 data-nosnippet>61</a> results: FixedQueue::default(),
<a href=#62 id=62 data-nosnippet>62</a> num_in_progress: <span class="number">0</span>,
<a href=#63 id=63 data-nosnippet>63</a> immediate_shutdown: <span class="bool-val">false</span>,
<a href=#64 id=64 data-nosnippet>64</a> shutdown: <span class="bool-val">false</span>,
<a href=#65 id=65 data-nosnippet>65</a> cur_work_id: <span class="number">0</span>,
<a href=#66 id=66 data-nosnippet>66</a> }
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a>}
<a href=#69 id=69 data-nosnippet>69</a>
<a href=#70 id=70 data-nosnippet>70</a><span class="kw">pub struct </span>GuardedQueue&lt;
<a href=#71 id=71 data-nosnippet>71</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#72 id=72 data-nosnippet>72</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#73 id=73 data-nosnippet>73</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#74 id=74 data-nosnippet>74</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#75 id=75 data-nosnippet>75</a>&gt;(Arc&lt;(Mutex&lt;WorkQueue&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;, Condvar)&gt;);
<a href=#76 id=76 data-nosnippet>76</a><span class="kw">pub struct </span>WorkerPool&lt;
<a href=#77 id=77 data-nosnippet>77</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#78 id=78 data-nosnippet>78</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#79 id=79 data-nosnippet>79</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#80 id=80 data-nosnippet>80</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#81 id=81 data-nosnippet>81</a>&gt; {
<a href=#82 id=82 data-nosnippet>82</a> queue: GuardedQueue&lt;ReturnValue, ExtraInput, Alloc, U&gt;,
<a href=#83 id=83 data-nosnippet>83</a> join: [<span class="prelude-ty">Option</span>&lt;std::thread::JoinHandle&lt;()&gt;&gt;; MAX_THREADS],
<a href=#84 id=84 data-nosnippet>84</a>}
<a href=#85 id=85 data-nosnippet>85</a>
<a href=#86 id=86 data-nosnippet>86</a><span class="kw">impl</span>&lt;
<a href=#87 id=87 data-nosnippet>87</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#88 id=88 data-nosnippet>88</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#89 id=89 data-nosnippet>89</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#90 id=90 data-nosnippet>90</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#91 id=91 data-nosnippet>91</a> &gt; Drop <span class="kw">for </span>WorkerPool&lt;ReturnValue, ExtraInput, Alloc, U&gt;
<a href=#92 id=92 data-nosnippet>92</a>{
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#94 id=94 data-nosnippet>94</a> {
<a href=#95 id=95 data-nosnippet>95</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span><span class="self">self</span>.queue.<span class="number">0</span>;
<a href=#96 id=96 data-nosnippet>96</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#97 id=97 data-nosnippet>97</a> local_queue.immediate_shutdown = <span class="bool-val">true</span>;
<a href=#98 id=98 data-nosnippet>98</a> cvar.notify_all();
<a href=#99 id=99 data-nosnippet>99</a> }
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">for </span>thread_handle <span class="kw">in </span><span class="self">self</span>.join.iter_mut() {
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(th) = thread_handle.take() {
<a href=#102 id=102 data-nosnippet>102</a> th.join().unwrap();
<a href=#103 id=103 data-nosnippet>103</a> }
<a href=#104 id=104 data-nosnippet>104</a> }
<a href=#105 id=105 data-nosnippet>105</a> }
<a href=#106 id=106 data-nosnippet>106</a>}
<a href=#107 id=107 data-nosnippet>107</a><span class="kw">impl</span>&lt;
<a href=#108 id=108 data-nosnippet>108</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#109 id=109 data-nosnippet>109</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#110 id=110 data-nosnippet>110</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#111 id=111 data-nosnippet>111</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#112 id=112 data-nosnippet>112</a> &gt; WorkerPool&lt;ReturnValue, ExtraInput, Alloc, U&gt;
<a href=#113 id=113 data-nosnippet>113</a>{
<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">fn </span>do_work(queue: Arc&lt;(Mutex&lt;WorkQueue&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;, Condvar)&gt;) {
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw">loop </span>{
<a href=#116 id=116 data-nosnippet>116</a> <span class="kw">let </span>ret;
<a href=#117 id=117 data-nosnippet>117</a> {
<a href=#118 id=118 data-nosnippet>118</a> <span class="comment">// need to drop possible job before the final lock is taken,
<a href=#119 id=119 data-nosnippet>119</a> // so refcount of possible_job Arc is 0 by the time the job is delivered
<a href=#120 id=120 data-nosnippet>120</a> // to the caller. We basically need a barrier (the lock) to happen
<a href=#121 id=121 data-nosnippet>121</a> // after the destructor that decrefs possible_job
<a href=#122 id=122 data-nosnippet>122</a> </span><span class="kw">let </span>possible_job;
<a href=#123 id=123 data-nosnippet>123</a> {
<a href=#124 id=124 data-nosnippet>124</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span>queue;
<a href=#125 id=125 data-nosnippet>125</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#126 id=126 data-nosnippet>126</a> <span class="kw">if </span>local_queue.immediate_shutdown {
<a href=#127 id=127 data-nosnippet>127</a> <span class="kw">break</span>;
<a href=#128 id=128 data-nosnippet>128</a> }
<a href=#129 id=129 data-nosnippet>129</a> possible_job = <span class="kw">if let </span><span class="prelude-val">Some</span>(res) = local_queue.jobs.pop() {
<a href=#130 id=130 data-nosnippet>130</a> cvar.notify_all();
<a href=#131 id=131 data-nosnippet>131</a> local_queue.num_in_progress += <span class="number">1</span>;
<a href=#132 id=132 data-nosnippet>132</a> res
<a href=#133 id=133 data-nosnippet>133</a> } <span class="kw">else if </span>local_queue.shutdown {
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">break</span>;
<a href=#135 id=135 data-nosnippet>135</a> } <span class="kw">else </span>{
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw">let </span>_lock = cvar.wait(local_queue); <span class="comment">// unlock immediately, unfortunately
<a href=#137 id=137 data-nosnippet>137</a> </span><span class="kw">continue</span>;
<a href=#138 id=138 data-nosnippet>138</a> };
<a href=#139 id=139 data-nosnippet>139</a> }
<a href=#140 id=140 data-nosnippet>140</a> ret = <span class="kw">if let </span><span class="prelude-val">Ok</span>(job_data) = possible_job.data.read() {
<a href=#141 id=141 data-nosnippet>141</a> JobReply {
<a href=#142 id=142 data-nosnippet>142</a> result: (possible_job.func)(
<a href=#143 id=143 data-nosnippet>143</a> possible_job.extra_input,
<a href=#144 id=144 data-nosnippet>144</a> possible_job.index,
<a href=#145 id=145 data-nosnippet>145</a> possible_job.thread_size,
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw-2">&amp;*</span>job_data,
<a href=#147 id=147 data-nosnippet>147</a> possible_job.alloc,
<a href=#148 id=148 data-nosnippet>148</a> ),
<a href=#149 id=149 data-nosnippet>149</a> work_id: possible_job.work_id,
<a href=#150 id=150 data-nosnippet>150</a> }
<a href=#151 id=151 data-nosnippet>151</a> } <span class="kw">else </span>{
<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">break</span>; <span class="comment">// poisoned lock
<a href=#153 id=153 data-nosnippet>153</a> </span>};
<a href=#154 id=154 data-nosnippet>154</a> }
<a href=#155 id=155 data-nosnippet>155</a> {
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span>queue;
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#158 id=158 data-nosnippet>158</a> local_queue.num_in_progress -= <span class="number">1</span>;
<a href=#159 id=159 data-nosnippet>159</a> local_queue.results.push(ret).unwrap();
<a href=#160 id=160 data-nosnippet>160</a> cvar.notify_all();
<a href=#161 id=161 data-nosnippet>161</a> }
<a href=#162 id=162 data-nosnippet>162</a> }
<a href=#163 id=163 data-nosnippet>163</a> }
<a href=#164 id=164 data-nosnippet>164</a> <span class="kw">fn </span>_push_job(<span class="kw-2">&amp;mut </span><span class="self">self</span>, job: JobRequest&lt;ReturnValue, ExtraInput, Alloc, U&gt;) {
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span><span class="self">self</span>.queue.<span class="number">0</span>;
<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#167 id=167 data-nosnippet>167</a> <span class="kw">loop </span>{
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">if </span>local_queue.jobs.size() + local_queue.num_in_progress + local_queue.results.size()
<a href=#169 id=169 data-nosnippet>169</a> &lt; MAX_THREADS
<a href=#170 id=170 data-nosnippet>170</a> {
<a href=#171 id=171 data-nosnippet>171</a> local_queue.jobs.push(job).unwrap();
<a href=#172 id=172 data-nosnippet>172</a> cvar.notify_all();
<a href=#173 id=173 data-nosnippet>173</a> <span class="kw">break</span>;
<a href=#174 id=174 data-nosnippet>174</a> }
<a href=#175 id=175 data-nosnippet>175</a> local_queue = cvar.wait(local_queue).unwrap();
<a href=#176 id=176 data-nosnippet>176</a> }
<a href=#177 id=177 data-nosnippet>177</a> }
<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">fn </span>_try_push_job(
<a href=#179 id=179 data-nosnippet>179</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#180 id=180 data-nosnippet>180</a> job: JobRequest&lt;ReturnValue, ExtraInput, Alloc, U&gt;,
<a href=#181 id=181 data-nosnippet>181</a> ) -&gt; <span class="prelude-ty">Result</span>&lt;(), JobRequest&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt; {
<a href=#182 id=182 data-nosnippet>182</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span><span class="self">self</span>.queue.<span class="number">0</span>;
<a href=#183 id=183 data-nosnippet>183</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">if </span>local_queue.jobs.size() + local_queue.num_in_progress + local_queue.results.size()
<a href=#185 id=185 data-nosnippet>185</a> &lt; MAX_THREADS
<a href=#186 id=186 data-nosnippet>186</a> {
<a href=#187 id=187 data-nosnippet>187</a> local_queue.jobs.push(job).unwrap();
<a href=#188 id=188 data-nosnippet>188</a> cvar.notify_all();
<a href=#189 id=189 data-nosnippet>189</a> <span class="prelude-val">Ok</span>(())
<a href=#190 id=190 data-nosnippet>190</a> } <span class="kw">else </span>{
<a href=#191 id=191 data-nosnippet>191</a> <span class="prelude-val">Err</span>(job)
<a href=#192 id=192 data-nosnippet>192</a> }
<a href=#193 id=193 data-nosnippet>193</a> }
<a href=#194 id=194 data-nosnippet>194</a> <span class="kw">fn </span>start(
<a href=#195 id=195 data-nosnippet>195</a> queue: Arc&lt;(Mutex&lt;WorkQueue&lt;ReturnValue, ExtraInput, Alloc, U&gt;&gt;, Condvar)&gt;,
<a href=#196 id=196 data-nosnippet>196</a> ) -&gt; std::thread::JoinHandle&lt;()&gt; {
<a href=#197 id=197 data-nosnippet>197</a> std::thread::spawn(<span class="kw">move </span>|| <span class="self">Self</span>::do_work(queue))
<a href=#198 id=198 data-nosnippet>198</a> }
<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">pub fn </span>new(num_threads: usize) -&gt; <span class="self">Self </span>{
<a href=#200 id=200 data-nosnippet>200</a> <span class="kw">let </span>queue = Arc::new((Mutex::new(WorkQueue::default()), Condvar::new()));
<a href=#201 id=201 data-nosnippet>201</a> WorkerPool {
<a href=#202 id=202 data-nosnippet>202</a> queue: GuardedQueue(queue.clone()),
<a href=#203 id=203 data-nosnippet>203</a> join: [
<a href=#204 id=204 data-nosnippet>204</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone())),
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">if </span><span class="number">1 </span>&lt; num_threads {
<a href=#206 id=206 data-nosnippet>206</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#207 id=207 data-nosnippet>207</a> } <span class="kw">else </span>{
<a href=#208 id=208 data-nosnippet>208</a> <span class="prelude-val">None
<a href=#209 id=209 data-nosnippet>209</a> </span>},
<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">if </span><span class="number">2 </span>&lt; num_threads {
<a href=#211 id=211 data-nosnippet>211</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#212 id=212 data-nosnippet>212</a> } <span class="kw">else </span>{
<a href=#213 id=213 data-nosnippet>213</a> <span class="prelude-val">None
<a href=#214 id=214 data-nosnippet>214</a> </span>},
<a href=#215 id=215 data-nosnippet>215</a> <span class="kw">if </span><span class="number">3 </span>&lt; num_threads {
<a href=#216 id=216 data-nosnippet>216</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#217 id=217 data-nosnippet>217</a> } <span class="kw">else </span>{
<a href=#218 id=218 data-nosnippet>218</a> <span class="prelude-val">None
<a href=#219 id=219 data-nosnippet>219</a> </span>},
<a href=#220 id=220 data-nosnippet>220</a> <span class="kw">if </span><span class="number">4 </span>&lt; num_threads {
<a href=#221 id=221 data-nosnippet>221</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#222 id=222 data-nosnippet>222</a> } <span class="kw">else </span>{
<a href=#223 id=223 data-nosnippet>223</a> <span class="prelude-val">None
<a href=#224 id=224 data-nosnippet>224</a> </span>},
<a href=#225 id=225 data-nosnippet>225</a> <span class="kw">if </span><span class="number">5 </span>&lt; num_threads {
<a href=#226 id=226 data-nosnippet>226</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#227 id=227 data-nosnippet>227</a> } <span class="kw">else </span>{
<a href=#228 id=228 data-nosnippet>228</a> <span class="prelude-val">None
<a href=#229 id=229 data-nosnippet>229</a> </span>},
<a href=#230 id=230 data-nosnippet>230</a> <span class="kw">if </span><span class="number">6 </span>&lt; num_threads {
<a href=#231 id=231 data-nosnippet>231</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#232 id=232 data-nosnippet>232</a> } <span class="kw">else </span>{
<a href=#233 id=233 data-nosnippet>233</a> <span class="prelude-val">None
<a href=#234 id=234 data-nosnippet>234</a> </span>},
<a href=#235 id=235 data-nosnippet>235</a> <span class="kw">if </span><span class="number">7 </span>&lt; num_threads {
<a href=#236 id=236 data-nosnippet>236</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#237 id=237 data-nosnippet>237</a> } <span class="kw">else </span>{
<a href=#238 id=238 data-nosnippet>238</a> <span class="prelude-val">None
<a href=#239 id=239 data-nosnippet>239</a> </span>},
<a href=#240 id=240 data-nosnippet>240</a> <span class="kw">if </span><span class="number">8 </span>&lt; num_threads {
<a href=#241 id=241 data-nosnippet>241</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#242 id=242 data-nosnippet>242</a> } <span class="kw">else </span>{
<a href=#243 id=243 data-nosnippet>243</a> <span class="prelude-val">None
<a href=#244 id=244 data-nosnippet>244</a> </span>},
<a href=#245 id=245 data-nosnippet>245</a> <span class="kw">if </span><span class="number">9 </span>&lt; num_threads {
<a href=#246 id=246 data-nosnippet>246</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#247 id=247 data-nosnippet>247</a> } <span class="kw">else </span>{
<a href=#248 id=248 data-nosnippet>248</a> <span class="prelude-val">None
<a href=#249 id=249 data-nosnippet>249</a> </span>},
<a href=#250 id=250 data-nosnippet>250</a> <span class="kw">if </span><span class="number">10 </span>&lt; num_threads {
<a href=#251 id=251 data-nosnippet>251</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#252 id=252 data-nosnippet>252</a> } <span class="kw">else </span>{
<a href=#253 id=253 data-nosnippet>253</a> <span class="prelude-val">None
<a href=#254 id=254 data-nosnippet>254</a> </span>},
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">if </span><span class="number">11 </span>&lt; num_threads {
<a href=#256 id=256 data-nosnippet>256</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#257 id=257 data-nosnippet>257</a> } <span class="kw">else </span>{
<a href=#258 id=258 data-nosnippet>258</a> <span class="prelude-val">None
<a href=#259 id=259 data-nosnippet>259</a> </span>},
<a href=#260 id=260 data-nosnippet>260</a> <span class="kw">if </span><span class="number">12 </span>&lt; num_threads {
<a href=#261 id=261 data-nosnippet>261</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#262 id=262 data-nosnippet>262</a> } <span class="kw">else </span>{
<a href=#263 id=263 data-nosnippet>263</a> <span class="prelude-val">None
<a href=#264 id=264 data-nosnippet>264</a> </span>},
<a href=#265 id=265 data-nosnippet>265</a> <span class="kw">if </span><span class="number">13 </span>&lt; num_threads {
<a href=#266 id=266 data-nosnippet>266</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#267 id=267 data-nosnippet>267</a> } <span class="kw">else </span>{
<a href=#268 id=268 data-nosnippet>268</a> <span class="prelude-val">None
<a href=#269 id=269 data-nosnippet>269</a> </span>},
<a href=#270 id=270 data-nosnippet>270</a> <span class="kw">if </span><span class="number">14 </span>&lt; num_threads {
<a href=#271 id=271 data-nosnippet>271</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#272 id=272 data-nosnippet>272</a> } <span class="kw">else </span>{
<a href=#273 id=273 data-nosnippet>273</a> <span class="prelude-val">None
<a href=#274 id=274 data-nosnippet>274</a> </span>},
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">if </span><span class="number">15 </span>&lt; num_threads {
<a href=#276 id=276 data-nosnippet>276</a> <span class="prelude-val">Some</span>(<span class="self">Self</span>::start(queue.clone()))
<a href=#277 id=277 data-nosnippet>277</a> } <span class="kw">else </span>{
<a href=#278 id=278 data-nosnippet>278</a> <span class="prelude-val">None
<a href=#279 id=279 data-nosnippet>279</a> </span>},
<a href=#280 id=280 data-nosnippet>280</a> ],
<a href=#281 id=281 data-nosnippet>281</a> }
<a href=#282 id=282 data-nosnippet>282</a> }
<a href=#283 id=283 data-nosnippet>283</a>}
<a href=#284 id=284 data-nosnippet>284</a>
<a href=#285 id=285 data-nosnippet>285</a><span class="kw">pub fn </span>new_work_pool&lt;
<a href=#286 id=286 data-nosnippet>286</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#287 id=287 data-nosnippet>287</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#288 id=288 data-nosnippet>288</a>&gt;(
<a href=#289 id=289 data-nosnippet>289</a> num_threads: usize,
<a href=#290 id=290 data-nosnippet>290</a>) -&gt; WorkerPool&lt;
<a href=#291 id=291 data-nosnippet>291</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#292 id=292 data-nosnippet>292</a> UnionHasher&lt;Alloc&gt;,
<a href=#293 id=293 data-nosnippet>293</a> Alloc,
<a href=#294 id=294 data-nosnippet>294</a> (SliceW, BrotliEncoderParams),
<a href=#295 id=295 data-nosnippet>295</a>&gt;
<a href=#296 id=296 data-nosnippet>296</a><span class="kw">where
<a href=#297 id=297 data-nosnippet>297</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#298 id=298 data-nosnippet>298</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#299 id=299 data-nosnippet>299</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#300 id=300 data-nosnippet>300</a>{
<a href=#301 id=301 data-nosnippet>301</a> WorkerPool::new(num_threads)
<a href=#302 id=302 data-nosnippet>302</a>}
<a href=#303 id=303 data-nosnippet>303</a>
<a href=#304 id=304 data-nosnippet>304</a><span class="kw">pub struct </span>WorkerJoinable&lt;
<a href=#305 id=305 data-nosnippet>305</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#306 id=306 data-nosnippet>306</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#307 id=307 data-nosnippet>307</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#308 id=308 data-nosnippet>308</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#309 id=309 data-nosnippet>309</a>&gt; {
<a href=#310 id=310 data-nosnippet>310</a> queue: GuardedQueue&lt;ReturnValue, ExtraInput, Alloc, U&gt;,
<a href=#311 id=311 data-nosnippet>311</a> work_id: u64,
<a href=#312 id=312 data-nosnippet>312</a>}
<a href=#313 id=313 data-nosnippet>313</a><span class="kw">impl</span>&lt;
<a href=#314 id=314 data-nosnippet>314</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#315 id=315 data-nosnippet>315</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#316 id=316 data-nosnippet>316</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#317 id=317 data-nosnippet>317</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#318 id=318 data-nosnippet>318</a> &gt; Joinable&lt;ReturnValue, BrotliEncoderThreadError&gt;
<a href=#319 id=319 data-nosnippet>319</a> <span class="kw">for </span>WorkerJoinable&lt;ReturnValue, ExtraInput, Alloc, U&gt;
<a href=#320 id=320 data-nosnippet>320</a>{
<a href=#321 id=321 data-nosnippet>321</a> <span class="kw">fn </span>join(<span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;ReturnValue, BrotliEncoderThreadError&gt; {
<a href=#322 id=322 data-nosnippet>322</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span><span class="self">self</span>.queue.<span class="number">0</span>;
<a href=#323 id=323 data-nosnippet>323</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#324 id=324 data-nosnippet>324</a> <span class="kw">loop </span>{
<a href=#325 id=325 data-nosnippet>325</a> <span class="kw">match </span>local_queue
<a href=#326 id=326 data-nosnippet>326</a> .results
<a href=#327 id=327 data-nosnippet>327</a> .remove(|data: <span class="kw-2">&amp;</span><span class="prelude-ty">Option</span>&lt;JobReply&lt;ReturnValue&gt;&gt;| {
<a href=#328 id=328 data-nosnippet>328</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(<span class="kw-2">ref </span>item) = <span class="kw-2">*</span>data {
<a href=#329 id=329 data-nosnippet>329</a> item.work_id == <span class="self">self</span>.work_id
<a href=#330 id=330 data-nosnippet>330</a> } <span class="kw">else </span>{
<a href=#331 id=331 data-nosnippet>331</a> <span class="bool-val">false
<a href=#332 id=332 data-nosnippet>332</a> </span>}
<a href=#333 id=333 data-nosnippet>333</a> }) {
<a href=#334 id=334 data-nosnippet>334</a> <span class="prelude-val">Some</span>(matched) =&gt; <span class="kw">return </span><span class="prelude-val">Ok</span>(matched.result),
<a href=#335 id=335 data-nosnippet>335</a> <span class="prelude-val">None </span>=&gt; local_queue = cvar.wait(local_queue).unwrap(),
<a href=#336 id=336 data-nosnippet>336</a> };
<a href=#337 id=337 data-nosnippet>337</a> }
<a href=#338 id=338 data-nosnippet>338</a> }
<a href=#339 id=339 data-nosnippet>339</a>}
<a href=#340 id=340 data-nosnippet>340</a>
<a href=#341 id=341 data-nosnippet>341</a><span class="kw">impl</span>&lt;
<a href=#342 id=342 data-nosnippet>342</a> ReturnValue: Send + <span class="lifetime">'static</span>,
<a href=#343 id=343 data-nosnippet>343</a> ExtraInput: Send + <span class="lifetime">'static</span>,
<a href=#344 id=344 data-nosnippet>344</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#345 id=345 data-nosnippet>345</a> U: Send + <span class="lifetime">'static </span>+ Sync,
<a href=#346 id=346 data-nosnippet>346</a> &gt; BatchSpawnableLite&lt;ReturnValue, ExtraInput, Alloc, U&gt;
<a href=#347 id=347 data-nosnippet>347</a> <span class="kw">for </span>WorkerPool&lt;ReturnValue, ExtraInput, Alloc, U&gt;
<a href=#348 id=348 data-nosnippet>348</a><span class="kw">where
<a href=#349 id=349 data-nosnippet>349</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send + <span class="lifetime">'static</span>,
<a href=#350 id=350 data-nosnippet>350</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#351 id=351 data-nosnippet>351</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#352 id=352 data-nosnippet>352</a>{
<a href=#353 id=353 data-nosnippet>353</a> <span class="kw">type </span>FinalJoinHandle = Arc&lt;RwLock&lt;U&gt;&gt;;
<a href=#354 id=354 data-nosnippet>354</a> <span class="kw">type </span>JoinHandle = WorkerJoinable&lt;ReturnValue, ExtraInput, Alloc, U&gt;;
<a href=#355 id=355 data-nosnippet>355</a>
<a href=#356 id=356 data-nosnippet>356</a> <span class="kw">fn </span>make_spawner(<span class="kw-2">&amp;mut </span><span class="self">self</span>, input: <span class="kw-2">&amp;mut </span>Owned&lt;U&gt;) -&gt; <span class="self">Self</span>::FinalJoinHandle {
<a href=#357 id=357 data-nosnippet>357</a> std::sync::Arc::&lt;RwLock&lt;U&gt;&gt;::new(RwLock::new(
<a href=#358 id=358 data-nosnippet>358</a> mem::replace(input, Owned(InternalOwned::Borrowed)).unwrap(),
<a href=#359 id=359 data-nosnippet>359</a> ))
<a href=#360 id=360 data-nosnippet>360</a> }
<a href=#361 id=361 data-nosnippet>361</a> <span class="kw">fn </span>spawn(
<a href=#362 id=362 data-nosnippet>362</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>,
<a href=#363 id=363 data-nosnippet>363</a> locked_input: <span class="kw-2">&amp;mut </span><span class="self">Self</span>::FinalJoinHandle,
<a href=#364 id=364 data-nosnippet>364</a> work: <span class="kw-2">&amp;mut </span>SendAlloc&lt;ReturnValue, ExtraInput, Alloc, <span class="self">Self</span>::JoinHandle&gt;,
<a href=#365 id=365 data-nosnippet>365</a> index: usize,
<a href=#366 id=366 data-nosnippet>366</a> num_threads: usize,
<a href=#367 id=367 data-nosnippet>367</a> f: <span class="kw">fn</span>(ExtraInput, usize, usize, <span class="kw-2">&amp;</span>U, Alloc) -&gt; ReturnValue,
<a href=#368 id=368 data-nosnippet>368</a> ) {
<a href=#369 id=369 data-nosnippet>369</a> <span class="macro">assert!</span>(num_threads &lt;= MAX_THREADS);
<a href=#370 id=370 data-nosnippet>370</a> <span class="kw">let </span>(lock, cvar) = <span class="kw-2">&amp;*</span><span class="self">self</span>.queue.<span class="number">0</span>;
<a href=#371 id=371 data-nosnippet>371</a> <span class="kw">let </span><span class="kw-2">mut </span>local_queue = lock.lock().unwrap();
<a href=#372 id=372 data-nosnippet>372</a> <span class="kw">loop </span>{
<a href=#373 id=373 data-nosnippet>373</a> <span class="kw">if </span>local_queue.jobs.size() + local_queue.num_in_progress + local_queue.results.size()
<a href=#374 id=374 data-nosnippet>374</a> &lt;= MAX_THREADS
<a href=#375 id=375 data-nosnippet>375</a> {
<a href=#376 id=376 data-nosnippet>376</a> <span class="kw">let </span>work_id = local_queue.cur_work_id;
<a href=#377 id=377 data-nosnippet>377</a> local_queue.cur_work_id += <span class="number">1</span>;
<a href=#378 id=378 data-nosnippet>378</a> <span class="kw">let </span>(local_alloc, local_extra) = work.replace_with_default();
<a href=#379 id=379 data-nosnippet>379</a> local_queue
<a href=#380 id=380 data-nosnippet>380</a> .jobs
<a href=#381 id=381 data-nosnippet>381</a> .push(JobRequest {
<a href=#382 id=382 data-nosnippet>382</a> func: f,
<a href=#383 id=383 data-nosnippet>383</a> extra_input: local_extra,
<a href=#384 id=384 data-nosnippet>384</a> index,
<a href=#385 id=385 data-nosnippet>385</a> thread_size: num_threads,
<a href=#386 id=386 data-nosnippet>386</a> data: locked_input.clone(),
<a href=#387 id=387 data-nosnippet>387</a> alloc: local_alloc,
<a href=#388 id=388 data-nosnippet>388</a> work_id,
<a href=#389 id=389 data-nosnippet>389</a> })
<a href=#390 id=390 data-nosnippet>390</a> .unwrap();
<a href=#391 id=391 data-nosnippet>391</a> <span class="kw-2">*</span>work = SendAlloc(InternalSendAlloc::Join(WorkerJoinable {
<a href=#392 id=392 data-nosnippet>392</a> queue: GuardedQueue(<span class="self">self</span>.queue.<span class="number">0</span>.clone()),
<a href=#393 id=393 data-nosnippet>393</a> work_id,
<a href=#394 id=394 data-nosnippet>394</a> }));
<a href=#395 id=395 data-nosnippet>395</a> cvar.notify_all();
<a href=#396 id=396 data-nosnippet>396</a> <span class="kw">break</span>;
<a href=#397 id=397 data-nosnippet>397</a> } <span class="kw">else </span>{
<a href=#398 id=398 data-nosnippet>398</a> local_queue = cvar.wait(local_queue).unwrap(); <span class="comment">// hope room frees up
<a href=#399 id=399 data-nosnippet>399</a> </span>}
<a href=#400 id=400 data-nosnippet>400</a> }
<a href=#401 id=401 data-nosnippet>401</a> }
<a href=#402 id=402 data-nosnippet>402</a>}
<a href=#403 id=403 data-nosnippet>403</a>
<a href=#404 id=404 data-nosnippet>404</a><span class="kw">pub fn </span>compress_worker_pool&lt;
<a href=#405 id=405 data-nosnippet>405</a> Alloc: BrotliAlloc + Send + <span class="lifetime">'static</span>,
<a href=#406 id=406 data-nosnippet>406</a> SliceW: SliceWrapper&lt;u8&gt; + Send + <span class="lifetime">'static </span>+ Sync,
<a href=#407 id=407 data-nosnippet>407</a>&gt;(
<a href=#408 id=408 data-nosnippet>408</a> params: <span class="kw-2">&amp;</span>BrotliEncoderParams,
<a href=#409 id=409 data-nosnippet>409</a> owned_input: <span class="kw-2">&amp;mut </span>Owned&lt;SliceW&gt;,
<a href=#410 id=410 data-nosnippet>410</a> output: <span class="kw-2">&amp;mut </span>[u8],
<a href=#411 id=411 data-nosnippet>411</a> alloc_per_thread: <span class="kw-2">&amp;mut </span>[SendAlloc&lt;
<a href=#412 id=412 data-nosnippet>412</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#413 id=413 data-nosnippet>413</a> UnionHasher&lt;Alloc&gt;,
<a href=#414 id=414 data-nosnippet>414</a> Alloc,
<a href=#415 id=415 data-nosnippet>415</a> &lt;WorkerPool&lt;
<a href=#416 id=416 data-nosnippet>416</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#417 id=417 data-nosnippet>417</a> UnionHasher&lt;Alloc&gt;,
<a href=#418 id=418 data-nosnippet>418</a> Alloc,
<a href=#419 id=419 data-nosnippet>419</a> (SliceW, BrotliEncoderParams),
<a href=#420 id=420 data-nosnippet>420</a> &gt; <span class="kw">as </span>BatchSpawnableLite&lt;
<a href=#421 id=421 data-nosnippet>421</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#422 id=422 data-nosnippet>422</a> UnionHasher&lt;Alloc&gt;,
<a href=#423 id=423 data-nosnippet>423</a> Alloc,
<a href=#424 id=424 data-nosnippet>424</a> (SliceW, BrotliEncoderParams),
<a href=#425 id=425 data-nosnippet>425</a> &gt;&gt;::JoinHandle,
<a href=#426 id=426 data-nosnippet>426</a> &gt;],
<a href=#427 id=427 data-nosnippet>427</a> work_pool: <span class="kw-2">&amp;mut </span>WorkerPool&lt;
<a href=#428 id=428 data-nosnippet>428</a> CompressionThreadResult&lt;Alloc&gt;,
<a href=#429 id=429 data-nosnippet>429</a> UnionHasher&lt;Alloc&gt;,
<a href=#430 id=430 data-nosnippet>430</a> Alloc,
<a href=#431 id=431 data-nosnippet>431</a> (SliceW, BrotliEncoderParams),
<a href=#432 id=432 data-nosnippet>432</a> &gt;,
<a href=#433 id=433 data-nosnippet>433</a>) -&gt; <span class="prelude-ty">Result</span>&lt;usize, BrotliEncoderThreadError&gt;
<a href=#434 id=434 data-nosnippet>434</a><span class="kw">where
<a href=#435 id=435 data-nosnippet>435</a> </span>&lt;Alloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory: Send,
<a href=#436 id=436 data-nosnippet>436</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u16&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#437 id=437 data-nosnippet>437</a> &lt;Alloc <span class="kw">as </span>Allocator&lt;u32&gt;&gt;::AllocatedMemory: Send + Sync,
<a href=#438 id=438 data-nosnippet>438</a>{
<a href=#439 id=439 data-nosnippet>439</a> CompressMulti(params, owned_input, output, alloc_per_thread, work_pool)
<a href=#440 id=440 data-nosnippet>440</a>}
<a href=#441 id=441 data-nosnippet>441</a>
<a href=#442 id=442 data-nosnippet>442</a><span class="comment">// out of place thread create
</span></code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,323 @@
<!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 `/home/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/brotli-8.0.2/src/enc/writer.rs`."><title>writer.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="brotli" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="../../../static.files/src-script-813739b1.js"></script><script defer src="../../../src-files.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">brotli/enc/</div>writer.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span>alloc::{Allocator, SliceWrapperMut};
<a href=#2 id=2 data-nosnippet>2</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>std::io;
<a href=#4 id=4 data-nosnippet>4</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#5 id=5 data-nosnippet>5</a></span><span class="kw">use </span>std::io::{Error, ErrorKind, Write};
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">pub use </span>alloc_stdlib::StandardAlloc;
<a href=#9 id=9 data-nosnippet>9</a><span class="kw">use </span>brotli_decompressor::CustomWrite;
<a href=#10 id=10 data-nosnippet>10</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#11 id=11 data-nosnippet>11</a></span><span class="kw">pub use </span>brotli_decompressor::{IntoIoWriter, IoWriterWrapper};
<a href=#12 id=12 data-nosnippet>12</a>
<a href=#13 id=13 data-nosnippet>13</a><span class="kw">use </span><span class="kw">super</span>::backward_references::BrotliEncoderParams;
<a href=#14 id=14 data-nosnippet>14</a><span class="kw">use </span><span class="kw">super</span>::combined_alloc::BrotliAlloc;
<a href=#15 id=15 data-nosnippet>15</a><span class="kw">use </span><span class="kw">super</span>::encode::{
<a href=#16 id=16 data-nosnippet>16</a> BrotliEncoderDestroyInstance, BrotliEncoderOperation, BrotliEncoderParameter,
<a href=#17 id=17 data-nosnippet>17</a> BrotliEncoderStateStruct,
<a href=#18 id=18 data-nosnippet>18</a>};
<a href=#19 id=19 data-nosnippet>19</a><span class="kw">use </span><span class="kw">super</span>::interface;
<a href=#20 id=20 data-nosnippet>20</a><span class="kw">use </span><span class="kw">crate</span>::enc::combined_alloc::allocate;
<a href=#21 id=21 data-nosnippet>21</a>
<a href=#22 id=22 data-nosnippet>22</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#23 id=23 data-nosnippet>23</a></span><span class="kw">pub struct </span>CompressorWriterCustomAlloc&lt;
<a href=#24 id=24 data-nosnippet>24</a> W: Write,
<a href=#25 id=25 data-nosnippet>25</a> BufferType: SliceWrapperMut&lt;u8&gt;,
<a href=#26 id=26 data-nosnippet>26</a> Alloc: BrotliAlloc,
<a href=#27 id=27 data-nosnippet>27</a>&gt;(CompressorWriterCustomIo&lt;io::Error, IntoIoWriter&lt;W&gt;, BufferType, Alloc&gt;);
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#30 id=30 data-nosnippet>30</a></span><span class="kw">impl</span>&lt;W: Write, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;
<a href=#31 id=31 data-nosnippet>31</a> CompressorWriterCustomAlloc&lt;W, BufferType, Alloc&gt;
<a href=#32 id=32 data-nosnippet>32</a>{
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">pub fn </span>new(w: W, buffer: BufferType, alloc: Alloc, q: u32, lgwin: u32) -&gt; <span class="self">Self </span>{
<a href=#34 id=34 data-nosnippet>34</a> CompressorWriterCustomAlloc::&lt;W, BufferType, Alloc&gt;(CompressorWriterCustomIo::&lt;
<a href=#35 id=35 data-nosnippet>35</a> Error,
<a href=#36 id=36 data-nosnippet>36</a> IntoIoWriter&lt;W&gt;,
<a href=#37 id=37 data-nosnippet>37</a> BufferType,
<a href=#38 id=38 data-nosnippet>38</a> Alloc,
<a href=#39 id=39 data-nosnippet>39</a> &gt;::new(
<a href=#40 id=40 data-nosnippet>40</a> IntoIoWriter::&lt;W&gt;(w),
<a href=#41 id=41 data-nosnippet>41</a> buffer,
<a href=#42 id=42 data-nosnippet>42</a> alloc,
<a href=#43 id=43 data-nosnippet>43</a> Error::new(ErrorKind::InvalidData, <span class="string">"Invalid Data"</span>),
<a href=#44 id=44 data-nosnippet>44</a> Error::new(ErrorKind::WriteZero, <span class="string">"No room in output."</span>),
<a href=#45 id=45 data-nosnippet>45</a> q,
<a href=#46 id=46 data-nosnippet>46</a> lgwin,
<a href=#47 id=47 data-nosnippet>47</a> ))
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a> <span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#51 id=51 data-nosnippet>51</a> <span class="kw-2">&amp;</span><span class="self">self</span>.<span class="number">0</span>.get_ref().<span class="number">0
<a href=#52 id=52 data-nosnippet>52</a> </span>}
<a href=#53 id=53 data-nosnippet>53</a> <span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#54 id=54 data-nosnippet>54</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.<span class="number">0</span>.get_mut().<span class="number">0
<a href=#55 id=55 data-nosnippet>55</a> </span>}
<a href=#56 id=56 data-nosnippet>56</a> <span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; W {
<a href=#57 id=57 data-nosnippet>57</a> <span class="self">self</span>.<span class="number">0</span>.into_inner().<span class="number">0
<a href=#58 id=58 data-nosnippet>58</a> </span>}
<a href=#59 id=59 data-nosnippet>59</a>}
<a href=#60 id=60 data-nosnippet>60</a>
<a href=#61 id=61 data-nosnippet>61</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#62 id=62 data-nosnippet>62</a></span><span class="kw">impl</span>&lt;W: Write, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt; Write
<a href=#63 id=63 data-nosnippet>63</a> <span class="kw">for </span>CompressorWriterCustomAlloc&lt;W, BufferType, Alloc&gt;
<a href=#64 id=64 data-nosnippet>64</a>{
<a href=#65 id=65 data-nosnippet>65</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize, Error&gt; {
<a href=#66 id=66 data-nosnippet>66</a> <span class="self">self</span>.<span class="number">0</span>.write(buf)
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;(), Error&gt; {
<a href=#69 id=69 data-nosnippet>69</a> <span class="self">self</span>.<span class="number">0</span>.flush()
<a href=#70 id=70 data-nosnippet>70</a> }
<a href=#71 id=71 data-nosnippet>71</a>}
<a href=#72 id=72 data-nosnippet>72</a>
<a href=#73 id=73 data-nosnippet>73</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#74 id=74 data-nosnippet>74</a></span><span class="kw">pub struct </span>CompressorWriter&lt;W: Write&gt;(
<a href=#75 id=75 data-nosnippet>75</a> CompressorWriterCustomAlloc&lt;
<a href=#76 id=76 data-nosnippet>76</a> W,
<a href=#77 id=77 data-nosnippet>77</a> &lt;StandardAlloc <span class="kw">as </span>Allocator&lt;u8&gt;&gt;::AllocatedMemory,
<a href=#78 id=78 data-nosnippet>78</a> StandardAlloc,
<a href=#79 id=79 data-nosnippet>79</a> &gt;,
<a href=#80 id=80 data-nosnippet>80</a>);
<a href=#81 id=81 data-nosnippet>81</a>
<a href=#82 id=82 data-nosnippet>82</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#83 id=83 data-nosnippet>83</a></span><span class="kw">impl</span>&lt;W: Write&gt; CompressorWriter&lt;W&gt; {
<a href=#84 id=84 data-nosnippet>84</a> <span class="kw">pub fn </span>new(w: W, buffer_size: usize, q: u32, lgwin: u32) -&gt; <span class="self">Self </span>{
<a href=#85 id=85 data-nosnippet>85</a> <span class="kw">let </span><span class="kw-2">mut </span>alloc = StandardAlloc::default();
<a href=#86 id=86 data-nosnippet>86</a> <span class="kw">let </span>buffer = allocate::&lt;u8, <span class="kw">_</span>&gt;(
<a href=#87 id=87 data-nosnippet>87</a> <span class="kw-2">&amp;mut </span>alloc,
<a href=#88 id=88 data-nosnippet>88</a> <span class="kw">if </span>buffer_size == <span class="number">0 </span>{ <span class="number">4096 </span>} <span class="kw">else </span>{ buffer_size },
<a href=#89 id=89 data-nosnippet>89</a> );
<a href=#90 id=90 data-nosnippet>90</a> CompressorWriter::&lt;W&gt;(CompressorWriterCustomAlloc::new(w, buffer, alloc, q, lgwin))
<a href=#91 id=91 data-nosnippet>91</a> }
<a href=#92 id=92 data-nosnippet>92</a>
<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">pub fn </span>with_params(w: W, buffer_size: usize, params: <span class="kw-2">&amp;</span>BrotliEncoderParams) -&gt; <span class="self">Self </span>{
<a href=#94 id=94 data-nosnippet>94</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = <span class="self">Self</span>::new(w, buffer_size, params.quality <span class="kw">as </span>u32, params.lgwin <span class="kw">as </span>u32);
<a href=#95 id=95 data-nosnippet>95</a> (writer.<span class="number">0</span>).<span class="number">0</span>.state.params = params.clone();
<a href=#96 id=96 data-nosnippet>96</a> writer
<a href=#97 id=97 data-nosnippet>97</a> }
<a href=#98 id=98 data-nosnippet>98</a>
<a href=#99 id=99 data-nosnippet>99</a> <span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#100 id=100 data-nosnippet>100</a> <span class="self">self</span>.<span class="number">0</span>.get_ref()
<a href=#101 id=101 data-nosnippet>101</a> }
<a href=#102 id=102 data-nosnippet>102</a> <span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#103 id=103 data-nosnippet>103</a> <span class="self">self</span>.<span class="number">0</span>.get_mut()
<a href=#104 id=104 data-nosnippet>104</a> }
<a href=#105 id=105 data-nosnippet>105</a> <span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; W {
<a href=#106 id=106 data-nosnippet>106</a> <span class="self">self</span>.<span class="number">0</span>.into_inner()
<a href=#107 id=107 data-nosnippet>107</a> }
<a href=#108 id=108 data-nosnippet>108</a>}
<a href=#109 id=109 data-nosnippet>109</a>
<a href=#110 id=110 data-nosnippet>110</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#111 id=111 data-nosnippet>111</a></span><span class="kw">impl</span>&lt;W: Write&gt; Write <span class="kw">for </span>CompressorWriter&lt;W&gt; {
<a href=#112 id=112 data-nosnippet>112</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize, Error&gt; {
<a href=#113 id=113 data-nosnippet>113</a> <span class="self">self</span>.<span class="number">0</span>.write(buf)
<a href=#114 id=114 data-nosnippet>114</a> }
<a href=#115 id=115 data-nosnippet>115</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;(), Error&gt; {
<a href=#116 id=116 data-nosnippet>116</a> <span class="self">self</span>.<span class="number">0</span>.flush()
<a href=#117 id=117 data-nosnippet>117</a> }
<a href=#118 id=118 data-nosnippet>118</a>}
<a href=#119 id=119 data-nosnippet>119</a>
<a href=#120 id=120 data-nosnippet>120</a><span class="kw">pub struct </span>CompressorWriterCustomIo&lt;
<a href=#121 id=121 data-nosnippet>121</a> ErrType,
<a href=#122 id=122 data-nosnippet>122</a> W: CustomWrite&lt;ErrType&gt;,
<a href=#123 id=123 data-nosnippet>123</a> BufferType: SliceWrapperMut&lt;u8&gt;,
<a href=#124 id=124 data-nosnippet>124</a> Alloc: BrotliAlloc,
<a href=#125 id=125 data-nosnippet>125</a>&gt; {
<a href=#126 id=126 data-nosnippet>126</a> output_buffer: BufferType,
<a href=#127 id=127 data-nosnippet>127</a> total_out: <span class="prelude-ty">Option</span>&lt;usize&gt;,
<a href=#128 id=128 data-nosnippet>128</a> output: <span class="prelude-ty">Option</span>&lt;W&gt;,
<a href=#129 id=129 data-nosnippet>129</a> error_if_invalid_data: <span class="prelude-ty">Option</span>&lt;ErrType&gt;,
<a href=#130 id=130 data-nosnippet>130</a> state: BrotliEncoderStateStruct&lt;Alloc&gt;,
<a href=#131 id=131 data-nosnippet>131</a> error_if_zero_bytes_written: <span class="prelude-ty">Option</span>&lt;ErrType&gt;,
<a href=#132 id=132 data-nosnippet>132</a>}
<a href=#133 id=133 data-nosnippet>133</a><span class="kw">pub fn </span>write_all&lt;ErrType, W: CustomWrite&lt;ErrType&gt;, ErrMaker: FnMut() -&gt; <span class="prelude-ty">Option</span>&lt;ErrType&gt;&gt;(
<a href=#134 id=134 data-nosnippet>134</a> writer: <span class="kw-2">&amp;mut </span>W,
<a href=#135 id=135 data-nosnippet>135</a> <span class="kw-2">mut </span>buf: <span class="kw-2">&amp;</span>[u8],
<a href=#136 id=136 data-nosnippet>136</a> <span class="kw-2">mut </span>error_to_return_if_zero_bytes_written: ErrMaker,
<a href=#137 id=137 data-nosnippet>137</a>) -&gt; <span class="prelude-ty">Result</span>&lt;(), ErrType&gt; {
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">while </span>!buf.is_empty() {
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">match </span>writer.write(buf) {
<a href=#140 id=140 data-nosnippet>140</a> <span class="prelude-val">Ok</span>(bytes_written) =&gt; <span class="kw">if </span><span class="macro">bytes_written !</span>= <span class="number">0 </span>{
<a href=#141 id=141 data-nosnippet>141</a> buf = <span class="kw-2">&amp;</span>buf[bytes_written..]
<a href=#142 id=142 data-nosnippet>142</a> } <span class="kw">else </span>{
<a href=#143 id=143 data-nosnippet>143</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(err) = error_to_return_if_zero_bytes_written() {
<a href=#144 id=144 data-nosnippet>144</a> <span class="kw">return </span><span class="prelude-val">Err</span>(err);
<a href=#145 id=145 data-nosnippet>145</a> } <span class="kw">else </span>{
<a href=#146 id=146 data-nosnippet>146</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(());
<a href=#147 id=147 data-nosnippet>147</a> }
<a href=#148 id=148 data-nosnippet>148</a> },
<a href=#149 id=149 data-nosnippet>149</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
<a href=#150 id=150 data-nosnippet>150</a> }
<a href=#151 id=151 data-nosnippet>151</a> }
<a href=#152 id=152 data-nosnippet>152</a> <span class="prelude-val">Ok</span>(())
<a href=#153 id=153 data-nosnippet>153</a>}
<a href=#154 id=154 data-nosnippet>154</a><span class="kw">impl</span>&lt;ErrType, W: CustomWrite&lt;ErrType&gt;, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;
<a href=#155 id=155 data-nosnippet>155</a> CompressorWriterCustomIo&lt;ErrType, W, BufferType, Alloc&gt;
<a href=#156 id=156 data-nosnippet>156</a>{
<a href=#157 id=157 data-nosnippet>157</a> <span class="kw">pub fn </span>new(
<a href=#158 id=158 data-nosnippet>158</a> w: W,
<a href=#159 id=159 data-nosnippet>159</a> buffer: BufferType,
<a href=#160 id=160 data-nosnippet>160</a> alloc: Alloc,
<a href=#161 id=161 data-nosnippet>161</a> invalid_data_error_type: ErrType,
<a href=#162 id=162 data-nosnippet>162</a> error_if_zero_bytes_written: ErrType,
<a href=#163 id=163 data-nosnippet>163</a> q: u32,
<a href=#164 id=164 data-nosnippet>164</a> lgwin: u32,
<a href=#165 id=165 data-nosnippet>165</a> ) -&gt; <span class="self">Self </span>{
<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">let </span><span class="kw-2">mut </span>ret = CompressorWriterCustomIo {
<a href=#167 id=167 data-nosnippet>167</a> output_buffer: buffer,
<a href=#168 id=168 data-nosnippet>168</a> total_out: <span class="prelude-val">Some</span>(<span class="number">0</span>),
<a href=#169 id=169 data-nosnippet>169</a> output: <span class="prelude-val">Some</span>(w),
<a href=#170 id=170 data-nosnippet>170</a> state: BrotliEncoderStateStruct::new(alloc),
<a href=#171 id=171 data-nosnippet>171</a> error_if_invalid_data: <span class="prelude-val">Some</span>(invalid_data_error_type),
<a href=#172 id=172 data-nosnippet>172</a> error_if_zero_bytes_written: <span class="prelude-val">Some</span>(error_if_zero_bytes_written),
<a href=#173 id=173 data-nosnippet>173</a> };
<a href=#174 id=174 data-nosnippet>174</a> ret.state
<a href=#175 id=175 data-nosnippet>175</a> .set_parameter(BrotliEncoderParameter::BROTLI_PARAM_QUALITY, q);
<a href=#176 id=176 data-nosnippet>176</a> ret.state
<a href=#177 id=177 data-nosnippet>177</a> .set_parameter(BrotliEncoderParameter::BROTLI_PARAM_LGWIN, lgwin);
<a href=#178 id=178 data-nosnippet>178</a>
<a href=#179 id=179 data-nosnippet>179</a> ret
<a href=#180 id=180 data-nosnippet>180</a> }
<a href=#181 id=181 data-nosnippet>181</a> <span class="kw">fn </span>flush_or_close(<span class="kw-2">&amp;mut </span><span class="self">self</span>, op: BrotliEncoderOperation) -&gt; <span class="prelude-ty">Result</span>&lt;(), ErrType&gt; {
<a href=#182 id=182 data-nosnippet>182</a> <span class="kw">let </span><span class="kw-2">mut </span>nop_callback =
<a href=#183 id=183 data-nosnippet>183</a> |_data: <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;interface::InputReferenceMut&gt;,
<a href=#184 id=184 data-nosnippet>184</a> _cmds: <span class="kw-2">&amp;mut </span>[interface::StaticCommand],
<a href=#185 id=185 data-nosnippet>185</a> _mb: interface::InputPair,
<a href=#186 id=186 data-nosnippet>186</a> _mfv: <span class="kw-2">&amp;mut </span>Alloc| ();
<a href=#187 id=187 data-nosnippet>187</a>
<a href=#188 id=188 data-nosnippet>188</a> <span class="kw">loop </span>{
<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">let </span><span class="kw-2">mut </span>avail_in: usize = <span class="number">0</span>;
<a href=#190 id=190 data-nosnippet>190</a> <span class="kw">let </span><span class="kw-2">mut </span>input_offset: usize = <span class="number">0</span>;
<a href=#191 id=191 data-nosnippet>191</a> <span class="kw">let </span><span class="kw-2">mut </span>avail_out: usize = <span class="self">self</span>.output_buffer.slice_mut().len();
<a href=#192 id=192 data-nosnippet>192</a> <span class="kw">let </span><span class="kw-2">mut </span>output_offset: usize = <span class="number">0</span>;
<a href=#193 id=193 data-nosnippet>193</a> <span class="kw">let </span>ret = <span class="self">self</span>.state.compress_stream(
<a href=#194 id=194 data-nosnippet>194</a> op,
<a href=#195 id=195 data-nosnippet>195</a> <span class="kw-2">&amp;mut </span>avail_in,
<a href=#196 id=196 data-nosnippet>196</a> <span class="kw-2">&amp;</span>[],
<a href=#197 id=197 data-nosnippet>197</a> <span class="kw-2">&amp;mut </span>input_offset,
<a href=#198 id=198 data-nosnippet>198</a> <span class="kw-2">&amp;mut </span>avail_out,
<a href=#199 id=199 data-nosnippet>199</a> <span class="self">self</span>.output_buffer.slice_mut(),
<a href=#200 id=200 data-nosnippet>200</a> <span class="kw-2">&amp;mut </span>output_offset,
<a href=#201 id=201 data-nosnippet>201</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.total_out,
<a href=#202 id=202 data-nosnippet>202</a> <span class="kw-2">&amp;mut </span>nop_callback,
<a href=#203 id=203 data-nosnippet>203</a> );
<a href=#204 id=204 data-nosnippet>204</a> <span class="kw">if </span>output_offset &gt; <span class="number">0 </span>{
<a href=#205 id=205 data-nosnippet>205</a> <span class="kw">let </span>zero_err = <span class="kw-2">&amp;mut </span><span class="self">self</span>.error_if_zero_bytes_written;
<a href=#206 id=206 data-nosnippet>206</a> <span class="kw">let </span>fallback = <span class="kw-2">&amp;mut </span><span class="self">self</span>.error_if_invalid_data;
<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">match </span>write_all(
<a href=#208 id=208 data-nosnippet>208</a> <span class="self">self</span>.output.as_mut().unwrap(),
<a href=#209 id=209 data-nosnippet>209</a> <span class="kw-2">&amp;</span><span class="self">self</span>.output_buffer.slice_mut()[..output_offset],
<a href=#210 id=210 data-nosnippet>210</a> || {
<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(err) = zero_err.take() {
<a href=#212 id=212 data-nosnippet>212</a> <span class="kw">return </span><span class="prelude-val">Some</span>(err);
<a href=#213 id=213 data-nosnippet>213</a> }
<a href=#214 id=214 data-nosnippet>214</a> fallback.take()
<a href=#215 id=215 data-nosnippet>215</a> },
<a href=#216 id=216 data-nosnippet>216</a> ) {
<a href=#217 id=217 data-nosnippet>217</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<a href=#218 id=218 data-nosnippet>218</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
<a href=#219 id=219 data-nosnippet>219</a> }
<a href=#220 id=220 data-nosnippet>220</a> }
<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">if </span>!ret {
<a href=#222 id=222 data-nosnippet>222</a> <span class="kw">return </span><span class="prelude-val">Err</span>(<span class="self">self</span>.error_if_invalid_data.take().unwrap());
<a href=#223 id=223 data-nosnippet>223</a> }
<a href=#224 id=224 data-nosnippet>224</a> <span class="kw">if let </span>BrotliEncoderOperation::BROTLI_OPERATION_FLUSH = op {
<a href=#225 id=225 data-nosnippet>225</a> <span class="kw">if </span><span class="self">self</span>.state.has_more_output() {
<a href=#226 id=226 data-nosnippet>226</a> <span class="kw">continue</span>;
<a href=#227 id=227 data-nosnippet>227</a> }
<a href=#228 id=228 data-nosnippet>228</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(());
<a href=#229 id=229 data-nosnippet>229</a> }
<a href=#230 id=230 data-nosnippet>230</a> <span class="kw">if </span><span class="self">self</span>.state.is_finished() {
<a href=#231 id=231 data-nosnippet>231</a> <span class="kw">return </span><span class="prelude-val">Ok</span>(());
<a href=#232 id=232 data-nosnippet>232</a> }
<a href=#233 id=233 data-nosnippet>233</a> }
<a href=#234 id=234 data-nosnippet>234</a> }
<a href=#235 id=235 data-nosnippet>235</a>
<a href=#236 id=236 data-nosnippet>236</a> <span class="kw">pub fn </span>get_ref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>W {
<a href=#237 id=237 data-nosnippet>237</a> <span class="self">self</span>.output.as_ref().unwrap()
<a href=#238 id=238 data-nosnippet>238</a> }
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">pub fn </span>get_mut(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;mut </span>W {
<a href=#240 id=240 data-nosnippet>240</a> <span class="self">self</span>.output.as_mut().unwrap()
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a> <span class="kw">pub fn </span>into_inner(<span class="kw-2">mut </span><span class="self">self</span>) -&gt; W {
<a href=#243 id=243 data-nosnippet>243</a> <span class="kw">match </span><span class="self">self</span>.flush_or_close(BrotliEncoderOperation::BROTLI_OPERATION_FINISH) {
<a href=#244 id=244 data-nosnippet>244</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<a href=#245 id=245 data-nosnippet>245</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; {}
<a href=#246 id=246 data-nosnippet>246</a> }
<a href=#247 id=247 data-nosnippet>247</a> <span class="self">self</span>.output.take().unwrap()
<a href=#248 id=248 data-nosnippet>248</a> }
<a href=#249 id=249 data-nosnippet>249</a>}
<a href=#250 id=250 data-nosnippet>250</a>
<a href=#251 id=251 data-nosnippet>251</a><span class="kw">impl</span>&lt;ErrType, W: CustomWrite&lt;ErrType&gt;, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt; Drop
<a href=#252 id=252 data-nosnippet>252</a> <span class="kw">for </span>CompressorWriterCustomIo&lt;ErrType, W, BufferType, Alloc&gt;
<a href=#253 id=253 data-nosnippet>253</a>{
<a href=#254 id=254 data-nosnippet>254</a> <span class="kw">fn </span>drop(<span class="kw-2">&amp;mut </span><span class="self">self</span>) {
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">if </span><span class="self">self</span>.output.is_some() {
<a href=#256 id=256 data-nosnippet>256</a> <span class="kw">match </span><span class="self">self</span>.flush_or_close(BrotliEncoderOperation::BROTLI_OPERATION_FINISH) {
<a href=#257 id=257 data-nosnippet>257</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<a href=#258 id=258 data-nosnippet>258</a> <span class="prelude-val">Err</span>(<span class="kw">_</span>) =&gt; {}
<a href=#259 id=259 data-nosnippet>259</a> }
<a href=#260 id=260 data-nosnippet>260</a> }
<a href=#261 id=261 data-nosnippet>261</a> BrotliEncoderDestroyInstance(<span class="kw-2">&amp;mut </span><span class="self">self</span>.state);
<a href=#262 id=262 data-nosnippet>262</a> }
<a href=#263 id=263 data-nosnippet>263</a>}
<a href=#264 id=264 data-nosnippet>264</a><span class="kw">impl</span>&lt;ErrType, W: CustomWrite&lt;ErrType&gt;, BufferType: SliceWrapperMut&lt;u8&gt;, Alloc: BrotliAlloc&gt;
<a href=#265 id=265 data-nosnippet>265</a> CustomWrite&lt;ErrType&gt; <span class="kw">for </span>CompressorWriterCustomIo&lt;ErrType, W, BufferType, Alloc&gt;
<a href=#266 id=266 data-nosnippet>266</a>{
<a href=#267 id=267 data-nosnippet>267</a> <span class="kw">fn </span>write(<span class="kw-2">&amp;mut </span><span class="self">self</span>, buf: <span class="kw-2">&amp;</span>[u8]) -&gt; <span class="prelude-ty">Result</span>&lt;usize, ErrType&gt; {
<a href=#268 id=268 data-nosnippet>268</a> <span class="kw">let </span><span class="kw-2">mut </span>nop_callback =
<a href=#269 id=269 data-nosnippet>269</a> |_data: <span class="kw-2">&amp;mut </span>interface::PredictionModeContextMap&lt;interface::InputReferenceMut&gt;,
<a href=#270 id=270 data-nosnippet>270</a> _cmds: <span class="kw-2">&amp;mut </span>[interface::StaticCommand],
<a href=#271 id=271 data-nosnippet>271</a> _mb: interface::InputPair,
<a href=#272 id=272 data-nosnippet>272</a> _mfv: <span class="kw-2">&amp;mut </span>Alloc| ();
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">let </span><span class="kw-2">mut </span>avail_in = buf.len();
<a href=#274 id=274 data-nosnippet>274</a> <span class="kw">let </span><span class="kw-2">mut </span>input_offset: usize = <span class="number">0</span>;
<a href=#275 id=275 data-nosnippet>275</a> <span class="kw">while </span><span class="macro">avail_in !</span>= <span class="number">0 </span>{
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">let </span><span class="kw-2">mut </span>output_offset = <span class="number">0</span>;
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw">let </span><span class="kw-2">mut </span>avail_out = <span class="self">self</span>.output_buffer.slice_mut().len();
<a href=#278 id=278 data-nosnippet>278</a> <span class="kw">let </span>ret = <span class="self">self</span>.state.compress_stream(
<a href=#279 id=279 data-nosnippet>279</a> BrotliEncoderOperation::BROTLI_OPERATION_PROCESS,
<a href=#280 id=280 data-nosnippet>280</a> <span class="kw-2">&amp;mut </span>avail_in,
<a href=#281 id=281 data-nosnippet>281</a> buf,
<a href=#282 id=282 data-nosnippet>282</a> <span class="kw-2">&amp;mut </span>input_offset,
<a href=#283 id=283 data-nosnippet>283</a> <span class="kw-2">&amp;mut </span>avail_out,
<a href=#284 id=284 data-nosnippet>284</a> <span class="self">self</span>.output_buffer.slice_mut(),
<a href=#285 id=285 data-nosnippet>285</a> <span class="kw-2">&amp;mut </span>output_offset,
<a href=#286 id=286 data-nosnippet>286</a> <span class="kw-2">&amp;mut </span><span class="self">self</span>.total_out,
<a href=#287 id=287 data-nosnippet>287</a> <span class="kw-2">&amp;mut </span>nop_callback,
<a href=#288 id=288 data-nosnippet>288</a> );
<a href=#289 id=289 data-nosnippet>289</a> <span class="kw">if </span>output_offset &gt; <span class="number">0 </span>{
<a href=#290 id=290 data-nosnippet>290</a> <span class="kw">let </span>zero_err = <span class="kw-2">&amp;mut </span><span class="self">self</span>.error_if_zero_bytes_written;
<a href=#291 id=291 data-nosnippet>291</a> <span class="kw">let </span>fallback = <span class="kw-2">&amp;mut </span><span class="self">self</span>.error_if_invalid_data;
<a href=#292 id=292 data-nosnippet>292</a> <span class="kw">match </span>write_all(
<a href=#293 id=293 data-nosnippet>293</a> <span class="self">self</span>.output.as_mut().unwrap(),
<a href=#294 id=294 data-nosnippet>294</a> <span class="kw-2">&amp;</span><span class="self">self</span>.output_buffer.slice_mut()[..output_offset],
<a href=#295 id=295 data-nosnippet>295</a> || {
<a href=#296 id=296 data-nosnippet>296</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(err) = zero_err.take() {
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw">return </span><span class="prelude-val">Some</span>(err);
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a> fallback.take()
<a href=#300 id=300 data-nosnippet>300</a> },
<a href=#301 id=301 data-nosnippet>301</a>
<a href=#302 id=302 data-nosnippet>302</a> ) {
<a href=#303 id=303 data-nosnippet>303</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<a href=#304 id=304 data-nosnippet>304</a> <span class="prelude-val">Err</span>(e) =&gt; {
<a href=#305 id=305 data-nosnippet>305</a> <span class="kw">return </span><span class="prelude-val">Err</span>(e)
<a href=#306 id=306 data-nosnippet>306</a> },
<a href=#307 id=307 data-nosnippet>307</a> }
<a href=#308 id=308 data-nosnippet>308</a> }
<a href=#309 id=309 data-nosnippet>309</a> <span class="kw">if </span>!ret {
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">return </span><span class="prelude-val">Err</span>(<span class="self">self</span>.error_if_invalid_data.take().unwrap());
<a href=#311 id=311 data-nosnippet>311</a> }
<a href=#312 id=312 data-nosnippet>312</a> }
<a href=#313 id=313 data-nosnippet>313</a> <span class="prelude-val">Ok</span>(buf.len())
<a href=#314 id=314 data-nosnippet>314</a> }
<a href=#315 id=315 data-nosnippet>315</a> <span class="kw">fn </span>flush(<span class="kw-2">&amp;mut </span><span class="self">self</span>) -&gt; <span class="prelude-ty">Result</span>&lt;(), ErrType&gt; {
<a href=#316 id=316 data-nosnippet>316</a> <span class="kw">match </span><span class="self">self</span>.flush_or_close(BrotliEncoderOperation::BROTLI_OPERATION_FLUSH) {
<a href=#317 id=317 data-nosnippet>317</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<a href=#318 id=318 data-nosnippet>318</a> <span class="prelude-val">Err</span>(e) =&gt; <span class="kw">return </span><span class="prelude-val">Err</span>(e),
<a href=#319 id=319 data-nosnippet>319</a> }
<a href=#320 id=320 data-nosnippet>320</a> <span class="self">self</span>.output.as_mut().unwrap().flush()
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a>}
</code></pre></div></section></main></body></html>