xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_13_10_7.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_13_10_7_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_13_10_7_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_13_10_7 {
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   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp8(size_t i)60   static inline uint64_t GetOp8(size_t i) {
61     return table8_inner_[i >> 6][table8_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit8(size_t i,size_t emit)63   static inline uint64_t GetEmit8(size_t i, size_t emit) {
64     return table8_emit_[i >> 6][emit];
65   }
GetOp9(size_t i)66   static inline uint64_t GetOp9(size_t i) {
67     return table9_ops_[i >> 5][i & 0x1f];
68   }
GetEmit9(size_t i,size_t emit)69   static inline uint64_t GetEmit9(size_t i, size_t emit) {
70     return table9_emit_[i >> 5][emit];
71   }
GetOp1(size_t i)72   static inline uint64_t GetOp1(size_t i) {
73     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
74   }
GetEmit1(size_t i,size_t emit)75   static inline uint64_t GetEmit1(size_t i, size_t emit) {
76     return table1_emit_[i >> 6][emit];
77   }
GetOp10(size_t i)78   static inline uint64_t GetOp10(size_t i) { return i ? 3 : 1; }
GetEmit10(size_t,size_t emit)79   static inline uint64_t GetEmit10(size_t, size_t emit) {
80     return emit ? 125 : 94;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 1 ? (((void)emit, 60)) : ((emit - 1) ? 123 : 96));
87   }
GetOp13(size_t i)88   static inline uint64_t GetOp13(size_t i) {
89     return table13_0_inner_[table13_0_outer_[i]];
90   }
GetEmit13(size_t,size_t emit)91   static inline uint64_t GetEmit13(size_t, size_t emit) {
92     return (emit < 1 ? (((void)emit, 60)) : ((emit - 1) ? 123 : 96));
93   }
GetOp14(size_t i)94   static inline uint64_t GetOp14(size_t i) {
95     return table13_0_inner_[table14_0_outer_[i]];
96   }
GetEmit14(size_t,size_t emit)97   static inline uint64_t GetEmit14(size_t, size_t emit) {
98     return (emit < 1 ? (((void)emit, 60)) : ((emit - 1) ? 123 : 96));
99   }
GetOp15(size_t i)100   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)101   static inline uint64_t GetEmit15(size_t, size_t emit) {
102     return (emit < 1 ? (((void)emit, 60)) : ((emit - 1) ? 123 : 96));
103   }
GetOp16(size_t i)104   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)105   static inline uint64_t GetEmit16(size_t, size_t emit) {
106     return table16_0_emit_[emit];
107   }
GetOp17(size_t i)108   static inline uint64_t GetOp17(size_t i) {
109     return table17_ops_[i >> 5][i & 0x1f];
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 >> 5][emit];
113   }
GetOp18(size_t i)114   static inline uint64_t GetOp18(size_t i) {
115     return table18_ops_[i >> 6][i & 0x3f];
116   }
GetEmit18(size_t i,size_t emit)117   static inline uint64_t GetEmit18(size_t i, size_t emit) {
118     return table18_emit_[i >> 6][emit];
119   }
GetOp19(size_t i)120   static inline uint64_t GetOp19(size_t i) {
121     return table19_ops_[i >> 7][i & 0x7f];
122   }
GetEmit19(size_t i,size_t emit)123   static inline uint64_t GetEmit19(size_t i, size_t emit) {
124     return table19_emit_[i >> 7][emit];
125   }
GetOp11(size_t i)126   static inline uint64_t GetOp11(size_t i) {
127     return table11_ops_[i >> 7][i & 0x7f];
128   }
GetEmit11(size_t i,size_t emit)129   static inline uint64_t GetEmit11(size_t i, size_t emit) {
130     return table11_emit_[i >> 7][emit];
131   }
GetOp20(size_t i)132   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)133   static inline uint64_t GetEmit20(size_t, size_t emit) {
134     return emit ? 142 : 9;
135   }
GetOp21(size_t i)136   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)137   static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 144; }
GetOp22(size_t i)138   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)139   static inline uint64_t GetEmit22(size_t, size_t emit) {
140     return emit ? 159 : 148;
141   }
GetOp23(size_t i)142   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)143   static inline uint64_t GetEmit23(size_t, size_t emit) {
144     return emit ? 206 : 171;
145   }
GetOp24(size_t i)146   static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; }
GetEmit24(size_t,size_t emit)147   static inline uint64_t GetEmit24(size_t, size_t emit) {
148     return emit ? 225 : 215;
149   }
GetOp25(size_t i)150   static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; }
GetEmit25(size_t,size_t emit)151   static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 236; }
GetOp26(size_t i)152   static inline uint64_t GetOp26(size_t i) {
153     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
154   }
GetEmit26(size_t,size_t emit)155   static inline uint64_t GetEmit26(size_t, size_t emit) {
156     return (emit < 2 ? (emit ? 207 : 199) : ((emit - 2) + 234));
157   }
GetOp27(size_t i)158   static inline uint64_t GetOp27(size_t i) { return table27_0_inner_[i]; }
GetEmit27(size_t,size_t emit)159   static inline uint64_t GetEmit27(size_t, size_t emit) {
160     return table27_0_emit_[emit];
161   }
GetOp28(size_t i)162   static inline uint64_t GetOp28(size_t i) { return table28_0_inner_[i]; }
GetEmit28(size_t,size_t emit)163   static inline uint64_t GetEmit28(size_t, size_t emit) {
164     return table28_0_emit_[emit];
165   }
GetOp30(size_t i)166   static inline uint64_t GetOp30(size_t i) {
167     return (i < 1 ? (((void)i, 0)) : ((i - 1) / 14 + 1));
168   }
GetEmit30(size_t,size_t emit)169   static inline uint64_t GetEmit30(size_t, size_t emit) {
170     return ((void)emit, 254);
171   }
GetOp31(size_t i)172   static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; }
GetEmit31(size_t,size_t emit)173   static inline uint64_t GetEmit31(size_t, size_t emit) {
174     return table31_0_emit_[emit];
175   }
GetOp32(size_t i)176   static inline uint64_t GetOp32(size_t i) { return table32_0_ops_[i]; }
GetEmit32(size_t,size_t emit)177   static inline uint64_t GetEmit32(size_t, size_t emit) {
178     return table31_0_emit_[emit];
179   }
GetOp29(size_t i)180   static inline uint64_t GetOp29(size_t i) {
181     return table29_ops_[i >> 5][i & 0x1f];
182   }
GetEmit29(size_t i,size_t emit)183   static inline uint64_t GetEmit29(size_t i, size_t emit) {
184     return table29_emit_[i >> 5][emit];
185   }
GetOp34(size_t i)186   static inline uint64_t GetOp34(size_t i) { return table34_0_inner_[i]; }
GetEmit34(size_t,size_t emit)187   static inline uint64_t GetEmit34(size_t, size_t emit) {
188     return table34_0_emit_[emit];
189   }
GetOp33(size_t i)190   static inline uint64_t GetOp33(size_t i) {
191     return table33_0_inner_[(i < 13 ? (i / 2 + 0) : ((i - 13) + 6))];
192   }
GetEmit33(size_t,size_t emit)193   static inline uint64_t GetEmit33(size_t, size_t emit) {
194     return table33_0_emit_[emit];
195   }
196 
197  private:
198   static const uint8_t table2_0_emit_[10];
199   static const uint8_t table2_0_ops_[32];
200   static const uint8_t table3_0_emit_[36];
201   static const uint8_t table3_0_ops_[64];
202   static const uint8_t table4_0_emit_[22];
203   static const uint8_t table4_0_ops_[64];
204   static const uint8_t table4_1_emit_[46];
205   static const uint8_t table4_1_ops_[64];
206   static const uint8_t* const table4_emit_[2];
207   static const uint8_t* const table4_ops_[2];
208   static const uint8_t table5_0_ops_[128];
209   static const uint8_t table5_1_emit_[52];
210   static const uint8_t table5_1_ops_[128];
211   static const uint8_t* const table5_emit_[2];
212   static const uint8_t* const table5_ops_[2];
213   static const uint8_t table6_0_emit_[2];
214   static const uint8_t table6_0_ops_[32];
215   static const uint8_t table6_1_emit_[2];
216   static const uint8_t table6_2_emit_[2];
217   static const uint8_t table6_3_emit_[2];
218   static const uint8_t table6_4_emit_[2];
219   static const uint8_t table6_5_emit_[4];
220   static const uint8_t table6_5_ops_[32];
221   static const uint8_t table6_6_emit_[4];
222   static const uint8_t table6_7_emit_[4];
223   static const uint8_t table6_8_emit_[4];
224   static const uint8_t table6_9_emit_[4];
225   static const uint8_t table6_10_emit_[4];
226   static const uint8_t table6_11_emit_[6];
227   static const uint8_t table6_11_ops_[32];
228   static const uint8_t table6_12_emit_[8];
229   static const uint8_t table6_12_ops_[32];
230   static const uint8_t table6_13_emit_[8];
231   static const uint8_t table6_14_emit_[8];
232   static const uint8_t table6_15_emit_[10];
233   static const uint8_t table6_15_ops_[32];
234   static const uint8_t* const table6_emit_[16];
235   static const uint8_t* const table6_ops_[16];
236   static const uint8_t table7_0_emit_[36];
237   static const uint8_t table7_0_ops_[64];
238   static const uint8_t table7_1_emit_[36];
239   static const uint8_t table7_1_ops_[64];
240   static const uint8_t table7_2_emit_[36];
241   static const uint8_t table7_2_ops_[64];
242   static const uint8_t table7_3_emit_[36];
243   static const uint8_t table7_3_ops_[64];
244   static const uint8_t table7_4_emit_[38];
245   static const uint8_t table7_4_ops_[64];
246   static const uint8_t table7_5_ops_[64];
247   static const uint8_t table7_11_ops_[64];
248   static const uint8_t table7_12_ops_[64];
249   static const uint8_t table7_15_emit_[15];
250   static const uint8_t table7_15_ops_[64];
251   static const uint8_t* const table7_emit_[16];
252   static const uint8_t* const table7_ops_[16];
253   static const uint8_t table8_0_emit_[71];
254   static const uint16_t table8_0_inner_[38];
255   static const uint8_t table8_0_outer_[64];
256   static const uint8_t table8_1_emit_[71];
257   static const uint16_t table8_1_inner_[38];
258   static const uint8_t table8_2_emit_[71];
259   static const uint16_t table8_2_inner_[38];
260   static const uint8_t table8_3_emit_[71];
261   static const uint16_t table8_3_inner_[38];
262   static const uint8_t table8_4_emit_[71];
263   static const uint16_t table8_4_inner_[38];
264   static const uint8_t table8_5_emit_[71];
265   static const uint16_t table8_5_inner_[38];
266   static const uint8_t table8_6_emit_[71];
267   static const uint16_t table8_6_inner_[38];
268   static const uint8_t table8_7_emit_[71];
269   static const uint16_t table8_7_inner_[38];
270   static const uint8_t table8_8_emit_[71];
271   static const uint16_t table8_8_inner_[38];
272   static const uint8_t table8_9_emit_[71];
273   static const uint16_t table8_9_inner_[38];
274   static const uint8_t table8_10_emit_[40];
275   static const uint16_t table8_10_inner_[23];
276   static const uint8_t table8_10_outer_[64];
277   static const uint8_t table8_11_emit_[40];
278   static const uint8_t table8_12_emit_[40];
279   static const uint8_t table8_13_emit_[40];
280   static const uint8_t table8_14_emit_[40];
281   static const uint8_t table8_15_emit_[40];
282   static const uint8_t table8_16_emit_[40];
283   static const uint8_t table8_17_emit_[40];
284   static const uint8_t table8_18_emit_[40];
285   static const uint8_t table8_19_emit_[40];
286   static const uint8_t table8_20_emit_[40];
287   static const uint8_t table8_21_emit_[40];
288   static const uint8_t table8_22_emit_[40];
289   static const uint8_t table8_23_emit_[4];
290   static const uint16_t table8_23_inner_[5];
291   static const uint8_t table8_23_outer_[64];
292   static const uint8_t table8_24_emit_[4];
293   static const uint8_t table8_25_emit_[4];
294   static const uint8_t table8_26_emit_[4];
295   static const uint8_t table8_27_emit_[4];
296   static const uint8_t table8_28_emit_[4];
297   static const uint8_t table8_29_emit_[4];
298   static const uint8_t table8_30_emit_[4];
299   static const uint8_t table8_31_emit_[14];
300   static const uint16_t table8_31_inner_[16];
301   static const uint8_t table8_31_outer_[64];
302   static const uint8_t* const table8_emit_[32];
303   static const uint16_t* const table8_inner_[32];
304   static const uint8_t* const table8_outer_[32];
305   static const uint8_t table9_0_emit_[15];
306   static const uint8_t table9_0_ops_[32];
307   static const uint8_t table9_1_emit_[28];
308   static const uint8_t table9_1_ops_[32];
309   static const uint8_t table9_2_emit_[36];
310   static const uint8_t table9_2_ops_[32];
311   static const uint8_t table9_3_emit_[56];
312   static const uint8_t table9_3_ops_[32];
313   static const uint8_t table9_4_emit_[15];
314   static const uint8_t table9_4_ops_[32];
315   static const uint8_t table9_5_emit_[28];
316   static const uint8_t table9_6_emit_[36];
317   static const uint8_t table9_7_emit_[56];
318   static const uint8_t table9_8_emit_[15];
319   static const uint8_t table9_8_ops_[32];
320   static const uint8_t table9_9_emit_[28];
321   static const uint8_t table9_10_emit_[36];
322   static const uint8_t table9_11_emit_[56];
323   static const uint8_t table9_12_emit_[15];
324   static const uint8_t table9_12_ops_[32];
325   static const uint8_t table9_13_emit_[28];
326   static const uint8_t table9_14_emit_[36];
327   static const uint8_t table9_15_emit_[56];
328   static const uint8_t table9_16_emit_[15];
329   static const uint8_t table9_16_ops_[32];
330   static const uint8_t table9_17_emit_[28];
331   static const uint8_t table9_18_emit_[36];
332   static const uint8_t table9_19_emit_[56];
333   static const uint8_t table9_20_emit_[15];
334   static const uint8_t table9_20_ops_[32];
335   static const uint8_t table9_21_emit_[28];
336   static const uint8_t table9_22_emit_[36];
337   static const uint8_t table9_23_emit_[56];
338   static const uint8_t table9_24_emit_[15];
339   static const uint8_t table9_24_ops_[32];
340   static const uint8_t table9_25_emit_[28];
341   static const uint8_t table9_26_emit_[36];
342   static const uint8_t table9_27_emit_[56];
343   static const uint8_t table9_28_emit_[16];
344   static const uint8_t table9_28_ops_[32];
345   static const uint8_t table9_29_emit_[28];
346   static const uint8_t table9_30_emit_[36];
347   static const uint8_t table9_31_emit_[56];
348   static const uint8_t table9_32_emit_[16];
349   static const uint8_t table9_33_emit_[27];
350   static const uint8_t table9_33_ops_[32];
351   static const uint8_t table9_34_emit_[36];
352   static const uint8_t table9_35_emit_[56];
353   static const uint8_t table9_36_emit_[16];
354   static const uint8_t table9_37_emit_[27];
355   static const uint8_t table9_37_ops_[32];
356   static const uint8_t table9_38_emit_[36];
357   static const uint8_t table9_39_emit_[56];
358   static const uint8_t table9_40_emit_[43];
359   static const uint8_t table9_40_ops_[32];
360   static const uint8_t table9_41_emit_[28];
361   static const uint8_t table9_41_ops_[32];
362   static const uint8_t table9_42_emit_[43];
363   static const uint8_t table9_42_ops_[32];
364   static const uint8_t table9_43_emit_[28];
365   static const uint8_t table9_44_emit_[43];
366   static const uint8_t table9_44_ops_[32];
367   static const uint8_t table9_45_emit_[28];
368   static const uint8_t table9_46_emit_[43];
369   static const uint8_t table9_46_ops_[32];
370   static const uint8_t table9_47_emit_[28];
371   static const uint8_t table9_48_emit_[43];
372   static const uint8_t table9_48_ops_[32];
373   static const uint8_t table9_49_emit_[28];
374   static const uint8_t table9_50_emit_[43];
375   static const uint8_t table9_50_ops_[32];
376   static const uint8_t table9_51_emit_[28];
377   static const uint8_t table9_52_emit_[43];
378   static const uint8_t table9_52_ops_[32];
379   static const uint8_t table9_53_emit_[28];
380   static const uint8_t table9_54_emit_[43];
381   static const uint8_t table9_54_ops_[32];
382   static const uint8_t table9_55_emit_[28];
383   static const uint8_t table9_56_emit_[43];
384   static const uint8_t table9_56_ops_[32];
385   static const uint8_t table9_57_emit_[28];
386   static const uint8_t table9_58_emit_[43];
387   static const uint8_t table9_58_ops_[32];
388   static const uint8_t table9_59_emit_[28];
389   static const uint8_t table9_60_emit_[43];
390   static const uint8_t table9_60_ops_[32];
391   static const uint8_t table9_61_emit_[28];
392   static const uint8_t table9_62_emit_[44];
393   static const uint8_t table9_62_ops_[32];
394   static const uint8_t table9_63_emit_[28];
395   static const uint8_t table9_64_emit_[44];
396   static const uint8_t table9_65_emit_[27];
397   static const uint8_t table9_65_ops_[32];
398   static const uint8_t table9_66_emit_[44];
399   static const uint8_t table9_67_emit_[27];
400   static const uint8_t table9_67_ops_[32];
401   static const uint8_t table9_68_emit_[44];
402   static const uint8_t table9_69_emit_[27];
403   static const uint8_t table9_69_ops_[32];
404   static const uint8_t table9_70_emit_[44];
405   static const uint8_t table9_71_emit_[27];
406   static const uint8_t table9_71_ops_[32];
407   static const uint8_t table9_72_emit_[44];
408   static const uint8_t table9_73_emit_[27];
409   static const uint8_t table9_73_ops_[32];
410   static const uint8_t table9_74_emit_[44];
411   static const uint8_t table9_75_emit_[27];
412   static const uint8_t table9_75_ops_[32];
413   static const uint8_t table9_76_emit_[44];
414   static const uint8_t table9_77_emit_[27];
415   static const uint8_t table9_77_ops_[32];
416   static const uint8_t table9_78_emit_[44];
417   static const uint8_t table9_79_emit_[27];
418   static const uint8_t table9_79_ops_[32];
419   static const uint8_t table9_80_emit_[44];
420   static const uint8_t table9_81_emit_[27];
421   static const uint8_t table9_81_ops_[32];
422   static const uint8_t table9_82_emit_[44];
423   static const uint8_t table9_83_emit_[27];
424   static const uint8_t table9_83_ops_[32];
425   static const uint8_t table9_84_emit_[44];
426   static const uint8_t table9_85_emit_[27];
427   static const uint8_t table9_85_ops_[32];
428   static const uint8_t table9_86_emit_[44];
429   static const uint8_t table9_87_emit_[27];
430   static const uint8_t table9_87_ops_[32];
431   static const uint8_t table9_88_emit_[44];
432   static const uint8_t table9_89_emit_[27];
433   static const uint8_t table9_89_ops_[32];
434   static const uint8_t table9_90_emit_[44];
435   static const uint8_t table9_91_emit_[28];
436   static const uint8_t table9_92_emit_[20];
437   static const uint8_t table9_92_ops_[32];
438   static const uint8_t table9_93_emit_[20];
439   static const uint8_t table9_94_emit_[20];
440   static const uint8_t table9_95_emit_[20];
441   static const uint8_t table9_96_emit_[20];
442   static const uint8_t table9_97_emit_[20];
443   static const uint8_t table9_98_emit_[20];
444   static const uint8_t table9_99_emit_[20];
445   static const uint8_t table9_100_emit_[20];
446   static const uint8_t table9_101_emit_[20];
447   static const uint8_t table9_102_emit_[20];
448   static const uint8_t table9_103_emit_[20];
449   static const uint8_t table9_104_emit_[20];
450   static const uint8_t table9_105_emit_[20];
451   static const uint8_t table9_106_emit_[20];
452   static const uint8_t table9_107_emit_[20];
453   static const uint8_t table9_108_emit_[20];
454   static const uint8_t table9_109_emit_[20];
455   static const uint8_t table9_110_emit_[20];
456   static const uint8_t table9_111_emit_[20];
457   static const uint8_t table9_112_emit_[20];
458   static const uint8_t table9_113_emit_[20];
459   static const uint8_t table9_114_emit_[20];
460   static const uint8_t table9_115_emit_[20];
461   static const uint8_t table9_116_emit_[20];
462   static const uint8_t table9_117_emit_[20];
463   static const uint8_t table9_118_emit_[20];
464   static const uint8_t table9_119_emit_[20];
465   static const uint8_t table9_120_emit_[20];
466   static const uint8_t table9_121_emit_[20];
467   static const uint8_t table9_122_emit_[20];
468   static const uint8_t table9_123_emit_[20];
469   static const uint8_t table9_124_emit_[2];
470   static const uint8_t table9_124_ops_[32];
471   static const uint8_t table9_125_emit_[2];
472   static const uint8_t table9_126_emit_[2];
473   static const uint8_t table9_127_emit_[10];
474   static const uint8_t table9_127_ops_[32];
475   static const uint8_t* const table9_emit_[128];
476   static const uint8_t* const table9_ops_[128];
477   static const uint16_t table1_0_inner_[8];
478   static const uint8_t table1_0_outer_[64];
479   static const uint16_t table1_1_inner_[14];
480   static const uint8_t table1_1_outer_[64];
481   static const uint16_t table1_2_inner_[18];
482   static const uint8_t table1_2_outer_[64];
483   static const uint8_t table1_3_emit_[68];
484   static const uint16_t table1_3_inner_[35];
485   static const uint8_t table1_3_outer_[64];
486   static const uint16_t table1_4_inner_[8];
487   static const uint8_t table1_7_emit_[68];
488   static const uint16_t table1_8_inner_[8];
489   static const uint8_t table1_11_emit_[68];
490   static const uint16_t table1_12_inner_[8];
491   static const uint8_t table1_15_emit_[68];
492   static const uint16_t table1_16_inner_[8];
493   static const uint8_t table1_19_emit_[68];
494   static const uint16_t table1_20_inner_[8];
495   static const uint8_t table1_23_emit_[68];
496   static const uint16_t table1_24_inner_[8];
497   static const uint8_t table1_27_emit_[68];
498   static const uint16_t table1_28_inner_[8];
499   static const uint8_t table1_31_emit_[68];
500   static const uint16_t table1_33_inner_[14];
501   static const uint8_t table1_35_emit_[68];
502   static const uint16_t table1_37_inner_[14];
503   static const uint8_t table1_39_emit_[68];
504   static const uint16_t table1_40_inner_[22];
505   static const uint8_t table1_40_outer_[64];
506   static const uint8_t table1_41_emit_[92];
507   static const uint16_t table1_41_inner_[47];
508   static const uint8_t table1_41_outer_[64];
509   static const uint16_t table1_42_inner_[22];
510   static const uint8_t table1_43_emit_[92];
511   static const uint16_t table1_44_inner_[22];
512   static const uint8_t table1_45_emit_[92];
513   static const uint16_t table1_46_inner_[22];
514   static const uint8_t table1_47_emit_[92];
515   static const uint16_t table1_48_inner_[22];
516   static const uint8_t table1_49_emit_[92];
517   static const uint16_t table1_50_inner_[22];
518   static const uint8_t table1_51_emit_[92];
519   static const uint16_t table1_52_inner_[22];
520   static const uint8_t table1_53_emit_[92];
521   static const uint16_t table1_54_inner_[22];
522   static const uint8_t table1_55_emit_[92];
523   static const uint16_t table1_56_inner_[22];
524   static const uint8_t table1_57_emit_[92];
525   static const uint16_t table1_58_inner_[22];
526   static const uint8_t table1_59_emit_[92];
527   static const uint16_t table1_60_inner_[22];
528   static const uint8_t table1_61_emit_[92];
529   static const uint16_t table1_62_inner_[22];
530   static const uint8_t table1_63_emit_[92];
531   static const uint8_t table1_65_emit_[91];
532   static const uint16_t table1_65_inner_[47];
533   static const uint8_t table1_67_emit_[91];
534   static const uint16_t table1_67_inner_[47];
535   static const uint8_t table1_69_emit_[91];
536   static const uint16_t table1_69_inner_[47];
537   static const uint8_t table1_71_emit_[91];
538   static const uint16_t table1_71_inner_[47];
539   static const uint8_t table1_73_emit_[91];
540   static const uint16_t table1_73_inner_[47];
541   static const uint8_t table1_75_emit_[91];
542   static const uint16_t table1_75_inner_[47];
543   static const uint8_t table1_77_emit_[91];
544   static const uint16_t table1_77_inner_[47];
545   static const uint8_t table1_79_emit_[91];
546   static const uint16_t table1_79_inner_[47];
547   static const uint8_t table1_81_emit_[91];
548   static const uint16_t table1_81_inner_[47];
549   static const uint8_t table1_83_emit_[91];
550   static const uint16_t table1_83_inner_[47];
551   static const uint8_t table1_85_emit_[91];
552   static const uint16_t table1_85_inner_[47];
553   static const uint8_t table1_87_emit_[91];
554   static const uint16_t table1_87_inner_[47];
555   static const uint8_t table1_89_emit_[91];
556   static const uint16_t table1_89_inner_[47];
557   static const uint8_t table1_91_emit_[91];
558   static const uint16_t table1_91_inner_[47];
559   static const uint8_t table1_92_emit_[72];
560   static const uint16_t table1_92_inner_[37];
561   static const uint8_t table1_92_outer_[64];
562   static const uint8_t table1_93_emit_[72];
563   static const uint8_t table1_94_emit_[72];
564   static const uint8_t table1_95_emit_[72];
565   static const uint8_t table1_96_emit_[72];
566   static const uint8_t table1_97_emit_[72];
567   static const uint8_t table1_98_emit_[72];
568   static const uint8_t table1_99_emit_[72];
569   static const uint8_t table1_100_emit_[72];
570   static const uint8_t table1_101_emit_[72];
571   static const uint8_t table1_102_emit_[72];
572   static const uint8_t table1_103_emit_[72];
573   static const uint8_t table1_104_emit_[72];
574   static const uint8_t table1_105_emit_[72];
575   static const uint8_t table1_106_emit_[72];
576   static const uint8_t table1_107_emit_[72];
577   static const uint8_t table1_108_emit_[72];
578   static const uint8_t table1_109_emit_[72];
579   static const uint8_t table1_110_emit_[72];
580   static const uint8_t table1_111_emit_[72];
581   static const uint8_t table1_112_emit_[72];
582   static const uint8_t table1_113_emit_[72];
583   static const uint8_t table1_114_emit_[72];
584   static const uint8_t table1_115_emit_[72];
585   static const uint8_t table1_116_emit_[72];
586   static const uint8_t table1_117_emit_[72];
587   static const uint8_t table1_118_emit_[72];
588   static const uint8_t table1_119_emit_[72];
589   static const uint8_t table1_120_emit_[72];
590   static const uint8_t table1_121_emit_[72];
591   static const uint8_t table1_122_emit_[72];
592   static const uint8_t table1_123_emit_[72];
593   static const uint8_t table1_124_emit_[40];
594   static const uint16_t table1_124_inner_[22];
595   static const uint8_t table1_124_outer_[64];
596   static const uint8_t table1_125_emit_[40];
597   static const uint8_t table1_126_emit_[40];
598   static const uint8_t table1_127_emit_[16];
599   static const uint16_t table1_127_inner_[18];
600   static const uint8_t table1_127_outer_[64];
601   static const uint8_t* const table1_emit_[128];
602   static const uint16_t* const table1_inner_[128];
603   static const uint8_t* const table1_outer_[128];
604   static const uint8_t table13_0_inner_[5];
605   static const uint8_t table13_0_outer_[8];
606   static const uint8_t table14_0_outer_[16];
607   static const uint8_t table15_0_ops_[32];
608   static const uint8_t table16_0_emit_[6];
609   static const uint8_t table16_0_ops_[64];
610   static const uint8_t table17_0_emit_[20];
611   static const uint8_t table17_0_ops_[32];
612   static const uint8_t table17_1_emit_[20];
613   static const uint8_t table17_2_emit_[20];
614   static const uint8_t table17_3_emit_[11];
615   static const uint8_t table17_3_ops_[32];
616   static const uint8_t* const table17_emit_[4];
617   static const uint8_t* const table17_ops_[4];
618   static const uint8_t table18_0_emit_[72];
619   static const uint16_t table18_0_ops_[64];
620   static const uint8_t table18_1_emit_[72];
621   static const uint8_t table18_2_emit_[72];
622   static const uint8_t table18_3_emit_[24];
623   static const uint16_t table18_3_ops_[64];
624   static const uint8_t* const table18_emit_[4];
625   static const uint16_t* const table18_ops_[4];
626   static const uint8_t table19_0_emit_[136];
627   static const uint16_t table19_0_ops_[128];
628   static const uint8_t table19_1_emit_[136];
629   static const uint8_t table19_2_emit_[136];
630   static const uint8_t table19_3_emit_[50];
631   static const uint16_t table19_3_ops_[128];
632   static const uint8_t* const table19_emit_[4];
633   static const uint16_t* const table19_ops_[4];
634   static const uint8_t table11_0_emit_[1];
635   static const uint16_t table11_0_ops_[128];
636   static const uint8_t table11_2_emit_[1];
637   static const uint8_t table11_4_emit_[1];
638   static const uint8_t table11_6_emit_[15];
639   static const uint16_t table11_6_ops_[128];
640   static const uint8_t table11_7_emit_[64];
641   static const uint16_t table11_7_ops_[128];
642   static const uint8_t* const table11_emit_[8];
643   static const uint16_t* const table11_ops_[8];
644   static const uint8_t table27_0_emit_[8];
645   static const uint8_t table27_0_inner_[8];
646   static const uint8_t table28_0_emit_[16];
647   static const uint8_t table28_0_inner_[16];
648   static const uint8_t table31_0_emit_[30];
649   static const uint8_t table31_0_ops_[32];
650   static const uint8_t table32_0_ops_[64];
651   static const uint8_t table29_0_emit_[7];
652   static const uint8_t table29_0_ops_[32];
653   static const uint8_t table29_1_emit_[8];
654   static const uint8_t table29_1_ops_[32];
655   static const uint8_t table29_2_emit_[8];
656   static const uint8_t table29_3_emit_[10];
657   static const uint8_t table29_3_ops_[32];
658   static const uint8_t* const table29_emit_[4];
659   static const uint8_t* const table29_ops_[4];
660   static const uint8_t table34_0_emit_[7];
661   static const uint8_t table34_0_inner_[8];
662   static const uint8_t table33_0_emit_[9];
663   static const uint8_t table33_0_inner_[9];
664 };
665 template <typename F>
666 class HuffDecoder : public HuffDecoderCommon {
667  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)668   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
669       : sink_(sink), begin_(begin), end_(end) {}
Run()670   bool Run() {
671     while (!done_) {
672       if (!RefillTo13()) {
673         Done0();
674         break;
675       }
676       const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
677       const auto op = GetOp1(index);
678       const int consumed = op & 15;
679       buffer_len_ -= consumed;
680       const auto emit_ofs = op >> 6;
681       switch ((op >> 4) & 3) {
682         case 0: {
683           sink_(GetEmit1(index, emit_ofs + 0));
684           sink_(GetEmit1(index, emit_ofs + 1));
685           break;
686         }
687         case 1: {
688           sink_(GetEmit1(index, emit_ofs + 0));
689           break;
690         }
691         case 2: {
692           DecodeStep0();
693           break;
694         }
695         case 3: {
696           DecodeStep1();
697           break;
698         }
699       }
700     }
701     return ok_;
702   }
703 
704  private:
RefillTo13()705   bool RefillTo13() {
706     switch (buffer_len_) {
707       case 0: {
708         return Read2to8Bytes();
709       }
710       case 1:
711       case 2:
712       case 3:
713       case 4: {
714         return Read2to7Bytes();
715       }
716       case 5:
717       case 6:
718       case 7:
719       case 8: {
720         return Read1to7Bytes();
721       }
722       case 9:
723       case 10:
724       case 11:
725       case 12: {
726         return Read1to6Bytes();
727       }
728     }
729     return true;
730   }
Read2to8Bytes()731   bool Read2to8Bytes() {
732     switch (end_ - begin_) {
733       case 0:
734       case 1: {
735         return false;
736       }
737       case 2: {
738         Fill2();
739         return true;
740       }
741       case 3: {
742         Fill3();
743         return true;
744       }
745       case 4: {
746         Fill4();
747         return true;
748       }
749       case 5: {
750         Fill5();
751         return true;
752       }
753       case 6: {
754         Fill6();
755         return true;
756       }
757       case 7: {
758         Fill7();
759         return true;
760       }
761       default: {
762         Fill8();
763         return true;
764       }
765     }
766   }
Fill2()767   void Fill2() {
768     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
769               (static_cast<uint64_t>(begin_[1]) << 0);
770     begin_ += 2;
771     buffer_len_ += 16;
772   }
Fill3()773   void Fill3() {
774     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
775               (static_cast<uint64_t>(begin_[1]) << 8) |
776               (static_cast<uint64_t>(begin_[2]) << 0);
777     begin_ += 3;
778     buffer_len_ += 24;
779   }
Fill4()780   void Fill4() {
781     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
782               (static_cast<uint64_t>(begin_[1]) << 16) |
783               (static_cast<uint64_t>(begin_[2]) << 8) |
784               (static_cast<uint64_t>(begin_[3]) << 0);
785     begin_ += 4;
786     buffer_len_ += 32;
787   }
Fill5()788   void Fill5() {
789     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
790               (static_cast<uint64_t>(begin_[1]) << 24) |
791               (static_cast<uint64_t>(begin_[2]) << 16) |
792               (static_cast<uint64_t>(begin_[3]) << 8) |
793               (static_cast<uint64_t>(begin_[4]) << 0);
794     begin_ += 5;
795     buffer_len_ += 40;
796   }
Fill6()797   void Fill6() {
798     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
799               (static_cast<uint64_t>(begin_[1]) << 32) |
800               (static_cast<uint64_t>(begin_[2]) << 24) |
801               (static_cast<uint64_t>(begin_[3]) << 16) |
802               (static_cast<uint64_t>(begin_[4]) << 8) |
803               (static_cast<uint64_t>(begin_[5]) << 0);
804     begin_ += 6;
805     buffer_len_ += 48;
806   }
Fill7()807   void Fill7() {
808     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
809               (static_cast<uint64_t>(begin_[1]) << 40) |
810               (static_cast<uint64_t>(begin_[2]) << 32) |
811               (static_cast<uint64_t>(begin_[3]) << 24) |
812               (static_cast<uint64_t>(begin_[4]) << 16) |
813               (static_cast<uint64_t>(begin_[5]) << 8) |
814               (static_cast<uint64_t>(begin_[6]) << 0);
815     begin_ += 7;
816     buffer_len_ += 56;
817   }
Fill8()818   void Fill8() {
819     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
820               (static_cast<uint64_t>(begin_[1]) << 48) |
821               (static_cast<uint64_t>(begin_[2]) << 40) |
822               (static_cast<uint64_t>(begin_[3]) << 32) |
823               (static_cast<uint64_t>(begin_[4]) << 24) |
824               (static_cast<uint64_t>(begin_[5]) << 16) |
825               (static_cast<uint64_t>(begin_[6]) << 8) |
826               (static_cast<uint64_t>(begin_[7]) << 0);
827     begin_ += 8;
828     buffer_len_ += 64;
829   }
Read2to7Bytes()830   bool Read2to7Bytes() {
831     switch (end_ - begin_) {
832       case 0:
833       case 1: {
834         return false;
835       }
836       case 2: {
837         Fill2();
838         return true;
839       }
840       case 3: {
841         Fill3();
842         return true;
843       }
844       case 4: {
845         Fill4();
846         return true;
847       }
848       case 5: {
849         Fill5();
850         return true;
851       }
852       case 6: {
853         Fill6();
854         return true;
855       }
856       default: {
857         Fill7();
858         return true;
859       }
860     }
861   }
Read1to7Bytes()862   bool Read1to7Bytes() {
863     switch (end_ - begin_) {
864       case 0: {
865         return false;
866       }
867       case 1: {
868         Fill1();
869         return true;
870       }
871       case 2: {
872         Fill2();
873         return true;
874       }
875       case 3: {
876         Fill3();
877         return true;
878       }
879       case 4: {
880         Fill4();
881         return true;
882       }
883       case 5: {
884         Fill5();
885         return true;
886       }
887       case 6: {
888         Fill6();
889         return true;
890       }
891       default: {
892         Fill7();
893         return true;
894       }
895     }
896   }
Fill1()897   void Fill1() {
898     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
899     begin_ += 1;
900     buffer_len_ += 8;
901   }
Read1to6Bytes()902   bool Read1to6Bytes() {
903     switch (end_ - begin_) {
904       case 0: {
905         return false;
906       }
907       case 1: {
908         Fill1();
909         return true;
910       }
911       case 2: {
912         Fill2();
913         return true;
914       }
915       case 3: {
916         Fill3();
917         return true;
918       }
919       case 4: {
920         Fill4();
921         return true;
922       }
923       case 5: {
924         Fill5();
925         return true;
926       }
927       default: {
928         Fill6();
929         return true;
930       }
931     }
932   }
Done0()933   void Done0() {
934     done_ = true;
935     switch (end_ - begin_) {
936       case 1: {
937         Fill1();
938         break;
939       }
940     }
941     switch (buffer_len_) {
942       case 1:
943       case 2:
944       case 3:
945       case 4: {
946         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
947         return;
948       }
949       case 5: {
950         const auto index = buffer_ & 31;
951         const auto op = GetOp2(index);
952         switch (op & 3) {
953           case 0: {
954             sink_(GetEmit2(index, (op >> 2) + 0));
955             break;
956           }
957           case 1: {
958             ok_ = false;
959             break;
960           }
961         }
962         return;
963       }
964       case 6: {
965         const auto index = buffer_ & 63;
966         const auto op = GetOp3(index);
967         switch (op & 3) {
968           case 0: {
969             ok_ = false;
970             break;
971           }
972           case 1: {
973             sink_(GetEmit3(index, (op >> 2) + 0));
974             break;
975           }
976         }
977         return;
978       }
979       case 7: {
980         const auto index = buffer_ & 127;
981         const auto op = GetOp4(index);
982         switch (op & 3) {
983           case 0: {
984             ok_ = false;
985             break;
986           }
987           case 1: {
988             sink_(GetEmit4(index, (op >> 2) + 0));
989             break;
990           }
991         }
992         return;
993       }
994       case 8: {
995         const auto index = buffer_ & 255;
996         const auto op = GetOp5(index);
997         switch (op & 3) {
998           case 0: {
999             ok_ = false;
1000             break;
1001           }
1002           case 1: {
1003             sink_(GetEmit5(index, (op >> 2) + 0));
1004             break;
1005           }
1006         }
1007         return;
1008       }
1009       case 9: {
1010         const auto index = buffer_ & 511;
1011         const auto op = GetOp6(index);
1012         switch (op & 3) {
1013           case 0: {
1014             ok_ = false;
1015             break;
1016           }
1017           case 1: {
1018             sink_(GetEmit6(index, (op >> 2) + 0));
1019             break;
1020           }
1021         }
1022         return;
1023       }
1024       case 10: {
1025         const auto index = buffer_ & 1023;
1026         const auto op = GetOp7(index);
1027         switch (op & 3) {
1028           case 0: {
1029             sink_(GetEmit7(index, (op >> 2) + 0));
1030             sink_(GetEmit7(index, (op >> 2) + 1));
1031             break;
1032           }
1033           case 1: {
1034             ok_ = false;
1035             break;
1036           }
1037           case 2: {
1038             sink_(GetEmit7(index, (op >> 2) + 0));
1039             break;
1040           }
1041         }
1042         return;
1043       }
1044       case 11: {
1045         const auto index = buffer_ & 2047;
1046         const auto op = GetOp8(index);
1047         switch (op & 3) {
1048           case 0: {
1049             ok_ = false;
1050             break;
1051           }
1052           case 1: {
1053             sink_(GetEmit8(index, (op >> 2) + 0));
1054             sink_(GetEmit8(index, (op >> 2) + 1));
1055             break;
1056           }
1057           case 2: {
1058             sink_(GetEmit8(index, (op >> 2) + 0));
1059             break;
1060           }
1061         }
1062         return;
1063       }
1064       case 12: {
1065         const auto index = buffer_ & 4095;
1066         const auto op = GetOp9(index);
1067         switch (op & 3) {
1068           case 0: {
1069             ok_ = false;
1070             break;
1071           }
1072           case 1: {
1073             sink_(GetEmit9(index, (op >> 2) + 0));
1074             sink_(GetEmit9(index, (op >> 2) + 1));
1075             break;
1076           }
1077           case 2: {
1078             sink_(GetEmit9(index, (op >> 2) + 0));
1079             break;
1080           }
1081         }
1082         return;
1083       }
1084       case 0: {
1085         return;
1086       }
1087     }
1088   }
DecodeStep0()1089   void DecodeStep0() {
1090     if (!RefillTo1()) {
1091       Done1();
1092       return;
1093     }
1094     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1095     const auto op = GetOp10(index);
1096     const int consumed = op & 1;
1097     buffer_len_ -= consumed;
1098     const auto emit_ofs = op >> 1;
1099     sink_(GetEmit10(index, emit_ofs + 0));
1100   }
RefillTo1()1101   bool RefillTo1() {
1102     switch (buffer_len_) {
1103       case 0: {
1104         return Read1to8Bytes();
1105       }
1106     }
1107     return true;
1108   }
Read1to8Bytes()1109   bool Read1to8Bytes() {
1110     switch (end_ - begin_) {
1111       case 0: {
1112         return false;
1113       }
1114       case 1: {
1115         Fill1();
1116         return true;
1117       }
1118       case 2: {
1119         Fill2();
1120         return true;
1121       }
1122       case 3: {
1123         Fill3();
1124         return true;
1125       }
1126       case 4: {
1127         Fill4();
1128         return true;
1129       }
1130       case 5: {
1131         Fill5();
1132         return true;
1133       }
1134       case 6: {
1135         Fill6();
1136         return true;
1137       }
1138       case 7: {
1139         Fill7();
1140         return true;
1141       }
1142       default: {
1143         Fill8();
1144         return true;
1145       }
1146     }
1147   }
Done1()1148   void Done1() {
1149     done_ = true;
1150     ok_ = false;
1151   }
DecodeStep1()1152   void DecodeStep1() {
1153     if (!RefillTo10()) {
1154       Done2();
1155       return;
1156     }
1157     const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
1158     const auto op = GetOp11(index);
1159     const int consumed = op & 15;
1160     buffer_len_ -= consumed;
1161     const auto emit_ofs = op >> 8;
1162     switch ((op >> 4) & 15) {
1163       case 0: {
1164         sink_(GetEmit11(index, emit_ofs + 0));
1165         break;
1166       }
1167       case 1: {
1168         DecodeStep2();
1169         break;
1170       }
1171       case 2: {
1172         DecodeStep3();
1173         break;
1174       }
1175       case 3: {
1176         DecodeStep4();
1177         break;
1178       }
1179       case 4: {
1180         DecodeStep5();
1181         break;
1182       }
1183       case 5: {
1184         DecodeStep6();
1185         break;
1186       }
1187       case 6: {
1188         DecodeStep7();
1189         break;
1190       }
1191       case 7: {
1192         DecodeStep8();
1193         break;
1194       }
1195       case 8: {
1196         DecodeStep9();
1197         break;
1198       }
1199       case 9: {
1200         DecodeStep12();
1201         break;
1202       }
1203       case 10: {
1204         DecodeStep10();
1205         break;
1206       }
1207       case 11: {
1208         DecodeStep11();
1209         break;
1210       }
1211     }
1212   }
RefillTo10()1213   bool RefillTo10() {
1214     switch (buffer_len_) {
1215       case 0: {
1216         return Read2to8Bytes();
1217       }
1218       case 1: {
1219         return Read2to7Bytes();
1220       }
1221       case 2:
1222       case 3:
1223       case 4:
1224       case 5:
1225       case 6:
1226       case 7:
1227       case 8: {
1228         return Read1to7Bytes();
1229       }
1230       case 9: {
1231         return Read1to6Bytes();
1232       }
1233     }
1234     return true;
1235   }
Done2()1236   void Done2() {
1237     done_ = true;
1238     switch (end_ - begin_) {
1239       case 1: {
1240         Fill1();
1241         break;
1242       }
1243     }
1244     switch (buffer_len_) {
1245       case 1: {
1246         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1247         return;
1248       }
1249       case 2: {
1250         const auto index = buffer_ & 3;
1251         const auto op = GetOp12(index);
1252         switch (op & 1) {
1253           case 0: {
1254             sink_(GetEmit12(index, (op >> 1) + 0));
1255             break;
1256           }
1257         }
1258         return;
1259       }
1260       case 3: {
1261         const auto index = buffer_ & 7;
1262         const auto op = GetOp13(index);
1263         switch (op & 3) {
1264           case 0: {
1265             ok_ = false;
1266             break;
1267           }
1268           case 1: {
1269             sink_(GetEmit13(index, (op >> 2) + 0));
1270             break;
1271           }
1272         }
1273         return;
1274       }
1275       case 4: {
1276         const auto index = buffer_ & 15;
1277         const auto op = GetOp14(index);
1278         switch (op & 3) {
1279           case 0: {
1280             ok_ = false;
1281             break;
1282           }
1283           case 1: {
1284             sink_(GetEmit14(index, (op >> 2) + 0));
1285             break;
1286           }
1287         }
1288         return;
1289       }
1290       case 5: {
1291         const auto index = buffer_ & 31;
1292         const auto op = GetOp15(index);
1293         switch (op & 3) {
1294           case 0: {
1295             ok_ = false;
1296             break;
1297           }
1298           case 1: {
1299             sink_(GetEmit15(index, (op >> 2) + 0));
1300             break;
1301           }
1302         }
1303         return;
1304       }
1305       case 6: {
1306         const auto index = buffer_ & 63;
1307         const auto op = GetOp16(index);
1308         switch (op & 3) {
1309           case 0: {
1310             ok_ = false;
1311             break;
1312           }
1313           case 1: {
1314             sink_(GetEmit16(index, (op >> 2) + 0));
1315             break;
1316           }
1317         }
1318         return;
1319       }
1320       case 7: {
1321         const auto index = buffer_ & 127;
1322         const auto op = GetOp17(index);
1323         switch (op & 3) {
1324           case 0: {
1325             sink_(GetEmit17(index, (op >> 2) + 0));
1326             sink_(GetEmit17(index, (op >> 2) + 1));
1327             break;
1328           }
1329           case 1: {
1330             ok_ = false;
1331             break;
1332           }
1333           case 2: {
1334             sink_(GetEmit17(index, (op >> 2) + 0));
1335             break;
1336           }
1337         }
1338         return;
1339       }
1340       case 8: {
1341         const auto index = buffer_ & 255;
1342         const auto op = GetOp18(index);
1343         switch (op & 3) {
1344           case 0: {
1345             ok_ = false;
1346             break;
1347           }
1348           case 1: {
1349             sink_(GetEmit18(index, (op >> 2) + 0));
1350             sink_(GetEmit18(index, (op >> 2) + 1));
1351             break;
1352           }
1353           case 2: {
1354             sink_(GetEmit18(index, (op >> 2) + 0));
1355             break;
1356           }
1357         }
1358         return;
1359       }
1360       case 9: {
1361         const auto index = buffer_ & 511;
1362         const auto op = GetOp19(index);
1363         switch (op & 3) {
1364           case 0: {
1365             ok_ = false;
1366             break;
1367           }
1368           case 1: {
1369             sink_(GetEmit19(index, (op >> 2) + 0));
1370             sink_(GetEmit19(index, (op >> 2) + 1));
1371             break;
1372           }
1373           case 2: {
1374             sink_(GetEmit19(index, (op >> 2) + 0));
1375             break;
1376           }
1377         }
1378         return;
1379       }
1380       case 0: {
1381         return;
1382       }
1383     }
1384   }
DecodeStep2()1385   void DecodeStep2() {
1386     if (!RefillTo1()) {
1387       Done3();
1388       return;
1389     }
1390     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1391     const auto op = GetOp20(index);
1392     const int consumed = op & 1;
1393     buffer_len_ -= consumed;
1394     const auto emit_ofs = op >> 1;
1395     sink_(GetEmit20(index, emit_ofs + 0));
1396   }
Done3()1397   void Done3() {
1398     done_ = true;
1399     ok_ = false;
1400   }
DecodeStep3()1401   void DecodeStep3() {
1402     if (!RefillTo1()) {
1403       Done4();
1404       return;
1405     }
1406     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1407     const auto op = GetOp21(index);
1408     const int consumed = op & 1;
1409     buffer_len_ -= consumed;
1410     const auto emit_ofs = op >> 1;
1411     sink_(GetEmit21(index, emit_ofs + 0));
1412   }
Done4()1413   void Done4() {
1414     done_ = true;
1415     ok_ = false;
1416   }
DecodeStep4()1417   void DecodeStep4() {
1418     if (!RefillTo1()) {
1419       Done5();
1420       return;
1421     }
1422     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1423     const auto op = GetOp22(index);
1424     const int consumed = op & 1;
1425     buffer_len_ -= consumed;
1426     const auto emit_ofs = op >> 1;
1427     sink_(GetEmit22(index, emit_ofs + 0));
1428   }
Done5()1429   void Done5() {
1430     done_ = true;
1431     ok_ = false;
1432   }
DecodeStep5()1433   void DecodeStep5() {
1434     if (!RefillTo1()) {
1435       Done6();
1436       return;
1437     }
1438     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1439     const auto op = GetOp23(index);
1440     const int consumed = op & 1;
1441     buffer_len_ -= consumed;
1442     const auto emit_ofs = op >> 1;
1443     sink_(GetEmit23(index, emit_ofs + 0));
1444   }
Done6()1445   void Done6() {
1446     done_ = true;
1447     ok_ = false;
1448   }
DecodeStep6()1449   void DecodeStep6() {
1450     if (!RefillTo1()) {
1451       Done7();
1452       return;
1453     }
1454     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1455     const auto op = GetOp24(index);
1456     const int consumed = op & 1;
1457     buffer_len_ -= consumed;
1458     const auto emit_ofs = op >> 1;
1459     sink_(GetEmit24(index, emit_ofs + 0));
1460   }
Done7()1461   void Done7() {
1462     done_ = true;
1463     ok_ = false;
1464   }
DecodeStep7()1465   void DecodeStep7() {
1466     if (!RefillTo1()) {
1467       Done8();
1468       return;
1469     }
1470     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1471     const auto op = GetOp25(index);
1472     const int consumed = op & 1;
1473     buffer_len_ -= consumed;
1474     const auto emit_ofs = op >> 1;
1475     sink_(GetEmit25(index, emit_ofs + 0));
1476   }
Done8()1477   void Done8() {
1478     done_ = true;
1479     ok_ = false;
1480   }
DecodeStep8()1481   void DecodeStep8() {
1482     if (!RefillTo2()) {
1483       Done9();
1484       return;
1485     }
1486     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1487     const auto op = GetOp26(index);
1488     const int consumed = op & 3;
1489     buffer_len_ -= consumed;
1490     const auto emit_ofs = op >> 2;
1491     sink_(GetEmit26(index, emit_ofs + 0));
1492   }
RefillTo2()1493   bool RefillTo2() {
1494     switch (buffer_len_) {
1495       case 0: {
1496         return Read1to8Bytes();
1497       }
1498       case 1: {
1499         return Read1to7Bytes();
1500       }
1501     }
1502     return true;
1503   }
Done9()1504   void Done9() {
1505     done_ = true;
1506     switch (buffer_len_) {
1507       case 1:
1508       case 0: {
1509         ok_ = false;
1510         return;
1511       }
1512     }
1513   }
DecodeStep9()1514   void DecodeStep9() {
1515     if (!RefillTo3()) {
1516       Done10();
1517       return;
1518     }
1519     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1520     const auto op = GetOp27(index);
1521     const int consumed = op & 3;
1522     buffer_len_ -= consumed;
1523     const auto emit_ofs = op >> 2;
1524     sink_(GetEmit27(index, emit_ofs + 0));
1525   }
RefillTo3()1526   bool RefillTo3() {
1527     switch (buffer_len_) {
1528       case 0: {
1529         return Read1to8Bytes();
1530       }
1531       case 1:
1532       case 2: {
1533         return Read1to7Bytes();
1534       }
1535     }
1536     return true;
1537   }
Done10()1538   void Done10() {
1539     done_ = true;
1540     switch (buffer_len_) {
1541       case 1:
1542       case 2:
1543       case 0: {
1544         ok_ = false;
1545         return;
1546       }
1547     }
1548   }
DecodeStep10()1549   void DecodeStep10() {
1550     if (!RefillTo4()) {
1551       Done11();
1552       return;
1553     }
1554     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1555     const auto op = GetOp28(index);
1556     const int consumed = op & 7;
1557     buffer_len_ -= consumed;
1558     const auto emit_ofs = op >> 3;
1559     sink_(GetEmit28(index, emit_ofs + 0));
1560   }
RefillTo4()1561   bool RefillTo4() {
1562     switch (buffer_len_) {
1563       case 0: {
1564         return Read1to8Bytes();
1565       }
1566       case 1:
1567       case 2:
1568       case 3: {
1569         return Read1to7Bytes();
1570       }
1571     }
1572     return true;
1573   }
Done11()1574   void Done11() {
1575     done_ = true;
1576     switch (buffer_len_) {
1577       case 1:
1578       case 2:
1579       case 3:
1580       case 0: {
1581         ok_ = false;
1582         return;
1583       }
1584     }
1585   }
DecodeStep11()1586   void DecodeStep11() {
1587     if (!RefillTo7()) {
1588       Done12();
1589       return;
1590     }
1591     const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
1592     const auto op = GetOp29(index);
1593     const int consumed = op & 7;
1594     buffer_len_ -= consumed;
1595     const auto emit_ofs = op >> 4;
1596     switch ((op >> 3) & 1) {
1597       case 0: {
1598         sink_(GetEmit29(index, emit_ofs + 0));
1599         break;
1600       }
1601       case 1: {
1602         begin_ = end_;
1603         buffer_len_ = 0;
1604         break;
1605       }
1606     }
1607   }
RefillTo7()1608   bool RefillTo7() {
1609     switch (buffer_len_) {
1610       case 0: {
1611         return Read1to8Bytes();
1612       }
1613       case 1:
1614       case 2:
1615       case 3:
1616       case 4:
1617       case 5:
1618       case 6: {
1619         return Read1to7Bytes();
1620       }
1621     }
1622     return true;
1623   }
Done12()1624   void Done12() {
1625     done_ = true;
1626     switch (buffer_len_) {
1627       case 1:
1628       case 2:
1629       case 3: {
1630         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1631         return;
1632       }
1633       case 4: {
1634         const auto index = buffer_ & 15;
1635         const auto op = GetOp30(index);
1636         switch (op & 3) {
1637           case 0: {
1638             sink_(GetEmit30(index, (op >> 2) + 0));
1639             break;
1640           }
1641           case 1: {
1642             ok_ = false;
1643             break;
1644           }
1645         }
1646         return;
1647       }
1648       case 5: {
1649         const auto index = buffer_ & 31;
1650         const auto op = GetOp31(index);
1651         switch (op & 3) {
1652           case 0: {
1653             ok_ = false;
1654             break;
1655           }
1656           case 1: {
1657             sink_(GetEmit31(index, (op >> 2) + 0));
1658             break;
1659           }
1660         }
1661         return;
1662       }
1663       case 6: {
1664         const auto index = buffer_ & 63;
1665         const auto op = GetOp32(index);
1666         switch (op & 3) {
1667           case 0: {
1668             ok_ = false;
1669             break;
1670           }
1671           case 1: {
1672             sink_(GetEmit32(index, (op >> 2) + 0));
1673             break;
1674           }
1675         }
1676         return;
1677       }
1678       case 0: {
1679         return;
1680       }
1681     }
1682   }
DecodeStep12()1683   void DecodeStep12() {
1684     if (!RefillTo4()) {
1685       Done13();
1686       return;
1687     }
1688     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1689     const auto op = GetOp33(index);
1690     const int consumed = op & 7;
1691     buffer_len_ -= consumed;
1692     const auto emit_ofs = op >> 3;
1693     sink_(GetEmit33(index, emit_ofs + 0));
1694   }
Done13()1695   void Done13() {
1696     done_ = true;
1697     switch (buffer_len_) {
1698       case 1:
1699       case 2:
1700       case 0: {
1701         ok_ = false;
1702         return;
1703       }
1704       case 3: {
1705         const auto index = buffer_ & 7;
1706         const auto op = GetOp34(index);
1707         switch (op & 1) {
1708           case 0: {
1709             sink_(GetEmit34(index, (op >> 1) + 0));
1710             break;
1711           }
1712           case 1: {
1713             ok_ = false;
1714             break;
1715           }
1716         }
1717         return;
1718       }
1719     }
1720   }
1721   F sink_;
1722   const uint8_t* begin_;
1723   const uint8_t* const end_;
1724   uint64_t buffer_ = 0;
1725   int buffer_len_ = 0;
1726   bool ok_ = true;
1727   bool done_ = false;
1728 };
1729 }  // namespace geometry_13_10_7
1730 }  // namespace grpc_core
1731 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_13_10_7_H
1732