xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_11_5_14.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // This file is autogenerated: see
16 // tools/codegen/core/gen_huffman_decompressor.cc
17 
18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_5_14_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_5_14_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_11_5_14 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp1(size_t i)60   static inline uint64_t GetOp1(size_t i) {
61     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit1(size_t i,size_t emit)63   static inline uint64_t GetEmit1(size_t i, size_t emit) {
64     return table1_emit_[i >> 6][emit];
65   }
GetOp8(size_t i)66   static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return emit ? 62 : 35;
69   }
GetOp9(size_t i)70   static inline uint64_t GetOp9(size_t i) {
71     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
72   }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) {
74     return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64));
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) {
77     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
78   }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return table12_0_inner_[table12_0_outer_[i]];
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94));
87   }
GetOp13(size_t i)88   static inline uint64_t GetOp13(size_t i) {
89     return table13_0_inner_[table13_0_outer_[i]];
90   }
GetEmit13(size_t,size_t emit)91   static inline uint64_t GetEmit13(size_t, size_t emit) {
92     return table13_0_emit_[emit];
93   }
GetOp10(size_t i)94   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)95   static inline uint64_t GetEmit10(size_t, size_t emit) {
96     return table13_0_emit_[emit];
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) {
99     return ((i < 3 ? (i) : (((void)(i - 3), 3))) < 2
100                 ? ((i < 3 ? (i) : (((void)(i - 3), 3))) ? 2 : 0)
101                 : (((i < 3 ? (i) : (((void)(i - 3), 3))) - 2) ? 1 : 4));
102   }
GetEmit15(size_t,size_t emit)103   static inline uint64_t GetEmit15(size_t, size_t emit) {
104     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
105   }
GetOp16(size_t i)106   static inline uint64_t GetOp16(size_t i) {
107     return table16_0_inner_[table16_0_outer_[i]];
108   }
GetEmit16(size_t,size_t emit)109   static inline uint64_t GetEmit16(size_t, size_t emit) {
110     return table16_0_emit_[emit];
111   }
GetOp14(size_t i)112   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)113   static inline uint64_t GetEmit14(size_t, size_t emit) {
114     return table14_0_emit_[emit];
115   }
GetOp18(size_t i)116   static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; }
GetEmit18(size_t,size_t emit)117   static inline uint64_t GetEmit18(size_t, size_t emit) {
118     return table18_0_emit_[emit];
119   }
GetOp19(size_t i)120   static inline uint64_t GetOp19(size_t i) { return table19_0_ops_[i]; }
GetEmit19(size_t,size_t emit)121   static inline uint64_t GetEmit19(size_t, size_t emit) {
122     return table19_0_emit_[emit];
123   }
GetOp20(size_t i)124   static inline uint64_t GetOp20(size_t i) { return table20_0_ops_[i]; }
GetEmit20(size_t,size_t emit)125   static inline uint64_t GetEmit20(size_t, size_t emit) {
126     return table20_0_emit_[emit];
127   }
GetOp21(size_t i)128   static inline uint64_t GetOp21(size_t i) {
129     return table21_ops_[i >> 7][i & 0x7f];
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 >> 7][emit];
133   }
GetOp22(size_t i)134   static inline uint64_t GetOp22(size_t i) {
135     return table22_ops_[i >> 8][i & 0xff];
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 >> 8][emit];
139   }
GetOp23(size_t i)140   static inline uint64_t GetOp23(size_t i) {
141     return table23_ops_[i >> 6][i & 0x3f];
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 >> 6][emit];
145   }
GetOp24(size_t i)146   static inline uint64_t GetOp24(size_t i) {
147     return table24_ops_[i >> 6][i & 0x3f];
148   }
GetEmit24(size_t i,size_t emit)149   static inline uint64_t GetEmit24(size_t i, size_t emit) {
150     return table24_emit_[i >> 6][emit];
151   }
GetOp25(size_t i)152   static inline uint64_t GetOp25(size_t i) {
153     return table25_ops_[i >> 7][i & 0x7f];
154   }
GetEmit25(size_t i,size_t emit)155   static inline uint64_t GetEmit25(size_t i, size_t emit) {
156     return table25_emit_[i >> 7][emit];
157   }
GetOp26(size_t i)158   static inline uint64_t GetOp26(size_t i) {
159     return table26_ops_[i >> 7][i & 0x7f];
160   }
GetEmit26(size_t i,size_t emit)161   static inline uint64_t GetEmit26(size_t i, size_t emit) {
162     return table26_emit_[i >> 7][emit];
163   }
GetOp17(size_t i)164   static inline uint64_t GetOp17(size_t i) {
165     return table17_ops_[i >> 8][i & 0xff];
166   }
GetEmit17(size_t i,size_t emit)167   static inline uint64_t GetEmit17(size_t i, size_t emit) {
168     return table17_emit_[i >> 8][emit];
169   }
170 
171  private:
172   static const uint8_t table2_0_emit_[10];
173   static const uint8_t table2_0_ops_[32];
174   static const uint8_t table3_0_emit_[36];
175   static const uint8_t table3_0_ops_[64];
176   static const uint8_t table4_0_emit_[22];
177   static const uint8_t table4_0_ops_[64];
178   static const uint8_t table4_1_emit_[46];
179   static const uint8_t table4_1_ops_[64];
180   static const uint8_t* const table4_emit_[2];
181   static const uint8_t* const table4_ops_[2];
182   static const uint8_t table5_0_ops_[128];
183   static const uint8_t table5_1_emit_[52];
184   static const uint8_t table5_1_ops_[128];
185   static const uint8_t* const table5_emit_[2];
186   static const uint8_t* const table5_ops_[2];
187   static const uint8_t table6_0_emit_[2];
188   static const uint8_t table6_0_ops_[32];
189   static const uint8_t table6_1_emit_[2];
190   static const uint8_t table6_2_emit_[2];
191   static const uint8_t table6_3_emit_[2];
192   static const uint8_t table6_4_emit_[2];
193   static const uint8_t table6_5_emit_[4];
194   static const uint8_t table6_5_ops_[32];
195   static const uint8_t table6_6_emit_[4];
196   static const uint8_t table6_7_emit_[4];
197   static const uint8_t table6_8_emit_[4];
198   static const uint8_t table6_9_emit_[4];
199   static const uint8_t table6_10_emit_[4];
200   static const uint8_t table6_11_emit_[6];
201   static const uint8_t table6_11_ops_[32];
202   static const uint8_t table6_12_emit_[8];
203   static const uint8_t table6_12_ops_[32];
204   static const uint8_t table6_13_emit_[8];
205   static const uint8_t table6_14_emit_[8];
206   static const uint8_t table6_15_emit_[10];
207   static const uint8_t table6_15_ops_[32];
208   static const uint8_t* const table6_emit_[16];
209   static const uint8_t* const table6_ops_[16];
210   static const uint8_t table7_0_emit_[36];
211   static const uint8_t table7_0_ops_[64];
212   static const uint8_t table7_1_emit_[36];
213   static const uint8_t table7_1_ops_[64];
214   static const uint8_t table7_2_emit_[36];
215   static const uint8_t table7_2_ops_[64];
216   static const uint8_t table7_3_emit_[36];
217   static const uint8_t table7_3_ops_[64];
218   static const uint8_t table7_4_emit_[38];
219   static const uint8_t table7_4_ops_[64];
220   static const uint8_t table7_5_ops_[64];
221   static const uint8_t table7_11_ops_[64];
222   static const uint8_t table7_12_ops_[64];
223   static const uint8_t table7_15_emit_[15];
224   static const uint8_t table7_15_ops_[64];
225   static const uint8_t* const table7_emit_[16];
226   static const uint8_t* const table7_ops_[16];
227   static const uint8_t table1_0_emit_[71];
228   static const uint16_t table1_0_inner_[37];
229   static const uint8_t table1_0_outer_[64];
230   static const uint8_t table1_1_emit_[71];
231   static const uint16_t table1_1_inner_[37];
232   static const uint8_t table1_2_emit_[71];
233   static const uint16_t table1_2_inner_[37];
234   static const uint8_t table1_3_emit_[71];
235   static const uint16_t table1_3_inner_[37];
236   static const uint8_t table1_4_emit_[71];
237   static const uint16_t table1_4_inner_[37];
238   static const uint8_t table1_5_emit_[71];
239   static const uint16_t table1_5_inner_[37];
240   static const uint8_t table1_6_emit_[71];
241   static const uint16_t table1_6_inner_[37];
242   static const uint8_t table1_7_emit_[71];
243   static const uint16_t table1_7_inner_[37];
244   static const uint8_t table1_8_emit_[71];
245   static const uint16_t table1_8_inner_[37];
246   static const uint8_t table1_9_emit_[71];
247   static const uint16_t table1_9_inner_[37];
248   static const uint8_t table1_10_emit_[40];
249   static const uint16_t table1_10_inner_[22];
250   static const uint8_t table1_10_outer_[64];
251   static const uint8_t table1_11_emit_[40];
252   static const uint8_t table1_12_emit_[40];
253   static const uint8_t table1_13_emit_[40];
254   static const uint8_t table1_14_emit_[40];
255   static const uint8_t table1_15_emit_[40];
256   static const uint8_t table1_16_emit_[40];
257   static const uint8_t table1_17_emit_[40];
258   static const uint8_t table1_18_emit_[40];
259   static const uint8_t table1_19_emit_[40];
260   static const uint8_t table1_20_emit_[40];
261   static const uint8_t table1_21_emit_[40];
262   static const uint8_t table1_22_emit_[40];
263   static const uint8_t table1_23_emit_[4];
264   static const uint16_t table1_23_inner_[4];
265   static const uint8_t table1_23_outer_[64];
266   static const uint8_t table1_24_emit_[4];
267   static const uint8_t table1_25_emit_[4];
268   static const uint8_t table1_26_emit_[4];
269   static const uint8_t table1_27_emit_[4];
270   static const uint8_t table1_28_emit_[4];
271   static const uint8_t table1_29_emit_[4];
272   static const uint8_t table1_30_emit_[4];
273   static const uint8_t table1_31_emit_[14];
274   static const uint16_t table1_31_inner_[17];
275   static const uint8_t table1_31_outer_[64];
276   static const uint8_t* const table1_emit_[32];
277   static const uint16_t* const table1_inner_[32];
278   static const uint8_t* const table1_outer_[32];
279   static const uint8_t table12_0_inner_[6];
280   static const uint8_t table12_0_outer_[8];
281   static const uint8_t table13_0_emit_[7];
282   static const uint8_t table13_0_inner_[9];
283   static const uint8_t table13_0_outer_[16];
284   static const uint8_t table10_0_ops_[32];
285   static const uint8_t table16_0_emit_[11];
286   static const uint8_t table16_0_inner_[12];
287   static const uint8_t table16_0_outer_[16];
288   static const uint8_t table14_0_emit_[15];
289   static const uint8_t table14_0_ops_[32];
290   static const uint8_t table18_0_emit_[9];
291   static const uint8_t table18_0_ops_[32];
292   static const uint8_t table19_0_emit_[35];
293   static const uint8_t table19_0_ops_[64];
294   static const uint8_t table20_0_emit_[64];
295   static const uint8_t table20_0_ops_[128];
296   static const uint8_t table21_0_emit_[23];
297   static const uint8_t table21_0_ops_[128];
298   static const uint8_t table21_1_emit_[53];
299   static const uint8_t table21_1_ops_[128];
300   static const uint8_t* const table21_emit_[2];
301   static const uint8_t* const table21_ops_[2];
302   static const uint8_t table22_0_ops_[256];
303   static const uint8_t table22_1_emit_[57];
304   static const uint8_t table22_1_ops_[256];
305   static const uint8_t* const table22_emit_[2];
306   static const uint8_t* const table22_ops_[2];
307   static const uint8_t table23_0_emit_[40];
308   static const uint8_t table23_0_ops_[64];
309   static const uint8_t table23_1_emit_[40];
310   static const uint8_t table23_2_emit_[40];
311   static const uint8_t table23_3_emit_[40];
312   static const uint8_t table23_4_emit_[22];
313   static const uint8_t table23_4_ops_[64];
314   static const uint8_t table23_5_emit_[4];
315   static const uint8_t table23_6_emit_[4];
316   static const uint8_t table23_7_emit_[4];
317   static const uint8_t table23_8_emit_[4];
318   static const uint8_t table23_9_emit_[4];
319   static const uint8_t table23_10_emit_[4];
320   static const uint8_t table23_11_emit_[8];
321   static const uint8_t table23_12_emit_[8];
322   static const uint8_t table23_13_emit_[8];
323   static const uint8_t table23_14_emit_[11];
324   static const uint8_t table23_14_ops_[64];
325   static const uint8_t table23_15_emit_[25];
326   static const uint8_t table23_15_ops_[64];
327   static const uint8_t* const table23_emit_[16];
328   static const uint8_t* const table23_ops_[16];
329   static const uint8_t table24_0_emit_[72];
330   static const uint16_t table24_0_ops_[64];
331   static const uint8_t table24_1_emit_[72];
332   static const uint8_t table24_2_emit_[72];
333   static const uint8_t table24_3_emit_[72];
334   static const uint8_t table24_4_emit_[72];
335   static const uint8_t table24_5_emit_[72];
336   static const uint8_t table24_6_emit_[72];
337   static const uint8_t table24_7_emit_[72];
338   static const uint8_t table24_8_emit_[72];
339   static const uint8_t table24_9_emit_[40];
340   static const uint16_t table24_9_ops_[64];
341   static const uint8_t table24_10_emit_[40];
342   static const uint8_t table24_11_emit_[40];
343   static const uint8_t table24_12_emit_[40];
344   static const uint8_t table24_13_emit_[40];
345   static const uint8_t table24_14_emit_[40];
346   static const uint8_t table24_15_emit_[40];
347   static const uint8_t table24_16_emit_[40];
348   static const uint8_t table24_17_emit_[40];
349   static const uint8_t table24_18_emit_[40];
350   static const uint8_t table24_19_emit_[40];
351   static const uint8_t table24_20_emit_[40];
352   static const uint8_t table24_21_emit_[40];
353   static const uint8_t table24_22_emit_[4];
354   static const uint16_t table24_22_ops_[64];
355   static const uint8_t table24_23_emit_[4];
356   static const uint8_t table24_24_emit_[4];
357   static const uint8_t table24_25_emit_[4];
358   static const uint8_t table24_26_emit_[4];
359   static const uint8_t table24_27_emit_[4];
360   static const uint8_t table24_28_emit_[4];
361   static const uint8_t table24_29_emit_[7];
362   static const uint16_t table24_29_ops_[64];
363   static const uint8_t table24_30_emit_[10];
364   static const uint16_t table24_30_ops_[64];
365   static const uint8_t table24_31_emit_[34];
366   static const uint16_t table24_31_ops_[64];
367   static const uint8_t* const table24_emit_[32];
368   static const uint16_t* const table24_ops_[32];
369   static const uint8_t table25_0_emit_[136];
370   static const uint16_t table25_0_ops_[128];
371   static const uint8_t table25_1_emit_[136];
372   static const uint8_t table25_2_emit_[136];
373   static const uint8_t table25_3_emit_[136];
374   static const uint8_t table25_4_emit_[136];
375   static const uint8_t table25_5_emit_[136];
376   static const uint8_t table25_6_emit_[136];
377   static const uint8_t table25_7_emit_[136];
378   static const uint8_t table25_8_emit_[136];
379   static const uint8_t table25_9_emit_[144];
380   static const uint16_t table25_9_ops_[128];
381   static const uint8_t table25_10_emit_[144];
382   static const uint8_t table25_11_emit_[144];
383   static const uint8_t table25_12_emit_[144];
384   static const uint8_t table25_13_emit_[144];
385   static const uint8_t table25_14_emit_[144];
386   static const uint8_t table25_15_emit_[144];
387   static const uint8_t table25_16_emit_[144];
388   static const uint8_t table25_17_emit_[144];
389   static const uint8_t table25_18_emit_[144];
390   static const uint8_t table25_19_emit_[144];
391   static const uint8_t table25_20_emit_[144];
392   static const uint8_t table25_21_emit_[144];
393   static const uint8_t table25_22_emit_[80];
394   static const uint16_t table25_22_ops_[128];
395   static const uint8_t table25_23_emit_[80];
396   static const uint8_t table25_24_emit_[80];
397   static const uint8_t table25_25_emit_[80];
398   static const uint8_t table25_26_emit_[80];
399   static const uint8_t table25_27_emit_[80];
400   static const uint8_t table25_28_emit_[80];
401   static const uint8_t table25_29_emit_[26];
402   static const uint16_t table25_29_ops_[128];
403   static const uint16_t table25_30_ops_[128];
404   static const uint8_t table25_31_emit_[63];
405   static const uint16_t table25_31_ops_[128];
406   static const uint8_t* const table25_emit_[32];
407   static const uint16_t* const table25_ops_[32];
408   static const uint8_t table26_0_emit_[44];
409   static const uint16_t table26_0_ops_[128];
410   static const uint8_t table26_1_emit_[104];
411   static const uint16_t table26_1_ops_[128];
412   static const uint8_t table26_2_emit_[44];
413   static const uint8_t table26_3_emit_[104];
414   static const uint8_t table26_4_emit_[44];
415   static const uint8_t table26_5_emit_[104];
416   static const uint8_t table26_6_emit_[44];
417   static const uint8_t table26_7_emit_[104];
418   static const uint8_t table26_8_emit_[44];
419   static const uint8_t table26_9_emit_[104];
420   static const uint8_t table26_10_emit_[44];
421   static const uint8_t table26_11_emit_[104];
422   static const uint8_t table26_12_emit_[44];
423   static const uint8_t table26_13_emit_[104];
424   static const uint8_t table26_14_emit_[44];
425   static const uint8_t table26_15_emit_[104];
426   static const uint8_t table26_16_emit_[44];
427   static const uint8_t table26_17_emit_[104];
428   static const uint8_t table26_18_emit_[136];
429   static const uint8_t table26_19_emit_[136];
430   static const uint8_t table26_20_emit_[136];
431   static const uint8_t table26_21_emit_[136];
432   static const uint8_t table26_22_emit_[136];
433   static const uint8_t table26_23_emit_[136];
434   static const uint8_t table26_24_emit_[136];
435   static const uint8_t table26_25_emit_[136];
436   static const uint8_t table26_26_emit_[136];
437   static const uint8_t table26_27_emit_[136];
438   static const uint8_t table26_28_emit_[136];
439   static const uint8_t table26_29_emit_[136];
440   static const uint8_t table26_30_emit_[136];
441   static const uint8_t table26_31_emit_[136];
442   static const uint8_t table26_32_emit_[136];
443   static const uint8_t table26_33_emit_[136];
444   static const uint8_t table26_34_emit_[136];
445   static const uint8_t table26_35_emit_[136];
446   static const uint8_t table26_36_emit_[136];
447   static const uint8_t table26_37_emit_[136];
448   static const uint8_t table26_38_emit_[136];
449   static const uint8_t table26_39_emit_[136];
450   static const uint8_t table26_40_emit_[136];
451   static const uint8_t table26_41_emit_[136];
452   static const uint8_t table26_42_emit_[136];
453   static const uint8_t table26_43_emit_[136];
454   static const uint8_t table26_44_emit_[144];
455   static const uint8_t table26_45_emit_[144];
456   static const uint8_t table26_46_emit_[144];
457   static const uint8_t table26_47_emit_[144];
458   static const uint8_t table26_48_emit_[144];
459   static const uint8_t table26_49_emit_[144];
460   static const uint8_t table26_50_emit_[144];
461   static const uint8_t table26_51_emit_[144];
462   static const uint8_t table26_52_emit_[144];
463   static const uint8_t table26_53_emit_[144];
464   static const uint8_t table26_54_emit_[144];
465   static const uint8_t table26_55_emit_[144];
466   static const uint8_t table26_56_emit_[144];
467   static const uint8_t table26_57_emit_[144];
468   static const uint8_t table26_58_emit_[112];
469   static const uint16_t table26_58_ops_[128];
470   static const uint8_t table26_59_emit_[80];
471   static const uint8_t table26_60_emit_[80];
472   static const uint8_t table26_61_emit_[44];
473   static const uint16_t table26_61_ops_[128];
474   static const uint8_t table26_62_emit_[17];
475   static const uint16_t table26_62_ops_[128];
476   static const uint8_t table26_63_emit_[46];
477   static const uint16_t table26_63_ops_[128];
478   static const uint8_t* const table26_emit_[64];
479   static const uint16_t* const table26_ops_[64];
480   static const uint8_t table17_0_emit_[1];
481   static const uint16_t table17_0_ops_[256];
482   static const uint8_t table17_2_emit_[1];
483   static const uint8_t table17_4_emit_[1];
484   static const uint8_t table17_6_emit_[1];
485   static const uint8_t table17_8_emit_[1];
486   static const uint8_t table17_10_emit_[1];
487   static const uint8_t table17_12_emit_[1];
488   static const uint8_t table17_14_emit_[1];
489   static const uint8_t table17_16_emit_[1];
490   static const uint8_t table17_18_emit_[1];
491   static const uint16_t table17_18_ops_[256];
492   static const uint8_t table17_19_emit_[1];
493   static const uint8_t table17_20_emit_[1];
494   static const uint8_t table17_21_emit_[1];
495   static const uint8_t table17_22_emit_[1];
496   static const uint8_t table17_23_emit_[1];
497   static const uint8_t table17_24_emit_[1];
498   static const uint8_t table17_25_emit_[1];
499   static const uint8_t table17_26_emit_[1];
500   static const uint8_t table17_27_emit_[1];
501   static const uint8_t table17_28_emit_[1];
502   static const uint8_t table17_29_emit_[1];
503   static const uint8_t table17_30_emit_[1];
504   static const uint8_t table17_31_emit_[1];
505   static const uint8_t table17_32_emit_[1];
506   static const uint8_t table17_33_emit_[1];
507   static const uint8_t table17_34_emit_[1];
508   static const uint8_t table17_35_emit_[1];
509   static const uint8_t table17_36_emit_[1];
510   static const uint8_t table17_37_emit_[1];
511   static const uint8_t table17_38_emit_[1];
512   static const uint8_t table17_39_emit_[1];
513   static const uint8_t table17_40_emit_[1];
514   static const uint8_t table17_41_emit_[1];
515   static const uint8_t table17_42_emit_[1];
516   static const uint8_t table17_43_emit_[1];
517   static const uint8_t table17_44_emit_[2];
518   static const uint16_t table17_44_ops_[256];
519   static const uint8_t table17_45_emit_[2];
520   static const uint8_t table17_46_emit_[2];
521   static const uint8_t table17_47_emit_[2];
522   static const uint8_t table17_48_emit_[2];
523   static const uint8_t table17_49_emit_[2];
524   static const uint8_t table17_50_emit_[2];
525   static const uint8_t table17_51_emit_[2];
526   static const uint8_t table17_52_emit_[2];
527   static const uint8_t table17_53_emit_[2];
528   static const uint8_t table17_54_emit_[2];
529   static const uint8_t table17_55_emit_[2];
530   static const uint8_t table17_56_emit_[2];
531   static const uint8_t table17_57_emit_[2];
532   static const uint8_t table17_58_emit_[3];
533   static const uint16_t table17_58_ops_[256];
534   static const uint8_t table17_59_emit_[4];
535   static const uint16_t table17_59_ops_[256];
536   static const uint8_t table17_60_emit_[4];
537   static const uint8_t table17_61_emit_[6];
538   static const uint16_t table17_61_ops_[256];
539   static const uint16_t table17_62_ops_[256];
540   static const uint8_t table17_63_emit_[49];
541   static const uint16_t table17_63_ops_[256];
542   static const uint8_t* const table17_emit_[64];
543   static const uint16_t* const table17_ops_[64];
544 };
545 template <typename F>
546 class HuffDecoder : public HuffDecoderCommon {
547  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)548   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
549       : sink_(sink), begin_(begin), end_(end) {}
Run()550   bool Run() {
551     while (!done_) {
552       if (!RefillTo11()) {
553         Done0();
554         break;
555       }
556       const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
557       const auto op = GetOp1(index);
558       const int consumed = op & 15;
559       buffer_len_ -= consumed;
560       const auto emit_ofs = op >> 7;
561       switch ((op >> 4) & 7) {
562         case 0: {
563           sink_(GetEmit1(index, emit_ofs + 0));
564           sink_(GetEmit1(index, emit_ofs + 1));
565           break;
566         }
567         case 1: {
568           sink_(GetEmit1(index, emit_ofs + 0));
569           break;
570         }
571         case 2: {
572           DecodeStep0();
573           break;
574         }
575         case 3: {
576           DecodeStep1();
577           break;
578         }
579         case 4: {
580           DecodeStep2();
581           break;
582         }
583       }
584     }
585     return ok_;
586   }
587 
588  private:
RefillTo11()589   bool RefillTo11() {
590     switch (buffer_len_) {
591       case 0: {
592         return Read2to8Bytes();
593       }
594       case 1:
595       case 2: {
596         return Read2to7Bytes();
597       }
598       case 3:
599       case 4:
600       case 5:
601       case 6:
602       case 7:
603       case 8: {
604         return Read1to7Bytes();
605       }
606       case 9:
607       case 10: {
608         return Read1to6Bytes();
609       }
610     }
611     return true;
612   }
Read2to8Bytes()613   bool Read2to8Bytes() {
614     switch (end_ - begin_) {
615       case 0:
616       case 1: {
617         return false;
618       }
619       case 2: {
620         Fill2();
621         return true;
622       }
623       case 3: {
624         Fill3();
625         return true;
626       }
627       case 4: {
628         Fill4();
629         return true;
630       }
631       case 5: {
632         Fill5();
633         return true;
634       }
635       case 6: {
636         Fill6();
637         return true;
638       }
639       case 7: {
640         Fill7();
641         return true;
642       }
643       default: {
644         Fill8();
645         return true;
646       }
647     }
648   }
Fill2()649   void Fill2() {
650     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
651               (static_cast<uint64_t>(begin_[1]) << 0);
652     begin_ += 2;
653     buffer_len_ += 16;
654   }
Fill3()655   void Fill3() {
656     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
657               (static_cast<uint64_t>(begin_[1]) << 8) |
658               (static_cast<uint64_t>(begin_[2]) << 0);
659     begin_ += 3;
660     buffer_len_ += 24;
661   }
Fill4()662   void Fill4() {
663     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
664               (static_cast<uint64_t>(begin_[1]) << 16) |
665               (static_cast<uint64_t>(begin_[2]) << 8) |
666               (static_cast<uint64_t>(begin_[3]) << 0);
667     begin_ += 4;
668     buffer_len_ += 32;
669   }
Fill5()670   void Fill5() {
671     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
672               (static_cast<uint64_t>(begin_[1]) << 24) |
673               (static_cast<uint64_t>(begin_[2]) << 16) |
674               (static_cast<uint64_t>(begin_[3]) << 8) |
675               (static_cast<uint64_t>(begin_[4]) << 0);
676     begin_ += 5;
677     buffer_len_ += 40;
678   }
Fill6()679   void Fill6() {
680     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
681               (static_cast<uint64_t>(begin_[1]) << 32) |
682               (static_cast<uint64_t>(begin_[2]) << 24) |
683               (static_cast<uint64_t>(begin_[3]) << 16) |
684               (static_cast<uint64_t>(begin_[4]) << 8) |
685               (static_cast<uint64_t>(begin_[5]) << 0);
686     begin_ += 6;
687     buffer_len_ += 48;
688   }
Fill7()689   void Fill7() {
690     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
691               (static_cast<uint64_t>(begin_[1]) << 40) |
692               (static_cast<uint64_t>(begin_[2]) << 32) |
693               (static_cast<uint64_t>(begin_[3]) << 24) |
694               (static_cast<uint64_t>(begin_[4]) << 16) |
695               (static_cast<uint64_t>(begin_[5]) << 8) |
696               (static_cast<uint64_t>(begin_[6]) << 0);
697     begin_ += 7;
698     buffer_len_ += 56;
699   }
Fill8()700   void Fill8() {
701     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
702               (static_cast<uint64_t>(begin_[1]) << 48) |
703               (static_cast<uint64_t>(begin_[2]) << 40) |
704               (static_cast<uint64_t>(begin_[3]) << 32) |
705               (static_cast<uint64_t>(begin_[4]) << 24) |
706               (static_cast<uint64_t>(begin_[5]) << 16) |
707               (static_cast<uint64_t>(begin_[6]) << 8) |
708               (static_cast<uint64_t>(begin_[7]) << 0);
709     begin_ += 8;
710     buffer_len_ += 64;
711   }
Read2to7Bytes()712   bool Read2to7Bytes() {
713     switch (end_ - begin_) {
714       case 0:
715       case 1: {
716         return false;
717       }
718       case 2: {
719         Fill2();
720         return true;
721       }
722       case 3: {
723         Fill3();
724         return true;
725       }
726       case 4: {
727         Fill4();
728         return true;
729       }
730       case 5: {
731         Fill5();
732         return true;
733       }
734       case 6: {
735         Fill6();
736         return true;
737       }
738       default: {
739         Fill7();
740         return true;
741       }
742     }
743   }
Read1to7Bytes()744   bool Read1to7Bytes() {
745     switch (end_ - begin_) {
746       case 0: {
747         return false;
748       }
749       case 1: {
750         Fill1();
751         return true;
752       }
753       case 2: {
754         Fill2();
755         return true;
756       }
757       case 3: {
758         Fill3();
759         return true;
760       }
761       case 4: {
762         Fill4();
763         return true;
764       }
765       case 5: {
766         Fill5();
767         return true;
768       }
769       case 6: {
770         Fill6();
771         return true;
772       }
773       default: {
774         Fill7();
775         return true;
776       }
777     }
778   }
Fill1()779   void Fill1() {
780     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
781     begin_ += 1;
782     buffer_len_ += 8;
783   }
Read1to6Bytes()784   bool Read1to6Bytes() {
785     switch (end_ - begin_) {
786       case 0: {
787         return false;
788       }
789       case 1: {
790         Fill1();
791         return true;
792       }
793       case 2: {
794         Fill2();
795         return true;
796       }
797       case 3: {
798         Fill3();
799         return true;
800       }
801       case 4: {
802         Fill4();
803         return true;
804       }
805       case 5: {
806         Fill5();
807         return true;
808       }
809       default: {
810         Fill6();
811         return true;
812       }
813     }
814   }
Done0()815   void Done0() {
816     done_ = true;
817     switch (end_ - begin_) {
818       case 1: {
819         Fill1();
820         break;
821       }
822     }
823     switch (buffer_len_) {
824       case 1:
825       case 2:
826       case 3:
827       case 4: {
828         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
829         return;
830       }
831       case 5: {
832         const auto index = buffer_ & 31;
833         const auto op = GetOp2(index);
834         switch (op & 3) {
835           case 0: {
836             sink_(GetEmit2(index, (op >> 2) + 0));
837             break;
838           }
839           case 1: {
840             ok_ = false;
841             break;
842           }
843         }
844         return;
845       }
846       case 6: {
847         const auto index = buffer_ & 63;
848         const auto op = GetOp3(index);
849         switch (op & 3) {
850           case 0: {
851             ok_ = false;
852             break;
853           }
854           case 1: {
855             sink_(GetEmit3(index, (op >> 2) + 0));
856             break;
857           }
858         }
859         return;
860       }
861       case 7: {
862         const auto index = buffer_ & 127;
863         const auto op = GetOp4(index);
864         switch (op & 3) {
865           case 0: {
866             ok_ = false;
867             break;
868           }
869           case 1: {
870             sink_(GetEmit4(index, (op >> 2) + 0));
871             break;
872           }
873         }
874         return;
875       }
876       case 8: {
877         const auto index = buffer_ & 255;
878         const auto op = GetOp5(index);
879         switch (op & 3) {
880           case 0: {
881             ok_ = false;
882             break;
883           }
884           case 1: {
885             sink_(GetEmit5(index, (op >> 2) + 0));
886             break;
887           }
888         }
889         return;
890       }
891       case 9: {
892         const auto index = buffer_ & 511;
893         const auto op = GetOp6(index);
894         switch (op & 3) {
895           case 0: {
896             ok_ = false;
897             break;
898           }
899           case 1: {
900             sink_(GetEmit6(index, (op >> 2) + 0));
901             break;
902           }
903         }
904         return;
905       }
906       case 10: {
907         const auto index = buffer_ & 1023;
908         const auto op = GetOp7(index);
909         switch (op & 3) {
910           case 0: {
911             sink_(GetEmit7(index, (op >> 2) + 0));
912             sink_(GetEmit7(index, (op >> 2) + 1));
913             break;
914           }
915           case 1: {
916             ok_ = false;
917             break;
918           }
919           case 2: {
920             sink_(GetEmit7(index, (op >> 2) + 0));
921             break;
922           }
923         }
924         return;
925       }
926       case 0: {
927         return;
928       }
929     }
930   }
DecodeStep0()931   void DecodeStep0() {
932     if (!RefillTo1()) {
933       Done1();
934       return;
935     }
936     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
937     const auto op = GetOp8(index);
938     const int consumed = op & 1;
939     buffer_len_ -= consumed;
940     const auto emit_ofs = op >> 1;
941     sink_(GetEmit8(index, emit_ofs + 0));
942   }
RefillTo1()943   bool RefillTo1() {
944     switch (buffer_len_) {
945       case 0: {
946         return Read1to8Bytes();
947       }
948     }
949     return true;
950   }
Read1to8Bytes()951   bool Read1to8Bytes() {
952     switch (end_ - begin_) {
953       case 0: {
954         return false;
955       }
956       case 1: {
957         Fill1();
958         return true;
959       }
960       case 2: {
961         Fill2();
962         return true;
963       }
964       case 3: {
965         Fill3();
966         return true;
967       }
968       case 4: {
969         Fill4();
970         return true;
971       }
972       case 5: {
973         Fill5();
974         return true;
975       }
976       case 6: {
977         Fill6();
978         return true;
979       }
980       case 7: {
981         Fill7();
982         return true;
983       }
984       default: {
985         Fill8();
986         return true;
987       }
988     }
989   }
Done1()990   void Done1() {
991     done_ = true;
992     ok_ = false;
993   }
DecodeStep1()994   void DecodeStep1() {
995     if (!RefillTo2()) {
996       Done2();
997       return;
998     }
999     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1000     const auto op = GetOp9(index);
1001     const int consumed = op & 3;
1002     buffer_len_ -= consumed;
1003     const auto emit_ofs = op >> 2;
1004     sink_(GetEmit9(index, emit_ofs + 0));
1005   }
RefillTo2()1006   bool RefillTo2() {
1007     switch (buffer_len_) {
1008       case 0: {
1009         return Read1to8Bytes();
1010       }
1011       case 1: {
1012         return Read1to7Bytes();
1013       }
1014     }
1015     return true;
1016   }
Done2()1017   void Done2() {
1018     done_ = true;
1019     switch (buffer_len_) {
1020       case 1:
1021       case 0: {
1022         ok_ = false;
1023         return;
1024       }
1025     }
1026   }
DecodeStep2()1027   void DecodeStep2() {
1028     if (!RefillTo5()) {
1029       Done3();
1030       return;
1031     }
1032     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1033     const auto op = GetOp10(index);
1034     const int consumed = op & 7;
1035     buffer_len_ -= consumed;
1036     const auto emit_ofs = op >> 5;
1037     switch ((op >> 3) & 3) {
1038       case 0: {
1039         sink_(GetEmit10(index, emit_ofs + 0));
1040         break;
1041       }
1042       case 1: {
1043         DecodeStep3();
1044         break;
1045       }
1046       case 2: {
1047         DecodeStep4();
1048         break;
1049       }
1050     }
1051   }
RefillTo5()1052   bool RefillTo5() {
1053     switch (buffer_len_) {
1054       case 0: {
1055         return Read1to8Bytes();
1056       }
1057       case 1:
1058       case 2:
1059       case 3:
1060       case 4: {
1061         return Read1to7Bytes();
1062       }
1063     }
1064     return true;
1065   }
Done3()1066   void Done3() {
1067     done_ = true;
1068     switch (buffer_len_) {
1069       case 1: {
1070         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1071         return;
1072       }
1073       case 2: {
1074         const auto index = buffer_ & 3;
1075         const auto op = GetOp11(index);
1076         switch (op & 3) {
1077           case 0: {
1078             sink_(GetEmit11(index, (op >> 2) + 0));
1079             break;
1080           }
1081           case 1: {
1082             ok_ = false;
1083             break;
1084           }
1085         }
1086         return;
1087       }
1088       case 3: {
1089         const auto index = buffer_ & 7;
1090         const auto op = GetOp12(index);
1091         switch (op & 3) {
1092           case 0: {
1093             ok_ = false;
1094             break;
1095           }
1096           case 1: {
1097             sink_(GetEmit12(index, (op >> 2) + 0));
1098             break;
1099           }
1100         }
1101         return;
1102       }
1103       case 4: {
1104         const auto index = buffer_ & 15;
1105         const auto op = GetOp13(index);
1106         switch (op & 3) {
1107           case 0: {
1108             ok_ = false;
1109             break;
1110           }
1111           case 1: {
1112             sink_(GetEmit13(index, (op >> 2) + 0));
1113             break;
1114           }
1115         }
1116         return;
1117       }
1118       case 0: {
1119         return;
1120       }
1121     }
1122   }
DecodeStep3()1123   void DecodeStep3() {
1124     if (!RefillTo5()) {
1125       Done4();
1126       return;
1127     }
1128     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1129     const auto op = GetOp14(index);
1130     const int consumed = op & 7;
1131     buffer_len_ -= consumed;
1132     const auto emit_ofs = op >> 3;
1133     sink_(GetEmit14(index, emit_ofs + 0));
1134   }
Done4()1135   void Done4() {
1136     done_ = true;
1137     switch (buffer_len_) {
1138       case 1:
1139       case 2:
1140       case 0: {
1141         ok_ = false;
1142         return;
1143       }
1144       case 3: {
1145         const auto index = buffer_ & 7;
1146         const auto op = GetOp15(index);
1147         switch (op & 1) {
1148           case 0: {
1149             sink_(GetEmit15(index, (op >> 1) + 0));
1150             break;
1151           }
1152           case 1: {
1153             ok_ = false;
1154             break;
1155           }
1156         }
1157         return;
1158       }
1159       case 4: {
1160         const auto index = buffer_ & 15;
1161         const auto op = GetOp16(index);
1162         switch (op & 1) {
1163           case 0: {
1164             ok_ = false;
1165             break;
1166           }
1167           case 1: {
1168             sink_(GetEmit16(index, (op >> 1) + 0));
1169             break;
1170           }
1171         }
1172         return;
1173       }
1174     }
1175   }
DecodeStep4()1176   void DecodeStep4() {
1177     if (!RefillTo14()) {
1178       Done5();
1179       return;
1180     }
1181     const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff;
1182     const auto op = GetOp17(index);
1183     const int consumed = op & 15;
1184     buffer_len_ -= consumed;
1185     const auto emit_ofs = op >> 5;
1186     switch ((op >> 4) & 1) {
1187       case 0: {
1188         sink_(GetEmit17(index, emit_ofs + 0));
1189         break;
1190       }
1191       case 1: {
1192         begin_ = end_;
1193         buffer_len_ = 0;
1194         break;
1195       }
1196     }
1197   }
RefillTo14()1198   bool RefillTo14() {
1199     switch (buffer_len_) {
1200       case 0: {
1201         return Read2to8Bytes();
1202       }
1203       case 1:
1204       case 2:
1205       case 3:
1206       case 4:
1207       case 5: {
1208         return Read2to7Bytes();
1209       }
1210       case 6:
1211       case 7:
1212       case 8: {
1213         return Read1to7Bytes();
1214       }
1215       case 9:
1216       case 10:
1217       case 11:
1218       case 12:
1219       case 13: {
1220         return Read1to6Bytes();
1221       }
1222     }
1223     return true;
1224   }
Done5()1225   void Done5() {
1226     done_ = true;
1227     switch (end_ - begin_) {
1228       case 1: {
1229         Fill1();
1230         break;
1231       }
1232     }
1233     switch (buffer_len_) {
1234       case 1:
1235       case 2:
1236       case 3:
1237       case 4: {
1238         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1239         return;
1240       }
1241       case 5: {
1242         const auto index = buffer_ & 31;
1243         const auto op = GetOp18(index);
1244         switch (op & 3) {
1245           case 0: {
1246             sink_(GetEmit18(index, (op >> 2) + 0));
1247             break;
1248           }
1249           case 1: {
1250             ok_ = false;
1251             break;
1252           }
1253         }
1254         return;
1255       }
1256       case 6: {
1257         const auto index = buffer_ & 63;
1258         const auto op = GetOp19(index);
1259         switch (op & 3) {
1260           case 0: {
1261             ok_ = false;
1262             break;
1263           }
1264           case 1: {
1265             sink_(GetEmit19(index, (op >> 2) + 0));
1266             break;
1267           }
1268         }
1269         return;
1270       }
1271       case 7: {
1272         const auto index = buffer_ & 127;
1273         const auto op = GetOp20(index);
1274         switch (op & 3) {
1275           case 0: {
1276             ok_ = false;
1277             break;
1278           }
1279           case 1: {
1280             sink_(GetEmit20(index, (op >> 2) + 0));
1281             break;
1282           }
1283         }
1284         return;
1285       }
1286       case 8: {
1287         const auto index = buffer_ & 255;
1288         const auto op = GetOp21(index);
1289         switch (op & 3) {
1290           case 0: {
1291             ok_ = false;
1292             break;
1293           }
1294           case 1: {
1295             sink_(GetEmit21(index, (op >> 2) + 0));
1296             break;
1297           }
1298         }
1299         return;
1300       }
1301       case 9: {
1302         const auto index = buffer_ & 511;
1303         const auto op = GetOp22(index);
1304         switch (op & 3) {
1305           case 0: {
1306             ok_ = false;
1307             break;
1308           }
1309           case 1: {
1310             sink_(GetEmit22(index, (op >> 2) + 0));
1311             break;
1312           }
1313         }
1314         return;
1315       }
1316       case 10: {
1317         const auto index = buffer_ & 1023;
1318         const auto op = GetOp23(index);
1319         switch (op & 3) {
1320           case 0: {
1321             sink_(GetEmit23(index, (op >> 2) + 0));
1322             sink_(GetEmit23(index, (op >> 2) + 1));
1323             break;
1324           }
1325           case 1: {
1326             ok_ = false;
1327             break;
1328           }
1329           case 2: {
1330             sink_(GetEmit23(index, (op >> 2) + 0));
1331             break;
1332           }
1333         }
1334         return;
1335       }
1336       case 11: {
1337         const auto index = buffer_ & 2047;
1338         const auto op = GetOp24(index);
1339         switch (op & 3) {
1340           case 0: {
1341             ok_ = false;
1342             break;
1343           }
1344           case 1: {
1345             sink_(GetEmit24(index, (op >> 2) + 0));
1346             sink_(GetEmit24(index, (op >> 2) + 1));
1347             break;
1348           }
1349           case 2: {
1350             sink_(GetEmit24(index, (op >> 2) + 0));
1351             break;
1352           }
1353         }
1354         return;
1355       }
1356       case 12: {
1357         const auto index = buffer_ & 4095;
1358         const auto op = GetOp25(index);
1359         switch (op & 3) {
1360           case 0: {
1361             ok_ = false;
1362             break;
1363           }
1364           case 1: {
1365             sink_(GetEmit25(index, (op >> 2) + 0));
1366             sink_(GetEmit25(index, (op >> 2) + 1));
1367             break;
1368           }
1369           case 2: {
1370             sink_(GetEmit25(index, (op >> 2) + 0));
1371             break;
1372           }
1373         }
1374         return;
1375       }
1376       case 13: {
1377         const auto index = buffer_ & 8191;
1378         const auto op = GetOp26(index);
1379         switch (op & 3) {
1380           case 0: {
1381             ok_ = false;
1382             break;
1383           }
1384           case 1: {
1385             sink_(GetEmit26(index, (op >> 2) + 0));
1386             sink_(GetEmit26(index, (op >> 2) + 1));
1387             break;
1388           }
1389           case 2: {
1390             sink_(GetEmit26(index, (op >> 2) + 0));
1391             break;
1392           }
1393         }
1394         return;
1395       }
1396       case 0: {
1397         return;
1398       }
1399     }
1400   }
1401   F sink_;
1402   const uint8_t* begin_;
1403   const uint8_t* const end_;
1404   uint64_t buffer_ = 0;
1405   int buffer_len_ = 0;
1406   bool ok_ = true;
1407   bool done_ = false;
1408 };
1409 }  // namespace geometry_11_5_14
1410 }  // namespace grpc_core
1411 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_5_14_H
1412