xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_11_14_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_11_14_5_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_14_5_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_11_14_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   }
GetOp1(size_t i)60   static inline uint64_t GetOp1(size_t i) {
61     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit1(size_t i,size_t emit)63   static inline uint64_t GetEmit1(size_t i, size_t emit) {
64     return table1_emit_[i >> 6][emit];
65   }
GetOp8(size_t i)66   static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return emit ? 62 : 35;
69   }
GetOp9(size_t i)70   static inline uint64_t GetOp9(size_t i) {
71     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
72   }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) {
74     return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64));
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) {
77     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
78   }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return table12_0_inner_[table12_0_outer_[i]];
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94));
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 table13_0_emit_[emit];
93   }
GetOp14(size_t i)94   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)95   static inline uint64_t GetEmit14(size_t, size_t emit) {
96     return table13_0_emit_[emit];
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)99   static inline uint64_t GetEmit15(size_t, size_t emit) {
100     return table13_0_emit_[emit];
101   }
GetOp16(size_t i)102   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)103   static inline uint64_t GetEmit16(size_t, size_t emit) {
104     return table16_0_emit_[emit];
105   }
GetOp17(size_t i)106   static inline uint64_t GetOp17(size_t i) {
107     return table17_ops_[i >> 6][i & 0x3f];
108   }
GetEmit17(size_t i,size_t emit)109   static inline uint64_t GetEmit17(size_t i, size_t emit) {
110     return table17_emit_[i >> 6][emit];
111   }
GetOp18(size_t i)112   static inline uint64_t GetOp18(size_t i) {
113     return table18_ops_[i >> 6][i & 0x3f];
114   }
GetEmit18(size_t i,size_t emit)115   static inline uint64_t GetEmit18(size_t i, size_t emit) {
116     return table18_emit_[i >> 6][emit];
117   }
GetOp19(size_t i)118   static inline uint64_t GetOp19(size_t i) {
119     return table19_ops_[i >> 6][i & 0x3f];
120   }
GetEmit19(size_t i,size_t emit)121   static inline uint64_t GetEmit19(size_t i, size_t emit) {
122     return table19_emit_[i >> 6][emit];
123   }
GetOp20(size_t i)124   static inline uint64_t GetOp20(size_t i) {
125     return table20_ops_[i >> 6][i & 0x3f];
126   }
GetEmit20(size_t i,size_t emit)127   static inline uint64_t GetEmit20(size_t i, size_t emit) {
128     return table20_emit_[i >> 6][emit];
129   }
GetOp21(size_t i)130   static inline uint64_t GetOp21(size_t i) {
131     return table21_ops_[i >> 6][i & 0x3f];
132   }
GetEmit21(size_t i,size_t emit)133   static inline uint64_t GetEmit21(size_t i, size_t emit) {
134     return table21_emit_[i >> 6][emit];
135   }
GetOp22(size_t i)136   static inline uint64_t GetOp22(size_t i) {
137     return table22_ops_[i >> 6][i & 0x3f];
138   }
GetEmit22(size_t i,size_t emit)139   static inline uint64_t GetEmit22(size_t i, size_t emit) {
140     return table22_emit_[i >> 6][emit];
141   }
GetOp10(size_t i)142   static inline uint64_t GetOp10(size_t i) {
143     return table10_ops_[i >> 9][i & 0x1ff];
144   }
GetEmit10(size_t i,size_t emit)145   static inline uint64_t GetEmit10(size_t i, size_t emit) {
146     return table10_emit_[i >> 9][emit];
147   }
GetOp23(size_t i)148   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)149   static inline uint64_t GetEmit23(size_t, size_t emit) { return emit + 192; }
GetOp24(size_t i)150   static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; }
GetEmit24(size_t,size_t emit)151   static inline uint64_t GetEmit24(size_t, size_t emit) { return emit + 200; }
GetOp25(size_t i)152   static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; }
GetEmit25(size_t,size_t emit)153   static inline uint64_t GetEmit25(size_t, size_t emit) {
154     return emit ? 205 : 202;
155   }
GetOp26(size_t i)156   static inline uint64_t GetOp26(size_t i) { return i ? 3 : 1; }
GetEmit26(size_t,size_t emit)157   static inline uint64_t GetEmit26(size_t, size_t emit) {
158     return emit ? 213 : 210;
159   }
GetOp27(size_t i)160   static inline uint64_t GetOp27(size_t i) { return i ? 3 : 1; }
GetEmit27(size_t,size_t emit)161   static inline uint64_t GetEmit27(size_t, size_t emit) { return emit + 218; }
GetOp28(size_t i)162   static inline uint64_t GetOp28(size_t i) { return i ? 3 : 1; }
GetEmit28(size_t,size_t emit)163   static inline uint64_t GetEmit28(size_t, size_t emit) {
164     return emit ? 240 : 238;
165   }
GetOp29(size_t i)166   static inline uint64_t GetOp29(size_t i) { return i ? 3 : 1; }
GetEmit29(size_t,size_t emit)167   static inline uint64_t GetEmit29(size_t, size_t emit) { return emit + 242; }
GetOp30(size_t i)168   static inline uint64_t GetOp30(size_t i) {
169     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
170   }
GetEmit30(size_t,size_t emit)171   static inline uint64_t GetEmit30(size_t, size_t emit) {
172     return (emit < 2 ? (emit + 211) : ((emit - 2) ? 221 : 214));
173   }
GetOp31(size_t i)174   static inline uint64_t GetOp31(size_t i) {
175     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
176   }
GetEmit31(size_t,size_t emit)177   static inline uint64_t GetEmit31(size_t, size_t emit) {
178     return (emit < 2 ? (emit + 222) : ((emit - 2) ? 244 : 241));
179   }
GetOp32(size_t i)180   static inline uint64_t GetOp32(size_t i) {
181     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
182   }
GetEmit32(size_t,size_t emit)183   static inline uint64_t GetEmit32(size_t, size_t emit) { return emit + 245; }
GetOp33(size_t i)184   static inline uint64_t GetOp33(size_t i) {
185     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
186   }
GetEmit33(size_t,size_t emit)187   static inline uint64_t GetEmit33(size_t, size_t emit) { return emit + 250; }
GetOp34(size_t i)188   static inline uint64_t GetOp34(size_t i) { return table34_0_inner_[i]; }
GetEmit34(size_t,size_t emit)189   static inline uint64_t GetEmit34(size_t, size_t emit) {
190     return table34_0_emit_[emit];
191   }
GetOp35(size_t i)192   static inline uint64_t GetOp35(size_t i) { return table34_0_inner_[i]; }
GetEmit35(size_t,size_t emit)193   static inline uint64_t GetEmit35(size_t, size_t emit) {
194     return (emit < 3 ? (emit + 19) : ((emit - 3) + 23));
195   }
GetOp37(size_t i)196   static inline uint64_t GetOp37(size_t i) { return i; }
GetEmit37(size_t,size_t emit)197   static inline uint64_t GetEmit37(size_t, size_t emit) {
198     return ((void)emit, 255);
199   }
GetOp36(size_t i)200   static inline uint64_t GetOp36(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   }
GetEmit36(size_t,size_t emit)205   static inline uint64_t GetEmit36(size_t, size_t emit) {
206     return (emit < 1 ? (((void)emit, 255)) : ((emit - 1) + 203));
207   }
GetOp39(size_t i)208   static inline uint64_t GetOp39(size_t i) {
209     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
210   }
GetEmit39(size_t,size_t emit)211   static inline uint64_t GetEmit39(size_t, size_t emit) {
212     return ((void)emit, 254);
213   }
GetOp38(size_t i)214   static inline uint64_t GetOp38(size_t i) {
215     return table38_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
216   }
GetEmit38(size_t,size_t emit)217   static inline uint64_t GetEmit38(size_t, size_t emit) {
218     return (emit < 1 ? (((void)emit, 254)) : ((emit - 1) + 2));
219   }
GetOp41(size_t i)220   static inline uint64_t GetOp41(size_t i) { return table41_0_inner_[i]; }
GetEmit41(size_t,size_t emit)221   static inline uint64_t GetEmit41(size_t, size_t emit) {
222     return table41_0_emit_[emit];
223   }
GetOp42(size_t i)224   static inline uint64_t GetOp42(size_t i) {
225     return table13_0_inner_[table42_0_outer_[i]];
226   }
GetEmit42(size_t,size_t emit)227   static inline uint64_t GetEmit42(size_t, size_t emit) {
228     return table41_0_emit_[emit];
229   }
GetOp40(size_t i)230   static inline uint64_t GetOp40(size_t i) { return table40_0_ops_[i]; }
GetEmit40(size_t,size_t emit)231   static inline uint64_t GetEmit40(size_t, size_t emit) {
232     return table40_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 table1_0_emit_[71];
292   static const uint16_t table1_0_inner_[37];
293   static const uint8_t table1_0_outer_[64];
294   static const uint8_t table1_1_emit_[71];
295   static const uint16_t table1_1_inner_[37];
296   static const uint8_t table1_2_emit_[71];
297   static const uint16_t table1_2_inner_[37];
298   static const uint8_t table1_3_emit_[71];
299   static const uint16_t table1_3_inner_[37];
300   static const uint8_t table1_4_emit_[71];
301   static const uint16_t table1_4_inner_[37];
302   static const uint8_t table1_5_emit_[71];
303   static const uint16_t table1_5_inner_[37];
304   static const uint8_t table1_6_emit_[71];
305   static const uint16_t table1_6_inner_[37];
306   static const uint8_t table1_7_emit_[71];
307   static const uint16_t table1_7_inner_[37];
308   static const uint8_t table1_8_emit_[71];
309   static const uint16_t table1_8_inner_[37];
310   static const uint8_t table1_9_emit_[71];
311   static const uint16_t table1_9_inner_[37];
312   static const uint8_t table1_10_emit_[40];
313   static const uint16_t table1_10_inner_[22];
314   static const uint8_t table1_10_outer_[64];
315   static const uint8_t table1_11_emit_[40];
316   static const uint8_t table1_12_emit_[40];
317   static const uint8_t table1_13_emit_[40];
318   static const uint8_t table1_14_emit_[40];
319   static const uint8_t table1_15_emit_[40];
320   static const uint8_t table1_16_emit_[40];
321   static const uint8_t table1_17_emit_[40];
322   static const uint8_t table1_18_emit_[40];
323   static const uint8_t table1_19_emit_[40];
324   static const uint8_t table1_20_emit_[40];
325   static const uint8_t table1_21_emit_[40];
326   static const uint8_t table1_22_emit_[40];
327   static const uint8_t table1_23_emit_[4];
328   static const uint16_t table1_23_inner_[4];
329   static const uint8_t table1_23_outer_[64];
330   static const uint8_t table1_24_emit_[4];
331   static const uint8_t table1_25_emit_[4];
332   static const uint8_t table1_26_emit_[4];
333   static const uint8_t table1_27_emit_[4];
334   static const uint8_t table1_28_emit_[4];
335   static const uint8_t table1_29_emit_[4];
336   static const uint8_t table1_30_emit_[4];
337   static const uint8_t table1_31_emit_[14];
338   static const uint16_t table1_31_inner_[17];
339   static const uint8_t table1_31_outer_[64];
340   static const uint8_t* const table1_emit_[32];
341   static const uint16_t* const table1_inner_[32];
342   static const uint8_t* const table1_outer_[32];
343   static const uint8_t table12_0_inner_[6];
344   static const uint8_t table12_0_outer_[8];
345   static const uint8_t table13_0_emit_[7];
346   static const uint8_t table13_0_inner_[9];
347   static const uint8_t table13_0_outer_[16];
348   static const uint8_t table14_0_ops_[32];
349   static const uint8_t table15_0_ops_[64];
350   static const uint8_t table16_0_emit_[45];
351   static const uint8_t table16_0_ops_[128];
352   static const uint8_t table17_0_emit_[72];
353   static const uint16_t table17_0_ops_[64];
354   static const uint8_t table17_1_emit_[72];
355   static const uint8_t table17_2_emit_[40];
356   static const uint16_t table17_2_ops_[64];
357   static const uint8_t table17_3_emit_[6];
358   static const uint16_t table17_3_ops_[64];
359   static const uint8_t* const table17_emit_[4];
360   static const uint16_t* const table17_ops_[4];
361   static const uint8_t table18_0_emit_[44];
362   static const uint16_t table18_0_ops_[64];
363   static const uint8_t table18_1_emit_[92];
364   static const uint16_t table18_1_ops_[64];
365   static const uint8_t table18_2_emit_[44];
366   static const uint8_t table18_3_emit_[92];
367   static const uint8_t table18_4_emit_[72];
368   static const uint8_t table18_5_emit_[72];
369   static const uint8_t table18_6_emit_[40];
370   static const uint8_t table18_7_emit_[31];
371   static const uint16_t table18_7_ops_[64];
372   static const uint8_t* const table18_emit_[8];
373   static const uint16_t* const table18_ops_[8];
374   static const uint8_t table19_0_emit_[16];
375   static const uint16_t table19_0_ops_[64];
376   static const uint8_t table19_1_emit_[28];
377   static const uint16_t table19_1_ops_[64];
378   static const uint8_t table19_2_emit_[36];
379   static const uint16_t table19_2_ops_[64];
380   static const uint8_t table19_3_emit_[68];
381   static const uint16_t table19_3_ops_[64];
382   static const uint8_t table19_4_emit_[16];
383   static const uint8_t table19_5_emit_[28];
384   static const uint8_t table19_6_emit_[36];
385   static const uint8_t table19_7_emit_[68];
386   static const uint8_t table19_8_emit_[44];
387   static const uint8_t table19_9_emit_[92];
388   static const uint8_t table19_10_emit_[44];
389   static const uint8_t table19_11_emit_[92];
390   static const uint8_t table19_12_emit_[72];
391   static const uint8_t table19_13_emit_[72];
392   static const uint8_t table19_14_emit_[72];
393   static const uint8_t table19_15_emit_[24];
394   static const uint16_t table19_15_ops_[64];
395   static const uint8_t* const table19_emit_[16];
396   static const uint16_t* const table19_ops_[16];
397   static const uint8_t table20_0_emit_[8];
398   static const uint16_t table20_0_ops_[64];
399   static const uint8_t table20_1_emit_[8];
400   static const uint8_t table20_2_emit_[12];
401   static const uint16_t table20_2_ops_[64];
402   static const uint8_t table20_3_emit_[16];
403   static const uint8_t table20_4_emit_[16];
404   static const uint8_t table20_5_emit_[20];
405   static const uint16_t table20_5_ops_[64];
406   static const uint8_t table20_6_emit_[32];
407   static const uint16_t table20_6_ops_[64];
408   static const uint8_t table20_7_emit_[36];
409   static const uint16_t table20_7_ops_[64];
410   static const uint8_t table20_8_emit_[8];
411   static const uint8_t table20_9_emit_[8];
412   static const uint8_t table20_10_emit_[12];
413   static const uint8_t table20_11_emit_[16];
414   static const uint8_t table20_12_emit_[16];
415   static const uint8_t table20_13_emit_[20];
416   static const uint8_t table20_14_emit_[32];
417   static const uint8_t table20_15_emit_[36];
418   static const uint8_t table20_16_emit_[16];
419   static const uint8_t table20_17_emit_[28];
420   static const uint8_t table20_18_emit_[36];
421   static const uint8_t table20_19_emit_[68];
422   static const uint8_t table20_20_emit_[16];
423   static const uint8_t table20_21_emit_[28];
424   static const uint8_t table20_22_emit_[36];
425   static const uint8_t table20_23_emit_[68];
426   static const uint8_t table20_24_emit_[44];
427   static const uint8_t table20_25_emit_[92];
428   static const uint8_t table20_26_emit_[44];
429   static const uint8_t table20_27_emit_[92];
430   static const uint8_t table20_28_emit_[44];
431   static const uint8_t table20_29_emit_[92];
432   static const uint8_t table20_30_emit_[15];
433   static const uint16_t table20_30_ops_[64];
434   static const uint8_t table20_31_emit_[35];
435   static const uint16_t table20_31_ops_[64];
436   static const uint8_t* const table20_emit_[32];
437   static const uint16_t* const table20_ops_[32];
438   static const uint8_t table21_0_emit_[60];
439   static const uint16_t table21_0_ops_[64];
440   static const uint8_t table21_1_emit_[60];
441   static const uint8_t table21_2_emit_[60];
442   static const uint8_t table21_3_emit_[60];
443   static const uint8_t table21_4_emit_[60];
444   static const uint8_t table21_5_emit_[8];
445   static const uint16_t table21_5_ops_[64];
446   static const uint8_t table21_6_emit_[8];
447   static const uint8_t table21_7_emit_[8];
448   static const uint8_t table21_8_emit_[8];
449   static const uint8_t table21_9_emit_[8];
450   static const uint8_t table21_10_emit_[8];
451   static const uint8_t table21_11_emit_[12];
452   static const uint16_t table21_11_ops_[64];
453   static const uint8_t table21_12_emit_[16];
454   static const uint16_t table21_12_ops_[64];
455   static const uint8_t table21_13_emit_[16];
456   static const uint8_t table21_14_emit_[16];
457   static const uint8_t table21_15_emit_[30];
458   static const uint16_t table21_15_ops_[64];
459   static const uint8_t table21_16_emit_[60];
460   static const uint8_t table21_17_emit_[60];
461   static const uint8_t table21_18_emit_[60];
462   static const uint8_t table21_19_emit_[60];
463   static const uint8_t table21_20_emit_[60];
464   static const uint8_t table21_21_emit_[8];
465   static const uint8_t table21_22_emit_[8];
466   static const uint8_t table21_23_emit_[8];
467   static const uint8_t table21_24_emit_[8];
468   static const uint8_t table21_25_emit_[8];
469   static const uint8_t table21_26_emit_[8];
470   static const uint8_t table21_27_emit_[12];
471   static const uint8_t table21_28_emit_[16];
472   static const uint8_t table21_29_emit_[16];
473   static const uint8_t table21_30_emit_[16];
474   static const uint8_t table21_31_emit_[30];
475   static const uint8_t table21_32_emit_[8];
476   static const uint8_t table21_33_emit_[8];
477   static const uint8_t table21_34_emit_[12];
478   static const uint8_t table21_35_emit_[16];
479   static const uint8_t table21_36_emit_[16];
480   static const uint8_t table21_37_emit_[20];
481   static const uint16_t table21_37_ops_[64];
482   static const uint8_t table21_38_emit_[32];
483   static const uint16_t table21_38_ops_[64];
484   static const uint8_t table21_39_emit_[36];
485   static const uint16_t table21_39_ops_[64];
486   static const uint8_t table21_40_emit_[8];
487   static const uint8_t table21_41_emit_[8];
488   static const uint8_t table21_42_emit_[12];
489   static const uint8_t table21_43_emit_[16];
490   static const uint8_t table21_44_emit_[16];
491   static const uint8_t table21_45_emit_[20];
492   static const uint8_t table21_46_emit_[32];
493   static const uint8_t table21_47_emit_[36];
494   static const uint8_t table21_48_emit_[16];
495   static const uint8_t table21_49_emit_[28];
496   static const uint16_t table21_49_ops_[64];
497   static const uint8_t table21_50_emit_[36];
498   static const uint16_t table21_50_ops_[64];
499   static const uint8_t table21_51_emit_[68];
500   static const uint16_t table21_51_ops_[64];
501   static const uint8_t table21_52_emit_[16];
502   static const uint8_t table21_53_emit_[28];
503   static const uint8_t table21_54_emit_[36];
504   static const uint8_t table21_55_emit_[68];
505   static const uint8_t table21_56_emit_[16];
506   static const uint8_t table21_57_emit_[28];
507   static const uint8_t table21_58_emit_[36];
508   static const uint8_t table21_59_emit_[68];
509   static const uint8_t table21_60_emit_[5];
510   static const uint16_t table21_60_ops_[64];
511   static const uint8_t table21_61_emit_[10];
512   static const uint16_t table21_61_ops_[64];
513   static const uint8_t table21_62_emit_[23];
514   static const uint16_t table21_62_ops_[64];
515   static const uint8_t table21_63_emit_[41];
516   static const uint16_t table21_63_ops_[64];
517   static const uint8_t* const table21_emit_[64];
518   static const uint16_t* const table21_ops_[64];
519   static const uint8_t table22_0_emit_[108];
520   static const uint16_t table22_0_ops_[64];
521   static const uint8_t table22_1_emit_[108];
522   static const uint8_t table22_2_emit_[108];
523   static const uint8_t table22_3_emit_[108];
524   static const uint8_t table22_4_emit_[108];
525   static const uint8_t table22_5_emit_[108];
526   static const uint8_t table22_6_emit_[108];
527   static const uint8_t table22_7_emit_[108];
528   static const uint8_t table22_8_emit_[108];
529   static const uint8_t table22_9_emit_[108];
530   static const uint8_t table22_10_emit_[60];
531   static const uint16_t table22_10_ops_[64];
532   static const uint8_t table22_11_emit_[60];
533   static const uint8_t table22_12_emit_[60];
534   static const uint8_t table22_13_emit_[60];
535   static const uint8_t table22_14_emit_[60];
536   static const uint8_t table22_15_emit_[60];
537   static const uint8_t table22_16_emit_[60];
538   static const uint8_t table22_17_emit_[60];
539   static const uint8_t table22_18_emit_[60];
540   static const uint8_t table22_19_emit_[60];
541   static const uint8_t table22_20_emit_[60];
542   static const uint8_t table22_21_emit_[60];
543   static const uint8_t table22_22_emit_[60];
544   static const uint8_t table22_23_emit_[8];
545   static const uint16_t table22_23_ops_[64];
546   static const uint8_t table22_24_emit_[8];
547   static const uint8_t table22_25_emit_[8];
548   static const uint8_t table22_26_emit_[8];
549   static const uint8_t table22_27_emit_[8];
550   static const uint8_t table22_28_emit_[8];
551   static const uint8_t table22_29_emit_[8];
552   static const uint8_t table22_30_emit_[8];
553   static const uint8_t table22_31_emit_[28];
554   static const uint16_t table22_31_ops_[64];
555   static const uint8_t table22_32_emit_[108];
556   static const uint8_t table22_33_emit_[108];
557   static const uint8_t table22_34_emit_[108];
558   static const uint8_t table22_35_emit_[108];
559   static const uint8_t table22_36_emit_[108];
560   static const uint8_t table22_37_emit_[108];
561   static const uint8_t table22_38_emit_[108];
562   static const uint8_t table22_39_emit_[108];
563   static const uint8_t table22_40_emit_[108];
564   static const uint8_t table22_41_emit_[108];
565   static const uint8_t table22_42_emit_[60];
566   static const uint8_t table22_43_emit_[60];
567   static const uint8_t table22_44_emit_[60];
568   static const uint8_t table22_45_emit_[60];
569   static const uint8_t table22_46_emit_[60];
570   static const uint8_t table22_47_emit_[60];
571   static const uint8_t table22_48_emit_[60];
572   static const uint8_t table22_49_emit_[60];
573   static const uint8_t table22_50_emit_[60];
574   static const uint8_t table22_51_emit_[60];
575   static const uint8_t table22_52_emit_[60];
576   static const uint8_t table22_53_emit_[60];
577   static const uint8_t table22_54_emit_[60];
578   static const uint8_t table22_55_emit_[8];
579   static const uint8_t table22_56_emit_[8];
580   static const uint8_t table22_57_emit_[8];
581   static const uint8_t table22_58_emit_[8];
582   static const uint8_t table22_59_emit_[8];
583   static const uint8_t table22_60_emit_[8];
584   static const uint8_t table22_61_emit_[8];
585   static const uint8_t table22_62_emit_[8];
586   static const uint8_t table22_63_emit_[28];
587   static const uint8_t table22_64_emit_[60];
588   static const uint8_t table22_65_emit_[60];
589   static const uint8_t table22_66_emit_[60];
590   static const uint8_t table22_67_emit_[60];
591   static const uint8_t table22_68_emit_[60];
592   static const uint8_t table22_69_emit_[8];
593   static const uint8_t table22_70_emit_[8];
594   static const uint8_t table22_71_emit_[8];
595   static const uint8_t table22_72_emit_[8];
596   static const uint8_t table22_73_emit_[8];
597   static const uint8_t table22_74_emit_[8];
598   static const uint8_t table22_75_emit_[12];
599   static const uint16_t table22_75_ops_[64];
600   static const uint8_t table22_76_emit_[16];
601   static const uint16_t table22_76_ops_[64];
602   static const uint8_t table22_77_emit_[16];
603   static const uint8_t table22_78_emit_[16];
604   static const uint8_t table22_79_emit_[30];
605   static const uint16_t table22_79_ops_[64];
606   static const uint8_t table22_80_emit_[60];
607   static const uint8_t table22_81_emit_[60];
608   static const uint8_t table22_82_emit_[60];
609   static const uint8_t table22_83_emit_[60];
610   static const uint8_t table22_84_emit_[60];
611   static const uint8_t table22_85_emit_[8];
612   static const uint8_t table22_86_emit_[8];
613   static const uint8_t table22_87_emit_[8];
614   static const uint8_t table22_88_emit_[8];
615   static const uint8_t table22_89_emit_[8];
616   static const uint8_t table22_90_emit_[8];
617   static const uint8_t table22_91_emit_[12];
618   static const uint8_t table22_92_emit_[16];
619   static const uint8_t table22_93_emit_[16];
620   static const uint8_t table22_94_emit_[16];
621   static const uint8_t table22_95_emit_[30];
622   static const uint8_t table22_96_emit_[8];
623   static const uint8_t table22_97_emit_[8];
624   static const uint8_t table22_98_emit_[12];
625   static const uint8_t table22_99_emit_[16];
626   static const uint8_t table22_100_emit_[16];
627   static const uint8_t table22_101_emit_[20];
628   static const uint16_t table22_101_ops_[64];
629   static const uint8_t table22_102_emit_[32];
630   static const uint16_t table22_102_ops_[64];
631   static const uint8_t table22_103_emit_[36];
632   static const uint16_t table22_103_ops_[64];
633   static const uint8_t table22_104_emit_[8];
634   static const uint8_t table22_105_emit_[8];
635   static const uint8_t table22_106_emit_[12];
636   static const uint8_t table22_107_emit_[16];
637   static const uint8_t table22_108_emit_[16];
638   static const uint8_t table22_109_emit_[20];
639   static const uint8_t table22_110_emit_[32];
640   static const uint8_t table22_111_emit_[36];
641   static const uint8_t table22_112_emit_[8];
642   static const uint8_t table22_113_emit_[8];
643   static const uint8_t table22_114_emit_[12];
644   static const uint8_t table22_115_emit_[16];
645   static const uint8_t table22_116_emit_[16];
646   static const uint8_t table22_117_emit_[20];
647   static const uint8_t table22_118_emit_[32];
648   static const uint8_t table22_119_emit_[36];
649   static const uint8_t table22_120_emit_[40];
650   static const uint16_t table22_120_ops_[64];
651   static const uint8_t table22_121_emit_[22];
652   static const uint16_t table22_121_ops_[64];
653   static const uint8_t table22_122_emit_[4];
654   static const uint16_t table22_122_ops_[64];
655   static const uint8_t table22_123_emit_[6];
656   static const uint16_t table22_123_ops_[64];
657   static const uint8_t table22_124_emit_[8];
658   static const uint16_t table22_124_ops_[64];
659   static const uint8_t table22_125_emit_[15];
660   static const uint16_t table22_125_ops_[64];
661   static const uint8_t table22_126_emit_[20];
662   static const uint16_t table22_126_ops_[64];
663   static const uint8_t table22_127_emit_[33];
664   static const uint16_t table22_127_ops_[64];
665   static const uint8_t* const table22_emit_[128];
666   static const uint16_t* const table22_ops_[128];
667   static const uint8_t table10_0_emit_[1];
668   static const uint16_t table10_0_ops_[512];
669   static const uint8_t table10_8_emit_[1];
670   static const uint8_t table10_16_emit_[1];
671   static const uint16_t table10_16_ops_[512];
672   static const uint8_t table10_20_emit_[1];
673   static const uint8_t table10_24_emit_[1];
674   static const uint16_t table10_24_ops_[512];
675   static const uint8_t table10_26_emit_[1];
676   static const uint8_t table10_28_emit_[1];
677   static const uint16_t table10_30_ops_[512];
678   static const uint8_t table10_31_emit_[80];
679   static const uint16_t table10_31_ops_[512];
680   static const uint8_t* const table10_emit_[32];
681   static const uint16_t* const table10_ops_[32];
682   static const uint8_t table34_0_emit_[8];
683   static const uint8_t table34_0_inner_[8];
684   static const uint8_t table38_0_inner_[7];
685   static const uint8_t table41_0_emit_[7];
686   static const uint8_t table41_0_inner_[8];
687   static const uint8_t table42_0_outer_[16];
688   static const uint8_t table40_0_emit_[10];
689   static const uint8_t table40_0_ops_[32];
690 };
691 template <typename F>
692 class HuffDecoder : public HuffDecoderCommon {
693  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)694   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
695       : sink_(sink), begin_(begin), end_(end) {}
Run()696   bool Run() {
697     while (!done_) {
698       if (!RefillTo11()) {
699         Done0();
700         break;
701       }
702       const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
703       const auto op = GetOp1(index);
704       const int consumed = op & 15;
705       buffer_len_ -= consumed;
706       const auto emit_ofs = op >> 7;
707       switch ((op >> 4) & 7) {
708         case 0: {
709           sink_(GetEmit1(index, emit_ofs + 0));
710           sink_(GetEmit1(index, emit_ofs + 1));
711           break;
712         }
713         case 1: {
714           sink_(GetEmit1(index, emit_ofs + 0));
715           break;
716         }
717         case 2: {
718           DecodeStep0();
719           break;
720         }
721         case 3: {
722           DecodeStep1();
723           break;
724         }
725         case 4: {
726           DecodeStep2();
727           break;
728         }
729       }
730     }
731     return ok_;
732   }
733 
734  private:
RefillTo11()735   bool RefillTo11() {
736     switch (buffer_len_) {
737       case 0: {
738         return Read2to8Bytes();
739       }
740       case 1:
741       case 2: {
742         return Read2to7Bytes();
743       }
744       case 3:
745       case 4:
746       case 5:
747       case 6:
748       case 7:
749       case 8: {
750         return Read1to7Bytes();
751       }
752       case 9:
753       case 10: {
754         return Read1to6Bytes();
755       }
756     }
757     return true;
758   }
Read2to8Bytes()759   bool Read2to8Bytes() {
760     switch (end_ - begin_) {
761       case 0:
762       case 1: {
763         return false;
764       }
765       case 2: {
766         Fill2();
767         return true;
768       }
769       case 3: {
770         Fill3();
771         return true;
772       }
773       case 4: {
774         Fill4();
775         return true;
776       }
777       case 5: {
778         Fill5();
779         return true;
780       }
781       case 6: {
782         Fill6();
783         return true;
784       }
785       case 7: {
786         Fill7();
787         return true;
788       }
789       default: {
790         Fill8();
791         return true;
792       }
793     }
794   }
Fill2()795   void Fill2() {
796     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
797               (static_cast<uint64_t>(begin_[1]) << 0);
798     begin_ += 2;
799     buffer_len_ += 16;
800   }
Fill3()801   void Fill3() {
802     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
803               (static_cast<uint64_t>(begin_[1]) << 8) |
804               (static_cast<uint64_t>(begin_[2]) << 0);
805     begin_ += 3;
806     buffer_len_ += 24;
807   }
Fill4()808   void Fill4() {
809     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
810               (static_cast<uint64_t>(begin_[1]) << 16) |
811               (static_cast<uint64_t>(begin_[2]) << 8) |
812               (static_cast<uint64_t>(begin_[3]) << 0);
813     begin_ += 4;
814     buffer_len_ += 32;
815   }
Fill5()816   void Fill5() {
817     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
818               (static_cast<uint64_t>(begin_[1]) << 24) |
819               (static_cast<uint64_t>(begin_[2]) << 16) |
820               (static_cast<uint64_t>(begin_[3]) << 8) |
821               (static_cast<uint64_t>(begin_[4]) << 0);
822     begin_ += 5;
823     buffer_len_ += 40;
824   }
Fill6()825   void Fill6() {
826     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
827               (static_cast<uint64_t>(begin_[1]) << 32) |
828               (static_cast<uint64_t>(begin_[2]) << 24) |
829               (static_cast<uint64_t>(begin_[3]) << 16) |
830               (static_cast<uint64_t>(begin_[4]) << 8) |
831               (static_cast<uint64_t>(begin_[5]) << 0);
832     begin_ += 6;
833     buffer_len_ += 48;
834   }
Fill7()835   void Fill7() {
836     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
837               (static_cast<uint64_t>(begin_[1]) << 40) |
838               (static_cast<uint64_t>(begin_[2]) << 32) |
839               (static_cast<uint64_t>(begin_[3]) << 24) |
840               (static_cast<uint64_t>(begin_[4]) << 16) |
841               (static_cast<uint64_t>(begin_[5]) << 8) |
842               (static_cast<uint64_t>(begin_[6]) << 0);
843     begin_ += 7;
844     buffer_len_ += 56;
845   }
Fill8()846   void Fill8() {
847     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
848               (static_cast<uint64_t>(begin_[1]) << 48) |
849               (static_cast<uint64_t>(begin_[2]) << 40) |
850               (static_cast<uint64_t>(begin_[3]) << 32) |
851               (static_cast<uint64_t>(begin_[4]) << 24) |
852               (static_cast<uint64_t>(begin_[5]) << 16) |
853               (static_cast<uint64_t>(begin_[6]) << 8) |
854               (static_cast<uint64_t>(begin_[7]) << 0);
855     begin_ += 8;
856     buffer_len_ += 64;
857   }
Read2to7Bytes()858   bool Read2to7Bytes() {
859     switch (end_ - begin_) {
860       case 0:
861       case 1: {
862         return false;
863       }
864       case 2: {
865         Fill2();
866         return true;
867       }
868       case 3: {
869         Fill3();
870         return true;
871       }
872       case 4: {
873         Fill4();
874         return true;
875       }
876       case 5: {
877         Fill5();
878         return true;
879       }
880       case 6: {
881         Fill6();
882         return true;
883       }
884       default: {
885         Fill7();
886         return true;
887       }
888     }
889   }
Read1to7Bytes()890   bool Read1to7Bytes() {
891     switch (end_ - begin_) {
892       case 0: {
893         return false;
894       }
895       case 1: {
896         Fill1();
897         return true;
898       }
899       case 2: {
900         Fill2();
901         return true;
902       }
903       case 3: {
904         Fill3();
905         return true;
906       }
907       case 4: {
908         Fill4();
909         return true;
910       }
911       case 5: {
912         Fill5();
913         return true;
914       }
915       case 6: {
916         Fill6();
917         return true;
918       }
919       default: {
920         Fill7();
921         return true;
922       }
923     }
924   }
Fill1()925   void Fill1() {
926     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
927     begin_ += 1;
928     buffer_len_ += 8;
929   }
Read1to6Bytes()930   bool Read1to6Bytes() {
931     switch (end_ - begin_) {
932       case 0: {
933         return false;
934       }
935       case 1: {
936         Fill1();
937         return true;
938       }
939       case 2: {
940         Fill2();
941         return true;
942       }
943       case 3: {
944         Fill3();
945         return true;
946       }
947       case 4: {
948         Fill4();
949         return true;
950       }
951       case 5: {
952         Fill5();
953         return true;
954       }
955       default: {
956         Fill6();
957         return true;
958       }
959     }
960   }
Done0()961   void Done0() {
962     done_ = true;
963     switch (end_ - begin_) {
964       case 1: {
965         Fill1();
966         break;
967       }
968     }
969     switch (buffer_len_) {
970       case 1:
971       case 2:
972       case 3:
973       case 4: {
974         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
975         return;
976       }
977       case 5: {
978         const auto index = buffer_ & 31;
979         const auto op = GetOp2(index);
980         switch (op & 3) {
981           case 0: {
982             sink_(GetEmit2(index, (op >> 2) + 0));
983             break;
984           }
985           case 1: {
986             ok_ = false;
987             break;
988           }
989         }
990         return;
991       }
992       case 6: {
993         const auto index = buffer_ & 63;
994         const auto op = GetOp3(index);
995         switch (op & 3) {
996           case 0: {
997             ok_ = false;
998             break;
999           }
1000           case 1: {
1001             sink_(GetEmit3(index, (op >> 2) + 0));
1002             break;
1003           }
1004         }
1005         return;
1006       }
1007       case 7: {
1008         const auto index = buffer_ & 127;
1009         const auto op = GetOp4(index);
1010         switch (op & 3) {
1011           case 0: {
1012             ok_ = false;
1013             break;
1014           }
1015           case 1: {
1016             sink_(GetEmit4(index, (op >> 2) + 0));
1017             break;
1018           }
1019         }
1020         return;
1021       }
1022       case 8: {
1023         const auto index = buffer_ & 255;
1024         const auto op = GetOp5(index);
1025         switch (op & 3) {
1026           case 0: {
1027             ok_ = false;
1028             break;
1029           }
1030           case 1: {
1031             sink_(GetEmit5(index, (op >> 2) + 0));
1032             break;
1033           }
1034         }
1035         return;
1036       }
1037       case 9: {
1038         const auto index = buffer_ & 511;
1039         const auto op = GetOp6(index);
1040         switch (op & 3) {
1041           case 0: {
1042             ok_ = false;
1043             break;
1044           }
1045           case 1: {
1046             sink_(GetEmit6(index, (op >> 2) + 0));
1047             break;
1048           }
1049         }
1050         return;
1051       }
1052       case 10: {
1053         const auto index = buffer_ & 1023;
1054         const auto op = GetOp7(index);
1055         switch (op & 3) {
1056           case 0: {
1057             sink_(GetEmit7(index, (op >> 2) + 0));
1058             sink_(GetEmit7(index, (op >> 2) + 1));
1059             break;
1060           }
1061           case 1: {
1062             ok_ = false;
1063             break;
1064           }
1065           case 2: {
1066             sink_(GetEmit7(index, (op >> 2) + 0));
1067             break;
1068           }
1069         }
1070         return;
1071       }
1072       case 0: {
1073         return;
1074       }
1075     }
1076   }
DecodeStep0()1077   void DecodeStep0() {
1078     if (!RefillTo1()) {
1079       Done1();
1080       return;
1081     }
1082     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1083     const auto op = GetOp8(index);
1084     const int consumed = op & 1;
1085     buffer_len_ -= consumed;
1086     const auto emit_ofs = op >> 1;
1087     sink_(GetEmit8(index, emit_ofs + 0));
1088   }
RefillTo1()1089   bool RefillTo1() {
1090     switch (buffer_len_) {
1091       case 0: {
1092         return Read1to8Bytes();
1093       }
1094     }
1095     return true;
1096   }
Read1to8Bytes()1097   bool Read1to8Bytes() {
1098     switch (end_ - begin_) {
1099       case 0: {
1100         return false;
1101       }
1102       case 1: {
1103         Fill1();
1104         return true;
1105       }
1106       case 2: {
1107         Fill2();
1108         return true;
1109       }
1110       case 3: {
1111         Fill3();
1112         return true;
1113       }
1114       case 4: {
1115         Fill4();
1116         return true;
1117       }
1118       case 5: {
1119         Fill5();
1120         return true;
1121       }
1122       case 6: {
1123         Fill6();
1124         return true;
1125       }
1126       case 7: {
1127         Fill7();
1128         return true;
1129       }
1130       default: {
1131         Fill8();
1132         return true;
1133       }
1134     }
1135   }
Done1()1136   void Done1() {
1137     done_ = true;
1138     ok_ = false;
1139   }
DecodeStep1()1140   void DecodeStep1() {
1141     if (!RefillTo2()) {
1142       Done2();
1143       return;
1144     }
1145     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1146     const auto op = GetOp9(index);
1147     const int consumed = op & 3;
1148     buffer_len_ -= consumed;
1149     const auto emit_ofs = op >> 2;
1150     sink_(GetEmit9(index, emit_ofs + 0));
1151   }
RefillTo2()1152   bool RefillTo2() {
1153     switch (buffer_len_) {
1154       case 0: {
1155         return Read1to8Bytes();
1156       }
1157       case 1: {
1158         return Read1to7Bytes();
1159       }
1160     }
1161     return true;
1162   }
Done2()1163   void Done2() {
1164     done_ = true;
1165     switch (buffer_len_) {
1166       case 1:
1167       case 0: {
1168         ok_ = false;
1169         return;
1170       }
1171     }
1172   }
DecodeStep2()1173   void DecodeStep2() {
1174     if (!RefillTo14()) {
1175       Done3();
1176       return;
1177     }
1178     const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff;
1179     const auto op = GetOp10(index);
1180     const int consumed = op & 15;
1181     buffer_len_ -= consumed;
1182     const auto emit_ofs = op >> 9;
1183     switch ((op >> 4) & 31) {
1184       case 0: {
1185         sink_(GetEmit10(index, emit_ofs + 0));
1186         break;
1187       }
1188       case 1: {
1189         DecodeStep3();
1190         break;
1191       }
1192       case 2: {
1193         DecodeStep4();
1194         break;
1195       }
1196       case 3: {
1197         DecodeStep5();
1198         break;
1199       }
1200       case 4: {
1201         DecodeStep6();
1202         break;
1203       }
1204       case 5: {
1205         DecodeStep7();
1206         break;
1207       }
1208       case 6: {
1209         DecodeStep8();
1210         break;
1211       }
1212       case 7: {
1213         DecodeStep9();
1214         break;
1215       }
1216       case 8: {
1217         DecodeStep16();
1218         break;
1219       }
1220       case 9: {
1221         DecodeStep10();
1222         break;
1223       }
1224       case 10: {
1225         DecodeStep11();
1226         break;
1227       }
1228       case 11: {
1229         DecodeStep12();
1230         break;
1231       }
1232       case 12: {
1233         DecodeStep13();
1234         break;
1235       }
1236       case 13: {
1237         DecodeStep17();
1238         break;
1239       }
1240       case 14: {
1241         DecodeStep14();
1242         break;
1243       }
1244       case 15: {
1245         DecodeStep15();
1246         break;
1247       }
1248       case 16: {
1249         DecodeStep18();
1250         break;
1251       }
1252     }
1253   }
RefillTo14()1254   bool RefillTo14() {
1255     switch (buffer_len_) {
1256       case 0: {
1257         return Read2to8Bytes();
1258       }
1259       case 1:
1260       case 2:
1261       case 3:
1262       case 4:
1263       case 5: {
1264         return Read2to7Bytes();
1265       }
1266       case 6:
1267       case 7:
1268       case 8: {
1269         return Read1to7Bytes();
1270       }
1271       case 9:
1272       case 10:
1273       case 11:
1274       case 12:
1275       case 13: {
1276         return Read1to6Bytes();
1277       }
1278     }
1279     return true;
1280   }
Done3()1281   void Done3() {
1282     done_ = true;
1283     switch (end_ - begin_) {
1284       case 1: {
1285         Fill1();
1286         break;
1287       }
1288     }
1289     switch (buffer_len_) {
1290       case 1: {
1291         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1292         return;
1293       }
1294       case 2: {
1295         const auto index = buffer_ & 3;
1296         const auto op = GetOp11(index);
1297         switch (op & 3) {
1298           case 0: {
1299             sink_(GetEmit11(index, (op >> 2) + 0));
1300             break;
1301           }
1302           case 1: {
1303             ok_ = false;
1304             break;
1305           }
1306         }
1307         return;
1308       }
1309       case 3: {
1310         const auto index = buffer_ & 7;
1311         const auto op = GetOp12(index);
1312         switch (op & 3) {
1313           case 0: {
1314             ok_ = false;
1315             break;
1316           }
1317           case 1: {
1318             sink_(GetEmit12(index, (op >> 2) + 0));
1319             break;
1320           }
1321         }
1322         return;
1323       }
1324       case 4: {
1325         const auto index = buffer_ & 15;
1326         const auto op = GetOp13(index);
1327         switch (op & 3) {
1328           case 0: {
1329             ok_ = false;
1330             break;
1331           }
1332           case 1: {
1333             sink_(GetEmit13(index, (op >> 2) + 0));
1334             break;
1335           }
1336         }
1337         return;
1338       }
1339       case 5: {
1340         const auto index = buffer_ & 31;
1341         const auto op = GetOp14(index);
1342         switch (op & 3) {
1343           case 0: {
1344             ok_ = false;
1345             break;
1346           }
1347           case 1: {
1348             sink_(GetEmit14(index, (op >> 2) + 0));
1349             break;
1350           }
1351         }
1352         return;
1353       }
1354       case 6: {
1355         const auto index = buffer_ & 63;
1356         const auto op = GetOp15(index);
1357         switch (op & 3) {
1358           case 0: {
1359             ok_ = false;
1360             break;
1361           }
1362           case 1: {
1363             sink_(GetEmit15(index, (op >> 2) + 0));
1364             break;
1365           }
1366         }
1367         return;
1368       }
1369       case 7: {
1370         const auto index = buffer_ & 127;
1371         const auto op = GetOp16(index);
1372         switch (op & 3) {
1373           case 0: {
1374             sink_(GetEmit16(index, (op >> 2) + 0));
1375             sink_(GetEmit16(index, (op >> 2) + 1));
1376             break;
1377           }
1378           case 1: {
1379             ok_ = false;
1380             break;
1381           }
1382           case 2: {
1383             sink_(GetEmit16(index, (op >> 2) + 0));
1384             break;
1385           }
1386         }
1387         return;
1388       }
1389       case 8: {
1390         const auto index = buffer_ & 255;
1391         const auto op = GetOp17(index);
1392         switch (op & 3) {
1393           case 0: {
1394             ok_ = false;
1395             break;
1396           }
1397           case 1: {
1398             sink_(GetEmit17(index, (op >> 2) + 0));
1399             sink_(GetEmit17(index, (op >> 2) + 1));
1400             break;
1401           }
1402           case 2: {
1403             sink_(GetEmit17(index, (op >> 2) + 0));
1404             break;
1405           }
1406         }
1407         return;
1408       }
1409       case 9: {
1410         const auto index = buffer_ & 511;
1411         const auto op = GetOp18(index);
1412         switch (op & 3) {
1413           case 0: {
1414             ok_ = false;
1415             break;
1416           }
1417           case 1: {
1418             sink_(GetEmit18(index, (op >> 2) + 0));
1419             sink_(GetEmit18(index, (op >> 2) + 1));
1420             break;
1421           }
1422           case 2: {
1423             sink_(GetEmit18(index, (op >> 2) + 0));
1424             break;
1425           }
1426         }
1427         return;
1428       }
1429       case 10: {
1430         const auto index = buffer_ & 1023;
1431         const auto op = GetOp19(index);
1432         switch (op & 3) {
1433           case 0: {
1434             ok_ = false;
1435             break;
1436           }
1437           case 1: {
1438             sink_(GetEmit19(index, (op >> 2) + 0));
1439             sink_(GetEmit19(index, (op >> 2) + 1));
1440             break;
1441           }
1442           case 2: {
1443             sink_(GetEmit19(index, (op >> 2) + 0));
1444             break;
1445           }
1446         }
1447         return;
1448       }
1449       case 11: {
1450         const auto index = buffer_ & 2047;
1451         const auto op = GetOp20(index);
1452         switch (op & 3) {
1453           case 0: {
1454             ok_ = false;
1455             break;
1456           }
1457           case 1: {
1458             sink_(GetEmit20(index, (op >> 2) + 0));
1459             sink_(GetEmit20(index, (op >> 2) + 1));
1460             break;
1461           }
1462           case 2: {
1463             sink_(GetEmit20(index, (op >> 2) + 0));
1464             break;
1465           }
1466         }
1467         return;
1468       }
1469       case 12: {
1470         const auto index = buffer_ & 4095;
1471         const auto op = GetOp21(index);
1472         switch (op & 7) {
1473           case 0: {
1474             sink_(GetEmit21(index, (op >> 3) + 0));
1475             sink_(GetEmit21(index, (op >> 3) + 1));
1476             sink_(GetEmit21(index, (op >> 3) + 2));
1477             break;
1478           }
1479           case 1: {
1480             ok_ = false;
1481             break;
1482           }
1483           case 2: {
1484             sink_(GetEmit21(index, (op >> 3) + 0));
1485             sink_(GetEmit21(index, (op >> 3) + 1));
1486             break;
1487           }
1488           case 3: {
1489             sink_(GetEmit21(index, (op >> 3) + 0));
1490             break;
1491           }
1492         }
1493         return;
1494       }
1495       case 13: {
1496         const auto index = buffer_ & 8191;
1497         const auto op = GetOp22(index);
1498         switch (op & 7) {
1499           case 0: {
1500             ok_ = false;
1501             break;
1502           }
1503           case 1: {
1504             sink_(GetEmit22(index, (op >> 3) + 0));
1505             sink_(GetEmit22(index, (op >> 3) + 1));
1506             sink_(GetEmit22(index, (op >> 3) + 2));
1507             break;
1508           }
1509           case 2: {
1510             sink_(GetEmit22(index, (op >> 3) + 0));
1511             sink_(GetEmit22(index, (op >> 3) + 1));
1512             break;
1513           }
1514           case 3: {
1515             sink_(GetEmit22(index, (op >> 3) + 0));
1516             break;
1517           }
1518         }
1519         return;
1520       }
1521       case 0: {
1522         return;
1523       }
1524     }
1525   }
DecodeStep3()1526   void DecodeStep3() {
1527     if (!RefillTo1()) {
1528       Done4();
1529       return;
1530     }
1531     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1532     const auto op = GetOp23(index);
1533     const int consumed = op & 1;
1534     buffer_len_ -= consumed;
1535     const auto emit_ofs = op >> 1;
1536     sink_(GetEmit23(index, emit_ofs + 0));
1537   }
Done4()1538   void Done4() {
1539     done_ = true;
1540     ok_ = false;
1541   }
DecodeStep4()1542   void DecodeStep4() {
1543     if (!RefillTo1()) {
1544       Done5();
1545       return;
1546     }
1547     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1548     const auto op = GetOp24(index);
1549     const int consumed = op & 1;
1550     buffer_len_ -= consumed;
1551     const auto emit_ofs = op >> 1;
1552     sink_(GetEmit24(index, emit_ofs + 0));
1553   }
Done5()1554   void Done5() {
1555     done_ = true;
1556     ok_ = false;
1557   }
DecodeStep5()1558   void DecodeStep5() {
1559     if (!RefillTo1()) {
1560       Done6();
1561       return;
1562     }
1563     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1564     const auto op = GetOp25(index);
1565     const int consumed = op & 1;
1566     buffer_len_ -= consumed;
1567     const auto emit_ofs = op >> 1;
1568     sink_(GetEmit25(index, emit_ofs + 0));
1569   }
Done6()1570   void Done6() {
1571     done_ = true;
1572     ok_ = false;
1573   }
DecodeStep6()1574   void DecodeStep6() {
1575     if (!RefillTo1()) {
1576       Done7();
1577       return;
1578     }
1579     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1580     const auto op = GetOp26(index);
1581     const int consumed = op & 1;
1582     buffer_len_ -= consumed;
1583     const auto emit_ofs = op >> 1;
1584     sink_(GetEmit26(index, emit_ofs + 0));
1585   }
Done7()1586   void Done7() {
1587     done_ = true;
1588     ok_ = false;
1589   }
DecodeStep7()1590   void DecodeStep7() {
1591     if (!RefillTo1()) {
1592       Done8();
1593       return;
1594     }
1595     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1596     const auto op = GetOp27(index);
1597     const int consumed = op & 1;
1598     buffer_len_ -= consumed;
1599     const auto emit_ofs = op >> 1;
1600     sink_(GetEmit27(index, emit_ofs + 0));
1601   }
Done8()1602   void Done8() {
1603     done_ = true;
1604     ok_ = false;
1605   }
DecodeStep8()1606   void DecodeStep8() {
1607     if (!RefillTo1()) {
1608       Done9();
1609       return;
1610     }
1611     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1612     const auto op = GetOp28(index);
1613     const int consumed = op & 1;
1614     buffer_len_ -= consumed;
1615     const auto emit_ofs = op >> 1;
1616     sink_(GetEmit28(index, emit_ofs + 0));
1617   }
Done9()1618   void Done9() {
1619     done_ = true;
1620     ok_ = false;
1621   }
DecodeStep9()1622   void DecodeStep9() {
1623     if (!RefillTo1()) {
1624       Done10();
1625       return;
1626     }
1627     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1628     const auto op = GetOp29(index);
1629     const int consumed = op & 1;
1630     buffer_len_ -= consumed;
1631     const auto emit_ofs = op >> 1;
1632     sink_(GetEmit29(index, emit_ofs + 0));
1633   }
Done10()1634   void Done10() {
1635     done_ = true;
1636     ok_ = false;
1637   }
DecodeStep10()1638   void DecodeStep10() {
1639     if (!RefillTo2()) {
1640       Done11();
1641       return;
1642     }
1643     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1644     const auto op = GetOp30(index);
1645     const int consumed = op & 3;
1646     buffer_len_ -= consumed;
1647     const auto emit_ofs = op >> 2;
1648     sink_(GetEmit30(index, emit_ofs + 0));
1649   }
Done11()1650   void Done11() {
1651     done_ = true;
1652     switch (buffer_len_) {
1653       case 1:
1654       case 0: {
1655         ok_ = false;
1656         return;
1657       }
1658     }
1659   }
DecodeStep11()1660   void DecodeStep11() {
1661     if (!RefillTo2()) {
1662       Done12();
1663       return;
1664     }
1665     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1666     const auto op = GetOp31(index);
1667     const int consumed = op & 3;
1668     buffer_len_ -= consumed;
1669     const auto emit_ofs = op >> 2;
1670     sink_(GetEmit31(index, emit_ofs + 0));
1671   }
Done12()1672   void Done12() {
1673     done_ = true;
1674     switch (buffer_len_) {
1675       case 1:
1676       case 0: {
1677         ok_ = false;
1678         return;
1679       }
1680     }
1681   }
DecodeStep12()1682   void DecodeStep12() {
1683     if (!RefillTo2()) {
1684       Done13();
1685       return;
1686     }
1687     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1688     const auto op = GetOp32(index);
1689     const int consumed = op & 3;
1690     buffer_len_ -= consumed;
1691     const auto emit_ofs = op >> 2;
1692     sink_(GetEmit32(index, emit_ofs + 0));
1693   }
Done13()1694   void Done13() {
1695     done_ = true;
1696     switch (buffer_len_) {
1697       case 1:
1698       case 0: {
1699         ok_ = false;
1700         return;
1701       }
1702     }
1703   }
DecodeStep13()1704   void DecodeStep13() {
1705     if (!RefillTo2()) {
1706       Done14();
1707       return;
1708     }
1709     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1710     const auto op = GetOp33(index);
1711     const int consumed = op & 3;
1712     buffer_len_ -= consumed;
1713     const auto emit_ofs = op >> 2;
1714     sink_(GetEmit33(index, emit_ofs + 0));
1715   }
Done14()1716   void Done14() {
1717     done_ = true;
1718     switch (buffer_len_) {
1719       case 1:
1720       case 0: {
1721         ok_ = false;
1722         return;
1723       }
1724     }
1725   }
DecodeStep14()1726   void DecodeStep14() {
1727     if (!RefillTo3()) {
1728       Done15();
1729       return;
1730     }
1731     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1732     const auto op = GetOp34(index);
1733     const int consumed = op & 3;
1734     buffer_len_ -= consumed;
1735     const auto emit_ofs = op >> 2;
1736     sink_(GetEmit34(index, emit_ofs + 0));
1737   }
RefillTo3()1738   bool RefillTo3() {
1739     switch (buffer_len_) {
1740       case 0: {
1741         return Read1to8Bytes();
1742       }
1743       case 1:
1744       case 2: {
1745         return Read1to7Bytes();
1746       }
1747     }
1748     return true;
1749   }
Done15()1750   void Done15() {
1751     done_ = true;
1752     switch (buffer_len_) {
1753       case 1:
1754       case 2:
1755       case 0: {
1756         ok_ = false;
1757         return;
1758       }
1759     }
1760   }
DecodeStep15()1761   void DecodeStep15() {
1762     if (!RefillTo3()) {
1763       Done16();
1764       return;
1765     }
1766     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1767     const auto op = GetOp35(index);
1768     const int consumed = op & 3;
1769     buffer_len_ -= consumed;
1770     const auto emit_ofs = op >> 2;
1771     sink_(GetEmit35(index, emit_ofs + 0));
1772   }
Done16()1773   void Done16() {
1774     done_ = true;
1775     switch (buffer_len_) {
1776       case 1:
1777       case 2:
1778       case 0: {
1779         ok_ = false;
1780         return;
1781       }
1782     }
1783   }
DecodeStep16()1784   void DecodeStep16() {
1785     if (!RefillTo2()) {
1786       Done17();
1787       return;
1788     }
1789     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1790     const auto op = GetOp36(index);
1791     const int consumed = op & 3;
1792     buffer_len_ -= consumed;
1793     const auto emit_ofs = op >> 2;
1794     sink_(GetEmit36(index, emit_ofs + 0));
1795   }
Done17()1796   void Done17() {
1797     done_ = true;
1798     switch (buffer_len_) {
1799       case 1: {
1800         const auto index = buffer_ & 1;
1801         const auto op = GetOp37(index);
1802         switch (op & 1) {
1803           case 0: {
1804             sink_(GetEmit37(index, (op >> 1) + 0));
1805             break;
1806           }
1807           case 1: {
1808             ok_ = false;
1809             break;
1810           }
1811         }
1812         return;
1813       }
1814       case 0: {
1815         ok_ = false;
1816         return;
1817       }
1818     }
1819   }
DecodeStep17()1820   void DecodeStep17() {
1821     if (!RefillTo3()) {
1822       Done18();
1823       return;
1824     }
1825     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1826     const auto op = GetOp38(index);
1827     const int consumed = op & 3;
1828     buffer_len_ -= consumed;
1829     const auto emit_ofs = op >> 2;
1830     sink_(GetEmit38(index, emit_ofs + 0));
1831   }
Done18()1832   void Done18() {
1833     done_ = true;
1834     switch (buffer_len_) {
1835       case 1:
1836       case 0: {
1837         ok_ = false;
1838         return;
1839       }
1840       case 2: {
1841         const auto index = buffer_ & 3;
1842         const auto op = GetOp39(index);
1843         switch (op & 1) {
1844           case 0: {
1845             sink_(GetEmit39(index, (op >> 1) + 0));
1846             break;
1847           }
1848           case 1: {
1849             ok_ = false;
1850             break;
1851           }
1852         }
1853         return;
1854       }
1855     }
1856   }
DecodeStep18()1857   void DecodeStep18() {
1858     if (!RefillTo5()) {
1859       Done19();
1860       return;
1861     }
1862     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1863     const auto op = GetOp40(index);
1864     const int consumed = op & 7;
1865     buffer_len_ -= consumed;
1866     const auto emit_ofs = op >> 4;
1867     switch ((op >> 3) & 1) {
1868       case 0: {
1869         sink_(GetEmit40(index, emit_ofs + 0));
1870         break;
1871       }
1872       case 1: {
1873         begin_ = end_;
1874         buffer_len_ = 0;
1875         break;
1876       }
1877     }
1878   }
RefillTo5()1879   bool RefillTo5() {
1880     switch (buffer_len_) {
1881       case 0: {
1882         return Read1to8Bytes();
1883       }
1884       case 1:
1885       case 2:
1886       case 3:
1887       case 4: {
1888         return Read1to7Bytes();
1889       }
1890     }
1891     return true;
1892   }
Done19()1893   void Done19() {
1894     done_ = true;
1895     switch (buffer_len_) {
1896       case 1:
1897       case 2: {
1898         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1899         return;
1900       }
1901       case 3: {
1902         const auto index = buffer_ & 7;
1903         const auto op = GetOp41(index);
1904         switch (op & 1) {
1905           case 0: {
1906             sink_(GetEmit41(index, (op >> 1) + 0));
1907             break;
1908           }
1909         }
1910         return;
1911       }
1912       case 4: {
1913         const auto index = buffer_ & 15;
1914         const auto op = GetOp42(index);
1915         switch (op & 3) {
1916           case 0: {
1917             ok_ = false;
1918             break;
1919           }
1920           case 1: {
1921             sink_(GetEmit42(index, (op >> 2) + 0));
1922             break;
1923           }
1924         }
1925         return;
1926       }
1927       case 0: {
1928         return;
1929       }
1930     }
1931   }
1932   F sink_;
1933   const uint8_t* begin_;
1934   const uint8_t* const end_;
1935   uint64_t buffer_ = 0;
1936   int buffer_len_ = 0;
1937   bool ok_ = true;
1938   bool done_ = false;
1939 };
1940 }  // namespace geometry_11_14_5
1941 }  // namespace grpc_core
1942 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_14_5_H
1943