xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_12_13_5.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_12_13_5_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_13_5_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_12_13_5 {
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   }
GetOp1(size_t i)66   static inline uint64_t GetOp1(size_t i) {
67     return table1_inner_[i >> 7][table1_outer_[i >> 7][i & 0x7f]];
68   }
GetEmit1(size_t i,size_t emit)69   static inline uint64_t GetEmit1(size_t i, size_t emit) {
70     return table1_emit_[i >> 7][emit];
71   }
GetOp9(size_t i)72   static inline uint64_t GetOp9(size_t i) { return i ? 3 : 1; }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) { return emit ? 36 : 0; }
GetOp10(size_t i)74   static inline uint64_t GetOp10(size_t i) { return i ? 3 : 1; }
GetEmit10(size_t,size_t emit)75   static inline uint64_t GetEmit10(size_t, size_t emit) {
76     return emit ? 91 : 64;
77   }
GetOp11(size_t i)78   static inline uint64_t GetOp11(size_t i) { return i ? 3 : 1; }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) {
83     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
84   }
GetEmit13(size_t,size_t emit)85   static inline uint64_t GetEmit13(size_t, size_t emit) {
86     return emit ? 125 : 94;
87   }
GetOp14(size_t i)88   static inline uint64_t GetOp14(size_t i) {
89     return table14_0_inner_[table14_0_outer_[i]];
90   }
GetEmit14(size_t,size_t emit)91   static inline uint64_t GetEmit14(size_t, size_t emit) {
92     return table14_0_emit_[emit];
93   }
GetOp15(size_t i)94   static inline uint64_t GetOp15(size_t i) {
95     return table14_0_inner_[table15_0_outer_[i]];
96   }
GetEmit15(size_t,size_t emit)97   static inline uint64_t GetEmit15(size_t, size_t emit) {
98     return table14_0_emit_[emit];
99   }
GetOp16(size_t i)100   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)101   static inline uint64_t GetEmit16(size_t, size_t emit) {
102     return table14_0_emit_[emit];
103   }
GetOp17(size_t i)104   static inline uint64_t GetOp17(size_t i) { return table17_0_ops_[i]; }
GetEmit17(size_t,size_t emit)105   static inline uint64_t GetEmit17(size_t, size_t emit) {
106     return table14_0_emit_[emit];
107   }
GetOp18(size_t i)108   static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; }
GetEmit18(size_t,size_t emit)109   static inline uint64_t GetEmit18(size_t, size_t emit) {
110     return table18_0_emit_[emit];
111   }
GetOp19(size_t i)112   static inline uint64_t GetOp19(size_t i) {
113     return table19_ops_[i >> 5][i & 0x1f];
114   }
GetEmit19(size_t i,size_t emit)115   static inline uint64_t GetEmit19(size_t i, size_t emit) {
116     return table19_emit_[i >> 5][emit];
117   }
GetOp20(size_t i)118   static inline uint64_t GetOp20(size_t i) {
119     return table20_ops_[i >> 6][i & 0x3f];
120   }
GetEmit20(size_t i,size_t emit)121   static inline uint64_t GetEmit20(size_t i, size_t emit) {
122     return table20_emit_[i >> 6][emit];
123   }
GetOp21(size_t i)124   static inline uint64_t GetOp21(size_t i) {
125     return table21_ops_[i >> 7][i & 0x7f];
126   }
GetEmit21(size_t i,size_t emit)127   static inline uint64_t GetEmit21(size_t i, size_t emit) {
128     return table21_emit_[i >> 7][emit];
129   }
GetOp22(size_t i)130   static inline uint64_t GetOp22(size_t i) {
131     return table22_ops_[i >> 7][i & 0x7f];
132   }
GetEmit22(size_t i,size_t emit)133   static inline uint64_t GetEmit22(size_t i, size_t emit) {
134     return table22_emit_[i >> 7][emit];
135   }
GetOp23(size_t i)136   static inline uint64_t GetOp23(size_t i) {
137     return table23_ops_[i >> 6][i & 0x3f];
138   }
GetEmit23(size_t i,size_t emit)139   static inline uint64_t GetEmit23(size_t i, size_t emit) {
140     return table23_emit_[i >> 6][emit];
141   }
GetOp12(size_t i)142   static inline uint64_t GetOp12(size_t i) {
143     return table12_ops_[i >> 8][i & 0xff];
144   }
GetEmit12(size_t i,size_t emit)145   static inline uint64_t GetEmit12(size_t i, size_t emit) {
146     return table12_emit_[i >> 8][emit];
147   }
GetOp24(size_t i)148   static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; }
GetEmit24(size_t,size_t emit)149   static inline uint64_t GetEmit24(size_t, size_t emit) { return emit + 192; }
GetOp25(size_t i)150   static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; }
GetEmit25(size_t,size_t emit)151   static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 200; }
GetOp26(size_t i)152   static inline uint64_t GetOp26(size_t i) { return i ? 3 : 1; }
GetEmit26(size_t,size_t emit)153   static inline uint64_t GetEmit26(size_t, size_t emit) {
154     return emit ? 205 : 202;
155   }
GetOp27(size_t i)156   static inline uint64_t GetOp27(size_t i) { return i ? 3 : 1; }
GetEmit27(size_t,size_t emit)157   static inline uint64_t GetEmit27(size_t, size_t emit) {
158     return emit ? 213 : 210;
159   }
GetOp28(size_t i)160   static inline uint64_t GetOp28(size_t i) { return i ? 3 : 1; }
GetEmit28(size_t,size_t emit)161   static inline uint64_t GetEmit28(size_t, size_t emit) { return emit + 218; }
GetOp29(size_t i)162   static inline uint64_t GetOp29(size_t i) { return i ? 3 : 1; }
GetEmit29(size_t,size_t emit)163   static inline uint64_t GetEmit29(size_t, size_t emit) {
164     return emit ? 240 : 238;
165   }
GetOp30(size_t i)166   static inline uint64_t GetOp30(size_t i) { return i ? 3 : 1; }
GetEmit30(size_t,size_t emit)167   static inline uint64_t GetEmit30(size_t, size_t emit) { return emit + 242; }
GetOp31(size_t i)168   static inline uint64_t GetOp31(size_t i) {
169     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
170   }
GetEmit31(size_t,size_t emit)171   static inline uint64_t GetEmit31(size_t, size_t emit) {
172     return (emit < 2 ? (emit + 211) : ((emit - 2) ? 221 : 214));
173   }
GetOp32(size_t i)174   static inline uint64_t GetOp32(size_t i) {
175     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
176   }
GetEmit32(size_t,size_t emit)177   static inline uint64_t GetEmit32(size_t, size_t emit) {
178     return (emit < 2 ? (emit + 222) : ((emit - 2) ? 244 : 241));
179   }
GetOp33(size_t i)180   static inline uint64_t GetOp33(size_t i) {
181     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
182   }
GetEmit33(size_t,size_t emit)183   static inline uint64_t GetEmit33(size_t, size_t emit) { return emit + 245; }
GetOp34(size_t i)184   static inline uint64_t GetOp34(size_t i) {
185     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
186   }
GetEmit34(size_t,size_t emit)187   static inline uint64_t GetEmit34(size_t, size_t emit) { return emit + 250; }
GetOp35(size_t i)188   static inline uint64_t GetOp35(size_t i) { return table35_0_inner_[i]; }
GetEmit35(size_t,size_t emit)189   static inline uint64_t GetEmit35(size_t, size_t emit) {
190     return table35_0_emit_[emit];
191   }
GetOp36(size_t i)192   static inline uint64_t GetOp36(size_t i) { return table35_0_inner_[i]; }
GetEmit36(size_t,size_t emit)193   static inline uint64_t GetEmit36(size_t, size_t emit) {
194     return (emit < 3 ? (emit + 19) : ((emit - 3) + 23));
195   }
GetOp38(size_t i)196   static inline uint64_t GetOp38(size_t i) { return i; }
GetEmit38(size_t,size_t emit)197   static inline uint64_t GetEmit38(size_t, size_t emit) {
198     return ((void)emit, 255);
199   }
GetOp37(size_t i)200   static inline uint64_t GetOp37(size_t i) {
201     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
202                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
203                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
204   }
GetEmit37(size_t,size_t emit)205   static inline uint64_t GetEmit37(size_t, size_t emit) {
206     return (emit < 1 ? (((void)emit, 255)) : ((emit - 1) + 203));
207   }
GetOp40(size_t i)208   static inline uint64_t GetOp40(size_t i) {
209     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
210   }
GetEmit40(size_t,size_t emit)211   static inline uint64_t GetEmit40(size_t, size_t emit) {
212     return ((void)emit, 254);
213   }
GetOp39(size_t i)214   static inline uint64_t GetOp39(size_t i) {
215     return table39_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
216   }
GetEmit39(size_t,size_t emit)217   static inline uint64_t GetEmit39(size_t, size_t emit) {
218     return (emit < 1 ? (((void)emit, 254)) : ((emit - 1) + 2));
219   }
GetOp42(size_t i)220   static inline uint64_t GetOp42(size_t i) { return table42_0_inner_[i]; }
GetEmit42(size_t,size_t emit)221   static inline uint64_t GetEmit42(size_t, size_t emit) {
222     return table42_0_emit_[emit];
223   }
GetOp43(size_t i)224   static inline uint64_t GetOp43(size_t i) {
225     return table43_0_inner_[table43_0_outer_[i]];
226   }
GetEmit43(size_t,size_t emit)227   static inline uint64_t GetEmit43(size_t, size_t emit) {
228     return table42_0_emit_[emit];
229   }
GetOp41(size_t i)230   static inline uint64_t GetOp41(size_t i) { return table41_0_ops_[i]; }
GetEmit41(size_t,size_t emit)231   static inline uint64_t GetEmit41(size_t, size_t emit) {
232     return table41_0_emit_[emit];
233   }
234 
235  private:
236   static const uint8_t table2_0_emit_[10];
237   static const uint8_t table2_0_ops_[32];
238   static const uint8_t table3_0_emit_[36];
239   static const uint8_t table3_0_ops_[64];
240   static const uint8_t table4_0_emit_[22];
241   static const uint8_t table4_0_ops_[64];
242   static const uint8_t table4_1_emit_[46];
243   static const uint8_t table4_1_ops_[64];
244   static const uint8_t* const table4_emit_[2];
245   static const uint8_t* const table4_ops_[2];
246   static const uint8_t table5_0_ops_[128];
247   static const uint8_t table5_1_emit_[52];
248   static const uint8_t table5_1_ops_[128];
249   static const uint8_t* const table5_emit_[2];
250   static const uint8_t* const table5_ops_[2];
251   static const uint8_t table6_0_emit_[2];
252   static const uint8_t table6_0_ops_[32];
253   static const uint8_t table6_1_emit_[2];
254   static const uint8_t table6_2_emit_[2];
255   static const uint8_t table6_3_emit_[2];
256   static const uint8_t table6_4_emit_[2];
257   static const uint8_t table6_5_emit_[4];
258   static const uint8_t table6_5_ops_[32];
259   static const uint8_t table6_6_emit_[4];
260   static const uint8_t table6_7_emit_[4];
261   static const uint8_t table6_8_emit_[4];
262   static const uint8_t table6_9_emit_[4];
263   static const uint8_t table6_10_emit_[4];
264   static const uint8_t table6_11_emit_[6];
265   static const uint8_t table6_11_ops_[32];
266   static const uint8_t table6_12_emit_[8];
267   static const uint8_t table6_12_ops_[32];
268   static const uint8_t table6_13_emit_[8];
269   static const uint8_t table6_14_emit_[8];
270   static const uint8_t table6_15_emit_[10];
271   static const uint8_t table6_15_ops_[32];
272   static const uint8_t* const table6_emit_[16];
273   static const uint8_t* const table6_ops_[16];
274   static const uint8_t table7_0_emit_[36];
275   static const uint8_t table7_0_ops_[64];
276   static const uint8_t table7_1_emit_[36];
277   static const uint8_t table7_1_ops_[64];
278   static const uint8_t table7_2_emit_[36];
279   static const uint8_t table7_2_ops_[64];
280   static const uint8_t table7_3_emit_[36];
281   static const uint8_t table7_3_ops_[64];
282   static const uint8_t table7_4_emit_[38];
283   static const uint8_t table7_4_ops_[64];
284   static const uint8_t table7_5_ops_[64];
285   static const uint8_t table7_11_ops_[64];
286   static const uint8_t table7_12_ops_[64];
287   static const uint8_t table7_15_emit_[15];
288   static const uint8_t table7_15_ops_[64];
289   static const uint8_t* const table7_emit_[16];
290   static const uint8_t* const table7_ops_[16];
291   static const uint8_t table8_0_emit_[71];
292   static const uint16_t table8_0_inner_[38];
293   static const uint8_t table8_0_outer_[64];
294   static const uint8_t table8_1_emit_[71];
295   static const uint16_t table8_1_inner_[38];
296   static const uint8_t table8_2_emit_[71];
297   static const uint16_t table8_2_inner_[38];
298   static const uint8_t table8_3_emit_[71];
299   static const uint16_t table8_3_inner_[38];
300   static const uint8_t table8_4_emit_[71];
301   static const uint16_t table8_4_inner_[38];
302   static const uint8_t table8_5_emit_[71];
303   static const uint16_t table8_5_inner_[38];
304   static const uint8_t table8_6_emit_[71];
305   static const uint16_t table8_6_inner_[38];
306   static const uint8_t table8_7_emit_[71];
307   static const uint16_t table8_7_inner_[38];
308   static const uint8_t table8_8_emit_[71];
309   static const uint16_t table8_8_inner_[38];
310   static const uint8_t table8_9_emit_[71];
311   static const uint16_t table8_9_inner_[38];
312   static const uint8_t table8_10_emit_[40];
313   static const uint16_t table8_10_inner_[23];
314   static const uint8_t table8_10_outer_[64];
315   static const uint8_t table8_11_emit_[40];
316   static const uint8_t table8_12_emit_[40];
317   static const uint8_t table8_13_emit_[40];
318   static const uint8_t table8_14_emit_[40];
319   static const uint8_t table8_15_emit_[40];
320   static const uint8_t table8_16_emit_[40];
321   static const uint8_t table8_17_emit_[40];
322   static const uint8_t table8_18_emit_[40];
323   static const uint8_t table8_19_emit_[40];
324   static const uint8_t table8_20_emit_[40];
325   static const uint8_t table8_21_emit_[40];
326   static const uint8_t table8_22_emit_[40];
327   static const uint8_t table8_23_emit_[4];
328   static const uint16_t table8_23_inner_[5];
329   static const uint8_t table8_23_outer_[64];
330   static const uint8_t table8_24_emit_[4];
331   static const uint8_t table8_25_emit_[4];
332   static const uint8_t table8_26_emit_[4];
333   static const uint8_t table8_27_emit_[4];
334   static const uint8_t table8_28_emit_[4];
335   static const uint8_t table8_29_emit_[4];
336   static const uint8_t table8_30_emit_[4];
337   static const uint8_t table8_31_emit_[14];
338   static const uint16_t table8_31_inner_[16];
339   static const uint8_t table8_31_outer_[64];
340   static const uint8_t* const table8_emit_[32];
341   static const uint16_t* const table8_inner_[32];
342   static const uint8_t* const table8_outer_[32];
343   static const uint8_t table1_0_emit_[135];
344   static const uint16_t table1_0_inner_[69];
345   static const uint8_t table1_0_outer_[128];
346   static const uint8_t table1_1_emit_[135];
347   static const uint16_t table1_1_inner_[69];
348   static const uint8_t table1_2_emit_[135];
349   static const uint16_t table1_2_inner_[69];
350   static const uint8_t table1_3_emit_[135];
351   static const uint16_t table1_3_inner_[69];
352   static const uint8_t table1_4_emit_[135];
353   static const uint16_t table1_4_inner_[69];
354   static const uint8_t table1_5_emit_[135];
355   static const uint16_t table1_5_inner_[69];
356   static const uint8_t table1_6_emit_[135];
357   static const uint16_t table1_6_inner_[69];
358   static const uint8_t table1_7_emit_[135];
359   static const uint16_t table1_7_inner_[69];
360   static const uint8_t table1_8_emit_[135];
361   static const uint16_t table1_8_inner_[69];
362   static const uint8_t table1_9_emit_[135];
363   static const uint16_t table1_9_inner_[69];
364   static const uint8_t table1_10_emit_[140];
365   static const uint16_t table1_10_inner_[74];
366   static const uint8_t table1_10_outer_[128];
367   static const uint8_t table1_11_emit_[140];
368   static const uint16_t table1_11_inner_[74];
369   static const uint8_t table1_12_emit_[140];
370   static const uint16_t table1_12_inner_[74];
371   static const uint8_t table1_13_emit_[140];
372   static const uint16_t table1_13_inner_[74];
373   static const uint8_t table1_14_emit_[140];
374   static const uint16_t table1_14_inner_[74];
375   static const uint8_t table1_15_emit_[140];
376   static const uint16_t table1_15_inner_[74];
377   static const uint8_t table1_16_emit_[140];
378   static const uint16_t table1_16_inner_[74];
379   static const uint8_t table1_17_emit_[140];
380   static const uint16_t table1_17_inner_[74];
381   static const uint8_t table1_18_emit_[140];
382   static const uint16_t table1_18_inner_[74];
383   static const uint8_t table1_19_emit_[140];
384   static const uint16_t table1_19_inner_[74];
385   static const uint8_t table1_20_emit_[140];
386   static const uint16_t table1_20_inner_[74];
387   static const uint8_t table1_21_emit_[140];
388   static const uint16_t table1_21_inner_[74];
389   static const uint8_t table1_22_emit_[142];
390   static const uint16_t table1_22_inner_[74];
391   static const uint8_t table1_23_emit_[80];
392   static const uint16_t table1_23_inner_[44];
393   static const uint8_t table1_23_outer_[128];
394   static const uint8_t table1_24_emit_[80];
395   static const uint8_t table1_25_emit_[80];
396   static const uint8_t table1_26_emit_[80];
397   static const uint8_t table1_27_emit_[80];
398   static const uint8_t table1_28_emit_[80];
399   static const uint8_t table1_29_emit_[80];
400   static const uint8_t table1_30_emit_[80];
401   static const uint8_t table1_31_emit_[16];
402   static const uint16_t table1_31_inner_[20];
403   static const uint8_t table1_31_outer_[128];
404   static const uint8_t* const table1_emit_[32];
405   static const uint16_t* const table1_inner_[32];
406   static const uint8_t* const table1_outer_[32];
407   static const uint8_t table14_0_emit_[5];
408   static const uint8_t table14_0_inner_[7];
409   static const uint8_t table14_0_outer_[8];
410   static const uint8_t table15_0_outer_[16];
411   static const uint8_t table16_0_ops_[32];
412   static const uint8_t table17_0_ops_[64];
413   static const uint8_t table18_0_emit_[46];
414   static const uint8_t table18_0_ops_[128];
415   static const uint8_t table19_0_emit_[44];
416   static const uint8_t table19_0_ops_[32];
417   static const uint8_t table19_1_emit_[28];
418   static const uint8_t table19_1_ops_[32];
419   static const uint8_t table19_2_emit_[44];
420   static const uint8_t table19_3_emit_[28];
421   static const uint8_t table19_4_emit_[20];
422   static const uint8_t table19_4_ops_[32];
423   static const uint8_t table19_5_emit_[20];
424   static const uint8_t table19_6_emit_[20];
425   static const uint8_t table19_7_emit_[11];
426   static const uint8_t table19_7_ops_[32];
427   static const uint8_t* const table19_emit_[8];
428   static const uint8_t* const table19_ops_[8];
429   static const uint16_t table20_0_ops_[64];
430   static const uint8_t table20_1_emit_[92];
431   static const uint16_t table20_1_ops_[64];
432   static const uint8_t table20_3_emit_[92];
433   static const uint8_t table20_4_emit_[72];
434   static const uint16_t table20_4_ops_[64];
435   static const uint8_t table20_5_emit_[72];
436   static const uint8_t table20_6_emit_[72];
437   static const uint8_t table20_7_emit_[24];
438   static const uint16_t table20_7_ops_[64];
439   static const uint8_t* const table20_emit_[8];
440   static const uint16_t* const table20_ops_[8];
441   static const uint16_t table21_0_ops_[128];
442   static const uint8_t table21_1_emit_[104];
443   static const uint16_t table21_1_ops_[128];
444   static const uint8_t table21_3_emit_[104];
445   static const uint8_t table21_4_emit_[136];
446   static const uint16_t table21_4_ops_[128];
447   static const uint8_t table21_5_emit_[136];
448   static const uint8_t table21_6_emit_[136];
449   static const uint8_t table21_7_emit_[50];
450   static const uint16_t table21_7_ops_[128];
451   static const uint8_t* const table21_emit_[8];
452   static const uint16_t* const table21_ops_[8];
453   static const uint8_t table22_0_emit_[16];
454   static const uint16_t table22_0_ops_[128];
455   static const uint8_t table22_1_emit_[28];
456   static const uint16_t table22_1_ops_[128];
457   static const uint8_t table22_2_emit_[36];
458   static const uint16_t table22_2_ops_[128];
459   static const uint8_t table22_3_emit_[68];
460   static const uint16_t table22_3_ops_[128];
461   static const uint8_t table22_4_emit_[16];
462   static const uint8_t table22_5_emit_[28];
463   static const uint8_t table22_6_emit_[36];
464   static const uint8_t table22_7_emit_[68];
465   static const uint8_t table22_8_emit_[44];
466   static const uint8_t table22_9_emit_[104];
467   static const uint8_t table22_10_emit_[44];
468   static const uint8_t table22_11_emit_[104];
469   static const uint8_t table22_12_emit_[44];
470   static const uint8_t table22_13_emit_[104];
471   static const uint8_t table22_14_emit_[15];
472   static const uint16_t table22_14_ops_[128];
473   static const uint8_t table22_15_emit_[64];
474   static const uint16_t table22_15_ops_[128];
475   static const uint8_t* const table22_emit_[16];
476   static const uint16_t* const table22_ops_[16];
477   static const uint8_t table23_0_emit_[60];
478   static const uint16_t table23_0_ops_[64];
479   static const uint8_t table23_1_emit_[60];
480   static const uint8_t table23_2_emit_[60];
481   static const uint8_t table23_3_emit_[60];
482   static const uint8_t table23_4_emit_[60];
483   static const uint8_t table23_5_emit_[8];
484   static const uint16_t table23_5_ops_[64];
485   static const uint8_t table23_6_emit_[8];
486   static const uint8_t table23_7_emit_[8];
487   static const uint8_t table23_8_emit_[8];
488   static const uint8_t table23_9_emit_[8];
489   static const uint8_t table23_10_emit_[8];
490   static const uint8_t table23_11_emit_[12];
491   static const uint16_t table23_11_ops_[64];
492   static const uint8_t table23_12_emit_[16];
493   static const uint16_t table23_12_ops_[64];
494   static const uint8_t table23_13_emit_[16];
495   static const uint8_t table23_14_emit_[16];
496   static const uint8_t table23_15_emit_[30];
497   static const uint16_t table23_15_ops_[64];
498   static const uint8_t table23_16_emit_[60];
499   static const uint8_t table23_17_emit_[60];
500   static const uint8_t table23_18_emit_[60];
501   static const uint8_t table23_19_emit_[60];
502   static const uint8_t table23_20_emit_[60];
503   static const uint8_t table23_21_emit_[8];
504   static const uint8_t table23_22_emit_[8];
505   static const uint8_t table23_23_emit_[8];
506   static const uint8_t table23_24_emit_[8];
507   static const uint8_t table23_25_emit_[8];
508   static const uint8_t table23_26_emit_[8];
509   static const uint8_t table23_27_emit_[12];
510   static const uint8_t table23_28_emit_[16];
511   static const uint8_t table23_29_emit_[16];
512   static const uint8_t table23_30_emit_[16];
513   static const uint8_t table23_31_emit_[30];
514   static const uint8_t table23_32_emit_[8];
515   static const uint8_t table23_33_emit_[8];
516   static const uint8_t table23_34_emit_[12];
517   static const uint8_t table23_35_emit_[16];
518   static const uint8_t table23_36_emit_[16];
519   static const uint8_t table23_37_emit_[20];
520   static const uint16_t table23_37_ops_[64];
521   static const uint8_t table23_38_emit_[32];
522   static const uint16_t table23_38_ops_[64];
523   static const uint8_t table23_39_emit_[36];
524   static const uint16_t table23_39_ops_[64];
525   static const uint8_t table23_40_emit_[8];
526   static const uint8_t table23_41_emit_[8];
527   static const uint8_t table23_42_emit_[12];
528   static const uint8_t table23_43_emit_[16];
529   static const uint8_t table23_44_emit_[16];
530   static const uint8_t table23_45_emit_[20];
531   static const uint8_t table23_46_emit_[32];
532   static const uint8_t table23_47_emit_[36];
533   static const uint8_t table23_48_emit_[8];
534   static const uint8_t table23_49_emit_[8];
535   static const uint8_t table23_50_emit_[12];
536   static const uint8_t table23_51_emit_[16];
537   static const uint8_t table23_52_emit_[16];
538   static const uint8_t table23_53_emit_[20];
539   static const uint8_t table23_54_emit_[32];
540   static const uint8_t table23_55_emit_[36];
541   static const uint8_t table23_56_emit_[40];
542   static const uint16_t table23_56_ops_[64];
543   static const uint8_t table23_57_emit_[22];
544   static const uint16_t table23_57_ops_[64];
545   static const uint8_t table23_58_emit_[4];
546   static const uint16_t table23_58_ops_[64];
547   static const uint8_t table23_59_emit_[6];
548   static const uint16_t table23_59_ops_[64];
549   static const uint8_t table23_60_emit_[8];
550   static const uint16_t table23_60_ops_[64];
551   static const uint8_t table23_61_emit_[15];
552   static const uint16_t table23_61_ops_[64];
553   static const uint8_t table23_62_emit_[20];
554   static const uint16_t table23_62_ops_[64];
555   static const uint8_t table23_63_emit_[33];
556   static const uint16_t table23_63_ops_[64];
557   static const uint8_t* const table23_emit_[64];
558   static const uint16_t* const table23_ops_[64];
559   static const uint8_t table12_0_emit_[1];
560   static const uint16_t table12_0_ops_[256];
561   static const uint8_t table12_8_emit_[1];
562   static const uint8_t table12_16_emit_[1];
563   static const uint16_t table12_16_ops_[256];
564   static const uint8_t table12_20_emit_[1];
565   static const uint8_t table12_24_emit_[1];
566   static const uint8_t table12_28_emit_[5];
567   static const uint16_t table12_28_ops_[256];
568   static const uint8_t table12_29_emit_[10];
569   static const uint16_t table12_29_ops_[256];
570   static const uint8_t table12_30_emit_[23];
571   static const uint16_t table12_30_ops_[256];
572   static const uint8_t table12_31_emit_[57];
573   static const uint16_t table12_31_ops_[256];
574   static const uint8_t* const table12_emit_[32];
575   static const uint16_t* const table12_ops_[32];
576   static const uint8_t table35_0_emit_[8];
577   static const uint8_t table35_0_inner_[8];
578   static const uint8_t table39_0_inner_[7];
579   static const uint8_t table42_0_emit_[7];
580   static const uint8_t table42_0_inner_[8];
581   static const uint8_t table43_0_inner_[9];
582   static const uint8_t table43_0_outer_[16];
583   static const uint8_t table41_0_emit_[10];
584   static const uint8_t table41_0_ops_[32];
585 };
586 template <typename F>
587 class HuffDecoder : public HuffDecoderCommon {
588  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)589   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
590       : sink_(sink), begin_(begin), end_(end) {}
Run()591   bool Run() {
592     while (!done_) {
593       if (!RefillTo12()) {
594         Done0();
595         break;
596       }
597       const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff;
598       const auto op = GetOp1(index);
599       const int consumed = op & 15;
600       buffer_len_ -= consumed;
601       const auto emit_ofs = op >> 7;
602       switch ((op >> 4) & 7) {
603         case 0: {
604           sink_(GetEmit1(index, emit_ofs + 0));
605           sink_(GetEmit1(index, emit_ofs + 1));
606           break;
607         }
608         case 1: {
609           sink_(GetEmit1(index, emit_ofs + 0));
610           break;
611         }
612         case 2: {
613           DecodeStep0();
614           break;
615         }
616         case 3: {
617           DecodeStep1();
618           break;
619         }
620         case 4: {
621           DecodeStep2();
622           break;
623         }
624         case 5: {
625           DecodeStep3();
626           break;
627         }
628       }
629     }
630     return ok_;
631   }
632 
633  private:
RefillTo12()634   bool RefillTo12() {
635     switch (buffer_len_) {
636       case 0: {
637         return Read2to8Bytes();
638       }
639       case 1:
640       case 2:
641       case 3: {
642         return Read2to7Bytes();
643       }
644       case 4:
645       case 5:
646       case 6:
647       case 7:
648       case 8: {
649         return Read1to7Bytes();
650       }
651       case 9:
652       case 10:
653       case 11: {
654         return Read1to6Bytes();
655       }
656     }
657     return true;
658   }
Read2to8Bytes()659   bool Read2to8Bytes() {
660     switch (end_ - begin_) {
661       case 0:
662       case 1: {
663         return false;
664       }
665       case 2: {
666         Fill2();
667         return true;
668       }
669       case 3: {
670         Fill3();
671         return true;
672       }
673       case 4: {
674         Fill4();
675         return true;
676       }
677       case 5: {
678         Fill5();
679         return true;
680       }
681       case 6: {
682         Fill6();
683         return true;
684       }
685       case 7: {
686         Fill7();
687         return true;
688       }
689       default: {
690         Fill8();
691         return true;
692       }
693     }
694   }
Fill2()695   void Fill2() {
696     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
697               (static_cast<uint64_t>(begin_[1]) << 0);
698     begin_ += 2;
699     buffer_len_ += 16;
700   }
Fill3()701   void Fill3() {
702     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
703               (static_cast<uint64_t>(begin_[1]) << 8) |
704               (static_cast<uint64_t>(begin_[2]) << 0);
705     begin_ += 3;
706     buffer_len_ += 24;
707   }
Fill4()708   void Fill4() {
709     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
710               (static_cast<uint64_t>(begin_[1]) << 16) |
711               (static_cast<uint64_t>(begin_[2]) << 8) |
712               (static_cast<uint64_t>(begin_[3]) << 0);
713     begin_ += 4;
714     buffer_len_ += 32;
715   }
Fill5()716   void Fill5() {
717     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
718               (static_cast<uint64_t>(begin_[1]) << 24) |
719               (static_cast<uint64_t>(begin_[2]) << 16) |
720               (static_cast<uint64_t>(begin_[3]) << 8) |
721               (static_cast<uint64_t>(begin_[4]) << 0);
722     begin_ += 5;
723     buffer_len_ += 40;
724   }
Fill6()725   void Fill6() {
726     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
727               (static_cast<uint64_t>(begin_[1]) << 32) |
728               (static_cast<uint64_t>(begin_[2]) << 24) |
729               (static_cast<uint64_t>(begin_[3]) << 16) |
730               (static_cast<uint64_t>(begin_[4]) << 8) |
731               (static_cast<uint64_t>(begin_[5]) << 0);
732     begin_ += 6;
733     buffer_len_ += 48;
734   }
Fill7()735   void Fill7() {
736     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
737               (static_cast<uint64_t>(begin_[1]) << 40) |
738               (static_cast<uint64_t>(begin_[2]) << 32) |
739               (static_cast<uint64_t>(begin_[3]) << 24) |
740               (static_cast<uint64_t>(begin_[4]) << 16) |
741               (static_cast<uint64_t>(begin_[5]) << 8) |
742               (static_cast<uint64_t>(begin_[6]) << 0);
743     begin_ += 7;
744     buffer_len_ += 56;
745   }
Fill8()746   void Fill8() {
747     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
748               (static_cast<uint64_t>(begin_[1]) << 48) |
749               (static_cast<uint64_t>(begin_[2]) << 40) |
750               (static_cast<uint64_t>(begin_[3]) << 32) |
751               (static_cast<uint64_t>(begin_[4]) << 24) |
752               (static_cast<uint64_t>(begin_[5]) << 16) |
753               (static_cast<uint64_t>(begin_[6]) << 8) |
754               (static_cast<uint64_t>(begin_[7]) << 0);
755     begin_ += 8;
756     buffer_len_ += 64;
757   }
Read2to7Bytes()758   bool Read2to7Bytes() {
759     switch (end_ - begin_) {
760       case 0:
761       case 1: {
762         return false;
763       }
764       case 2: {
765         Fill2();
766         return true;
767       }
768       case 3: {
769         Fill3();
770         return true;
771       }
772       case 4: {
773         Fill4();
774         return true;
775       }
776       case 5: {
777         Fill5();
778         return true;
779       }
780       case 6: {
781         Fill6();
782         return true;
783       }
784       default: {
785         Fill7();
786         return true;
787       }
788     }
789   }
Read1to7Bytes()790   bool Read1to7Bytes() {
791     switch (end_ - begin_) {
792       case 0: {
793         return false;
794       }
795       case 1: {
796         Fill1();
797         return true;
798       }
799       case 2: {
800         Fill2();
801         return true;
802       }
803       case 3: {
804         Fill3();
805         return true;
806       }
807       case 4: {
808         Fill4();
809         return true;
810       }
811       case 5: {
812         Fill5();
813         return true;
814       }
815       case 6: {
816         Fill6();
817         return true;
818       }
819       default: {
820         Fill7();
821         return true;
822       }
823     }
824   }
Fill1()825   void Fill1() {
826     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
827     begin_ += 1;
828     buffer_len_ += 8;
829   }
Read1to6Bytes()830   bool Read1to6Bytes() {
831     switch (end_ - begin_) {
832       case 0: {
833         return false;
834       }
835       case 1: {
836         Fill1();
837         return true;
838       }
839       case 2: {
840         Fill2();
841         return true;
842       }
843       case 3: {
844         Fill3();
845         return true;
846       }
847       case 4: {
848         Fill4();
849         return true;
850       }
851       case 5: {
852         Fill5();
853         return true;
854       }
855       default: {
856         Fill6();
857         return true;
858       }
859     }
860   }
Done0()861   void Done0() {
862     done_ = true;
863     switch (end_ - begin_) {
864       case 1: {
865         Fill1();
866         break;
867       }
868     }
869     switch (buffer_len_) {
870       case 1:
871       case 2:
872       case 3:
873       case 4: {
874         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
875         return;
876       }
877       case 5: {
878         const auto index = buffer_ & 31;
879         const auto op = GetOp2(index);
880         switch (op & 3) {
881           case 0: {
882             sink_(GetEmit2(index, (op >> 2) + 0));
883             break;
884           }
885           case 1: {
886             ok_ = false;
887             break;
888           }
889         }
890         return;
891       }
892       case 6: {
893         const auto index = buffer_ & 63;
894         const auto op = GetOp3(index);
895         switch (op & 3) {
896           case 0: {
897             ok_ = false;
898             break;
899           }
900           case 1: {
901             sink_(GetEmit3(index, (op >> 2) + 0));
902             break;
903           }
904         }
905         return;
906       }
907       case 7: {
908         const auto index = buffer_ & 127;
909         const auto op = GetOp4(index);
910         switch (op & 3) {
911           case 0: {
912             ok_ = false;
913             break;
914           }
915           case 1: {
916             sink_(GetEmit4(index, (op >> 2) + 0));
917             break;
918           }
919         }
920         return;
921       }
922       case 8: {
923         const auto index = buffer_ & 255;
924         const auto op = GetOp5(index);
925         switch (op & 3) {
926           case 0: {
927             ok_ = false;
928             break;
929           }
930           case 1: {
931             sink_(GetEmit5(index, (op >> 2) + 0));
932             break;
933           }
934         }
935         return;
936       }
937       case 9: {
938         const auto index = buffer_ & 511;
939         const auto op = GetOp6(index);
940         switch (op & 3) {
941           case 0: {
942             ok_ = false;
943             break;
944           }
945           case 1: {
946             sink_(GetEmit6(index, (op >> 2) + 0));
947             break;
948           }
949         }
950         return;
951       }
952       case 10: {
953         const auto index = buffer_ & 1023;
954         const auto op = GetOp7(index);
955         switch (op & 3) {
956           case 0: {
957             sink_(GetEmit7(index, (op >> 2) + 0));
958             sink_(GetEmit7(index, (op >> 2) + 1));
959             break;
960           }
961           case 1: {
962             ok_ = false;
963             break;
964           }
965           case 2: {
966             sink_(GetEmit7(index, (op >> 2) + 0));
967             break;
968           }
969         }
970         return;
971       }
972       case 11: {
973         const auto index = buffer_ & 2047;
974         const auto op = GetOp8(index);
975         switch (op & 3) {
976           case 0: {
977             ok_ = false;
978             break;
979           }
980           case 1: {
981             sink_(GetEmit8(index, (op >> 2) + 0));
982             sink_(GetEmit8(index, (op >> 2) + 1));
983             break;
984           }
985           case 2: {
986             sink_(GetEmit8(index, (op >> 2) + 0));
987             break;
988           }
989         }
990         return;
991       }
992       case 0: {
993         return;
994       }
995     }
996   }
DecodeStep0()997   void DecodeStep0() {
998     if (!RefillTo1()) {
999       Done1();
1000       return;
1001     }
1002     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1003     const auto op = GetOp9(index);
1004     const int consumed = op & 1;
1005     buffer_len_ -= consumed;
1006     const auto emit_ofs = op >> 1;
1007     sink_(GetEmit9(index, emit_ofs + 0));
1008   }
RefillTo1()1009   bool RefillTo1() {
1010     switch (buffer_len_) {
1011       case 0: {
1012         return Read1to8Bytes();
1013       }
1014     }
1015     return true;
1016   }
Read1to8Bytes()1017   bool Read1to8Bytes() {
1018     switch (end_ - begin_) {
1019       case 0: {
1020         return false;
1021       }
1022       case 1: {
1023         Fill1();
1024         return true;
1025       }
1026       case 2: {
1027         Fill2();
1028         return true;
1029       }
1030       case 3: {
1031         Fill3();
1032         return true;
1033       }
1034       case 4: {
1035         Fill4();
1036         return true;
1037       }
1038       case 5: {
1039         Fill5();
1040         return true;
1041       }
1042       case 6: {
1043         Fill6();
1044         return true;
1045       }
1046       case 7: {
1047         Fill7();
1048         return true;
1049       }
1050       default: {
1051         Fill8();
1052         return true;
1053       }
1054     }
1055   }
Done1()1056   void Done1() {
1057     done_ = true;
1058     ok_ = false;
1059   }
DecodeStep1()1060   void DecodeStep1() {
1061     if (!RefillTo1()) {
1062       Done2();
1063       return;
1064     }
1065     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1066     const auto op = GetOp10(index);
1067     const int consumed = op & 1;
1068     buffer_len_ -= consumed;
1069     const auto emit_ofs = op >> 1;
1070     sink_(GetEmit10(index, emit_ofs + 0));
1071   }
Done2()1072   void Done2() {
1073     done_ = true;
1074     ok_ = false;
1075   }
DecodeStep2()1076   void DecodeStep2() {
1077     if (!RefillTo1()) {
1078       Done3();
1079       return;
1080     }
1081     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1082     const auto op = GetOp11(index);
1083     const int consumed = op & 1;
1084     buffer_len_ -= consumed;
1085     const auto emit_ofs = op >> 1;
1086     sink_(GetEmit11(index, emit_ofs + 0));
1087   }
Done3()1088   void Done3() {
1089     done_ = true;
1090     ok_ = false;
1091   }
DecodeStep3()1092   void DecodeStep3() {
1093     if (!RefillTo13()) {
1094       Done4();
1095       return;
1096     }
1097     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
1098     const auto op = GetOp12(index);
1099     const int consumed = op & 15;
1100     buffer_len_ -= consumed;
1101     const auto emit_ofs = op >> 9;
1102     switch ((op >> 4) & 31) {
1103       case 0: {
1104         sink_(GetEmit12(index, emit_ofs + 0));
1105         break;
1106       }
1107       case 1: {
1108         DecodeStep4();
1109         break;
1110       }
1111       case 2: {
1112         DecodeStep5();
1113         break;
1114       }
1115       case 3: {
1116         DecodeStep6();
1117         break;
1118       }
1119       case 4: {
1120         DecodeStep7();
1121         break;
1122       }
1123       case 5: {
1124         DecodeStep8();
1125         break;
1126       }
1127       case 6: {
1128         DecodeStep9();
1129         break;
1130       }
1131       case 7: {
1132         DecodeStep10();
1133         break;
1134       }
1135       case 8: {
1136         DecodeStep17();
1137         break;
1138       }
1139       case 9: {
1140         DecodeStep11();
1141         break;
1142       }
1143       case 10: {
1144         DecodeStep12();
1145         break;
1146       }
1147       case 11: {
1148         DecodeStep13();
1149         break;
1150       }
1151       case 12: {
1152         DecodeStep14();
1153         break;
1154       }
1155       case 13: {
1156         DecodeStep18();
1157         break;
1158       }
1159       case 14: {
1160         DecodeStep15();
1161         break;
1162       }
1163       case 15: {
1164         DecodeStep16();
1165         break;
1166       }
1167       case 16: {
1168         DecodeStep19();
1169         break;
1170       }
1171     }
1172   }
RefillTo13()1173   bool RefillTo13() {
1174     switch (buffer_len_) {
1175       case 0: {
1176         return Read2to8Bytes();
1177       }
1178       case 1:
1179       case 2:
1180       case 3:
1181       case 4: {
1182         return Read2to7Bytes();
1183       }
1184       case 5:
1185       case 6:
1186       case 7:
1187       case 8: {
1188         return Read1to7Bytes();
1189       }
1190       case 9:
1191       case 10:
1192       case 11:
1193       case 12: {
1194         return Read1to6Bytes();
1195       }
1196     }
1197     return true;
1198   }
Done4()1199   void Done4() {
1200     done_ = true;
1201     switch (end_ - begin_) {
1202       case 1: {
1203         Fill1();
1204         break;
1205       }
1206     }
1207     switch (buffer_len_) {
1208       case 1: {
1209         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1210         return;
1211       }
1212       case 2: {
1213         const auto index = buffer_ & 3;
1214         const auto op = GetOp13(index);
1215         switch (op & 3) {
1216           case 0: {
1217             sink_(GetEmit13(index, (op >> 2) + 0));
1218             break;
1219           }
1220           case 1: {
1221             ok_ = false;
1222             break;
1223           }
1224         }
1225         return;
1226       }
1227       case 3: {
1228         const auto index = buffer_ & 7;
1229         const auto op = GetOp14(index);
1230         switch (op & 3) {
1231           case 0: {
1232             ok_ = false;
1233             break;
1234           }
1235           case 1: {
1236             sink_(GetEmit14(index, (op >> 2) + 0));
1237             break;
1238           }
1239         }
1240         return;
1241       }
1242       case 4: {
1243         const auto index = buffer_ & 15;
1244         const auto op = GetOp15(index);
1245         switch (op & 3) {
1246           case 0: {
1247             ok_ = false;
1248             break;
1249           }
1250           case 1: {
1251             sink_(GetEmit15(index, (op >> 2) + 0));
1252             break;
1253           }
1254         }
1255         return;
1256       }
1257       case 5: {
1258         const auto index = buffer_ & 31;
1259         const auto op = GetOp16(index);
1260         switch (op & 3) {
1261           case 0: {
1262             ok_ = false;
1263             break;
1264           }
1265           case 1: {
1266             sink_(GetEmit16(index, (op >> 2) + 0));
1267             break;
1268           }
1269         }
1270         return;
1271       }
1272       case 6: {
1273         const auto index = buffer_ & 63;
1274         const auto op = GetOp17(index);
1275         switch (op & 3) {
1276           case 0: {
1277             ok_ = false;
1278             break;
1279           }
1280           case 1: {
1281             sink_(GetEmit17(index, (op >> 2) + 0));
1282             break;
1283           }
1284         }
1285         return;
1286       }
1287       case 7: {
1288         const auto index = buffer_ & 127;
1289         const auto op = GetOp18(index);
1290         switch (op & 3) {
1291           case 0: {
1292             sink_(GetEmit18(index, (op >> 2) + 0));
1293             sink_(GetEmit18(index, (op >> 2) + 1));
1294             break;
1295           }
1296           case 1: {
1297             ok_ = false;
1298             break;
1299           }
1300           case 2: {
1301             sink_(GetEmit18(index, (op >> 2) + 0));
1302             break;
1303           }
1304         }
1305         return;
1306       }
1307       case 8: {
1308         const auto index = buffer_ & 255;
1309         const auto op = GetOp19(index);
1310         switch (op & 3) {
1311           case 0: {
1312             ok_ = false;
1313             break;
1314           }
1315           case 1: {
1316             sink_(GetEmit19(index, (op >> 2) + 0));
1317             sink_(GetEmit19(index, (op >> 2) + 1));
1318             break;
1319           }
1320           case 2: {
1321             sink_(GetEmit19(index, (op >> 2) + 0));
1322             break;
1323           }
1324         }
1325         return;
1326       }
1327       case 9: {
1328         const auto index = buffer_ & 511;
1329         const auto op = GetOp20(index);
1330         switch (op & 3) {
1331           case 0: {
1332             ok_ = false;
1333             break;
1334           }
1335           case 1: {
1336             sink_(GetEmit20(index, (op >> 2) + 0));
1337             sink_(GetEmit20(index, (op >> 2) + 1));
1338             break;
1339           }
1340           case 2: {
1341             sink_(GetEmit20(index, (op >> 2) + 0));
1342             break;
1343           }
1344         }
1345         return;
1346       }
1347       case 10: {
1348         const auto index = buffer_ & 1023;
1349         const auto op = GetOp21(index);
1350         switch (op & 3) {
1351           case 0: {
1352             ok_ = false;
1353             break;
1354           }
1355           case 1: {
1356             sink_(GetEmit21(index, (op >> 2) + 0));
1357             sink_(GetEmit21(index, (op >> 2) + 1));
1358             break;
1359           }
1360           case 2: {
1361             sink_(GetEmit21(index, (op >> 2) + 0));
1362             break;
1363           }
1364         }
1365         return;
1366       }
1367       case 11: {
1368         const auto index = buffer_ & 2047;
1369         const auto op = GetOp22(index);
1370         switch (op & 3) {
1371           case 0: {
1372             ok_ = false;
1373             break;
1374           }
1375           case 1: {
1376             sink_(GetEmit22(index, (op >> 2) + 0));
1377             sink_(GetEmit22(index, (op >> 2) + 1));
1378             break;
1379           }
1380           case 2: {
1381             sink_(GetEmit22(index, (op >> 2) + 0));
1382             break;
1383           }
1384         }
1385         return;
1386       }
1387       case 12: {
1388         const auto index = buffer_ & 4095;
1389         const auto op = GetOp23(index);
1390         switch (op & 7) {
1391           case 0: {
1392             sink_(GetEmit23(index, (op >> 3) + 0));
1393             sink_(GetEmit23(index, (op >> 3) + 1));
1394             sink_(GetEmit23(index, (op >> 3) + 2));
1395             break;
1396           }
1397           case 1: {
1398             ok_ = false;
1399             break;
1400           }
1401           case 2: {
1402             sink_(GetEmit23(index, (op >> 3) + 0));
1403             sink_(GetEmit23(index, (op >> 3) + 1));
1404             break;
1405           }
1406           case 3: {
1407             sink_(GetEmit23(index, (op >> 3) + 0));
1408             break;
1409           }
1410         }
1411         return;
1412       }
1413       case 0: {
1414         return;
1415       }
1416     }
1417   }
DecodeStep4()1418   void DecodeStep4() {
1419     if (!RefillTo1()) {
1420       Done5();
1421       return;
1422     }
1423     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1424     const auto op = GetOp24(index);
1425     const int consumed = op & 1;
1426     buffer_len_ -= consumed;
1427     const auto emit_ofs = op >> 1;
1428     sink_(GetEmit24(index, emit_ofs + 0));
1429   }
Done5()1430   void Done5() {
1431     done_ = true;
1432     ok_ = false;
1433   }
DecodeStep5()1434   void DecodeStep5() {
1435     if (!RefillTo1()) {
1436       Done6();
1437       return;
1438     }
1439     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1440     const auto op = GetOp25(index);
1441     const int consumed = op & 1;
1442     buffer_len_ -= consumed;
1443     const auto emit_ofs = op >> 1;
1444     sink_(GetEmit25(index, emit_ofs + 0));
1445   }
Done6()1446   void Done6() {
1447     done_ = true;
1448     ok_ = false;
1449   }
DecodeStep6()1450   void DecodeStep6() {
1451     if (!RefillTo1()) {
1452       Done7();
1453       return;
1454     }
1455     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1456     const auto op = GetOp26(index);
1457     const int consumed = op & 1;
1458     buffer_len_ -= consumed;
1459     const auto emit_ofs = op >> 1;
1460     sink_(GetEmit26(index, emit_ofs + 0));
1461   }
Done7()1462   void Done7() {
1463     done_ = true;
1464     ok_ = false;
1465   }
DecodeStep7()1466   void DecodeStep7() {
1467     if (!RefillTo1()) {
1468       Done8();
1469       return;
1470     }
1471     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1472     const auto op = GetOp27(index);
1473     const int consumed = op & 1;
1474     buffer_len_ -= consumed;
1475     const auto emit_ofs = op >> 1;
1476     sink_(GetEmit27(index, emit_ofs + 0));
1477   }
Done8()1478   void Done8() {
1479     done_ = true;
1480     ok_ = false;
1481   }
DecodeStep8()1482   void DecodeStep8() {
1483     if (!RefillTo1()) {
1484       Done9();
1485       return;
1486     }
1487     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1488     const auto op = GetOp28(index);
1489     const int consumed = op & 1;
1490     buffer_len_ -= consumed;
1491     const auto emit_ofs = op >> 1;
1492     sink_(GetEmit28(index, emit_ofs + 0));
1493   }
Done9()1494   void Done9() {
1495     done_ = true;
1496     ok_ = false;
1497   }
DecodeStep9()1498   void DecodeStep9() {
1499     if (!RefillTo1()) {
1500       Done10();
1501       return;
1502     }
1503     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1504     const auto op = GetOp29(index);
1505     const int consumed = op & 1;
1506     buffer_len_ -= consumed;
1507     const auto emit_ofs = op >> 1;
1508     sink_(GetEmit29(index, emit_ofs + 0));
1509   }
Done10()1510   void Done10() {
1511     done_ = true;
1512     ok_ = false;
1513   }
DecodeStep10()1514   void DecodeStep10() {
1515     if (!RefillTo1()) {
1516       Done11();
1517       return;
1518     }
1519     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1520     const auto op = GetOp30(index);
1521     const int consumed = op & 1;
1522     buffer_len_ -= consumed;
1523     const auto emit_ofs = op >> 1;
1524     sink_(GetEmit30(index, emit_ofs + 0));
1525   }
Done11()1526   void Done11() {
1527     done_ = true;
1528     ok_ = false;
1529   }
DecodeStep11()1530   void DecodeStep11() {
1531     if (!RefillTo2()) {
1532       Done12();
1533       return;
1534     }
1535     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1536     const auto op = GetOp31(index);
1537     const int consumed = op & 3;
1538     buffer_len_ -= consumed;
1539     const auto emit_ofs = op >> 2;
1540     sink_(GetEmit31(index, emit_ofs + 0));
1541   }
RefillTo2()1542   bool RefillTo2() {
1543     switch (buffer_len_) {
1544       case 0: {
1545         return Read1to8Bytes();
1546       }
1547       case 1: {
1548         return Read1to7Bytes();
1549       }
1550     }
1551     return true;
1552   }
Done12()1553   void Done12() {
1554     done_ = true;
1555     switch (buffer_len_) {
1556       case 1:
1557       case 0: {
1558         ok_ = false;
1559         return;
1560       }
1561     }
1562   }
DecodeStep12()1563   void DecodeStep12() {
1564     if (!RefillTo2()) {
1565       Done13();
1566       return;
1567     }
1568     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1569     const auto op = GetOp32(index);
1570     const int consumed = op & 3;
1571     buffer_len_ -= consumed;
1572     const auto emit_ofs = op >> 2;
1573     sink_(GetEmit32(index, emit_ofs + 0));
1574   }
Done13()1575   void Done13() {
1576     done_ = true;
1577     switch (buffer_len_) {
1578       case 1:
1579       case 0: {
1580         ok_ = false;
1581         return;
1582       }
1583     }
1584   }
DecodeStep13()1585   void DecodeStep13() {
1586     if (!RefillTo2()) {
1587       Done14();
1588       return;
1589     }
1590     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1591     const auto op = GetOp33(index);
1592     const int consumed = op & 3;
1593     buffer_len_ -= consumed;
1594     const auto emit_ofs = op >> 2;
1595     sink_(GetEmit33(index, emit_ofs + 0));
1596   }
Done14()1597   void Done14() {
1598     done_ = true;
1599     switch (buffer_len_) {
1600       case 1:
1601       case 0: {
1602         ok_ = false;
1603         return;
1604       }
1605     }
1606   }
DecodeStep14()1607   void DecodeStep14() {
1608     if (!RefillTo2()) {
1609       Done15();
1610       return;
1611     }
1612     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1613     const auto op = GetOp34(index);
1614     const int consumed = op & 3;
1615     buffer_len_ -= consumed;
1616     const auto emit_ofs = op >> 2;
1617     sink_(GetEmit34(index, emit_ofs + 0));
1618   }
Done15()1619   void Done15() {
1620     done_ = true;
1621     switch (buffer_len_) {
1622       case 1:
1623       case 0: {
1624         ok_ = false;
1625         return;
1626       }
1627     }
1628   }
DecodeStep15()1629   void DecodeStep15() {
1630     if (!RefillTo3()) {
1631       Done16();
1632       return;
1633     }
1634     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1635     const auto op = GetOp35(index);
1636     const int consumed = op & 3;
1637     buffer_len_ -= consumed;
1638     const auto emit_ofs = op >> 2;
1639     sink_(GetEmit35(index, emit_ofs + 0));
1640   }
RefillTo3()1641   bool RefillTo3() {
1642     switch (buffer_len_) {
1643       case 0: {
1644         return Read1to8Bytes();
1645       }
1646       case 1:
1647       case 2: {
1648         return Read1to7Bytes();
1649       }
1650     }
1651     return true;
1652   }
Done16()1653   void Done16() {
1654     done_ = true;
1655     switch (buffer_len_) {
1656       case 1:
1657       case 2:
1658       case 0: {
1659         ok_ = false;
1660         return;
1661       }
1662     }
1663   }
DecodeStep16()1664   void DecodeStep16() {
1665     if (!RefillTo3()) {
1666       Done17();
1667       return;
1668     }
1669     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1670     const auto op = GetOp36(index);
1671     const int consumed = op & 3;
1672     buffer_len_ -= consumed;
1673     const auto emit_ofs = op >> 2;
1674     sink_(GetEmit36(index, emit_ofs + 0));
1675   }
Done17()1676   void Done17() {
1677     done_ = true;
1678     switch (buffer_len_) {
1679       case 1:
1680       case 2:
1681       case 0: {
1682         ok_ = false;
1683         return;
1684       }
1685     }
1686   }
DecodeStep17()1687   void DecodeStep17() {
1688     if (!RefillTo2()) {
1689       Done18();
1690       return;
1691     }
1692     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1693     const auto op = GetOp37(index);
1694     const int consumed = op & 3;
1695     buffer_len_ -= consumed;
1696     const auto emit_ofs = op >> 2;
1697     sink_(GetEmit37(index, emit_ofs + 0));
1698   }
Done18()1699   void Done18() {
1700     done_ = true;
1701     switch (buffer_len_) {
1702       case 1: {
1703         const auto index = buffer_ & 1;
1704         const auto op = GetOp38(index);
1705         switch (op & 1) {
1706           case 0: {
1707             sink_(GetEmit38(index, (op >> 1) + 0));
1708             break;
1709           }
1710           case 1: {
1711             ok_ = false;
1712             break;
1713           }
1714         }
1715         return;
1716       }
1717       case 0: {
1718         ok_ = false;
1719         return;
1720       }
1721     }
1722   }
DecodeStep18()1723   void DecodeStep18() {
1724     if (!RefillTo3()) {
1725       Done19();
1726       return;
1727     }
1728     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1729     const auto op = GetOp39(index);
1730     const int consumed = op & 3;
1731     buffer_len_ -= consumed;
1732     const auto emit_ofs = op >> 2;
1733     sink_(GetEmit39(index, emit_ofs + 0));
1734   }
Done19()1735   void Done19() {
1736     done_ = true;
1737     switch (buffer_len_) {
1738       case 1:
1739       case 0: {
1740         ok_ = false;
1741         return;
1742       }
1743       case 2: {
1744         const auto index = buffer_ & 3;
1745         const auto op = GetOp40(index);
1746         switch (op & 1) {
1747           case 0: {
1748             sink_(GetEmit40(index, (op >> 1) + 0));
1749             break;
1750           }
1751           case 1: {
1752             ok_ = false;
1753             break;
1754           }
1755         }
1756         return;
1757       }
1758     }
1759   }
DecodeStep19()1760   void DecodeStep19() {
1761     if (!RefillTo5()) {
1762       Done20();
1763       return;
1764     }
1765     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1766     const auto op = GetOp41(index);
1767     const int consumed = op & 7;
1768     buffer_len_ -= consumed;
1769     const auto emit_ofs = op >> 4;
1770     switch ((op >> 3) & 1) {
1771       case 0: {
1772         sink_(GetEmit41(index, emit_ofs + 0));
1773         break;
1774       }
1775       case 1: {
1776         begin_ = end_;
1777         buffer_len_ = 0;
1778         break;
1779       }
1780     }
1781   }
RefillTo5()1782   bool RefillTo5() {
1783     switch (buffer_len_) {
1784       case 0: {
1785         return Read1to8Bytes();
1786       }
1787       case 1:
1788       case 2:
1789       case 3:
1790       case 4: {
1791         return Read1to7Bytes();
1792       }
1793     }
1794     return true;
1795   }
Done20()1796   void Done20() {
1797     done_ = true;
1798     switch (buffer_len_) {
1799       case 1:
1800       case 2: {
1801         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1802         return;
1803       }
1804       case 3: {
1805         const auto index = buffer_ & 7;
1806         const auto op = GetOp42(index);
1807         switch (op & 1) {
1808           case 0: {
1809             sink_(GetEmit42(index, (op >> 1) + 0));
1810             break;
1811           }
1812         }
1813         return;
1814       }
1815       case 4: {
1816         const auto index = buffer_ & 15;
1817         const auto op = GetOp43(index);
1818         switch (op & 3) {
1819           case 0: {
1820             ok_ = false;
1821             break;
1822           }
1823           case 1: {
1824             sink_(GetEmit43(index, (op >> 2) + 0));
1825             break;
1826           }
1827         }
1828         return;
1829       }
1830       case 0: {
1831         return;
1832       }
1833     }
1834   }
1835   F sink_;
1836   const uint8_t* begin_;
1837   const uint8_t* const end_;
1838   uint64_t buffer_ = 0;
1839   int buffer_len_ = 0;
1840   bool ok_ = true;
1841   bool done_ = false;
1842 };
1843 }  // namespace geometry_12_13_5
1844 }  // namespace grpc_core
1845 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_13_5_H
1846