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