xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_7_13_10.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_13_10_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_13_10_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_7_13_10 {
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   }
GetOp7(size_t i)108   static inline uint64_t GetOp7(size_t i) {
109     return table7_ops_[i >> 8][i & 0xff];
110   }
GetEmit7(size_t i,size_t emit)111   static inline uint64_t GetEmit7(size_t i, size_t emit) {
112     return table7_emit_[i >> 8][emit];
113   }
GetOp18(size_t i)114   static inline uint64_t GetOp18(size_t i) { return i ? 3 : 1; }
GetEmit18(size_t,size_t emit)115   static inline uint64_t GetEmit18(size_t, size_t emit) {
116     return emit ? 161 : 153;
117   }
GetOp19(size_t i)118   static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; }
GetEmit19(size_t,size_t emit)119   static inline uint64_t GetEmit19(size_t, size_t emit) {
120     return emit ? 172 : 167;
121   }
GetOp20(size_t i)122   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)123   static inline uint64_t GetEmit20(size_t, size_t emit) { return emit + 176; }
GetOp21(size_t i)124   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)125   static inline uint64_t GetEmit21(size_t, size_t emit) {
126     return emit ? 209 : 179;
127   }
GetOp22(size_t i)128   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)129   static inline uint64_t GetEmit22(size_t, size_t emit) { return emit + 216; }
GetOp23(size_t i)130   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)131   static inline uint64_t GetEmit23(size_t, size_t emit) {
132     return emit ? 229 : 227;
133   }
GetOp24(size_t i)134   static inline uint64_t GetOp24(size_t i) {
135     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
136   }
GetEmit24(size_t,size_t emit)137   static inline uint64_t GetEmit24(size_t, size_t emit) {
138     return (emit < 2 ? (emit + 133) : ((emit - 2) ? 146 : 136));
139   }
GetOp25(size_t i)140   static inline uint64_t GetOp25(size_t i) {
141     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
142   }
GetEmit25(size_t,size_t emit)143   static inline uint64_t GetEmit25(size_t, size_t emit) {
144     return (emit < 2 ? (emit ? 156 : 154) : ((emit - 2) ? 163 : 160));
145   }
GetOp26(size_t i)146   static inline uint64_t GetOp26(size_t i) {
147     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
148   }
GetEmit26(size_t,size_t emit)149   static inline uint64_t GetEmit26(size_t, size_t emit) {
150     return (emit < 2 ? (emit ? 169 : 164) : ((emit - 2) ? 173 : 170));
151   }
GetOp27(size_t i)152   static inline uint64_t GetOp27(size_t i) {
153     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
154   }
GetEmit27(size_t,size_t emit)155   static inline uint64_t GetEmit27(size_t, size_t emit) {
156     return (emit < 2 ? (emit ? 181 : 178) : ((emit - 2) + 185));
157   }
GetOp28(size_t i)158   static inline uint64_t GetOp28(size_t i) {
159     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
160   }
GetEmit28(size_t,size_t emit)161   static inline uint64_t GetEmit28(size_t, size_t emit) {
162     return (emit < 2 ? (emit ? 189 : 187) : ((emit - 2) ? 196 : 190));
163   }
GetOp29(size_t i)164   static inline uint64_t GetOp29(size_t i) {
165     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
166   }
GetEmit29(size_t,size_t emit)167   static inline uint64_t GetEmit29(size_t, size_t emit) {
168     return (emit < 2 ? (emit ? 228 : 198) : ((emit - 2) + 232));
169   }
GetOp30(size_t i)170   static inline uint64_t GetOp30(size_t i) { return table30_0_inner_[i]; }
GetEmit30(size_t,size_t emit)171   static inline uint64_t GetEmit30(size_t, size_t emit) {
172     return table30_0_emit_[emit];
173   }
GetOp31(size_t i)174   static inline uint64_t GetOp31(size_t i) { return table30_0_inner_[i]; }
GetEmit31(size_t,size_t emit)175   static inline uint64_t GetEmit31(size_t, size_t emit) {
176     return table31_0_emit_[emit];
177   }
GetOp32(size_t i)178   static inline uint64_t GetOp32(size_t i) { return table30_0_inner_[i]; }
GetEmit32(size_t,size_t emit)179   static inline uint64_t GetEmit32(size_t, size_t emit) {
180     return table32_0_emit_[emit];
181   }
GetOp34(size_t i)182   static inline uint64_t GetOp34(size_t i) { return i; }
GetEmit34(size_t,size_t emit)183   static inline uint64_t GetEmit34(size_t, size_t emit) {
184     return ((void)emit, 230);
185   }
GetOp33(size_t i)186   static inline uint64_t GetOp33(size_t i) {
187     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
188                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
189                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
190   }
GetEmit33(size_t,size_t emit)191   static inline uint64_t GetEmit33(size_t, size_t emit) {
192     return (emit < 1 ? (((void)emit, 230)) : ((emit - 1) ? 132 : 129));
193   }
GetOp36(size_t i)194   static inline uint64_t GetOp36(size_t i) {
195     return table36_0_inner_[(i < 5 ? (i) : (((void)(i - 5), 5)))];
196   }
GetEmit36(size_t,size_t emit)197   static inline uint64_t GetEmit36(size_t, size_t emit) {
198     return table36_0_emit_[emit];
199   }
GetOp35(size_t i)200   static inline uint64_t GetOp35(size_t i) {
201     return table35_0_inner_[(i < 9 ? (i / 2 + 0) : ((i - 9) + 4))];
202   }
GetEmit35(size_t,size_t emit)203   static inline uint64_t GetEmit35(size_t, size_t emit) {
204     return table35_0_emit_[emit];
205   }
GetOp38(size_t i)206   static inline uint64_t GetOp38(size_t i) {
207     return table38_0_inner_[(i < 6 ? (i) : ((i - 6) / 9 + 6))];
208   }
GetEmit38(size_t,size_t emit)209   static inline uint64_t GetEmit38(size_t, size_t emit) {
210     return table38_0_emit_[emit];
211   }
GetOp39(size_t i)212   static inline uint64_t GetOp39(size_t i) { return table39_0_ops_[i]; }
GetEmit39(size_t,size_t emit)213   static inline uint64_t GetEmit39(size_t, size_t emit) {
214     return table39_0_emit_[emit];
215   }
GetOp40(size_t i)216   static inline uint64_t GetOp40(size_t i) { return table40_0_ops_[i]; }
GetEmit40(size_t,size_t emit)217   static inline uint64_t GetEmit40(size_t, size_t emit) {
218     return table40_0_emit_[emit];
219   }
GetOp41(size_t i)220   static inline uint64_t GetOp41(size_t i) { return table41_0_ops_[i]; }
GetEmit41(size_t,size_t emit)221   static inline uint64_t GetEmit41(size_t, size_t emit) {
222     return table41_0_emit_[emit];
223   }
GetOp42(size_t i)224   static inline uint64_t GetOp42(size_t i) {
225     return table42_ops_[i >> 7][i & 0x7f];
226   }
GetEmit42(size_t i,size_t emit)227   static inline uint64_t GetEmit42(size_t i, size_t emit) {
228     return table42_emit_[i >> 7][emit];
229   }
GetOp43(size_t i)230   static inline uint64_t GetOp43(size_t i) {
231     return table43_ops_[i >> 6][i & 0x3f];
232   }
GetEmit43(size_t i,size_t emit)233   static inline uint64_t GetEmit43(size_t i, size_t emit) {
234     return table43_emit_[i >> 6][emit];
235   }
GetOp37(size_t i)236   static inline uint64_t GetOp37(size_t i) {
237     return table37_ops_[i >> 6][i & 0x3f];
238   }
GetEmit37(size_t i,size_t emit)239   static inline uint64_t GetEmit37(size_t i, size_t emit) {
240     return table37_emit_[i >> 6][emit];
241   }
242 
243  private:
244   static const uint8_t table2_0_emit_[10];
245   static const uint8_t table2_0_ops_[32];
246   static const uint8_t table3_0_emit_[36];
247   static const uint8_t table3_0_ops_[64];
248   static const uint8_t table1_0_emit_[68];
249   static const uint16_t table1_0_inner_[72];
250   static const uint8_t table1_0_outer_[128];
251   static const uint8_t table8_0_emit_[5];
252   static const uint8_t table8_0_inner_[7];
253   static const uint8_t table9_0_emit_[8];
254   static const uint8_t table9_0_inner_[10];
255   static const uint8_t table9_0_outer_[16];
256   static const uint8_t table10_0_emit_[10];
257   static const uint8_t table10_0_ops_[32];
258   static const uint8_t table11_0_emit_[16];
259   static const uint8_t table11_0_ops_[64];
260   static const uint8_t table12_0_emit_[18];
261   static const uint8_t table12_0_ops_[128];
262   static const uint8_t table13_0_emit_[40];
263   static const uint8_t table13_0_ops_[64];
264   static const uint8_t table13_1_emit_[40];
265   static const uint8_t table13_2_emit_[22];
266   static const uint8_t table13_2_ops_[64];
267   static const uint8_t table13_3_emit_[14];
268   static const uint8_t table13_3_ops_[64];
269   static const uint8_t* const table13_emit_[4];
270   static const uint8_t* const table13_ops_[4];
271   static const uint8_t table14_0_emit_[72];
272   static const uint16_t table14_0_ops_[64];
273   static const uint8_t table14_1_emit_[72];
274   static const uint8_t table14_2_emit_[72];
275   static const uint8_t table14_3_emit_[72];
276   static const uint8_t table14_4_emit_[72];
277   static const uint8_t table14_5_emit_[40];
278   static const uint16_t table14_5_ops_[64];
279   static const uint8_t table14_6_emit_[22];
280   static const uint16_t table14_6_ops_[64];
281   static const uint8_t table14_7_emit_[11];
282   static const uint16_t table14_7_ops_[64];
283   static const uint8_t* const table14_emit_[8];
284   static const uint16_t* const table14_ops_[8];
285   static const uint8_t table15_0_emit_[44];
286   static const uint16_t table15_0_ops_[64];
287   static const uint8_t table15_1_emit_[92];
288   static const uint16_t table15_1_ops_[64];
289   static const uint8_t table15_2_emit_[44];
290   static const uint8_t table15_3_emit_[92];
291   static const uint8_t table15_4_emit_[44];
292   static const uint8_t table15_5_emit_[92];
293   static const uint8_t table15_6_emit_[44];
294   static const uint8_t table15_7_emit_[92];
295   static const uint8_t table15_8_emit_[44];
296   static const uint8_t table15_9_emit_[92];
297   static const uint8_t table15_10_emit_[72];
298   static const uint8_t table15_11_emit_[72];
299   static const uint8_t table15_12_emit_[72];
300   static const uint8_t table15_13_emit_[40];
301   static const uint8_t table15_14_emit_[4];
302   static const uint16_t table15_14_ops_[64];
303   static const uint8_t table15_15_emit_[7];
304   static const uint16_t table15_15_ops_[64];
305   static const uint8_t* const table15_emit_[16];
306   static const uint16_t* const table15_ops_[16];
307   static const uint8_t table16_0_emit_[16];
308   static const uint16_t table16_0_ops_[64];
309   static const uint8_t table16_1_emit_[28];
310   static const uint16_t table16_1_ops_[64];
311   static const uint8_t table16_2_emit_[36];
312   static const uint16_t table16_2_ops_[64];
313   static const uint8_t table16_3_emit_[68];
314   static const uint16_t table16_3_ops_[64];
315   static const uint8_t table16_4_emit_[16];
316   static const uint8_t table16_5_emit_[28];
317   static const uint8_t table16_6_emit_[36];
318   static const uint8_t table16_7_emit_[68];
319   static const uint8_t table16_8_emit_[16];
320   static const uint8_t table16_9_emit_[28];
321   static const uint8_t table16_10_emit_[36];
322   static const uint8_t table16_11_emit_[68];
323   static const uint8_t table16_12_emit_[16];
324   static const uint8_t table16_13_emit_[28];
325   static const uint8_t table16_14_emit_[36];
326   static const uint8_t table16_15_emit_[68];
327   static const uint8_t table16_16_emit_[16];
328   static const uint8_t table16_17_emit_[28];
329   static const uint8_t table16_18_emit_[36];
330   static const uint8_t table16_19_emit_[68];
331   static const uint8_t table16_20_emit_[44];
332   static const uint8_t table16_21_emit_[92];
333   static const uint8_t table16_22_emit_[44];
334   static const uint8_t table16_23_emit_[92];
335   static const uint8_t table16_24_emit_[44];
336   static const uint8_t table16_25_emit_[92];
337   static const uint8_t table16_26_emit_[72];
338   static const uint8_t table16_27_emit_[72];
339   static const uint8_t table16_28_emit_[40];
340   static const uint8_t table16_29_emit_[40];
341   static const uint8_t table16_30_emit_[40];
342   static const uint8_t table16_31_emit_[5];
343   static const uint16_t table16_31_ops_[64];
344   static const uint8_t* const table16_emit_[32];
345   static const uint16_t* const table16_ops_[32];
346   static const uint16_t table17_0_ops_[128];
347   static const uint16_t table17_1_ops_[128];
348   static const uint16_t table17_2_ops_[128];
349   static const uint16_t table17_3_ops_[128];
350   static const uint16_t table17_20_ops_[128];
351   static const uint8_t table17_21_emit_[104];
352   static const uint16_t table17_21_ops_[128];
353   static const uint8_t table17_23_emit_[104];
354   static const uint8_t table17_25_emit_[104];
355   static const uint8_t table17_26_emit_[136];
356   static const uint16_t table17_26_ops_[128];
357   static const uint8_t table17_27_emit_[136];
358   static const uint8_t table17_28_emit_[144];
359   static const uint16_t table17_28_ops_[128];
360   static const uint8_t table17_29_emit_[144];
361   static const uint8_t table17_30_emit_[144];
362   static const uint8_t table17_31_emit_[46];
363   static const uint16_t table17_31_ops_[128];
364   static const uint8_t* const table17_emit_[32];
365   static const uint16_t* const table17_ops_[32];
366   static const uint8_t table7_0_emit_[1];
367   static const uint16_t table7_0_ops_[256];
368   static const uint8_t table7_4_emit_[1];
369   static const uint8_t table7_8_emit_[1];
370   static const uint8_t table7_12_emit_[1];
371   static const uint8_t table7_16_emit_[1];
372   static const uint8_t table7_20_emit_[1];
373   static const uint16_t table7_20_ops_[256];
374   static const uint8_t table7_22_emit_[1];
375   static const uint8_t table7_24_emit_[1];
376   static const uint8_t table7_26_emit_[1];
377   static const uint16_t table7_26_ops_[256];
378   static const uint8_t table7_27_emit_[1];
379   static const uint8_t table7_28_emit_[2];
380   static const uint16_t table7_28_ops_[256];
381   static const uint8_t table7_29_emit_[2];
382   static const uint8_t table7_30_emit_[2];
383   static const uint8_t table7_31_emit_[16];
384   static const uint16_t table7_31_ops_[256];
385   static const uint8_t* const table7_emit_[32];
386   static const uint16_t* const table7_ops_[32];
387   static const uint8_t table30_0_emit_[8];
388   static const uint8_t table30_0_inner_[8];
389   static const uint8_t table31_0_emit_[8];
390   static const uint8_t table32_0_emit_[8];
391   static const uint8_t table36_0_emit_[5];
392   static const uint8_t table36_0_inner_[6];
393   static const uint8_t table35_0_emit_[11];
394   static const uint8_t table35_0_inner_[11];
395   static const uint8_t table38_0_emit_[6];
396   static const uint8_t table38_0_inner_[8];
397   static const uint8_t table39_0_emit_[10];
398   static const uint8_t table39_0_ops_[32];
399   static const uint8_t table40_0_emit_[25];
400   static const uint8_t table40_0_ops_[64];
401   static const uint8_t table41_0_emit_[44];
402   static const uint8_t table41_0_ops_[128];
403   static const uint8_t table42_0_ops_[128];
404   static const uint8_t table42_1_emit_[63];
405   static const uint8_t table42_1_ops_[128];
406   static const uint8_t* const table42_emit_[2];
407   static const uint8_t* const table42_ops_[2];
408   static const uint8_t table43_0_emit_[40];
409   static const uint8_t table43_1_emit_[40];
410   static const uint8_t table43_2_emit_[40];
411   static const uint8_t table43_3_emit_[4];
412   static const uint8_t table43_3_ops_[64];
413   static const uint8_t table43_4_emit_[8];
414   static const uint8_t table43_4_ops_[64];
415   static const uint8_t table43_5_emit_[9];
416   static const uint8_t table43_5_ops_[64];
417   static const uint8_t table43_6_emit_[16];
418   static const uint8_t table43_6_ops_[64];
419   static const uint8_t table43_7_emit_[30];
420   static const uint8_t table43_7_ops_[64];
421   static const uint8_t* const table43_emit_[8];
422   static const uint8_t* const table43_ops_[8];
423   static const uint8_t table37_0_emit_[1];
424   static const uint16_t table37_0_ops_[64];
425   static const uint8_t table37_1_emit_[1];
426   static const uint8_t table37_2_emit_[1];
427   static const uint8_t table37_3_emit_[1];
428   static const uint8_t table37_4_emit_[1];
429   static const uint8_t table37_5_emit_[1];
430   static const uint8_t table37_6_emit_[2];
431   static const uint16_t table37_6_ops_[64];
432   static const uint8_t table37_7_emit_[2];
433   static const uint8_t table37_8_emit_[4];
434   static const uint16_t table37_8_ops_[64];
435   static const uint8_t table37_9_emit_[4];
436   static const uint8_t table37_10_emit_[4];
437   static const uint8_t table37_11_emit_[5];
438   static const uint16_t table37_11_ops_[64];
439   static const uint8_t table37_12_emit_[8];
440   static const uint16_t table37_12_ops_[64];
441   static const uint8_t table37_13_emit_[8];
442   static const uint8_t table37_14_emit_[15];
443   static const uint16_t table37_14_ops_[64];
444   static const uint8_t table37_15_emit_[18];
445   static const uint16_t table37_15_ops_[64];
446   static const uint8_t* const table37_emit_[16];
447   static const uint16_t* const table37_ops_[16];
448 };
449 template <typename F>
450 class HuffDecoder : public HuffDecoderCommon {
451  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)452   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
453       : sink_(sink), begin_(begin), end_(end) {}
Run()454   bool Run() {
455     while (!done_) {
456       if (!RefillTo7()) {
457         Done0();
458         break;
459       }
460       const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
461       const auto op = GetOp1(index);
462       const int consumed = op & 7;
463       buffer_len_ -= consumed;
464       const auto emit_ofs = op >> 6;
465       switch ((op >> 3) & 7) {
466         case 0: {
467           sink_(GetEmit1(index, emit_ofs + 0));
468           break;
469         }
470         case 1: {
471           DecodeStep0();
472           break;
473         }
474         case 2: {
475           DecodeStep1();
476           break;
477         }
478         case 3: {
479           DecodeStep2();
480           break;
481         }
482         case 4: {
483           DecodeStep3();
484           break;
485         }
486       }
487     }
488     return ok_;
489   }
490 
491  private:
RefillTo7()492   bool RefillTo7() {
493     switch (buffer_len_) {
494       case 0: {
495         return Read1to8Bytes();
496       }
497       case 1:
498       case 2:
499       case 3:
500       case 4:
501       case 5:
502       case 6: {
503         return Read1to7Bytes();
504       }
505     }
506     return true;
507   }
Read1to8Bytes()508   bool Read1to8Bytes() {
509     switch (end_ - begin_) {
510       case 0: {
511         return false;
512       }
513       case 1: {
514         Fill1();
515         return true;
516       }
517       case 2: {
518         Fill2();
519         return true;
520       }
521       case 3: {
522         Fill3();
523         return true;
524       }
525       case 4: {
526         Fill4();
527         return true;
528       }
529       case 5: {
530         Fill5();
531         return true;
532       }
533       case 6: {
534         Fill6();
535         return true;
536       }
537       case 7: {
538         Fill7();
539         return true;
540       }
541       default: {
542         Fill8();
543         return true;
544       }
545     }
546   }
Fill1()547   void Fill1() {
548     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
549     begin_ += 1;
550     buffer_len_ += 8;
551   }
Fill2()552   void Fill2() {
553     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
554               (static_cast<uint64_t>(begin_[1]) << 0);
555     begin_ += 2;
556     buffer_len_ += 16;
557   }
Fill3()558   void Fill3() {
559     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
560               (static_cast<uint64_t>(begin_[1]) << 8) |
561               (static_cast<uint64_t>(begin_[2]) << 0);
562     begin_ += 3;
563     buffer_len_ += 24;
564   }
Fill4()565   void Fill4() {
566     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
567               (static_cast<uint64_t>(begin_[1]) << 16) |
568               (static_cast<uint64_t>(begin_[2]) << 8) |
569               (static_cast<uint64_t>(begin_[3]) << 0);
570     begin_ += 4;
571     buffer_len_ += 32;
572   }
Fill5()573   void Fill5() {
574     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
575               (static_cast<uint64_t>(begin_[1]) << 24) |
576               (static_cast<uint64_t>(begin_[2]) << 16) |
577               (static_cast<uint64_t>(begin_[3]) << 8) |
578               (static_cast<uint64_t>(begin_[4]) << 0);
579     begin_ += 5;
580     buffer_len_ += 40;
581   }
Fill6()582   void Fill6() {
583     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
584               (static_cast<uint64_t>(begin_[1]) << 32) |
585               (static_cast<uint64_t>(begin_[2]) << 24) |
586               (static_cast<uint64_t>(begin_[3]) << 16) |
587               (static_cast<uint64_t>(begin_[4]) << 8) |
588               (static_cast<uint64_t>(begin_[5]) << 0);
589     begin_ += 6;
590     buffer_len_ += 48;
591   }
Fill7()592   void Fill7() {
593     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
594               (static_cast<uint64_t>(begin_[1]) << 40) |
595               (static_cast<uint64_t>(begin_[2]) << 32) |
596               (static_cast<uint64_t>(begin_[3]) << 24) |
597               (static_cast<uint64_t>(begin_[4]) << 16) |
598               (static_cast<uint64_t>(begin_[5]) << 8) |
599               (static_cast<uint64_t>(begin_[6]) << 0);
600     begin_ += 7;
601     buffer_len_ += 56;
602   }
Fill8()603   void Fill8() {
604     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
605               (static_cast<uint64_t>(begin_[1]) << 48) |
606               (static_cast<uint64_t>(begin_[2]) << 40) |
607               (static_cast<uint64_t>(begin_[3]) << 32) |
608               (static_cast<uint64_t>(begin_[4]) << 24) |
609               (static_cast<uint64_t>(begin_[5]) << 16) |
610               (static_cast<uint64_t>(begin_[6]) << 8) |
611               (static_cast<uint64_t>(begin_[7]) << 0);
612     begin_ += 8;
613     buffer_len_ += 64;
614   }
Read1to7Bytes()615   bool Read1to7Bytes() {
616     switch (end_ - begin_) {
617       case 0: {
618         return false;
619       }
620       case 1: {
621         Fill1();
622         return true;
623       }
624       case 2: {
625         Fill2();
626         return true;
627       }
628       case 3: {
629         Fill3();
630         return true;
631       }
632       case 4: {
633         Fill4();
634         return true;
635       }
636       case 5: {
637         Fill5();
638         return true;
639       }
640       case 6: {
641         Fill6();
642         return true;
643       }
644       default: {
645         Fill7();
646         return true;
647       }
648     }
649   }
Done0()650   void Done0() {
651     done_ = true;
652     switch (buffer_len_) {
653       case 1:
654       case 2:
655       case 3:
656       case 4: {
657         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
658         return;
659       }
660       case 5: {
661         const auto index = buffer_ & 31;
662         const auto op = GetOp2(index);
663         switch (op & 3) {
664           case 0: {
665             sink_(GetEmit2(index, (op >> 2) + 0));
666             break;
667           }
668           case 1: {
669             ok_ = false;
670             break;
671           }
672         }
673         return;
674       }
675       case 6: {
676         const auto index = buffer_ & 63;
677         const auto op = GetOp3(index);
678         switch (op & 3) {
679           case 0: {
680             ok_ = false;
681             break;
682           }
683           case 1: {
684             sink_(GetEmit3(index, (op >> 2) + 0));
685             break;
686           }
687         }
688         return;
689       }
690       case 0: {
691         return;
692       }
693     }
694   }
DecodeStep0()695   void DecodeStep0() {
696     if (!RefillTo1()) {
697       Done1();
698       return;
699     }
700     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
701     const auto op = GetOp4(index);
702     const int consumed = op & 1;
703     buffer_len_ -= consumed;
704     const auto emit_ofs = op >> 1;
705     sink_(GetEmit4(index, emit_ofs + 0));
706   }
RefillTo1()707   bool RefillTo1() {
708     switch (buffer_len_) {
709       case 0: {
710         return Read1to8Bytes();
711       }
712     }
713     return true;
714   }
Done1()715   void Done1() {
716     done_ = true;
717     ok_ = false;
718   }
DecodeStep1()719   void DecodeStep1() {
720     if (!RefillTo1()) {
721       Done2();
722       return;
723     }
724     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
725     const auto op = GetOp5(index);
726     const int consumed = op & 1;
727     buffer_len_ -= consumed;
728     const auto emit_ofs = op >> 1;
729     sink_(GetEmit5(index, emit_ofs + 0));
730   }
Done2()731   void Done2() {
732     done_ = true;
733     ok_ = false;
734   }
DecodeStep2()735   void DecodeStep2() {
736     if (!RefillTo1()) {
737       Done3();
738       return;
739     }
740     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
741     const auto op = GetOp6(index);
742     const int consumed = op & 1;
743     buffer_len_ -= consumed;
744     const auto emit_ofs = op >> 1;
745     sink_(GetEmit6(index, emit_ofs + 0));
746   }
Done3()747   void Done3() {
748     done_ = true;
749     ok_ = false;
750   }
DecodeStep3()751   void DecodeStep3() {
752     if (!RefillTo13()) {
753       Done4();
754       return;
755     }
756     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
757     const auto op = GetOp7(index);
758     const int consumed = op & 15;
759     buffer_len_ -= consumed;
760     const auto emit_ofs = op >> 9;
761     switch ((op >> 4) & 31) {
762       case 0: {
763         sink_(GetEmit7(index, emit_ofs + 0));
764         break;
765       }
766       case 1: {
767         DecodeStep4();
768         break;
769       }
770       case 2: {
771         DecodeStep5();
772         break;
773       }
774       case 3: {
775         DecodeStep6();
776         break;
777       }
778       case 4: {
779         DecodeStep7();
780         break;
781       }
782       case 5: {
783         DecodeStep8();
784         break;
785       }
786       case 6: {
787         DecodeStep9();
788         break;
789       }
790       case 7: {
791         DecodeStep19();
792         break;
793       }
794       case 8: {
795         DecodeStep10();
796         break;
797       }
798       case 9: {
799         DecodeStep11();
800         break;
801       }
802       case 10: {
803         DecodeStep12();
804         break;
805       }
806       case 11: {
807         DecodeStep13();
808         break;
809       }
810       case 12: {
811         DecodeStep14();
812         break;
813       }
814       case 13: {
815         DecodeStep15();
816         break;
817       }
818       case 14: {
819         DecodeStep16();
820         break;
821       }
822       case 15: {
823         DecodeStep17();
824         break;
825       }
826       case 16: {
827         DecodeStep18();
828         break;
829       }
830       case 17: {
831         DecodeStep20();
832         break;
833       }
834       case 18: {
835         DecodeStep21();
836         break;
837       }
838     }
839   }
RefillTo13()840   bool RefillTo13() {
841     switch (buffer_len_) {
842       case 0: {
843         return Read2to8Bytes();
844       }
845       case 1:
846       case 2:
847       case 3:
848       case 4: {
849         return Read2to7Bytes();
850       }
851       case 5:
852       case 6:
853       case 7:
854       case 8: {
855         return Read1to7Bytes();
856       }
857       case 9:
858       case 10:
859       case 11:
860       case 12: {
861         return Read1to6Bytes();
862       }
863     }
864     return true;
865   }
Read2to8Bytes()866   bool Read2to8Bytes() {
867     switch (end_ - begin_) {
868       case 0:
869       case 1: {
870         return false;
871       }
872       case 2: {
873         Fill2();
874         return true;
875       }
876       case 3: {
877         Fill3();
878         return true;
879       }
880       case 4: {
881         Fill4();
882         return true;
883       }
884       case 5: {
885         Fill5();
886         return true;
887       }
888       case 6: {
889         Fill6();
890         return true;
891       }
892       case 7: {
893         Fill7();
894         return true;
895       }
896       default: {
897         Fill8();
898         return true;
899       }
900     }
901   }
Read2to7Bytes()902   bool Read2to7Bytes() {
903     switch (end_ - begin_) {
904       case 0:
905       case 1: {
906         return false;
907       }
908       case 2: {
909         Fill2();
910         return true;
911       }
912       case 3: {
913         Fill3();
914         return true;
915       }
916       case 4: {
917         Fill4();
918         return true;
919       }
920       case 5: {
921         Fill5();
922         return true;
923       }
924       case 6: {
925         Fill6();
926         return true;
927       }
928       default: {
929         Fill7();
930         return true;
931       }
932     }
933   }
Read1to6Bytes()934   bool Read1to6Bytes() {
935     switch (end_ - begin_) {
936       case 0: {
937         return false;
938       }
939       case 1: {
940         Fill1();
941         return true;
942       }
943       case 2: {
944         Fill2();
945         return true;
946       }
947       case 3: {
948         Fill3();
949         return true;
950       }
951       case 4: {
952         Fill4();
953         return true;
954       }
955       case 5: {
956         Fill5();
957         return true;
958       }
959       default: {
960         Fill6();
961         return true;
962       }
963     }
964   }
Done4()965   void Done4() {
966     done_ = true;
967     switch (end_ - begin_) {
968       case 1: {
969         Fill1();
970         break;
971       }
972     }
973     switch (buffer_len_) {
974       case 1:
975       case 2: {
976         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
977         return;
978       }
979       case 3: {
980         const auto index = buffer_ & 7;
981         const auto op = GetOp8(index);
982         switch (op & 3) {
983           case 0: {
984             sink_(GetEmit8(index, (op >> 2) + 0));
985             break;
986           }
987           case 1: {
988             ok_ = false;
989             break;
990           }
991         }
992         return;
993       }
994       case 4: {
995         const auto index = buffer_ & 15;
996         const auto op = GetOp9(index);
997         switch (op & 3) {
998           case 0: {
999             ok_ = false;
1000             break;
1001           }
1002           case 1: {
1003             sink_(GetEmit9(index, (op >> 2) + 0));
1004             break;
1005           }
1006         }
1007         return;
1008       }
1009       case 5: {
1010         const auto index = buffer_ & 31;
1011         const auto op = GetOp10(index);
1012         switch (op & 3) {
1013           case 0: {
1014             ok_ = false;
1015             break;
1016           }
1017           case 1: {
1018             sink_(GetEmit10(index, (op >> 2) + 0));
1019             break;
1020           }
1021         }
1022         return;
1023       }
1024       case 6: {
1025         const auto index = buffer_ & 63;
1026         const auto op = GetOp11(index);
1027         switch (op & 3) {
1028           case 0: {
1029             ok_ = false;
1030             break;
1031           }
1032           case 1: {
1033             sink_(GetEmit11(index, (op >> 2) + 0));
1034             break;
1035           }
1036         }
1037         return;
1038       }
1039       case 7: {
1040         const auto index = buffer_ & 127;
1041         const auto op = GetOp12(index);
1042         switch (op & 3) {
1043           case 0: {
1044             ok_ = false;
1045             break;
1046           }
1047           case 1: {
1048             sink_(GetEmit12(index, (op >> 2) + 0));
1049             break;
1050           }
1051         }
1052         return;
1053       }
1054       case 8: {
1055         const auto index = buffer_ & 255;
1056         const auto op = GetOp13(index);
1057         switch (op & 3) {
1058           case 0: {
1059             sink_(GetEmit13(index, (op >> 2) + 0));
1060             sink_(GetEmit13(index, (op >> 2) + 1));
1061             break;
1062           }
1063           case 1: {
1064             ok_ = false;
1065             break;
1066           }
1067           case 2: {
1068             sink_(GetEmit13(index, (op >> 2) + 0));
1069             break;
1070           }
1071         }
1072         return;
1073       }
1074       case 9: {
1075         const auto index = buffer_ & 511;
1076         const auto op = GetOp14(index);
1077         switch (op & 3) {
1078           case 0: {
1079             ok_ = false;
1080             break;
1081           }
1082           case 1: {
1083             sink_(GetEmit14(index, (op >> 2) + 0));
1084             sink_(GetEmit14(index, (op >> 2) + 1));
1085             break;
1086           }
1087           case 2: {
1088             sink_(GetEmit14(index, (op >> 2) + 0));
1089             break;
1090           }
1091         }
1092         return;
1093       }
1094       case 10: {
1095         const auto index = buffer_ & 1023;
1096         const auto op = GetOp15(index);
1097         switch (op & 3) {
1098           case 0: {
1099             ok_ = false;
1100             break;
1101           }
1102           case 1: {
1103             sink_(GetEmit15(index, (op >> 2) + 0));
1104             sink_(GetEmit15(index, (op >> 2) + 1));
1105             break;
1106           }
1107           case 2: {
1108             sink_(GetEmit15(index, (op >> 2) + 0));
1109             break;
1110           }
1111         }
1112         return;
1113       }
1114       case 11: {
1115         const auto index = buffer_ & 2047;
1116         const auto op = GetOp16(index);
1117         switch (op & 3) {
1118           case 0: {
1119             ok_ = false;
1120             break;
1121           }
1122           case 1: {
1123             sink_(GetEmit16(index, (op >> 2) + 0));
1124             sink_(GetEmit16(index, (op >> 2) + 1));
1125             break;
1126           }
1127           case 2: {
1128             sink_(GetEmit16(index, (op >> 2) + 0));
1129             break;
1130           }
1131         }
1132         return;
1133       }
1134       case 12: {
1135         const auto index = buffer_ & 4095;
1136         const auto op = GetOp17(index);
1137         switch (op & 3) {
1138           case 0: {
1139             ok_ = false;
1140             break;
1141           }
1142           case 1: {
1143             sink_(GetEmit17(index, (op >> 2) + 0));
1144             sink_(GetEmit17(index, (op >> 2) + 1));
1145             break;
1146           }
1147           case 2: {
1148             sink_(GetEmit17(index, (op >> 2) + 0));
1149             break;
1150           }
1151         }
1152         return;
1153       }
1154       case 0: {
1155         return;
1156       }
1157     }
1158   }
DecodeStep4()1159   void DecodeStep4() {
1160     if (!RefillTo1()) {
1161       Done5();
1162       return;
1163     }
1164     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1165     const auto op = GetOp18(index);
1166     const int consumed = op & 1;
1167     buffer_len_ -= consumed;
1168     const auto emit_ofs = op >> 1;
1169     sink_(GetEmit18(index, emit_ofs + 0));
1170   }
Done5()1171   void Done5() {
1172     done_ = true;
1173     ok_ = false;
1174   }
DecodeStep5()1175   void DecodeStep5() {
1176     if (!RefillTo1()) {
1177       Done6();
1178       return;
1179     }
1180     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1181     const auto op = GetOp19(index);
1182     const int consumed = op & 1;
1183     buffer_len_ -= consumed;
1184     const auto emit_ofs = op >> 1;
1185     sink_(GetEmit19(index, emit_ofs + 0));
1186   }
Done6()1187   void Done6() {
1188     done_ = true;
1189     ok_ = false;
1190   }
DecodeStep6()1191   void DecodeStep6() {
1192     if (!RefillTo1()) {
1193       Done7();
1194       return;
1195     }
1196     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1197     const auto op = GetOp20(index);
1198     const int consumed = op & 1;
1199     buffer_len_ -= consumed;
1200     const auto emit_ofs = op >> 1;
1201     sink_(GetEmit20(index, emit_ofs + 0));
1202   }
Done7()1203   void Done7() {
1204     done_ = true;
1205     ok_ = false;
1206   }
DecodeStep7()1207   void DecodeStep7() {
1208     if (!RefillTo1()) {
1209       Done8();
1210       return;
1211     }
1212     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1213     const auto op = GetOp21(index);
1214     const int consumed = op & 1;
1215     buffer_len_ -= consumed;
1216     const auto emit_ofs = op >> 1;
1217     sink_(GetEmit21(index, emit_ofs + 0));
1218   }
Done8()1219   void Done8() {
1220     done_ = true;
1221     ok_ = false;
1222   }
DecodeStep8()1223   void DecodeStep8() {
1224     if (!RefillTo1()) {
1225       Done9();
1226       return;
1227     }
1228     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1229     const auto op = GetOp22(index);
1230     const int consumed = op & 1;
1231     buffer_len_ -= consumed;
1232     const auto emit_ofs = op >> 1;
1233     sink_(GetEmit22(index, emit_ofs + 0));
1234   }
Done9()1235   void Done9() {
1236     done_ = true;
1237     ok_ = false;
1238   }
DecodeStep9()1239   void DecodeStep9() {
1240     if (!RefillTo1()) {
1241       Done10();
1242       return;
1243     }
1244     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1245     const auto op = GetOp23(index);
1246     const int consumed = op & 1;
1247     buffer_len_ -= consumed;
1248     const auto emit_ofs = op >> 1;
1249     sink_(GetEmit23(index, emit_ofs + 0));
1250   }
Done10()1251   void Done10() {
1252     done_ = true;
1253     ok_ = false;
1254   }
DecodeStep10()1255   void DecodeStep10() {
1256     if (!RefillTo2()) {
1257       Done11();
1258       return;
1259     }
1260     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1261     const auto op = GetOp24(index);
1262     const int consumed = op & 3;
1263     buffer_len_ -= consumed;
1264     const auto emit_ofs = op >> 2;
1265     sink_(GetEmit24(index, emit_ofs + 0));
1266   }
RefillTo2()1267   bool RefillTo2() {
1268     switch (buffer_len_) {
1269       case 0: {
1270         return Read1to8Bytes();
1271       }
1272       case 1: {
1273         return Read1to7Bytes();
1274       }
1275     }
1276     return true;
1277   }
Done11()1278   void Done11() {
1279     done_ = true;
1280     switch (buffer_len_) {
1281       case 1:
1282       case 0: {
1283         ok_ = false;
1284         return;
1285       }
1286     }
1287   }
DecodeStep11()1288   void DecodeStep11() {
1289     if (!RefillTo2()) {
1290       Done12();
1291       return;
1292     }
1293     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1294     const auto op = GetOp25(index);
1295     const int consumed = op & 3;
1296     buffer_len_ -= consumed;
1297     const auto emit_ofs = op >> 2;
1298     sink_(GetEmit25(index, emit_ofs + 0));
1299   }
Done12()1300   void Done12() {
1301     done_ = true;
1302     switch (buffer_len_) {
1303       case 1:
1304       case 0: {
1305         ok_ = false;
1306         return;
1307       }
1308     }
1309   }
DecodeStep12()1310   void DecodeStep12() {
1311     if (!RefillTo2()) {
1312       Done13();
1313       return;
1314     }
1315     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1316     const auto op = GetOp26(index);
1317     const int consumed = op & 3;
1318     buffer_len_ -= consumed;
1319     const auto emit_ofs = op >> 2;
1320     sink_(GetEmit26(index, emit_ofs + 0));
1321   }
Done13()1322   void Done13() {
1323     done_ = true;
1324     switch (buffer_len_) {
1325       case 1:
1326       case 0: {
1327         ok_ = false;
1328         return;
1329       }
1330     }
1331   }
DecodeStep13()1332   void DecodeStep13() {
1333     if (!RefillTo2()) {
1334       Done14();
1335       return;
1336     }
1337     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1338     const auto op = GetOp27(index);
1339     const int consumed = op & 3;
1340     buffer_len_ -= consumed;
1341     const auto emit_ofs = op >> 2;
1342     sink_(GetEmit27(index, emit_ofs + 0));
1343   }
Done14()1344   void Done14() {
1345     done_ = true;
1346     switch (buffer_len_) {
1347       case 1:
1348       case 0: {
1349         ok_ = false;
1350         return;
1351       }
1352     }
1353   }
DecodeStep14()1354   void DecodeStep14() {
1355     if (!RefillTo2()) {
1356       Done15();
1357       return;
1358     }
1359     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1360     const auto op = GetOp28(index);
1361     const int consumed = op & 3;
1362     buffer_len_ -= consumed;
1363     const auto emit_ofs = op >> 2;
1364     sink_(GetEmit28(index, emit_ofs + 0));
1365   }
Done15()1366   void Done15() {
1367     done_ = true;
1368     switch (buffer_len_) {
1369       case 1:
1370       case 0: {
1371         ok_ = false;
1372         return;
1373       }
1374     }
1375   }
DecodeStep15()1376   void DecodeStep15() {
1377     if (!RefillTo2()) {
1378       Done16();
1379       return;
1380     }
1381     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1382     const auto op = GetOp29(index);
1383     const int consumed = op & 3;
1384     buffer_len_ -= consumed;
1385     const auto emit_ofs = op >> 2;
1386     sink_(GetEmit29(index, emit_ofs + 0));
1387   }
Done16()1388   void Done16() {
1389     done_ = true;
1390     switch (buffer_len_) {
1391       case 1:
1392       case 0: {
1393         ok_ = false;
1394         return;
1395       }
1396     }
1397   }
DecodeStep16()1398   void DecodeStep16() {
1399     if (!RefillTo3()) {
1400       Done17();
1401       return;
1402     }
1403     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1404     const auto op = GetOp30(index);
1405     const int consumed = op & 3;
1406     buffer_len_ -= consumed;
1407     const auto emit_ofs = op >> 2;
1408     sink_(GetEmit30(index, emit_ofs + 0));
1409   }
RefillTo3()1410   bool RefillTo3() {
1411     switch (buffer_len_) {
1412       case 0: {
1413         return Read1to8Bytes();
1414       }
1415       case 1:
1416       case 2: {
1417         return Read1to7Bytes();
1418       }
1419     }
1420     return true;
1421   }
Done17()1422   void Done17() {
1423     done_ = true;
1424     switch (buffer_len_) {
1425       case 1:
1426       case 2:
1427       case 0: {
1428         ok_ = false;
1429         return;
1430       }
1431     }
1432   }
DecodeStep17()1433   void DecodeStep17() {
1434     if (!RefillTo3()) {
1435       Done18();
1436       return;
1437     }
1438     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1439     const auto op = GetOp31(index);
1440     const int consumed = op & 3;
1441     buffer_len_ -= consumed;
1442     const auto emit_ofs = op >> 2;
1443     sink_(GetEmit31(index, emit_ofs + 0));
1444   }
Done18()1445   void Done18() {
1446     done_ = true;
1447     switch (buffer_len_) {
1448       case 1:
1449       case 2:
1450       case 0: {
1451         ok_ = false;
1452         return;
1453       }
1454     }
1455   }
DecodeStep18()1456   void DecodeStep18() {
1457     if (!RefillTo3()) {
1458       Done19();
1459       return;
1460     }
1461     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1462     const auto op = GetOp32(index);
1463     const int consumed = op & 3;
1464     buffer_len_ -= consumed;
1465     const auto emit_ofs = op >> 2;
1466     sink_(GetEmit32(index, emit_ofs + 0));
1467   }
Done19()1468   void Done19() {
1469     done_ = true;
1470     switch (buffer_len_) {
1471       case 1:
1472       case 2:
1473       case 0: {
1474         ok_ = false;
1475         return;
1476       }
1477     }
1478   }
DecodeStep19()1479   void DecodeStep19() {
1480     if (!RefillTo2()) {
1481       Done20();
1482       return;
1483     }
1484     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1485     const auto op = GetOp33(index);
1486     const int consumed = op & 3;
1487     buffer_len_ -= consumed;
1488     const auto emit_ofs = op >> 2;
1489     sink_(GetEmit33(index, emit_ofs + 0));
1490   }
Done20()1491   void Done20() {
1492     done_ = true;
1493     switch (buffer_len_) {
1494       case 1: {
1495         const auto index = buffer_ & 1;
1496         const auto op = GetOp34(index);
1497         switch (op & 1) {
1498           case 0: {
1499             sink_(GetEmit34(index, (op >> 1) + 0));
1500             break;
1501           }
1502           case 1: {
1503             ok_ = false;
1504             break;
1505           }
1506         }
1507         return;
1508       }
1509       case 0: {
1510         ok_ = false;
1511         return;
1512       }
1513     }
1514   }
DecodeStep20()1515   void DecodeStep20() {
1516     if (!RefillTo4()) {
1517       Done21();
1518       return;
1519     }
1520     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1521     const auto op = GetOp35(index);
1522     const int consumed = op & 7;
1523     buffer_len_ -= consumed;
1524     const auto emit_ofs = op >> 3;
1525     sink_(GetEmit35(index, emit_ofs + 0));
1526   }
RefillTo4()1527   bool RefillTo4() {
1528     switch (buffer_len_) {
1529       case 0: {
1530         return Read1to8Bytes();
1531       }
1532       case 1:
1533       case 2:
1534       case 3: {
1535         return Read1to7Bytes();
1536       }
1537     }
1538     return true;
1539   }
Done21()1540   void Done21() {
1541     done_ = true;
1542     switch (buffer_len_) {
1543       case 1:
1544       case 2:
1545       case 0: {
1546         ok_ = false;
1547         return;
1548       }
1549       case 3: {
1550         const auto index = buffer_ & 7;
1551         const auto op = GetOp36(index);
1552         switch (op & 1) {
1553           case 0: {
1554             sink_(GetEmit36(index, (op >> 1) + 0));
1555             break;
1556           }
1557           case 1: {
1558             ok_ = false;
1559             break;
1560           }
1561         }
1562         return;
1563       }
1564     }
1565   }
DecodeStep21()1566   void DecodeStep21() {
1567     if (!RefillTo10()) {
1568       Done22();
1569       return;
1570     }
1571     const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
1572     const auto op = GetOp37(index);
1573     const int consumed = op & 15;
1574     buffer_len_ -= consumed;
1575     const auto emit_ofs = op >> 5;
1576     switch ((op >> 4) & 1) {
1577       case 0: {
1578         sink_(GetEmit37(index, emit_ofs + 0));
1579         break;
1580       }
1581       case 1: {
1582         begin_ = end_;
1583         buffer_len_ = 0;
1584         break;
1585       }
1586     }
1587   }
RefillTo10()1588   bool RefillTo10() {
1589     switch (buffer_len_) {
1590       case 0: {
1591         return Read2to8Bytes();
1592       }
1593       case 1: {
1594         return Read2to7Bytes();
1595       }
1596       case 2:
1597       case 3:
1598       case 4:
1599       case 5:
1600       case 6:
1601       case 7:
1602       case 8: {
1603         return Read1to7Bytes();
1604       }
1605       case 9: {
1606         return Read1to6Bytes();
1607       }
1608     }
1609     return true;
1610   }
Done22()1611   void Done22() {
1612     done_ = true;
1613     switch (end_ - begin_) {
1614       case 1: {
1615         Fill1();
1616         break;
1617       }
1618     }
1619     switch (buffer_len_) {
1620       case 1:
1621       case 2:
1622       case 3: {
1623         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1624         return;
1625       }
1626       case 4: {
1627         const auto index = buffer_ & 15;
1628         const auto op = GetOp38(index);
1629         switch (op & 3) {
1630           case 0: {
1631             sink_(GetEmit38(index, (op >> 2) + 0));
1632             break;
1633           }
1634           case 1: {
1635             ok_ = false;
1636             break;
1637           }
1638         }
1639         return;
1640       }
1641       case 5: {
1642         const auto index = buffer_ & 31;
1643         const auto op = GetOp39(index);
1644         switch (op & 3) {
1645           case 0: {
1646             ok_ = false;
1647             break;
1648           }
1649           case 1: {
1650             sink_(GetEmit39(index, (op >> 2) + 0));
1651             break;
1652           }
1653         }
1654         return;
1655       }
1656       case 6: {
1657         const auto index = buffer_ & 63;
1658         const auto op = GetOp40(index);
1659         switch (op & 3) {
1660           case 0: {
1661             ok_ = false;
1662             break;
1663           }
1664           case 1: {
1665             sink_(GetEmit40(index, (op >> 2) + 0));
1666             break;
1667           }
1668         }
1669         return;
1670       }
1671       case 7: {
1672         const auto index = buffer_ & 127;
1673         const auto op = GetOp41(index);
1674         switch (op & 3) {
1675           case 0: {
1676             ok_ = false;
1677             break;
1678           }
1679           case 1: {
1680             sink_(GetEmit41(index, (op >> 2) + 0));
1681             break;
1682           }
1683         }
1684         return;
1685       }
1686       case 8: {
1687         const auto index = buffer_ & 255;
1688         const auto op = GetOp42(index);
1689         switch (op & 3) {
1690           case 0: {
1691             ok_ = false;
1692             break;
1693           }
1694           case 1: {
1695             sink_(GetEmit42(index, (op >> 2) + 0));
1696             break;
1697           }
1698         }
1699         return;
1700       }
1701       case 9: {
1702         const auto index = buffer_ & 511;
1703         const auto op = GetOp43(index);
1704         switch (op & 3) {
1705           case 0: {
1706             sink_(GetEmit43(index, (op >> 2) + 0));
1707             sink_(GetEmit43(index, (op >> 2) + 1));
1708             break;
1709           }
1710           case 1: {
1711             ok_ = false;
1712             break;
1713           }
1714           case 2: {
1715             sink_(GetEmit43(index, (op >> 2) + 0));
1716             break;
1717           }
1718         }
1719         return;
1720       }
1721       case 0: {
1722         return;
1723       }
1724     }
1725   }
1726   F sink_;
1727   const uint8_t* begin_;
1728   const uint8_t* const end_;
1729   uint64_t buffer_ = 0;
1730   int buffer_len_ = 0;
1731   bool ok_ = true;
1732   bool done_ = false;
1733 };
1734 }  // namespace geometry_7_13_10
1735 }  // namespace grpc_core
1736 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_13_10_H
1737