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