xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_8_15_7.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_8_15_7_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_15_7_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_8_15_7 {
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   }
GetOp1(size_t i)42   static inline uint64_t GetOp1(size_t i) {
43     return table1_0_inner_[table1_0_outer_[i]];
44   }
GetEmit1(size_t,size_t emit)45   static inline uint64_t GetEmit1(size_t, size_t emit) {
46     return table1_0_emit_[emit];
47   }
GetOp5(size_t i)48   static inline uint64_t GetOp5(size_t i) {
49     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
50   }
GetEmit5(size_t,size_t emit)51   static inline uint64_t GetEmit5(size_t, size_t emit) {
52     return (emit < 2 ? (emit + 33) : ((emit - 2) + 40));
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return (i < 2 ? (i) : ((i - 2) + 1));
56   }
GetEmit7(size_t,size_t emit)57   static inline uint64_t GetEmit7(size_t, size_t emit) {
58     return ((void)emit, 63);
59   }
GetOp8(size_t i)60   static inline uint64_t GetOp8(size_t i) {
61     return table8_0_inner_[table8_0_outer_[i]];
62   }
GetEmit8(size_t,size_t emit)63   static inline uint64_t GetEmit8(size_t, size_t emit) {
64     return (emit < 2 ? (emit ? 39 : 63) : ((emit - 2) ? 124 : 43));
65   }
GetOp9(size_t i)66   static inline uint64_t GetOp9(size_t i) {
67     return table9_0_inner_[table9_0_outer_[i]];
68   }
GetEmit9(size_t,size_t emit)69   static inline uint64_t GetEmit9(size_t, size_t emit) {
70     return table9_0_emit_[emit];
71   }
GetOp10(size_t i)72   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)73   static inline uint64_t GetEmit10(size_t, size_t emit) {
74     return table10_0_emit_[emit];
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)77   static inline uint64_t GetEmit11(size_t, size_t emit) {
78     return table11_0_emit_[emit];
79   }
GetOp12(size_t i)80   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)81   static inline uint64_t GetEmit12(size_t, size_t emit) {
82     return table12_0_emit_[emit];
83   }
GetOp13(size_t i)84   static inline uint64_t GetOp13(size_t i) {
85     return table13_ops_[i >> 5][i & 0x1f];
86   }
GetEmit13(size_t i,size_t emit)87   static inline uint64_t GetEmit13(size_t i, size_t emit) {
88     return table13_emit_[i >> 5][emit];
89   }
GetOp14(size_t i)90   static inline uint64_t GetOp14(size_t i) {
91     return table14_ops_[i >> 5][i & 0x1f];
92   }
GetEmit14(size_t i,size_t emit)93   static inline uint64_t GetEmit14(size_t i, size_t emit) {
94     return table14_emit_[i >> 5][emit];
95   }
GetOp15(size_t i)96   static inline uint64_t GetOp15(size_t i) {
97     return table15_ops_[i >> 6][i & 0x3f];
98   }
GetEmit15(size_t i,size_t emit)99   static inline uint64_t GetEmit15(size_t i, size_t emit) {
100     return table15_emit_[i >> 6][emit];
101   }
GetOp16(size_t i)102   static inline uint64_t GetOp16(size_t i) {
103     return table16_ops_[i >> 6][i & 0x3f];
104   }
GetEmit16(size_t i,size_t emit)105   static inline uint64_t GetEmit16(size_t i, size_t emit) {
106     return table16_emit_[i >> 6][emit];
107   }
GetOp17(size_t i)108   static inline uint64_t GetOp17(size_t i) {
109     return table17_ops_[i >> 6][i & 0x3f];
110   }
GetEmit17(size_t i,size_t emit)111   static inline uint64_t GetEmit17(size_t i, size_t emit) {
112     return table17_emit_[i >> 6][emit];
113   }
GetOp18(size_t i)114   static inline uint64_t GetOp18(size_t i) {
115     return table18_ops_[i >> 6][i & 0x3f];
116   }
GetEmit18(size_t i,size_t emit)117   static inline uint64_t GetEmit18(size_t i, size_t emit) {
118     return table18_emit_[i >> 6][emit];
119   }
GetOp19(size_t i)120   static inline uint64_t GetOp19(size_t i) {
121     return table19_ops_[i >> 7][i & 0x7f];
122   }
GetEmit19(size_t i,size_t emit)123   static inline uint64_t GetEmit19(size_t i, size_t emit) {
124     return table19_emit_[i >> 7][emit];
125   }
GetOp6(size_t i)126   static inline uint64_t GetOp6(size_t i) {
127     return table6_ops_[i >> 8][i & 0xff];
128   }
GetEmit6(size_t i,size_t emit)129   static inline uint64_t GetEmit6(size_t i, size_t emit) {
130     return table6_emit_[i >> 8][emit];
131   }
GetOp20(size_t i)132   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)133   static inline uint64_t GetEmit20(size_t, size_t emit) {
134     return emit ? 142 : 9;
135   }
GetOp21(size_t i)136   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)137   static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 144; }
GetOp22(size_t i)138   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)139   static inline uint64_t GetEmit22(size_t, size_t emit) {
140     return emit ? 159 : 148;
141   }
GetOp23(size_t i)142   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)143   static inline uint64_t GetEmit23(size_t, size_t emit) {
144     return emit ? 206 : 171;
145   }
GetOp24(size_t i)146   static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; }
GetEmit24(size_t,size_t emit)147   static inline uint64_t GetEmit24(size_t, size_t emit) {
148     return emit ? 225 : 215;
149   }
GetOp25(size_t i)150   static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; }
GetEmit25(size_t,size_t emit)151   static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 236; }
GetOp26(size_t i)152   static inline uint64_t GetOp26(size_t i) {
153     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
154   }
GetEmit26(size_t,size_t emit)155   static inline uint64_t GetEmit26(size_t, size_t emit) {
156     return (emit < 2 ? (emit ? 207 : 199) : ((emit - 2) + 234));
157   }
GetOp27(size_t i)158   static inline uint64_t GetOp27(size_t i) { return table27_0_inner_[i]; }
GetEmit27(size_t,size_t emit)159   static inline uint64_t GetEmit27(size_t, size_t emit) {
160     return table27_0_emit_[emit];
161   }
GetOp28(size_t i)162   static inline uint64_t GetOp28(size_t i) { return table28_0_inner_[i]; }
GetEmit28(size_t,size_t emit)163   static inline uint64_t GetEmit28(size_t, size_t emit) {
164     return table28_0_emit_[emit];
165   }
GetOp30(size_t i)166   static inline uint64_t GetOp30(size_t i) {
167     return (i < 1 ? (((void)i, 0)) : ((i - 1) / 14 + 1));
168   }
GetEmit30(size_t,size_t emit)169   static inline uint64_t GetEmit30(size_t, size_t emit) {
170     return ((void)emit, 254);
171   }
GetOp31(size_t i)172   static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; }
GetEmit31(size_t,size_t emit)173   static inline uint64_t GetEmit31(size_t, size_t emit) {
174     return table31_0_emit_[emit];
175   }
GetOp32(size_t i)176   static inline uint64_t GetOp32(size_t i) { return table32_0_ops_[i]; }
GetEmit32(size_t,size_t emit)177   static inline uint64_t GetEmit32(size_t, size_t emit) {
178     return table31_0_emit_[emit];
179   }
GetOp29(size_t i)180   static inline uint64_t GetOp29(size_t i) {
181     return table29_ops_[i >> 5][i & 0x1f];
182   }
GetEmit29(size_t i,size_t emit)183   static inline uint64_t GetEmit29(size_t i, size_t emit) {
184     return table29_emit_[i >> 5][emit];
185   }
GetOp34(size_t i)186   static inline uint64_t GetOp34(size_t i) { return table34_0_inner_[i]; }
GetEmit34(size_t,size_t emit)187   static inline uint64_t GetEmit34(size_t, size_t emit) {
188     return table34_0_emit_[emit];
189   }
GetOp33(size_t i)190   static inline uint64_t GetOp33(size_t i) {
191     return table33_0_inner_[(i < 13 ? (i / 2 + 0) : ((i - 13) + 6))];
192   }
GetEmit33(size_t,size_t emit)193   static inline uint64_t GetEmit33(size_t, size_t emit) {
194     return table33_0_emit_[emit];
195   }
196 
197  private:
198   static const uint8_t table2_0_emit_[10];
199   static const uint8_t table2_0_ops_[32];
200   static const uint8_t table3_0_emit_[36];
201   static const uint8_t table3_0_ops_[64];
202   static const uint8_t table4_0_emit_[22];
203   static const uint8_t table4_0_ops_[64];
204   static const uint8_t table4_1_emit_[46];
205   static const uint8_t table4_1_ops_[64];
206   static const uint8_t* const table4_emit_[2];
207   static const uint8_t* const table4_ops_[2];
208   static const uint8_t table1_0_emit_[74];
209   static const uint16_t table1_0_inner_[76];
210   static const uint8_t table1_0_outer_[256];
211   static const uint8_t table8_0_inner_[6];
212   static const uint8_t table8_0_outer_[8];
213   static const uint8_t table9_0_emit_[6];
214   static const uint8_t table9_0_inner_[8];
215   static const uint8_t table9_0_outer_[16];
216   static const uint8_t table10_0_emit_[12];
217   static const uint8_t table10_0_ops_[32];
218   static const uint8_t table11_0_emit_[14];
219   static const uint8_t table11_0_ops_[64];
220   static const uint8_t table12_0_emit_[36];
221   static const uint8_t table12_0_ops_[128];
222   static const uint8_t table13_0_emit_[44];
223   static const uint8_t table13_0_ops_[32];
224   static const uint8_t table13_1_emit_[28];
225   static const uint8_t table13_1_ops_[32];
226   static const uint8_t table13_2_emit_[20];
227   static const uint8_t table13_2_ops_[32];
228   static const uint8_t table13_3_emit_[20];
229   static const uint8_t table13_4_emit_[20];
230   static const uint8_t table13_5_emit_[2];
231   static const uint8_t table13_5_ops_[32];
232   static const uint8_t table13_6_emit_[4];
233   static const uint8_t table13_6_ops_[32];
234   static const uint8_t table13_7_emit_[7];
235   static const uint8_t table13_7_ops_[32];
236   static const uint8_t* const table13_emit_[8];
237   static const uint8_t* const table13_ops_[8];
238   static const uint8_t table14_0_emit_[16];
239   static const uint8_t table14_0_ops_[32];
240   static const uint8_t table14_1_emit_[28];
241   static const uint8_t table14_1_ops_[32];
242   static const uint8_t table14_2_emit_[36];
243   static const uint8_t table14_2_ops_[32];
244   static const uint8_t table14_3_emit_[56];
245   static const uint8_t table14_3_ops_[32];
246   static const uint8_t table14_4_emit_[44];
247   static const uint8_t table14_5_emit_[28];
248   static const uint8_t table14_6_emit_[44];
249   static const uint8_t table14_7_emit_[28];
250   static const uint8_t table14_8_emit_[44];
251   static const uint8_t table14_9_emit_[28];
252   static const uint8_t table14_10_emit_[20];
253   static const uint8_t table14_11_emit_[20];
254   static const uint8_t table14_12_emit_[2];
255   static const uint8_t table14_13_emit_[2];
256   static const uint8_t table14_14_emit_[2];
257   static const uint8_t table14_15_emit_[5];
258   static const uint8_t table14_15_ops_[32];
259   static const uint8_t* const table14_emit_[16];
260   static const uint8_t* const table14_ops_[16];
261   static const uint16_t table15_0_ops_[64];
262   static const uint16_t table15_1_ops_[64];
263   static const uint16_t table15_2_ops_[64];
264   static const uint8_t table15_3_emit_[68];
265   static const uint16_t table15_3_ops_[64];
266   static const uint16_t table15_4_ops_[64];
267   static const uint8_t table15_5_emit_[92];
268   static const uint16_t table15_5_ops_[64];
269   static const uint8_t table15_7_emit_[92];
270   static const uint8_t table15_9_emit_[92];
271   static const uint8_t table15_10_emit_[72];
272   static const uint16_t table15_10_ops_[64];
273   static const uint8_t table15_11_emit_[72];
274   static const uint8_t table15_12_emit_[40];
275   static const uint16_t table15_12_ops_[64];
276   static const uint8_t table15_13_emit_[40];
277   static const uint8_t table15_14_emit_[40];
278   static const uint16_t table15_15_ops_[64];
279   static const uint8_t* const table15_emit_[16];
280   static const uint16_t* const table15_ops_[16];
281   static const uint8_t table16_0_emit_[8];
282   static const uint16_t table16_0_ops_[64];
283   static const uint8_t table16_1_emit_[8];
284   static const uint8_t table16_2_emit_[12];
285   static const uint16_t table16_2_ops_[64];
286   static const uint8_t table16_3_emit_[16];
287   static const uint8_t table16_4_emit_[16];
288   static const uint8_t table16_5_emit_[20];
289   static const uint16_t table16_5_ops_[64];
290   static const uint8_t table16_6_emit_[32];
291   static const uint16_t table16_6_ops_[64];
292   static const uint8_t table16_7_emit_[36];
293   static const uint16_t table16_7_ops_[64];
294   static const uint8_t table16_8_emit_[16];
295   static const uint8_t table16_9_emit_[28];
296   static const uint8_t table16_10_emit_[36];
297   static const uint8_t table16_11_emit_[68];
298   static const uint8_t table16_12_emit_[16];
299   static const uint8_t table16_13_emit_[28];
300   static const uint8_t table16_14_emit_[36];
301   static const uint8_t table16_15_emit_[68];
302   static const uint8_t table16_16_emit_[16];
303   static const uint8_t table16_17_emit_[28];
304   static const uint8_t table16_18_emit_[36];
305   static const uint8_t table16_19_emit_[68];
306   static const uint8_t table16_20_emit_[44];
307   static const uint8_t table16_21_emit_[92];
308   static const uint8_t table16_22_emit_[44];
309   static const uint8_t table16_23_emit_[92];
310   static const uint8_t table16_24_emit_[72];
311   static const uint8_t table16_25_emit_[72];
312   static const uint8_t table16_26_emit_[72];
313   static const uint8_t table16_27_emit_[72];
314   static const uint8_t table16_28_emit_[72];
315   static const uint8_t table16_29_emit_[72];
316   static const uint8_t table16_30_emit_[40];
317   static const uint8_t table16_31_emit_[6];
318   static const uint16_t table16_31_ops_[64];
319   static const uint8_t* const table16_emit_[32];
320   static const uint16_t* const table16_ops_[32];
321   static const uint8_t table17_0_emit_[60];
322   static const uint16_t table17_0_ops_[64];
323   static const uint8_t table17_1_emit_[60];
324   static const uint8_t table17_2_emit_[60];
325   static const uint8_t table17_3_emit_[60];
326   static const uint8_t table17_4_emit_[60];
327   static const uint8_t table17_5_emit_[8];
328   static const uint16_t table17_5_ops_[64];
329   static const uint8_t table17_6_emit_[8];
330   static const uint8_t table17_7_emit_[8];
331   static const uint8_t table17_8_emit_[8];
332   static const uint8_t table17_9_emit_[8];
333   static const uint8_t table17_10_emit_[8];
334   static const uint8_t table17_11_emit_[12];
335   static const uint16_t table17_11_ops_[64];
336   static const uint8_t table17_12_emit_[16];
337   static const uint16_t table17_12_ops_[64];
338   static const uint8_t table17_13_emit_[16];
339   static const uint8_t table17_14_emit_[16];
340   static const uint8_t table17_15_emit_[30];
341   static const uint16_t table17_15_ops_[64];
342   static const uint8_t table17_16_emit_[8];
343   static const uint8_t table17_17_emit_[8];
344   static const uint8_t table17_18_emit_[12];
345   static const uint8_t table17_19_emit_[16];
346   static const uint8_t table17_20_emit_[16];
347   static const uint8_t table17_21_emit_[20];
348   static const uint16_t table17_21_ops_[64];
349   static const uint8_t table17_22_emit_[32];
350   static const uint16_t table17_22_ops_[64];
351   static const uint8_t table17_23_emit_[36];
352   static const uint16_t table17_23_ops_[64];
353   static const uint8_t table17_24_emit_[8];
354   static const uint8_t table17_25_emit_[8];
355   static const uint8_t table17_26_emit_[12];
356   static const uint8_t table17_27_emit_[16];
357   static const uint8_t table17_28_emit_[16];
358   static const uint8_t table17_29_emit_[20];
359   static const uint8_t table17_30_emit_[32];
360   static const uint8_t table17_31_emit_[36];
361   static const uint8_t table17_32_emit_[8];
362   static const uint8_t table17_33_emit_[8];
363   static const uint8_t table17_34_emit_[12];
364   static const uint8_t table17_35_emit_[16];
365   static const uint8_t table17_36_emit_[16];
366   static const uint8_t table17_37_emit_[20];
367   static const uint8_t table17_38_emit_[32];
368   static const uint8_t table17_39_emit_[36];
369   static const uint8_t table17_40_emit_[16];
370   static const uint8_t table17_41_emit_[28];
371   static const uint16_t table17_41_ops_[64];
372   static const uint8_t table17_42_emit_[36];
373   static const uint16_t table17_42_ops_[64];
374   static const uint8_t table17_43_emit_[68];
375   static const uint16_t table17_43_ops_[64];
376   static const uint8_t table17_44_emit_[16];
377   static const uint8_t table17_45_emit_[28];
378   static const uint8_t table17_46_emit_[36];
379   static const uint8_t table17_47_emit_[68];
380   static const uint8_t table17_48_emit_[44];
381   static const uint16_t table17_48_ops_[64];
382   static const uint8_t table17_49_emit_[92];
383   static const uint16_t table17_49_ops_[64];
384   static const uint8_t table17_50_emit_[44];
385   static const uint8_t table17_51_emit_[92];
386   static const uint8_t table17_52_emit_[44];
387   static const uint8_t table17_53_emit_[92];
388   static const uint8_t table17_54_emit_[44];
389   static const uint8_t table17_55_emit_[92];
390   static const uint8_t table17_56_emit_[44];
391   static const uint8_t table17_57_emit_[92];
392   static const uint8_t table17_58_emit_[44];
393   static const uint8_t table17_59_emit_[92];
394   static const uint8_t table17_60_emit_[72];
395   static const uint16_t table17_60_ops_[64];
396   static const uint8_t table17_61_emit_[72];
397   static const uint8_t table17_62_emit_[40];
398   static const uint16_t table17_62_ops_[64];
399   static const uint8_t table17_63_emit_[31];
400   static const uint16_t table17_63_ops_[64];
401   static const uint8_t* const table17_emit_[64];
402   static const uint16_t* const table17_ops_[64];
403   static const uint8_t table18_0_emit_[108];
404   static const uint16_t table18_0_ops_[64];
405   static const uint8_t table18_1_emit_[108];
406   static const uint8_t table18_2_emit_[108];
407   static const uint8_t table18_3_emit_[108];
408   static const uint8_t table18_4_emit_[108];
409   static const uint8_t table18_5_emit_[108];
410   static const uint8_t table18_6_emit_[108];
411   static const uint8_t table18_7_emit_[108];
412   static const uint8_t table18_8_emit_[108];
413   static const uint8_t table18_9_emit_[108];
414   static const uint8_t table18_10_emit_[60];
415   static const uint16_t table18_10_ops_[64];
416   static const uint8_t table18_11_emit_[60];
417   static const uint8_t table18_12_emit_[60];
418   static const uint8_t table18_13_emit_[60];
419   static const uint8_t table18_14_emit_[60];
420   static const uint8_t table18_15_emit_[60];
421   static const uint8_t table18_16_emit_[60];
422   static const uint8_t table18_17_emit_[60];
423   static const uint8_t table18_18_emit_[60];
424   static const uint8_t table18_19_emit_[60];
425   static const uint8_t table18_20_emit_[60];
426   static const uint8_t table18_21_emit_[60];
427   static const uint8_t table18_22_emit_[60];
428   static const uint8_t table18_23_emit_[8];
429   static const uint16_t table18_23_ops_[64];
430   static const uint8_t table18_24_emit_[8];
431   static const uint8_t table18_25_emit_[8];
432   static const uint8_t table18_26_emit_[8];
433   static const uint8_t table18_27_emit_[8];
434   static const uint8_t table18_28_emit_[8];
435   static const uint8_t table18_29_emit_[8];
436   static const uint8_t table18_30_emit_[8];
437   static const uint8_t table18_31_emit_[27];
438   static const uint16_t table18_31_ops_[64];
439   static const uint8_t table18_32_emit_[60];
440   static const uint8_t table18_33_emit_[60];
441   static const uint8_t table18_34_emit_[60];
442   static const uint8_t table18_35_emit_[60];
443   static const uint8_t table18_36_emit_[60];
444   static const uint8_t table18_37_emit_[8];
445   static const uint8_t table18_38_emit_[8];
446   static const uint8_t table18_39_emit_[8];
447   static const uint8_t table18_40_emit_[8];
448   static const uint8_t table18_41_emit_[8];
449   static const uint8_t table18_42_emit_[8];
450   static const uint8_t table18_43_emit_[12];
451   static const uint16_t table18_43_ops_[64];
452   static const uint8_t table18_44_emit_[16];
453   static const uint16_t table18_44_ops_[64];
454   static const uint8_t table18_45_emit_[16];
455   static const uint8_t table18_46_emit_[16];
456   static const uint8_t table18_47_emit_[30];
457   static const uint16_t table18_47_ops_[64];
458   static const uint8_t table18_48_emit_[60];
459   static const uint8_t table18_49_emit_[60];
460   static const uint8_t table18_50_emit_[60];
461   static const uint8_t table18_51_emit_[60];
462   static const uint8_t table18_52_emit_[60];
463   static const uint8_t table18_53_emit_[8];
464   static const uint8_t table18_54_emit_[8];
465   static const uint8_t table18_55_emit_[8];
466   static const uint8_t table18_56_emit_[8];
467   static const uint8_t table18_57_emit_[8];
468   static const uint8_t table18_58_emit_[8];
469   static const uint8_t table18_59_emit_[12];
470   static const uint8_t table18_60_emit_[16];
471   static const uint8_t table18_61_emit_[16];
472   static const uint8_t table18_62_emit_[16];
473   static const uint8_t table18_63_emit_[30];
474   static const uint8_t table18_64_emit_[60];
475   static const uint8_t table18_65_emit_[60];
476   static const uint8_t table18_66_emit_[60];
477   static const uint8_t table18_67_emit_[60];
478   static const uint8_t table18_68_emit_[60];
479   static const uint8_t table18_69_emit_[8];
480   static const uint8_t table18_70_emit_[8];
481   static const uint8_t table18_71_emit_[8];
482   static const uint8_t table18_72_emit_[8];
483   static const uint8_t table18_73_emit_[8];
484   static const uint8_t table18_74_emit_[8];
485   static const uint8_t table18_75_emit_[12];
486   static const uint8_t table18_76_emit_[16];
487   static const uint8_t table18_77_emit_[16];
488   static const uint8_t table18_78_emit_[16];
489   static const uint8_t table18_79_emit_[30];
490   static const uint8_t table18_80_emit_[8];
491   static const uint8_t table18_81_emit_[8];
492   static const uint8_t table18_82_emit_[12];
493   static const uint8_t table18_83_emit_[16];
494   static const uint8_t table18_84_emit_[16];
495   static const uint8_t table18_85_emit_[20];
496   static const uint16_t table18_85_ops_[64];
497   static const uint8_t table18_86_emit_[32];
498   static const uint16_t table18_86_ops_[64];
499   static const uint8_t table18_87_emit_[36];
500   static const uint16_t table18_87_ops_[64];
501   static const uint8_t table18_88_emit_[8];
502   static const uint8_t table18_89_emit_[8];
503   static const uint8_t table18_90_emit_[12];
504   static const uint8_t table18_91_emit_[16];
505   static const uint8_t table18_92_emit_[16];
506   static const uint8_t table18_93_emit_[20];
507   static const uint8_t table18_94_emit_[32];
508   static const uint8_t table18_95_emit_[36];
509   static const uint8_t table18_96_emit_[16];
510   static const uint8_t table18_97_emit_[28];
511   static const uint16_t table18_97_ops_[64];
512   static const uint8_t table18_98_emit_[36];
513   static const uint16_t table18_98_ops_[64];
514   static const uint8_t table18_99_emit_[68];
515   static const uint16_t table18_99_ops_[64];
516   static const uint8_t table18_100_emit_[16];
517   static const uint8_t table18_101_emit_[28];
518   static const uint8_t table18_102_emit_[36];
519   static const uint8_t table18_103_emit_[68];
520   static const uint8_t table18_104_emit_[16];
521   static const uint8_t table18_105_emit_[28];
522   static const uint8_t table18_106_emit_[36];
523   static const uint8_t table18_107_emit_[68];
524   static const uint8_t table18_108_emit_[16];
525   static const uint8_t table18_109_emit_[28];
526   static const uint8_t table18_110_emit_[36];
527   static const uint8_t table18_111_emit_[68];
528   static const uint8_t table18_112_emit_[16];
529   static const uint8_t table18_113_emit_[28];
530   static const uint8_t table18_114_emit_[36];
531   static const uint8_t table18_115_emit_[68];
532   static const uint8_t table18_116_emit_[16];
533   static const uint8_t table18_117_emit_[28];
534   static const uint8_t table18_118_emit_[36];
535   static const uint8_t table18_119_emit_[68];
536   static const uint8_t table18_120_emit_[44];
537   static const uint16_t table18_120_ops_[64];
538   static const uint8_t table18_121_emit_[92];
539   static const uint16_t table18_121_ops_[64];
540   static const uint8_t table18_122_emit_[44];
541   static const uint8_t table18_123_emit_[92];
542   static const uint8_t table18_124_emit_[72];
543   static const uint16_t table18_124_ops_[64];
544   static const uint8_t table18_125_emit_[72];
545   static const uint8_t table18_126_emit_[72];
546   static const uint8_t table18_127_emit_[24];
547   static const uint16_t table18_127_ops_[64];
548   static const uint8_t* const table18_emit_[128];
549   static const uint16_t* const table18_ops_[128];
550   static const uint8_t table19_0_emit_[204];
551   static const uint16_t table19_0_ops_[128];
552   static const uint8_t table19_1_emit_[204];
553   static const uint8_t table19_2_emit_[204];
554   static const uint8_t table19_3_emit_[204];
555   static const uint8_t table19_4_emit_[204];
556   static const uint8_t table19_5_emit_[204];
557   static const uint8_t table19_6_emit_[204];
558   static const uint8_t table19_7_emit_[204];
559   static const uint8_t table19_8_emit_[204];
560   static const uint8_t table19_9_emit_[204];
561   static const uint8_t table19_10_emit_[216];
562   static const uint16_t table19_10_ops_[128];
563   static const uint8_t table19_11_emit_[216];
564   static const uint8_t table19_12_emit_[216];
565   static const uint8_t table19_13_emit_[216];
566   static const uint8_t table19_14_emit_[216];
567   static const uint8_t table19_15_emit_[216];
568   static const uint8_t table19_16_emit_[216];
569   static const uint8_t table19_17_emit_[216];
570   static const uint8_t table19_18_emit_[216];
571   static const uint8_t table19_19_emit_[216];
572   static const uint8_t table19_20_emit_[216];
573   static const uint8_t table19_21_emit_[216];
574   static const uint8_t table19_22_emit_[216];
575   static const uint8_t table19_23_emit_[120];
576   static const uint16_t table19_23_ops_[128];
577   static const uint8_t table19_24_emit_[120];
578   static const uint8_t table19_25_emit_[120];
579   static const uint8_t table19_26_emit_[120];
580   static const uint8_t table19_27_emit_[120];
581   static const uint8_t table19_28_emit_[120];
582   static const uint8_t table19_29_emit_[120];
583   static const uint8_t table19_30_emit_[120];
584   static const uint8_t table19_31_emit_[31];
585   static const uint16_t table19_31_ops_[128];
586   static const uint8_t table19_32_emit_[216];
587   static const uint8_t table19_33_emit_[216];
588   static const uint8_t table19_34_emit_[216];
589   static const uint8_t table19_35_emit_[216];
590   static const uint8_t table19_36_emit_[216];
591   static const uint8_t table19_37_emit_[120];
592   static const uint8_t table19_38_emit_[120];
593   static const uint8_t table19_39_emit_[120];
594   static const uint8_t table19_40_emit_[120];
595   static const uint8_t table19_41_emit_[120];
596   static const uint8_t table19_42_emit_[120];
597   static const uint8_t table19_43_emit_[68];
598   static const uint16_t table19_43_ops_[128];
599   static const uint16_t table19_44_ops_[128];
600   static const uint8_t table19_47_emit_[35];
601   static const uint16_t table19_47_ops_[128];
602   static const uint8_t table19_48_emit_[216];
603   static const uint8_t table19_49_emit_[216];
604   static const uint8_t table19_50_emit_[216];
605   static const uint8_t table19_51_emit_[216];
606   static const uint8_t table19_52_emit_[216];
607   static const uint8_t table19_53_emit_[120];
608   static const uint8_t table19_54_emit_[120];
609   static const uint8_t table19_55_emit_[120];
610   static const uint8_t table19_56_emit_[120];
611   static const uint8_t table19_57_emit_[120];
612   static const uint8_t table19_58_emit_[120];
613   static const uint8_t table19_59_emit_[68];
614   static const uint8_t table19_63_emit_[35];
615   static const uint16_t table19_63_ops_[128];
616   static const uint8_t table19_64_emit_[216];
617   static const uint8_t table19_65_emit_[216];
618   static const uint8_t table19_66_emit_[216];
619   static const uint8_t table19_67_emit_[216];
620   static const uint8_t table19_68_emit_[216];
621   static const uint8_t table19_69_emit_[120];
622   static const uint8_t table19_70_emit_[120];
623   static const uint8_t table19_71_emit_[120];
624   static const uint8_t table19_72_emit_[120];
625   static const uint8_t table19_73_emit_[120];
626   static const uint8_t table19_74_emit_[120];
627   static const uint8_t table19_75_emit_[68];
628   static const uint8_t table19_79_emit_[36];
629   static const uint16_t table19_79_ops_[128];
630   static const uint8_t table19_80_emit_[120];
631   static const uint8_t table19_81_emit_[120];
632   static const uint8_t table19_82_emit_[68];
633   static const uint16_t table19_85_ops_[128];
634   static const uint16_t table19_86_ops_[128];
635   static const uint8_t table19_87_emit_[46];
636   static const uint16_t table19_87_ops_[128];
637   static const uint8_t table19_88_emit_[120];
638   static const uint8_t table19_89_emit_[120];
639   static const uint8_t table19_90_emit_[68];
640   static const uint8_t table19_95_emit_[46];
641   static const uint16_t table19_97_ops_[128];
642   static const uint16_t table19_98_ops_[128];
643   static const uint16_t table19_99_ops_[128];
644   static const uint16_t table19_120_ops_[128];
645   static const uint8_t table19_121_emit_[104];
646   static const uint16_t table19_121_ops_[128];
647   static const uint8_t table19_123_emit_[104];
648   static const uint8_t table19_124_emit_[136];
649   static const uint16_t table19_124_ops_[128];
650   static const uint8_t table19_125_emit_[136];
651   static const uint8_t table19_126_emit_[136];
652   static const uint8_t table19_127_emit_[50];
653   static const uint16_t table19_127_ops_[128];
654   static const uint8_t* const table19_emit_[128];
655   static const uint16_t* const table19_ops_[128];
656   static const uint8_t table6_0_emit_[1];
657   static const uint16_t table6_0_ops_[256];
658   static const uint8_t table6_32_emit_[1];
659   static const uint16_t table6_32_ops_[256];
660   static const uint8_t table6_48_emit_[1];
661   static const uint8_t table6_64_emit_[1];
662   static const uint8_t table6_80_emit_[1];
663   static const uint16_t table6_80_ops_[256];
664   static const uint8_t table6_88_emit_[1];
665   static const uint8_t table6_96_emit_[1];
666   static const uint16_t table6_96_ops_[256];
667   static const uint8_t table6_100_emit_[1];
668   static const uint8_t table6_104_emit_[1];
669   static const uint8_t table6_108_emit_[1];
670   static const uint8_t table6_112_emit_[1];
671   static const uint8_t table6_116_emit_[1];
672   static const uint8_t table6_120_emit_[1];
673   static const uint16_t table6_120_ops_[256];
674   static const uint8_t table6_122_emit_[1];
675   static const uint8_t table6_124_emit_[1];
676   static const uint16_t table6_124_ops_[256];
677   static const uint8_t table6_125_emit_[1];
678   static const uint8_t table6_126_emit_[1];
679   static const uint8_t table6_127_emit_[79];
680   static const uint16_t table6_127_ops_[256];
681   static const uint8_t* const table6_emit_[128];
682   static const uint16_t* const table6_ops_[128];
683   static const uint8_t table27_0_emit_[8];
684   static const uint8_t table27_0_inner_[8];
685   static const uint8_t table28_0_emit_[16];
686   static const uint8_t table28_0_inner_[16];
687   static const uint8_t table31_0_emit_[30];
688   static const uint8_t table31_0_ops_[32];
689   static const uint8_t table32_0_ops_[64];
690   static const uint8_t table29_0_emit_[7];
691   static const uint8_t table29_0_ops_[32];
692   static const uint8_t table29_1_emit_[8];
693   static const uint8_t table29_1_ops_[32];
694   static const uint8_t table29_2_emit_[8];
695   static const uint8_t table29_3_emit_[10];
696   static const uint8_t table29_3_ops_[32];
697   static const uint8_t* const table29_emit_[4];
698   static const uint8_t* const table29_ops_[4];
699   static const uint8_t table34_0_emit_[7];
700   static const uint8_t table34_0_inner_[8];
701   static const uint8_t table33_0_emit_[9];
702   static const uint8_t table33_0_inner_[9];
703 };
704 template <typename F>
705 class HuffDecoder : public HuffDecoderCommon {
706  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)707   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
708       : sink_(sink), begin_(begin), end_(end) {}
Run()709   bool Run() {
710     while (!done_) {
711       if (!RefillTo8()) {
712         Done0();
713         break;
714       }
715       const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
716       const auto op = GetOp1(index);
717       const int consumed = op & 15;
718       buffer_len_ -= consumed;
719       const auto emit_ofs = op >> 6;
720       switch ((op >> 4) & 3) {
721         case 0: {
722           sink_(GetEmit1(index, emit_ofs + 0));
723           break;
724         }
725         case 1: {
726           DecodeStep0();
727           break;
728         }
729         case 2: {
730           DecodeStep1();
731           break;
732         }
733       }
734     }
735     return ok_;
736   }
737 
738  private:
RefillTo8()739   bool RefillTo8() {
740     switch (buffer_len_) {
741       case 0: {
742         return Read1to8Bytes();
743       }
744       case 1:
745       case 2:
746       case 3:
747       case 4:
748       case 5:
749       case 6:
750       case 7: {
751         return Read1to7Bytes();
752       }
753     }
754     return true;
755   }
Read1to8Bytes()756   bool Read1to8Bytes() {
757     switch (end_ - begin_) {
758       case 0: {
759         return false;
760       }
761       case 1: {
762         Fill1();
763         return true;
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   }
Fill1()795   void Fill1() {
796     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
797     begin_ += 1;
798     buffer_len_ += 8;
799   }
Fill2()800   void Fill2() {
801     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
802               (static_cast<uint64_t>(begin_[1]) << 0);
803     begin_ += 2;
804     buffer_len_ += 16;
805   }
Fill3()806   void Fill3() {
807     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
808               (static_cast<uint64_t>(begin_[1]) << 8) |
809               (static_cast<uint64_t>(begin_[2]) << 0);
810     begin_ += 3;
811     buffer_len_ += 24;
812   }
Fill4()813   void Fill4() {
814     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
815               (static_cast<uint64_t>(begin_[1]) << 16) |
816               (static_cast<uint64_t>(begin_[2]) << 8) |
817               (static_cast<uint64_t>(begin_[3]) << 0);
818     begin_ += 4;
819     buffer_len_ += 32;
820   }
Fill5()821   void Fill5() {
822     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
823               (static_cast<uint64_t>(begin_[1]) << 24) |
824               (static_cast<uint64_t>(begin_[2]) << 16) |
825               (static_cast<uint64_t>(begin_[3]) << 8) |
826               (static_cast<uint64_t>(begin_[4]) << 0);
827     begin_ += 5;
828     buffer_len_ += 40;
829   }
Fill6()830   void Fill6() {
831     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
832               (static_cast<uint64_t>(begin_[1]) << 32) |
833               (static_cast<uint64_t>(begin_[2]) << 24) |
834               (static_cast<uint64_t>(begin_[3]) << 16) |
835               (static_cast<uint64_t>(begin_[4]) << 8) |
836               (static_cast<uint64_t>(begin_[5]) << 0);
837     begin_ += 6;
838     buffer_len_ += 48;
839   }
Fill7()840   void Fill7() {
841     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
842               (static_cast<uint64_t>(begin_[1]) << 40) |
843               (static_cast<uint64_t>(begin_[2]) << 32) |
844               (static_cast<uint64_t>(begin_[3]) << 24) |
845               (static_cast<uint64_t>(begin_[4]) << 16) |
846               (static_cast<uint64_t>(begin_[5]) << 8) |
847               (static_cast<uint64_t>(begin_[6]) << 0);
848     begin_ += 7;
849     buffer_len_ += 56;
850   }
Fill8()851   void Fill8() {
852     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
853               (static_cast<uint64_t>(begin_[1]) << 48) |
854               (static_cast<uint64_t>(begin_[2]) << 40) |
855               (static_cast<uint64_t>(begin_[3]) << 32) |
856               (static_cast<uint64_t>(begin_[4]) << 24) |
857               (static_cast<uint64_t>(begin_[5]) << 16) |
858               (static_cast<uint64_t>(begin_[6]) << 8) |
859               (static_cast<uint64_t>(begin_[7]) << 0);
860     begin_ += 8;
861     buffer_len_ += 64;
862   }
Read1to7Bytes()863   bool Read1to7Bytes() {
864     switch (end_ - begin_) {
865       case 0: {
866         return false;
867       }
868       case 1: {
869         Fill1();
870         return true;
871       }
872       case 2: {
873         Fill2();
874         return true;
875       }
876       case 3: {
877         Fill3();
878         return true;
879       }
880       case 4: {
881         Fill4();
882         return true;
883       }
884       case 5: {
885         Fill5();
886         return true;
887       }
888       case 6: {
889         Fill6();
890         return true;
891       }
892       default: {
893         Fill7();
894         return true;
895       }
896     }
897   }
Done0()898   void Done0() {
899     done_ = true;
900     switch (end_ - begin_) {}
901     switch (buffer_len_) {
902       case 1:
903       case 2:
904       case 3:
905       case 4: {
906         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
907         return;
908       }
909       case 5: {
910         const auto index = buffer_ & 31;
911         const auto op = GetOp2(index);
912         switch (op & 3) {
913           case 0: {
914             sink_(GetEmit2(index, (op >> 2) + 0));
915             break;
916           }
917           case 1: {
918             ok_ = false;
919             break;
920           }
921         }
922         return;
923       }
924       case 6: {
925         const auto index = buffer_ & 63;
926         const auto op = GetOp3(index);
927         switch (op & 3) {
928           case 0: {
929             ok_ = false;
930             break;
931           }
932           case 1: {
933             sink_(GetEmit3(index, (op >> 2) + 0));
934             break;
935           }
936         }
937         return;
938       }
939       case 7: {
940         const auto index = buffer_ & 127;
941         const auto op = GetOp4(index);
942         switch (op & 3) {
943           case 0: {
944             ok_ = false;
945             break;
946           }
947           case 1: {
948             sink_(GetEmit4(index, (op >> 2) + 0));
949             break;
950           }
951         }
952         return;
953       }
954       case 0: {
955         return;
956       }
957     }
958   }
DecodeStep0()959   void DecodeStep0() {
960     if (!RefillTo2()) {
961       Done1();
962       return;
963     }
964     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
965     const auto op = GetOp5(index);
966     const int consumed = op & 3;
967     buffer_len_ -= consumed;
968     const auto emit_ofs = op >> 2;
969     sink_(GetEmit5(index, emit_ofs + 0));
970   }
RefillTo2()971   bool RefillTo2() {
972     switch (buffer_len_) {
973       case 0: {
974         return Read1to8Bytes();
975       }
976       case 1: {
977         return Read1to7Bytes();
978       }
979     }
980     return true;
981   }
Done1()982   void Done1() {
983     done_ = true;
984     switch (buffer_len_) {
985       case 1:
986       case 0: {
987         ok_ = false;
988         return;
989       }
990     }
991   }
DecodeStep1()992   void DecodeStep1() {
993     if (!RefillTo15()) {
994       Done2();
995       return;
996     }
997     const auto index = (buffer_ >> (buffer_len_ - 15)) & 0x7fff;
998     const auto op = GetOp6(index);
999     const int consumed = op & 15;
1000     buffer_len_ -= consumed;
1001     const auto emit_ofs = op >> 8;
1002     switch ((op >> 4) & 15) {
1003       case 0: {
1004         sink_(GetEmit6(index, emit_ofs + 0));
1005         break;
1006       }
1007       case 1: {
1008         DecodeStep2();
1009         break;
1010       }
1011       case 2: {
1012         DecodeStep3();
1013         break;
1014       }
1015       case 3: {
1016         DecodeStep4();
1017         break;
1018       }
1019       case 4: {
1020         DecodeStep5();
1021         break;
1022       }
1023       case 5: {
1024         DecodeStep6();
1025         break;
1026       }
1027       case 6: {
1028         DecodeStep7();
1029         break;
1030       }
1031       case 7: {
1032         DecodeStep8();
1033         break;
1034       }
1035       case 8: {
1036         DecodeStep9();
1037         break;
1038       }
1039       case 9: {
1040         DecodeStep12();
1041         break;
1042       }
1043       case 10: {
1044         DecodeStep10();
1045         break;
1046       }
1047       case 11: {
1048         DecodeStep11();
1049         break;
1050       }
1051     }
1052   }
RefillTo15()1053   bool RefillTo15() {
1054     switch (buffer_len_) {
1055       case 0: {
1056         return Read2to8Bytes();
1057       }
1058       case 1:
1059       case 2:
1060       case 3:
1061       case 4:
1062       case 5:
1063       case 6: {
1064         return Read2to7Bytes();
1065       }
1066       case 7:
1067       case 8: {
1068         return Read1to7Bytes();
1069       }
1070       case 9:
1071       case 10:
1072       case 11:
1073       case 12:
1074       case 13:
1075       case 14: {
1076         return Read1to6Bytes();
1077       }
1078     }
1079     return true;
1080   }
Read2to8Bytes()1081   bool Read2to8Bytes() {
1082     switch (end_ - begin_) {
1083       case 0:
1084       case 1: {
1085         return false;
1086       }
1087       case 2: {
1088         Fill2();
1089         return true;
1090       }
1091       case 3: {
1092         Fill3();
1093         return true;
1094       }
1095       case 4: {
1096         Fill4();
1097         return true;
1098       }
1099       case 5: {
1100         Fill5();
1101         return true;
1102       }
1103       case 6: {
1104         Fill6();
1105         return true;
1106       }
1107       case 7: {
1108         Fill7();
1109         return true;
1110       }
1111       default: {
1112         Fill8();
1113         return true;
1114       }
1115     }
1116   }
Read2to7Bytes()1117   bool Read2to7Bytes() {
1118     switch (end_ - begin_) {
1119       case 0:
1120       case 1: {
1121         return false;
1122       }
1123       case 2: {
1124         Fill2();
1125         return true;
1126       }
1127       case 3: {
1128         Fill3();
1129         return true;
1130       }
1131       case 4: {
1132         Fill4();
1133         return true;
1134       }
1135       case 5: {
1136         Fill5();
1137         return true;
1138       }
1139       case 6: {
1140         Fill6();
1141         return true;
1142       }
1143       default: {
1144         Fill7();
1145         return true;
1146       }
1147     }
1148   }
Read1to6Bytes()1149   bool Read1to6Bytes() {
1150     switch (end_ - begin_) {
1151       case 0: {
1152         return false;
1153       }
1154       case 1: {
1155         Fill1();
1156         return true;
1157       }
1158       case 2: {
1159         Fill2();
1160         return true;
1161       }
1162       case 3: {
1163         Fill3();
1164         return true;
1165       }
1166       case 4: {
1167         Fill4();
1168         return true;
1169       }
1170       case 5: {
1171         Fill5();
1172         return true;
1173       }
1174       default: {
1175         Fill6();
1176         return true;
1177       }
1178     }
1179   }
Done2()1180   void Done2() {
1181     done_ = true;
1182     switch (end_ - begin_) {
1183       case 1: {
1184         Fill1();
1185         break;
1186       }
1187     }
1188     switch (buffer_len_) {
1189       case 1: {
1190         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1191         return;
1192       }
1193       case 2: {
1194         const auto index = buffer_ & 3;
1195         const auto op = GetOp7(index);
1196         switch (op & 3) {
1197           case 0: {
1198             sink_(GetEmit7(index, (op >> 2) + 0));
1199             break;
1200           }
1201           case 1: {
1202             ok_ = false;
1203             break;
1204           }
1205         }
1206         return;
1207       }
1208       case 3: {
1209         const auto index = buffer_ & 7;
1210         const auto op = GetOp8(index);
1211         switch (op & 3) {
1212           case 0: {
1213             ok_ = false;
1214             break;
1215           }
1216           case 1: {
1217             sink_(GetEmit8(index, (op >> 2) + 0));
1218             break;
1219           }
1220         }
1221         return;
1222       }
1223       case 4: {
1224         const auto index = buffer_ & 15;
1225         const auto op = GetOp9(index);
1226         switch (op & 3) {
1227           case 0: {
1228             ok_ = false;
1229             break;
1230           }
1231           case 1: {
1232             sink_(GetEmit9(index, (op >> 2) + 0));
1233             break;
1234           }
1235         }
1236         return;
1237       }
1238       case 5: {
1239         const auto index = buffer_ & 31;
1240         const auto op = GetOp10(index);
1241         switch (op & 3) {
1242           case 0: {
1243             ok_ = false;
1244             break;
1245           }
1246           case 1: {
1247             sink_(GetEmit10(index, (op >> 2) + 0));
1248             break;
1249           }
1250         }
1251         return;
1252       }
1253       case 6: {
1254         const auto index = buffer_ & 63;
1255         const auto op = GetOp11(index);
1256         switch (op & 3) {
1257           case 0: {
1258             ok_ = false;
1259             break;
1260           }
1261           case 1: {
1262             sink_(GetEmit11(index, (op >> 2) + 0));
1263             break;
1264           }
1265         }
1266         return;
1267       }
1268       case 7: {
1269         const auto index = buffer_ & 127;
1270         const auto op = GetOp12(index);
1271         switch (op & 3) {
1272           case 0: {
1273             sink_(GetEmit12(index, (op >> 2) + 0));
1274             sink_(GetEmit12(index, (op >> 2) + 1));
1275             break;
1276           }
1277           case 1: {
1278             ok_ = false;
1279             break;
1280           }
1281           case 2: {
1282             sink_(GetEmit12(index, (op >> 2) + 0));
1283             break;
1284           }
1285         }
1286         return;
1287       }
1288       case 8: {
1289         const auto index = buffer_ & 255;
1290         const auto op = GetOp13(index);
1291         switch (op & 3) {
1292           case 0: {
1293             ok_ = false;
1294             break;
1295           }
1296           case 1: {
1297             sink_(GetEmit13(index, (op >> 2) + 0));
1298             sink_(GetEmit13(index, (op >> 2) + 1));
1299             break;
1300           }
1301           case 2: {
1302             sink_(GetEmit13(index, (op >> 2) + 0));
1303             break;
1304           }
1305         }
1306         return;
1307       }
1308       case 9: {
1309         const auto index = buffer_ & 511;
1310         const auto op = GetOp14(index);
1311         switch (op & 3) {
1312           case 0: {
1313             ok_ = false;
1314             break;
1315           }
1316           case 1: {
1317             sink_(GetEmit14(index, (op >> 2) + 0));
1318             sink_(GetEmit14(index, (op >> 2) + 1));
1319             break;
1320           }
1321           case 2: {
1322             sink_(GetEmit14(index, (op >> 2) + 0));
1323             break;
1324           }
1325         }
1326         return;
1327       }
1328       case 10: {
1329         const auto index = buffer_ & 1023;
1330         const auto op = GetOp15(index);
1331         switch (op & 3) {
1332           case 0: {
1333             ok_ = false;
1334             break;
1335           }
1336           case 1: {
1337             sink_(GetEmit15(index, (op >> 2) + 0));
1338             sink_(GetEmit15(index, (op >> 2) + 1));
1339             break;
1340           }
1341           case 2: {
1342             sink_(GetEmit15(index, (op >> 2) + 0));
1343             break;
1344           }
1345         }
1346         return;
1347       }
1348       case 11: {
1349         const auto index = buffer_ & 2047;
1350         const auto op = GetOp16(index);
1351         switch (op & 3) {
1352           case 0: {
1353             ok_ = false;
1354             break;
1355           }
1356           case 1: {
1357             sink_(GetEmit16(index, (op >> 2) + 0));
1358             sink_(GetEmit16(index, (op >> 2) + 1));
1359             break;
1360           }
1361           case 2: {
1362             sink_(GetEmit16(index, (op >> 2) + 0));
1363             break;
1364           }
1365         }
1366         return;
1367       }
1368       case 12: {
1369         const auto index = buffer_ & 4095;
1370         const auto op = GetOp17(index);
1371         switch (op & 7) {
1372           case 0: {
1373             sink_(GetEmit17(index, (op >> 3) + 0));
1374             sink_(GetEmit17(index, (op >> 3) + 1));
1375             sink_(GetEmit17(index, (op >> 3) + 2));
1376             break;
1377           }
1378           case 1: {
1379             ok_ = false;
1380             break;
1381           }
1382           case 2: {
1383             sink_(GetEmit17(index, (op >> 3) + 0));
1384             sink_(GetEmit17(index, (op >> 3) + 1));
1385             break;
1386           }
1387           case 3: {
1388             sink_(GetEmit17(index, (op >> 3) + 0));
1389             break;
1390           }
1391         }
1392         return;
1393       }
1394       case 13: {
1395         const auto index = buffer_ & 8191;
1396         const auto op = GetOp18(index);
1397         switch (op & 7) {
1398           case 0: {
1399             ok_ = false;
1400             break;
1401           }
1402           case 1: {
1403             sink_(GetEmit18(index, (op >> 3) + 0));
1404             sink_(GetEmit18(index, (op >> 3) + 1));
1405             sink_(GetEmit18(index, (op >> 3) + 2));
1406             break;
1407           }
1408           case 2: {
1409             sink_(GetEmit18(index, (op >> 3) + 0));
1410             sink_(GetEmit18(index, (op >> 3) + 1));
1411             break;
1412           }
1413           case 3: {
1414             sink_(GetEmit18(index, (op >> 3) + 0));
1415             break;
1416           }
1417         }
1418         return;
1419       }
1420       case 14: {
1421         const auto index = buffer_ & 16383;
1422         const auto op = GetOp19(index);
1423         switch (op & 7) {
1424           case 0: {
1425             ok_ = false;
1426             break;
1427           }
1428           case 1: {
1429             sink_(GetEmit19(index, (op >> 3) + 0));
1430             sink_(GetEmit19(index, (op >> 3) + 1));
1431             sink_(GetEmit19(index, (op >> 3) + 2));
1432             break;
1433           }
1434           case 2: {
1435             sink_(GetEmit19(index, (op >> 3) + 0));
1436             sink_(GetEmit19(index, (op >> 3) + 1));
1437             break;
1438           }
1439           case 3: {
1440             sink_(GetEmit19(index, (op >> 3) + 0));
1441             break;
1442           }
1443         }
1444         return;
1445       }
1446       case 0: {
1447         return;
1448       }
1449     }
1450   }
DecodeStep2()1451   void DecodeStep2() {
1452     if (!RefillTo1()) {
1453       Done3();
1454       return;
1455     }
1456     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1457     const auto op = GetOp20(index);
1458     const int consumed = op & 1;
1459     buffer_len_ -= consumed;
1460     const auto emit_ofs = op >> 1;
1461     sink_(GetEmit20(index, emit_ofs + 0));
1462   }
RefillTo1()1463   bool RefillTo1() {
1464     switch (buffer_len_) {
1465       case 0: {
1466         return Read1to8Bytes();
1467       }
1468     }
1469     return true;
1470   }
Done3()1471   void Done3() {
1472     done_ = true;
1473     ok_ = false;
1474   }
DecodeStep3()1475   void DecodeStep3() {
1476     if (!RefillTo1()) {
1477       Done4();
1478       return;
1479     }
1480     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1481     const auto op = GetOp21(index);
1482     const int consumed = op & 1;
1483     buffer_len_ -= consumed;
1484     const auto emit_ofs = op >> 1;
1485     sink_(GetEmit21(index, emit_ofs + 0));
1486   }
Done4()1487   void Done4() {
1488     done_ = true;
1489     ok_ = false;
1490   }
DecodeStep4()1491   void DecodeStep4() {
1492     if (!RefillTo1()) {
1493       Done5();
1494       return;
1495     }
1496     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1497     const auto op = GetOp22(index);
1498     const int consumed = op & 1;
1499     buffer_len_ -= consumed;
1500     const auto emit_ofs = op >> 1;
1501     sink_(GetEmit22(index, emit_ofs + 0));
1502   }
Done5()1503   void Done5() {
1504     done_ = true;
1505     ok_ = false;
1506   }
DecodeStep5()1507   void DecodeStep5() {
1508     if (!RefillTo1()) {
1509       Done6();
1510       return;
1511     }
1512     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1513     const auto op = GetOp23(index);
1514     const int consumed = op & 1;
1515     buffer_len_ -= consumed;
1516     const auto emit_ofs = op >> 1;
1517     sink_(GetEmit23(index, emit_ofs + 0));
1518   }
Done6()1519   void Done6() {
1520     done_ = true;
1521     ok_ = false;
1522   }
DecodeStep6()1523   void DecodeStep6() {
1524     if (!RefillTo1()) {
1525       Done7();
1526       return;
1527     }
1528     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1529     const auto op = GetOp24(index);
1530     const int consumed = op & 1;
1531     buffer_len_ -= consumed;
1532     const auto emit_ofs = op >> 1;
1533     sink_(GetEmit24(index, emit_ofs + 0));
1534   }
Done7()1535   void Done7() {
1536     done_ = true;
1537     ok_ = false;
1538   }
DecodeStep7()1539   void DecodeStep7() {
1540     if (!RefillTo1()) {
1541       Done8();
1542       return;
1543     }
1544     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1545     const auto op = GetOp25(index);
1546     const int consumed = op & 1;
1547     buffer_len_ -= consumed;
1548     const auto emit_ofs = op >> 1;
1549     sink_(GetEmit25(index, emit_ofs + 0));
1550   }
Done8()1551   void Done8() {
1552     done_ = true;
1553     ok_ = false;
1554   }
DecodeStep8()1555   void DecodeStep8() {
1556     if (!RefillTo2()) {
1557       Done9();
1558       return;
1559     }
1560     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1561     const auto op = GetOp26(index);
1562     const int consumed = op & 3;
1563     buffer_len_ -= consumed;
1564     const auto emit_ofs = op >> 2;
1565     sink_(GetEmit26(index, emit_ofs + 0));
1566   }
Done9()1567   void Done9() {
1568     done_ = true;
1569     switch (buffer_len_) {
1570       case 1:
1571       case 0: {
1572         ok_ = false;
1573         return;
1574       }
1575     }
1576   }
DecodeStep9()1577   void DecodeStep9() {
1578     if (!RefillTo3()) {
1579       Done10();
1580       return;
1581     }
1582     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1583     const auto op = GetOp27(index);
1584     const int consumed = op & 3;
1585     buffer_len_ -= consumed;
1586     const auto emit_ofs = op >> 2;
1587     sink_(GetEmit27(index, emit_ofs + 0));
1588   }
RefillTo3()1589   bool RefillTo3() {
1590     switch (buffer_len_) {
1591       case 0: {
1592         return Read1to8Bytes();
1593       }
1594       case 1:
1595       case 2: {
1596         return Read1to7Bytes();
1597       }
1598     }
1599     return true;
1600   }
Done10()1601   void Done10() {
1602     done_ = true;
1603     switch (buffer_len_) {
1604       case 1:
1605       case 2:
1606       case 0: {
1607         ok_ = false;
1608         return;
1609       }
1610     }
1611   }
DecodeStep10()1612   void DecodeStep10() {
1613     if (!RefillTo4()) {
1614       Done11();
1615       return;
1616     }
1617     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1618     const auto op = GetOp28(index);
1619     const int consumed = op & 7;
1620     buffer_len_ -= consumed;
1621     const auto emit_ofs = op >> 3;
1622     sink_(GetEmit28(index, emit_ofs + 0));
1623   }
RefillTo4()1624   bool RefillTo4() {
1625     switch (buffer_len_) {
1626       case 0: {
1627         return Read1to8Bytes();
1628       }
1629       case 1:
1630       case 2:
1631       case 3: {
1632         return Read1to7Bytes();
1633       }
1634     }
1635     return true;
1636   }
Done11()1637   void Done11() {
1638     done_ = true;
1639     switch (buffer_len_) {
1640       case 1:
1641       case 2:
1642       case 3:
1643       case 0: {
1644         ok_ = false;
1645         return;
1646       }
1647     }
1648   }
DecodeStep11()1649   void DecodeStep11() {
1650     if (!RefillTo7()) {
1651       Done12();
1652       return;
1653     }
1654     const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
1655     const auto op = GetOp29(index);
1656     const int consumed = op & 7;
1657     buffer_len_ -= consumed;
1658     const auto emit_ofs = op >> 4;
1659     switch ((op >> 3) & 1) {
1660       case 0: {
1661         sink_(GetEmit29(index, emit_ofs + 0));
1662         break;
1663       }
1664       case 1: {
1665         begin_ = end_;
1666         buffer_len_ = 0;
1667         break;
1668       }
1669     }
1670   }
RefillTo7()1671   bool RefillTo7() {
1672     switch (buffer_len_) {
1673       case 0: {
1674         return Read1to8Bytes();
1675       }
1676       case 1:
1677       case 2:
1678       case 3:
1679       case 4:
1680       case 5:
1681       case 6: {
1682         return Read1to7Bytes();
1683       }
1684     }
1685     return true;
1686   }
Done12()1687   void Done12() {
1688     done_ = true;
1689     switch (buffer_len_) {
1690       case 1:
1691       case 2:
1692       case 3: {
1693         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1694         return;
1695       }
1696       case 4: {
1697         const auto index = buffer_ & 15;
1698         const auto op = GetOp30(index);
1699         switch (op & 3) {
1700           case 0: {
1701             sink_(GetEmit30(index, (op >> 2) + 0));
1702             break;
1703           }
1704           case 1: {
1705             ok_ = false;
1706             break;
1707           }
1708         }
1709         return;
1710       }
1711       case 5: {
1712         const auto index = buffer_ & 31;
1713         const auto op = GetOp31(index);
1714         switch (op & 3) {
1715           case 0: {
1716             ok_ = false;
1717             break;
1718           }
1719           case 1: {
1720             sink_(GetEmit31(index, (op >> 2) + 0));
1721             break;
1722           }
1723         }
1724         return;
1725       }
1726       case 6: {
1727         const auto index = buffer_ & 63;
1728         const auto op = GetOp32(index);
1729         switch (op & 3) {
1730           case 0: {
1731             ok_ = false;
1732             break;
1733           }
1734           case 1: {
1735             sink_(GetEmit32(index, (op >> 2) + 0));
1736             break;
1737           }
1738         }
1739         return;
1740       }
1741       case 0: {
1742         return;
1743       }
1744     }
1745   }
DecodeStep12()1746   void DecodeStep12() {
1747     if (!RefillTo4()) {
1748       Done13();
1749       return;
1750     }
1751     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1752     const auto op = GetOp33(index);
1753     const int consumed = op & 7;
1754     buffer_len_ -= consumed;
1755     const auto emit_ofs = op >> 3;
1756     sink_(GetEmit33(index, emit_ofs + 0));
1757   }
Done13()1758   void Done13() {
1759     done_ = true;
1760     switch (buffer_len_) {
1761       case 1:
1762       case 2:
1763       case 0: {
1764         ok_ = false;
1765         return;
1766       }
1767       case 3: {
1768         const auto index = buffer_ & 7;
1769         const auto op = GetOp34(index);
1770         switch (op & 1) {
1771           case 0: {
1772             sink_(GetEmit34(index, (op >> 1) + 0));
1773             break;
1774           }
1775           case 1: {
1776             ok_ = false;
1777             break;
1778           }
1779         }
1780         return;
1781       }
1782     }
1783   }
1784   F sink_;
1785   const uint8_t* begin_;
1786   const uint8_t* const end_;
1787   uint64_t buffer_ = 0;
1788   int buffer_len_ = 0;
1789   bool ok_ = true;
1790   bool done_ = false;
1791 };
1792 }  // namespace geometry_8_15_7
1793 }  // namespace grpc_core
1794 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_15_7_H
1795