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