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