xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_7_14_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_7_14_9_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_14_9_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_7_14_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   }
GetOp1(size_t i)36   static inline uint64_t GetOp1(size_t i) {
37     return table1_0_inner_[table1_0_outer_[i]];
38   }
GetEmit1(size_t,size_t emit)39   static inline uint64_t GetEmit1(size_t, size_t emit) {
40     return table1_0_emit_[emit];
41   }
GetOp4(size_t i)42   static inline uint64_t GetOp4(size_t i) { return i ? 3 : 1; }
GetEmit4(size_t,size_t emit)43   static inline uint64_t GetEmit4(size_t, size_t emit) {
44     return emit ? 42 : 38;
45   }
GetOp5(size_t i)46   static inline uint64_t GetOp5(size_t i) { return i ? 3 : 1; }
GetEmit5(size_t,size_t emit)47   static inline uint64_t GetEmit5(size_t, size_t emit) {
48     return emit ? 59 : 44;
49   }
GetOp6(size_t i)50   static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; }
GetEmit6(size_t,size_t emit)51   static inline uint64_t GetEmit6(size_t, size_t emit) {
52     return emit ? 90 : 88;
53   }
GetOp8(size_t i)54   static inline uint64_t GetOp8(size_t i) {
55     return table8_0_inner_[(i < 6 ? (i) : ((i - 6) + 5))];
56   }
GetEmit8(size_t,size_t emit)57   static inline uint64_t GetEmit8(size_t, size_t emit) {
58     return table8_0_emit_[emit];
59   }
GetOp9(size_t i)60   static inline uint64_t GetOp9(size_t i) {
61     return table9_0_inner_[table9_0_outer_[i]];
62   }
GetEmit9(size_t,size_t emit)63   static inline uint64_t GetEmit9(size_t, size_t emit) {
64     return table9_0_emit_[emit];
65   }
GetOp10(size_t i)66   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)67   static inline uint64_t GetEmit10(size_t, size_t emit) {
68     return table10_0_emit_[emit];
69   }
GetOp11(size_t i)70   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)71   static inline uint64_t GetEmit11(size_t, size_t emit) {
72     return table11_0_emit_[emit];
73   }
GetOp12(size_t i)74   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)75   static inline uint64_t GetEmit12(size_t, size_t emit) {
76     return table12_0_emit_[emit];
77   }
GetOp13(size_t i)78   static inline uint64_t GetOp13(size_t i) {
79     return table13_ops_[i >> 6][i & 0x3f];
80   }
GetEmit13(size_t i,size_t emit)81   static inline uint64_t GetEmit13(size_t i, size_t emit) {
82     return table13_emit_[i >> 6][emit];
83   }
GetOp14(size_t i)84   static inline uint64_t GetOp14(size_t i) {
85     return table14_ops_[i >> 6][i & 0x3f];
86   }
GetEmit14(size_t i,size_t emit)87   static inline uint64_t GetEmit14(size_t i, size_t emit) {
88     return table14_emit_[i >> 6][emit];
89   }
GetOp15(size_t i)90   static inline uint64_t GetOp15(size_t i) {
91     return table15_ops_[i >> 6][i & 0x3f];
92   }
GetEmit15(size_t i,size_t emit)93   static inline uint64_t GetEmit15(size_t i, size_t emit) {
94     return table15_emit_[i >> 6][emit];
95   }
GetOp16(size_t i)96   static inline uint64_t GetOp16(size_t i) {
97     return table16_ops_[i >> 6][i & 0x3f];
98   }
GetEmit16(size_t i,size_t emit)99   static inline uint64_t GetEmit16(size_t i, size_t emit) {
100     return table16_emit_[i >> 6][emit];
101   }
GetOp17(size_t i)102   static inline uint64_t GetOp17(size_t i) {
103     return table17_ops_[i >> 7][i & 0x7f];
104   }
GetEmit17(size_t i,size_t emit)105   static inline uint64_t GetEmit17(size_t i, size_t emit) {
106     return table17_emit_[i >> 7][emit];
107   }
GetOp18(size_t i)108   static inline uint64_t GetOp18(size_t i) {
109     return table18_ops_[i >> 6][i & 0x3f];
110   }
GetEmit18(size_t i,size_t emit)111   static inline uint64_t GetEmit18(size_t i, size_t emit) {
112     return table18_emit_[i >> 6][emit];
113   }
GetOp7(size_t i)114   static inline uint64_t GetOp7(size_t i) {
115     return table7_ops_[i >> 8][i & 0xff];
116   }
GetEmit7(size_t i,size_t emit)117   static inline uint64_t GetEmit7(size_t i, size_t emit) {
118     return table7_emit_[i >> 8][emit];
119   }
GetOp19(size_t i)120   static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; }
GetEmit19(size_t,size_t emit)121   static inline uint64_t GetEmit19(size_t, size_t emit) {
122     return emit ? 132 : 129;
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) { return emit + 133; }
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 ? 146 : 136;
129   }
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 ? 156 : 154;
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 ? 163 : 160;
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 ? 169 : 164;
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 ? 173 : 170;
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 ? 181 : 178;
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) { return emit + 185; }
GetOp28(size_t i)152   static inline uint64_t GetOp28(size_t i) { return i ? 3 : 1; }
GetEmit28(size_t,size_t emit)153   static inline uint64_t GetEmit28(size_t, size_t emit) {
154     return emit ? 189 : 187;
155   }
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 ? 196 : 190;
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 ? 228 : 198;
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) { return emit + 232; }
GetOp32(size_t i)166   static inline uint64_t GetOp32(size_t i) {
167     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
168   }
GetEmit32(size_t,size_t emit)169   static inline uint64_t GetEmit32(size_t, size_t emit) {
170     return (emit < 2 ? (emit ? 135 : 1) : ((emit - 2) + 137));
171   }
GetOp33(size_t i)172   static inline uint64_t GetOp33(size_t i) {
173     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
174   }
GetEmit33(size_t,size_t emit)175   static inline uint64_t GetEmit33(size_t, size_t emit) {
176     return (emit < 2 ? (emit + 139) : ((emit - 2) ? 143 : 141));
177   }
GetOp34(size_t i)178   static inline uint64_t GetOp34(size_t i) {
179     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
180   }
GetEmit34(size_t,size_t emit)181   static inline uint64_t GetEmit34(size_t, size_t emit) {
182     return (emit < 1 ? (((void)emit, 147)) : ((emit - 1) + 149));
183   }
GetOp35(size_t i)184   static inline uint64_t GetOp35(size_t i) {
185     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
186   }
GetEmit35(size_t,size_t emit)187   static inline uint64_t GetEmit35(size_t, size_t emit) {
188     return (emit < 2 ? (emit ? 155 : 152) : ((emit - 2) + 157));
189   }
GetOp36(size_t i)190   static inline uint64_t GetOp36(size_t i) {
191     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
192   }
GetEmit36(size_t,size_t emit)193   static inline uint64_t GetEmit36(size_t, size_t emit) {
194     return (emit < 2 ? (emit + 165) : ((emit - 2) ? 174 : 168));
195   }
GetOp37(size_t i)196   static inline uint64_t GetOp37(size_t i) {
197     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
198   }
GetEmit37(size_t,size_t emit)199   static inline uint64_t GetEmit37(size_t, size_t emit) {
200     return (emit < 2 ? (emit ? 180 : 175) : ((emit - 2) + 182));
201   }
GetOp38(size_t i)202   static inline uint64_t GetOp38(size_t i) {
203     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
204   }
GetEmit38(size_t,size_t emit)205   static inline uint64_t GetEmit38(size_t, size_t emit) {
206     return (emit < 2 ? (emit ? 191 : 188) : ((emit - 2) ? 231 : 197));
207   }
GetOp40(size_t i)208   static inline uint64_t GetOp40(size_t i) {
209     return table40_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))];
210   }
GetEmit40(size_t,size_t emit)211   static inline uint64_t GetEmit40(size_t, size_t emit) {
212     return table40_0_emit_[emit];
213   }
GetOp39(size_t i)214   static inline uint64_t GetOp39(size_t i) {
215     return table39_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))];
216   }
GetEmit39(size_t,size_t emit)217   static inline uint64_t GetEmit39(size_t, size_t emit) {
218     return table39_0_emit_[emit];
219   }
GetOp42(size_t i)220   static inline uint64_t GetOp42(size_t i) {
221     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
222   }
GetEmit42(size_t,size_t emit)223   static inline uint64_t GetEmit42(size_t, size_t emit) {
224     return ((void)emit, 239);
225   }
GetOp41(size_t i)226   static inline uint64_t GetOp41(size_t i) {
227     return table41_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
228   }
GetEmit41(size_t,size_t emit)229   static inline uint64_t GetEmit41(size_t, size_t emit) {
230     return table41_0_emit_[emit];
231   }
GetOp44(size_t i)232   static inline uint64_t GetOp44(size_t i) { return table44_0_ops_[i]; }
GetEmit44(size_t,size_t emit)233   static inline uint64_t GetEmit44(size_t, size_t emit) {
234     return table44_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 table46_0_emit_[emit];
247   }
GetOp43(size_t i)248   static inline uint64_t GetOp43(size_t i) {
249     return table43_ops_[i >> 5][i & 0x1f];
250   }
GetEmit43(size_t i,size_t emit)251   static inline uint64_t GetEmit43(size_t i, size_t emit) {
252     return table43_emit_[i >> 5][emit];
253   }
254 
255  private:
256   static const uint8_t table2_0_emit_[10];
257   static const uint8_t table2_0_ops_[32];
258   static const uint8_t table3_0_emit_[36];
259   static const uint8_t table3_0_ops_[64];
260   static const uint8_t table1_0_emit_[68];
261   static const uint16_t table1_0_inner_[72];
262   static const uint8_t table1_0_outer_[128];
263   static const uint8_t table8_0_emit_[5];
264   static const uint8_t table8_0_inner_[7];
265   static const uint8_t table9_0_emit_[8];
266   static const uint8_t table9_0_inner_[10];
267   static const uint8_t table9_0_outer_[16];
268   static const uint8_t table10_0_emit_[10];
269   static const uint8_t table10_0_ops_[32];
270   static const uint8_t table11_0_emit_[16];
271   static const uint8_t table11_0_ops_[64];
272   static const uint8_t table12_0_emit_[18];
273   static const uint8_t table12_0_ops_[128];
274   static const uint8_t table13_0_emit_[40];
275   static const uint8_t table13_0_ops_[64];
276   static const uint8_t table13_1_emit_[40];
277   static const uint8_t table13_2_emit_[22];
278   static const uint8_t table13_2_ops_[64];
279   static const uint8_t table13_3_emit_[14];
280   static const uint8_t table13_3_ops_[64];
281   static const uint8_t* const table13_emit_[4];
282   static const uint8_t* const table13_ops_[4];
283   static const uint8_t table14_0_emit_[72];
284   static const uint16_t table14_0_ops_[64];
285   static const uint8_t table14_1_emit_[72];
286   static const uint8_t table14_2_emit_[72];
287   static const uint8_t table14_3_emit_[72];
288   static const uint8_t table14_4_emit_[72];
289   static const uint8_t table14_5_emit_[40];
290   static const uint16_t table14_5_ops_[64];
291   static const uint8_t table14_6_emit_[22];
292   static const uint16_t table14_6_ops_[64];
293   static const uint8_t table14_7_emit_[11];
294   static const uint16_t table14_7_ops_[64];
295   static const uint8_t* const table14_emit_[8];
296   static const uint16_t* const table14_ops_[8];
297   static const uint8_t table15_0_emit_[44];
298   static const uint16_t table15_0_ops_[64];
299   static const uint8_t table15_1_emit_[92];
300   static const uint16_t table15_1_ops_[64];
301   static const uint8_t table15_2_emit_[44];
302   static const uint8_t table15_3_emit_[92];
303   static const uint8_t table15_4_emit_[44];
304   static const uint8_t table15_5_emit_[92];
305   static const uint8_t table15_6_emit_[44];
306   static const uint8_t table15_7_emit_[92];
307   static const uint8_t table15_8_emit_[44];
308   static const uint8_t table15_9_emit_[92];
309   static const uint8_t table15_10_emit_[72];
310   static const uint8_t table15_11_emit_[72];
311   static const uint8_t table15_12_emit_[72];
312   static const uint8_t table15_13_emit_[40];
313   static const uint8_t table15_14_emit_[4];
314   static const uint16_t table15_14_ops_[64];
315   static const uint8_t table15_15_emit_[7];
316   static const uint16_t table15_15_ops_[64];
317   static const uint8_t* const table15_emit_[16];
318   static const uint16_t* const table15_ops_[16];
319   static const uint8_t table16_0_emit_[16];
320   static const uint16_t table16_0_ops_[64];
321   static const uint8_t table16_1_emit_[28];
322   static const uint16_t table16_1_ops_[64];
323   static const uint8_t table16_2_emit_[36];
324   static const uint16_t table16_2_ops_[64];
325   static const uint8_t table16_3_emit_[68];
326   static const uint16_t table16_3_ops_[64];
327   static const uint8_t table16_4_emit_[16];
328   static const uint8_t table16_5_emit_[28];
329   static const uint8_t table16_6_emit_[36];
330   static const uint8_t table16_7_emit_[68];
331   static const uint8_t table16_8_emit_[16];
332   static const uint8_t table16_9_emit_[28];
333   static const uint8_t table16_10_emit_[36];
334   static const uint8_t table16_11_emit_[68];
335   static const uint8_t table16_12_emit_[16];
336   static const uint8_t table16_13_emit_[28];
337   static const uint8_t table16_14_emit_[36];
338   static const uint8_t table16_15_emit_[68];
339   static const uint8_t table16_16_emit_[16];
340   static const uint8_t table16_17_emit_[28];
341   static const uint8_t table16_18_emit_[36];
342   static const uint8_t table16_19_emit_[68];
343   static const uint8_t table16_20_emit_[44];
344   static const uint8_t table16_21_emit_[92];
345   static const uint8_t table16_22_emit_[44];
346   static const uint8_t table16_23_emit_[92];
347   static const uint8_t table16_24_emit_[44];
348   static const uint8_t table16_25_emit_[92];
349   static const uint8_t table16_26_emit_[72];
350   static const uint8_t table16_27_emit_[72];
351   static const uint8_t table16_28_emit_[40];
352   static const uint8_t table16_29_emit_[40];
353   static const uint8_t table16_30_emit_[40];
354   static const uint8_t table16_31_emit_[5];
355   static const uint16_t table16_31_ops_[64];
356   static const uint8_t* const table16_emit_[32];
357   static const uint16_t* const table16_ops_[32];
358   static const uint16_t table17_0_ops_[128];
359   static const uint16_t table17_1_ops_[128];
360   static const uint16_t table17_2_ops_[128];
361   static const uint16_t table17_3_ops_[128];
362   static const uint16_t table17_20_ops_[128];
363   static const uint8_t table17_21_emit_[104];
364   static const uint16_t table17_21_ops_[128];
365   static const uint8_t table17_23_emit_[104];
366   static const uint8_t table17_25_emit_[104];
367   static const uint8_t table17_26_emit_[136];
368   static const uint16_t table17_26_ops_[128];
369   static const uint8_t table17_27_emit_[136];
370   static const uint8_t table17_28_emit_[144];
371   static const uint16_t table17_28_ops_[128];
372   static const uint8_t table17_29_emit_[144];
373   static const uint8_t table17_30_emit_[144];
374   static const uint8_t table17_31_emit_[46];
375   static const uint16_t table17_31_ops_[128];
376   static const uint8_t* const table17_emit_[32];
377   static const uint16_t* const table17_ops_[32];
378   static const uint8_t table18_0_emit_[60];
379   static const uint16_t table18_0_ops_[64];
380   static const uint8_t table18_1_emit_[60];
381   static const uint8_t table18_2_emit_[60];
382   static const uint8_t table18_3_emit_[60];
383   static const uint8_t table18_4_emit_[60];
384   static const uint8_t table18_5_emit_[8];
385   static const uint16_t table18_5_ops_[64];
386   static const uint8_t table18_6_emit_[8];
387   static const uint8_t table18_7_emit_[8];
388   static const uint8_t table18_8_emit_[8];
389   static const uint8_t table18_9_emit_[8];
390   static const uint8_t table18_10_emit_[8];
391   static const uint8_t table18_11_emit_[12];
392   static const uint16_t table18_11_ops_[64];
393   static const uint8_t table18_12_emit_[16];
394   static const uint16_t table18_12_ops_[64];
395   static const uint8_t table18_13_emit_[16];
396   static const uint8_t table18_14_emit_[16];
397   static const uint8_t table18_15_emit_[29];
398   static const uint16_t table18_15_ops_[64];
399   static const uint8_t table18_16_emit_[60];
400   static const uint8_t table18_17_emit_[60];
401   static const uint8_t table18_18_emit_[60];
402   static const uint8_t table18_19_emit_[60];
403   static const uint8_t table18_20_emit_[60];
404   static const uint8_t table18_21_emit_[8];
405   static const uint8_t table18_22_emit_[8];
406   static const uint8_t table18_23_emit_[8];
407   static const uint8_t table18_24_emit_[8];
408   static const uint8_t table18_25_emit_[8];
409   static const uint8_t table18_26_emit_[8];
410   static const uint8_t table18_27_emit_[12];
411   static const uint8_t table18_28_emit_[16];
412   static const uint8_t table18_29_emit_[16];
413   static const uint8_t table18_30_emit_[16];
414   static const uint8_t table18_31_emit_[29];
415   static const uint16_t table18_31_ops_[64];
416   static const uint8_t table18_32_emit_[60];
417   static const uint8_t table18_33_emit_[60];
418   static const uint8_t table18_34_emit_[60];
419   static const uint8_t table18_35_emit_[60];
420   static const uint8_t table18_36_emit_[60];
421   static const uint8_t table18_37_emit_[8];
422   static const uint8_t table18_38_emit_[8];
423   static const uint8_t table18_39_emit_[8];
424   static const uint8_t table18_40_emit_[8];
425   static const uint8_t table18_41_emit_[8];
426   static const uint8_t table18_42_emit_[8];
427   static const uint8_t table18_43_emit_[12];
428   static const uint8_t table18_44_emit_[16];
429   static const uint8_t table18_45_emit_[16];
430   static const uint8_t table18_46_emit_[16];
431   static const uint8_t table18_47_emit_[29];
432   static const uint16_t table18_47_ops_[64];
433   static const uint8_t table18_48_emit_[60];
434   static const uint8_t table18_49_emit_[60];
435   static const uint8_t table18_50_emit_[60];
436   static const uint8_t table18_51_emit_[60];
437   static const uint8_t table18_52_emit_[60];
438   static const uint8_t table18_53_emit_[8];
439   static const uint8_t table18_54_emit_[8];
440   static const uint8_t table18_55_emit_[8];
441   static const uint8_t table18_56_emit_[8];
442   static const uint8_t table18_57_emit_[8];
443   static const uint8_t table18_58_emit_[8];
444   static const uint8_t table18_59_emit_[12];
445   static const uint8_t table18_60_emit_[16];
446   static const uint8_t table18_61_emit_[16];
447   static const uint8_t table18_62_emit_[16];
448   static const uint8_t table18_63_emit_[29];
449   static const uint16_t table18_63_ops_[64];
450   static const uint8_t table18_64_emit_[60];
451   static const uint8_t table18_65_emit_[60];
452   static const uint8_t table18_66_emit_[60];
453   static const uint8_t table18_67_emit_[60];
454   static const uint8_t table18_68_emit_[60];
455   static const uint8_t table18_69_emit_[8];
456   static const uint8_t table18_70_emit_[8];
457   static const uint8_t table18_71_emit_[8];
458   static const uint8_t table18_72_emit_[8];
459   static const uint8_t table18_73_emit_[8];
460   static const uint8_t table18_74_emit_[8];
461   static const uint8_t table18_75_emit_[12];
462   static const uint8_t table18_76_emit_[16];
463   static const uint8_t table18_77_emit_[16];
464   static const uint8_t table18_78_emit_[16];
465   static const uint8_t table18_79_emit_[30];
466   static const uint16_t table18_79_ops_[64];
467   static const uint8_t table18_80_emit_[8];
468   static const uint8_t table18_81_emit_[8];
469   static const uint8_t table18_82_emit_[12];
470   static const uint8_t table18_83_emit_[16];
471   static const uint8_t table18_84_emit_[16];
472   static const uint8_t table18_85_emit_[20];
473   static const uint16_t table18_85_ops_[64];
474   static const uint8_t table18_86_emit_[32];
475   static const uint16_t table18_86_ops_[64];
476   static const uint8_t table18_87_emit_[36];
477   static const uint16_t table18_87_ops_[64];
478   static const uint8_t table18_88_emit_[8];
479   static const uint8_t table18_89_emit_[8];
480   static const uint8_t table18_90_emit_[12];
481   static const uint8_t table18_91_emit_[16];
482   static const uint8_t table18_92_emit_[16];
483   static const uint8_t table18_93_emit_[20];
484   static const uint8_t table18_94_emit_[32];
485   static const uint8_t table18_95_emit_[36];
486   static const uint8_t table18_96_emit_[8];
487   static const uint8_t table18_97_emit_[8];
488   static const uint8_t table18_98_emit_[12];
489   static const uint8_t table18_99_emit_[16];
490   static const uint8_t table18_100_emit_[16];
491   static const uint8_t table18_101_emit_[20];
492   static const uint8_t table18_102_emit_[32];
493   static const uint8_t table18_103_emit_[36];
494   static const uint8_t table18_104_emit_[16];
495   static const uint8_t table18_105_emit_[28];
496   static const uint16_t table18_105_ops_[64];
497   static const uint8_t table18_106_emit_[36];
498   static const uint16_t table18_106_ops_[64];
499   static const uint8_t table18_107_emit_[68];
500   static const uint16_t table18_107_ops_[64];
501   static const uint8_t table18_108_emit_[16];
502   static const uint8_t table18_109_emit_[28];
503   static const uint8_t table18_110_emit_[36];
504   static const uint8_t table18_111_emit_[68];
505   static const uint8_t table18_112_emit_[44];
506   static const uint16_t table18_112_ops_[64];
507   static const uint8_t table18_113_emit_[92];
508   static const uint16_t table18_113_ops_[64];
509   static const uint8_t table18_114_emit_[44];
510   static const uint8_t table18_115_emit_[92];
511   static const uint8_t table18_116_emit_[44];
512   static const uint8_t table18_117_emit_[92];
513   static const uint8_t table18_118_emit_[44];
514   static const uint8_t table18_119_emit_[92];
515   static const uint8_t table18_120_emit_[44];
516   static const uint8_t table18_121_emit_[92];
517   static const uint8_t table18_122_emit_[44];
518   static const uint8_t table18_123_emit_[92];
519   static const uint8_t table18_124_emit_[72];
520   static const uint16_t table18_124_ops_[64];
521   static const uint8_t table18_125_emit_[72];
522   static const uint8_t table18_126_emit_[40];
523   static const uint16_t table18_126_ops_[64];
524   static const uint8_t table18_127_emit_[31];
525   static const uint16_t table18_127_ops_[64];
526   static const uint8_t* const table18_emit_[128];
527   static const uint16_t* const table18_ops_[128];
528   static const uint8_t table7_0_emit_[1];
529   static const uint16_t table7_0_ops_[256];
530   static const uint8_t table7_8_emit_[1];
531   static const uint8_t table7_16_emit_[1];
532   static const uint8_t table7_24_emit_[1];
533   static const uint8_t table7_32_emit_[1];
534   static const uint8_t table7_40_emit_[1];
535   static const uint16_t table7_40_ops_[256];
536   static const uint8_t table7_44_emit_[1];
537   static const uint8_t table7_48_emit_[1];
538   static const uint8_t table7_52_emit_[1];
539   static const uint16_t table7_52_ops_[256];
540   static const uint8_t table7_54_emit_[1];
541   static const uint8_t table7_56_emit_[1];
542   static const uint16_t table7_56_ops_[256];
543   static const uint8_t table7_57_emit_[1];
544   static const uint8_t table7_58_emit_[1];
545   static const uint8_t table7_59_emit_[1];
546   static const uint8_t table7_60_emit_[1];
547   static const uint8_t table7_61_emit_[1];
548   static const uint8_t table7_62_emit_[2];
549   static const uint16_t table7_62_ops_[256];
550   static const uint8_t table7_63_emit_[27];
551   static const uint16_t table7_63_ops_[256];
552   static const uint8_t* const table7_emit_[64];
553   static const uint16_t* const table7_ops_[64];
554   static const uint8_t table40_0_emit_[6];
555   static const uint8_t table40_0_inner_[7];
556   static const uint8_t table39_0_emit_[10];
557   static const uint8_t table39_0_inner_[10];
558   static const uint8_t table41_0_emit_[7];
559   static const uint8_t table41_0_inner_[7];
560   static const uint8_t table44_0_emit_[15];
561   static const uint8_t table44_0_ops_[32];
562   static const uint8_t table45_0_emit_[34];
563   static const uint8_t table45_0_ops_[64];
564   static const uint8_t table46_0_emit_[63];
565   static const uint8_t table46_0_ops_[128];
566   static const uint8_t table47_0_ops_[256];
567   static const uint8_t table43_0_emit_[2];
568   static const uint16_t table43_0_ops_[32];
569   static const uint8_t table43_1_emit_[2];
570   static const uint8_t table43_2_emit_[2];
571   static const uint8_t table43_3_emit_[2];
572   static const uint8_t table43_4_emit_[2];
573   static const uint8_t table43_5_emit_[2];
574   static const uint8_t table43_6_emit_[2];
575   static const uint8_t table43_7_emit_[3];
576   static const uint16_t table43_7_ops_[32];
577   static const uint8_t table43_8_emit_[4];
578   static const uint16_t table43_8_ops_[32];
579   static const uint8_t table43_9_emit_[4];
580   static const uint8_t table43_10_emit_[4];
581   static const uint8_t table43_11_emit_[4];
582   static const uint8_t table43_12_emit_[7];
583   static const uint16_t table43_12_ops_[32];
584   static const uint8_t table43_13_emit_[8];
585   static const uint16_t table43_13_ops_[32];
586   static const uint8_t table43_14_emit_[8];
587   static const uint8_t table43_15_emit_[10];
588   static const uint16_t table43_15_ops_[32];
589   static const uint8_t* const table43_emit_[16];
590   static const uint16_t* const table43_ops_[16];
591 };
592 template <typename F>
593 class HuffDecoder : public HuffDecoderCommon {
594  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)595   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
596       : sink_(sink), begin_(begin), end_(end) {}
Run()597   bool Run() {
598     while (!done_) {
599       if (!RefillTo7()) {
600         Done0();
601         break;
602       }
603       const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
604       const auto op = GetOp1(index);
605       const int consumed = op & 7;
606       buffer_len_ -= consumed;
607       const auto emit_ofs = op >> 6;
608       switch ((op >> 3) & 7) {
609         case 0: {
610           sink_(GetEmit1(index, emit_ofs + 0));
611           break;
612         }
613         case 1: {
614           DecodeStep0();
615           break;
616         }
617         case 2: {
618           DecodeStep1();
619           break;
620         }
621         case 3: {
622           DecodeStep2();
623           break;
624         }
625         case 4: {
626           DecodeStep3();
627           break;
628         }
629       }
630     }
631     return ok_;
632   }
633 
634  private:
RefillTo7()635   bool RefillTo7() {
636     switch (buffer_len_) {
637       case 0: {
638         return Read1to8Bytes();
639       }
640       case 1:
641       case 2:
642       case 3:
643       case 4:
644       case 5:
645       case 6: {
646         return Read1to7Bytes();
647       }
648     }
649     return true;
650   }
Read1to8Bytes()651   bool Read1to8Bytes() {
652     switch (end_ - begin_) {
653       case 0: {
654         return false;
655       }
656       case 1: {
657         Fill1();
658         return true;
659       }
660       case 2: {
661         Fill2();
662         return true;
663       }
664       case 3: {
665         Fill3();
666         return true;
667       }
668       case 4: {
669         Fill4();
670         return true;
671       }
672       case 5: {
673         Fill5();
674         return true;
675       }
676       case 6: {
677         Fill6();
678         return true;
679       }
680       case 7: {
681         Fill7();
682         return true;
683       }
684       default: {
685         Fill8();
686         return true;
687       }
688     }
689   }
Fill1()690   void Fill1() {
691     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
692     begin_ += 1;
693     buffer_len_ += 8;
694   }
Fill2()695   void Fill2() {
696     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
697               (static_cast<uint64_t>(begin_[1]) << 0);
698     begin_ += 2;
699     buffer_len_ += 16;
700   }
Fill3()701   void Fill3() {
702     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
703               (static_cast<uint64_t>(begin_[1]) << 8) |
704               (static_cast<uint64_t>(begin_[2]) << 0);
705     begin_ += 3;
706     buffer_len_ += 24;
707   }
Fill4()708   void Fill4() {
709     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
710               (static_cast<uint64_t>(begin_[1]) << 16) |
711               (static_cast<uint64_t>(begin_[2]) << 8) |
712               (static_cast<uint64_t>(begin_[3]) << 0);
713     begin_ += 4;
714     buffer_len_ += 32;
715   }
Fill5()716   void Fill5() {
717     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
718               (static_cast<uint64_t>(begin_[1]) << 24) |
719               (static_cast<uint64_t>(begin_[2]) << 16) |
720               (static_cast<uint64_t>(begin_[3]) << 8) |
721               (static_cast<uint64_t>(begin_[4]) << 0);
722     begin_ += 5;
723     buffer_len_ += 40;
724   }
Fill6()725   void Fill6() {
726     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
727               (static_cast<uint64_t>(begin_[1]) << 32) |
728               (static_cast<uint64_t>(begin_[2]) << 24) |
729               (static_cast<uint64_t>(begin_[3]) << 16) |
730               (static_cast<uint64_t>(begin_[4]) << 8) |
731               (static_cast<uint64_t>(begin_[5]) << 0);
732     begin_ += 6;
733     buffer_len_ += 48;
734   }
Fill7()735   void Fill7() {
736     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
737               (static_cast<uint64_t>(begin_[1]) << 40) |
738               (static_cast<uint64_t>(begin_[2]) << 32) |
739               (static_cast<uint64_t>(begin_[3]) << 24) |
740               (static_cast<uint64_t>(begin_[4]) << 16) |
741               (static_cast<uint64_t>(begin_[5]) << 8) |
742               (static_cast<uint64_t>(begin_[6]) << 0);
743     begin_ += 7;
744     buffer_len_ += 56;
745   }
Fill8()746   void Fill8() {
747     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
748               (static_cast<uint64_t>(begin_[1]) << 48) |
749               (static_cast<uint64_t>(begin_[2]) << 40) |
750               (static_cast<uint64_t>(begin_[3]) << 32) |
751               (static_cast<uint64_t>(begin_[4]) << 24) |
752               (static_cast<uint64_t>(begin_[5]) << 16) |
753               (static_cast<uint64_t>(begin_[6]) << 8) |
754               (static_cast<uint64_t>(begin_[7]) << 0);
755     begin_ += 8;
756     buffer_len_ += 64;
757   }
Read1to7Bytes()758   bool Read1to7Bytes() {
759     switch (end_ - begin_) {
760       case 0: {
761         return false;
762       }
763       case 1: {
764         Fill1();
765         return true;
766       }
767       case 2: {
768         Fill2();
769         return true;
770       }
771       case 3: {
772         Fill3();
773         return true;
774       }
775       case 4: {
776         Fill4();
777         return true;
778       }
779       case 5: {
780         Fill5();
781         return true;
782       }
783       case 6: {
784         Fill6();
785         return true;
786       }
787       default: {
788         Fill7();
789         return true;
790       }
791     }
792   }
Done0()793   void Done0() {
794     done_ = true;
795     switch (buffer_len_) {
796       case 1:
797       case 2:
798       case 3:
799       case 4: {
800         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
801         return;
802       }
803       case 5: {
804         const auto index = buffer_ & 31;
805         const auto op = GetOp2(index);
806         switch (op & 3) {
807           case 0: {
808             sink_(GetEmit2(index, (op >> 2) + 0));
809             break;
810           }
811           case 1: {
812             ok_ = false;
813             break;
814           }
815         }
816         return;
817       }
818       case 6: {
819         const auto index = buffer_ & 63;
820         const auto op = GetOp3(index);
821         switch (op & 3) {
822           case 0: {
823             ok_ = false;
824             break;
825           }
826           case 1: {
827             sink_(GetEmit3(index, (op >> 2) + 0));
828             break;
829           }
830         }
831         return;
832       }
833       case 0: {
834         return;
835       }
836     }
837   }
DecodeStep0()838   void DecodeStep0() {
839     if (!RefillTo1()) {
840       Done1();
841       return;
842     }
843     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
844     const auto op = GetOp4(index);
845     const int consumed = op & 1;
846     buffer_len_ -= consumed;
847     const auto emit_ofs = op >> 1;
848     sink_(GetEmit4(index, emit_ofs + 0));
849   }
RefillTo1()850   bool RefillTo1() {
851     switch (buffer_len_) {
852       case 0: {
853         return Read1to8Bytes();
854       }
855     }
856     return true;
857   }
Done1()858   void Done1() {
859     done_ = true;
860     ok_ = false;
861   }
DecodeStep1()862   void DecodeStep1() {
863     if (!RefillTo1()) {
864       Done2();
865       return;
866     }
867     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
868     const auto op = GetOp5(index);
869     const int consumed = op & 1;
870     buffer_len_ -= consumed;
871     const auto emit_ofs = op >> 1;
872     sink_(GetEmit5(index, emit_ofs + 0));
873   }
Done2()874   void Done2() {
875     done_ = true;
876     ok_ = false;
877   }
DecodeStep2()878   void DecodeStep2() {
879     if (!RefillTo1()) {
880       Done3();
881       return;
882     }
883     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
884     const auto op = GetOp6(index);
885     const int consumed = op & 1;
886     buffer_len_ -= consumed;
887     const auto emit_ofs = op >> 1;
888     sink_(GetEmit6(index, emit_ofs + 0));
889   }
Done3()890   void Done3() {
891     done_ = true;
892     ok_ = false;
893   }
DecodeStep3()894   void DecodeStep3() {
895     if (!RefillTo14()) {
896       Done4();
897       return;
898     }
899     const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff;
900     const auto op = GetOp7(index);
901     const int consumed = op & 15;
902     buffer_len_ -= consumed;
903     const auto emit_ofs = op >> 9;
904     switch ((op >> 4) & 31) {
905       case 0: {
906         sink_(GetEmit7(index, emit_ofs + 0));
907         break;
908       }
909       case 1: {
910         DecodeStep4();
911         break;
912       }
913       case 2: {
914         DecodeStep5();
915         break;
916       }
917       case 3: {
918         DecodeStep6();
919         break;
920       }
921       case 4: {
922         DecodeStep7();
923         break;
924       }
925       case 5: {
926         DecodeStep8();
927         break;
928       }
929       case 6: {
930         DecodeStep9();
931         break;
932       }
933       case 7: {
934         DecodeStep10();
935         break;
936       }
937       case 8: {
938         DecodeStep11();
939         break;
940       }
941       case 9: {
942         DecodeStep12();
943         break;
944       }
945       case 10: {
946         DecodeStep13();
947         break;
948       }
949       case 11: {
950         DecodeStep14();
951         break;
952       }
953       case 12: {
954         DecodeStep15();
955         break;
956       }
957       case 13: {
958         DecodeStep16();
959         break;
960       }
961       case 14: {
962         DecodeStep17();
963         break;
964       }
965       case 15: {
966         DecodeStep18();
967         break;
968       }
969       case 16: {
970         DecodeStep19();
971         break;
972       }
973       case 17: {
974         DecodeStep20();
975         break;
976       }
977       case 18: {
978         DecodeStep21();
979         break;
980       }
981       case 19: {
982         DecodeStep22();
983         break;
984       }
985       case 20: {
986         DecodeStep23();
987         break;
988       }
989       case 21: {
990         DecodeStep25();
991         break;
992       }
993       case 22: {
994         DecodeStep24();
995         break;
996       }
997       case 23: {
998         DecodeStep26();
999         break;
1000       }
1001     }
1002   }
RefillTo14()1003   bool RefillTo14() {
1004     switch (buffer_len_) {
1005       case 0: {
1006         return Read2to8Bytes();
1007       }
1008       case 1:
1009       case 2:
1010       case 3:
1011       case 4:
1012       case 5: {
1013         return Read2to7Bytes();
1014       }
1015       case 6:
1016       case 7:
1017       case 8: {
1018         return Read1to7Bytes();
1019       }
1020       case 9:
1021       case 10:
1022       case 11:
1023       case 12:
1024       case 13: {
1025         return Read1to6Bytes();
1026       }
1027     }
1028     return true;
1029   }
Read2to8Bytes()1030   bool Read2to8Bytes() {
1031     switch (end_ - begin_) {
1032       case 0:
1033       case 1: {
1034         return false;
1035       }
1036       case 2: {
1037         Fill2();
1038         return true;
1039       }
1040       case 3: {
1041         Fill3();
1042         return true;
1043       }
1044       case 4: {
1045         Fill4();
1046         return true;
1047       }
1048       case 5: {
1049         Fill5();
1050         return true;
1051       }
1052       case 6: {
1053         Fill6();
1054         return true;
1055       }
1056       case 7: {
1057         Fill7();
1058         return true;
1059       }
1060       default: {
1061         Fill8();
1062         return true;
1063       }
1064     }
1065   }
Read2to7Bytes()1066   bool Read2to7Bytes() {
1067     switch (end_ - begin_) {
1068       case 0:
1069       case 1: {
1070         return false;
1071       }
1072       case 2: {
1073         Fill2();
1074         return true;
1075       }
1076       case 3: {
1077         Fill3();
1078         return true;
1079       }
1080       case 4: {
1081         Fill4();
1082         return true;
1083       }
1084       case 5: {
1085         Fill5();
1086         return true;
1087       }
1088       case 6: {
1089         Fill6();
1090         return true;
1091       }
1092       default: {
1093         Fill7();
1094         return true;
1095       }
1096     }
1097   }
Read1to6Bytes()1098   bool Read1to6Bytes() {
1099     switch (end_ - begin_) {
1100       case 0: {
1101         return false;
1102       }
1103       case 1: {
1104         Fill1();
1105         return true;
1106       }
1107       case 2: {
1108         Fill2();
1109         return true;
1110       }
1111       case 3: {
1112         Fill3();
1113         return true;
1114       }
1115       case 4: {
1116         Fill4();
1117         return true;
1118       }
1119       case 5: {
1120         Fill5();
1121         return true;
1122       }
1123       default: {
1124         Fill6();
1125         return true;
1126       }
1127     }
1128   }
Done4()1129   void Done4() {
1130     done_ = true;
1131     switch (end_ - begin_) {
1132       case 1: {
1133         Fill1();
1134         break;
1135       }
1136     }
1137     switch (buffer_len_) {
1138       case 1:
1139       case 2: {
1140         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1141         return;
1142       }
1143       case 3: {
1144         const auto index = buffer_ & 7;
1145         const auto op = GetOp8(index);
1146         switch (op & 3) {
1147           case 0: {
1148             sink_(GetEmit8(index, (op >> 2) + 0));
1149             break;
1150           }
1151           case 1: {
1152             ok_ = false;
1153             break;
1154           }
1155         }
1156         return;
1157       }
1158       case 4: {
1159         const auto index = buffer_ & 15;
1160         const auto op = GetOp9(index);
1161         switch (op & 3) {
1162           case 0: {
1163             ok_ = false;
1164             break;
1165           }
1166           case 1: {
1167             sink_(GetEmit9(index, (op >> 2) + 0));
1168             break;
1169           }
1170         }
1171         return;
1172       }
1173       case 5: {
1174         const auto index = buffer_ & 31;
1175         const auto op = GetOp10(index);
1176         switch (op & 3) {
1177           case 0: {
1178             ok_ = false;
1179             break;
1180           }
1181           case 1: {
1182             sink_(GetEmit10(index, (op >> 2) + 0));
1183             break;
1184           }
1185         }
1186         return;
1187       }
1188       case 6: {
1189         const auto index = buffer_ & 63;
1190         const auto op = GetOp11(index);
1191         switch (op & 3) {
1192           case 0: {
1193             ok_ = false;
1194             break;
1195           }
1196           case 1: {
1197             sink_(GetEmit11(index, (op >> 2) + 0));
1198             break;
1199           }
1200         }
1201         return;
1202       }
1203       case 7: {
1204         const auto index = buffer_ & 127;
1205         const auto op = GetOp12(index);
1206         switch (op & 3) {
1207           case 0: {
1208             ok_ = false;
1209             break;
1210           }
1211           case 1: {
1212             sink_(GetEmit12(index, (op >> 2) + 0));
1213             break;
1214           }
1215         }
1216         return;
1217       }
1218       case 8: {
1219         const auto index = buffer_ & 255;
1220         const auto op = GetOp13(index);
1221         switch (op & 3) {
1222           case 0: {
1223             sink_(GetEmit13(index, (op >> 2) + 0));
1224             sink_(GetEmit13(index, (op >> 2) + 1));
1225             break;
1226           }
1227           case 1: {
1228             ok_ = false;
1229             break;
1230           }
1231           case 2: {
1232             sink_(GetEmit13(index, (op >> 2) + 0));
1233             break;
1234           }
1235         }
1236         return;
1237       }
1238       case 9: {
1239         const auto index = buffer_ & 511;
1240         const auto op = GetOp14(index);
1241         switch (op & 3) {
1242           case 0: {
1243             ok_ = false;
1244             break;
1245           }
1246           case 1: {
1247             sink_(GetEmit14(index, (op >> 2) + 0));
1248             sink_(GetEmit14(index, (op >> 2) + 1));
1249             break;
1250           }
1251           case 2: {
1252             sink_(GetEmit14(index, (op >> 2) + 0));
1253             break;
1254           }
1255         }
1256         return;
1257       }
1258       case 10: {
1259         const auto index = buffer_ & 1023;
1260         const auto op = GetOp15(index);
1261         switch (op & 3) {
1262           case 0: {
1263             ok_ = false;
1264             break;
1265           }
1266           case 1: {
1267             sink_(GetEmit15(index, (op >> 2) + 0));
1268             sink_(GetEmit15(index, (op >> 2) + 1));
1269             break;
1270           }
1271           case 2: {
1272             sink_(GetEmit15(index, (op >> 2) + 0));
1273             break;
1274           }
1275         }
1276         return;
1277       }
1278       case 11: {
1279         const auto index = buffer_ & 2047;
1280         const auto op = GetOp16(index);
1281         switch (op & 3) {
1282           case 0: {
1283             ok_ = false;
1284             break;
1285           }
1286           case 1: {
1287             sink_(GetEmit16(index, (op >> 2) + 0));
1288             sink_(GetEmit16(index, (op >> 2) + 1));
1289             break;
1290           }
1291           case 2: {
1292             sink_(GetEmit16(index, (op >> 2) + 0));
1293             break;
1294           }
1295         }
1296         return;
1297       }
1298       case 12: {
1299         const auto index = buffer_ & 4095;
1300         const auto op = GetOp17(index);
1301         switch (op & 3) {
1302           case 0: {
1303             ok_ = false;
1304             break;
1305           }
1306           case 1: {
1307             sink_(GetEmit17(index, (op >> 2) + 0));
1308             sink_(GetEmit17(index, (op >> 2) + 1));
1309             break;
1310           }
1311           case 2: {
1312             sink_(GetEmit17(index, (op >> 2) + 0));
1313             break;
1314           }
1315         }
1316         return;
1317       }
1318       case 13: {
1319         const auto index = buffer_ & 8191;
1320         const auto op = GetOp18(index);
1321         switch (op & 7) {
1322           case 0: {
1323             sink_(GetEmit18(index, (op >> 3) + 0));
1324             sink_(GetEmit18(index, (op >> 3) + 1));
1325             sink_(GetEmit18(index, (op >> 3) + 2));
1326             break;
1327           }
1328           case 1: {
1329             ok_ = false;
1330             break;
1331           }
1332           case 2: {
1333             sink_(GetEmit18(index, (op >> 3) + 0));
1334             sink_(GetEmit18(index, (op >> 3) + 1));
1335             break;
1336           }
1337           case 3: {
1338             sink_(GetEmit18(index, (op >> 3) + 0));
1339             break;
1340           }
1341         }
1342         return;
1343       }
1344       case 0: {
1345         return;
1346       }
1347     }
1348   }
DecodeStep4()1349   void DecodeStep4() {
1350     if (!RefillTo1()) {
1351       Done5();
1352       return;
1353     }
1354     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1355     const auto op = GetOp19(index);
1356     const int consumed = op & 1;
1357     buffer_len_ -= consumed;
1358     const auto emit_ofs = op >> 1;
1359     sink_(GetEmit19(index, emit_ofs + 0));
1360   }
Done5()1361   void Done5() {
1362     done_ = true;
1363     ok_ = false;
1364   }
DecodeStep5()1365   void DecodeStep5() {
1366     if (!RefillTo1()) {
1367       Done6();
1368       return;
1369     }
1370     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1371     const auto op = GetOp20(index);
1372     const int consumed = op & 1;
1373     buffer_len_ -= consumed;
1374     const auto emit_ofs = op >> 1;
1375     sink_(GetEmit20(index, emit_ofs + 0));
1376   }
Done6()1377   void Done6() {
1378     done_ = true;
1379     ok_ = false;
1380   }
DecodeStep6()1381   void DecodeStep6() {
1382     if (!RefillTo1()) {
1383       Done7();
1384       return;
1385     }
1386     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1387     const auto op = GetOp21(index);
1388     const int consumed = op & 1;
1389     buffer_len_ -= consumed;
1390     const auto emit_ofs = op >> 1;
1391     sink_(GetEmit21(index, emit_ofs + 0));
1392   }
Done7()1393   void Done7() {
1394     done_ = true;
1395     ok_ = false;
1396   }
DecodeStep7()1397   void DecodeStep7() {
1398     if (!RefillTo1()) {
1399       Done8();
1400       return;
1401     }
1402     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1403     const auto op = GetOp22(index);
1404     const int consumed = op & 1;
1405     buffer_len_ -= consumed;
1406     const auto emit_ofs = op >> 1;
1407     sink_(GetEmit22(index, emit_ofs + 0));
1408   }
Done8()1409   void Done8() {
1410     done_ = true;
1411     ok_ = false;
1412   }
DecodeStep8()1413   void DecodeStep8() {
1414     if (!RefillTo1()) {
1415       Done9();
1416       return;
1417     }
1418     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1419     const auto op = GetOp23(index);
1420     const int consumed = op & 1;
1421     buffer_len_ -= consumed;
1422     const auto emit_ofs = op >> 1;
1423     sink_(GetEmit23(index, emit_ofs + 0));
1424   }
Done9()1425   void Done9() {
1426     done_ = true;
1427     ok_ = false;
1428   }
DecodeStep9()1429   void DecodeStep9() {
1430     if (!RefillTo1()) {
1431       Done10();
1432       return;
1433     }
1434     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1435     const auto op = GetOp24(index);
1436     const int consumed = op & 1;
1437     buffer_len_ -= consumed;
1438     const auto emit_ofs = op >> 1;
1439     sink_(GetEmit24(index, emit_ofs + 0));
1440   }
Done10()1441   void Done10() {
1442     done_ = true;
1443     ok_ = false;
1444   }
DecodeStep10()1445   void DecodeStep10() {
1446     if (!RefillTo1()) {
1447       Done11();
1448       return;
1449     }
1450     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1451     const auto op = GetOp25(index);
1452     const int consumed = op & 1;
1453     buffer_len_ -= consumed;
1454     const auto emit_ofs = op >> 1;
1455     sink_(GetEmit25(index, emit_ofs + 0));
1456   }
Done11()1457   void Done11() {
1458     done_ = true;
1459     ok_ = false;
1460   }
DecodeStep11()1461   void DecodeStep11() {
1462     if (!RefillTo1()) {
1463       Done12();
1464       return;
1465     }
1466     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1467     const auto op = GetOp26(index);
1468     const int consumed = op & 1;
1469     buffer_len_ -= consumed;
1470     const auto emit_ofs = op >> 1;
1471     sink_(GetEmit26(index, emit_ofs + 0));
1472   }
Done12()1473   void Done12() {
1474     done_ = true;
1475     ok_ = false;
1476   }
DecodeStep12()1477   void DecodeStep12() {
1478     if (!RefillTo1()) {
1479       Done13();
1480       return;
1481     }
1482     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1483     const auto op = GetOp27(index);
1484     const int consumed = op & 1;
1485     buffer_len_ -= consumed;
1486     const auto emit_ofs = op >> 1;
1487     sink_(GetEmit27(index, emit_ofs + 0));
1488   }
Done13()1489   void Done13() {
1490     done_ = true;
1491     ok_ = false;
1492   }
DecodeStep13()1493   void DecodeStep13() {
1494     if (!RefillTo1()) {
1495       Done14();
1496       return;
1497     }
1498     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1499     const auto op = GetOp28(index);
1500     const int consumed = op & 1;
1501     buffer_len_ -= consumed;
1502     const auto emit_ofs = op >> 1;
1503     sink_(GetEmit28(index, emit_ofs + 0));
1504   }
Done14()1505   void Done14() {
1506     done_ = true;
1507     ok_ = false;
1508   }
DecodeStep14()1509   void DecodeStep14() {
1510     if (!RefillTo1()) {
1511       Done15();
1512       return;
1513     }
1514     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1515     const auto op = GetOp29(index);
1516     const int consumed = op & 1;
1517     buffer_len_ -= consumed;
1518     const auto emit_ofs = op >> 1;
1519     sink_(GetEmit29(index, emit_ofs + 0));
1520   }
Done15()1521   void Done15() {
1522     done_ = true;
1523     ok_ = false;
1524   }
DecodeStep15()1525   void DecodeStep15() {
1526     if (!RefillTo1()) {
1527       Done16();
1528       return;
1529     }
1530     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1531     const auto op = GetOp30(index);
1532     const int consumed = op & 1;
1533     buffer_len_ -= consumed;
1534     const auto emit_ofs = op >> 1;
1535     sink_(GetEmit30(index, emit_ofs + 0));
1536   }
Done16()1537   void Done16() {
1538     done_ = true;
1539     ok_ = false;
1540   }
DecodeStep16()1541   void DecodeStep16() {
1542     if (!RefillTo1()) {
1543       Done17();
1544       return;
1545     }
1546     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1547     const auto op = GetOp31(index);
1548     const int consumed = op & 1;
1549     buffer_len_ -= consumed;
1550     const auto emit_ofs = op >> 1;
1551     sink_(GetEmit31(index, emit_ofs + 0));
1552   }
Done17()1553   void Done17() {
1554     done_ = true;
1555     ok_ = false;
1556   }
DecodeStep17()1557   void DecodeStep17() {
1558     if (!RefillTo2()) {
1559       Done18();
1560       return;
1561     }
1562     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1563     const auto op = GetOp32(index);
1564     const int consumed = op & 3;
1565     buffer_len_ -= consumed;
1566     const auto emit_ofs = op >> 2;
1567     sink_(GetEmit32(index, emit_ofs + 0));
1568   }
RefillTo2()1569   bool RefillTo2() {
1570     switch (buffer_len_) {
1571       case 0: {
1572         return Read1to8Bytes();
1573       }
1574       case 1: {
1575         return Read1to7Bytes();
1576       }
1577     }
1578     return true;
1579   }
Done18()1580   void Done18() {
1581     done_ = true;
1582     switch (buffer_len_) {
1583       case 1:
1584       case 0: {
1585         ok_ = false;
1586         return;
1587       }
1588     }
1589   }
DecodeStep18()1590   void DecodeStep18() {
1591     if (!RefillTo2()) {
1592       Done19();
1593       return;
1594     }
1595     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1596     const auto op = GetOp33(index);
1597     const int consumed = op & 3;
1598     buffer_len_ -= consumed;
1599     const auto emit_ofs = op >> 2;
1600     sink_(GetEmit33(index, emit_ofs + 0));
1601   }
Done19()1602   void Done19() {
1603     done_ = true;
1604     switch (buffer_len_) {
1605       case 1:
1606       case 0: {
1607         ok_ = false;
1608         return;
1609       }
1610     }
1611   }
DecodeStep19()1612   void DecodeStep19() {
1613     if (!RefillTo2()) {
1614       Done20();
1615       return;
1616     }
1617     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1618     const auto op = GetOp34(index);
1619     const int consumed = op & 3;
1620     buffer_len_ -= consumed;
1621     const auto emit_ofs = op >> 2;
1622     sink_(GetEmit34(index, emit_ofs + 0));
1623   }
Done20()1624   void Done20() {
1625     done_ = true;
1626     switch (buffer_len_) {
1627       case 1:
1628       case 0: {
1629         ok_ = false;
1630         return;
1631       }
1632     }
1633   }
DecodeStep20()1634   void DecodeStep20() {
1635     if (!RefillTo2()) {
1636       Done21();
1637       return;
1638     }
1639     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1640     const auto op = GetOp35(index);
1641     const int consumed = op & 3;
1642     buffer_len_ -= consumed;
1643     const auto emit_ofs = op >> 2;
1644     sink_(GetEmit35(index, emit_ofs + 0));
1645   }
Done21()1646   void Done21() {
1647     done_ = true;
1648     switch (buffer_len_) {
1649       case 1:
1650       case 0: {
1651         ok_ = false;
1652         return;
1653       }
1654     }
1655   }
DecodeStep21()1656   void DecodeStep21() {
1657     if (!RefillTo2()) {
1658       Done22();
1659       return;
1660     }
1661     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1662     const auto op = GetOp36(index);
1663     const int consumed = op & 3;
1664     buffer_len_ -= consumed;
1665     const auto emit_ofs = op >> 2;
1666     sink_(GetEmit36(index, emit_ofs + 0));
1667   }
Done22()1668   void Done22() {
1669     done_ = true;
1670     switch (buffer_len_) {
1671       case 1:
1672       case 0: {
1673         ok_ = false;
1674         return;
1675       }
1676     }
1677   }
DecodeStep22()1678   void DecodeStep22() {
1679     if (!RefillTo2()) {
1680       Done23();
1681       return;
1682     }
1683     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1684     const auto op = GetOp37(index);
1685     const int consumed = op & 3;
1686     buffer_len_ -= consumed;
1687     const auto emit_ofs = op >> 2;
1688     sink_(GetEmit37(index, emit_ofs + 0));
1689   }
Done23()1690   void Done23() {
1691     done_ = true;
1692     switch (buffer_len_) {
1693       case 1:
1694       case 0: {
1695         ok_ = false;
1696         return;
1697       }
1698     }
1699   }
DecodeStep23()1700   void DecodeStep23() {
1701     if (!RefillTo2()) {
1702       Done24();
1703       return;
1704     }
1705     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1706     const auto op = GetOp38(index);
1707     const int consumed = op & 3;
1708     buffer_len_ -= consumed;
1709     const auto emit_ofs = op >> 2;
1710     sink_(GetEmit38(index, emit_ofs + 0));
1711   }
Done24()1712   void Done24() {
1713     done_ = true;
1714     switch (buffer_len_) {
1715       case 1:
1716       case 0: {
1717         ok_ = false;
1718         return;
1719       }
1720     }
1721   }
DecodeStep24()1722   void DecodeStep24() {
1723     if (!RefillTo4()) {
1724       Done25();
1725       return;
1726     }
1727     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1728     const auto op = GetOp39(index);
1729     const int consumed = op & 7;
1730     buffer_len_ -= consumed;
1731     const auto emit_ofs = op >> 3;
1732     sink_(GetEmit39(index, emit_ofs + 0));
1733   }
RefillTo4()1734   bool RefillTo4() {
1735     switch (buffer_len_) {
1736       case 0: {
1737         return Read1to8Bytes();
1738       }
1739       case 1:
1740       case 2:
1741       case 3: {
1742         return Read1to7Bytes();
1743       }
1744     }
1745     return true;
1746   }
Done25()1747   void Done25() {
1748     done_ = true;
1749     switch (buffer_len_) {
1750       case 1:
1751       case 2:
1752       case 0: {
1753         ok_ = false;
1754         return;
1755       }
1756       case 3: {
1757         const auto index = buffer_ & 7;
1758         const auto op = GetOp40(index);
1759         switch (op & 1) {
1760           case 0: {
1761             sink_(GetEmit40(index, (op >> 1) + 0));
1762             break;
1763           }
1764           case 1: {
1765             ok_ = false;
1766             break;
1767           }
1768         }
1769         return;
1770       }
1771     }
1772   }
DecodeStep25()1773   void DecodeStep25() {
1774     if (!RefillTo3()) {
1775       Done26();
1776       return;
1777     }
1778     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1779     const auto op = GetOp41(index);
1780     const int consumed = op & 3;
1781     buffer_len_ -= consumed;
1782     const auto emit_ofs = op >> 2;
1783     sink_(GetEmit41(index, emit_ofs + 0));
1784   }
RefillTo3()1785   bool RefillTo3() {
1786     switch (buffer_len_) {
1787       case 0: {
1788         return Read1to8Bytes();
1789       }
1790       case 1:
1791       case 2: {
1792         return Read1to7Bytes();
1793       }
1794     }
1795     return true;
1796   }
Done26()1797   void Done26() {
1798     done_ = true;
1799     switch (buffer_len_) {
1800       case 1:
1801       case 0: {
1802         ok_ = false;
1803         return;
1804       }
1805       case 2: {
1806         const auto index = buffer_ & 3;
1807         const auto op = GetOp42(index);
1808         switch (op & 1) {
1809           case 0: {
1810             sink_(GetEmit42(index, (op >> 1) + 0));
1811             break;
1812           }
1813           case 1: {
1814             ok_ = false;
1815             break;
1816           }
1817         }
1818         return;
1819       }
1820     }
1821   }
DecodeStep26()1822   void DecodeStep26() {
1823     if (!RefillTo9()) {
1824       Done27();
1825       return;
1826     }
1827     const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
1828     const auto op = GetOp43(index);
1829     const int consumed = op & 15;
1830     buffer_len_ -= consumed;
1831     const auto emit_ofs = op >> 5;
1832     switch ((op >> 4) & 1) {
1833       case 0: {
1834         sink_(GetEmit43(index, emit_ofs + 0));
1835         break;
1836       }
1837       case 1: {
1838         begin_ = end_;
1839         buffer_len_ = 0;
1840         break;
1841       }
1842     }
1843   }
RefillTo9()1844   bool RefillTo9() {
1845     switch (buffer_len_) {
1846       case 0: {
1847         return Read2to8Bytes();
1848       }
1849       case 1:
1850       case 2:
1851       case 3:
1852       case 4:
1853       case 5:
1854       case 6:
1855       case 7:
1856       case 8: {
1857         return Read1to7Bytes();
1858       }
1859     }
1860     return true;
1861   }
Done27()1862   void Done27() {
1863     done_ = true;
1864     switch (end_ - begin_) {
1865       case 1: {
1866         Fill1();
1867         break;
1868       }
1869     }
1870     switch (buffer_len_) {
1871       case 1:
1872       case 2:
1873       case 3:
1874       case 4: {
1875         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1876         return;
1877       }
1878       case 5: {
1879         const auto index = buffer_ & 31;
1880         const auto op = GetOp44(index);
1881         switch (op & 3) {
1882           case 0: {
1883             sink_(GetEmit44(index, (op >> 2) + 0));
1884             break;
1885           }
1886           case 1: {
1887             ok_ = false;
1888             break;
1889           }
1890         }
1891         return;
1892       }
1893       case 6: {
1894         const auto index = buffer_ & 63;
1895         const auto op = GetOp45(index);
1896         switch (op & 3) {
1897           case 0: {
1898             ok_ = false;
1899             break;
1900           }
1901           case 1: {
1902             sink_(GetEmit45(index, (op >> 2) + 0));
1903             break;
1904           }
1905         }
1906         return;
1907       }
1908       case 7: {
1909         const auto index = buffer_ & 127;
1910         const auto op = GetOp46(index);
1911         switch (op & 3) {
1912           case 0: {
1913             ok_ = false;
1914             break;
1915           }
1916           case 1: {
1917             sink_(GetEmit46(index, (op >> 2) + 0));
1918             break;
1919           }
1920         }
1921         return;
1922       }
1923       case 8: {
1924         const auto index = buffer_ & 255;
1925         const auto op = GetOp47(index);
1926         switch (op & 3) {
1927           case 0: {
1928             ok_ = false;
1929             break;
1930           }
1931           case 1: {
1932             sink_(GetEmit47(index, (op >> 2) + 0));
1933             break;
1934           }
1935         }
1936         return;
1937       }
1938       case 0: {
1939         return;
1940       }
1941     }
1942   }
1943   F sink_;
1944   const uint8_t* begin_;
1945   const uint8_t* const end_;
1946   uint64_t buffer_ = 0;
1947   int buffer_len_ = 0;
1948   bool ok_ = true;
1949   bool done_ = false;
1950 };
1951 }  // namespace geometry_7_14_9
1952 }  // namespace grpc_core
1953 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_14_9_H
1954