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