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