xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_11_11_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_11_11_8_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_11_8_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_11_11_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   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp1(size_t i)60   static inline uint64_t GetOp1(size_t i) {
61     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit1(size_t i,size_t emit)63   static inline uint64_t GetEmit1(size_t i, size_t emit) {
64     return table1_emit_[i >> 6][emit];
65   }
GetOp8(size_t i)66   static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return emit ? 62 : 35;
69   }
GetOp9(size_t i)70   static inline uint64_t GetOp9(size_t i) {
71     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
72   }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) {
74     return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64));
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) {
77     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
78   }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return table12_0_inner_[table12_0_outer_[i]];
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94));
87   }
GetOp13(size_t i)88   static inline uint64_t GetOp13(size_t i) {
89     return table13_0_inner_[table13_0_outer_[i]];
90   }
GetEmit13(size_t,size_t emit)91   static inline uint64_t GetEmit13(size_t, size_t emit) {
92     return table13_0_emit_[emit];
93   }
GetOp14(size_t i)94   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)95   static inline uint64_t GetEmit14(size_t, size_t emit) {
96     return table13_0_emit_[emit];
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)99   static inline uint64_t GetEmit15(size_t, size_t emit) {
100     return table13_0_emit_[emit];
101   }
GetOp16(size_t i)102   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)103   static inline uint64_t GetEmit16(size_t, size_t emit) {
104     return table16_0_emit_[emit];
105   }
GetOp17(size_t i)106   static inline uint64_t GetOp17(size_t i) {
107     return table17_ops_[i >> 6][i & 0x3f];
108   }
GetEmit17(size_t i,size_t emit)109   static inline uint64_t GetEmit17(size_t i, size_t emit) {
110     return table17_emit_[i >> 6][emit];
111   }
GetOp18(size_t i)112   static inline uint64_t GetOp18(size_t i) {
113     return table18_ops_[i >> 6][i & 0x3f];
114   }
GetEmit18(size_t i,size_t emit)115   static inline uint64_t GetEmit18(size_t i, size_t emit) {
116     return table18_emit_[i >> 6][emit];
117   }
GetOp19(size_t i)118   static inline uint64_t GetOp19(size_t i) {
119     return table19_ops_[i >> 6][i & 0x3f];
120   }
GetEmit19(size_t i,size_t emit)121   static inline uint64_t GetEmit19(size_t i, size_t emit) {
122     return table19_emit_[i >> 6][emit];
123   }
GetOp10(size_t i)124   static inline uint64_t GetOp10(size_t i) {
125     return table10_ops_[i >> 7][i & 0x7f];
126   }
GetEmit10(size_t i,size_t emit)127   static inline uint64_t GetEmit10(size_t i, size_t emit) {
128     return table10_emit_[i >> 7][emit];
129   }
GetOp20(size_t i)130   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)131   static inline uint64_t GetEmit20(size_t, size_t emit) {
132     return emit ? 135 : 1;
133   }
GetOp21(size_t i)134   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)135   static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 137; }
GetOp22(size_t i)136   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)137   static inline uint64_t GetEmit22(size_t, size_t emit) { return emit + 139; }
GetOp23(size_t i)138   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)139   static inline uint64_t GetEmit23(size_t, size_t emit) {
140     return emit ? 143 : 141;
141   }
GetOp24(size_t i)142   static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; }
GetEmit24(size_t,size_t emit)143   static inline uint64_t GetEmit24(size_t, size_t emit) {
144     return emit ? 149 : 147;
145   }
GetOp25(size_t i)146   static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; }
GetEmit25(size_t,size_t emit)147   static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 150; }
GetOp26(size_t i)148   static inline uint64_t GetOp26(size_t i) { return i ? 3 : 1; }
GetEmit26(size_t,size_t emit)149   static inline uint64_t GetEmit26(size_t, size_t emit) {
150     return emit ? 155 : 152;
151   }
GetOp27(size_t i)152   static inline uint64_t GetOp27(size_t i) { return i ? 3 : 1; }
GetEmit27(size_t,size_t emit)153   static inline uint64_t GetEmit27(size_t, size_t emit) { return emit + 157; }
GetOp28(size_t i)154   static inline uint64_t GetOp28(size_t i) { return i ? 3 : 1; }
GetEmit28(size_t,size_t emit)155   static inline uint64_t GetEmit28(size_t, size_t emit) { return emit + 165; }
GetOp29(size_t i)156   static inline uint64_t GetOp29(size_t i) { return i ? 3 : 1; }
GetEmit29(size_t,size_t emit)157   static inline uint64_t GetEmit29(size_t, size_t emit) {
158     return emit ? 174 : 168;
159   }
GetOp30(size_t i)160   static inline uint64_t GetOp30(size_t i) { return i ? 3 : 1; }
GetEmit30(size_t,size_t emit)161   static inline uint64_t GetEmit30(size_t, size_t emit) {
162     return emit ? 180 : 175;
163   }
GetOp31(size_t i)164   static inline uint64_t GetOp31(size_t i) { return i ? 3 : 1; }
GetEmit31(size_t,size_t emit)165   static inline uint64_t GetEmit31(size_t, size_t emit) { return emit + 182; }
GetOp32(size_t i)166   static inline uint64_t GetOp32(size_t i) { return i ? 3 : 1; }
GetEmit32(size_t,size_t emit)167   static inline uint64_t GetEmit32(size_t, size_t emit) {
168     return emit ? 191 : 188;
169   }
GetOp33(size_t i)170   static inline uint64_t GetOp33(size_t i) { return i ? 3 : 1; }
GetEmit33(size_t,size_t emit)171   static inline uint64_t GetEmit33(size_t, size_t emit) {
172     return emit ? 231 : 197;
173   }
GetOp34(size_t i)174   static inline uint64_t GetOp34(size_t i) {
175     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
176   }
GetEmit34(size_t,size_t emit)177   static inline uint64_t GetEmit34(size_t, size_t emit) {
178     return (emit < 2 ? (emit + 144) : ((emit - 2) ? 159 : 148));
179   }
GetOp35(size_t i)180   static inline uint64_t GetOp35(size_t i) {
181     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
182   }
GetEmit35(size_t,size_t emit)183   static inline uint64_t GetEmit35(size_t, size_t emit) {
184     return (emit < 2 ? (emit ? 206 : 171) : ((emit - 2) ? 225 : 215));
185   }
GetOp37(size_t i)186   static inline uint64_t GetOp37(size_t i) { return table37_0_inner_[i]; }
GetEmit37(size_t,size_t emit)187   static inline uint64_t GetEmit37(size_t, size_t emit) {
188     return table37_0_emit_[emit];
189   }
GetOp36(size_t i)190   static inline uint64_t GetOp36(size_t i) { return table36_0_ops_[i]; }
GetEmit36(size_t,size_t emit)191   static inline uint64_t GetEmit36(size_t, size_t emit) {
192     return table36_0_emit_[emit];
193   }
GetOp39(size_t i)194   static inline uint64_t GetOp39(size_t i) { return i; }
GetEmit39(size_t,size_t emit)195   static inline uint64_t GetEmit39(size_t, size_t emit) {
196     return ((void)emit, 239);
197   }
GetOp38(size_t i)198   static inline uint64_t GetOp38(size_t i) {
199     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
200                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
201                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
202   }
GetEmit38(size_t,size_t emit)203   static inline uint64_t GetEmit38(size_t, size_t emit) {
204     return (emit < 1 ? (((void)emit, 239)) : ((emit - 1) ? 142 : 9));
205   }
GetOp41(size_t i)206   static inline uint64_t GetOp41(size_t i) {
207     return ((i < 2 ? (i) : (((void)(i - 2), 2))) < 1
208                 ? (((void)(i < 2 ? (i) : (((void)(i - 2), 2))), 0))
209                 : (((i < 2 ? (i) : (((void)(i - 2), 2))) - 1) ? 1 : 2));
210   }
GetEmit41(size_t,size_t emit)211   static inline uint64_t GetEmit41(size_t, size_t emit) { return emit + 236; }
GetOp40(size_t i)212   static inline uint64_t GetOp40(size_t i) {
213     return table40_0_inner_[(i < 3 ? (i / 2 + 0) : ((i - 3) + 1))];
214   }
GetEmit40(size_t,size_t emit)215   static inline uint64_t GetEmit40(size_t, size_t emit) {
216     return table40_0_emit_[emit];
217   }
GetOp43(size_t i)218   static inline uint64_t GetOp43(size_t i) { return table43_0_ops_[i]; }
GetEmit43(size_t,size_t emit)219   static inline uint64_t GetEmit43(size_t, size_t emit) {
220     return table43_0_emit_[emit];
221   }
GetOp44(size_t i)222   static inline uint64_t GetOp44(size_t i) { return table44_0_ops_[i]; }
GetEmit44(size_t,size_t emit)223   static inline uint64_t GetEmit44(size_t, size_t emit) {
224     return table44_0_emit_[emit];
225   }
GetOp45(size_t i)226   static inline uint64_t GetOp45(size_t i) { return table45_0_ops_[i]; }
GetEmit45(size_t,size_t emit)227   static inline uint64_t GetEmit45(size_t, size_t emit) {
228     return table44_0_emit_[emit];
229   }
GetOp42(size_t i)230   static inline uint64_t GetOp42(size_t i) {
231     return table42_ops_[i >> 5][i & 0x1f];
232   }
GetEmit42(size_t i,size_t emit)233   static inline uint64_t GetEmit42(size_t i, size_t emit) {
234     return table42_emit_[i >> 5][emit];
235   }
236 
237  private:
238   static const uint8_t table2_0_emit_[10];
239   static const uint8_t table2_0_ops_[32];
240   static const uint8_t table3_0_emit_[36];
241   static const uint8_t table3_0_ops_[64];
242   static const uint8_t table4_0_emit_[22];
243   static const uint8_t table4_0_ops_[64];
244   static const uint8_t table4_1_emit_[46];
245   static const uint8_t table4_1_ops_[64];
246   static const uint8_t* const table4_emit_[2];
247   static const uint8_t* const table4_ops_[2];
248   static const uint8_t table5_0_ops_[128];
249   static const uint8_t table5_1_emit_[52];
250   static const uint8_t table5_1_ops_[128];
251   static const uint8_t* const table5_emit_[2];
252   static const uint8_t* const table5_ops_[2];
253   static const uint8_t table6_0_emit_[2];
254   static const uint8_t table6_0_ops_[32];
255   static const uint8_t table6_1_emit_[2];
256   static const uint8_t table6_2_emit_[2];
257   static const uint8_t table6_3_emit_[2];
258   static const uint8_t table6_4_emit_[2];
259   static const uint8_t table6_5_emit_[4];
260   static const uint8_t table6_5_ops_[32];
261   static const uint8_t table6_6_emit_[4];
262   static const uint8_t table6_7_emit_[4];
263   static const uint8_t table6_8_emit_[4];
264   static const uint8_t table6_9_emit_[4];
265   static const uint8_t table6_10_emit_[4];
266   static const uint8_t table6_11_emit_[6];
267   static const uint8_t table6_11_ops_[32];
268   static const uint8_t table6_12_emit_[8];
269   static const uint8_t table6_12_ops_[32];
270   static const uint8_t table6_13_emit_[8];
271   static const uint8_t table6_14_emit_[8];
272   static const uint8_t table6_15_emit_[10];
273   static const uint8_t table6_15_ops_[32];
274   static const uint8_t* const table6_emit_[16];
275   static const uint8_t* const table6_ops_[16];
276   static const uint8_t table7_0_emit_[36];
277   static const uint8_t table7_0_ops_[64];
278   static const uint8_t table7_1_emit_[36];
279   static const uint8_t table7_1_ops_[64];
280   static const uint8_t table7_2_emit_[36];
281   static const uint8_t table7_2_ops_[64];
282   static const uint8_t table7_3_emit_[36];
283   static const uint8_t table7_3_ops_[64];
284   static const uint8_t table7_4_emit_[38];
285   static const uint8_t table7_4_ops_[64];
286   static const uint8_t table7_5_ops_[64];
287   static const uint8_t table7_11_ops_[64];
288   static const uint8_t table7_12_ops_[64];
289   static const uint8_t table7_15_emit_[15];
290   static const uint8_t table7_15_ops_[64];
291   static const uint8_t* const table7_emit_[16];
292   static const uint8_t* const table7_ops_[16];
293   static const uint8_t table1_0_emit_[71];
294   static const uint16_t table1_0_inner_[37];
295   static const uint8_t table1_0_outer_[64];
296   static const uint8_t table1_1_emit_[71];
297   static const uint16_t table1_1_inner_[37];
298   static const uint8_t table1_2_emit_[71];
299   static const uint16_t table1_2_inner_[37];
300   static const uint8_t table1_3_emit_[71];
301   static const uint16_t table1_3_inner_[37];
302   static const uint8_t table1_4_emit_[71];
303   static const uint16_t table1_4_inner_[37];
304   static const uint8_t table1_5_emit_[71];
305   static const uint16_t table1_5_inner_[37];
306   static const uint8_t table1_6_emit_[71];
307   static const uint16_t table1_6_inner_[37];
308   static const uint8_t table1_7_emit_[71];
309   static const uint16_t table1_7_inner_[37];
310   static const uint8_t table1_8_emit_[71];
311   static const uint16_t table1_8_inner_[37];
312   static const uint8_t table1_9_emit_[71];
313   static const uint16_t table1_9_inner_[37];
314   static const uint8_t table1_10_emit_[40];
315   static const uint16_t table1_10_inner_[22];
316   static const uint8_t table1_10_outer_[64];
317   static const uint8_t table1_11_emit_[40];
318   static const uint8_t table1_12_emit_[40];
319   static const uint8_t table1_13_emit_[40];
320   static const uint8_t table1_14_emit_[40];
321   static const uint8_t table1_15_emit_[40];
322   static const uint8_t table1_16_emit_[40];
323   static const uint8_t table1_17_emit_[40];
324   static const uint8_t table1_18_emit_[40];
325   static const uint8_t table1_19_emit_[40];
326   static const uint8_t table1_20_emit_[40];
327   static const uint8_t table1_21_emit_[40];
328   static const uint8_t table1_22_emit_[40];
329   static const uint8_t table1_23_emit_[4];
330   static const uint16_t table1_23_inner_[4];
331   static const uint8_t table1_23_outer_[64];
332   static const uint8_t table1_24_emit_[4];
333   static const uint8_t table1_25_emit_[4];
334   static const uint8_t table1_26_emit_[4];
335   static const uint8_t table1_27_emit_[4];
336   static const uint8_t table1_28_emit_[4];
337   static const uint8_t table1_29_emit_[4];
338   static const uint8_t table1_30_emit_[4];
339   static const uint8_t table1_31_emit_[14];
340   static const uint16_t table1_31_inner_[17];
341   static const uint8_t table1_31_outer_[64];
342   static const uint8_t* const table1_emit_[32];
343   static const uint16_t* const table1_inner_[32];
344   static const uint8_t* const table1_outer_[32];
345   static const uint8_t table12_0_inner_[6];
346   static const uint8_t table12_0_outer_[8];
347   static const uint8_t table13_0_emit_[7];
348   static const uint8_t table13_0_inner_[9];
349   static const uint8_t table13_0_outer_[16];
350   static const uint8_t table14_0_ops_[32];
351   static const uint8_t table15_0_ops_[64];
352   static const uint8_t table16_0_emit_[45];
353   static const uint8_t table16_0_ops_[128];
354   static const uint8_t table17_0_emit_[72];
355   static const uint16_t table17_0_ops_[64];
356   static const uint8_t table17_1_emit_[72];
357   static const uint8_t table17_2_emit_[40];
358   static const uint16_t table17_2_ops_[64];
359   static const uint8_t table17_3_emit_[6];
360   static const uint16_t table17_3_ops_[64];
361   static const uint8_t* const table17_emit_[4];
362   static const uint16_t* const table17_ops_[4];
363   static const uint8_t table18_0_emit_[44];
364   static const uint16_t table18_0_ops_[64];
365   static const uint8_t table18_1_emit_[92];
366   static const uint16_t table18_1_ops_[64];
367   static const uint8_t table18_2_emit_[44];
368   static const uint8_t table18_3_emit_[92];
369   static const uint8_t table18_4_emit_[72];
370   static const uint8_t table18_5_emit_[72];
371   static const uint8_t table18_6_emit_[40];
372   static const uint8_t table18_7_emit_[31];
373   static const uint16_t table18_7_ops_[64];
374   static const uint8_t* const table18_emit_[8];
375   static const uint16_t* const table18_ops_[8];
376   static const uint8_t table19_0_emit_[16];
377   static const uint16_t table19_0_ops_[64];
378   static const uint8_t table19_1_emit_[28];
379   static const uint16_t table19_1_ops_[64];
380   static const uint8_t table19_2_emit_[36];
381   static const uint16_t table19_2_ops_[64];
382   static const uint8_t table19_3_emit_[68];
383   static const uint16_t table19_3_ops_[64];
384   static const uint8_t table19_4_emit_[16];
385   static const uint8_t table19_5_emit_[28];
386   static const uint8_t table19_6_emit_[36];
387   static const uint8_t table19_7_emit_[68];
388   static const uint8_t table19_8_emit_[44];
389   static const uint8_t table19_9_emit_[92];
390   static const uint8_t table19_10_emit_[44];
391   static const uint8_t table19_11_emit_[92];
392   static const uint8_t table19_12_emit_[72];
393   static const uint8_t table19_13_emit_[72];
394   static const uint8_t table19_14_emit_[72];
395   static const uint8_t table19_15_emit_[24];
396   static const uint16_t table19_15_ops_[64];
397   static const uint8_t* const table19_emit_[16];
398   static const uint16_t* const table19_ops_[16];
399   static const uint8_t table10_0_emit_[1];
400   static const uint16_t table10_0_ops_[128];
401   static const uint8_t table10_4_emit_[1];
402   static const uint8_t table10_8_emit_[1];
403   static const uint16_t table10_8_ops_[128];
404   static const uint8_t table10_10_emit_[1];
405   static const uint8_t table10_12_emit_[1];
406   static const uint16_t table10_12_ops_[128];
407   static const uint8_t table10_13_emit_[1];
408   static const uint8_t table10_14_emit_[1];
409   static const uint8_t table10_15_emit_[50];
410   static const uint16_t table10_15_ops_[128];
411   static const uint8_t* const table10_emit_[16];
412   static const uint16_t* const table10_ops_[16];
413   static const uint8_t table37_0_emit_[15];
414   static const uint8_t table37_0_inner_[16];
415   static const uint8_t table36_0_emit_[17];
416   static const uint8_t table36_0_ops_[32];
417   static const uint8_t table40_0_emit_[6];
418   static const uint8_t table40_0_inner_[6];
419   static const uint8_t table43_0_emit_[17];
420   static const uint8_t table43_0_ops_[32];
421   static const uint8_t table44_0_emit_[46];
422   static const uint8_t table44_0_ops_[64];
423   static const uint8_t table45_0_ops_[128];
424   static const uint8_t table42_0_emit_[4];
425   static const uint16_t table42_0_ops_[32];
426   static const uint8_t table42_1_emit_[4];
427   static const uint8_t table42_2_emit_[4];
428   static const uint8_t table42_3_emit_[4];
429   static const uint8_t table42_4_emit_[7];
430   static const uint16_t table42_4_ops_[32];
431   static const uint8_t table42_5_emit_[8];
432   static const uint16_t table42_5_ops_[32];
433   static const uint8_t table42_6_emit_[8];
434   static const uint8_t table42_7_emit_[10];
435   static const uint16_t table42_7_ops_[32];
436   static const uint8_t* const table42_emit_[8];
437   static const uint16_t* const table42_ops_[8];
438 };
439 template <typename F>
440 class HuffDecoder : public HuffDecoderCommon {
441  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)442   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
443       : sink_(sink), begin_(begin), end_(end) {}
Run()444   bool Run() {
445     while (!done_) {
446       if (!RefillTo11()) {
447         Done0();
448         break;
449       }
450       const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
451       const auto op = GetOp1(index);
452       const int consumed = op & 15;
453       buffer_len_ -= consumed;
454       const auto emit_ofs = op >> 7;
455       switch ((op >> 4) & 7) {
456         case 0: {
457           sink_(GetEmit1(index, emit_ofs + 0));
458           sink_(GetEmit1(index, emit_ofs + 1));
459           break;
460         }
461         case 1: {
462           sink_(GetEmit1(index, emit_ofs + 0));
463           break;
464         }
465         case 2: {
466           DecodeStep0();
467           break;
468         }
469         case 3: {
470           DecodeStep1();
471           break;
472         }
473         case 4: {
474           DecodeStep2();
475           break;
476         }
477       }
478     }
479     return ok_;
480   }
481 
482  private:
RefillTo11()483   bool RefillTo11() {
484     switch (buffer_len_) {
485       case 0: {
486         return Read2to8Bytes();
487       }
488       case 1:
489       case 2: {
490         return Read2to7Bytes();
491       }
492       case 3:
493       case 4:
494       case 5:
495       case 6:
496       case 7:
497       case 8: {
498         return Read1to7Bytes();
499       }
500       case 9:
501       case 10: {
502         return Read1to6Bytes();
503       }
504     }
505     return true;
506   }
Read2to8Bytes()507   bool Read2to8Bytes() {
508     switch (end_ - begin_) {
509       case 0:
510       case 1: {
511         return false;
512       }
513       case 2: {
514         Fill2();
515         return true;
516       }
517       case 3: {
518         Fill3();
519         return true;
520       }
521       case 4: {
522         Fill4();
523         return true;
524       }
525       case 5: {
526         Fill5();
527         return true;
528       }
529       case 6: {
530         Fill6();
531         return true;
532       }
533       case 7: {
534         Fill7();
535         return true;
536       }
537       default: {
538         Fill8();
539         return true;
540       }
541     }
542   }
Fill2()543   void Fill2() {
544     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
545               (static_cast<uint64_t>(begin_[1]) << 0);
546     begin_ += 2;
547     buffer_len_ += 16;
548   }
Fill3()549   void Fill3() {
550     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
551               (static_cast<uint64_t>(begin_[1]) << 8) |
552               (static_cast<uint64_t>(begin_[2]) << 0);
553     begin_ += 3;
554     buffer_len_ += 24;
555   }
Fill4()556   void Fill4() {
557     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
558               (static_cast<uint64_t>(begin_[1]) << 16) |
559               (static_cast<uint64_t>(begin_[2]) << 8) |
560               (static_cast<uint64_t>(begin_[3]) << 0);
561     begin_ += 4;
562     buffer_len_ += 32;
563   }
Fill5()564   void Fill5() {
565     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
566               (static_cast<uint64_t>(begin_[1]) << 24) |
567               (static_cast<uint64_t>(begin_[2]) << 16) |
568               (static_cast<uint64_t>(begin_[3]) << 8) |
569               (static_cast<uint64_t>(begin_[4]) << 0);
570     begin_ += 5;
571     buffer_len_ += 40;
572   }
Fill6()573   void Fill6() {
574     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
575               (static_cast<uint64_t>(begin_[1]) << 32) |
576               (static_cast<uint64_t>(begin_[2]) << 24) |
577               (static_cast<uint64_t>(begin_[3]) << 16) |
578               (static_cast<uint64_t>(begin_[4]) << 8) |
579               (static_cast<uint64_t>(begin_[5]) << 0);
580     begin_ += 6;
581     buffer_len_ += 48;
582   }
Fill7()583   void Fill7() {
584     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
585               (static_cast<uint64_t>(begin_[1]) << 40) |
586               (static_cast<uint64_t>(begin_[2]) << 32) |
587               (static_cast<uint64_t>(begin_[3]) << 24) |
588               (static_cast<uint64_t>(begin_[4]) << 16) |
589               (static_cast<uint64_t>(begin_[5]) << 8) |
590               (static_cast<uint64_t>(begin_[6]) << 0);
591     begin_ += 7;
592     buffer_len_ += 56;
593   }
Fill8()594   void Fill8() {
595     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
596               (static_cast<uint64_t>(begin_[1]) << 48) |
597               (static_cast<uint64_t>(begin_[2]) << 40) |
598               (static_cast<uint64_t>(begin_[3]) << 32) |
599               (static_cast<uint64_t>(begin_[4]) << 24) |
600               (static_cast<uint64_t>(begin_[5]) << 16) |
601               (static_cast<uint64_t>(begin_[6]) << 8) |
602               (static_cast<uint64_t>(begin_[7]) << 0);
603     begin_ += 8;
604     buffer_len_ += 64;
605   }
Read2to7Bytes()606   bool Read2to7Bytes() {
607     switch (end_ - begin_) {
608       case 0:
609       case 1: {
610         return false;
611       }
612       case 2: {
613         Fill2();
614         return true;
615       }
616       case 3: {
617         Fill3();
618         return true;
619       }
620       case 4: {
621         Fill4();
622         return true;
623       }
624       case 5: {
625         Fill5();
626         return true;
627       }
628       case 6: {
629         Fill6();
630         return true;
631       }
632       default: {
633         Fill7();
634         return true;
635       }
636     }
637   }
Read1to7Bytes()638   bool Read1to7Bytes() {
639     switch (end_ - begin_) {
640       case 0: {
641         return false;
642       }
643       case 1: {
644         Fill1();
645         return true;
646       }
647       case 2: {
648         Fill2();
649         return true;
650       }
651       case 3: {
652         Fill3();
653         return true;
654       }
655       case 4: {
656         Fill4();
657         return true;
658       }
659       case 5: {
660         Fill5();
661         return true;
662       }
663       case 6: {
664         Fill6();
665         return true;
666       }
667       default: {
668         Fill7();
669         return true;
670       }
671     }
672   }
Fill1()673   void Fill1() {
674     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
675     begin_ += 1;
676     buffer_len_ += 8;
677   }
Read1to6Bytes()678   bool Read1to6Bytes() {
679     switch (end_ - begin_) {
680       case 0: {
681         return false;
682       }
683       case 1: {
684         Fill1();
685         return true;
686       }
687       case 2: {
688         Fill2();
689         return true;
690       }
691       case 3: {
692         Fill3();
693         return true;
694       }
695       case 4: {
696         Fill4();
697         return true;
698       }
699       case 5: {
700         Fill5();
701         return true;
702       }
703       default: {
704         Fill6();
705         return true;
706       }
707     }
708   }
Done0()709   void Done0() {
710     done_ = true;
711     switch (end_ - begin_) {
712       case 1: {
713         Fill1();
714         break;
715       }
716     }
717     switch (buffer_len_) {
718       case 1:
719       case 2:
720       case 3:
721       case 4: {
722         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
723         return;
724       }
725       case 5: {
726         const auto index = buffer_ & 31;
727         const auto op = GetOp2(index);
728         switch (op & 3) {
729           case 0: {
730             sink_(GetEmit2(index, (op >> 2) + 0));
731             break;
732           }
733           case 1: {
734             ok_ = false;
735             break;
736           }
737         }
738         return;
739       }
740       case 6: {
741         const auto index = buffer_ & 63;
742         const auto op = GetOp3(index);
743         switch (op & 3) {
744           case 0: {
745             ok_ = false;
746             break;
747           }
748           case 1: {
749             sink_(GetEmit3(index, (op >> 2) + 0));
750             break;
751           }
752         }
753         return;
754       }
755       case 7: {
756         const auto index = buffer_ & 127;
757         const auto op = GetOp4(index);
758         switch (op & 3) {
759           case 0: {
760             ok_ = false;
761             break;
762           }
763           case 1: {
764             sink_(GetEmit4(index, (op >> 2) + 0));
765             break;
766           }
767         }
768         return;
769       }
770       case 8: {
771         const auto index = buffer_ & 255;
772         const auto op = GetOp5(index);
773         switch (op & 3) {
774           case 0: {
775             ok_ = false;
776             break;
777           }
778           case 1: {
779             sink_(GetEmit5(index, (op >> 2) + 0));
780             break;
781           }
782         }
783         return;
784       }
785       case 9: {
786         const auto index = buffer_ & 511;
787         const auto op = GetOp6(index);
788         switch (op & 3) {
789           case 0: {
790             ok_ = false;
791             break;
792           }
793           case 1: {
794             sink_(GetEmit6(index, (op >> 2) + 0));
795             break;
796           }
797         }
798         return;
799       }
800       case 10: {
801         const auto index = buffer_ & 1023;
802         const auto op = GetOp7(index);
803         switch (op & 3) {
804           case 0: {
805             sink_(GetEmit7(index, (op >> 2) + 0));
806             sink_(GetEmit7(index, (op >> 2) + 1));
807             break;
808           }
809           case 1: {
810             ok_ = false;
811             break;
812           }
813           case 2: {
814             sink_(GetEmit7(index, (op >> 2) + 0));
815             break;
816           }
817         }
818         return;
819       }
820       case 0: {
821         return;
822       }
823     }
824   }
DecodeStep0()825   void DecodeStep0() {
826     if (!RefillTo1()) {
827       Done1();
828       return;
829     }
830     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
831     const auto op = GetOp8(index);
832     const int consumed = op & 1;
833     buffer_len_ -= consumed;
834     const auto emit_ofs = op >> 1;
835     sink_(GetEmit8(index, emit_ofs + 0));
836   }
RefillTo1()837   bool RefillTo1() {
838     switch (buffer_len_) {
839       case 0: {
840         return Read1to8Bytes();
841       }
842     }
843     return true;
844   }
Read1to8Bytes()845   bool Read1to8Bytes() {
846     switch (end_ - begin_) {
847       case 0: {
848         return false;
849       }
850       case 1: {
851         Fill1();
852         return true;
853       }
854       case 2: {
855         Fill2();
856         return true;
857       }
858       case 3: {
859         Fill3();
860         return true;
861       }
862       case 4: {
863         Fill4();
864         return true;
865       }
866       case 5: {
867         Fill5();
868         return true;
869       }
870       case 6: {
871         Fill6();
872         return true;
873       }
874       case 7: {
875         Fill7();
876         return true;
877       }
878       default: {
879         Fill8();
880         return true;
881       }
882     }
883   }
Done1()884   void Done1() {
885     done_ = true;
886     ok_ = false;
887   }
DecodeStep1()888   void DecodeStep1() {
889     if (!RefillTo2()) {
890       Done2();
891       return;
892     }
893     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
894     const auto op = GetOp9(index);
895     const int consumed = op & 3;
896     buffer_len_ -= consumed;
897     const auto emit_ofs = op >> 2;
898     sink_(GetEmit9(index, emit_ofs + 0));
899   }
RefillTo2()900   bool RefillTo2() {
901     switch (buffer_len_) {
902       case 0: {
903         return Read1to8Bytes();
904       }
905       case 1: {
906         return Read1to7Bytes();
907       }
908     }
909     return true;
910   }
Done2()911   void Done2() {
912     done_ = true;
913     switch (buffer_len_) {
914       case 1:
915       case 0: {
916         ok_ = false;
917         return;
918       }
919     }
920   }
DecodeStep2()921   void DecodeStep2() {
922     if (!RefillTo11()) {
923       Done3();
924       return;
925     }
926     const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
927     const auto op = GetOp10(index);
928     const int consumed = op & 15;
929     buffer_len_ -= consumed;
930     const auto emit_ofs = op >> 9;
931     switch ((op >> 4) & 31) {
932       case 0: {
933         sink_(GetEmit10(index, emit_ofs + 0));
934         break;
935       }
936       case 1: {
937         DecodeStep3();
938         break;
939       }
940       case 2: {
941         DecodeStep4();
942         break;
943       }
944       case 3: {
945         DecodeStep5();
946         break;
947       }
948       case 4: {
949         DecodeStep6();
950         break;
951       }
952       case 5: {
953         DecodeStep7();
954         break;
955       }
956       case 6: {
957         DecodeStep8();
958         break;
959       }
960       case 7: {
961         DecodeStep9();
962         break;
963       }
964       case 8: {
965         DecodeStep10();
966         break;
967       }
968       case 9: {
969         DecodeStep11();
970         break;
971       }
972       case 10: {
973         DecodeStep12();
974         break;
975       }
976       case 11: {
977         DecodeStep13();
978         break;
979       }
980       case 12: {
981         DecodeStep14();
982         break;
983       }
984       case 13: {
985         DecodeStep15();
986         break;
987       }
988       case 14: {
989         DecodeStep16();
990         break;
991       }
992       case 15: {
993         DecodeStep20();
994         break;
995       }
996       case 16: {
997         DecodeStep17();
998         break;
999       }
1000       case 17: {
1001         DecodeStep18();
1002         break;
1003       }
1004       case 18: {
1005         DecodeStep21();
1006         break;
1007       }
1008       case 19: {
1009         DecodeStep19();
1010         break;
1011       }
1012       case 20: {
1013         DecodeStep22();
1014         break;
1015       }
1016     }
1017   }
Done3()1018   void Done3() {
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   }
DecodeStep3()1191   void DecodeStep3() {
1192     if (!RefillTo1()) {
1193       Done4();
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   }
Done4()1203   void Done4() {
1204     done_ = true;
1205     ok_ = false;
1206   }
DecodeStep4()1207   void DecodeStep4() {
1208     if (!RefillTo1()) {
1209       Done5();
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   }
Done5()1219   void Done5() {
1220     done_ = true;
1221     ok_ = false;
1222   }
DecodeStep5()1223   void DecodeStep5() {
1224     if (!RefillTo1()) {
1225       Done6();
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   }
Done6()1235   void Done6() {
1236     done_ = true;
1237     ok_ = false;
1238   }
DecodeStep6()1239   void DecodeStep6() {
1240     if (!RefillTo1()) {
1241       Done7();
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   }
Done7()1251   void Done7() {
1252     done_ = true;
1253     ok_ = false;
1254   }
DecodeStep7()1255   void DecodeStep7() {
1256     if (!RefillTo1()) {
1257       Done8();
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   }
Done8()1267   void Done8() {
1268     done_ = true;
1269     ok_ = false;
1270   }
DecodeStep8()1271   void DecodeStep8() {
1272     if (!RefillTo1()) {
1273       Done9();
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   }
Done9()1283   void Done9() {
1284     done_ = true;
1285     ok_ = false;
1286   }
DecodeStep9()1287   void DecodeStep9() {
1288     if (!RefillTo1()) {
1289       Done10();
1290       return;
1291     }
1292     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1293     const auto op = GetOp26(index);
1294     const int consumed = op & 1;
1295     buffer_len_ -= consumed;
1296     const auto emit_ofs = op >> 1;
1297     sink_(GetEmit26(index, emit_ofs + 0));
1298   }
Done10()1299   void Done10() {
1300     done_ = true;
1301     ok_ = false;
1302   }
DecodeStep10()1303   void DecodeStep10() {
1304     if (!RefillTo1()) {
1305       Done11();
1306       return;
1307     }
1308     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1309     const auto op = GetOp27(index);
1310     const int consumed = op & 1;
1311     buffer_len_ -= consumed;
1312     const auto emit_ofs = op >> 1;
1313     sink_(GetEmit27(index, emit_ofs + 0));
1314   }
Done11()1315   void Done11() {
1316     done_ = true;
1317     ok_ = false;
1318   }
DecodeStep11()1319   void DecodeStep11() {
1320     if (!RefillTo1()) {
1321       Done12();
1322       return;
1323     }
1324     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1325     const auto op = GetOp28(index);
1326     const int consumed = op & 1;
1327     buffer_len_ -= consumed;
1328     const auto emit_ofs = op >> 1;
1329     sink_(GetEmit28(index, emit_ofs + 0));
1330   }
Done12()1331   void Done12() {
1332     done_ = true;
1333     ok_ = false;
1334   }
DecodeStep12()1335   void DecodeStep12() {
1336     if (!RefillTo1()) {
1337       Done13();
1338       return;
1339     }
1340     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1341     const auto op = GetOp29(index);
1342     const int consumed = op & 1;
1343     buffer_len_ -= consumed;
1344     const auto emit_ofs = op >> 1;
1345     sink_(GetEmit29(index, emit_ofs + 0));
1346   }
Done13()1347   void Done13() {
1348     done_ = true;
1349     ok_ = false;
1350   }
DecodeStep13()1351   void DecodeStep13() {
1352     if (!RefillTo1()) {
1353       Done14();
1354       return;
1355     }
1356     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1357     const auto op = GetOp30(index);
1358     const int consumed = op & 1;
1359     buffer_len_ -= consumed;
1360     const auto emit_ofs = op >> 1;
1361     sink_(GetEmit30(index, emit_ofs + 0));
1362   }
Done14()1363   void Done14() {
1364     done_ = true;
1365     ok_ = false;
1366   }
DecodeStep14()1367   void DecodeStep14() {
1368     if (!RefillTo1()) {
1369       Done15();
1370       return;
1371     }
1372     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1373     const auto op = GetOp31(index);
1374     const int consumed = op & 1;
1375     buffer_len_ -= consumed;
1376     const auto emit_ofs = op >> 1;
1377     sink_(GetEmit31(index, emit_ofs + 0));
1378   }
Done15()1379   void Done15() {
1380     done_ = true;
1381     ok_ = false;
1382   }
DecodeStep15()1383   void DecodeStep15() {
1384     if (!RefillTo1()) {
1385       Done16();
1386       return;
1387     }
1388     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1389     const auto op = GetOp32(index);
1390     const int consumed = op & 1;
1391     buffer_len_ -= consumed;
1392     const auto emit_ofs = op >> 1;
1393     sink_(GetEmit32(index, emit_ofs + 0));
1394   }
Done16()1395   void Done16() {
1396     done_ = true;
1397     ok_ = false;
1398   }
DecodeStep16()1399   void DecodeStep16() {
1400     if (!RefillTo1()) {
1401       Done17();
1402       return;
1403     }
1404     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1405     const auto op = GetOp33(index);
1406     const int consumed = op & 1;
1407     buffer_len_ -= consumed;
1408     const auto emit_ofs = op >> 1;
1409     sink_(GetEmit33(index, emit_ofs + 0));
1410   }
Done17()1411   void Done17() {
1412     done_ = true;
1413     ok_ = false;
1414   }
DecodeStep17()1415   void DecodeStep17() {
1416     if (!RefillTo2()) {
1417       Done18();
1418       return;
1419     }
1420     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1421     const auto op = GetOp34(index);
1422     const int consumed = op & 3;
1423     buffer_len_ -= consumed;
1424     const auto emit_ofs = op >> 2;
1425     sink_(GetEmit34(index, emit_ofs + 0));
1426   }
Done18()1427   void Done18() {
1428     done_ = true;
1429     switch (buffer_len_) {
1430       case 1:
1431       case 0: {
1432         ok_ = false;
1433         return;
1434       }
1435     }
1436   }
DecodeStep18()1437   void DecodeStep18() {
1438     if (!RefillTo2()) {
1439       Done19();
1440       return;
1441     }
1442     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1443     const auto op = GetOp35(index);
1444     const int consumed = op & 3;
1445     buffer_len_ -= consumed;
1446     const auto emit_ofs = op >> 2;
1447     sink_(GetEmit35(index, emit_ofs + 0));
1448   }
Done19()1449   void Done19() {
1450     done_ = true;
1451     switch (buffer_len_) {
1452       case 1:
1453       case 0: {
1454         ok_ = false;
1455         return;
1456       }
1457     }
1458   }
DecodeStep19()1459   void DecodeStep19() {
1460     if (!RefillTo5()) {
1461       Done20();
1462       return;
1463     }
1464     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1465     const auto op = GetOp36(index);
1466     const int consumed = op & 7;
1467     buffer_len_ -= consumed;
1468     const auto emit_ofs = op >> 3;
1469     sink_(GetEmit36(index, emit_ofs + 0));
1470   }
RefillTo5()1471   bool RefillTo5() {
1472     switch (buffer_len_) {
1473       case 0: {
1474         return Read1to8Bytes();
1475       }
1476       case 1:
1477       case 2:
1478       case 3:
1479       case 4: {
1480         return Read1to7Bytes();
1481       }
1482     }
1483     return true;
1484   }
Done20()1485   void Done20() {
1486     done_ = true;
1487     switch (buffer_len_) {
1488       case 1:
1489       case 2:
1490       case 3:
1491       case 0: {
1492         ok_ = false;
1493         return;
1494       }
1495       case 4: {
1496         const auto index = buffer_ & 15;
1497         const auto op = GetOp37(index);
1498         switch (op & 1) {
1499           case 0: {
1500             sink_(GetEmit37(index, (op >> 1) + 0));
1501             break;
1502           }
1503           case 1: {
1504             ok_ = false;
1505             break;
1506           }
1507         }
1508         return;
1509       }
1510     }
1511   }
DecodeStep20()1512   void DecodeStep20() {
1513     if (!RefillTo2()) {
1514       Done21();
1515       return;
1516     }
1517     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1518     const auto op = GetOp38(index);
1519     const int consumed = op & 3;
1520     buffer_len_ -= consumed;
1521     const auto emit_ofs = op >> 2;
1522     sink_(GetEmit38(index, emit_ofs + 0));
1523   }
Done21()1524   void Done21() {
1525     done_ = true;
1526     switch (buffer_len_) {
1527       case 1: {
1528         const auto index = buffer_ & 1;
1529         const auto op = GetOp39(index);
1530         switch (op & 1) {
1531           case 0: {
1532             sink_(GetEmit39(index, (op >> 1) + 0));
1533             break;
1534           }
1535           case 1: {
1536             ok_ = false;
1537             break;
1538           }
1539         }
1540         return;
1541       }
1542       case 0: {
1543         ok_ = false;
1544         return;
1545       }
1546     }
1547   }
DecodeStep21()1548   void DecodeStep21() {
1549     if (!RefillTo3()) {
1550       Done22();
1551       return;
1552     }
1553     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1554     const auto op = GetOp40(index);
1555     const int consumed = op & 3;
1556     buffer_len_ -= consumed;
1557     const auto emit_ofs = op >> 2;
1558     sink_(GetEmit40(index, emit_ofs + 0));
1559   }
RefillTo3()1560   bool RefillTo3() {
1561     switch (buffer_len_) {
1562       case 0: {
1563         return Read1to8Bytes();
1564       }
1565       case 1:
1566       case 2: {
1567         return Read1to7Bytes();
1568       }
1569     }
1570     return true;
1571   }
Done22()1572   void Done22() {
1573     done_ = true;
1574     switch (buffer_len_) {
1575       case 1:
1576       case 0: {
1577         ok_ = false;
1578         return;
1579       }
1580       case 2: {
1581         const auto index = buffer_ & 3;
1582         const auto op = GetOp41(index);
1583         switch (op & 1) {
1584           case 0: {
1585             sink_(GetEmit41(index, (op >> 1) + 0));
1586             break;
1587           }
1588           case 1: {
1589             ok_ = false;
1590             break;
1591           }
1592         }
1593         return;
1594       }
1595     }
1596   }
DecodeStep22()1597   void DecodeStep22() {
1598     if (!RefillTo8()) {
1599       Done23();
1600       return;
1601     }
1602     const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
1603     const auto op = GetOp42(index);
1604     const int consumed = op & 15;
1605     buffer_len_ -= consumed;
1606     const auto emit_ofs = op >> 5;
1607     switch ((op >> 4) & 1) {
1608       case 0: {
1609         sink_(GetEmit42(index, emit_ofs + 0));
1610         break;
1611       }
1612       case 1: {
1613         begin_ = end_;
1614         buffer_len_ = 0;
1615         break;
1616       }
1617     }
1618   }
RefillTo8()1619   bool RefillTo8() {
1620     switch (buffer_len_) {
1621       case 0: {
1622         return Read1to8Bytes();
1623       }
1624       case 1:
1625       case 2:
1626       case 3:
1627       case 4:
1628       case 5:
1629       case 6:
1630       case 7: {
1631         return Read1to7Bytes();
1632       }
1633     }
1634     return true;
1635   }
Done23()1636   void Done23() {
1637     done_ = true;
1638     switch (end_ - begin_) {}
1639     switch (buffer_len_) {
1640       case 1:
1641       case 2:
1642       case 3:
1643       case 4: {
1644         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1645         return;
1646       }
1647       case 5: {
1648         const auto index = buffer_ & 31;
1649         const auto op = GetOp43(index);
1650         switch (op & 3) {
1651           case 0: {
1652             sink_(GetEmit43(index, (op >> 2) + 0));
1653             break;
1654           }
1655           case 1: {
1656             ok_ = false;
1657             break;
1658           }
1659         }
1660         return;
1661       }
1662       case 6: {
1663         const auto index = buffer_ & 63;
1664         const auto op = GetOp44(index);
1665         switch (op & 3) {
1666           case 0: {
1667             ok_ = false;
1668             break;
1669           }
1670           case 1: {
1671             sink_(GetEmit44(index, (op >> 2) + 0));
1672             break;
1673           }
1674         }
1675         return;
1676       }
1677       case 7: {
1678         const auto index = buffer_ & 127;
1679         const auto op = GetOp45(index);
1680         switch (op & 3) {
1681           case 0: {
1682             ok_ = false;
1683             break;
1684           }
1685           case 1: {
1686             sink_(GetEmit45(index, (op >> 2) + 0));
1687             break;
1688           }
1689         }
1690         return;
1691       }
1692       case 0: {
1693         return;
1694       }
1695     }
1696   }
1697   F sink_;
1698   const uint8_t* begin_;
1699   const uint8_t* const end_;
1700   uint64_t buffer_ = 0;
1701   int buffer_len_ = 0;
1702   bool ok_ = true;
1703   bool done_ = false;
1704 };
1705 }  // namespace geometry_11_11_8
1706 }  // namespace grpc_core
1707 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_11_8_H
1708