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