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