xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_8_7_15.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_7_15_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_7_15_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_8_7_15 {
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   }
GetOp6(size_t i)80   static inline uint64_t GetOp6(size_t i) {
81     return table6_ops_[i >> 6][i & 0x3f];
82   }
GetEmit6(size_t i,size_t emit)83   static inline uint64_t GetEmit6(size_t i, size_t emit) {
84     return table6_emit_[i >> 6][emit];
85   }
GetOp13(size_t i)86   static inline uint64_t GetOp13(size_t i) {
87     return table13_0_inner_[(i < 3 ? (i) : ((i - 3) / 12 + 3))];
88   }
GetEmit13(size_t,size_t emit)89   static inline uint64_t GetEmit13(size_t, size_t emit) {
90     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
91   }
GetOp14(size_t i)92   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)93   static inline uint64_t GetEmit14(size_t, size_t emit) {
94     return table14_0_emit_[emit];
95   }
GetOp15(size_t i)96   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)97   static inline uint64_t GetEmit15(size_t, size_t emit) {
98     return table15_0_emit_[emit];
99   }
GetOp16(size_t i)100   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)101   static inline uint64_t GetEmit16(size_t, size_t emit) {
102     return table16_0_emit_[emit];
103   }
GetOp17(size_t i)104   static inline uint64_t GetOp17(size_t i) {
105     return table17_ops_[i >> 7][i & 0x7f];
106   }
GetEmit17(size_t i,size_t emit)107   static inline uint64_t GetEmit17(size_t i, size_t emit) {
108     return table17_emit_[i >> 7][emit];
109   }
GetOp18(size_t i)110   static inline uint64_t GetOp18(size_t i) {
111     return table18_ops_[i >> 7][i & 0x7f];
112   }
GetEmit18(size_t i,size_t emit)113   static inline uint64_t GetEmit18(size_t i, size_t emit) {
114     return table18_emit_[i >> 7][emit];
115   }
GetOp19(size_t i)116   static inline uint64_t GetOp19(size_t i) {
117     return table19_ops_[i >> 6][i & 0x3f];
118   }
GetEmit19(size_t i,size_t emit)119   static inline uint64_t GetEmit19(size_t i, size_t emit) {
120     return table19_emit_[i >> 6][emit];
121   }
GetOp20(size_t i)122   static inline uint64_t GetOp20(size_t i) {
123     return table20_ops_[i >> 6][i & 0x3f];
124   }
GetEmit20(size_t i,size_t emit)125   static inline uint64_t GetEmit20(size_t i, size_t emit) {
126     return table20_emit_[i >> 6][emit];
127   }
GetOp21(size_t i)128   static inline uint64_t GetOp21(size_t i) {
129     return table21_ops_[i >> 6][i & 0x3f];
130   }
GetEmit21(size_t i,size_t emit)131   static inline uint64_t GetEmit21(size_t i, size_t emit) {
132     return table21_emit_[i >> 6][emit];
133   }
GetOp22(size_t i)134   static inline uint64_t GetOp22(size_t i) {
135     return table22_ops_[i >> 7][i & 0x7f];
136   }
GetEmit22(size_t i,size_t emit)137   static inline uint64_t GetEmit22(size_t i, size_t emit) {
138     return table22_emit_[i >> 7][emit];
139   }
GetOp23(size_t i)140   static inline uint64_t GetOp23(size_t i) {
141     return table23_ops_[i >> 7][i & 0x7f];
142   }
GetEmit23(size_t i,size_t emit)143   static inline uint64_t GetEmit23(size_t i, size_t emit) {
144     return table23_emit_[i >> 7][emit];
145   }
GetOp12(size_t i)146   static inline uint64_t GetOp12(size_t i) {
147     return table12_ops_[i >> 8][i & 0xff];
148   }
GetEmit12(size_t i,size_t emit)149   static inline uint64_t GetEmit12(size_t i, size_t emit) {
150     return table12_emit_[i >> 8][emit];
151   }
152 
153  private:
154   static const uint8_t table2_0_emit_[10];
155   static const uint8_t table2_0_ops_[32];
156   static const uint8_t table3_0_emit_[36];
157   static const uint8_t table3_0_ops_[64];
158   static const uint8_t table4_0_emit_[22];
159   static const uint8_t table4_0_ops_[64];
160   static const uint8_t table4_1_emit_[46];
161   static const uint8_t table4_1_ops_[64];
162   static const uint8_t* const table4_emit_[2];
163   static const uint8_t* const table4_ops_[2];
164   static const uint8_t table1_0_emit_[74];
165   static const uint16_t table1_0_inner_[76];
166   static const uint8_t table1_0_outer_[256];
167   static const uint8_t table8_0_inner_[6];
168   static const uint8_t table8_0_outer_[8];
169   static const uint8_t table9_0_emit_[6];
170   static const uint8_t table9_0_inner_[8];
171   static const uint8_t table9_0_outer_[16];
172   static const uint8_t table10_0_emit_[12];
173   static const uint8_t table10_0_ops_[32];
174   static const uint8_t table11_0_emit_[14];
175   static const uint8_t table11_0_ops_[64];
176   static const uint8_t table6_0_emit_[3];
177   static const uint8_t table6_0_ops_[64];
178   static const uint8_t table6_1_emit_[14];
179   static const uint8_t table6_1_ops_[64];
180   static const uint8_t* const table6_emit_[2];
181   static const uint8_t* const table6_ops_[2];
182   static const uint8_t table13_0_inner_[5];
183   static const uint8_t table14_0_emit_[11];
184   static const uint8_t table14_0_ops_[32];
185   static const uint8_t table15_0_emit_[24];
186   static const uint8_t table15_0_ops_[64];
187   static const uint8_t table16_0_emit_[50];
188   static const uint8_t table16_0_ops_[128];
189   static const uint8_t table17_0_emit_[15];
190   static const uint8_t table17_0_ops_[128];
191   static const uint8_t table17_1_emit_[64];
192   static const uint8_t table17_1_ops_[128];
193   static const uint8_t* const table17_emit_[2];
194   static const uint8_t* const table17_ops_[2];
195   static const uint8_t table18_0_emit_[62];
196   static const uint8_t table18_0_ops_[128];
197   static const uint8_t table18_1_emit_[10];
198   static const uint8_t table18_1_ops_[128];
199   static const uint8_t table18_2_emit_[23];
200   static const uint8_t table18_2_ops_[128];
201   static const uint8_t table18_3_emit_[53];
202   static const uint8_t table18_3_ops_[128];
203   static const uint8_t* const table18_emit_[4];
204   static const uint8_t* const table18_ops_[4];
205   static const uint8_t table19_0_emit_[72];
206   static const uint16_t table19_0_ops_[64];
207   static const uint8_t table19_1_emit_[72];
208   static const uint8_t table19_2_emit_[72];
209   static const uint8_t table19_3_emit_[40];
210   static const uint16_t table19_3_ops_[64];
211   static const uint8_t table19_4_emit_[40];
212   static const uint8_t table19_5_emit_[40];
213   static const uint8_t table19_6_emit_[40];
214   static const uint8_t table19_7_emit_[4];
215   static const uint16_t table19_7_ops_[64];
216   static const uint8_t table19_8_emit_[4];
217   static const uint8_t table19_9_emit_[4];
218   static const uint8_t table19_10_emit_[7];
219   static const uint16_t table19_10_ops_[64];
220   static const uint8_t table19_11_emit_[8];
221   static const uint16_t table19_11_ops_[64];
222   static const uint8_t table19_12_emit_[8];
223   static const uint8_t table19_13_emit_[12];
224   static const uint16_t table19_13_ops_[64];
225   static const uint8_t table19_14_emit_[16];
226   static const uint16_t table19_14_ops_[64];
227   static const uint8_t table19_15_emit_[21];
228   static const uint16_t table19_15_ops_[64];
229   static const uint8_t* const table19_emit_[16];
230   static const uint16_t* const table19_ops_[16];
231   static const uint8_t table20_0_emit_[44];
232   static const uint16_t table20_0_ops_[64];
233   static const uint8_t table20_1_emit_[92];
234   static const uint16_t table20_1_ops_[64];
235   static const uint8_t table20_2_emit_[44];
236   static const uint8_t table20_3_emit_[92];
237   static const uint8_t table20_4_emit_[44];
238   static const uint8_t table20_5_emit_[92];
239   static const uint8_t table20_6_emit_[72];
240   static const uint8_t table20_7_emit_[72];
241   static const uint8_t table20_8_emit_[72];
242   static const uint8_t table20_9_emit_[72];
243   static const uint8_t table20_10_emit_[72];
244   static const uint8_t table20_11_emit_[72];
245   static const uint8_t table20_12_emit_[72];
246   static const uint8_t table20_13_emit_[72];
247   static const uint8_t table20_14_emit_[40];
248   static const uint8_t table20_15_emit_[40];
249   static const uint8_t table20_16_emit_[40];
250   static const uint8_t table20_17_emit_[40];
251   static const uint8_t table20_18_emit_[40];
252   static const uint8_t table20_19_emit_[40];
253   static const uint8_t table20_20_emit_[22];
254   static const uint16_t table20_20_ops_[64];
255   static const uint8_t table20_21_emit_[4];
256   static const uint8_t table20_22_emit_[4];
257   static const uint8_t table20_23_emit_[4];
258   static const uint8_t table20_24_emit_[4];
259   static const uint8_t table20_25_emit_[4];
260   static const uint8_t table20_26_emit_[4];
261   static const uint8_t table20_27_emit_[8];
262   static const uint8_t table20_28_emit_[8];
263   static const uint8_t table20_29_emit_[8];
264   static const uint8_t table20_30_emit_[11];
265   static const uint16_t table20_30_ops_[64];
266   static const uint8_t table20_31_emit_[25];
267   static const uint16_t table20_31_ops_[64];
268   static const uint8_t* const table20_emit_[32];
269   static const uint16_t* const table20_ops_[32];
270   static const uint8_t table21_0_emit_[16];
271   static const uint16_t table21_0_ops_[64];
272   static const uint8_t table21_1_emit_[28];
273   static const uint16_t table21_1_ops_[64];
274   static const uint8_t table21_2_emit_[36];
275   static const uint16_t table21_2_ops_[64];
276   static const uint8_t table21_3_emit_[68];
277   static const uint16_t table21_3_ops_[64];
278   static const uint8_t table21_4_emit_[16];
279   static const uint8_t table21_5_emit_[28];
280   static const uint8_t table21_6_emit_[36];
281   static const uint8_t table21_7_emit_[68];
282   static const uint8_t table21_8_emit_[16];
283   static const uint8_t table21_9_emit_[28];
284   static const uint8_t table21_10_emit_[36];
285   static const uint8_t table21_11_emit_[68];
286   static const uint8_t table21_12_emit_[44];
287   static const uint8_t table21_13_emit_[92];
288   static const uint8_t table21_14_emit_[44];
289   static const uint8_t table21_15_emit_[92];
290   static const uint8_t table21_16_emit_[44];
291   static const uint8_t table21_17_emit_[92];
292   static const uint8_t table21_18_emit_[44];
293   static const uint8_t table21_19_emit_[92];
294   static const uint8_t table21_20_emit_[44];
295   static const uint8_t table21_21_emit_[92];
296   static const uint8_t table21_22_emit_[44];
297   static const uint8_t table21_23_emit_[92];
298   static const uint8_t table21_24_emit_[44];
299   static const uint8_t table21_25_emit_[92];
300   static const uint8_t table21_26_emit_[44];
301   static const uint8_t table21_27_emit_[92];
302   static const uint8_t table21_28_emit_[72];
303   static const uint8_t table21_29_emit_[72];
304   static const uint8_t table21_30_emit_[72];
305   static const uint8_t table21_31_emit_[72];
306   static const uint8_t table21_32_emit_[72];
307   static const uint8_t table21_33_emit_[72];
308   static const uint8_t table21_34_emit_[72];
309   static const uint8_t table21_35_emit_[72];
310   static const uint8_t table21_36_emit_[72];
311   static const uint8_t table21_37_emit_[72];
312   static const uint8_t table21_38_emit_[72];
313   static const uint8_t table21_39_emit_[72];
314   static const uint8_t table21_40_emit_[72];
315   static const uint8_t table21_41_emit_[40];
316   static const uint8_t table21_42_emit_[40];
317   static const uint8_t table21_43_emit_[40];
318   static const uint8_t table21_44_emit_[40];
319   static const uint8_t table21_45_emit_[40];
320   static const uint8_t table21_46_emit_[40];
321   static const uint8_t table21_47_emit_[40];
322   static const uint8_t table21_48_emit_[40];
323   static const uint8_t table21_49_emit_[40];
324   static const uint8_t table21_50_emit_[40];
325   static const uint8_t table21_51_emit_[40];
326   static const uint8_t table21_52_emit_[40];
327   static const uint8_t table21_53_emit_[40];
328   static const uint8_t table21_54_emit_[4];
329   static const uint8_t table21_55_emit_[4];
330   static const uint8_t table21_56_emit_[4];
331   static const uint8_t table21_57_emit_[4];
332   static const uint8_t table21_58_emit_[4];
333   static const uint8_t table21_59_emit_[4];
334   static const uint8_t table21_60_emit_[4];
335   static const uint8_t table21_61_emit_[7];
336   static const uint8_t table21_62_emit_[10];
337   static const uint16_t table21_62_ops_[64];
338   static const uint8_t table21_63_emit_[34];
339   static const uint16_t table21_63_ops_[64];
340   static const uint8_t* const table21_emit_[64];
341   static const uint16_t* const table21_ops_[64];
342   static const uint16_t table22_0_ops_[128];
343   static const uint16_t table22_1_ops_[128];
344   static const uint16_t table22_2_ops_[128];
345   static const uint16_t table22_3_ops_[128];
346   static const uint16_t table22_12_ops_[128];
347   static const uint8_t table22_13_emit_[104];
348   static const uint16_t table22_13_ops_[128];
349   static const uint8_t table22_15_emit_[104];
350   static const uint8_t table22_17_emit_[104];
351   static const uint8_t table22_19_emit_[104];
352   static const uint8_t table22_21_emit_[104];
353   static const uint8_t table22_23_emit_[104];
354   static const uint8_t table22_25_emit_[104];
355   static const uint8_t table22_27_emit_[104];
356   static const uint8_t table22_28_emit_[136];
357   static const uint16_t table22_28_ops_[128];
358   static const uint8_t table22_29_emit_[136];
359   static const uint8_t table22_30_emit_[136];
360   static const uint8_t table22_31_emit_[136];
361   static const uint8_t table22_32_emit_[136];
362   static const uint8_t table22_33_emit_[136];
363   static const uint8_t table22_34_emit_[136];
364   static const uint8_t table22_35_emit_[136];
365   static const uint8_t table22_36_emit_[136];
366   static const uint8_t table22_37_emit_[136];
367   static const uint8_t table22_38_emit_[136];
368   static const uint8_t table22_39_emit_[136];
369   static const uint8_t table22_40_emit_[136];
370   static const uint8_t table22_41_emit_[144];
371   static const uint16_t table22_41_ops_[128];
372   static const uint8_t table22_42_emit_[144];
373   static const uint8_t table22_43_emit_[144];
374   static const uint8_t table22_44_emit_[144];
375   static const uint8_t table22_45_emit_[144];
376   static const uint8_t table22_46_emit_[144];
377   static const uint8_t table22_47_emit_[144];
378   static const uint8_t table22_48_emit_[144];
379   static const uint8_t table22_49_emit_[144];
380   static const uint8_t table22_50_emit_[144];
381   static const uint8_t table22_51_emit_[144];
382   static const uint8_t table22_52_emit_[144];
383   static const uint8_t table22_53_emit_[144];
384   static const uint8_t table22_54_emit_[80];
385   static const uint16_t table22_54_ops_[128];
386   static const uint8_t table22_55_emit_[80];
387   static const uint8_t table22_56_emit_[80];
388   static const uint8_t table22_57_emit_[80];
389   static const uint8_t table22_58_emit_[80];
390   static const uint8_t table22_59_emit_[80];
391   static const uint8_t table22_60_emit_[80];
392   static const uint8_t table22_61_emit_[26];
393   static const uint16_t table22_61_ops_[128];
394   static const uint16_t table22_62_ops_[128];
395   static const uint8_t table22_63_emit_[63];
396   static const uint16_t table22_63_ops_[128];
397   static const uint8_t* const table22_emit_[64];
398   static const uint16_t* const table22_ops_[64];
399   static const uint8_t table23_0_emit_[120];
400   static const uint16_t table23_0_ops_[128];
401   static const uint8_t table23_1_emit_[120];
402   static const uint8_t table23_2_emit_[68];
403   static const uint16_t table23_2_ops_[128];
404   static const uint8_t table23_3_emit_[16];
405   static const uint16_t table23_3_ops_[128];
406   static const uint8_t table23_4_emit_[16];
407   static const uint8_t table23_5_emit_[20];
408   static const uint16_t table23_5_ops_[128];
409   static const uint8_t table23_6_emit_[32];
410   static const uint16_t table23_6_ops_[128];
411   static const uint8_t table23_7_emit_[46];
412   static const uint16_t table23_7_ops_[128];
413   static const uint8_t table23_8_emit_[120];
414   static const uint8_t table23_9_emit_[120];
415   static const uint8_t table23_10_emit_[68];
416   static const uint8_t table23_11_emit_[16];
417   static const uint8_t table23_12_emit_[16];
418   static const uint8_t table23_13_emit_[20];
419   static const uint8_t table23_14_emit_[32];
420   static const uint8_t table23_15_emit_[46];
421   static const uint8_t table23_16_emit_[120];
422   static const uint8_t table23_17_emit_[120];
423   static const uint8_t table23_18_emit_[68];
424   static const uint8_t table23_19_emit_[16];
425   static const uint8_t table23_20_emit_[16];
426   static const uint8_t table23_21_emit_[20];
427   static const uint8_t table23_22_emit_[32];
428   static const uint8_t table23_23_emit_[46];
429   static const uint8_t table23_24_emit_[16];
430   static const uint8_t table23_25_emit_[28];
431   static const uint16_t table23_25_ops_[128];
432   static const uint8_t table23_26_emit_[36];
433   static const uint16_t table23_26_ops_[128];
434   static const uint8_t table23_27_emit_[68];
435   static const uint16_t table23_27_ops_[128];
436   static const uint8_t table23_28_emit_[16];
437   static const uint8_t table23_29_emit_[28];
438   static const uint8_t table23_30_emit_[36];
439   static const uint8_t table23_31_emit_[68];
440   static const uint8_t table23_32_emit_[16];
441   static const uint8_t table23_33_emit_[28];
442   static const uint8_t table23_34_emit_[36];
443   static const uint8_t table23_35_emit_[68];
444   static const uint8_t table23_36_emit_[16];
445   static const uint8_t table23_37_emit_[28];
446   static const uint8_t table23_38_emit_[36];
447   static const uint8_t table23_39_emit_[68];
448   static const uint8_t table23_40_emit_[16];
449   static const uint8_t table23_41_emit_[28];
450   static const uint8_t table23_42_emit_[36];
451   static const uint8_t table23_43_emit_[68];
452   static const uint8_t table23_44_emit_[16];
453   static const uint8_t table23_45_emit_[28];
454   static const uint8_t table23_46_emit_[36];
455   static const uint8_t table23_47_emit_[68];
456   static const uint8_t table23_48_emit_[16];
457   static const uint8_t table23_49_emit_[28];
458   static const uint8_t table23_50_emit_[36];
459   static const uint8_t table23_51_emit_[68];
460   static const uint8_t table23_52_emit_[16];
461   static const uint8_t table23_53_emit_[28];
462   static const uint8_t table23_54_emit_[36];
463   static const uint8_t table23_55_emit_[68];
464   static const uint8_t table23_56_emit_[44];
465   static const uint16_t table23_56_ops_[128];
466   static const uint8_t table23_57_emit_[104];
467   static const uint16_t table23_57_ops_[128];
468   static const uint8_t table23_58_emit_[44];
469   static const uint8_t table23_59_emit_[104];
470   static const uint8_t table23_60_emit_[44];
471   static const uint8_t table23_61_emit_[104];
472   static const uint8_t table23_62_emit_[44];
473   static const uint8_t table23_63_emit_[104];
474   static const uint8_t table23_64_emit_[44];
475   static const uint8_t table23_65_emit_[104];
476   static const uint8_t table23_66_emit_[44];
477   static const uint8_t table23_67_emit_[104];
478   static const uint8_t table23_68_emit_[44];
479   static const uint8_t table23_69_emit_[104];
480   static const uint8_t table23_70_emit_[44];
481   static const uint8_t table23_71_emit_[104];
482   static const uint8_t table23_72_emit_[44];
483   static const uint8_t table23_73_emit_[104];
484   static const uint8_t table23_74_emit_[44];
485   static const uint8_t table23_75_emit_[104];
486   static const uint8_t table23_76_emit_[44];
487   static const uint8_t table23_77_emit_[104];
488   static const uint8_t table23_78_emit_[44];
489   static const uint8_t table23_79_emit_[104];
490   static const uint8_t table23_80_emit_[44];
491   static const uint8_t table23_81_emit_[104];
492   static const uint8_t table23_82_emit_[136];
493   static const uint16_t table23_82_ops_[128];
494   static const uint8_t table23_83_emit_[136];
495   static const uint8_t table23_84_emit_[136];
496   static const uint8_t table23_85_emit_[136];
497   static const uint8_t table23_86_emit_[136];
498   static const uint8_t table23_87_emit_[136];
499   static const uint8_t table23_88_emit_[136];
500   static const uint8_t table23_89_emit_[136];
501   static const uint8_t table23_90_emit_[136];
502   static const uint8_t table23_91_emit_[136];
503   static const uint8_t table23_92_emit_[136];
504   static const uint8_t table23_93_emit_[136];
505   static const uint8_t table23_94_emit_[136];
506   static const uint8_t table23_95_emit_[136];
507   static const uint8_t table23_96_emit_[136];
508   static const uint8_t table23_97_emit_[136];
509   static const uint8_t table23_98_emit_[136];
510   static const uint8_t table23_99_emit_[136];
511   static const uint8_t table23_100_emit_[136];
512   static const uint8_t table23_101_emit_[136];
513   static const uint8_t table23_102_emit_[136];
514   static const uint8_t table23_103_emit_[136];
515   static const uint8_t table23_104_emit_[136];
516   static const uint8_t table23_105_emit_[136];
517   static const uint8_t table23_106_emit_[136];
518   static const uint8_t table23_107_emit_[136];
519   static const uint8_t table23_108_emit_[144];
520   static const uint16_t table23_108_ops_[128];
521   static const uint8_t table23_109_emit_[144];
522   static const uint8_t table23_110_emit_[144];
523   static const uint8_t table23_111_emit_[144];
524   static const uint8_t table23_112_emit_[144];
525   static const uint8_t table23_113_emit_[144];
526   static const uint8_t table23_114_emit_[144];
527   static const uint8_t table23_115_emit_[144];
528   static const uint8_t table23_116_emit_[144];
529   static const uint8_t table23_117_emit_[144];
530   static const uint8_t table23_118_emit_[144];
531   static const uint8_t table23_119_emit_[144];
532   static const uint8_t table23_120_emit_[144];
533   static const uint8_t table23_121_emit_[144];
534   static const uint8_t table23_122_emit_[112];
535   static const uint16_t table23_122_ops_[128];
536   static const uint8_t table23_123_emit_[80];
537   static const uint16_t table23_123_ops_[128];
538   static const uint8_t table23_124_emit_[80];
539   static const uint8_t table23_125_emit_[44];
540   static const uint16_t table23_125_ops_[128];
541   static const uint8_t table23_126_emit_[17];
542   static const uint16_t table23_126_ops_[128];
543   static const uint8_t table23_127_emit_[46];
544   static const uint16_t table23_127_ops_[128];
545   static const uint8_t* const table23_emit_[128];
546   static const uint16_t* const table23_ops_[128];
547   static const uint8_t table12_0_emit_[1];
548   static const uint16_t table12_0_ops_[256];
549   static const uint8_t table12_8_emit_[1];
550   static const uint8_t table12_16_emit_[1];
551   static const uint8_t table12_24_emit_[1];
552   static const uint16_t table12_24_ops_[256];
553   static const uint8_t table12_28_emit_[1];
554   static const uint8_t table12_32_emit_[1];
555   static const uint8_t table12_36_emit_[1];
556   static const uint8_t table12_40_emit_[1];
557   static const uint8_t table12_44_emit_[1];
558   static const uint8_t table12_48_emit_[1];
559   static const uint8_t table12_52_emit_[1];
560   static const uint8_t table12_56_emit_[1];
561   static const uint16_t table12_56_ops_[256];
562   static const uint8_t table12_58_emit_[1];
563   static const uint8_t table12_60_emit_[1];
564   static const uint8_t table12_62_emit_[1];
565   static const uint8_t table12_64_emit_[1];
566   static const uint8_t table12_66_emit_[1];
567   static const uint8_t table12_68_emit_[1];
568   static const uint8_t table12_70_emit_[1];
569   static const uint8_t table12_72_emit_[1];
570   static const uint8_t table12_74_emit_[1];
571   static const uint8_t table12_76_emit_[1];
572   static const uint8_t table12_78_emit_[1];
573   static const uint8_t table12_80_emit_[1];
574   static const uint8_t table12_82_emit_[1];
575   static const uint16_t table12_82_ops_[256];
576   static const uint8_t table12_83_emit_[1];
577   static const uint8_t table12_84_emit_[1];
578   static const uint8_t table12_85_emit_[1];
579   static const uint8_t table12_86_emit_[1];
580   static const uint8_t table12_87_emit_[1];
581   static const uint8_t table12_88_emit_[1];
582   static const uint8_t table12_89_emit_[1];
583   static const uint8_t table12_90_emit_[1];
584   static const uint8_t table12_91_emit_[1];
585   static const uint8_t table12_92_emit_[1];
586   static const uint8_t table12_93_emit_[1];
587   static const uint8_t table12_94_emit_[1];
588   static const uint8_t table12_95_emit_[1];
589   static const uint8_t table12_96_emit_[1];
590   static const uint8_t table12_97_emit_[1];
591   static const uint8_t table12_98_emit_[1];
592   static const uint8_t table12_99_emit_[1];
593   static const uint8_t table12_100_emit_[1];
594   static const uint8_t table12_101_emit_[1];
595   static const uint8_t table12_102_emit_[1];
596   static const uint8_t table12_103_emit_[1];
597   static const uint8_t table12_104_emit_[1];
598   static const uint8_t table12_105_emit_[1];
599   static const uint8_t table12_106_emit_[1];
600   static const uint8_t table12_107_emit_[1];
601   static const uint8_t table12_108_emit_[2];
602   static const uint16_t table12_108_ops_[256];
603   static const uint8_t table12_109_emit_[2];
604   static const uint8_t table12_110_emit_[2];
605   static const uint8_t table12_111_emit_[2];
606   static const uint8_t table12_112_emit_[2];
607   static const uint8_t table12_113_emit_[2];
608   static const uint8_t table12_114_emit_[2];
609   static const uint8_t table12_115_emit_[2];
610   static const uint8_t table12_116_emit_[2];
611   static const uint8_t table12_117_emit_[2];
612   static const uint8_t table12_118_emit_[2];
613   static const uint8_t table12_119_emit_[2];
614   static const uint8_t table12_120_emit_[2];
615   static const uint8_t table12_121_emit_[2];
616   static const uint8_t table12_122_emit_[3];
617   static const uint16_t table12_122_ops_[256];
618   static const uint8_t table12_123_emit_[4];
619   static const uint16_t table12_123_ops_[256];
620   static const uint8_t table12_124_emit_[4];
621   static const uint8_t table12_125_emit_[6];
622   static const uint16_t table12_125_ops_[256];
623   static const uint16_t table12_126_ops_[256];
624   static const uint8_t table12_127_emit_[49];
625   static const uint16_t table12_127_ops_[256];
626   static const uint8_t* const table12_emit_[128];
627   static const uint16_t* const table12_ops_[128];
628 };
629 template <typename F>
630 class HuffDecoder : public HuffDecoderCommon {
631  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)632   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
633       : sink_(sink), begin_(begin), end_(end) {}
Run()634   bool Run() {
635     while (!done_) {
636       if (!RefillTo8()) {
637         Done0();
638         break;
639       }
640       const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
641       const auto op = GetOp1(index);
642       const int consumed = op & 15;
643       buffer_len_ -= consumed;
644       const auto emit_ofs = op >> 6;
645       switch ((op >> 4) & 3) {
646         case 0: {
647           sink_(GetEmit1(index, emit_ofs + 0));
648           break;
649         }
650         case 1: {
651           DecodeStep0();
652           break;
653         }
654         case 2: {
655           DecodeStep1();
656           break;
657         }
658       }
659     }
660     return ok_;
661   }
662 
663  private:
RefillTo8()664   bool RefillTo8() {
665     switch (buffer_len_) {
666       case 0: {
667         return Read1to8Bytes();
668       }
669       case 1:
670       case 2:
671       case 3:
672       case 4:
673       case 5:
674       case 6:
675       case 7: {
676         return Read1to7Bytes();
677       }
678     }
679     return true;
680   }
Read1to8Bytes()681   bool Read1to8Bytes() {
682     switch (end_ - begin_) {
683       case 0: {
684         return false;
685       }
686       case 1: {
687         Fill1();
688         return true;
689       }
690       case 2: {
691         Fill2();
692         return true;
693       }
694       case 3: {
695         Fill3();
696         return true;
697       }
698       case 4: {
699         Fill4();
700         return true;
701       }
702       case 5: {
703         Fill5();
704         return true;
705       }
706       case 6: {
707         Fill6();
708         return true;
709       }
710       case 7: {
711         Fill7();
712         return true;
713       }
714       default: {
715         Fill8();
716         return true;
717       }
718     }
719   }
Fill1()720   void Fill1() {
721     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
722     begin_ += 1;
723     buffer_len_ += 8;
724   }
Fill2()725   void Fill2() {
726     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
727               (static_cast<uint64_t>(begin_[1]) << 0);
728     begin_ += 2;
729     buffer_len_ += 16;
730   }
Fill3()731   void Fill3() {
732     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
733               (static_cast<uint64_t>(begin_[1]) << 8) |
734               (static_cast<uint64_t>(begin_[2]) << 0);
735     begin_ += 3;
736     buffer_len_ += 24;
737   }
Fill4()738   void Fill4() {
739     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
740               (static_cast<uint64_t>(begin_[1]) << 16) |
741               (static_cast<uint64_t>(begin_[2]) << 8) |
742               (static_cast<uint64_t>(begin_[3]) << 0);
743     begin_ += 4;
744     buffer_len_ += 32;
745   }
Fill5()746   void Fill5() {
747     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
748               (static_cast<uint64_t>(begin_[1]) << 24) |
749               (static_cast<uint64_t>(begin_[2]) << 16) |
750               (static_cast<uint64_t>(begin_[3]) << 8) |
751               (static_cast<uint64_t>(begin_[4]) << 0);
752     begin_ += 5;
753     buffer_len_ += 40;
754   }
Fill6()755   void Fill6() {
756     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
757               (static_cast<uint64_t>(begin_[1]) << 32) |
758               (static_cast<uint64_t>(begin_[2]) << 24) |
759               (static_cast<uint64_t>(begin_[3]) << 16) |
760               (static_cast<uint64_t>(begin_[4]) << 8) |
761               (static_cast<uint64_t>(begin_[5]) << 0);
762     begin_ += 6;
763     buffer_len_ += 48;
764   }
Fill7()765   void Fill7() {
766     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
767               (static_cast<uint64_t>(begin_[1]) << 40) |
768               (static_cast<uint64_t>(begin_[2]) << 32) |
769               (static_cast<uint64_t>(begin_[3]) << 24) |
770               (static_cast<uint64_t>(begin_[4]) << 16) |
771               (static_cast<uint64_t>(begin_[5]) << 8) |
772               (static_cast<uint64_t>(begin_[6]) << 0);
773     begin_ += 7;
774     buffer_len_ += 56;
775   }
Fill8()776   void Fill8() {
777     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
778               (static_cast<uint64_t>(begin_[1]) << 48) |
779               (static_cast<uint64_t>(begin_[2]) << 40) |
780               (static_cast<uint64_t>(begin_[3]) << 32) |
781               (static_cast<uint64_t>(begin_[4]) << 24) |
782               (static_cast<uint64_t>(begin_[5]) << 16) |
783               (static_cast<uint64_t>(begin_[6]) << 8) |
784               (static_cast<uint64_t>(begin_[7]) << 0);
785     begin_ += 8;
786     buffer_len_ += 64;
787   }
Read1to7Bytes()788   bool Read1to7Bytes() {
789     switch (end_ - begin_) {
790       case 0: {
791         return false;
792       }
793       case 1: {
794         Fill1();
795         return true;
796       }
797       case 2: {
798         Fill2();
799         return true;
800       }
801       case 3: {
802         Fill3();
803         return true;
804       }
805       case 4: {
806         Fill4();
807         return true;
808       }
809       case 5: {
810         Fill5();
811         return true;
812       }
813       case 6: {
814         Fill6();
815         return true;
816       }
817       default: {
818         Fill7();
819         return true;
820       }
821     }
822   }
Done0()823   void Done0() {
824     done_ = true;
825     switch (end_ - begin_) {}
826     switch (buffer_len_) {
827       case 1:
828       case 2:
829       case 3:
830       case 4: {
831         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
832         return;
833       }
834       case 5: {
835         const auto index = buffer_ & 31;
836         const auto op = GetOp2(index);
837         switch (op & 3) {
838           case 0: {
839             sink_(GetEmit2(index, (op >> 2) + 0));
840             break;
841           }
842           case 1: {
843             ok_ = false;
844             break;
845           }
846         }
847         return;
848       }
849       case 6: {
850         const auto index = buffer_ & 63;
851         const auto op = GetOp3(index);
852         switch (op & 3) {
853           case 0: {
854             ok_ = false;
855             break;
856           }
857           case 1: {
858             sink_(GetEmit3(index, (op >> 2) + 0));
859             break;
860           }
861         }
862         return;
863       }
864       case 7: {
865         const auto index = buffer_ & 127;
866         const auto op = GetOp4(index);
867         switch (op & 3) {
868           case 0: {
869             ok_ = false;
870             break;
871           }
872           case 1: {
873             sink_(GetEmit4(index, (op >> 2) + 0));
874             break;
875           }
876         }
877         return;
878       }
879       case 0: {
880         return;
881       }
882     }
883   }
DecodeStep0()884   void DecodeStep0() {
885     if (!RefillTo2()) {
886       Done1();
887       return;
888     }
889     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
890     const auto op = GetOp5(index);
891     const int consumed = op & 3;
892     buffer_len_ -= consumed;
893     const auto emit_ofs = op >> 2;
894     sink_(GetEmit5(index, emit_ofs + 0));
895   }
RefillTo2()896   bool RefillTo2() {
897     switch (buffer_len_) {
898       case 0: {
899         return Read1to8Bytes();
900       }
901       case 1: {
902         return Read1to7Bytes();
903       }
904     }
905     return true;
906   }
Done1()907   void Done1() {
908     done_ = true;
909     switch (buffer_len_) {
910       case 1:
911       case 0: {
912         ok_ = false;
913         return;
914       }
915     }
916   }
DecodeStep1()917   void DecodeStep1() {
918     if (!RefillTo7()) {
919       Done2();
920       return;
921     }
922     const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
923     const auto op = GetOp6(index);
924     const int consumed = op & 7;
925     buffer_len_ -= consumed;
926     const auto emit_ofs = op >> 4;
927     switch ((op >> 3) & 1) {
928       case 0: {
929         sink_(GetEmit6(index, emit_ofs + 0));
930         break;
931       }
932       case 1: {
933         DecodeStep2();
934         break;
935       }
936     }
937   }
RefillTo7()938   bool RefillTo7() {
939     switch (buffer_len_) {
940       case 0: {
941         return Read1to8Bytes();
942       }
943       case 1:
944       case 2:
945       case 3:
946       case 4:
947       case 5:
948       case 6: {
949         return Read1to7Bytes();
950       }
951     }
952     return true;
953   }
Done2()954   void Done2() {
955     done_ = true;
956     switch (buffer_len_) {
957       case 1: {
958         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
959         return;
960       }
961       case 2: {
962         const auto index = buffer_ & 3;
963         const auto op = GetOp7(index);
964         switch (op & 3) {
965           case 0: {
966             sink_(GetEmit7(index, (op >> 2) + 0));
967             break;
968           }
969           case 1: {
970             ok_ = false;
971             break;
972           }
973         }
974         return;
975       }
976       case 3: {
977         const auto index = buffer_ & 7;
978         const auto op = GetOp8(index);
979         switch (op & 3) {
980           case 0: {
981             ok_ = false;
982             break;
983           }
984           case 1: {
985             sink_(GetEmit8(index, (op >> 2) + 0));
986             break;
987           }
988         }
989         return;
990       }
991       case 4: {
992         const auto index = buffer_ & 15;
993         const auto op = GetOp9(index);
994         switch (op & 3) {
995           case 0: {
996             ok_ = false;
997             break;
998           }
999           case 1: {
1000             sink_(GetEmit9(index, (op >> 2) + 0));
1001             break;
1002           }
1003         }
1004         return;
1005       }
1006       case 5: {
1007         const auto index = buffer_ & 31;
1008         const auto op = GetOp10(index);
1009         switch (op & 3) {
1010           case 0: {
1011             ok_ = false;
1012             break;
1013           }
1014           case 1: {
1015             sink_(GetEmit10(index, (op >> 2) + 0));
1016             break;
1017           }
1018         }
1019         return;
1020       }
1021       case 6: {
1022         const auto index = buffer_ & 63;
1023         const auto op = GetOp11(index);
1024         switch (op & 3) {
1025           case 0: {
1026             ok_ = false;
1027             break;
1028           }
1029           case 1: {
1030             sink_(GetEmit11(index, (op >> 2) + 0));
1031             break;
1032           }
1033         }
1034         return;
1035       }
1036       case 0: {
1037         return;
1038       }
1039     }
1040   }
DecodeStep2()1041   void DecodeStep2() {
1042     if (!RefillTo15()) {
1043       Done3();
1044       return;
1045     }
1046     const auto index = (buffer_ >> (buffer_len_ - 15)) & 0x7fff;
1047     const auto op = GetOp12(index);
1048     const int consumed = op & 15;
1049     buffer_len_ -= consumed;
1050     const auto emit_ofs = op >> 5;
1051     switch ((op >> 4) & 1) {
1052       case 0: {
1053         sink_(GetEmit12(index, emit_ofs + 0));
1054         break;
1055       }
1056       case 1: {
1057         begin_ = end_;
1058         buffer_len_ = 0;
1059         break;
1060       }
1061     }
1062   }
RefillTo15()1063   bool RefillTo15() {
1064     switch (buffer_len_) {
1065       case 0: {
1066         return Read2to8Bytes();
1067       }
1068       case 1:
1069       case 2:
1070       case 3:
1071       case 4:
1072       case 5:
1073       case 6: {
1074         return Read2to7Bytes();
1075       }
1076       case 7:
1077       case 8: {
1078         return Read1to7Bytes();
1079       }
1080       case 9:
1081       case 10:
1082       case 11:
1083       case 12:
1084       case 13:
1085       case 14: {
1086         return Read1to6Bytes();
1087       }
1088     }
1089     return true;
1090   }
Read2to8Bytes()1091   bool Read2to8Bytes() {
1092     switch (end_ - begin_) {
1093       case 0:
1094       case 1: {
1095         return false;
1096       }
1097       case 2: {
1098         Fill2();
1099         return true;
1100       }
1101       case 3: {
1102         Fill3();
1103         return true;
1104       }
1105       case 4: {
1106         Fill4();
1107         return true;
1108       }
1109       case 5: {
1110         Fill5();
1111         return true;
1112       }
1113       case 6: {
1114         Fill6();
1115         return true;
1116       }
1117       case 7: {
1118         Fill7();
1119         return true;
1120       }
1121       default: {
1122         Fill8();
1123         return true;
1124       }
1125     }
1126   }
Read2to7Bytes()1127   bool Read2to7Bytes() {
1128     switch (end_ - begin_) {
1129       case 0:
1130       case 1: {
1131         return false;
1132       }
1133       case 2: {
1134         Fill2();
1135         return true;
1136       }
1137       case 3: {
1138         Fill3();
1139         return true;
1140       }
1141       case 4: {
1142         Fill4();
1143         return true;
1144       }
1145       case 5: {
1146         Fill5();
1147         return true;
1148       }
1149       case 6: {
1150         Fill6();
1151         return true;
1152       }
1153       default: {
1154         Fill7();
1155         return true;
1156       }
1157     }
1158   }
Read1to6Bytes()1159   bool Read1to6Bytes() {
1160     switch (end_ - begin_) {
1161       case 0: {
1162         return false;
1163       }
1164       case 1: {
1165         Fill1();
1166         return true;
1167       }
1168       case 2: {
1169         Fill2();
1170         return true;
1171       }
1172       case 3: {
1173         Fill3();
1174         return true;
1175       }
1176       case 4: {
1177         Fill4();
1178         return true;
1179       }
1180       case 5: {
1181         Fill5();
1182         return true;
1183       }
1184       default: {
1185         Fill6();
1186         return true;
1187       }
1188     }
1189   }
Done3()1190   void Done3() {
1191     done_ = true;
1192     switch (end_ - begin_) {
1193       case 1: {
1194         Fill1();
1195         break;
1196       }
1197     }
1198     switch (buffer_len_) {
1199       case 1:
1200       case 2:
1201       case 3: {
1202         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1203         return;
1204       }
1205       case 4: {
1206         const auto index = buffer_ & 15;
1207         const auto op = GetOp13(index);
1208         switch (op & 3) {
1209           case 0: {
1210             sink_(GetEmit13(index, (op >> 2) + 0));
1211             break;
1212           }
1213           case 1: {
1214             ok_ = false;
1215             break;
1216           }
1217         }
1218         return;
1219       }
1220       case 5: {
1221         const auto index = buffer_ & 31;
1222         const auto op = GetOp14(index);
1223         switch (op & 3) {
1224           case 0: {
1225             ok_ = false;
1226             break;
1227           }
1228           case 1: {
1229             sink_(GetEmit14(index, (op >> 2) + 0));
1230             break;
1231           }
1232         }
1233         return;
1234       }
1235       case 6: {
1236         const auto index = buffer_ & 63;
1237         const auto op = GetOp15(index);
1238         switch (op & 3) {
1239           case 0: {
1240             ok_ = false;
1241             break;
1242           }
1243           case 1: {
1244             sink_(GetEmit15(index, (op >> 2) + 0));
1245             break;
1246           }
1247         }
1248         return;
1249       }
1250       case 7: {
1251         const auto index = buffer_ & 127;
1252         const auto op = GetOp16(index);
1253         switch (op & 3) {
1254           case 0: {
1255             ok_ = false;
1256             break;
1257           }
1258           case 1: {
1259             sink_(GetEmit16(index, (op >> 2) + 0));
1260             break;
1261           }
1262         }
1263         return;
1264       }
1265       case 8: {
1266         const auto index = buffer_ & 255;
1267         const auto op = GetOp17(index);
1268         switch (op & 3) {
1269           case 0: {
1270             ok_ = false;
1271             break;
1272           }
1273           case 1: {
1274             sink_(GetEmit17(index, (op >> 2) + 0));
1275             break;
1276           }
1277         }
1278         return;
1279       }
1280       case 9: {
1281         const auto index = buffer_ & 511;
1282         const auto op = GetOp18(index);
1283         switch (op & 3) {
1284           case 0: {
1285             sink_(GetEmit18(index, (op >> 2) + 0));
1286             sink_(GetEmit18(index, (op >> 2) + 1));
1287             break;
1288           }
1289           case 1: {
1290             ok_ = false;
1291             break;
1292           }
1293           case 2: {
1294             sink_(GetEmit18(index, (op >> 2) + 0));
1295             break;
1296           }
1297         }
1298         return;
1299       }
1300       case 10: {
1301         const auto index = buffer_ & 1023;
1302         const auto op = GetOp19(index);
1303         switch (op & 3) {
1304           case 0: {
1305             ok_ = false;
1306             break;
1307           }
1308           case 1: {
1309             sink_(GetEmit19(index, (op >> 2) + 0));
1310             sink_(GetEmit19(index, (op >> 2) + 1));
1311             break;
1312           }
1313           case 2: {
1314             sink_(GetEmit19(index, (op >> 2) + 0));
1315             break;
1316           }
1317         }
1318         return;
1319       }
1320       case 11: {
1321         const auto index = buffer_ & 2047;
1322         const auto op = GetOp20(index);
1323         switch (op & 3) {
1324           case 0: {
1325             ok_ = false;
1326             break;
1327           }
1328           case 1: {
1329             sink_(GetEmit20(index, (op >> 2) + 0));
1330             sink_(GetEmit20(index, (op >> 2) + 1));
1331             break;
1332           }
1333           case 2: {
1334             sink_(GetEmit20(index, (op >> 2) + 0));
1335             break;
1336           }
1337         }
1338         return;
1339       }
1340       case 12: {
1341         const auto index = buffer_ & 4095;
1342         const auto op = GetOp21(index);
1343         switch (op & 3) {
1344           case 0: {
1345             ok_ = false;
1346             break;
1347           }
1348           case 1: {
1349             sink_(GetEmit21(index, (op >> 2) + 0));
1350             sink_(GetEmit21(index, (op >> 2) + 1));
1351             break;
1352           }
1353           case 2: {
1354             sink_(GetEmit21(index, (op >> 2) + 0));
1355             break;
1356           }
1357         }
1358         return;
1359       }
1360       case 13: {
1361         const auto index = buffer_ & 8191;
1362         const auto op = GetOp22(index);
1363         switch (op & 3) {
1364           case 0: {
1365             ok_ = false;
1366             break;
1367           }
1368           case 1: {
1369             sink_(GetEmit22(index, (op >> 2) + 0));
1370             sink_(GetEmit22(index, (op >> 2) + 1));
1371             break;
1372           }
1373           case 2: {
1374             sink_(GetEmit22(index, (op >> 2) + 0));
1375             break;
1376           }
1377         }
1378         return;
1379       }
1380       case 14: {
1381         const auto index = buffer_ & 16383;
1382         const auto op = GetOp23(index);
1383         switch (op & 7) {
1384           case 0: {
1385             sink_(GetEmit23(index, (op >> 3) + 0));
1386             sink_(GetEmit23(index, (op >> 3) + 1));
1387             sink_(GetEmit23(index, (op >> 3) + 2));
1388             break;
1389           }
1390           case 1: {
1391             ok_ = false;
1392             break;
1393           }
1394           case 2: {
1395             sink_(GetEmit23(index, (op >> 3) + 0));
1396             sink_(GetEmit23(index, (op >> 3) + 1));
1397             break;
1398           }
1399           case 3: {
1400             sink_(GetEmit23(index, (op >> 3) + 0));
1401             break;
1402           }
1403         }
1404         return;
1405       }
1406       case 0: {
1407         return;
1408       }
1409     }
1410   }
1411   F sink_;
1412   const uint8_t* begin_;
1413   const uint8_t* const end_;
1414   uint64_t buffer_ = 0;
1415   int buffer_len_ = 0;
1416   bool ok_ = true;
1417   bool done_ = false;
1418 };
1419 }  // namespace geometry_8_7_15
1420 }  // namespace grpc_core
1421 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_7_15_H
1422