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