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