xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_10_15_5.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // This file is autogenerated: see
16 // tools/codegen/core/gen_huffman_decompressor.cc
17 
18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_15_5_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_15_5_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_10_15_5 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp1(size_t i)54   static inline uint64_t GetOp1(size_t i) {
55     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
56   }
GetEmit1(size_t i,size_t emit)57   static inline uint64_t GetEmit1(size_t i, size_t emit) {
58     return table1_emit_[i >> 6][emit];
59   }
GetOp7(size_t i)60   static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; }
GetEmit7(size_t,size_t emit)61   static inline uint64_t GetEmit7(size_t, size_t emit) {
62     return emit ? 43 : 39;
63   }
GetOp9(size_t i)64   static inline uint64_t GetOp9(size_t i) { return table9_0_inner_[i]; }
GetEmit9(size_t,size_t emit)65   static inline uint64_t GetEmit9(size_t, size_t emit) {
66     return table9_0_emit_[emit];
67   }
GetOp10(size_t i)68   static inline uint64_t GetOp10(size_t i) {
69     return table10_0_inner_[table10_0_outer_[i]];
70   }
GetEmit10(size_t,size_t emit)71   static inline uint64_t GetEmit10(size_t, size_t emit) {
72     return table10_0_emit_[emit];
73   }
GetOp11(size_t i)74   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)75   static inline uint64_t GetEmit11(size_t, size_t emit) {
76     return table11_0_emit_[emit];
77   }
GetOp12(size_t i)78   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)79   static inline uint64_t GetEmit12(size_t, size_t emit) {
80     return table11_0_emit_[emit];
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; }
GetEmit13(size_t,size_t emit)83   static inline uint64_t GetEmit13(size_t, size_t emit) {
84     return table11_0_emit_[emit];
85   }
GetOp14(size_t i)86   static inline uint64_t GetOp14(size_t i) {
87     return table14_ops_[i >> 6][i & 0x3f];
88   }
GetEmit14(size_t i,size_t emit)89   static inline uint64_t GetEmit14(size_t i, size_t emit) {
90     return table14_emit_[i >> 6][emit];
91   }
GetOp15(size_t i)92   static inline uint64_t GetOp15(size_t i) {
93     return table15_ops_[i >> 6][i & 0x3f];
94   }
GetEmit15(size_t i,size_t emit)95   static inline uint64_t GetEmit15(size_t i, size_t emit) {
96     return table15_emit_[i >> 6][emit];
97   }
GetOp16(size_t i)98   static inline uint64_t GetOp16(size_t i) {
99     return table16_ops_[i >> 6][i & 0x3f];
100   }
GetEmit16(size_t i,size_t emit)101   static inline uint64_t GetEmit16(size_t i, size_t emit) {
102     return table16_emit_[i >> 6][emit];
103   }
GetOp17(size_t i)104   static inline uint64_t GetOp17(size_t i) {
105     return table17_ops_[i >> 6][i & 0x3f];
106   }
GetEmit17(size_t i,size_t emit)107   static inline uint64_t GetEmit17(size_t i, size_t emit) {
108     return table17_emit_[i >> 6][emit];
109   }
GetOp18(size_t i)110   static inline uint64_t GetOp18(size_t i) {
111     return table18_ops_[i >> 7][i & 0x7f];
112   }
GetEmit18(size_t i,size_t emit)113   static inline uint64_t GetEmit18(size_t i, size_t emit) {
114     return table18_emit_[i >> 7][emit];
115   }
GetOp19(size_t i)116   static inline uint64_t GetOp19(size_t i) {
117     return table19_ops_[i >> 7][i & 0x7f];
118   }
GetEmit19(size_t i,size_t emit)119   static inline uint64_t GetEmit19(size_t i, size_t emit) {
120     return table19_emit_[i >> 7][emit];
121   }
GetOp20(size_t i)122   static inline uint64_t GetOp20(size_t i) {
123     return table20_ops_[i >> 7][i & 0x7f];
124   }
GetEmit20(size_t i,size_t emit)125   static inline uint64_t GetEmit20(size_t i, size_t emit) {
126     return table20_emit_[i >> 7][emit];
127   }
GetOp8(size_t i)128   static inline uint64_t GetOp8(size_t i) {
129     return table8_ops_[i >> 9][i & 0x1ff];
130   }
GetEmit8(size_t i,size_t emit)131   static inline uint64_t GetEmit8(size_t i, size_t emit) {
132     return table8_emit_[i >> 9][emit];
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 + 192; }
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 + 200; }
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 ? 205 : 202;
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 ? 213 : 210;
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 + 218; }
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 ? 240 : 238;
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 + 242; }
GetOp28(size_t i)154   static inline uint64_t GetOp28(size_t i) {
155     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
156   }
GetEmit28(size_t,size_t emit)157   static inline uint64_t GetEmit28(size_t, size_t emit) {
158     return (emit < 2 ? (emit + 211) : ((emit - 2) ? 221 : 214));
159   }
GetOp29(size_t i)160   static inline uint64_t GetOp29(size_t i) {
161     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
162   }
GetEmit29(size_t,size_t emit)163   static inline uint64_t GetEmit29(size_t, size_t emit) {
164     return (emit < 2 ? (emit + 222) : ((emit - 2) ? 244 : 241));
165   }
GetOp30(size_t i)166   static inline uint64_t GetOp30(size_t i) {
167     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
168   }
GetEmit30(size_t,size_t emit)169   static inline uint64_t GetEmit30(size_t, size_t emit) { return emit + 245; }
GetOp31(size_t i)170   static inline uint64_t GetOp31(size_t i) {
171     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
172   }
GetEmit31(size_t,size_t emit)173   static inline uint64_t GetEmit31(size_t, size_t emit) { return emit + 250; }
GetOp32(size_t i)174   static inline uint64_t GetOp32(size_t i) { return table32_0_inner_[i]; }
GetEmit32(size_t,size_t emit)175   static inline uint64_t GetEmit32(size_t, size_t emit) {
176     return table32_0_emit_[emit];
177   }
GetOp33(size_t i)178   static inline uint64_t GetOp33(size_t i) { return table32_0_inner_[i]; }
GetEmit33(size_t,size_t emit)179   static inline uint64_t GetEmit33(size_t, size_t emit) {
180     return (emit < 3 ? (emit + 19) : ((emit - 3) + 23));
181   }
GetOp35(size_t i)182   static inline uint64_t GetOp35(size_t i) { return i; }
GetEmit35(size_t,size_t emit)183   static inline uint64_t GetEmit35(size_t, size_t emit) {
184     return ((void)emit, 255);
185   }
GetOp34(size_t i)186   static inline uint64_t GetOp34(size_t i) {
187     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
188                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
189                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
190   }
GetEmit34(size_t,size_t emit)191   static inline uint64_t GetEmit34(size_t, size_t emit) {
192     return (emit < 1 ? (((void)emit, 255)) : ((emit - 1) + 203));
193   }
GetOp37(size_t i)194   static inline uint64_t GetOp37(size_t i) {
195     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
196   }
GetEmit37(size_t,size_t emit)197   static inline uint64_t GetEmit37(size_t, size_t emit) {
198     return ((void)emit, 254);
199   }
GetOp36(size_t i)200   static inline uint64_t GetOp36(size_t i) {
201     return table36_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
202   }
GetEmit36(size_t,size_t emit)203   static inline uint64_t GetEmit36(size_t, size_t emit) {
204     return (emit < 1 ? (((void)emit, 254)) : ((emit - 1) + 2));
205   }
GetOp39(size_t i)206   static inline uint64_t GetOp39(size_t i) { return table39_0_inner_[i]; }
GetEmit39(size_t,size_t emit)207   static inline uint64_t GetEmit39(size_t, size_t emit) {
208     return table39_0_emit_[emit];
209   }
GetOp40(size_t i)210   static inline uint64_t GetOp40(size_t i) {
211     return table40_0_inner_[table40_0_outer_[i]];
212   }
GetEmit40(size_t,size_t emit)213   static inline uint64_t GetEmit40(size_t, size_t emit) {
214     return table39_0_emit_[emit];
215   }
GetOp38(size_t i)216   static inline uint64_t GetOp38(size_t i) { return table38_0_ops_[i]; }
GetEmit38(size_t,size_t emit)217   static inline uint64_t GetEmit38(size_t, size_t emit) {
218     return table38_0_emit_[emit];
219   }
GetOp42(size_t i)220   static inline uint64_t GetOp42(size_t i) { return i; }
GetEmit42(size_t,size_t emit)221   static inline uint64_t GetEmit42(size_t, size_t emit) {
222     return ((void)emit, 124);
223   }
GetOp41(size_t i)224   static inline uint64_t GetOp41(size_t i) {
225     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
226                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
227                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
228   }
GetEmit41(size_t,size_t emit)229   static inline uint64_t GetEmit41(size_t, size_t emit) {
230     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
231   }
232 
233  private:
234   static const uint8_t table2_0_emit_[10];
235   static const uint8_t table2_0_ops_[32];
236   static const uint8_t table3_0_emit_[36];
237   static const uint8_t table3_0_ops_[64];
238   static const uint8_t table4_0_emit_[22];
239   static const uint8_t table4_0_ops_[64];
240   static const uint8_t table4_1_emit_[46];
241   static const uint8_t table4_1_ops_[64];
242   static const uint8_t* const table4_emit_[2];
243   static const uint8_t* const table4_ops_[2];
244   static const uint8_t table5_0_ops_[128];
245   static const uint8_t table5_1_emit_[52];
246   static const uint8_t table5_1_ops_[128];
247   static const uint8_t* const table5_emit_[2];
248   static const uint8_t* const table5_ops_[2];
249   static const uint8_t table6_0_emit_[2];
250   static const uint8_t table6_0_ops_[32];
251   static const uint8_t table6_1_emit_[2];
252   static const uint8_t table6_2_emit_[2];
253   static const uint8_t table6_3_emit_[2];
254   static const uint8_t table6_4_emit_[2];
255   static const uint8_t table6_5_emit_[4];
256   static const uint8_t table6_5_ops_[32];
257   static const uint8_t table6_6_emit_[4];
258   static const uint8_t table6_7_emit_[4];
259   static const uint8_t table6_8_emit_[4];
260   static const uint8_t table6_9_emit_[4];
261   static const uint8_t table6_10_emit_[4];
262   static const uint8_t table6_11_emit_[6];
263   static const uint8_t table6_11_ops_[32];
264   static const uint8_t table6_12_emit_[8];
265   static const uint8_t table6_12_ops_[32];
266   static const uint8_t table6_13_emit_[8];
267   static const uint8_t table6_14_emit_[8];
268   static const uint8_t table6_15_emit_[10];
269   static const uint8_t table6_15_ops_[32];
270   static const uint8_t* const table6_emit_[16];
271   static const uint8_t* const table6_ops_[16];
272   static const uint8_t table1_0_emit_[36];
273   static const uint16_t table1_0_inner_[22];
274   static const uint8_t table1_0_outer_[64];
275   static const uint8_t table1_1_emit_[36];
276   static const uint16_t table1_1_inner_[22];
277   static const uint8_t table1_2_emit_[36];
278   static const uint16_t table1_2_inner_[22];
279   static const uint8_t table1_3_emit_[36];
280   static const uint16_t table1_3_inner_[22];
281   static const uint8_t table1_4_emit_[38];
282   static const uint16_t table1_4_inner_[22];
283   static const uint16_t table1_5_inner_[4];
284   static const uint8_t table1_5_outer_[64];
285   static const uint16_t table1_11_inner_[6];
286   static const uint8_t table1_11_outer_[64];
287   static const uint16_t table1_12_inner_[8];
288   static const uint8_t table1_12_outer_[64];
289   static const uint8_t table1_15_emit_[15];
290   static const uint16_t table1_15_inner_[18];
291   static const uint8_t table1_15_outer_[64];
292   static const uint8_t* const table1_emit_[16];
293   static const uint16_t* const table1_inner_[16];
294   static const uint8_t* const table1_outer_[16];
295   static const uint8_t table9_0_emit_[6];
296   static const uint8_t table9_0_inner_[8];
297   static const uint8_t table10_0_emit_[8];
298   static const uint8_t table10_0_inner_[10];
299   static const uint8_t table10_0_outer_[16];
300   static const uint8_t table11_0_emit_[11];
301   static const uint8_t table11_0_ops_[32];
302   static const uint8_t table12_0_ops_[64];
303   static const uint8_t table13_0_ops_[128];
304   static const uint8_t table14_0_emit_[40];
305   static const uint8_t table14_0_ops_[64];
306   static const uint8_t table14_1_emit_[40];
307   static const uint8_t table14_2_emit_[40];
308   static const uint8_t table14_3_emit_[5];
309   static const uint8_t table14_3_ops_[64];
310   static const uint8_t* const table14_emit_[4];
311   static const uint8_t* const table14_ops_[4];
312   static const uint8_t table15_0_emit_[72];
313   static const uint16_t table15_0_ops_[64];
314   static const uint8_t table15_1_emit_[72];
315   static const uint8_t table15_2_emit_[72];
316   static const uint8_t table15_3_emit_[72];
317   static const uint8_t table15_4_emit_[72];
318   static const uint8_t table15_5_emit_[72];
319   static const uint8_t table15_6_emit_[40];
320   static const uint16_t table15_6_ops_[64];
321   static const uint8_t table15_7_emit_[6];
322   static const uint16_t table15_7_ops_[64];
323   static const uint8_t* const table15_emit_[8];
324   static const uint16_t* const table15_ops_[8];
325   static const uint8_t table16_0_emit_[44];
326   static const uint16_t table16_0_ops_[64];
327   static const uint8_t table16_1_emit_[92];
328   static const uint16_t table16_1_ops_[64];
329   static const uint8_t table16_2_emit_[44];
330   static const uint8_t table16_3_emit_[92];
331   static const uint8_t table16_4_emit_[44];
332   static const uint8_t table16_5_emit_[92];
333   static const uint8_t table16_6_emit_[44];
334   static const uint8_t table16_7_emit_[92];
335   static const uint8_t table16_8_emit_[44];
336   static const uint8_t table16_9_emit_[92];
337   static const uint8_t table16_10_emit_[44];
338   static const uint8_t table16_11_emit_[92];
339   static const uint8_t table16_12_emit_[72];
340   static const uint8_t table16_13_emit_[72];
341   static const uint8_t table16_14_emit_[40];
342   static const uint8_t table16_15_emit_[31];
343   static const uint16_t table16_15_ops_[64];
344   static const uint8_t* const table16_emit_[16];
345   static const uint16_t* const table16_ops_[16];
346   static const uint8_t table17_0_emit_[16];
347   static const uint16_t table17_0_ops_[64];
348   static const uint8_t table17_1_emit_[28];
349   static const uint16_t table17_1_ops_[64];
350   static const uint8_t table17_2_emit_[36];
351   static const uint16_t table17_2_ops_[64];
352   static const uint8_t table17_3_emit_[68];
353   static const uint16_t table17_3_ops_[64];
354   static const uint8_t table17_4_emit_[16];
355   static const uint8_t table17_5_emit_[28];
356   static const uint8_t table17_6_emit_[36];
357   static const uint8_t table17_7_emit_[68];
358   static const uint8_t table17_8_emit_[16];
359   static const uint8_t table17_9_emit_[28];
360   static const uint8_t table17_10_emit_[36];
361   static const uint8_t table17_11_emit_[68];
362   static const uint8_t table17_12_emit_[16];
363   static const uint8_t table17_13_emit_[28];
364   static const uint8_t table17_14_emit_[36];
365   static const uint8_t table17_15_emit_[68];
366   static const uint8_t table17_16_emit_[16];
367   static const uint8_t table17_17_emit_[28];
368   static const uint8_t table17_18_emit_[36];
369   static const uint8_t table17_19_emit_[68];
370   static const uint8_t table17_20_emit_[16];
371   static const uint8_t table17_21_emit_[28];
372   static const uint8_t table17_22_emit_[36];
373   static const uint8_t table17_23_emit_[68];
374   static const uint8_t table17_24_emit_[44];
375   static const uint8_t table17_25_emit_[92];
376   static const uint8_t table17_26_emit_[44];
377   static const uint8_t table17_27_emit_[92];
378   static const uint8_t table17_28_emit_[72];
379   static const uint8_t table17_29_emit_[72];
380   static const uint8_t table17_30_emit_[72];
381   static const uint8_t table17_31_emit_[24];
382   static const uint16_t table17_31_ops_[64];
383   static const uint8_t* const table17_emit_[32];
384   static const uint16_t* const table17_ops_[32];
385   static const uint16_t table18_0_ops_[128];
386   static const uint16_t table18_1_ops_[128];
387   static const uint16_t table18_2_ops_[128];
388   static const uint16_t table18_3_ops_[128];
389   static const uint16_t table18_24_ops_[128];
390   static const uint8_t table18_25_emit_[104];
391   static const uint16_t table18_25_ops_[128];
392   static const uint8_t table18_27_emit_[104];
393   static const uint8_t table18_28_emit_[136];
394   static const uint16_t table18_28_ops_[128];
395   static const uint8_t table18_29_emit_[136];
396   static const uint8_t table18_30_emit_[136];
397   static const uint8_t table18_31_emit_[50];
398   static const uint16_t table18_31_ops_[128];
399   static const uint8_t* const table18_emit_[32];
400   static const uint16_t* const table18_ops_[32];
401   static const uint8_t table19_0_emit_[120];
402   static const uint16_t table19_0_ops_[128];
403   static const uint8_t table19_1_emit_[120];
404   static const uint8_t table19_2_emit_[68];
405   static const uint16_t table19_2_ops_[128];
406   static const uint8_t table19_3_emit_[16];
407   static const uint16_t table19_3_ops_[128];
408   static const uint8_t table19_4_emit_[16];
409   static const uint8_t table19_5_emit_[20];
410   static const uint16_t table19_5_ops_[128];
411   static const uint8_t table19_6_emit_[32];
412   static const uint16_t table19_6_ops_[128];
413   static const uint8_t table19_7_emit_[46];
414   static const uint16_t table19_7_ops_[128];
415   static const uint8_t table19_8_emit_[120];
416   static const uint8_t table19_9_emit_[120];
417   static const uint8_t table19_10_emit_[68];
418   static const uint8_t table19_11_emit_[16];
419   static const uint8_t table19_12_emit_[16];
420   static const uint8_t table19_13_emit_[20];
421   static const uint8_t table19_14_emit_[32];
422   static const uint8_t table19_15_emit_[46];
423   static const uint8_t table19_16_emit_[120];
424   static const uint8_t table19_17_emit_[120];
425   static const uint8_t table19_18_emit_[68];
426   static const uint8_t table19_19_emit_[16];
427   static const uint8_t table19_20_emit_[16];
428   static const uint8_t table19_21_emit_[20];
429   static const uint8_t table19_22_emit_[32];
430   static const uint8_t table19_23_emit_[46];
431   static const uint8_t table19_24_emit_[120];
432   static const uint8_t table19_25_emit_[120];
433   static const uint8_t table19_26_emit_[68];
434   static const uint8_t table19_27_emit_[16];
435   static const uint8_t table19_28_emit_[16];
436   static const uint8_t table19_29_emit_[20];
437   static const uint8_t table19_30_emit_[32];
438   static const uint8_t table19_31_emit_[46];
439   static const uint8_t table19_32_emit_[120];
440   static const uint8_t table19_33_emit_[120];
441   static const uint8_t table19_34_emit_[68];
442   static const uint8_t table19_35_emit_[16];
443   static const uint8_t table19_36_emit_[16];
444   static const uint8_t table19_37_emit_[20];
445   static const uint8_t table19_38_emit_[32];
446   static const uint8_t table19_39_emit_[46];
447   static const uint8_t table19_40_emit_[120];
448   static const uint8_t table19_41_emit_[120];
449   static const uint8_t table19_42_emit_[68];
450   static const uint8_t table19_43_emit_[16];
451   static const uint8_t table19_44_emit_[16];
452   static const uint8_t table19_45_emit_[20];
453   static const uint8_t table19_46_emit_[32];
454   static const uint8_t table19_47_emit_[46];
455   static const uint8_t table19_48_emit_[16];
456   static const uint8_t table19_49_emit_[28];
457   static const uint16_t table19_49_ops_[128];
458   static const uint8_t table19_50_emit_[36];
459   static const uint16_t table19_50_ops_[128];
460   static const uint8_t table19_51_emit_[68];
461   static const uint16_t table19_51_ops_[128];
462   static const uint8_t table19_52_emit_[16];
463   static const uint8_t table19_53_emit_[28];
464   static const uint8_t table19_54_emit_[36];
465   static const uint8_t table19_55_emit_[68];
466   static const uint8_t table19_56_emit_[44];
467   static const uint16_t table19_56_ops_[128];
468   static const uint8_t table19_57_emit_[104];
469   static const uint16_t table19_57_ops_[128];
470   static const uint8_t table19_58_emit_[44];
471   static const uint8_t table19_59_emit_[104];
472   static const uint8_t table19_60_emit_[44];
473   static const uint8_t table19_61_emit_[104];
474   static const uint8_t table19_62_emit_[15];
475   static const uint16_t table19_62_ops_[128];
476   static const uint8_t table19_63_emit_[64];
477   static const uint16_t table19_63_ops_[128];
478   static const uint8_t* const table19_emit_[64];
479   static const uint16_t* const table19_ops_[64];
480   static const uint8_t table20_0_emit_[216];
481   static const uint16_t table20_0_ops_[128];
482   static const uint8_t table20_1_emit_[216];
483   static const uint8_t table20_2_emit_[216];
484   static const uint8_t table20_3_emit_[216];
485   static const uint8_t table20_4_emit_[216];
486   static const uint8_t table20_5_emit_[120];
487   static const uint16_t table20_5_ops_[128];
488   static const uint8_t table20_6_emit_[120];
489   static const uint8_t table20_7_emit_[120];
490   static const uint8_t table20_8_emit_[120];
491   static const uint8_t table20_9_emit_[120];
492   static const uint8_t table20_10_emit_[120];
493   static const uint8_t table20_11_emit_[68];
494   static const uint16_t table20_11_ops_[128];
495   static const uint8_t table20_12_emit_[16];
496   static const uint16_t table20_12_ops_[128];
497   static const uint8_t table20_13_emit_[16];
498   static const uint8_t table20_14_emit_[16];
499   static const uint8_t table20_15_emit_[36];
500   static const uint16_t table20_15_ops_[128];
501   static const uint8_t table20_16_emit_[216];
502   static const uint8_t table20_17_emit_[216];
503   static const uint8_t table20_18_emit_[216];
504   static const uint8_t table20_19_emit_[216];
505   static const uint8_t table20_20_emit_[216];
506   static const uint8_t table20_21_emit_[120];
507   static const uint8_t table20_22_emit_[120];
508   static const uint8_t table20_23_emit_[120];
509   static const uint8_t table20_24_emit_[120];
510   static const uint8_t table20_25_emit_[120];
511   static const uint8_t table20_26_emit_[120];
512   static const uint8_t table20_27_emit_[68];
513   static const uint8_t table20_28_emit_[16];
514   static const uint8_t table20_29_emit_[16];
515   static const uint8_t table20_30_emit_[16];
516   static const uint8_t table20_31_emit_[36];
517   static const uint8_t table20_32_emit_[216];
518   static const uint8_t table20_33_emit_[216];
519   static const uint8_t table20_34_emit_[216];
520   static const uint8_t table20_35_emit_[216];
521   static const uint8_t table20_36_emit_[216];
522   static const uint8_t table20_37_emit_[120];
523   static const uint8_t table20_38_emit_[120];
524   static const uint8_t table20_39_emit_[120];
525   static const uint8_t table20_40_emit_[120];
526   static const uint8_t table20_41_emit_[120];
527   static const uint8_t table20_42_emit_[120];
528   static const uint8_t table20_43_emit_[68];
529   static const uint8_t table20_44_emit_[16];
530   static const uint8_t table20_45_emit_[16];
531   static const uint8_t table20_46_emit_[16];
532   static const uint8_t table20_47_emit_[36];
533   static const uint8_t table20_48_emit_[216];
534   static const uint8_t table20_49_emit_[216];
535   static const uint8_t table20_50_emit_[216];
536   static const uint8_t table20_51_emit_[216];
537   static const uint8_t table20_52_emit_[216];
538   static const uint8_t table20_53_emit_[120];
539   static const uint8_t table20_54_emit_[120];
540   static const uint8_t table20_55_emit_[120];
541   static const uint8_t table20_56_emit_[120];
542   static const uint8_t table20_57_emit_[120];
543   static const uint8_t table20_58_emit_[120];
544   static const uint8_t table20_59_emit_[68];
545   static const uint8_t table20_60_emit_[16];
546   static const uint8_t table20_61_emit_[16];
547   static const uint8_t table20_62_emit_[16];
548   static const uint8_t table20_63_emit_[36];
549   static const uint8_t table20_64_emit_[216];
550   static const uint8_t table20_65_emit_[216];
551   static const uint8_t table20_66_emit_[216];
552   static const uint8_t table20_67_emit_[216];
553   static const uint8_t table20_68_emit_[216];
554   static const uint8_t table20_69_emit_[120];
555   static const uint8_t table20_70_emit_[120];
556   static const uint8_t table20_71_emit_[120];
557   static const uint8_t table20_72_emit_[120];
558   static const uint8_t table20_73_emit_[120];
559   static const uint8_t table20_74_emit_[120];
560   static const uint8_t table20_75_emit_[68];
561   static const uint8_t table20_76_emit_[16];
562   static const uint8_t table20_77_emit_[16];
563   static const uint8_t table20_78_emit_[16];
564   static const uint8_t table20_79_emit_[36];
565   static const uint8_t table20_80_emit_[216];
566   static const uint8_t table20_81_emit_[216];
567   static const uint8_t table20_82_emit_[216];
568   static const uint8_t table20_83_emit_[216];
569   static const uint8_t table20_84_emit_[216];
570   static const uint8_t table20_85_emit_[120];
571   static const uint8_t table20_86_emit_[120];
572   static const uint8_t table20_87_emit_[120];
573   static const uint8_t table20_88_emit_[120];
574   static const uint8_t table20_89_emit_[120];
575   static const uint8_t table20_90_emit_[120];
576   static const uint8_t table20_91_emit_[68];
577   static const uint8_t table20_92_emit_[16];
578   static const uint8_t table20_93_emit_[16];
579   static const uint8_t table20_94_emit_[16];
580   static const uint8_t table20_95_emit_[36];
581   static const uint8_t table20_96_emit_[120];
582   static const uint8_t table20_97_emit_[120];
583   static const uint8_t table20_98_emit_[68];
584   static const uint8_t table20_99_emit_[16];
585   static const uint8_t table20_100_emit_[16];
586   static const uint8_t table20_101_emit_[20];
587   static const uint16_t table20_101_ops_[128];
588   static const uint8_t table20_102_emit_[32];
589   static const uint16_t table20_102_ops_[128];
590   static const uint8_t table20_103_emit_[46];
591   static const uint16_t table20_103_ops_[128];
592   static const uint8_t table20_104_emit_[120];
593   static const uint8_t table20_105_emit_[120];
594   static const uint8_t table20_106_emit_[68];
595   static const uint8_t table20_107_emit_[16];
596   static const uint8_t table20_108_emit_[16];
597   static const uint8_t table20_109_emit_[20];
598   static const uint8_t table20_110_emit_[32];
599   static const uint8_t table20_111_emit_[46];
600   static const uint8_t table20_112_emit_[16];
601   static const uint8_t table20_113_emit_[28];
602   static const uint16_t table20_113_ops_[128];
603   static const uint8_t table20_114_emit_[36];
604   static const uint16_t table20_114_ops_[128];
605   static const uint8_t table20_115_emit_[68];
606   static const uint16_t table20_115_ops_[128];
607   static const uint8_t table20_116_emit_[16];
608   static const uint8_t table20_117_emit_[28];
609   static const uint8_t table20_118_emit_[36];
610   static const uint8_t table20_119_emit_[68];
611   static const uint8_t table20_120_emit_[16];
612   static const uint8_t table20_121_emit_[28];
613   static const uint8_t table20_122_emit_[36];
614   static const uint8_t table20_123_emit_[68];
615   static const uint8_t table20_124_emit_[62];
616   static const uint16_t table20_124_ops_[128];
617   static const uint8_t table20_125_emit_[10];
618   static const uint16_t table20_125_ops_[128];
619   static const uint8_t table20_126_emit_[23];
620   static const uint16_t table20_126_ops_[128];
621   static const uint8_t table20_127_emit_[53];
622   static const uint16_t table20_127_ops_[128];
623   static const uint8_t* const table20_emit_[128];
624   static const uint16_t* const table20_ops_[128];
625   static const uint8_t table8_0_emit_[1];
626   static const uint16_t table8_0_ops_[512];
627   static const uint8_t table8_8_emit_[1];
628   static const uint8_t table8_16_emit_[1];
629   static const uint8_t table8_24_emit_[1];
630   static const uint8_t table8_32_emit_[1];
631   static const uint8_t table8_40_emit_[1];
632   static const uint8_t table8_48_emit_[1];
633   static const uint16_t table8_48_ops_[512];
634   static const uint8_t table8_52_emit_[1];
635   static const uint8_t table8_56_emit_[1];
636   static const uint16_t table8_56_ops_[512];
637   static const uint8_t table8_58_emit_[1];
638   static const uint8_t table8_60_emit_[1];
639   static const uint16_t table8_62_ops_[512];
640   static const uint8_t table8_63_emit_[80];
641   static const uint16_t table8_63_ops_[512];
642   static const uint8_t* const table8_emit_[64];
643   static const uint16_t* const table8_ops_[64];
644   static const uint8_t table32_0_emit_[8];
645   static const uint8_t table32_0_inner_[8];
646   static const uint8_t table36_0_inner_[7];
647   static const uint8_t table39_0_emit_[7];
648   static const uint8_t table39_0_inner_[8];
649   static const uint8_t table40_0_inner_[9];
650   static const uint8_t table40_0_outer_[16];
651   static const uint8_t table38_0_emit_[10];
652   static const uint8_t table38_0_ops_[32];
653 };
654 template <typename F>
655 class HuffDecoder : public HuffDecoderCommon {
656  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)657   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
658       : sink_(sink), begin_(begin), end_(end) {}
Run()659   bool Run() {
660     while (!done_) {
661       if (!RefillTo10()) {
662         Done0();
663         break;
664       }
665       const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
666       const auto op = GetOp1(index);
667       const int consumed = op & 15;
668       buffer_len_ -= consumed;
669       const auto emit_ofs = op >> 7;
670       switch ((op >> 4) & 7) {
671         case 0: {
672           sink_(GetEmit1(index, emit_ofs + 0));
673           sink_(GetEmit1(index, emit_ofs + 1));
674           break;
675         }
676         case 1: {
677           sink_(GetEmit1(index, emit_ofs + 0));
678           break;
679         }
680         case 2: {
681           DecodeStep0();
682           break;
683         }
684         case 3: {
685           DecodeStep18();
686           break;
687         }
688         case 4: {
689           DecodeStep1();
690           break;
691         }
692       }
693     }
694     return ok_;
695   }
696 
697  private:
RefillTo10()698   bool RefillTo10() {
699     switch (buffer_len_) {
700       case 0: {
701         return Read2to8Bytes();
702       }
703       case 1: {
704         return Read2to7Bytes();
705       }
706       case 2:
707       case 3:
708       case 4:
709       case 5:
710       case 6:
711       case 7:
712       case 8: {
713         return Read1to7Bytes();
714       }
715       case 9: {
716         return Read1to6Bytes();
717       }
718     }
719     return true;
720   }
Read2to8Bytes()721   bool Read2to8Bytes() {
722     switch (end_ - begin_) {
723       case 0:
724       case 1: {
725         return false;
726       }
727       case 2: {
728         Fill2();
729         return true;
730       }
731       case 3: {
732         Fill3();
733         return true;
734       }
735       case 4: {
736         Fill4();
737         return true;
738       }
739       case 5: {
740         Fill5();
741         return true;
742       }
743       case 6: {
744         Fill6();
745         return true;
746       }
747       case 7: {
748         Fill7();
749         return true;
750       }
751       default: {
752         Fill8();
753         return true;
754       }
755     }
756   }
Fill2()757   void Fill2() {
758     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
759               (static_cast<uint64_t>(begin_[1]) << 0);
760     begin_ += 2;
761     buffer_len_ += 16;
762   }
Fill3()763   void Fill3() {
764     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
765               (static_cast<uint64_t>(begin_[1]) << 8) |
766               (static_cast<uint64_t>(begin_[2]) << 0);
767     begin_ += 3;
768     buffer_len_ += 24;
769   }
Fill4()770   void Fill4() {
771     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
772               (static_cast<uint64_t>(begin_[1]) << 16) |
773               (static_cast<uint64_t>(begin_[2]) << 8) |
774               (static_cast<uint64_t>(begin_[3]) << 0);
775     begin_ += 4;
776     buffer_len_ += 32;
777   }
Fill5()778   void Fill5() {
779     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
780               (static_cast<uint64_t>(begin_[1]) << 24) |
781               (static_cast<uint64_t>(begin_[2]) << 16) |
782               (static_cast<uint64_t>(begin_[3]) << 8) |
783               (static_cast<uint64_t>(begin_[4]) << 0);
784     begin_ += 5;
785     buffer_len_ += 40;
786   }
Fill6()787   void Fill6() {
788     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
789               (static_cast<uint64_t>(begin_[1]) << 32) |
790               (static_cast<uint64_t>(begin_[2]) << 24) |
791               (static_cast<uint64_t>(begin_[3]) << 16) |
792               (static_cast<uint64_t>(begin_[4]) << 8) |
793               (static_cast<uint64_t>(begin_[5]) << 0);
794     begin_ += 6;
795     buffer_len_ += 48;
796   }
Fill7()797   void Fill7() {
798     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
799               (static_cast<uint64_t>(begin_[1]) << 40) |
800               (static_cast<uint64_t>(begin_[2]) << 32) |
801               (static_cast<uint64_t>(begin_[3]) << 24) |
802               (static_cast<uint64_t>(begin_[4]) << 16) |
803               (static_cast<uint64_t>(begin_[5]) << 8) |
804               (static_cast<uint64_t>(begin_[6]) << 0);
805     begin_ += 7;
806     buffer_len_ += 56;
807   }
Fill8()808   void Fill8() {
809     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
810               (static_cast<uint64_t>(begin_[1]) << 48) |
811               (static_cast<uint64_t>(begin_[2]) << 40) |
812               (static_cast<uint64_t>(begin_[3]) << 32) |
813               (static_cast<uint64_t>(begin_[4]) << 24) |
814               (static_cast<uint64_t>(begin_[5]) << 16) |
815               (static_cast<uint64_t>(begin_[6]) << 8) |
816               (static_cast<uint64_t>(begin_[7]) << 0);
817     begin_ += 8;
818     buffer_len_ += 64;
819   }
Read2to7Bytes()820   bool Read2to7Bytes() {
821     switch (end_ - begin_) {
822       case 0:
823       case 1: {
824         return false;
825       }
826       case 2: {
827         Fill2();
828         return true;
829       }
830       case 3: {
831         Fill3();
832         return true;
833       }
834       case 4: {
835         Fill4();
836         return true;
837       }
838       case 5: {
839         Fill5();
840         return true;
841       }
842       case 6: {
843         Fill6();
844         return true;
845       }
846       default: {
847         Fill7();
848         return true;
849       }
850     }
851   }
Read1to7Bytes()852   bool Read1to7Bytes() {
853     switch (end_ - begin_) {
854       case 0: {
855         return false;
856       }
857       case 1: {
858         Fill1();
859         return true;
860       }
861       case 2: {
862         Fill2();
863         return true;
864       }
865       case 3: {
866         Fill3();
867         return true;
868       }
869       case 4: {
870         Fill4();
871         return true;
872       }
873       case 5: {
874         Fill5();
875         return true;
876       }
877       case 6: {
878         Fill6();
879         return true;
880       }
881       default: {
882         Fill7();
883         return true;
884       }
885     }
886   }
Fill1()887   void Fill1() {
888     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
889     begin_ += 1;
890     buffer_len_ += 8;
891   }
Read1to6Bytes()892   bool Read1to6Bytes() {
893     switch (end_ - begin_) {
894       case 0: {
895         return false;
896       }
897       case 1: {
898         Fill1();
899         return true;
900       }
901       case 2: {
902         Fill2();
903         return true;
904       }
905       case 3: {
906         Fill3();
907         return true;
908       }
909       case 4: {
910         Fill4();
911         return true;
912       }
913       case 5: {
914         Fill5();
915         return true;
916       }
917       default: {
918         Fill6();
919         return true;
920       }
921     }
922   }
Done0()923   void Done0() {
924     done_ = true;
925     switch (end_ - begin_) {
926       case 1: {
927         Fill1();
928         break;
929       }
930     }
931     switch (buffer_len_) {
932       case 1:
933       case 2:
934       case 3:
935       case 4: {
936         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
937         return;
938       }
939       case 5: {
940         const auto index = buffer_ & 31;
941         const auto op = GetOp2(index);
942         switch (op & 3) {
943           case 0: {
944             sink_(GetEmit2(index, (op >> 2) + 0));
945             break;
946           }
947           case 1: {
948             ok_ = false;
949             break;
950           }
951         }
952         return;
953       }
954       case 6: {
955         const auto index = buffer_ & 63;
956         const auto op = GetOp3(index);
957         switch (op & 3) {
958           case 0: {
959             ok_ = false;
960             break;
961           }
962           case 1: {
963             sink_(GetEmit3(index, (op >> 2) + 0));
964             break;
965           }
966         }
967         return;
968       }
969       case 7: {
970         const auto index = buffer_ & 127;
971         const auto op = GetOp4(index);
972         switch (op & 3) {
973           case 0: {
974             ok_ = false;
975             break;
976           }
977           case 1: {
978             sink_(GetEmit4(index, (op >> 2) + 0));
979             break;
980           }
981         }
982         return;
983       }
984       case 8: {
985         const auto index = buffer_ & 255;
986         const auto op = GetOp5(index);
987         switch (op & 3) {
988           case 0: {
989             ok_ = false;
990             break;
991           }
992           case 1: {
993             sink_(GetEmit5(index, (op >> 2) + 0));
994             break;
995           }
996         }
997         return;
998       }
999       case 9: {
1000         const auto index = buffer_ & 511;
1001         const auto op = GetOp6(index);
1002         switch (op & 3) {
1003           case 0: {
1004             ok_ = false;
1005             break;
1006           }
1007           case 1: {
1008             sink_(GetEmit6(index, (op >> 2) + 0));
1009             break;
1010           }
1011         }
1012         return;
1013       }
1014       case 0: {
1015         return;
1016       }
1017     }
1018   }
DecodeStep0()1019   void DecodeStep0() {
1020     if (!RefillTo1()) {
1021       Done1();
1022       return;
1023     }
1024     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1025     const auto op = GetOp7(index);
1026     const int consumed = op & 1;
1027     buffer_len_ -= consumed;
1028     const auto emit_ofs = op >> 1;
1029     sink_(GetEmit7(index, emit_ofs + 0));
1030   }
RefillTo1()1031   bool RefillTo1() {
1032     switch (buffer_len_) {
1033       case 0: {
1034         return Read1to8Bytes();
1035       }
1036     }
1037     return true;
1038   }
Read1to8Bytes()1039   bool Read1to8Bytes() {
1040     switch (end_ - begin_) {
1041       case 0: {
1042         return false;
1043       }
1044       case 1: {
1045         Fill1();
1046         return true;
1047       }
1048       case 2: {
1049         Fill2();
1050         return true;
1051       }
1052       case 3: {
1053         Fill3();
1054         return true;
1055       }
1056       case 4: {
1057         Fill4();
1058         return true;
1059       }
1060       case 5: {
1061         Fill5();
1062         return true;
1063       }
1064       case 6: {
1065         Fill6();
1066         return true;
1067       }
1068       case 7: {
1069         Fill7();
1070         return true;
1071       }
1072       default: {
1073         Fill8();
1074         return true;
1075       }
1076     }
1077   }
Done1()1078   void Done1() {
1079     done_ = true;
1080     ok_ = false;
1081   }
DecodeStep1()1082   void DecodeStep1() {
1083     if (!RefillTo15()) {
1084       Done2();
1085       return;
1086     }
1087     const auto index = (buffer_ >> (buffer_len_ - 15)) & 0x7fff;
1088     const auto op = GetOp8(index);
1089     const int consumed = op & 15;
1090     buffer_len_ -= consumed;
1091     const auto emit_ofs = op >> 9;
1092     switch ((op >> 4) & 31) {
1093       case 0: {
1094         sink_(GetEmit8(index, emit_ofs + 0));
1095         break;
1096       }
1097       case 1: {
1098         DecodeStep2();
1099         break;
1100       }
1101       case 2: {
1102         DecodeStep3();
1103         break;
1104       }
1105       case 3: {
1106         DecodeStep4();
1107         break;
1108       }
1109       case 4: {
1110         DecodeStep5();
1111         break;
1112       }
1113       case 5: {
1114         DecodeStep6();
1115         break;
1116       }
1117       case 6: {
1118         DecodeStep7();
1119         break;
1120       }
1121       case 7: {
1122         DecodeStep8();
1123         break;
1124       }
1125       case 8: {
1126         DecodeStep15();
1127         break;
1128       }
1129       case 9: {
1130         DecodeStep9();
1131         break;
1132       }
1133       case 10: {
1134         DecodeStep10();
1135         break;
1136       }
1137       case 11: {
1138         DecodeStep11();
1139         break;
1140       }
1141       case 12: {
1142         DecodeStep12();
1143         break;
1144       }
1145       case 13: {
1146         DecodeStep16();
1147         break;
1148       }
1149       case 14: {
1150         DecodeStep13();
1151         break;
1152       }
1153       case 15: {
1154         DecodeStep14();
1155         break;
1156       }
1157       case 16: {
1158         DecodeStep17();
1159         break;
1160       }
1161     }
1162   }
RefillTo15()1163   bool RefillTo15() {
1164     switch (buffer_len_) {
1165       case 0: {
1166         return Read2to8Bytes();
1167       }
1168       case 1:
1169       case 2:
1170       case 3:
1171       case 4:
1172       case 5:
1173       case 6: {
1174         return Read2to7Bytes();
1175       }
1176       case 7:
1177       case 8: {
1178         return Read1to7Bytes();
1179       }
1180       case 9:
1181       case 10:
1182       case 11:
1183       case 12:
1184       case 13:
1185       case 14: {
1186         return Read1to6Bytes();
1187       }
1188     }
1189     return true;
1190   }
Done2()1191   void Done2() {
1192     done_ = true;
1193     switch (end_ - begin_) {
1194       case 1: {
1195         Fill1();
1196         break;
1197       }
1198     }
1199     switch (buffer_len_) {
1200       case 1:
1201       case 2: {
1202         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1203         return;
1204       }
1205       case 3: {
1206         const auto index = buffer_ & 7;
1207         const auto op = GetOp9(index);
1208         switch (op & 3) {
1209           case 0: {
1210             sink_(GetEmit9(index, (op >> 2) + 0));
1211             break;
1212           }
1213           case 1: {
1214             ok_ = false;
1215             break;
1216           }
1217         }
1218         return;
1219       }
1220       case 4: {
1221         const auto index = buffer_ & 15;
1222         const auto op = GetOp10(index);
1223         switch (op & 3) {
1224           case 0: {
1225             ok_ = false;
1226             break;
1227           }
1228           case 1: {
1229             sink_(GetEmit10(index, (op >> 2) + 0));
1230             break;
1231           }
1232         }
1233         return;
1234       }
1235       case 5: {
1236         const auto index = buffer_ & 31;
1237         const auto op = GetOp11(index);
1238         switch (op & 3) {
1239           case 0: {
1240             ok_ = false;
1241             break;
1242           }
1243           case 1: {
1244             sink_(GetEmit11(index, (op >> 2) + 0));
1245             break;
1246           }
1247         }
1248         return;
1249       }
1250       case 6: {
1251         const auto index = buffer_ & 63;
1252         const auto op = GetOp12(index);
1253         switch (op & 3) {
1254           case 0: {
1255             ok_ = false;
1256             break;
1257           }
1258           case 1: {
1259             sink_(GetEmit12(index, (op >> 2) + 0));
1260             break;
1261           }
1262         }
1263         return;
1264       }
1265       case 7: {
1266         const auto index = buffer_ & 127;
1267         const auto op = GetOp13(index);
1268         switch (op & 3) {
1269           case 0: {
1270             ok_ = false;
1271             break;
1272           }
1273           case 1: {
1274             sink_(GetEmit13(index, (op >> 2) + 0));
1275             break;
1276           }
1277         }
1278         return;
1279       }
1280       case 8: {
1281         const auto index = buffer_ & 255;
1282         const auto op = GetOp14(index);
1283         switch (op & 3) {
1284           case 0: {
1285             sink_(GetEmit14(index, (op >> 2) + 0));
1286             sink_(GetEmit14(index, (op >> 2) + 1));
1287             break;
1288           }
1289           case 1: {
1290             ok_ = false;
1291             break;
1292           }
1293           case 2: {
1294             sink_(GetEmit14(index, (op >> 2) + 0));
1295             break;
1296           }
1297         }
1298         return;
1299       }
1300       case 9: {
1301         const auto index = buffer_ & 511;
1302         const auto op = GetOp15(index);
1303         switch (op & 3) {
1304           case 0: {
1305             ok_ = false;
1306             break;
1307           }
1308           case 1: {
1309             sink_(GetEmit15(index, (op >> 2) + 0));
1310             sink_(GetEmit15(index, (op >> 2) + 1));
1311             break;
1312           }
1313           case 2: {
1314             sink_(GetEmit15(index, (op >> 2) + 0));
1315             break;
1316           }
1317         }
1318         return;
1319       }
1320       case 10: {
1321         const auto index = buffer_ & 1023;
1322         const auto op = GetOp16(index);
1323         switch (op & 3) {
1324           case 0: {
1325             ok_ = false;
1326             break;
1327           }
1328           case 1: {
1329             sink_(GetEmit16(index, (op >> 2) + 0));
1330             sink_(GetEmit16(index, (op >> 2) + 1));
1331             break;
1332           }
1333           case 2: {
1334             sink_(GetEmit16(index, (op >> 2) + 0));
1335             break;
1336           }
1337         }
1338         return;
1339       }
1340       case 11: {
1341         const auto index = buffer_ & 2047;
1342         const auto op = GetOp17(index);
1343         switch (op & 3) {
1344           case 0: {
1345             ok_ = false;
1346             break;
1347           }
1348           case 1: {
1349             sink_(GetEmit17(index, (op >> 2) + 0));
1350             sink_(GetEmit17(index, (op >> 2) + 1));
1351             break;
1352           }
1353           case 2: {
1354             sink_(GetEmit17(index, (op >> 2) + 0));
1355             break;
1356           }
1357         }
1358         return;
1359       }
1360       case 12: {
1361         const auto index = buffer_ & 4095;
1362         const auto op = GetOp18(index);
1363         switch (op & 3) {
1364           case 0: {
1365             ok_ = false;
1366             break;
1367           }
1368           case 1: {
1369             sink_(GetEmit18(index, (op >> 2) + 0));
1370             sink_(GetEmit18(index, (op >> 2) + 1));
1371             break;
1372           }
1373           case 2: {
1374             sink_(GetEmit18(index, (op >> 2) + 0));
1375             break;
1376           }
1377         }
1378         return;
1379       }
1380       case 13: {
1381         const auto index = buffer_ & 8191;
1382         const auto op = GetOp19(index);
1383         switch (op & 7) {
1384           case 0: {
1385             sink_(GetEmit19(index, (op >> 3) + 0));
1386             sink_(GetEmit19(index, (op >> 3) + 1));
1387             sink_(GetEmit19(index, (op >> 3) + 2));
1388             break;
1389           }
1390           case 1: {
1391             ok_ = false;
1392             break;
1393           }
1394           case 2: {
1395             sink_(GetEmit19(index, (op >> 3) + 0));
1396             sink_(GetEmit19(index, (op >> 3) + 1));
1397             break;
1398           }
1399           case 3: {
1400             sink_(GetEmit19(index, (op >> 3) + 0));
1401             break;
1402           }
1403         }
1404         return;
1405       }
1406       case 14: {
1407         const auto index = buffer_ & 16383;
1408         const auto op = GetOp20(index);
1409         switch (op & 7) {
1410           case 0: {
1411             ok_ = false;
1412             break;
1413           }
1414           case 1: {
1415             sink_(GetEmit20(index, (op >> 3) + 0));
1416             sink_(GetEmit20(index, (op >> 3) + 1));
1417             sink_(GetEmit20(index, (op >> 3) + 2));
1418             break;
1419           }
1420           case 2: {
1421             sink_(GetEmit20(index, (op >> 3) + 0));
1422             sink_(GetEmit20(index, (op >> 3) + 1));
1423             break;
1424           }
1425           case 3: {
1426             sink_(GetEmit20(index, (op >> 3) + 0));
1427             break;
1428           }
1429         }
1430         return;
1431       }
1432       case 0: {
1433         return;
1434       }
1435     }
1436   }
DecodeStep2()1437   void DecodeStep2() {
1438     if (!RefillTo1()) {
1439       Done3();
1440       return;
1441     }
1442     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1443     const auto op = GetOp21(index);
1444     const int consumed = op & 1;
1445     buffer_len_ -= consumed;
1446     const auto emit_ofs = op >> 1;
1447     sink_(GetEmit21(index, emit_ofs + 0));
1448   }
Done3()1449   void Done3() {
1450     done_ = true;
1451     ok_ = false;
1452   }
DecodeStep3()1453   void DecodeStep3() {
1454     if (!RefillTo1()) {
1455       Done4();
1456       return;
1457     }
1458     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1459     const auto op = GetOp22(index);
1460     const int consumed = op & 1;
1461     buffer_len_ -= consumed;
1462     const auto emit_ofs = op >> 1;
1463     sink_(GetEmit22(index, emit_ofs + 0));
1464   }
Done4()1465   void Done4() {
1466     done_ = true;
1467     ok_ = false;
1468   }
DecodeStep4()1469   void DecodeStep4() {
1470     if (!RefillTo1()) {
1471       Done5();
1472       return;
1473     }
1474     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1475     const auto op = GetOp23(index);
1476     const int consumed = op & 1;
1477     buffer_len_ -= consumed;
1478     const auto emit_ofs = op >> 1;
1479     sink_(GetEmit23(index, emit_ofs + 0));
1480   }
Done5()1481   void Done5() {
1482     done_ = true;
1483     ok_ = false;
1484   }
DecodeStep5()1485   void DecodeStep5() {
1486     if (!RefillTo1()) {
1487       Done6();
1488       return;
1489     }
1490     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1491     const auto op = GetOp24(index);
1492     const int consumed = op & 1;
1493     buffer_len_ -= consumed;
1494     const auto emit_ofs = op >> 1;
1495     sink_(GetEmit24(index, emit_ofs + 0));
1496   }
Done6()1497   void Done6() {
1498     done_ = true;
1499     ok_ = false;
1500   }
DecodeStep6()1501   void DecodeStep6() {
1502     if (!RefillTo1()) {
1503       Done7();
1504       return;
1505     }
1506     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1507     const auto op = GetOp25(index);
1508     const int consumed = op & 1;
1509     buffer_len_ -= consumed;
1510     const auto emit_ofs = op >> 1;
1511     sink_(GetEmit25(index, emit_ofs + 0));
1512   }
Done7()1513   void Done7() {
1514     done_ = true;
1515     ok_ = false;
1516   }
DecodeStep7()1517   void DecodeStep7() {
1518     if (!RefillTo1()) {
1519       Done8();
1520       return;
1521     }
1522     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1523     const auto op = GetOp26(index);
1524     const int consumed = op & 1;
1525     buffer_len_ -= consumed;
1526     const auto emit_ofs = op >> 1;
1527     sink_(GetEmit26(index, emit_ofs + 0));
1528   }
Done8()1529   void Done8() {
1530     done_ = true;
1531     ok_ = false;
1532   }
DecodeStep8()1533   void DecodeStep8() {
1534     if (!RefillTo1()) {
1535       Done9();
1536       return;
1537     }
1538     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1539     const auto op = GetOp27(index);
1540     const int consumed = op & 1;
1541     buffer_len_ -= consumed;
1542     const auto emit_ofs = op >> 1;
1543     sink_(GetEmit27(index, emit_ofs + 0));
1544   }
Done9()1545   void Done9() {
1546     done_ = true;
1547     ok_ = false;
1548   }
DecodeStep9()1549   void DecodeStep9() {
1550     if (!RefillTo2()) {
1551       Done10();
1552       return;
1553     }
1554     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1555     const auto op = GetOp28(index);
1556     const int consumed = op & 3;
1557     buffer_len_ -= consumed;
1558     const auto emit_ofs = op >> 2;
1559     sink_(GetEmit28(index, emit_ofs + 0));
1560   }
RefillTo2()1561   bool RefillTo2() {
1562     switch (buffer_len_) {
1563       case 0: {
1564         return Read1to8Bytes();
1565       }
1566       case 1: {
1567         return Read1to7Bytes();
1568       }
1569     }
1570     return true;
1571   }
Done10()1572   void Done10() {
1573     done_ = true;
1574     switch (buffer_len_) {
1575       case 1:
1576       case 0: {
1577         ok_ = false;
1578         return;
1579       }
1580     }
1581   }
DecodeStep10()1582   void DecodeStep10() {
1583     if (!RefillTo2()) {
1584       Done11();
1585       return;
1586     }
1587     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1588     const auto op = GetOp29(index);
1589     const int consumed = op & 3;
1590     buffer_len_ -= consumed;
1591     const auto emit_ofs = op >> 2;
1592     sink_(GetEmit29(index, emit_ofs + 0));
1593   }
Done11()1594   void Done11() {
1595     done_ = true;
1596     switch (buffer_len_) {
1597       case 1:
1598       case 0: {
1599         ok_ = false;
1600         return;
1601       }
1602     }
1603   }
DecodeStep11()1604   void DecodeStep11() {
1605     if (!RefillTo2()) {
1606       Done12();
1607       return;
1608     }
1609     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1610     const auto op = GetOp30(index);
1611     const int consumed = op & 3;
1612     buffer_len_ -= consumed;
1613     const auto emit_ofs = op >> 2;
1614     sink_(GetEmit30(index, emit_ofs + 0));
1615   }
Done12()1616   void Done12() {
1617     done_ = true;
1618     switch (buffer_len_) {
1619       case 1:
1620       case 0: {
1621         ok_ = false;
1622         return;
1623       }
1624     }
1625   }
DecodeStep12()1626   void DecodeStep12() {
1627     if (!RefillTo2()) {
1628       Done13();
1629       return;
1630     }
1631     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1632     const auto op = GetOp31(index);
1633     const int consumed = op & 3;
1634     buffer_len_ -= consumed;
1635     const auto emit_ofs = op >> 2;
1636     sink_(GetEmit31(index, emit_ofs + 0));
1637   }
Done13()1638   void Done13() {
1639     done_ = true;
1640     switch (buffer_len_) {
1641       case 1:
1642       case 0: {
1643         ok_ = false;
1644         return;
1645       }
1646     }
1647   }
DecodeStep13()1648   void DecodeStep13() {
1649     if (!RefillTo3()) {
1650       Done14();
1651       return;
1652     }
1653     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1654     const auto op = GetOp32(index);
1655     const int consumed = op & 3;
1656     buffer_len_ -= consumed;
1657     const auto emit_ofs = op >> 2;
1658     sink_(GetEmit32(index, emit_ofs + 0));
1659   }
RefillTo3()1660   bool RefillTo3() {
1661     switch (buffer_len_) {
1662       case 0: {
1663         return Read1to8Bytes();
1664       }
1665       case 1:
1666       case 2: {
1667         return Read1to7Bytes();
1668       }
1669     }
1670     return true;
1671   }
Done14()1672   void Done14() {
1673     done_ = true;
1674     switch (buffer_len_) {
1675       case 1:
1676       case 2:
1677       case 0: {
1678         ok_ = false;
1679         return;
1680       }
1681     }
1682   }
DecodeStep14()1683   void DecodeStep14() {
1684     if (!RefillTo3()) {
1685       Done15();
1686       return;
1687     }
1688     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1689     const auto op = GetOp33(index);
1690     const int consumed = op & 3;
1691     buffer_len_ -= consumed;
1692     const auto emit_ofs = op >> 2;
1693     sink_(GetEmit33(index, emit_ofs + 0));
1694   }
Done15()1695   void Done15() {
1696     done_ = true;
1697     switch (buffer_len_) {
1698       case 1:
1699       case 2:
1700       case 0: {
1701         ok_ = false;
1702         return;
1703       }
1704     }
1705   }
DecodeStep15()1706   void DecodeStep15() {
1707     if (!RefillTo2()) {
1708       Done16();
1709       return;
1710     }
1711     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1712     const auto op = GetOp34(index);
1713     const int consumed = op & 3;
1714     buffer_len_ -= consumed;
1715     const auto emit_ofs = op >> 2;
1716     sink_(GetEmit34(index, emit_ofs + 0));
1717   }
Done16()1718   void Done16() {
1719     done_ = true;
1720     switch (buffer_len_) {
1721       case 1: {
1722         const auto index = buffer_ & 1;
1723         const auto op = GetOp35(index);
1724         switch (op & 1) {
1725           case 0: {
1726             sink_(GetEmit35(index, (op >> 1) + 0));
1727             break;
1728           }
1729           case 1: {
1730             ok_ = false;
1731             break;
1732           }
1733         }
1734         return;
1735       }
1736       case 0: {
1737         ok_ = false;
1738         return;
1739       }
1740     }
1741   }
DecodeStep16()1742   void DecodeStep16() {
1743     if (!RefillTo3()) {
1744       Done17();
1745       return;
1746     }
1747     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1748     const auto op = GetOp36(index);
1749     const int consumed = op & 3;
1750     buffer_len_ -= consumed;
1751     const auto emit_ofs = op >> 2;
1752     sink_(GetEmit36(index, emit_ofs + 0));
1753   }
Done17()1754   void Done17() {
1755     done_ = true;
1756     switch (buffer_len_) {
1757       case 1:
1758       case 0: {
1759         ok_ = false;
1760         return;
1761       }
1762       case 2: {
1763         const auto index = buffer_ & 3;
1764         const auto op = GetOp37(index);
1765         switch (op & 1) {
1766           case 0: {
1767             sink_(GetEmit37(index, (op >> 1) + 0));
1768             break;
1769           }
1770           case 1: {
1771             ok_ = false;
1772             break;
1773           }
1774         }
1775         return;
1776       }
1777     }
1778   }
DecodeStep17()1779   void DecodeStep17() {
1780     if (!RefillTo5()) {
1781       Done18();
1782       return;
1783     }
1784     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1785     const auto op = GetOp38(index);
1786     const int consumed = op & 7;
1787     buffer_len_ -= consumed;
1788     const auto emit_ofs = op >> 4;
1789     switch ((op >> 3) & 1) {
1790       case 0: {
1791         sink_(GetEmit38(index, emit_ofs + 0));
1792         break;
1793       }
1794       case 1: {
1795         begin_ = end_;
1796         buffer_len_ = 0;
1797         break;
1798       }
1799     }
1800   }
RefillTo5()1801   bool RefillTo5() {
1802     switch (buffer_len_) {
1803       case 0: {
1804         return Read1to8Bytes();
1805       }
1806       case 1:
1807       case 2:
1808       case 3:
1809       case 4: {
1810         return Read1to7Bytes();
1811       }
1812     }
1813     return true;
1814   }
Done18()1815   void Done18() {
1816     done_ = true;
1817     switch (buffer_len_) {
1818       case 1:
1819       case 2: {
1820         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1821         return;
1822       }
1823       case 3: {
1824         const auto index = buffer_ & 7;
1825         const auto op = GetOp39(index);
1826         switch (op & 1) {
1827           case 0: {
1828             sink_(GetEmit39(index, (op >> 1) + 0));
1829             break;
1830           }
1831         }
1832         return;
1833       }
1834       case 4: {
1835         const auto index = buffer_ & 15;
1836         const auto op = GetOp40(index);
1837         switch (op & 3) {
1838           case 0: {
1839             ok_ = false;
1840             break;
1841           }
1842           case 1: {
1843             sink_(GetEmit40(index, (op >> 2) + 0));
1844             break;
1845           }
1846         }
1847         return;
1848       }
1849       case 0: {
1850         return;
1851       }
1852     }
1853   }
DecodeStep18()1854   void DecodeStep18() {
1855     if (!RefillTo2()) {
1856       Done19();
1857       return;
1858     }
1859     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1860     const auto op = GetOp41(index);
1861     const int consumed = op & 3;
1862     buffer_len_ -= consumed;
1863     const auto emit_ofs = op >> 2;
1864     sink_(GetEmit41(index, emit_ofs + 0));
1865   }
Done19()1866   void Done19() {
1867     done_ = true;
1868     switch (buffer_len_) {
1869       case 1: {
1870         const auto index = buffer_ & 1;
1871         const auto op = GetOp42(index);
1872         switch (op & 1) {
1873           case 0: {
1874             sink_(GetEmit42(index, (op >> 1) + 0));
1875             break;
1876           }
1877           case 1: {
1878             ok_ = false;
1879             break;
1880           }
1881         }
1882         return;
1883       }
1884       case 0: {
1885         ok_ = false;
1886         return;
1887       }
1888     }
1889   }
1890   F sink_;
1891   const uint8_t* begin_;
1892   const uint8_t* const end_;
1893   uint64_t buffer_ = 0;
1894   int buffer_len_ = 0;
1895   bool ok_ = true;
1896   bool done_ = false;
1897 };
1898 }  // namespace geometry_10_15_5
1899 }  // namespace grpc_core
1900 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_15_5_H
1901