xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_11_9_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_11_9_10_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_9_10_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_11_9_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   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp1(size_t i)60   static inline uint64_t GetOp1(size_t i) {
61     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit1(size_t i,size_t emit)63   static inline uint64_t GetEmit1(size_t i, size_t emit) {
64     return table1_emit_[i >> 6][emit];
65   }
GetOp8(size_t i)66   static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return emit ? 62 : 35;
69   }
GetOp9(size_t i)70   static inline uint64_t GetOp9(size_t i) {
71     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
72   }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) {
74     return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64));
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) {
77     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
78   }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return table12_0_inner_[table12_0_outer_[i]];
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94));
87   }
GetOp13(size_t i)88   static inline uint64_t GetOp13(size_t i) {
89     return table13_0_inner_[table13_0_outer_[i]];
90   }
GetEmit13(size_t,size_t emit)91   static inline uint64_t GetEmit13(size_t, size_t emit) {
92     return table13_0_emit_[emit];
93   }
GetOp14(size_t i)94   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)95   static inline uint64_t GetEmit14(size_t, size_t emit) {
96     return table13_0_emit_[emit];
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)99   static inline uint64_t GetEmit15(size_t, size_t emit) {
100     return table13_0_emit_[emit];
101   }
GetOp16(size_t i)102   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)103   static inline uint64_t GetEmit16(size_t, size_t emit) {
104     return table16_0_emit_[emit];
105   }
GetOp17(size_t i)106   static inline uint64_t GetOp17(size_t i) {
107     return table17_ops_[i >> 6][i & 0x3f];
108   }
GetEmit17(size_t i,size_t emit)109   static inline uint64_t GetEmit17(size_t i, size_t emit) {
110     return table17_emit_[i >> 6][emit];
111   }
GetOp10(size_t i)112   static inline uint64_t GetOp10(size_t i) {
113     return table10_ops_[i >> 5][i & 0x1f];
114   }
GetEmit10(size_t i,size_t emit)115   static inline uint64_t GetEmit10(size_t i, size_t emit) {
116     return table10_emit_[i >> 5][emit];
117   }
GetOp18(size_t i)118   static inline uint64_t GetOp18(size_t i) { return i ? 3 : 1; }
GetEmit18(size_t,size_t emit)119   static inline uint64_t GetEmit18(size_t, size_t emit) {
120     return emit ? 161 : 153;
121   }
GetOp19(size_t i)122   static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; }
GetEmit19(size_t,size_t emit)123   static inline uint64_t GetEmit19(size_t, size_t emit) {
124     return emit ? 172 : 167;
125   }
GetOp20(size_t i)126   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)127   static inline uint64_t GetEmit20(size_t, size_t emit) { return emit + 176; }
GetOp21(size_t i)128   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)129   static inline uint64_t GetEmit21(size_t, size_t emit) {
130     return emit ? 209 : 179;
131   }
GetOp22(size_t i)132   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)133   static inline uint64_t GetEmit22(size_t, size_t emit) { return emit + 216; }
GetOp23(size_t i)134   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)135   static inline uint64_t GetEmit23(size_t, size_t emit) {
136     return emit ? 229 : 227;
137   }
GetOp24(size_t i)138   static inline uint64_t GetOp24(size_t i) {
139     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
140   }
GetEmit24(size_t,size_t emit)141   static inline uint64_t GetEmit24(size_t, size_t emit) {
142     return (emit < 2 ? (emit + 133) : ((emit - 2) ? 146 : 136));
143   }
GetOp25(size_t i)144   static inline uint64_t GetOp25(size_t i) {
145     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
146   }
GetEmit25(size_t,size_t emit)147   static inline uint64_t GetEmit25(size_t, size_t emit) {
148     return (emit < 2 ? (emit ? 156 : 154) : ((emit - 2) ? 163 : 160));
149   }
GetOp26(size_t i)150   static inline uint64_t GetOp26(size_t i) {
151     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
152   }
GetEmit26(size_t,size_t emit)153   static inline uint64_t GetEmit26(size_t, size_t emit) {
154     return (emit < 2 ? (emit ? 169 : 164) : ((emit - 2) ? 173 : 170));
155   }
GetOp27(size_t i)156   static inline uint64_t GetOp27(size_t i) {
157     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
158   }
GetEmit27(size_t,size_t emit)159   static inline uint64_t GetEmit27(size_t, size_t emit) {
160     return (emit < 2 ? (emit ? 181 : 178) : ((emit - 2) + 185));
161   }
GetOp28(size_t i)162   static inline uint64_t GetOp28(size_t i) {
163     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
164   }
GetEmit28(size_t,size_t emit)165   static inline uint64_t GetEmit28(size_t, size_t emit) {
166     return (emit < 2 ? (emit ? 189 : 187) : ((emit - 2) ? 196 : 190));
167   }
GetOp29(size_t i)168   static inline uint64_t GetOp29(size_t i) {
169     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
170   }
GetEmit29(size_t,size_t emit)171   static inline uint64_t GetEmit29(size_t, size_t emit) {
172     return (emit < 2 ? (emit ? 228 : 198) : ((emit - 2) + 232));
173   }
GetOp30(size_t i)174   static inline uint64_t GetOp30(size_t i) { return table30_0_inner_[i]; }
GetEmit30(size_t,size_t emit)175   static inline uint64_t GetEmit30(size_t, size_t emit) {
176     return table30_0_emit_[emit];
177   }
GetOp31(size_t i)178   static inline uint64_t GetOp31(size_t i) { return table30_0_inner_[i]; }
GetEmit31(size_t,size_t emit)179   static inline uint64_t GetEmit31(size_t, size_t emit) {
180     return table31_0_emit_[emit];
181   }
GetOp32(size_t i)182   static inline uint64_t GetOp32(size_t i) { return table30_0_inner_[i]; }
GetEmit32(size_t,size_t emit)183   static inline uint64_t GetEmit32(size_t, size_t emit) {
184     return table32_0_emit_[emit];
185   }
GetOp34(size_t i)186   static inline uint64_t GetOp34(size_t i) { return i; }
GetEmit34(size_t,size_t emit)187   static inline uint64_t GetEmit34(size_t, size_t emit) {
188     return ((void)emit, 230);
189   }
GetOp33(size_t i)190   static inline uint64_t GetOp33(size_t i) {
191     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
192                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
193                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
194   }
GetEmit33(size_t,size_t emit)195   static inline uint64_t GetEmit33(size_t, size_t emit) {
196     return (emit < 1 ? (((void)emit, 230)) : ((emit - 1) ? 132 : 129));
197   }
GetOp36(size_t i)198   static inline uint64_t GetOp36(size_t i) {
199     return table36_0_inner_[(i < 5 ? (i) : (((void)(i - 5), 5)))];
200   }
GetEmit36(size_t,size_t emit)201   static inline uint64_t GetEmit36(size_t, size_t emit) {
202     return table36_0_emit_[emit];
203   }
GetOp35(size_t i)204   static inline uint64_t GetOp35(size_t i) {
205     return table35_0_inner_[(i < 9 ? (i / 2 + 0) : ((i - 9) + 4))];
206   }
GetEmit35(size_t,size_t emit)207   static inline uint64_t GetEmit35(size_t, size_t emit) {
208     return table35_0_emit_[emit];
209   }
GetOp38(size_t i)210   static inline uint64_t GetOp38(size_t i) {
211     return table38_0_inner_[(i < 6 ? (i) : ((i - 6) / 9 + 6))];
212   }
GetEmit38(size_t,size_t emit)213   static inline uint64_t GetEmit38(size_t, size_t emit) {
214     return table38_0_emit_[emit];
215   }
GetOp39(size_t i)216   static inline uint64_t GetOp39(size_t i) { return table39_0_ops_[i]; }
GetEmit39(size_t,size_t emit)217   static inline uint64_t GetEmit39(size_t, size_t emit) {
218     return table39_0_emit_[emit];
219   }
GetOp40(size_t i)220   static inline uint64_t GetOp40(size_t i) { return table40_0_ops_[i]; }
GetEmit40(size_t,size_t emit)221   static inline uint64_t GetEmit40(size_t, size_t emit) {
222     return table40_0_emit_[emit];
223   }
GetOp41(size_t i)224   static inline uint64_t GetOp41(size_t i) { return table41_0_ops_[i]; }
GetEmit41(size_t,size_t emit)225   static inline uint64_t GetEmit41(size_t, size_t emit) {
226     return table41_0_emit_[emit];
227   }
GetOp42(size_t i)228   static inline uint64_t GetOp42(size_t i) {
229     return table42_ops_[i >> 7][i & 0x7f];
230   }
GetEmit42(size_t i,size_t emit)231   static inline uint64_t GetEmit42(size_t i, size_t emit) {
232     return table42_emit_[i >> 7][emit];
233   }
GetOp43(size_t i)234   static inline uint64_t GetOp43(size_t i) {
235     return table43_ops_[i >> 6][i & 0x3f];
236   }
GetEmit43(size_t i,size_t emit)237   static inline uint64_t GetEmit43(size_t i, size_t emit) {
238     return table43_emit_[i >> 6][emit];
239   }
GetOp37(size_t i)240   static inline uint64_t GetOp37(size_t i) {
241     return table37_ops_[i >> 6][i & 0x3f];
242   }
GetEmit37(size_t i,size_t emit)243   static inline uint64_t GetEmit37(size_t i, size_t emit) {
244     return table37_emit_[i >> 6][emit];
245   }
246 
247  private:
248   static const uint8_t table2_0_emit_[10];
249   static const uint8_t table2_0_ops_[32];
250   static const uint8_t table3_0_emit_[36];
251   static const uint8_t table3_0_ops_[64];
252   static const uint8_t table4_0_emit_[22];
253   static const uint8_t table4_0_ops_[64];
254   static const uint8_t table4_1_emit_[46];
255   static const uint8_t table4_1_ops_[64];
256   static const uint8_t* const table4_emit_[2];
257   static const uint8_t* const table4_ops_[2];
258   static const uint8_t table5_0_ops_[128];
259   static const uint8_t table5_1_emit_[52];
260   static const uint8_t table5_1_ops_[128];
261   static const uint8_t* const table5_emit_[2];
262   static const uint8_t* const table5_ops_[2];
263   static const uint8_t table6_0_emit_[2];
264   static const uint8_t table6_0_ops_[32];
265   static const uint8_t table6_1_emit_[2];
266   static const uint8_t table6_2_emit_[2];
267   static const uint8_t table6_3_emit_[2];
268   static const uint8_t table6_4_emit_[2];
269   static const uint8_t table6_5_emit_[4];
270   static const uint8_t table6_5_ops_[32];
271   static const uint8_t table6_6_emit_[4];
272   static const uint8_t table6_7_emit_[4];
273   static const uint8_t table6_8_emit_[4];
274   static const uint8_t table6_9_emit_[4];
275   static const uint8_t table6_10_emit_[4];
276   static const uint8_t table6_11_emit_[6];
277   static const uint8_t table6_11_ops_[32];
278   static const uint8_t table6_12_emit_[8];
279   static const uint8_t table6_12_ops_[32];
280   static const uint8_t table6_13_emit_[8];
281   static const uint8_t table6_14_emit_[8];
282   static const uint8_t table6_15_emit_[10];
283   static const uint8_t table6_15_ops_[32];
284   static const uint8_t* const table6_emit_[16];
285   static const uint8_t* const table6_ops_[16];
286   static const uint8_t table7_0_emit_[36];
287   static const uint8_t table7_0_ops_[64];
288   static const uint8_t table7_1_emit_[36];
289   static const uint8_t table7_1_ops_[64];
290   static const uint8_t table7_2_emit_[36];
291   static const uint8_t table7_2_ops_[64];
292   static const uint8_t table7_3_emit_[36];
293   static const uint8_t table7_3_ops_[64];
294   static const uint8_t table7_4_emit_[38];
295   static const uint8_t table7_4_ops_[64];
296   static const uint8_t table7_5_ops_[64];
297   static const uint8_t table7_11_ops_[64];
298   static const uint8_t table7_12_ops_[64];
299   static const uint8_t table7_15_emit_[15];
300   static const uint8_t table7_15_ops_[64];
301   static const uint8_t* const table7_emit_[16];
302   static const uint8_t* const table7_ops_[16];
303   static const uint8_t table1_0_emit_[71];
304   static const uint16_t table1_0_inner_[37];
305   static const uint8_t table1_0_outer_[64];
306   static const uint8_t table1_1_emit_[71];
307   static const uint16_t table1_1_inner_[37];
308   static const uint8_t table1_2_emit_[71];
309   static const uint16_t table1_2_inner_[37];
310   static const uint8_t table1_3_emit_[71];
311   static const uint16_t table1_3_inner_[37];
312   static const uint8_t table1_4_emit_[71];
313   static const uint16_t table1_4_inner_[37];
314   static const uint8_t table1_5_emit_[71];
315   static const uint16_t table1_5_inner_[37];
316   static const uint8_t table1_6_emit_[71];
317   static const uint16_t table1_6_inner_[37];
318   static const uint8_t table1_7_emit_[71];
319   static const uint16_t table1_7_inner_[37];
320   static const uint8_t table1_8_emit_[71];
321   static const uint16_t table1_8_inner_[37];
322   static const uint8_t table1_9_emit_[71];
323   static const uint16_t table1_9_inner_[37];
324   static const uint8_t table1_10_emit_[40];
325   static const uint16_t table1_10_inner_[22];
326   static const uint8_t table1_10_outer_[64];
327   static const uint8_t table1_11_emit_[40];
328   static const uint8_t table1_12_emit_[40];
329   static const uint8_t table1_13_emit_[40];
330   static const uint8_t table1_14_emit_[40];
331   static const uint8_t table1_15_emit_[40];
332   static const uint8_t table1_16_emit_[40];
333   static const uint8_t table1_17_emit_[40];
334   static const uint8_t table1_18_emit_[40];
335   static const uint8_t table1_19_emit_[40];
336   static const uint8_t table1_20_emit_[40];
337   static const uint8_t table1_21_emit_[40];
338   static const uint8_t table1_22_emit_[40];
339   static const uint8_t table1_23_emit_[4];
340   static const uint16_t table1_23_inner_[4];
341   static const uint8_t table1_23_outer_[64];
342   static const uint8_t table1_24_emit_[4];
343   static const uint8_t table1_25_emit_[4];
344   static const uint8_t table1_26_emit_[4];
345   static const uint8_t table1_27_emit_[4];
346   static const uint8_t table1_28_emit_[4];
347   static const uint8_t table1_29_emit_[4];
348   static const uint8_t table1_30_emit_[4];
349   static const uint8_t table1_31_emit_[14];
350   static const uint16_t table1_31_inner_[17];
351   static const uint8_t table1_31_outer_[64];
352   static const uint8_t* const table1_emit_[32];
353   static const uint16_t* const table1_inner_[32];
354   static const uint8_t* const table1_outer_[32];
355   static const uint8_t table12_0_inner_[6];
356   static const uint8_t table12_0_outer_[8];
357   static const uint8_t table13_0_emit_[7];
358   static const uint8_t table13_0_inner_[9];
359   static const uint8_t table13_0_outer_[16];
360   static const uint8_t table14_0_ops_[32];
361   static const uint8_t table15_0_ops_[64];
362   static const uint8_t table16_0_emit_[45];
363   static const uint8_t table16_0_ops_[128];
364   static const uint8_t table17_0_emit_[72];
365   static const uint16_t table17_0_ops_[64];
366   static const uint8_t table17_1_emit_[72];
367   static const uint8_t table17_2_emit_[40];
368   static const uint16_t table17_2_ops_[64];
369   static const uint8_t table17_3_emit_[6];
370   static const uint16_t table17_3_ops_[64];
371   static const uint8_t* const table17_emit_[4];
372   static const uint16_t* const table17_ops_[4];
373   static const uint8_t table10_0_emit_[1];
374   static const uint16_t table10_0_ops_[32];
375   static const uint8_t table10_4_emit_[1];
376   static const uint8_t table10_8_emit_[1];
377   static const uint16_t table10_8_ops_[32];
378   static const uint8_t table10_10_emit_[1];
379   static const uint8_t table10_12_emit_[1];
380   static const uint16_t table10_12_ops_[32];
381   static const uint8_t table10_13_emit_[1];
382   static const uint8_t table10_14_emit_[1];
383   static const uint8_t table10_15_emit_[11];
384   static const uint16_t table10_15_ops_[32];
385   static const uint8_t* const table10_emit_[16];
386   static const uint16_t* const table10_ops_[16];
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_0_ops_[64];
410   static const uint8_t table43_1_emit_[40];
411   static const uint8_t table43_2_emit_[40];
412   static const uint8_t table43_3_emit_[4];
413   static const uint8_t table43_4_emit_[8];
414   static const uint8_t table43_5_emit_[9];
415   static const uint8_t table43_5_ops_[64];
416   static const uint8_t table43_6_emit_[16];
417   static const uint8_t table43_6_ops_[64];
418   static const uint8_t table43_7_emit_[30];
419   static const uint8_t table43_7_ops_[64];
420   static const uint8_t* const table43_emit_[8];
421   static const uint8_t* const table43_ops_[8];
422   static const uint8_t table37_0_emit_[1];
423   static const uint16_t table37_0_ops_[64];
424   static const uint8_t table37_1_emit_[1];
425   static const uint8_t table37_2_emit_[1];
426   static const uint8_t table37_3_emit_[1];
427   static const uint8_t table37_4_emit_[1];
428   static const uint8_t table37_5_emit_[1];
429   static const uint8_t table37_6_emit_[2];
430   static const uint16_t table37_6_ops_[64];
431   static const uint8_t table37_7_emit_[2];
432   static const uint8_t table37_8_emit_[4];
433   static const uint16_t table37_8_ops_[64];
434   static const uint8_t table37_9_emit_[4];
435   static const uint8_t table37_10_emit_[4];
436   static const uint8_t table37_11_emit_[5];
437   static const uint16_t table37_11_ops_[64];
438   static const uint8_t table37_12_emit_[8];
439   static const uint16_t table37_12_ops_[64];
440   static const uint8_t table37_13_emit_[8];
441   static const uint8_t table37_14_emit_[15];
442   static const uint16_t table37_14_ops_[64];
443   static const uint8_t table37_15_emit_[18];
444   static const uint16_t table37_15_ops_[64];
445   static const uint8_t* const table37_emit_[16];
446   static const uint16_t* const table37_ops_[16];
447 };
448 template <typename F>
449 class HuffDecoder : public HuffDecoderCommon {
450  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)451   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
452       : sink_(sink), begin_(begin), end_(end) {}
Run()453   bool Run() {
454     while (!done_) {
455       if (!RefillTo11()) {
456         Done0();
457         break;
458       }
459       const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
460       const auto op = GetOp1(index);
461       const int consumed = op & 15;
462       buffer_len_ -= consumed;
463       const auto emit_ofs = op >> 7;
464       switch ((op >> 4) & 7) {
465         case 0: {
466           sink_(GetEmit1(index, emit_ofs + 0));
467           sink_(GetEmit1(index, emit_ofs + 1));
468           break;
469         }
470         case 1: {
471           sink_(GetEmit1(index, emit_ofs + 0));
472           break;
473         }
474         case 2: {
475           DecodeStep0();
476           break;
477         }
478         case 3: {
479           DecodeStep1();
480           break;
481         }
482         case 4: {
483           DecodeStep2();
484           break;
485         }
486       }
487     }
488     return ok_;
489   }
490 
491  private:
RefillTo11()492   bool RefillTo11() {
493     switch (buffer_len_) {
494       case 0: {
495         return Read2to8Bytes();
496       }
497       case 1:
498       case 2: {
499         return Read2to7Bytes();
500       }
501       case 3:
502       case 4:
503       case 5:
504       case 6:
505       case 7:
506       case 8: {
507         return Read1to7Bytes();
508       }
509       case 9:
510       case 10: {
511         return Read1to6Bytes();
512       }
513     }
514     return true;
515   }
Read2to8Bytes()516   bool Read2to8Bytes() {
517     switch (end_ - begin_) {
518       case 0:
519       case 1: {
520         return false;
521       }
522       case 2: {
523         Fill2();
524         return true;
525       }
526       case 3: {
527         Fill3();
528         return true;
529       }
530       case 4: {
531         Fill4();
532         return true;
533       }
534       case 5: {
535         Fill5();
536         return true;
537       }
538       case 6: {
539         Fill6();
540         return true;
541       }
542       case 7: {
543         Fill7();
544         return true;
545       }
546       default: {
547         Fill8();
548         return true;
549       }
550     }
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   }
Read2to7Bytes()615   bool Read2to7Bytes() {
616     switch (end_ - begin_) {
617       case 0:
618       case 1: {
619         return false;
620       }
621       case 2: {
622         Fill2();
623         return true;
624       }
625       case 3: {
626         Fill3();
627         return true;
628       }
629       case 4: {
630         Fill4();
631         return true;
632       }
633       case 5: {
634         Fill5();
635         return true;
636       }
637       case 6: {
638         Fill6();
639         return true;
640       }
641       default: {
642         Fill7();
643         return true;
644       }
645     }
646   }
Read1to7Bytes()647   bool Read1to7Bytes() {
648     switch (end_ - begin_) {
649       case 0: {
650         return false;
651       }
652       case 1: {
653         Fill1();
654         return true;
655       }
656       case 2: {
657         Fill2();
658         return true;
659       }
660       case 3: {
661         Fill3();
662         return true;
663       }
664       case 4: {
665         Fill4();
666         return true;
667       }
668       case 5: {
669         Fill5();
670         return true;
671       }
672       case 6: {
673         Fill6();
674         return true;
675       }
676       default: {
677         Fill7();
678         return true;
679       }
680     }
681   }
Fill1()682   void Fill1() {
683     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
684     begin_ += 1;
685     buffer_len_ += 8;
686   }
Read1to6Bytes()687   bool Read1to6Bytes() {
688     switch (end_ - begin_) {
689       case 0: {
690         return false;
691       }
692       case 1: {
693         Fill1();
694         return true;
695       }
696       case 2: {
697         Fill2();
698         return true;
699       }
700       case 3: {
701         Fill3();
702         return true;
703       }
704       case 4: {
705         Fill4();
706         return true;
707       }
708       case 5: {
709         Fill5();
710         return true;
711       }
712       default: {
713         Fill6();
714         return true;
715       }
716     }
717   }
Done0()718   void Done0() {
719     done_ = true;
720     switch (end_ - begin_) {
721       case 1: {
722         Fill1();
723         break;
724       }
725     }
726     switch (buffer_len_) {
727       case 1:
728       case 2:
729       case 3:
730       case 4: {
731         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
732         return;
733       }
734       case 5: {
735         const auto index = buffer_ & 31;
736         const auto op = GetOp2(index);
737         switch (op & 3) {
738           case 0: {
739             sink_(GetEmit2(index, (op >> 2) + 0));
740             break;
741           }
742           case 1: {
743             ok_ = false;
744             break;
745           }
746         }
747         return;
748       }
749       case 6: {
750         const auto index = buffer_ & 63;
751         const auto op = GetOp3(index);
752         switch (op & 3) {
753           case 0: {
754             ok_ = false;
755             break;
756           }
757           case 1: {
758             sink_(GetEmit3(index, (op >> 2) + 0));
759             break;
760           }
761         }
762         return;
763       }
764       case 7: {
765         const auto index = buffer_ & 127;
766         const auto op = GetOp4(index);
767         switch (op & 3) {
768           case 0: {
769             ok_ = false;
770             break;
771           }
772           case 1: {
773             sink_(GetEmit4(index, (op >> 2) + 0));
774             break;
775           }
776         }
777         return;
778       }
779       case 8: {
780         const auto index = buffer_ & 255;
781         const auto op = GetOp5(index);
782         switch (op & 3) {
783           case 0: {
784             ok_ = false;
785             break;
786           }
787           case 1: {
788             sink_(GetEmit5(index, (op >> 2) + 0));
789             break;
790           }
791         }
792         return;
793       }
794       case 9: {
795         const auto index = buffer_ & 511;
796         const auto op = GetOp6(index);
797         switch (op & 3) {
798           case 0: {
799             ok_ = false;
800             break;
801           }
802           case 1: {
803             sink_(GetEmit6(index, (op >> 2) + 0));
804             break;
805           }
806         }
807         return;
808       }
809       case 10: {
810         const auto index = buffer_ & 1023;
811         const auto op = GetOp7(index);
812         switch (op & 3) {
813           case 0: {
814             sink_(GetEmit7(index, (op >> 2) + 0));
815             sink_(GetEmit7(index, (op >> 2) + 1));
816             break;
817           }
818           case 1: {
819             ok_ = false;
820             break;
821           }
822           case 2: {
823             sink_(GetEmit7(index, (op >> 2) + 0));
824             break;
825           }
826         }
827         return;
828       }
829       case 0: {
830         return;
831       }
832     }
833   }
DecodeStep0()834   void DecodeStep0() {
835     if (!RefillTo1()) {
836       Done1();
837       return;
838     }
839     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
840     const auto op = GetOp8(index);
841     const int consumed = op & 1;
842     buffer_len_ -= consumed;
843     const auto emit_ofs = op >> 1;
844     sink_(GetEmit8(index, emit_ofs + 0));
845   }
RefillTo1()846   bool RefillTo1() {
847     switch (buffer_len_) {
848       case 0: {
849         return Read1to8Bytes();
850       }
851     }
852     return true;
853   }
Read1to8Bytes()854   bool Read1to8Bytes() {
855     switch (end_ - begin_) {
856       case 0: {
857         return false;
858       }
859       case 1: {
860         Fill1();
861         return true;
862       }
863       case 2: {
864         Fill2();
865         return true;
866       }
867       case 3: {
868         Fill3();
869         return true;
870       }
871       case 4: {
872         Fill4();
873         return true;
874       }
875       case 5: {
876         Fill5();
877         return true;
878       }
879       case 6: {
880         Fill6();
881         return true;
882       }
883       case 7: {
884         Fill7();
885         return true;
886       }
887       default: {
888         Fill8();
889         return true;
890       }
891     }
892   }
Done1()893   void Done1() {
894     done_ = true;
895     ok_ = false;
896   }
DecodeStep1()897   void DecodeStep1() {
898     if (!RefillTo2()) {
899       Done2();
900       return;
901     }
902     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
903     const auto op = GetOp9(index);
904     const int consumed = op & 3;
905     buffer_len_ -= consumed;
906     const auto emit_ofs = op >> 2;
907     sink_(GetEmit9(index, emit_ofs + 0));
908   }
RefillTo2()909   bool RefillTo2() {
910     switch (buffer_len_) {
911       case 0: {
912         return Read1to8Bytes();
913       }
914       case 1: {
915         return Read1to7Bytes();
916       }
917     }
918     return true;
919   }
Done2()920   void Done2() {
921     done_ = true;
922     switch (buffer_len_) {
923       case 1:
924       case 0: {
925         ok_ = false;
926         return;
927       }
928     }
929   }
DecodeStep2()930   void DecodeStep2() {
931     if (!RefillTo9()) {
932       Done3();
933       return;
934     }
935     const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
936     const auto op = GetOp10(index);
937     const int consumed = op & 15;
938     buffer_len_ -= consumed;
939     const auto emit_ofs = op >> 9;
940     switch ((op >> 4) & 31) {
941       case 0: {
942         sink_(GetEmit10(index, emit_ofs + 0));
943         break;
944       }
945       case 1: {
946         DecodeStep3();
947         break;
948       }
949       case 2: {
950         DecodeStep4();
951         break;
952       }
953       case 3: {
954         DecodeStep5();
955         break;
956       }
957       case 4: {
958         DecodeStep6();
959         break;
960       }
961       case 5: {
962         DecodeStep7();
963         break;
964       }
965       case 6: {
966         DecodeStep8();
967         break;
968       }
969       case 7: {
970         DecodeStep18();
971         break;
972       }
973       case 8: {
974         DecodeStep9();
975         break;
976       }
977       case 9: {
978         DecodeStep10();
979         break;
980       }
981       case 10: {
982         DecodeStep11();
983         break;
984       }
985       case 11: {
986         DecodeStep12();
987         break;
988       }
989       case 12: {
990         DecodeStep13();
991         break;
992       }
993       case 13: {
994         DecodeStep14();
995         break;
996       }
997       case 14: {
998         DecodeStep15();
999         break;
1000       }
1001       case 15: {
1002         DecodeStep16();
1003         break;
1004       }
1005       case 16: {
1006         DecodeStep17();
1007         break;
1008       }
1009       case 17: {
1010         DecodeStep19();
1011         break;
1012       }
1013       case 18: {
1014         DecodeStep20();
1015         break;
1016       }
1017     }
1018   }
RefillTo9()1019   bool RefillTo9() {
1020     switch (buffer_len_) {
1021       case 0: {
1022         return Read2to8Bytes();
1023       }
1024       case 1:
1025       case 2:
1026       case 3:
1027       case 4:
1028       case 5:
1029       case 6:
1030       case 7:
1031       case 8: {
1032         return Read1to7Bytes();
1033       }
1034     }
1035     return true;
1036   }
Done3()1037   void Done3() {
1038     done_ = true;
1039     switch (end_ - begin_) {
1040       case 1: {
1041         Fill1();
1042         break;
1043       }
1044     }
1045     switch (buffer_len_) {
1046       case 1: {
1047         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1048         return;
1049       }
1050       case 2: {
1051         const auto index = buffer_ & 3;
1052         const auto op = GetOp11(index);
1053         switch (op & 3) {
1054           case 0: {
1055             sink_(GetEmit11(index, (op >> 2) + 0));
1056             break;
1057           }
1058           case 1: {
1059             ok_ = false;
1060             break;
1061           }
1062         }
1063         return;
1064       }
1065       case 3: {
1066         const auto index = buffer_ & 7;
1067         const auto op = GetOp12(index);
1068         switch (op & 3) {
1069           case 0: {
1070             ok_ = false;
1071             break;
1072           }
1073           case 1: {
1074             sink_(GetEmit12(index, (op >> 2) + 0));
1075             break;
1076           }
1077         }
1078         return;
1079       }
1080       case 4: {
1081         const auto index = buffer_ & 15;
1082         const auto op = GetOp13(index);
1083         switch (op & 3) {
1084           case 0: {
1085             ok_ = false;
1086             break;
1087           }
1088           case 1: {
1089             sink_(GetEmit13(index, (op >> 2) + 0));
1090             break;
1091           }
1092         }
1093         return;
1094       }
1095       case 5: {
1096         const auto index = buffer_ & 31;
1097         const auto op = GetOp14(index);
1098         switch (op & 3) {
1099           case 0: {
1100             ok_ = false;
1101             break;
1102           }
1103           case 1: {
1104             sink_(GetEmit14(index, (op >> 2) + 0));
1105             break;
1106           }
1107         }
1108         return;
1109       }
1110       case 6: {
1111         const auto index = buffer_ & 63;
1112         const auto op = GetOp15(index);
1113         switch (op & 3) {
1114           case 0: {
1115             ok_ = false;
1116             break;
1117           }
1118           case 1: {
1119             sink_(GetEmit15(index, (op >> 2) + 0));
1120             break;
1121           }
1122         }
1123         return;
1124       }
1125       case 7: {
1126         const auto index = buffer_ & 127;
1127         const auto op = GetOp16(index);
1128         switch (op & 3) {
1129           case 0: {
1130             sink_(GetEmit16(index, (op >> 2) + 0));
1131             sink_(GetEmit16(index, (op >> 2) + 1));
1132             break;
1133           }
1134           case 1: {
1135             ok_ = false;
1136             break;
1137           }
1138           case 2: {
1139             sink_(GetEmit16(index, (op >> 2) + 0));
1140             break;
1141           }
1142         }
1143         return;
1144       }
1145       case 8: {
1146         const auto index = buffer_ & 255;
1147         const auto op = GetOp17(index);
1148         switch (op & 3) {
1149           case 0: {
1150             ok_ = false;
1151             break;
1152           }
1153           case 1: {
1154             sink_(GetEmit17(index, (op >> 2) + 0));
1155             sink_(GetEmit17(index, (op >> 2) + 1));
1156             break;
1157           }
1158           case 2: {
1159             sink_(GetEmit17(index, (op >> 2) + 0));
1160             break;
1161           }
1162         }
1163         return;
1164       }
1165       case 0: {
1166         return;
1167       }
1168     }
1169   }
DecodeStep3()1170   void DecodeStep3() {
1171     if (!RefillTo1()) {
1172       Done4();
1173       return;
1174     }
1175     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1176     const auto op = GetOp18(index);
1177     const int consumed = op & 1;
1178     buffer_len_ -= consumed;
1179     const auto emit_ofs = op >> 1;
1180     sink_(GetEmit18(index, emit_ofs + 0));
1181   }
Done4()1182   void Done4() {
1183     done_ = true;
1184     ok_ = false;
1185   }
DecodeStep4()1186   void DecodeStep4() {
1187     if (!RefillTo1()) {
1188       Done5();
1189       return;
1190     }
1191     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1192     const auto op = GetOp19(index);
1193     const int consumed = op & 1;
1194     buffer_len_ -= consumed;
1195     const auto emit_ofs = op >> 1;
1196     sink_(GetEmit19(index, emit_ofs + 0));
1197   }
Done5()1198   void Done5() {
1199     done_ = true;
1200     ok_ = false;
1201   }
DecodeStep5()1202   void DecodeStep5() {
1203     if (!RefillTo1()) {
1204       Done6();
1205       return;
1206     }
1207     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1208     const auto op = GetOp20(index);
1209     const int consumed = op & 1;
1210     buffer_len_ -= consumed;
1211     const auto emit_ofs = op >> 1;
1212     sink_(GetEmit20(index, emit_ofs + 0));
1213   }
Done6()1214   void Done6() {
1215     done_ = true;
1216     ok_ = false;
1217   }
DecodeStep6()1218   void DecodeStep6() {
1219     if (!RefillTo1()) {
1220       Done7();
1221       return;
1222     }
1223     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1224     const auto op = GetOp21(index);
1225     const int consumed = op & 1;
1226     buffer_len_ -= consumed;
1227     const auto emit_ofs = op >> 1;
1228     sink_(GetEmit21(index, emit_ofs + 0));
1229   }
Done7()1230   void Done7() {
1231     done_ = true;
1232     ok_ = false;
1233   }
DecodeStep7()1234   void DecodeStep7() {
1235     if (!RefillTo1()) {
1236       Done8();
1237       return;
1238     }
1239     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1240     const auto op = GetOp22(index);
1241     const int consumed = op & 1;
1242     buffer_len_ -= consumed;
1243     const auto emit_ofs = op >> 1;
1244     sink_(GetEmit22(index, emit_ofs + 0));
1245   }
Done8()1246   void Done8() {
1247     done_ = true;
1248     ok_ = false;
1249   }
DecodeStep8()1250   void DecodeStep8() {
1251     if (!RefillTo1()) {
1252       Done9();
1253       return;
1254     }
1255     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1256     const auto op = GetOp23(index);
1257     const int consumed = op & 1;
1258     buffer_len_ -= consumed;
1259     const auto emit_ofs = op >> 1;
1260     sink_(GetEmit23(index, emit_ofs + 0));
1261   }
Done9()1262   void Done9() {
1263     done_ = true;
1264     ok_ = false;
1265   }
DecodeStep9()1266   void DecodeStep9() {
1267     if (!RefillTo2()) {
1268       Done10();
1269       return;
1270     }
1271     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1272     const auto op = GetOp24(index);
1273     const int consumed = op & 3;
1274     buffer_len_ -= consumed;
1275     const auto emit_ofs = op >> 2;
1276     sink_(GetEmit24(index, emit_ofs + 0));
1277   }
Done10()1278   void Done10() {
1279     done_ = true;
1280     switch (buffer_len_) {
1281       case 1:
1282       case 0: {
1283         ok_ = false;
1284         return;
1285       }
1286     }
1287   }
DecodeStep10()1288   void DecodeStep10() {
1289     if (!RefillTo2()) {
1290       Done11();
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   }
Done11()1300   void Done11() {
1301     done_ = true;
1302     switch (buffer_len_) {
1303       case 1:
1304       case 0: {
1305         ok_ = false;
1306         return;
1307       }
1308     }
1309   }
DecodeStep11()1310   void DecodeStep11() {
1311     if (!RefillTo2()) {
1312       Done12();
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   }
Done12()1322   void Done12() {
1323     done_ = true;
1324     switch (buffer_len_) {
1325       case 1:
1326       case 0: {
1327         ok_ = false;
1328         return;
1329       }
1330     }
1331   }
DecodeStep12()1332   void DecodeStep12() {
1333     if (!RefillTo2()) {
1334       Done13();
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   }
Done13()1344   void Done13() {
1345     done_ = true;
1346     switch (buffer_len_) {
1347       case 1:
1348       case 0: {
1349         ok_ = false;
1350         return;
1351       }
1352     }
1353   }
DecodeStep13()1354   void DecodeStep13() {
1355     if (!RefillTo2()) {
1356       Done14();
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   }
Done14()1366   void Done14() {
1367     done_ = true;
1368     switch (buffer_len_) {
1369       case 1:
1370       case 0: {
1371         ok_ = false;
1372         return;
1373       }
1374     }
1375   }
DecodeStep14()1376   void DecodeStep14() {
1377     if (!RefillTo2()) {
1378       Done15();
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   }
Done15()1388   void Done15() {
1389     done_ = true;
1390     switch (buffer_len_) {
1391       case 1:
1392       case 0: {
1393         ok_ = false;
1394         return;
1395       }
1396     }
1397   }
DecodeStep15()1398   void DecodeStep15() {
1399     if (!RefillTo3()) {
1400       Done16();
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   }
Done16()1422   void Done16() {
1423     done_ = true;
1424     switch (buffer_len_) {
1425       case 1:
1426       case 2:
1427       case 0: {
1428         ok_ = false;
1429         return;
1430       }
1431     }
1432   }
DecodeStep16()1433   void DecodeStep16() {
1434     if (!RefillTo3()) {
1435       Done17();
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   }
Done17()1445   void Done17() {
1446     done_ = true;
1447     switch (buffer_len_) {
1448       case 1:
1449       case 2:
1450       case 0: {
1451         ok_ = false;
1452         return;
1453       }
1454     }
1455   }
DecodeStep17()1456   void DecodeStep17() {
1457     if (!RefillTo3()) {
1458       Done18();
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   }
Done18()1468   void Done18() {
1469     done_ = true;
1470     switch (buffer_len_) {
1471       case 1:
1472       case 2:
1473       case 0: {
1474         ok_ = false;
1475         return;
1476       }
1477     }
1478   }
DecodeStep18()1479   void DecodeStep18() {
1480     if (!RefillTo2()) {
1481       Done19();
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   }
Done19()1491   void Done19() {
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   }
DecodeStep19()1515   void DecodeStep19() {
1516     if (!RefillTo4()) {
1517       Done20();
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   }
Done20()1540   void Done20() {
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   }
DecodeStep20()1566   void DecodeStep20() {
1567     if (!RefillTo10()) {
1568       Done21();
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   }
Done21()1611   void Done21() {
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_11_9_10
1735 }  // namespace grpc_core
1736 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_9_10_H
1737