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