xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_10_11_9.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // This file is autogenerated: see
16 // tools/codegen/core/gen_huffman_decompressor.cc
17 
18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_11_9_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_11_9_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_10_11_9 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp1(size_t i)54   static inline uint64_t GetOp1(size_t i) {
55     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
56   }
GetEmit1(size_t i,size_t emit)57   static inline uint64_t GetEmit1(size_t i, size_t emit) {
58     return table1_emit_[i >> 6][emit];
59   }
GetOp7(size_t i)60   static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; }
GetEmit7(size_t,size_t emit)61   static inline uint64_t GetEmit7(size_t, size_t emit) {
62     return emit ? 43 : 39;
63   }
GetOp9(size_t i)64   static inline uint64_t GetOp9(size_t i) { return table9_0_inner_[i]; }
GetEmit9(size_t,size_t emit)65   static inline uint64_t GetEmit9(size_t, size_t emit) {
66     return table9_0_emit_[emit];
67   }
GetOp10(size_t i)68   static inline uint64_t GetOp10(size_t i) {
69     return table10_0_inner_[table10_0_outer_[i]];
70   }
GetEmit10(size_t,size_t emit)71   static inline uint64_t GetEmit10(size_t, size_t emit) {
72     return table10_0_emit_[emit];
73   }
GetOp11(size_t i)74   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)75   static inline uint64_t GetEmit11(size_t, size_t emit) {
76     return table11_0_emit_[emit];
77   }
GetOp12(size_t i)78   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)79   static inline uint64_t GetEmit12(size_t, size_t emit) {
80     return table11_0_emit_[emit];
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; }
GetEmit13(size_t,size_t emit)83   static inline uint64_t GetEmit13(size_t, size_t emit) {
84     return table11_0_emit_[emit];
85   }
GetOp14(size_t i)86   static inline uint64_t GetOp14(size_t i) {
87     return table14_ops_[i >> 6][i & 0x3f];
88   }
GetEmit14(size_t i,size_t emit)89   static inline uint64_t GetEmit14(size_t i, size_t emit) {
90     return table14_emit_[i >> 6][emit];
91   }
GetOp15(size_t i)92   static inline uint64_t GetOp15(size_t i) {
93     return table15_ops_[i >> 6][i & 0x3f];
94   }
GetEmit15(size_t i,size_t emit)95   static inline uint64_t GetEmit15(size_t i, size_t emit) {
96     return table15_emit_[i >> 6][emit];
97   }
GetOp16(size_t i)98   static inline uint64_t GetOp16(size_t i) {
99     return table16_ops_[i >> 6][i & 0x3f];
100   }
GetEmit16(size_t i,size_t emit)101   static inline uint64_t GetEmit16(size_t i, size_t emit) {
102     return table16_emit_[i >> 6][emit];
103   }
GetOp8(size_t i)104   static inline uint64_t GetOp8(size_t i) {
105     return table8_ops_[i >> 6][i & 0x3f];
106   }
GetEmit8(size_t i,size_t emit)107   static inline uint64_t GetEmit8(size_t i, size_t emit) {
108     return table8_emit_[i >> 6][emit];
109   }
GetOp17(size_t i)110   static inline uint64_t GetOp17(size_t i) { return i ? 3 : 1; }
GetEmit17(size_t,size_t emit)111   static inline uint64_t GetEmit17(size_t, size_t emit) {
112     return emit ? 132 : 129;
113   }
GetOp18(size_t i)114   static inline uint64_t GetOp18(size_t i) { return i ? 3 : 1; }
GetEmit18(size_t,size_t emit)115   static inline uint64_t GetEmit18(size_t, size_t emit) { return emit + 133; }
GetOp19(size_t i)116   static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; }
GetEmit19(size_t,size_t emit)117   static inline uint64_t GetEmit19(size_t, size_t emit) {
118     return emit ? 146 : 136;
119   }
GetOp20(size_t i)120   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)121   static inline uint64_t GetEmit20(size_t, size_t emit) {
122     return emit ? 156 : 154;
123   }
GetOp21(size_t i)124   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)125   static inline uint64_t GetEmit21(size_t, size_t emit) {
126     return emit ? 163 : 160;
127   }
GetOp22(size_t i)128   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)129   static inline uint64_t GetEmit22(size_t, size_t emit) {
130     return emit ? 169 : 164;
131   }
GetOp23(size_t i)132   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)133   static inline uint64_t GetEmit23(size_t, size_t emit) {
134     return emit ? 173 : 170;
135   }
GetOp24(size_t i)136   static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; }
GetEmit24(size_t,size_t emit)137   static inline uint64_t GetEmit24(size_t, size_t emit) {
138     return emit ? 181 : 178;
139   }
GetOp25(size_t i)140   static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; }
GetEmit25(size_t,size_t emit)141   static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 185; }
GetOp26(size_t i)142   static inline uint64_t GetOp26(size_t i) { return i ? 3 : 1; }
GetEmit26(size_t,size_t emit)143   static inline uint64_t GetEmit26(size_t, size_t emit) {
144     return emit ? 189 : 187;
145   }
GetOp27(size_t i)146   static inline uint64_t GetOp27(size_t i) { return i ? 3 : 1; }
GetEmit27(size_t,size_t emit)147   static inline uint64_t GetEmit27(size_t, size_t emit) {
148     return emit ? 196 : 190;
149   }
GetOp28(size_t i)150   static inline uint64_t GetOp28(size_t i) { return i ? 3 : 1; }
GetEmit28(size_t,size_t emit)151   static inline uint64_t GetEmit28(size_t, size_t emit) {
152     return emit ? 228 : 198;
153   }
GetOp29(size_t i)154   static inline uint64_t GetOp29(size_t i) { return i ? 3 : 1; }
GetEmit29(size_t,size_t emit)155   static inline uint64_t GetEmit29(size_t, size_t emit) { return emit + 232; }
GetOp30(size_t i)156   static inline uint64_t GetOp30(size_t i) {
157     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
158   }
GetEmit30(size_t,size_t emit)159   static inline uint64_t GetEmit30(size_t, size_t emit) {
160     return (emit < 2 ? (emit ? 135 : 1) : ((emit - 2) + 137));
161   }
GetOp31(size_t i)162   static inline uint64_t GetOp31(size_t i) {
163     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
164   }
GetEmit31(size_t,size_t emit)165   static inline uint64_t GetEmit31(size_t, size_t emit) {
166     return (emit < 2 ? (emit + 139) : ((emit - 2) ? 143 : 141));
167   }
GetOp32(size_t i)168   static inline uint64_t GetOp32(size_t i) {
169     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
170   }
GetEmit32(size_t,size_t emit)171   static inline uint64_t GetEmit32(size_t, size_t emit) {
172     return (emit < 1 ? (((void)emit, 147)) : ((emit - 1) + 149));
173   }
GetOp33(size_t i)174   static inline uint64_t GetOp33(size_t i) {
175     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
176   }
GetEmit33(size_t,size_t emit)177   static inline uint64_t GetEmit33(size_t, size_t emit) {
178     return (emit < 2 ? (emit ? 155 : 152) : ((emit - 2) + 157));
179   }
GetOp34(size_t i)180   static inline uint64_t GetOp34(size_t i) {
181     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
182   }
GetEmit34(size_t,size_t emit)183   static inline uint64_t GetEmit34(size_t, size_t emit) {
184     return (emit < 2 ? (emit + 165) : ((emit - 2) ? 174 : 168));
185   }
GetOp35(size_t i)186   static inline uint64_t GetOp35(size_t i) {
187     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
188   }
GetEmit35(size_t,size_t emit)189   static inline uint64_t GetEmit35(size_t, size_t emit) {
190     return (emit < 2 ? (emit ? 180 : 175) : ((emit - 2) + 182));
191   }
GetOp36(size_t i)192   static inline uint64_t GetOp36(size_t i) {
193     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
194   }
GetEmit36(size_t,size_t emit)195   static inline uint64_t GetEmit36(size_t, size_t emit) {
196     return (emit < 2 ? (emit ? 191 : 188) : ((emit - 2) ? 231 : 197));
197   }
GetOp38(size_t i)198   static inline uint64_t GetOp38(size_t i) {
199     return table38_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))];
200   }
GetEmit38(size_t,size_t emit)201   static inline uint64_t GetEmit38(size_t, size_t emit) {
202     return table38_0_emit_[emit];
203   }
GetOp37(size_t i)204   static inline uint64_t GetOp37(size_t i) {
205     return table37_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))];
206   }
GetEmit37(size_t,size_t emit)207   static inline uint64_t GetEmit37(size_t, size_t emit) {
208     return table37_0_emit_[emit];
209   }
GetOp40(size_t i)210   static inline uint64_t GetOp40(size_t i) {
211     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
212   }
GetEmit40(size_t,size_t emit)213   static inline uint64_t GetEmit40(size_t, size_t emit) {
214     return ((void)emit, 239);
215   }
GetOp39(size_t i)216   static inline uint64_t GetOp39(size_t i) {
217     return table39_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
218   }
GetEmit39(size_t,size_t emit)219   static inline uint64_t GetEmit39(size_t, size_t emit) {
220     return table39_0_emit_[emit];
221   }
GetOp42(size_t i)222   static inline uint64_t GetOp42(size_t i) { return table42_0_ops_[i]; }
GetEmit42(size_t,size_t emit)223   static inline uint64_t GetEmit42(size_t, size_t emit) {
224     return table42_0_emit_[emit];
225   }
GetOp43(size_t i)226   static inline uint64_t GetOp43(size_t i) { return table43_0_ops_[i]; }
GetEmit43(size_t,size_t emit)227   static inline uint64_t GetEmit43(size_t, size_t emit) {
228     return table43_0_emit_[emit];
229   }
GetOp44(size_t i)230   static inline uint64_t GetOp44(size_t i) { return table44_0_ops_[i]; }
GetEmit44(size_t,size_t emit)231   static inline uint64_t GetEmit44(size_t, size_t emit) {
232     return table44_0_emit_[emit];
233   }
GetOp45(size_t i)234   static inline uint64_t GetOp45(size_t i) { return table45_0_ops_[i]; }
GetEmit45(size_t,size_t emit)235   static inline uint64_t GetEmit45(size_t, size_t emit) {
236     return table44_0_emit_[emit];
237   }
GetOp41(size_t i)238   static inline uint64_t GetOp41(size_t i) {
239     return table41_ops_[i >> 5][i & 0x1f];
240   }
GetEmit41(size_t i,size_t emit)241   static inline uint64_t GetEmit41(size_t i, size_t emit) {
242     return table41_emit_[i >> 5][emit];
243   }
GetOp47(size_t i)244   static inline uint64_t GetOp47(size_t i) { return i; }
GetEmit47(size_t,size_t emit)245   static inline uint64_t GetEmit47(size_t, size_t emit) {
246     return ((void)emit, 124);
247   }
GetOp46(size_t i)248   static inline uint64_t GetOp46(size_t i) {
249     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
250                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
251                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
252   }
GetEmit46(size_t,size_t emit)253   static inline uint64_t GetEmit46(size_t, size_t emit) {
254     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
255   }
256 
257  private:
258   static const uint8_t table2_0_emit_[10];
259   static const uint8_t table2_0_ops_[32];
260   static const uint8_t table3_0_emit_[36];
261   static const uint8_t table3_0_ops_[64];
262   static const uint8_t table4_0_emit_[22];
263   static const uint8_t table4_0_ops_[64];
264   static const uint8_t table4_1_emit_[46];
265   static const uint8_t table4_1_ops_[64];
266   static const uint8_t* const table4_emit_[2];
267   static const uint8_t* const table4_ops_[2];
268   static const uint8_t table5_0_ops_[128];
269   static const uint8_t table5_1_emit_[52];
270   static const uint8_t table5_1_ops_[128];
271   static const uint8_t* const table5_emit_[2];
272   static const uint8_t* const table5_ops_[2];
273   static const uint8_t table6_0_emit_[2];
274   static const uint8_t table6_0_ops_[32];
275   static const uint8_t table6_1_emit_[2];
276   static const uint8_t table6_2_emit_[2];
277   static const uint8_t table6_3_emit_[2];
278   static const uint8_t table6_4_emit_[2];
279   static const uint8_t table6_5_emit_[4];
280   static const uint8_t table6_5_ops_[32];
281   static const uint8_t table6_6_emit_[4];
282   static const uint8_t table6_7_emit_[4];
283   static const uint8_t table6_8_emit_[4];
284   static const uint8_t table6_9_emit_[4];
285   static const uint8_t table6_10_emit_[4];
286   static const uint8_t table6_11_emit_[6];
287   static const uint8_t table6_11_ops_[32];
288   static const uint8_t table6_12_emit_[8];
289   static const uint8_t table6_12_ops_[32];
290   static const uint8_t table6_13_emit_[8];
291   static const uint8_t table6_14_emit_[8];
292   static const uint8_t table6_15_emit_[10];
293   static const uint8_t table6_15_ops_[32];
294   static const uint8_t* const table6_emit_[16];
295   static const uint8_t* const table6_ops_[16];
296   static const uint8_t table1_0_emit_[36];
297   static const uint16_t table1_0_inner_[22];
298   static const uint8_t table1_0_outer_[64];
299   static const uint8_t table1_1_emit_[36];
300   static const uint16_t table1_1_inner_[22];
301   static const uint8_t table1_2_emit_[36];
302   static const uint16_t table1_2_inner_[22];
303   static const uint8_t table1_3_emit_[36];
304   static const uint16_t table1_3_inner_[22];
305   static const uint8_t table1_4_emit_[38];
306   static const uint16_t table1_4_inner_[22];
307   static const uint16_t table1_5_inner_[4];
308   static const uint8_t table1_5_outer_[64];
309   static const uint16_t table1_11_inner_[6];
310   static const uint8_t table1_11_outer_[64];
311   static const uint16_t table1_12_inner_[8];
312   static const uint8_t table1_12_outer_[64];
313   static const uint8_t table1_15_emit_[15];
314   static const uint16_t table1_15_inner_[18];
315   static const uint8_t table1_15_outer_[64];
316   static const uint8_t* const table1_emit_[16];
317   static const uint16_t* const table1_inner_[16];
318   static const uint8_t* const table1_outer_[16];
319   static const uint8_t table9_0_emit_[6];
320   static const uint8_t table9_0_inner_[8];
321   static const uint8_t table10_0_emit_[8];
322   static const uint8_t table10_0_inner_[10];
323   static const uint8_t table10_0_outer_[16];
324   static const uint8_t table11_0_emit_[11];
325   static const uint8_t table11_0_ops_[32];
326   static const uint8_t table12_0_ops_[64];
327   static const uint8_t table13_0_ops_[128];
328   static const uint8_t table14_0_emit_[40];
329   static const uint8_t table14_0_ops_[64];
330   static const uint8_t table14_1_emit_[40];
331   static const uint8_t table14_2_emit_[40];
332   static const uint8_t table14_3_emit_[5];
333   static const uint8_t table14_3_ops_[64];
334   static const uint8_t* const table14_emit_[4];
335   static const uint8_t* const table14_ops_[4];
336   static const uint8_t table15_0_emit_[72];
337   static const uint16_t table15_0_ops_[64];
338   static const uint8_t table15_1_emit_[72];
339   static const uint8_t table15_2_emit_[72];
340   static const uint8_t table15_3_emit_[72];
341   static const uint8_t table15_4_emit_[72];
342   static const uint8_t table15_5_emit_[72];
343   static const uint8_t table15_6_emit_[40];
344   static const uint16_t table15_6_ops_[64];
345   static const uint8_t table15_7_emit_[6];
346   static const uint16_t table15_7_ops_[64];
347   static const uint8_t* const table15_emit_[8];
348   static const uint16_t* const table15_ops_[8];
349   static const uint8_t table16_0_emit_[44];
350   static const uint16_t table16_0_ops_[64];
351   static const uint8_t table16_1_emit_[92];
352   static const uint16_t table16_1_ops_[64];
353   static const uint8_t table16_2_emit_[44];
354   static const uint8_t table16_3_emit_[92];
355   static const uint8_t table16_4_emit_[44];
356   static const uint8_t table16_5_emit_[92];
357   static const uint8_t table16_6_emit_[44];
358   static const uint8_t table16_7_emit_[92];
359   static const uint8_t table16_8_emit_[44];
360   static const uint8_t table16_9_emit_[92];
361   static const uint8_t table16_10_emit_[44];
362   static const uint8_t table16_11_emit_[92];
363   static const uint8_t table16_12_emit_[72];
364   static const uint8_t table16_13_emit_[72];
365   static const uint8_t table16_14_emit_[40];
366   static const uint8_t table16_15_emit_[31];
367   static const uint16_t table16_15_ops_[64];
368   static const uint8_t* const table16_emit_[16];
369   static const uint16_t* const table16_ops_[16];
370   static const uint8_t table8_0_emit_[1];
371   static const uint16_t table8_0_ops_[64];
372   static const uint8_t table8_4_emit_[1];
373   static const uint8_t table8_8_emit_[1];
374   static const uint8_t table8_12_emit_[1];
375   static const uint8_t table8_16_emit_[1];
376   static const uint8_t table8_20_emit_[1];
377   static const uint8_t table8_24_emit_[1];
378   static const uint16_t table8_24_ops_[64];
379   static const uint8_t table8_26_emit_[1];
380   static const uint8_t table8_28_emit_[1];
381   static const uint16_t table8_28_ops_[64];
382   static const uint8_t table8_29_emit_[1];
383   static const uint8_t table8_30_emit_[1];
384   static const uint8_t table8_31_emit_[24];
385   static const uint16_t table8_31_ops_[64];
386   static const uint8_t* const table8_emit_[32];
387   static const uint16_t* const table8_ops_[32];
388   static const uint8_t table38_0_emit_[6];
389   static const uint8_t table38_0_inner_[7];
390   static const uint8_t table37_0_emit_[10];
391   static const uint8_t table37_0_inner_[10];
392   static const uint8_t table39_0_emit_[7];
393   static const uint8_t table39_0_inner_[7];
394   static const uint8_t table42_0_emit_[15];
395   static const uint8_t table42_0_ops_[32];
396   static const uint8_t table43_0_emit_[34];
397   static const uint8_t table43_0_ops_[64];
398   static const uint8_t table44_0_emit_[63];
399   static const uint8_t table44_0_ops_[128];
400   static const uint8_t table45_0_ops_[256];
401   static const uint8_t table41_0_emit_[2];
402   static const uint16_t table41_0_ops_[32];
403   static const uint8_t table41_1_emit_[2];
404   static const uint8_t table41_2_emit_[2];
405   static const uint8_t table41_3_emit_[2];
406   static const uint8_t table41_4_emit_[2];
407   static const uint8_t table41_5_emit_[2];
408   static const uint8_t table41_6_emit_[2];
409   static const uint8_t table41_7_emit_[3];
410   static const uint16_t table41_7_ops_[32];
411   static const uint8_t table41_8_emit_[4];
412   static const uint16_t table41_8_ops_[32];
413   static const uint8_t table41_9_emit_[4];
414   static const uint8_t table41_10_emit_[4];
415   static const uint8_t table41_11_emit_[4];
416   static const uint8_t table41_12_emit_[7];
417   static const uint16_t table41_12_ops_[32];
418   static const uint8_t table41_13_emit_[8];
419   static const uint16_t table41_13_ops_[32];
420   static const uint8_t table41_14_emit_[8];
421   static const uint8_t table41_15_emit_[10];
422   static const uint16_t table41_15_ops_[32];
423   static const uint8_t* const table41_emit_[16];
424   static const uint16_t* const table41_ops_[16];
425 };
426 template <typename F>
427 class HuffDecoder : public HuffDecoderCommon {
428  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)429   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
430       : sink_(sink), begin_(begin), end_(end) {}
Run()431   bool Run() {
432     while (!done_) {
433       if (!RefillTo10()) {
434         Done0();
435         break;
436       }
437       const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
438       const auto op = GetOp1(index);
439       const int consumed = op & 15;
440       buffer_len_ -= consumed;
441       const auto emit_ofs = op >> 7;
442       switch ((op >> 4) & 7) {
443         case 0: {
444           sink_(GetEmit1(index, emit_ofs + 0));
445           sink_(GetEmit1(index, emit_ofs + 1));
446           break;
447         }
448         case 1: {
449           sink_(GetEmit1(index, emit_ofs + 0));
450           break;
451         }
452         case 2: {
453           DecodeStep0();
454           break;
455         }
456         case 3: {
457           DecodeStep25();
458           break;
459         }
460         case 4: {
461           DecodeStep1();
462           break;
463         }
464       }
465     }
466     return ok_;
467   }
468 
469  private:
RefillTo10()470   bool RefillTo10() {
471     switch (buffer_len_) {
472       case 0: {
473         return Read2to8Bytes();
474       }
475       case 1: {
476         return Read2to7Bytes();
477       }
478       case 2:
479       case 3:
480       case 4:
481       case 5:
482       case 6:
483       case 7:
484       case 8: {
485         return Read1to7Bytes();
486       }
487       case 9: {
488         return Read1to6Bytes();
489       }
490     }
491     return true;
492   }
Read2to8Bytes()493   bool Read2to8Bytes() {
494     switch (end_ - begin_) {
495       case 0:
496       case 1: {
497         return false;
498       }
499       case 2: {
500         Fill2();
501         return true;
502       }
503       case 3: {
504         Fill3();
505         return true;
506       }
507       case 4: {
508         Fill4();
509         return true;
510       }
511       case 5: {
512         Fill5();
513         return true;
514       }
515       case 6: {
516         Fill6();
517         return true;
518       }
519       case 7: {
520         Fill7();
521         return true;
522       }
523       default: {
524         Fill8();
525         return true;
526       }
527     }
528   }
Fill2()529   void Fill2() {
530     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
531               (static_cast<uint64_t>(begin_[1]) << 0);
532     begin_ += 2;
533     buffer_len_ += 16;
534   }
Fill3()535   void Fill3() {
536     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
537               (static_cast<uint64_t>(begin_[1]) << 8) |
538               (static_cast<uint64_t>(begin_[2]) << 0);
539     begin_ += 3;
540     buffer_len_ += 24;
541   }
Fill4()542   void Fill4() {
543     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
544               (static_cast<uint64_t>(begin_[1]) << 16) |
545               (static_cast<uint64_t>(begin_[2]) << 8) |
546               (static_cast<uint64_t>(begin_[3]) << 0);
547     begin_ += 4;
548     buffer_len_ += 32;
549   }
Fill5()550   void Fill5() {
551     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
552               (static_cast<uint64_t>(begin_[1]) << 24) |
553               (static_cast<uint64_t>(begin_[2]) << 16) |
554               (static_cast<uint64_t>(begin_[3]) << 8) |
555               (static_cast<uint64_t>(begin_[4]) << 0);
556     begin_ += 5;
557     buffer_len_ += 40;
558   }
Fill6()559   void Fill6() {
560     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
561               (static_cast<uint64_t>(begin_[1]) << 32) |
562               (static_cast<uint64_t>(begin_[2]) << 24) |
563               (static_cast<uint64_t>(begin_[3]) << 16) |
564               (static_cast<uint64_t>(begin_[4]) << 8) |
565               (static_cast<uint64_t>(begin_[5]) << 0);
566     begin_ += 6;
567     buffer_len_ += 48;
568   }
Fill7()569   void Fill7() {
570     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
571               (static_cast<uint64_t>(begin_[1]) << 40) |
572               (static_cast<uint64_t>(begin_[2]) << 32) |
573               (static_cast<uint64_t>(begin_[3]) << 24) |
574               (static_cast<uint64_t>(begin_[4]) << 16) |
575               (static_cast<uint64_t>(begin_[5]) << 8) |
576               (static_cast<uint64_t>(begin_[6]) << 0);
577     begin_ += 7;
578     buffer_len_ += 56;
579   }
Fill8()580   void Fill8() {
581     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
582               (static_cast<uint64_t>(begin_[1]) << 48) |
583               (static_cast<uint64_t>(begin_[2]) << 40) |
584               (static_cast<uint64_t>(begin_[3]) << 32) |
585               (static_cast<uint64_t>(begin_[4]) << 24) |
586               (static_cast<uint64_t>(begin_[5]) << 16) |
587               (static_cast<uint64_t>(begin_[6]) << 8) |
588               (static_cast<uint64_t>(begin_[7]) << 0);
589     begin_ += 8;
590     buffer_len_ += 64;
591   }
Read2to7Bytes()592   bool Read2to7Bytes() {
593     switch (end_ - begin_) {
594       case 0:
595       case 1: {
596         return false;
597       }
598       case 2: {
599         Fill2();
600         return true;
601       }
602       case 3: {
603         Fill3();
604         return true;
605       }
606       case 4: {
607         Fill4();
608         return true;
609       }
610       case 5: {
611         Fill5();
612         return true;
613       }
614       case 6: {
615         Fill6();
616         return true;
617       }
618       default: {
619         Fill7();
620         return true;
621       }
622     }
623   }
Read1to7Bytes()624   bool Read1to7Bytes() {
625     switch (end_ - begin_) {
626       case 0: {
627         return false;
628       }
629       case 1: {
630         Fill1();
631         return true;
632       }
633       case 2: {
634         Fill2();
635         return true;
636       }
637       case 3: {
638         Fill3();
639         return true;
640       }
641       case 4: {
642         Fill4();
643         return true;
644       }
645       case 5: {
646         Fill5();
647         return true;
648       }
649       case 6: {
650         Fill6();
651         return true;
652       }
653       default: {
654         Fill7();
655         return true;
656       }
657     }
658   }
Fill1()659   void Fill1() {
660     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
661     begin_ += 1;
662     buffer_len_ += 8;
663   }
Read1to6Bytes()664   bool Read1to6Bytes() {
665     switch (end_ - begin_) {
666       case 0: {
667         return false;
668       }
669       case 1: {
670         Fill1();
671         return true;
672       }
673       case 2: {
674         Fill2();
675         return true;
676       }
677       case 3: {
678         Fill3();
679         return true;
680       }
681       case 4: {
682         Fill4();
683         return true;
684       }
685       case 5: {
686         Fill5();
687         return true;
688       }
689       default: {
690         Fill6();
691         return true;
692       }
693     }
694   }
Done0()695   void Done0() {
696     done_ = true;
697     switch (end_ - begin_) {
698       case 1: {
699         Fill1();
700         break;
701       }
702     }
703     switch (buffer_len_) {
704       case 1:
705       case 2:
706       case 3:
707       case 4: {
708         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
709         return;
710       }
711       case 5: {
712         const auto index = buffer_ & 31;
713         const auto op = GetOp2(index);
714         switch (op & 3) {
715           case 0: {
716             sink_(GetEmit2(index, (op >> 2) + 0));
717             break;
718           }
719           case 1: {
720             ok_ = false;
721             break;
722           }
723         }
724         return;
725       }
726       case 6: {
727         const auto index = buffer_ & 63;
728         const auto op = GetOp3(index);
729         switch (op & 3) {
730           case 0: {
731             ok_ = false;
732             break;
733           }
734           case 1: {
735             sink_(GetEmit3(index, (op >> 2) + 0));
736             break;
737           }
738         }
739         return;
740       }
741       case 7: {
742         const auto index = buffer_ & 127;
743         const auto op = GetOp4(index);
744         switch (op & 3) {
745           case 0: {
746             ok_ = false;
747             break;
748           }
749           case 1: {
750             sink_(GetEmit4(index, (op >> 2) + 0));
751             break;
752           }
753         }
754         return;
755       }
756       case 8: {
757         const auto index = buffer_ & 255;
758         const auto op = GetOp5(index);
759         switch (op & 3) {
760           case 0: {
761             ok_ = false;
762             break;
763           }
764           case 1: {
765             sink_(GetEmit5(index, (op >> 2) + 0));
766             break;
767           }
768         }
769         return;
770       }
771       case 9: {
772         const auto index = buffer_ & 511;
773         const auto op = GetOp6(index);
774         switch (op & 3) {
775           case 0: {
776             ok_ = false;
777             break;
778           }
779           case 1: {
780             sink_(GetEmit6(index, (op >> 2) + 0));
781             break;
782           }
783         }
784         return;
785       }
786       case 0: {
787         return;
788       }
789     }
790   }
DecodeStep0()791   void DecodeStep0() {
792     if (!RefillTo1()) {
793       Done1();
794       return;
795     }
796     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
797     const auto op = GetOp7(index);
798     const int consumed = op & 1;
799     buffer_len_ -= consumed;
800     const auto emit_ofs = op >> 1;
801     sink_(GetEmit7(index, emit_ofs + 0));
802   }
RefillTo1()803   bool RefillTo1() {
804     switch (buffer_len_) {
805       case 0: {
806         return Read1to8Bytes();
807       }
808     }
809     return true;
810   }
Read1to8Bytes()811   bool Read1to8Bytes() {
812     switch (end_ - begin_) {
813       case 0: {
814         return false;
815       }
816       case 1: {
817         Fill1();
818         return true;
819       }
820       case 2: {
821         Fill2();
822         return true;
823       }
824       case 3: {
825         Fill3();
826         return true;
827       }
828       case 4: {
829         Fill4();
830         return true;
831       }
832       case 5: {
833         Fill5();
834         return true;
835       }
836       case 6: {
837         Fill6();
838         return true;
839       }
840       case 7: {
841         Fill7();
842         return true;
843       }
844       default: {
845         Fill8();
846         return true;
847       }
848     }
849   }
Done1()850   void Done1() {
851     done_ = true;
852     ok_ = false;
853   }
DecodeStep1()854   void DecodeStep1() {
855     if (!RefillTo11()) {
856       Done2();
857       return;
858     }
859     const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
860     const auto op = GetOp8(index);
861     const int consumed = op & 15;
862     buffer_len_ -= consumed;
863     const auto emit_ofs = op >> 9;
864     switch ((op >> 4) & 31) {
865       case 0: {
866         sink_(GetEmit8(index, emit_ofs + 0));
867         break;
868       }
869       case 1: {
870         DecodeStep2();
871         break;
872       }
873       case 2: {
874         DecodeStep3();
875         break;
876       }
877       case 3: {
878         DecodeStep4();
879         break;
880       }
881       case 4: {
882         DecodeStep5();
883         break;
884       }
885       case 5: {
886         DecodeStep6();
887         break;
888       }
889       case 6: {
890         DecodeStep7();
891         break;
892       }
893       case 7: {
894         DecodeStep8();
895         break;
896       }
897       case 8: {
898         DecodeStep9();
899         break;
900       }
901       case 9: {
902         DecodeStep10();
903         break;
904       }
905       case 10: {
906         DecodeStep11();
907         break;
908       }
909       case 11: {
910         DecodeStep12();
911         break;
912       }
913       case 12: {
914         DecodeStep13();
915         break;
916       }
917       case 13: {
918         DecodeStep14();
919         break;
920       }
921       case 14: {
922         DecodeStep15();
923         break;
924       }
925       case 15: {
926         DecodeStep16();
927         break;
928       }
929       case 16: {
930         DecodeStep17();
931         break;
932       }
933       case 17: {
934         DecodeStep18();
935         break;
936       }
937       case 18: {
938         DecodeStep19();
939         break;
940       }
941       case 19: {
942         DecodeStep20();
943         break;
944       }
945       case 20: {
946         DecodeStep21();
947         break;
948       }
949       case 21: {
950         DecodeStep23();
951         break;
952       }
953       case 22: {
954         DecodeStep22();
955         break;
956       }
957       case 23: {
958         DecodeStep24();
959         break;
960       }
961     }
962   }
RefillTo11()963   bool RefillTo11() {
964     switch (buffer_len_) {
965       case 0: {
966         return Read2to8Bytes();
967       }
968       case 1:
969       case 2: {
970         return Read2to7Bytes();
971       }
972       case 3:
973       case 4:
974       case 5:
975       case 6:
976       case 7:
977       case 8: {
978         return Read1to7Bytes();
979       }
980       case 9:
981       case 10: {
982         return Read1to6Bytes();
983       }
984     }
985     return true;
986   }
Done2()987   void Done2() {
988     done_ = true;
989     switch (end_ - begin_) {
990       case 1: {
991         Fill1();
992         break;
993       }
994     }
995     switch (buffer_len_) {
996       case 1:
997       case 2: {
998         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
999         return;
1000       }
1001       case 3: {
1002         const auto index = buffer_ & 7;
1003         const auto op = GetOp9(index);
1004         switch (op & 3) {
1005           case 0: {
1006             sink_(GetEmit9(index, (op >> 2) + 0));
1007             break;
1008           }
1009           case 1: {
1010             ok_ = false;
1011             break;
1012           }
1013         }
1014         return;
1015       }
1016       case 4: {
1017         const auto index = buffer_ & 15;
1018         const auto op = GetOp10(index);
1019         switch (op & 3) {
1020           case 0: {
1021             ok_ = false;
1022             break;
1023           }
1024           case 1: {
1025             sink_(GetEmit10(index, (op >> 2) + 0));
1026             break;
1027           }
1028         }
1029         return;
1030       }
1031       case 5: {
1032         const auto index = buffer_ & 31;
1033         const auto op = GetOp11(index);
1034         switch (op & 3) {
1035           case 0: {
1036             ok_ = false;
1037             break;
1038           }
1039           case 1: {
1040             sink_(GetEmit11(index, (op >> 2) + 0));
1041             break;
1042           }
1043         }
1044         return;
1045       }
1046       case 6: {
1047         const auto index = buffer_ & 63;
1048         const auto op = GetOp12(index);
1049         switch (op & 3) {
1050           case 0: {
1051             ok_ = false;
1052             break;
1053           }
1054           case 1: {
1055             sink_(GetEmit12(index, (op >> 2) + 0));
1056             break;
1057           }
1058         }
1059         return;
1060       }
1061       case 7: {
1062         const auto index = buffer_ & 127;
1063         const auto op = GetOp13(index);
1064         switch (op & 3) {
1065           case 0: {
1066             ok_ = false;
1067             break;
1068           }
1069           case 1: {
1070             sink_(GetEmit13(index, (op >> 2) + 0));
1071             break;
1072           }
1073         }
1074         return;
1075       }
1076       case 8: {
1077         const auto index = buffer_ & 255;
1078         const auto op = GetOp14(index);
1079         switch (op & 3) {
1080           case 0: {
1081             sink_(GetEmit14(index, (op >> 2) + 0));
1082             sink_(GetEmit14(index, (op >> 2) + 1));
1083             break;
1084           }
1085           case 1: {
1086             ok_ = false;
1087             break;
1088           }
1089           case 2: {
1090             sink_(GetEmit14(index, (op >> 2) + 0));
1091             break;
1092           }
1093         }
1094         return;
1095       }
1096       case 9: {
1097         const auto index = buffer_ & 511;
1098         const auto op = GetOp15(index);
1099         switch (op & 3) {
1100           case 0: {
1101             ok_ = false;
1102             break;
1103           }
1104           case 1: {
1105             sink_(GetEmit15(index, (op >> 2) + 0));
1106             sink_(GetEmit15(index, (op >> 2) + 1));
1107             break;
1108           }
1109           case 2: {
1110             sink_(GetEmit15(index, (op >> 2) + 0));
1111             break;
1112           }
1113         }
1114         return;
1115       }
1116       case 10: {
1117         const auto index = buffer_ & 1023;
1118         const auto op = GetOp16(index);
1119         switch (op & 3) {
1120           case 0: {
1121             ok_ = false;
1122             break;
1123           }
1124           case 1: {
1125             sink_(GetEmit16(index, (op >> 2) + 0));
1126             sink_(GetEmit16(index, (op >> 2) + 1));
1127             break;
1128           }
1129           case 2: {
1130             sink_(GetEmit16(index, (op >> 2) + 0));
1131             break;
1132           }
1133         }
1134         return;
1135       }
1136       case 0: {
1137         return;
1138       }
1139     }
1140   }
DecodeStep2()1141   void DecodeStep2() {
1142     if (!RefillTo1()) {
1143       Done3();
1144       return;
1145     }
1146     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1147     const auto op = GetOp17(index);
1148     const int consumed = op & 1;
1149     buffer_len_ -= consumed;
1150     const auto emit_ofs = op >> 1;
1151     sink_(GetEmit17(index, emit_ofs + 0));
1152   }
Done3()1153   void Done3() {
1154     done_ = true;
1155     ok_ = false;
1156   }
DecodeStep3()1157   void DecodeStep3() {
1158     if (!RefillTo1()) {
1159       Done4();
1160       return;
1161     }
1162     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1163     const auto op = GetOp18(index);
1164     const int consumed = op & 1;
1165     buffer_len_ -= consumed;
1166     const auto emit_ofs = op >> 1;
1167     sink_(GetEmit18(index, emit_ofs + 0));
1168   }
Done4()1169   void Done4() {
1170     done_ = true;
1171     ok_ = false;
1172   }
DecodeStep4()1173   void DecodeStep4() {
1174     if (!RefillTo1()) {
1175       Done5();
1176       return;
1177     }
1178     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1179     const auto op = GetOp19(index);
1180     const int consumed = op & 1;
1181     buffer_len_ -= consumed;
1182     const auto emit_ofs = op >> 1;
1183     sink_(GetEmit19(index, emit_ofs + 0));
1184   }
Done5()1185   void Done5() {
1186     done_ = true;
1187     ok_ = false;
1188   }
DecodeStep5()1189   void DecodeStep5() {
1190     if (!RefillTo1()) {
1191       Done6();
1192       return;
1193     }
1194     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1195     const auto op = GetOp20(index);
1196     const int consumed = op & 1;
1197     buffer_len_ -= consumed;
1198     const auto emit_ofs = op >> 1;
1199     sink_(GetEmit20(index, emit_ofs + 0));
1200   }
Done6()1201   void Done6() {
1202     done_ = true;
1203     ok_ = false;
1204   }
DecodeStep6()1205   void DecodeStep6() {
1206     if (!RefillTo1()) {
1207       Done7();
1208       return;
1209     }
1210     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1211     const auto op = GetOp21(index);
1212     const int consumed = op & 1;
1213     buffer_len_ -= consumed;
1214     const auto emit_ofs = op >> 1;
1215     sink_(GetEmit21(index, emit_ofs + 0));
1216   }
Done7()1217   void Done7() {
1218     done_ = true;
1219     ok_ = false;
1220   }
DecodeStep7()1221   void DecodeStep7() {
1222     if (!RefillTo1()) {
1223       Done8();
1224       return;
1225     }
1226     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1227     const auto op = GetOp22(index);
1228     const int consumed = op & 1;
1229     buffer_len_ -= consumed;
1230     const auto emit_ofs = op >> 1;
1231     sink_(GetEmit22(index, emit_ofs + 0));
1232   }
Done8()1233   void Done8() {
1234     done_ = true;
1235     ok_ = false;
1236   }
DecodeStep8()1237   void DecodeStep8() {
1238     if (!RefillTo1()) {
1239       Done9();
1240       return;
1241     }
1242     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1243     const auto op = GetOp23(index);
1244     const int consumed = op & 1;
1245     buffer_len_ -= consumed;
1246     const auto emit_ofs = op >> 1;
1247     sink_(GetEmit23(index, emit_ofs + 0));
1248   }
Done9()1249   void Done9() {
1250     done_ = true;
1251     ok_ = false;
1252   }
DecodeStep9()1253   void DecodeStep9() {
1254     if (!RefillTo1()) {
1255       Done10();
1256       return;
1257     }
1258     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1259     const auto op = GetOp24(index);
1260     const int consumed = op & 1;
1261     buffer_len_ -= consumed;
1262     const auto emit_ofs = op >> 1;
1263     sink_(GetEmit24(index, emit_ofs + 0));
1264   }
Done10()1265   void Done10() {
1266     done_ = true;
1267     ok_ = false;
1268   }
DecodeStep10()1269   void DecodeStep10() {
1270     if (!RefillTo1()) {
1271       Done11();
1272       return;
1273     }
1274     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1275     const auto op = GetOp25(index);
1276     const int consumed = op & 1;
1277     buffer_len_ -= consumed;
1278     const auto emit_ofs = op >> 1;
1279     sink_(GetEmit25(index, emit_ofs + 0));
1280   }
Done11()1281   void Done11() {
1282     done_ = true;
1283     ok_ = false;
1284   }
DecodeStep11()1285   void DecodeStep11() {
1286     if (!RefillTo1()) {
1287       Done12();
1288       return;
1289     }
1290     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1291     const auto op = GetOp26(index);
1292     const int consumed = op & 1;
1293     buffer_len_ -= consumed;
1294     const auto emit_ofs = op >> 1;
1295     sink_(GetEmit26(index, emit_ofs + 0));
1296   }
Done12()1297   void Done12() {
1298     done_ = true;
1299     ok_ = false;
1300   }
DecodeStep12()1301   void DecodeStep12() {
1302     if (!RefillTo1()) {
1303       Done13();
1304       return;
1305     }
1306     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1307     const auto op = GetOp27(index);
1308     const int consumed = op & 1;
1309     buffer_len_ -= consumed;
1310     const auto emit_ofs = op >> 1;
1311     sink_(GetEmit27(index, emit_ofs + 0));
1312   }
Done13()1313   void Done13() {
1314     done_ = true;
1315     ok_ = false;
1316   }
DecodeStep13()1317   void DecodeStep13() {
1318     if (!RefillTo1()) {
1319       Done14();
1320       return;
1321     }
1322     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1323     const auto op = GetOp28(index);
1324     const int consumed = op & 1;
1325     buffer_len_ -= consumed;
1326     const auto emit_ofs = op >> 1;
1327     sink_(GetEmit28(index, emit_ofs + 0));
1328   }
Done14()1329   void Done14() {
1330     done_ = true;
1331     ok_ = false;
1332   }
DecodeStep14()1333   void DecodeStep14() {
1334     if (!RefillTo1()) {
1335       Done15();
1336       return;
1337     }
1338     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1339     const auto op = GetOp29(index);
1340     const int consumed = op & 1;
1341     buffer_len_ -= consumed;
1342     const auto emit_ofs = op >> 1;
1343     sink_(GetEmit29(index, emit_ofs + 0));
1344   }
Done15()1345   void Done15() {
1346     done_ = true;
1347     ok_ = false;
1348   }
DecodeStep15()1349   void DecodeStep15() {
1350     if (!RefillTo2()) {
1351       Done16();
1352       return;
1353     }
1354     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1355     const auto op = GetOp30(index);
1356     const int consumed = op & 3;
1357     buffer_len_ -= consumed;
1358     const auto emit_ofs = op >> 2;
1359     sink_(GetEmit30(index, emit_ofs + 0));
1360   }
RefillTo2()1361   bool RefillTo2() {
1362     switch (buffer_len_) {
1363       case 0: {
1364         return Read1to8Bytes();
1365       }
1366       case 1: {
1367         return Read1to7Bytes();
1368       }
1369     }
1370     return true;
1371   }
Done16()1372   void Done16() {
1373     done_ = true;
1374     switch (buffer_len_) {
1375       case 1:
1376       case 0: {
1377         ok_ = false;
1378         return;
1379       }
1380     }
1381   }
DecodeStep16()1382   void DecodeStep16() {
1383     if (!RefillTo2()) {
1384       Done17();
1385       return;
1386     }
1387     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1388     const auto op = GetOp31(index);
1389     const int consumed = op & 3;
1390     buffer_len_ -= consumed;
1391     const auto emit_ofs = op >> 2;
1392     sink_(GetEmit31(index, emit_ofs + 0));
1393   }
Done17()1394   void Done17() {
1395     done_ = true;
1396     switch (buffer_len_) {
1397       case 1:
1398       case 0: {
1399         ok_ = false;
1400         return;
1401       }
1402     }
1403   }
DecodeStep17()1404   void DecodeStep17() {
1405     if (!RefillTo2()) {
1406       Done18();
1407       return;
1408     }
1409     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1410     const auto op = GetOp32(index);
1411     const int consumed = op & 3;
1412     buffer_len_ -= consumed;
1413     const auto emit_ofs = op >> 2;
1414     sink_(GetEmit32(index, emit_ofs + 0));
1415   }
Done18()1416   void Done18() {
1417     done_ = true;
1418     switch (buffer_len_) {
1419       case 1:
1420       case 0: {
1421         ok_ = false;
1422         return;
1423       }
1424     }
1425   }
DecodeStep18()1426   void DecodeStep18() {
1427     if (!RefillTo2()) {
1428       Done19();
1429       return;
1430     }
1431     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1432     const auto op = GetOp33(index);
1433     const int consumed = op & 3;
1434     buffer_len_ -= consumed;
1435     const auto emit_ofs = op >> 2;
1436     sink_(GetEmit33(index, emit_ofs + 0));
1437   }
Done19()1438   void Done19() {
1439     done_ = true;
1440     switch (buffer_len_) {
1441       case 1:
1442       case 0: {
1443         ok_ = false;
1444         return;
1445       }
1446     }
1447   }
DecodeStep19()1448   void DecodeStep19() {
1449     if (!RefillTo2()) {
1450       Done20();
1451       return;
1452     }
1453     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1454     const auto op = GetOp34(index);
1455     const int consumed = op & 3;
1456     buffer_len_ -= consumed;
1457     const auto emit_ofs = op >> 2;
1458     sink_(GetEmit34(index, emit_ofs + 0));
1459   }
Done20()1460   void Done20() {
1461     done_ = true;
1462     switch (buffer_len_) {
1463       case 1:
1464       case 0: {
1465         ok_ = false;
1466         return;
1467       }
1468     }
1469   }
DecodeStep20()1470   void DecodeStep20() {
1471     if (!RefillTo2()) {
1472       Done21();
1473       return;
1474     }
1475     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1476     const auto op = GetOp35(index);
1477     const int consumed = op & 3;
1478     buffer_len_ -= consumed;
1479     const auto emit_ofs = op >> 2;
1480     sink_(GetEmit35(index, emit_ofs + 0));
1481   }
Done21()1482   void Done21() {
1483     done_ = true;
1484     switch (buffer_len_) {
1485       case 1:
1486       case 0: {
1487         ok_ = false;
1488         return;
1489       }
1490     }
1491   }
DecodeStep21()1492   void DecodeStep21() {
1493     if (!RefillTo2()) {
1494       Done22();
1495       return;
1496     }
1497     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1498     const auto op = GetOp36(index);
1499     const int consumed = op & 3;
1500     buffer_len_ -= consumed;
1501     const auto emit_ofs = op >> 2;
1502     sink_(GetEmit36(index, emit_ofs + 0));
1503   }
Done22()1504   void Done22() {
1505     done_ = true;
1506     switch (buffer_len_) {
1507       case 1:
1508       case 0: {
1509         ok_ = false;
1510         return;
1511       }
1512     }
1513   }
DecodeStep22()1514   void DecodeStep22() {
1515     if (!RefillTo4()) {
1516       Done23();
1517       return;
1518     }
1519     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1520     const auto op = GetOp37(index);
1521     const int consumed = op & 7;
1522     buffer_len_ -= consumed;
1523     const auto emit_ofs = op >> 3;
1524     sink_(GetEmit37(index, emit_ofs + 0));
1525   }
RefillTo4()1526   bool RefillTo4() {
1527     switch (buffer_len_) {
1528       case 0: {
1529         return Read1to8Bytes();
1530       }
1531       case 1:
1532       case 2:
1533       case 3: {
1534         return Read1to7Bytes();
1535       }
1536     }
1537     return true;
1538   }
Done23()1539   void Done23() {
1540     done_ = true;
1541     switch (buffer_len_) {
1542       case 1:
1543       case 2:
1544       case 0: {
1545         ok_ = false;
1546         return;
1547       }
1548       case 3: {
1549         const auto index = buffer_ & 7;
1550         const auto op = GetOp38(index);
1551         switch (op & 1) {
1552           case 0: {
1553             sink_(GetEmit38(index, (op >> 1) + 0));
1554             break;
1555           }
1556           case 1: {
1557             ok_ = false;
1558             break;
1559           }
1560         }
1561         return;
1562       }
1563     }
1564   }
DecodeStep23()1565   void DecodeStep23() {
1566     if (!RefillTo3()) {
1567       Done24();
1568       return;
1569     }
1570     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1571     const auto op = GetOp39(index);
1572     const int consumed = op & 3;
1573     buffer_len_ -= consumed;
1574     const auto emit_ofs = op >> 2;
1575     sink_(GetEmit39(index, emit_ofs + 0));
1576   }
RefillTo3()1577   bool RefillTo3() {
1578     switch (buffer_len_) {
1579       case 0: {
1580         return Read1to8Bytes();
1581       }
1582       case 1:
1583       case 2: {
1584         return Read1to7Bytes();
1585       }
1586     }
1587     return true;
1588   }
Done24()1589   void Done24() {
1590     done_ = true;
1591     switch (buffer_len_) {
1592       case 1:
1593       case 0: {
1594         ok_ = false;
1595         return;
1596       }
1597       case 2: {
1598         const auto index = buffer_ & 3;
1599         const auto op = GetOp40(index);
1600         switch (op & 1) {
1601           case 0: {
1602             sink_(GetEmit40(index, (op >> 1) + 0));
1603             break;
1604           }
1605           case 1: {
1606             ok_ = false;
1607             break;
1608           }
1609         }
1610         return;
1611       }
1612     }
1613   }
DecodeStep24()1614   void DecodeStep24() {
1615     if (!RefillTo9()) {
1616       Done25();
1617       return;
1618     }
1619     const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
1620     const auto op = GetOp41(index);
1621     const int consumed = op & 15;
1622     buffer_len_ -= consumed;
1623     const auto emit_ofs = op >> 5;
1624     switch ((op >> 4) & 1) {
1625       case 0: {
1626         sink_(GetEmit41(index, emit_ofs + 0));
1627         break;
1628       }
1629       case 1: {
1630         begin_ = end_;
1631         buffer_len_ = 0;
1632         break;
1633       }
1634     }
1635   }
RefillTo9()1636   bool RefillTo9() {
1637     switch (buffer_len_) {
1638       case 0: {
1639         return Read2to8Bytes();
1640       }
1641       case 1:
1642       case 2:
1643       case 3:
1644       case 4:
1645       case 5:
1646       case 6:
1647       case 7:
1648       case 8: {
1649         return Read1to7Bytes();
1650       }
1651     }
1652     return true;
1653   }
Done25()1654   void Done25() {
1655     done_ = true;
1656     switch (end_ - begin_) {
1657       case 1: {
1658         Fill1();
1659         break;
1660       }
1661     }
1662     switch (buffer_len_) {
1663       case 1:
1664       case 2:
1665       case 3:
1666       case 4: {
1667         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1668         return;
1669       }
1670       case 5: {
1671         const auto index = buffer_ & 31;
1672         const auto op = GetOp42(index);
1673         switch (op & 3) {
1674           case 0: {
1675             sink_(GetEmit42(index, (op >> 2) + 0));
1676             break;
1677           }
1678           case 1: {
1679             ok_ = false;
1680             break;
1681           }
1682         }
1683         return;
1684       }
1685       case 6: {
1686         const auto index = buffer_ & 63;
1687         const auto op = GetOp43(index);
1688         switch (op & 3) {
1689           case 0: {
1690             ok_ = false;
1691             break;
1692           }
1693           case 1: {
1694             sink_(GetEmit43(index, (op >> 2) + 0));
1695             break;
1696           }
1697         }
1698         return;
1699       }
1700       case 7: {
1701         const auto index = buffer_ & 127;
1702         const auto op = GetOp44(index);
1703         switch (op & 3) {
1704           case 0: {
1705             ok_ = false;
1706             break;
1707           }
1708           case 1: {
1709             sink_(GetEmit44(index, (op >> 2) + 0));
1710             break;
1711           }
1712         }
1713         return;
1714       }
1715       case 8: {
1716         const auto index = buffer_ & 255;
1717         const auto op = GetOp45(index);
1718         switch (op & 3) {
1719           case 0: {
1720             ok_ = false;
1721             break;
1722           }
1723           case 1: {
1724             sink_(GetEmit45(index, (op >> 2) + 0));
1725             break;
1726           }
1727         }
1728         return;
1729       }
1730       case 0: {
1731         return;
1732       }
1733     }
1734   }
DecodeStep25()1735   void DecodeStep25() {
1736     if (!RefillTo2()) {
1737       Done26();
1738       return;
1739     }
1740     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1741     const auto op = GetOp46(index);
1742     const int consumed = op & 3;
1743     buffer_len_ -= consumed;
1744     const auto emit_ofs = op >> 2;
1745     sink_(GetEmit46(index, emit_ofs + 0));
1746   }
Done26()1747   void Done26() {
1748     done_ = true;
1749     switch (buffer_len_) {
1750       case 1: {
1751         const auto index = buffer_ & 1;
1752         const auto op = GetOp47(index);
1753         switch (op & 1) {
1754           case 0: {
1755             sink_(GetEmit47(index, (op >> 1) + 0));
1756             break;
1757           }
1758           case 1: {
1759             ok_ = false;
1760             break;
1761           }
1762         }
1763         return;
1764       }
1765       case 0: {
1766         ok_ = false;
1767         return;
1768       }
1769     }
1770   }
1771   F sink_;
1772   const uint8_t* begin_;
1773   const uint8_t* const end_;
1774   uint64_t buffer_ = 0;
1775   int buffer_len_ = 0;
1776   bool ok_ = true;
1777   bool done_ = false;
1778 };
1779 }  // namespace geometry_10_11_9
1780 }  // namespace grpc_core
1781 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_11_9_H
1782