xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_11_8_11.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_8_11_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_8_11_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_11_8_11 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp1(size_t i)60   static inline uint64_t GetOp1(size_t i) {
61     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit1(size_t i,size_t emit)63   static inline uint64_t GetEmit1(size_t i, size_t emit) {
64     return table1_emit_[i >> 6][emit];
65   }
GetOp8(size_t i)66   static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return emit ? 62 : 35;
69   }
GetOp9(size_t i)70   static inline uint64_t GetOp9(size_t i) {
71     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
72   }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) {
74     return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64));
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) {
77     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
78   }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return table12_0_inner_[table12_0_outer_[i]];
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94));
87   }
GetOp13(size_t i)88   static inline uint64_t GetOp13(size_t i) {
89     return table13_0_inner_[table13_0_outer_[i]];
90   }
GetEmit13(size_t,size_t emit)91   static inline uint64_t GetEmit13(size_t, size_t emit) {
92     return table13_0_emit_[emit];
93   }
GetOp14(size_t i)94   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)95   static inline uint64_t GetEmit14(size_t, size_t emit) {
96     return table13_0_emit_[emit];
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)99   static inline uint64_t GetEmit15(size_t, size_t emit) {
100     return table13_0_emit_[emit];
101   }
GetOp16(size_t i)102   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)103   static inline uint64_t GetEmit16(size_t, size_t emit) {
104     return table16_0_emit_[emit];
105   }
GetOp10(size_t i)106   static inline uint64_t GetOp10(size_t i) {
107     return table10_ops_[i >> 5][i & 0x1f];
108   }
GetEmit10(size_t i,size_t emit)109   static inline uint64_t GetEmit10(size_t i, size_t emit) {
110     return table10_emit_[i >> 5][emit];
111   }
GetOp17(size_t i)112   static inline uint64_t GetOp17(size_t i) { return i ? 3 : 1; }
GetEmit17(size_t,size_t emit)113   static inline uint64_t GetEmit17(size_t, size_t emit) {
114     return emit ? 130 : 128;
115   }
GetOp18(size_t i)116   static inline uint64_t GetOp18(size_t i) { return i ? 3 : 1; }
GetEmit18(size_t,size_t emit)117   static inline uint64_t GetEmit18(size_t, size_t emit) {
118     return emit ? 162 : 131;
119   }
GetOp19(size_t i)120   static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; }
GetEmit19(size_t,size_t emit)121   static inline uint64_t GetEmit19(size_t, size_t emit) {
122     return emit ? 194 : 184;
123   }
GetOp20(size_t i)124   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)125   static inline uint64_t GetEmit20(size_t, size_t emit) {
126     return emit ? 226 : 224;
127   }
GetOp21(size_t i)128   static inline uint64_t GetOp21(size_t i) {
129     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
130   }
GetEmit21(size_t,size_t emit)131   static inline uint64_t GetEmit21(size_t, size_t emit) {
132     return (emit < 2 ? (emit ? 161 : 153) : ((emit - 2) ? 172 : 167));
133   }
GetOp22(size_t i)134   static inline uint64_t GetOp22(size_t i) {
135     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
136   }
GetEmit22(size_t,size_t emit)137   static inline uint64_t GetEmit22(size_t, size_t emit) {
138     return (emit < 2 ? (emit + 176) : ((emit - 2) ? 209 : 179));
139   }
GetOp23(size_t i)140   static inline uint64_t GetOp23(size_t i) {
141     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
142   }
GetEmit23(size_t,size_t emit)143   static inline uint64_t GetEmit23(size_t, size_t emit) {
144     return (emit < 2 ? (emit + 216) : ((emit - 2) ? 229 : 227));
145   }
GetOp24(size_t i)146   static inline uint64_t GetOp24(size_t i) { return table24_0_inner_[i]; }
GetEmit24(size_t,size_t emit)147   static inline uint64_t GetEmit24(size_t, size_t emit) {
148     return table24_0_emit_[emit];
149   }
GetOp25(size_t i)150   static inline uint64_t GetOp25(size_t i) { return table24_0_inner_[i]; }
GetEmit25(size_t,size_t emit)151   static inline uint64_t GetEmit25(size_t, size_t emit) {
152     return table25_0_emit_[emit];
153   }
GetOp26(size_t i)154   static inline uint64_t GetOp26(size_t i) { return table26_0_inner_[i]; }
GetEmit26(size_t,size_t emit)155   static inline uint64_t GetEmit26(size_t, size_t emit) {
156     return table26_0_emit_[emit];
157   }
GetOp28(size_t i)158   static inline uint64_t GetOp28(size_t i) {
159     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
160   }
GetEmit28(size_t,size_t emit)161   static inline uint64_t GetEmit28(size_t, size_t emit) {
162     return ((void)emit, 230);
163   }
GetOp27(size_t i)164   static inline uint64_t GetOp27(size_t i) {
165     return table27_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
166   }
GetEmit27(size_t,size_t emit)167   static inline uint64_t GetEmit27(size_t, size_t emit) {
168     return table27_0_emit_[emit];
169   }
GetOp30(size_t i)170   static inline uint64_t GetOp30(size_t i) {
171     return table30_0_inner_[(i < 4 ? (i) : (((void)(i - 4), 4)))];
172   }
GetEmit30(size_t,size_t emit)173   static inline uint64_t GetEmit30(size_t, size_t emit) {
174     return (emit < 2 ? (emit ? 228 : 198) : ((emit - 2) + 232));
175   }
GetOp29(size_t i)176   static inline uint64_t GetOp29(size_t i) {
177     return table29_0_inner_[(i < 7 ? (i / 2 + 0) : ((i - 7) + 3))];
178   }
GetEmit29(size_t,size_t emit)179   static inline uint64_t GetEmit29(size_t, size_t emit) {
180     return table29_0_emit_[emit];
181   }
GetOp32(size_t i)182   static inline uint64_t GetOp32(size_t i) {
183     return table32_0_inner_[(i < 5 ? (i) : ((i - 5) / 10 + 5))];
184   }
GetEmit32(size_t,size_t emit)185   static inline uint64_t GetEmit32(size_t, size_t emit) {
186     return table32_0_emit_[emit];
187   }
GetOp33(size_t i)188   static inline uint64_t GetOp33(size_t i) { return table33_0_ops_[i]; }
GetEmit33(size_t,size_t emit)189   static inline uint64_t GetEmit33(size_t, size_t emit) {
190     return table33_0_emit_[emit];
191   }
GetOp34(size_t i)192   static inline uint64_t GetOp34(size_t i) { return table34_0_ops_[i]; }
GetEmit34(size_t,size_t emit)193   static inline uint64_t GetEmit34(size_t, size_t emit) {
194     return table34_0_emit_[emit];
195   }
GetOp35(size_t i)196   static inline uint64_t GetOp35(size_t i) { return table35_0_ops_[i]; }
GetEmit35(size_t,size_t emit)197   static inline uint64_t GetEmit35(size_t, size_t emit) {
198     return table35_0_emit_[emit];
199   }
GetOp36(size_t i)200   static inline uint64_t GetOp36(size_t i) { return table36_0_ops_[i]; }
GetEmit36(size_t,size_t emit)201   static inline uint64_t GetEmit36(size_t, size_t emit) {
202     return table36_0_emit_[emit];
203   }
GetOp37(size_t i)204   static inline uint64_t GetOp37(size_t i) {
205     return table37_ops_[i >> 6][i & 0x3f];
206   }
GetEmit37(size_t i,size_t emit)207   static inline uint64_t GetEmit37(size_t i, size_t emit) {
208     return table37_emit_[i >> 6][emit];
209   }
GetOp38(size_t i)210   static inline uint64_t GetOp38(size_t i) {
211     return table38_ops_[i >> 6][i & 0x3f];
212   }
GetEmit38(size_t i,size_t emit)213   static inline uint64_t GetEmit38(size_t i, size_t emit) {
214     return table38_emit_[i >> 6][emit];
215   }
GetOp31(size_t i)216   static inline uint64_t GetOp31(size_t i) {
217     return table31_ops_[i >> 6][i & 0x3f];
218   }
GetEmit31(size_t i,size_t emit)219   static inline uint64_t GetEmit31(size_t i, size_t emit) {
220     return table31_emit_[i >> 6][emit];
221   }
222 
223  private:
224   static const uint8_t table2_0_emit_[10];
225   static const uint8_t table2_0_ops_[32];
226   static const uint8_t table3_0_emit_[36];
227   static const uint8_t table3_0_ops_[64];
228   static const uint8_t table4_0_emit_[22];
229   static const uint8_t table4_0_ops_[64];
230   static const uint8_t table4_1_emit_[46];
231   static const uint8_t table4_1_ops_[64];
232   static const uint8_t* const table4_emit_[2];
233   static const uint8_t* const table4_ops_[2];
234   static const uint8_t table5_0_ops_[128];
235   static const uint8_t table5_1_emit_[52];
236   static const uint8_t table5_1_ops_[128];
237   static const uint8_t* const table5_emit_[2];
238   static const uint8_t* const table5_ops_[2];
239   static const uint8_t table6_0_emit_[2];
240   static const uint8_t table6_0_ops_[32];
241   static const uint8_t table6_1_emit_[2];
242   static const uint8_t table6_2_emit_[2];
243   static const uint8_t table6_3_emit_[2];
244   static const uint8_t table6_4_emit_[2];
245   static const uint8_t table6_5_emit_[4];
246   static const uint8_t table6_5_ops_[32];
247   static const uint8_t table6_6_emit_[4];
248   static const uint8_t table6_7_emit_[4];
249   static const uint8_t table6_8_emit_[4];
250   static const uint8_t table6_9_emit_[4];
251   static const uint8_t table6_10_emit_[4];
252   static const uint8_t table6_11_emit_[6];
253   static const uint8_t table6_11_ops_[32];
254   static const uint8_t table6_12_emit_[8];
255   static const uint8_t table6_12_ops_[32];
256   static const uint8_t table6_13_emit_[8];
257   static const uint8_t table6_14_emit_[8];
258   static const uint8_t table6_15_emit_[10];
259   static const uint8_t table6_15_ops_[32];
260   static const uint8_t* const table6_emit_[16];
261   static const uint8_t* const table6_ops_[16];
262   static const uint8_t table7_0_emit_[36];
263   static const uint8_t table7_0_ops_[64];
264   static const uint8_t table7_1_emit_[36];
265   static const uint8_t table7_1_ops_[64];
266   static const uint8_t table7_2_emit_[36];
267   static const uint8_t table7_2_ops_[64];
268   static const uint8_t table7_3_emit_[36];
269   static const uint8_t table7_3_ops_[64];
270   static const uint8_t table7_4_emit_[38];
271   static const uint8_t table7_4_ops_[64];
272   static const uint8_t table7_5_ops_[64];
273   static const uint8_t table7_11_ops_[64];
274   static const uint8_t table7_12_ops_[64];
275   static const uint8_t table7_15_emit_[15];
276   static const uint8_t table7_15_ops_[64];
277   static const uint8_t* const table7_emit_[16];
278   static const uint8_t* const table7_ops_[16];
279   static const uint8_t table1_0_emit_[71];
280   static const uint16_t table1_0_inner_[37];
281   static const uint8_t table1_0_outer_[64];
282   static const uint8_t table1_1_emit_[71];
283   static const uint16_t table1_1_inner_[37];
284   static const uint8_t table1_2_emit_[71];
285   static const uint16_t table1_2_inner_[37];
286   static const uint8_t table1_3_emit_[71];
287   static const uint16_t table1_3_inner_[37];
288   static const uint8_t table1_4_emit_[71];
289   static const uint16_t table1_4_inner_[37];
290   static const uint8_t table1_5_emit_[71];
291   static const uint16_t table1_5_inner_[37];
292   static const uint8_t table1_6_emit_[71];
293   static const uint16_t table1_6_inner_[37];
294   static const uint8_t table1_7_emit_[71];
295   static const uint16_t table1_7_inner_[37];
296   static const uint8_t table1_8_emit_[71];
297   static const uint16_t table1_8_inner_[37];
298   static const uint8_t table1_9_emit_[71];
299   static const uint16_t table1_9_inner_[37];
300   static const uint8_t table1_10_emit_[40];
301   static const uint16_t table1_10_inner_[22];
302   static const uint8_t table1_10_outer_[64];
303   static const uint8_t table1_11_emit_[40];
304   static const uint8_t table1_12_emit_[40];
305   static const uint8_t table1_13_emit_[40];
306   static const uint8_t table1_14_emit_[40];
307   static const uint8_t table1_15_emit_[40];
308   static const uint8_t table1_16_emit_[40];
309   static const uint8_t table1_17_emit_[40];
310   static const uint8_t table1_18_emit_[40];
311   static const uint8_t table1_19_emit_[40];
312   static const uint8_t table1_20_emit_[40];
313   static const uint8_t table1_21_emit_[40];
314   static const uint8_t table1_22_emit_[40];
315   static const uint8_t table1_23_emit_[4];
316   static const uint16_t table1_23_inner_[4];
317   static const uint8_t table1_23_outer_[64];
318   static const uint8_t table1_24_emit_[4];
319   static const uint8_t table1_25_emit_[4];
320   static const uint8_t table1_26_emit_[4];
321   static const uint8_t table1_27_emit_[4];
322   static const uint8_t table1_28_emit_[4];
323   static const uint8_t table1_29_emit_[4];
324   static const uint8_t table1_30_emit_[4];
325   static const uint8_t table1_31_emit_[14];
326   static const uint16_t table1_31_inner_[17];
327   static const uint8_t table1_31_outer_[64];
328   static const uint8_t* const table1_emit_[32];
329   static const uint16_t* const table1_inner_[32];
330   static const uint8_t* const table1_outer_[32];
331   static const uint8_t table12_0_inner_[6];
332   static const uint8_t table12_0_outer_[8];
333   static const uint8_t table13_0_emit_[7];
334   static const uint8_t table13_0_inner_[9];
335   static const uint8_t table13_0_outer_[16];
336   static const uint8_t table14_0_ops_[32];
337   static const uint8_t table15_0_ops_[64];
338   static const uint8_t table16_0_emit_[45];
339   static const uint8_t table16_0_ops_[128];
340   static const uint8_t table10_0_emit_[1];
341   static const uint16_t table10_0_ops_[32];
342   static const uint8_t table10_2_emit_[1];
343   static const uint8_t table10_4_emit_[1];
344   static const uint16_t table10_4_ops_[32];
345   static const uint8_t table10_5_emit_[1];
346   static const uint8_t table10_6_emit_[2];
347   static const uint16_t table10_6_ops_[32];
348   static const uint8_t table10_7_emit_[4];
349   static const uint16_t table10_7_ops_[32];
350   static const uint8_t* const table10_emit_[8];
351   static const uint16_t* const table10_ops_[8];
352   static const uint8_t table24_0_emit_[8];
353   static const uint8_t table24_0_inner_[8];
354   static const uint8_t table25_0_emit_[8];
355   static const uint8_t table26_0_emit_[16];
356   static const uint8_t table26_0_inner_[16];
357   static const uint8_t table27_0_emit_[7];
358   static const uint8_t table27_0_inner_[7];
359   static const uint8_t table30_0_inner_[5];
360   static const uint8_t table29_0_emit_[12];
361   static const uint8_t table29_0_inner_[12];
362   static const uint8_t table32_0_emit_[5];
363   static const uint8_t table32_0_inner_[7];
364   static const uint8_t table33_0_emit_[17];
365   static const uint8_t table33_0_ops_[32];
366   static const uint8_t table34_0_emit_[21];
367   static const uint8_t table34_0_ops_[64];
368   static const uint8_t table35_0_emit_[36];
369   static const uint8_t table35_0_ops_[128];
370   static const uint8_t table36_0_emit_[55];
371   static const uint8_t table36_0_ops_[256];
372   static const uint8_t table37_0_emit_[40];
373   static const uint8_t table37_0_ops_[64];
374   static const uint8_t table37_1_emit_[40];
375   static const uint8_t table37_2_emit_[22];
376   static const uint8_t table37_2_ops_[64];
377   static const uint8_t table37_3_emit_[4];
378   static const uint8_t table37_4_emit_[4];
379   static const uint8_t table37_5_emit_[6];
380   static const uint8_t table37_6_emit_[17];
381   static const uint8_t table37_6_ops_[64];
382   static const uint8_t table37_7_emit_[46];
383   static const uint8_t table37_7_ops_[64];
384   static const uint8_t* const table37_emit_[8];
385   static const uint8_t* const table37_ops_[8];
386   static const uint8_t table38_0_emit_[72];
387   static const uint16_t table38_0_ops_[64];
388   static const uint8_t table38_1_emit_[72];
389   static const uint8_t table38_2_emit_[72];
390   static const uint8_t table38_3_emit_[72];
391   static const uint8_t table38_4_emit_[72];
392   static const uint8_t table38_5_emit_[40];
393   static const uint16_t table38_5_ops_[64];
394   static const uint8_t table38_6_emit_[40];
395   static const uint8_t table38_7_emit_[40];
396   static const uint8_t table38_8_emit_[40];
397   static const uint8_t table38_9_emit_[40];
398   static const uint8_t table38_10_emit_[40];
399   static const uint8_t table38_11_emit_[4];
400   static const uint16_t table38_11_ops_[64];
401   static const uint8_t table38_12_emit_[8];
402   static const uint16_t table38_12_ops_[64];
403   static const uint8_t table38_13_emit_[9];
404   static const uint16_t table38_13_ops_[64];
405   static const uint8_t table38_14_emit_[16];
406   static const uint16_t table38_14_ops_[64];
407   static const uint8_t table38_15_emit_[30];
408   static const uint16_t table38_15_ops_[64];
409   static const uint8_t* const table38_emit_[16];
410   static const uint16_t* const table38_ops_[16];
411   static const uint8_t table31_0_emit_[1];
412   static const uint16_t table31_0_ops_[64];
413   static const uint8_t table31_2_emit_[1];
414   static const uint8_t table31_4_emit_[1];
415   static const uint8_t table31_6_emit_[1];
416   static const uint8_t table31_8_emit_[1];
417   static const uint8_t table31_10_emit_[1];
418   static const uint16_t table31_10_ops_[64];
419   static const uint8_t table31_11_emit_[1];
420   static const uint8_t table31_12_emit_[1];
421   static const uint8_t table31_13_emit_[1];
422   static const uint8_t table31_14_emit_[1];
423   static const uint8_t table31_15_emit_[1];
424   static const uint8_t table31_16_emit_[1];
425   static const uint8_t table31_17_emit_[1];
426   static const uint8_t table31_18_emit_[1];
427   static const uint8_t table31_19_emit_[1];
428   static const uint8_t table31_20_emit_[1];
429   static const uint8_t table31_21_emit_[1];
430   static const uint8_t table31_22_emit_[2];
431   static const uint16_t table31_22_ops_[64];
432   static const uint8_t table31_23_emit_[2];
433   static const uint8_t table31_24_emit_[4];
434   static const uint16_t table31_24_ops_[64];
435   static const uint8_t table31_25_emit_[4];
436   static const uint8_t table31_26_emit_[4];
437   static const uint8_t table31_27_emit_[5];
438   static const uint16_t table31_27_ops_[64];
439   static const uint8_t table31_28_emit_[8];
440   static const uint16_t table31_28_ops_[64];
441   static const uint8_t table31_29_emit_[8];
442   static const uint8_t table31_30_emit_[15];
443   static const uint16_t table31_30_ops_[64];
444   static const uint8_t table31_31_emit_[18];
445   static const uint16_t table31_31_ops_[64];
446   static const uint8_t* const table31_emit_[32];
447   static const uint16_t* const table31_ops_[32];
448 };
449 template <typename F>
450 class HuffDecoder : public HuffDecoderCommon {
451  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)452   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
453       : sink_(sink), begin_(begin), end_(end) {}
Run()454   bool Run() {
455     while (!done_) {
456       if (!RefillTo11()) {
457         Done0();
458         break;
459       }
460       const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
461       const auto op = GetOp1(index);
462       const int consumed = op & 15;
463       buffer_len_ -= consumed;
464       const auto emit_ofs = op >> 7;
465       switch ((op >> 4) & 7) {
466         case 0: {
467           sink_(GetEmit1(index, emit_ofs + 0));
468           sink_(GetEmit1(index, emit_ofs + 1));
469           break;
470         }
471         case 1: {
472           sink_(GetEmit1(index, emit_ofs + 0));
473           break;
474         }
475         case 2: {
476           DecodeStep0();
477           break;
478         }
479         case 3: {
480           DecodeStep1();
481           break;
482         }
483         case 4: {
484           DecodeStep2();
485           break;
486         }
487       }
488     }
489     return ok_;
490   }
491 
492  private:
RefillTo11()493   bool RefillTo11() {
494     switch (buffer_len_) {
495       case 0: {
496         return Read2to8Bytes();
497       }
498       case 1:
499       case 2: {
500         return Read2to7Bytes();
501       }
502       case 3:
503       case 4:
504       case 5:
505       case 6:
506       case 7:
507       case 8: {
508         return Read1to7Bytes();
509       }
510       case 9:
511       case 10: {
512         return Read1to6Bytes();
513       }
514     }
515     return true;
516   }
Read2to8Bytes()517   bool Read2to8Bytes() {
518     switch (end_ - begin_) {
519       case 0:
520       case 1: {
521         return false;
522       }
523       case 2: {
524         Fill2();
525         return true;
526       }
527       case 3: {
528         Fill3();
529         return true;
530       }
531       case 4: {
532         Fill4();
533         return true;
534       }
535       case 5: {
536         Fill5();
537         return true;
538       }
539       case 6: {
540         Fill6();
541         return true;
542       }
543       case 7: {
544         Fill7();
545         return true;
546       }
547       default: {
548         Fill8();
549         return true;
550       }
551     }
552   }
Fill2()553   void Fill2() {
554     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
555               (static_cast<uint64_t>(begin_[1]) << 0);
556     begin_ += 2;
557     buffer_len_ += 16;
558   }
Fill3()559   void Fill3() {
560     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
561               (static_cast<uint64_t>(begin_[1]) << 8) |
562               (static_cast<uint64_t>(begin_[2]) << 0);
563     begin_ += 3;
564     buffer_len_ += 24;
565   }
Fill4()566   void Fill4() {
567     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
568               (static_cast<uint64_t>(begin_[1]) << 16) |
569               (static_cast<uint64_t>(begin_[2]) << 8) |
570               (static_cast<uint64_t>(begin_[3]) << 0);
571     begin_ += 4;
572     buffer_len_ += 32;
573   }
Fill5()574   void Fill5() {
575     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
576               (static_cast<uint64_t>(begin_[1]) << 24) |
577               (static_cast<uint64_t>(begin_[2]) << 16) |
578               (static_cast<uint64_t>(begin_[3]) << 8) |
579               (static_cast<uint64_t>(begin_[4]) << 0);
580     begin_ += 5;
581     buffer_len_ += 40;
582   }
Fill6()583   void Fill6() {
584     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
585               (static_cast<uint64_t>(begin_[1]) << 32) |
586               (static_cast<uint64_t>(begin_[2]) << 24) |
587               (static_cast<uint64_t>(begin_[3]) << 16) |
588               (static_cast<uint64_t>(begin_[4]) << 8) |
589               (static_cast<uint64_t>(begin_[5]) << 0);
590     begin_ += 6;
591     buffer_len_ += 48;
592   }
Fill7()593   void Fill7() {
594     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
595               (static_cast<uint64_t>(begin_[1]) << 40) |
596               (static_cast<uint64_t>(begin_[2]) << 32) |
597               (static_cast<uint64_t>(begin_[3]) << 24) |
598               (static_cast<uint64_t>(begin_[4]) << 16) |
599               (static_cast<uint64_t>(begin_[5]) << 8) |
600               (static_cast<uint64_t>(begin_[6]) << 0);
601     begin_ += 7;
602     buffer_len_ += 56;
603   }
Fill8()604   void Fill8() {
605     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
606               (static_cast<uint64_t>(begin_[1]) << 48) |
607               (static_cast<uint64_t>(begin_[2]) << 40) |
608               (static_cast<uint64_t>(begin_[3]) << 32) |
609               (static_cast<uint64_t>(begin_[4]) << 24) |
610               (static_cast<uint64_t>(begin_[5]) << 16) |
611               (static_cast<uint64_t>(begin_[6]) << 8) |
612               (static_cast<uint64_t>(begin_[7]) << 0);
613     begin_ += 8;
614     buffer_len_ += 64;
615   }
Read2to7Bytes()616   bool Read2to7Bytes() {
617     switch (end_ - begin_) {
618       case 0:
619       case 1: {
620         return false;
621       }
622       case 2: {
623         Fill2();
624         return true;
625       }
626       case 3: {
627         Fill3();
628         return true;
629       }
630       case 4: {
631         Fill4();
632         return true;
633       }
634       case 5: {
635         Fill5();
636         return true;
637       }
638       case 6: {
639         Fill6();
640         return true;
641       }
642       default: {
643         Fill7();
644         return true;
645       }
646     }
647   }
Read1to7Bytes()648   bool Read1to7Bytes() {
649     switch (end_ - begin_) {
650       case 0: {
651         return false;
652       }
653       case 1: {
654         Fill1();
655         return true;
656       }
657       case 2: {
658         Fill2();
659         return true;
660       }
661       case 3: {
662         Fill3();
663         return true;
664       }
665       case 4: {
666         Fill4();
667         return true;
668       }
669       case 5: {
670         Fill5();
671         return true;
672       }
673       case 6: {
674         Fill6();
675         return true;
676       }
677       default: {
678         Fill7();
679         return true;
680       }
681     }
682   }
Fill1()683   void Fill1() {
684     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
685     begin_ += 1;
686     buffer_len_ += 8;
687   }
Read1to6Bytes()688   bool Read1to6Bytes() {
689     switch (end_ - begin_) {
690       case 0: {
691         return false;
692       }
693       case 1: {
694         Fill1();
695         return true;
696       }
697       case 2: {
698         Fill2();
699         return true;
700       }
701       case 3: {
702         Fill3();
703         return true;
704       }
705       case 4: {
706         Fill4();
707         return true;
708       }
709       case 5: {
710         Fill5();
711         return true;
712       }
713       default: {
714         Fill6();
715         return true;
716       }
717     }
718   }
Done0()719   void Done0() {
720     done_ = true;
721     switch (end_ - begin_) {
722       case 1: {
723         Fill1();
724         break;
725       }
726     }
727     switch (buffer_len_) {
728       case 1:
729       case 2:
730       case 3:
731       case 4: {
732         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
733         return;
734       }
735       case 5: {
736         const auto index = buffer_ & 31;
737         const auto op = GetOp2(index);
738         switch (op & 3) {
739           case 0: {
740             sink_(GetEmit2(index, (op >> 2) + 0));
741             break;
742           }
743           case 1: {
744             ok_ = false;
745             break;
746           }
747         }
748         return;
749       }
750       case 6: {
751         const auto index = buffer_ & 63;
752         const auto op = GetOp3(index);
753         switch (op & 3) {
754           case 0: {
755             ok_ = false;
756             break;
757           }
758           case 1: {
759             sink_(GetEmit3(index, (op >> 2) + 0));
760             break;
761           }
762         }
763         return;
764       }
765       case 7: {
766         const auto index = buffer_ & 127;
767         const auto op = GetOp4(index);
768         switch (op & 3) {
769           case 0: {
770             ok_ = false;
771             break;
772           }
773           case 1: {
774             sink_(GetEmit4(index, (op >> 2) + 0));
775             break;
776           }
777         }
778         return;
779       }
780       case 8: {
781         const auto index = buffer_ & 255;
782         const auto op = GetOp5(index);
783         switch (op & 3) {
784           case 0: {
785             ok_ = false;
786             break;
787           }
788           case 1: {
789             sink_(GetEmit5(index, (op >> 2) + 0));
790             break;
791           }
792         }
793         return;
794       }
795       case 9: {
796         const auto index = buffer_ & 511;
797         const auto op = GetOp6(index);
798         switch (op & 3) {
799           case 0: {
800             ok_ = false;
801             break;
802           }
803           case 1: {
804             sink_(GetEmit6(index, (op >> 2) + 0));
805             break;
806           }
807         }
808         return;
809       }
810       case 10: {
811         const auto index = buffer_ & 1023;
812         const auto op = GetOp7(index);
813         switch (op & 3) {
814           case 0: {
815             sink_(GetEmit7(index, (op >> 2) + 0));
816             sink_(GetEmit7(index, (op >> 2) + 1));
817             break;
818           }
819           case 1: {
820             ok_ = false;
821             break;
822           }
823           case 2: {
824             sink_(GetEmit7(index, (op >> 2) + 0));
825             break;
826           }
827         }
828         return;
829       }
830       case 0: {
831         return;
832       }
833     }
834   }
DecodeStep0()835   void DecodeStep0() {
836     if (!RefillTo1()) {
837       Done1();
838       return;
839     }
840     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
841     const auto op = GetOp8(index);
842     const int consumed = op & 1;
843     buffer_len_ -= consumed;
844     const auto emit_ofs = op >> 1;
845     sink_(GetEmit8(index, emit_ofs + 0));
846   }
RefillTo1()847   bool RefillTo1() {
848     switch (buffer_len_) {
849       case 0: {
850         return Read1to8Bytes();
851       }
852     }
853     return true;
854   }
Read1to8Bytes()855   bool Read1to8Bytes() {
856     switch (end_ - begin_) {
857       case 0: {
858         return false;
859       }
860       case 1: {
861         Fill1();
862         return true;
863       }
864       case 2: {
865         Fill2();
866         return true;
867       }
868       case 3: {
869         Fill3();
870         return true;
871       }
872       case 4: {
873         Fill4();
874         return true;
875       }
876       case 5: {
877         Fill5();
878         return true;
879       }
880       case 6: {
881         Fill6();
882         return true;
883       }
884       case 7: {
885         Fill7();
886         return true;
887       }
888       default: {
889         Fill8();
890         return true;
891       }
892     }
893   }
Done1()894   void Done1() {
895     done_ = true;
896     ok_ = false;
897   }
DecodeStep1()898   void DecodeStep1() {
899     if (!RefillTo2()) {
900       Done2();
901       return;
902     }
903     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
904     const auto op = GetOp9(index);
905     const int consumed = op & 3;
906     buffer_len_ -= consumed;
907     const auto emit_ofs = op >> 2;
908     sink_(GetEmit9(index, emit_ofs + 0));
909   }
RefillTo2()910   bool RefillTo2() {
911     switch (buffer_len_) {
912       case 0: {
913         return Read1to8Bytes();
914       }
915       case 1: {
916         return Read1to7Bytes();
917       }
918     }
919     return true;
920   }
Done2()921   void Done2() {
922     done_ = true;
923     switch (buffer_len_) {
924       case 1:
925       case 0: {
926         ok_ = false;
927         return;
928       }
929     }
930   }
DecodeStep2()931   void DecodeStep2() {
932     if (!RefillTo8()) {
933       Done3();
934       return;
935     }
936     const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
937     const auto op = GetOp10(index);
938     const int consumed = op & 15;
939     buffer_len_ -= consumed;
940     const auto emit_ofs = op >> 8;
941     switch ((op >> 4) & 15) {
942       case 0: {
943         sink_(GetEmit10(index, emit_ofs + 0));
944         break;
945       }
946       case 1: {
947         DecodeStep3();
948         break;
949       }
950       case 2: {
951         DecodeStep4();
952         break;
953       }
954       case 3: {
955         DecodeStep5();
956         break;
957       }
958       case 4: {
959         DecodeStep6();
960         break;
961       }
962       case 5: {
963         DecodeStep7();
964         break;
965       }
966       case 6: {
967         DecodeStep8();
968         break;
969       }
970       case 7: {
971         DecodeStep9();
972         break;
973       }
974       case 8: {
975         DecodeStep13();
976         break;
977       }
978       case 9: {
979         DecodeStep10();
980         break;
981       }
982       case 10: {
983         DecodeStep11();
984         break;
985       }
986       case 11: {
987         DecodeStep14();
988         break;
989       }
990       case 12: {
991         DecodeStep12();
992         break;
993       }
994       case 13: {
995         DecodeStep15();
996         break;
997       }
998     }
999   }
RefillTo8()1000   bool RefillTo8() {
1001     switch (buffer_len_) {
1002       case 0: {
1003         return Read1to8Bytes();
1004       }
1005       case 1:
1006       case 2:
1007       case 3:
1008       case 4:
1009       case 5:
1010       case 6:
1011       case 7: {
1012         return Read1to7Bytes();
1013       }
1014     }
1015     return true;
1016   }
Done3()1017   void Done3() {
1018     done_ = true;
1019     switch (end_ - begin_) {}
1020     switch (buffer_len_) {
1021       case 1: {
1022         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1023         return;
1024       }
1025       case 2: {
1026         const auto index = buffer_ & 3;
1027         const auto op = GetOp11(index);
1028         switch (op & 3) {
1029           case 0: {
1030             sink_(GetEmit11(index, (op >> 2) + 0));
1031             break;
1032           }
1033           case 1: {
1034             ok_ = false;
1035             break;
1036           }
1037         }
1038         return;
1039       }
1040       case 3: {
1041         const auto index = buffer_ & 7;
1042         const auto op = GetOp12(index);
1043         switch (op & 3) {
1044           case 0: {
1045             ok_ = false;
1046             break;
1047           }
1048           case 1: {
1049             sink_(GetEmit12(index, (op >> 2) + 0));
1050             break;
1051           }
1052         }
1053         return;
1054       }
1055       case 4: {
1056         const auto index = buffer_ & 15;
1057         const auto op = GetOp13(index);
1058         switch (op & 3) {
1059           case 0: {
1060             ok_ = false;
1061             break;
1062           }
1063           case 1: {
1064             sink_(GetEmit13(index, (op >> 2) + 0));
1065             break;
1066           }
1067         }
1068         return;
1069       }
1070       case 5: {
1071         const auto index = buffer_ & 31;
1072         const auto op = GetOp14(index);
1073         switch (op & 3) {
1074           case 0: {
1075             ok_ = false;
1076             break;
1077           }
1078           case 1: {
1079             sink_(GetEmit14(index, (op >> 2) + 0));
1080             break;
1081           }
1082         }
1083         return;
1084       }
1085       case 6: {
1086         const auto index = buffer_ & 63;
1087         const auto op = GetOp15(index);
1088         switch (op & 3) {
1089           case 0: {
1090             ok_ = false;
1091             break;
1092           }
1093           case 1: {
1094             sink_(GetEmit15(index, (op >> 2) + 0));
1095             break;
1096           }
1097         }
1098         return;
1099       }
1100       case 7: {
1101         const auto index = buffer_ & 127;
1102         const auto op = GetOp16(index);
1103         switch (op & 3) {
1104           case 0: {
1105             sink_(GetEmit16(index, (op >> 2) + 0));
1106             sink_(GetEmit16(index, (op >> 2) + 1));
1107             break;
1108           }
1109           case 1: {
1110             ok_ = false;
1111             break;
1112           }
1113           case 2: {
1114             sink_(GetEmit16(index, (op >> 2) + 0));
1115             break;
1116           }
1117         }
1118         return;
1119       }
1120       case 0: {
1121         return;
1122       }
1123     }
1124   }
DecodeStep3()1125   void DecodeStep3() {
1126     if (!RefillTo1()) {
1127       Done4();
1128       return;
1129     }
1130     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1131     const auto op = GetOp17(index);
1132     const int consumed = op & 1;
1133     buffer_len_ -= consumed;
1134     const auto emit_ofs = op >> 1;
1135     sink_(GetEmit17(index, emit_ofs + 0));
1136   }
Done4()1137   void Done4() {
1138     done_ = true;
1139     ok_ = false;
1140   }
DecodeStep4()1141   void DecodeStep4() {
1142     if (!RefillTo1()) {
1143       Done5();
1144       return;
1145     }
1146     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1147     const auto op = GetOp18(index);
1148     const int consumed = op & 1;
1149     buffer_len_ -= consumed;
1150     const auto emit_ofs = op >> 1;
1151     sink_(GetEmit18(index, emit_ofs + 0));
1152   }
Done5()1153   void Done5() {
1154     done_ = true;
1155     ok_ = false;
1156   }
DecodeStep5()1157   void DecodeStep5() {
1158     if (!RefillTo1()) {
1159       Done6();
1160       return;
1161     }
1162     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1163     const auto op = GetOp19(index);
1164     const int consumed = op & 1;
1165     buffer_len_ -= consumed;
1166     const auto emit_ofs = op >> 1;
1167     sink_(GetEmit19(index, emit_ofs + 0));
1168   }
Done6()1169   void Done6() {
1170     done_ = true;
1171     ok_ = false;
1172   }
DecodeStep6()1173   void DecodeStep6() {
1174     if (!RefillTo1()) {
1175       Done7();
1176       return;
1177     }
1178     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1179     const auto op = GetOp20(index);
1180     const int consumed = op & 1;
1181     buffer_len_ -= consumed;
1182     const auto emit_ofs = op >> 1;
1183     sink_(GetEmit20(index, emit_ofs + 0));
1184   }
Done7()1185   void Done7() {
1186     done_ = true;
1187     ok_ = false;
1188   }
DecodeStep7()1189   void DecodeStep7() {
1190     if (!RefillTo2()) {
1191       Done8();
1192       return;
1193     }
1194     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1195     const auto op = GetOp21(index);
1196     const int consumed = op & 3;
1197     buffer_len_ -= consumed;
1198     const auto emit_ofs = op >> 2;
1199     sink_(GetEmit21(index, emit_ofs + 0));
1200   }
Done8()1201   void Done8() {
1202     done_ = true;
1203     switch (buffer_len_) {
1204       case 1:
1205       case 0: {
1206         ok_ = false;
1207         return;
1208       }
1209     }
1210   }
DecodeStep8()1211   void DecodeStep8() {
1212     if (!RefillTo2()) {
1213       Done9();
1214       return;
1215     }
1216     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1217     const auto op = GetOp22(index);
1218     const int consumed = op & 3;
1219     buffer_len_ -= consumed;
1220     const auto emit_ofs = op >> 2;
1221     sink_(GetEmit22(index, emit_ofs + 0));
1222   }
Done9()1223   void Done9() {
1224     done_ = true;
1225     switch (buffer_len_) {
1226       case 1:
1227       case 0: {
1228         ok_ = false;
1229         return;
1230       }
1231     }
1232   }
DecodeStep9()1233   void DecodeStep9() {
1234     if (!RefillTo2()) {
1235       Done10();
1236       return;
1237     }
1238     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1239     const auto op = GetOp23(index);
1240     const int consumed = op & 3;
1241     buffer_len_ -= consumed;
1242     const auto emit_ofs = op >> 2;
1243     sink_(GetEmit23(index, emit_ofs + 0));
1244   }
Done10()1245   void Done10() {
1246     done_ = true;
1247     switch (buffer_len_) {
1248       case 1:
1249       case 0: {
1250         ok_ = false;
1251         return;
1252       }
1253     }
1254   }
DecodeStep10()1255   void DecodeStep10() {
1256     if (!RefillTo3()) {
1257       Done11();
1258       return;
1259     }
1260     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1261     const auto op = GetOp24(index);
1262     const int consumed = op & 3;
1263     buffer_len_ -= consumed;
1264     const auto emit_ofs = op >> 2;
1265     sink_(GetEmit24(index, emit_ofs + 0));
1266   }
RefillTo3()1267   bool RefillTo3() {
1268     switch (buffer_len_) {
1269       case 0: {
1270         return Read1to8Bytes();
1271       }
1272       case 1:
1273       case 2: {
1274         return Read1to7Bytes();
1275       }
1276     }
1277     return true;
1278   }
Done11()1279   void Done11() {
1280     done_ = true;
1281     switch (buffer_len_) {
1282       case 1:
1283       case 2:
1284       case 0: {
1285         ok_ = false;
1286         return;
1287       }
1288     }
1289   }
DecodeStep11()1290   void DecodeStep11() {
1291     if (!RefillTo3()) {
1292       Done12();
1293       return;
1294     }
1295     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1296     const auto op = GetOp25(index);
1297     const int consumed = op & 3;
1298     buffer_len_ -= consumed;
1299     const auto emit_ofs = op >> 2;
1300     sink_(GetEmit25(index, emit_ofs + 0));
1301   }
Done12()1302   void Done12() {
1303     done_ = true;
1304     switch (buffer_len_) {
1305       case 1:
1306       case 2:
1307       case 0: {
1308         ok_ = false;
1309         return;
1310       }
1311     }
1312   }
DecodeStep12()1313   void DecodeStep12() {
1314     if (!RefillTo4()) {
1315       Done13();
1316       return;
1317     }
1318     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1319     const auto op = GetOp26(index);
1320     const int consumed = op & 7;
1321     buffer_len_ -= consumed;
1322     const auto emit_ofs = op >> 3;
1323     sink_(GetEmit26(index, emit_ofs + 0));
1324   }
RefillTo4()1325   bool RefillTo4() {
1326     switch (buffer_len_) {
1327       case 0: {
1328         return Read1to8Bytes();
1329       }
1330       case 1:
1331       case 2:
1332       case 3: {
1333         return Read1to7Bytes();
1334       }
1335     }
1336     return true;
1337   }
Done13()1338   void Done13() {
1339     done_ = true;
1340     switch (buffer_len_) {
1341       case 1:
1342       case 2:
1343       case 3:
1344       case 0: {
1345         ok_ = false;
1346         return;
1347       }
1348     }
1349   }
DecodeStep13()1350   void DecodeStep13() {
1351     if (!RefillTo3()) {
1352       Done14();
1353       return;
1354     }
1355     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1356     const auto op = GetOp27(index);
1357     const int consumed = op & 3;
1358     buffer_len_ -= consumed;
1359     const auto emit_ofs = op >> 2;
1360     sink_(GetEmit27(index, emit_ofs + 0));
1361   }
Done14()1362   void Done14() {
1363     done_ = true;
1364     switch (buffer_len_) {
1365       case 1:
1366       case 0: {
1367         ok_ = false;
1368         return;
1369       }
1370       case 2: {
1371         const auto index = buffer_ & 3;
1372         const auto op = GetOp28(index);
1373         switch (op & 1) {
1374           case 0: {
1375             sink_(GetEmit28(index, (op >> 1) + 0));
1376             break;
1377           }
1378           case 1: {
1379             ok_ = false;
1380             break;
1381           }
1382         }
1383         return;
1384       }
1385     }
1386   }
DecodeStep14()1387   void DecodeStep14() {
1388     if (!RefillTo4()) {
1389       Done15();
1390       return;
1391     }
1392     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1393     const auto op = GetOp29(index);
1394     const int consumed = op & 7;
1395     buffer_len_ -= consumed;
1396     const auto emit_ofs = op >> 3;
1397     sink_(GetEmit29(index, emit_ofs + 0));
1398   }
Done15()1399   void Done15() {
1400     done_ = true;
1401     switch (buffer_len_) {
1402       case 1:
1403       case 2:
1404       case 0: {
1405         ok_ = false;
1406         return;
1407       }
1408       case 3: {
1409         const auto index = buffer_ & 7;
1410         const auto op = GetOp30(index);
1411         switch (op & 1) {
1412           case 0: {
1413             sink_(GetEmit30(index, (op >> 1) + 0));
1414             break;
1415           }
1416           case 1: {
1417             ok_ = false;
1418             break;
1419           }
1420         }
1421         return;
1422       }
1423     }
1424   }
DecodeStep15()1425   void DecodeStep15() {
1426     if (!RefillTo11()) {
1427       Done16();
1428       return;
1429     }
1430     const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
1431     const auto op = GetOp31(index);
1432     const int consumed = op & 15;
1433     buffer_len_ -= consumed;
1434     const auto emit_ofs = op >> 5;
1435     switch ((op >> 4) & 1) {
1436       case 0: {
1437         sink_(GetEmit31(index, emit_ofs + 0));
1438         break;
1439       }
1440       case 1: {
1441         begin_ = end_;
1442         buffer_len_ = 0;
1443         break;
1444       }
1445     }
1446   }
Done16()1447   void Done16() {
1448     done_ = true;
1449     switch (end_ - begin_) {
1450       case 1: {
1451         Fill1();
1452         break;
1453       }
1454     }
1455     switch (buffer_len_) {
1456       case 1:
1457       case 2:
1458       case 3: {
1459         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1460         return;
1461       }
1462       case 4: {
1463         const auto index = buffer_ & 15;
1464         const auto op = GetOp32(index);
1465         switch (op & 3) {
1466           case 0: {
1467             sink_(GetEmit32(index, (op >> 2) + 0));
1468             break;
1469           }
1470           case 1: {
1471             ok_ = false;
1472             break;
1473           }
1474         }
1475         return;
1476       }
1477       case 5: {
1478         const auto index = buffer_ & 31;
1479         const auto op = GetOp33(index);
1480         switch (op & 3) {
1481           case 0: {
1482             ok_ = false;
1483             break;
1484           }
1485           case 1: {
1486             sink_(GetEmit33(index, (op >> 2) + 0));
1487             break;
1488           }
1489         }
1490         return;
1491       }
1492       case 6: {
1493         const auto index = buffer_ & 63;
1494         const auto op = GetOp34(index);
1495         switch (op & 3) {
1496           case 0: {
1497             ok_ = false;
1498             break;
1499           }
1500           case 1: {
1501             sink_(GetEmit34(index, (op >> 2) + 0));
1502             break;
1503           }
1504         }
1505         return;
1506       }
1507       case 7: {
1508         const auto index = buffer_ & 127;
1509         const auto op = GetOp35(index);
1510         switch (op & 3) {
1511           case 0: {
1512             ok_ = false;
1513             break;
1514           }
1515           case 1: {
1516             sink_(GetEmit35(index, (op >> 2) + 0));
1517             break;
1518           }
1519         }
1520         return;
1521       }
1522       case 8: {
1523         const auto index = buffer_ & 255;
1524         const auto op = GetOp36(index);
1525         switch (op & 3) {
1526           case 0: {
1527             ok_ = false;
1528             break;
1529           }
1530           case 1: {
1531             sink_(GetEmit36(index, (op >> 2) + 0));
1532             break;
1533           }
1534         }
1535         return;
1536       }
1537       case 9: {
1538         const auto index = buffer_ & 511;
1539         const auto op = GetOp37(index);
1540         switch (op & 3) {
1541           case 0: {
1542             sink_(GetEmit37(index, (op >> 2) + 0));
1543             sink_(GetEmit37(index, (op >> 2) + 1));
1544             break;
1545           }
1546           case 1: {
1547             ok_ = false;
1548             break;
1549           }
1550           case 2: {
1551             sink_(GetEmit37(index, (op >> 2) + 0));
1552             break;
1553           }
1554         }
1555         return;
1556       }
1557       case 10: {
1558         const auto index = buffer_ & 1023;
1559         const auto op = GetOp38(index);
1560         switch (op & 3) {
1561           case 0: {
1562             ok_ = false;
1563             break;
1564           }
1565           case 1: {
1566             sink_(GetEmit38(index, (op >> 2) + 0));
1567             sink_(GetEmit38(index, (op >> 2) + 1));
1568             break;
1569           }
1570           case 2: {
1571             sink_(GetEmit38(index, (op >> 2) + 0));
1572             break;
1573           }
1574         }
1575         return;
1576       }
1577       case 0: {
1578         return;
1579       }
1580     }
1581   }
1582   F sink_;
1583   const uint8_t* begin_;
1584   const uint8_t* const end_;
1585   uint64_t buffer_ = 0;
1586   int buffer_len_ = 0;
1587   bool ok_ = true;
1588   bool done_ = false;
1589 };
1590 }  // namespace geometry_11_8_11
1591 }  // namespace grpc_core
1592 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_8_11_H
1593