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