xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_12_6_12.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_6_12_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_6_12_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_12_6_12 {
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   }
GetOp12(size_t i)104   static inline uint64_t GetOp12(size_t i) {
105     return table12_0_inner_[table12_0_outer_[i]];
106   }
GetEmit12(size_t,size_t emit)107   static inline uint64_t GetEmit12(size_t, size_t emit) {
108     return table14_0_emit_[emit];
109   }
GetOp17(size_t i)110   static inline uint64_t GetOp17(size_t i) { return i ? 3 : 1; }
GetEmit17(size_t,size_t emit)111   static inline uint64_t GetEmit17(size_t, size_t emit) {
112     return emit ? 195 : 92;
113   }
GetOp18(size_t i)114   static inline uint64_t GetOp18(size_t i) {
115     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
116   }
GetEmit18(size_t,size_t emit)117   static inline uint64_t GetEmit18(size_t, size_t emit) {
118     return (emit < 2 ? (emit ? 162 : 131) : ((emit - 2) ? 194 : 184));
119   }
GetOp19(size_t i)120   static inline uint64_t GetOp19(size_t i) { return table19_0_inner_[i]; }
GetEmit19(size_t,size_t emit)121   static inline uint64_t GetEmit19(size_t, size_t emit) {
122     return table19_0_emit_[emit];
123   }
GetOp21(size_t i)124   static inline uint64_t GetOp21(size_t i) { return i; }
GetEmit21(size_t,size_t emit)125   static inline uint64_t GetEmit21(size_t, size_t emit) {
126     return ((void)emit, 208);
127   }
GetOp20(size_t i)128   static inline uint64_t GetOp20(size_t i) {
129     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
130                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
131                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
132   }
GetEmit20(size_t,size_t emit)133   static inline uint64_t GetEmit20(size_t, size_t emit) {
134     return (emit < 1 ? (((void)emit, 208)) : ((emit - 1) ? 130 : 128));
135   }
GetOp23(size_t i)136   static inline uint64_t GetOp23(size_t i) {
137     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
138   }
GetEmit23(size_t,size_t emit)139   static inline uint64_t GetEmit23(size_t, size_t emit) {
140     return ((void)emit, 230);
141   }
GetOp22(size_t i)142   static inline uint64_t GetOp22(size_t i) {
143     return table22_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
144   }
GetEmit22(size_t,size_t emit)145   static inline uint64_t GetEmit22(size_t, size_t emit) {
146     return table22_0_emit_[emit];
147   }
GetOp25(size_t i)148   static inline uint64_t GetOp25(size_t i) {
149     return ((i < 2 ? (i) : (((void)(i - 2), 2))) < 1
150                 ? (((void)(i < 2 ? (i) : (((void)(i - 2), 2))), 0))
151                 : (((i < 2 ? (i) : (((void)(i - 2), 2))) - 1) ? 1 : 2));
152   }
GetEmit25(size_t,size_t emit)153   static inline uint64_t GetEmit25(size_t, size_t emit) {
154     return emit ? 226 : 224;
155   }
GetOp24(size_t i)156   static inline uint64_t GetOp24(size_t i) {
157     return table24_0_inner_[(i < 3 ? (i / 2 + 0) : ((i - 3) + 1))];
158   }
GetEmit24(size_t,size_t emit)159   static inline uint64_t GetEmit24(size_t, size_t emit) {
160     return table24_0_emit_[emit];
161   }
GetOp27(size_t i)162   static inline uint64_t GetOp27(size_t i) {
163     return table27_0_inner_[(i < 12 ? (i) : (((void)(i - 12), 12)))];
164   }
GetEmit27(size_t,size_t emit)165   static inline uint64_t GetEmit27(size_t, size_t emit) {
166     return table27_0_emit_[emit];
167   }
GetOp26(size_t i)168   static inline uint64_t GetOp26(size_t i) { return table26_0_ops_[i]; }
GetEmit26(size_t,size_t emit)169   static inline uint64_t GetEmit26(size_t, size_t emit) {
170     return table26_0_emit_[emit];
171   }
GetOp29(size_t i)172   static inline uint64_t GetOp29(size_t i) { return table29_0_ops_[i]; }
GetEmit29(size_t,size_t emit)173   static inline uint64_t GetEmit29(size_t, size_t emit) {
174     return table29_0_emit_[emit];
175   }
GetOp30(size_t i)176   static inline uint64_t GetOp30(size_t i) { return table30_0_ops_[i]; }
GetEmit30(size_t,size_t emit)177   static inline uint64_t GetEmit30(size_t, size_t emit) {
178     return table30_0_emit_[emit];
179   }
GetOp31(size_t i)180   static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; }
GetEmit31(size_t,size_t emit)181   static inline uint64_t GetEmit31(size_t, size_t emit) {
182     return table31_0_emit_[emit];
183   }
GetOp32(size_t i)184   static inline uint64_t GetOp32(size_t i) { return table32_0_ops_[i]; }
GetEmit32(size_t,size_t emit)185   static inline uint64_t GetEmit32(size_t, size_t emit) {
186     return table32_0_emit_[emit];
187   }
GetOp33(size_t i)188   static inline uint64_t GetOp33(size_t i) {
189     return table33_ops_[i >> 6][i & 0x3f];
190   }
GetEmit33(size_t i,size_t emit)191   static inline uint64_t GetEmit33(size_t i, size_t emit) {
192     return table33_emit_[i >> 6][emit];
193   }
GetOp34(size_t i)194   static inline uint64_t GetOp34(size_t i) {
195     return table34_ops_[i >> 6][i & 0x3f];
196   }
GetEmit34(size_t i,size_t emit)197   static inline uint64_t GetEmit34(size_t i, size_t emit) {
198     return table34_emit_[i >> 6][emit];
199   }
GetOp35(size_t i)200   static inline uint64_t GetOp35(size_t i) {
201     return table35_ops_[i >> 6][i & 0x3f];
202   }
GetEmit35(size_t i,size_t emit)203   static inline uint64_t GetEmit35(size_t i, size_t emit) {
204     return table35_emit_[i >> 6][emit];
205   }
GetOp28(size_t i)206   static inline uint64_t GetOp28(size_t i) {
207     return table28_ops_[i >> 7][i & 0x7f];
208   }
GetEmit28(size_t i,size_t emit)209   static inline uint64_t GetEmit28(size_t i, size_t emit) {
210     return table28_emit_[i >> 7][emit];
211   }
212 
213  private:
214   static const uint8_t table2_0_emit_[10];
215   static const uint8_t table2_0_ops_[32];
216   static const uint8_t table3_0_emit_[36];
217   static const uint8_t table3_0_ops_[64];
218   static const uint8_t table4_0_emit_[22];
219   static const uint8_t table4_0_ops_[64];
220   static const uint8_t table4_1_emit_[46];
221   static const uint8_t table4_1_ops_[64];
222   static const uint8_t* const table4_emit_[2];
223   static const uint8_t* const table4_ops_[2];
224   static const uint8_t table5_0_ops_[128];
225   static const uint8_t table5_1_emit_[52];
226   static const uint8_t table5_1_ops_[128];
227   static const uint8_t* const table5_emit_[2];
228   static const uint8_t* const table5_ops_[2];
229   static const uint8_t table6_0_emit_[2];
230   static const uint8_t table6_0_ops_[32];
231   static const uint8_t table6_1_emit_[2];
232   static const uint8_t table6_2_emit_[2];
233   static const uint8_t table6_3_emit_[2];
234   static const uint8_t table6_4_emit_[2];
235   static const uint8_t table6_5_emit_[4];
236   static const uint8_t table6_5_ops_[32];
237   static const uint8_t table6_6_emit_[4];
238   static const uint8_t table6_7_emit_[4];
239   static const uint8_t table6_8_emit_[4];
240   static const uint8_t table6_9_emit_[4];
241   static const uint8_t table6_10_emit_[4];
242   static const uint8_t table6_11_emit_[6];
243   static const uint8_t table6_11_ops_[32];
244   static const uint8_t table6_12_emit_[8];
245   static const uint8_t table6_12_ops_[32];
246   static const uint8_t table6_13_emit_[8];
247   static const uint8_t table6_14_emit_[8];
248   static const uint8_t table6_15_emit_[10];
249   static const uint8_t table6_15_ops_[32];
250   static const uint8_t* const table6_emit_[16];
251   static const uint8_t* const table6_ops_[16];
252   static const uint8_t table7_0_emit_[36];
253   static const uint8_t table7_0_ops_[64];
254   static const uint8_t table7_1_emit_[36];
255   static const uint8_t table7_1_ops_[64];
256   static const uint8_t table7_2_emit_[36];
257   static const uint8_t table7_2_ops_[64];
258   static const uint8_t table7_3_emit_[36];
259   static const uint8_t table7_3_ops_[64];
260   static const uint8_t table7_4_emit_[38];
261   static const uint8_t table7_4_ops_[64];
262   static const uint8_t table7_5_ops_[64];
263   static const uint8_t table7_11_ops_[64];
264   static const uint8_t table7_12_ops_[64];
265   static const uint8_t table7_15_emit_[15];
266   static const uint8_t table7_15_ops_[64];
267   static const uint8_t* const table7_emit_[16];
268   static const uint8_t* const table7_ops_[16];
269   static const uint8_t table8_0_emit_[71];
270   static const uint16_t table8_0_inner_[38];
271   static const uint8_t table8_0_outer_[64];
272   static const uint8_t table8_1_emit_[71];
273   static const uint16_t table8_1_inner_[38];
274   static const uint8_t table8_2_emit_[71];
275   static const uint16_t table8_2_inner_[38];
276   static const uint8_t table8_3_emit_[71];
277   static const uint16_t table8_3_inner_[38];
278   static const uint8_t table8_4_emit_[71];
279   static const uint16_t table8_4_inner_[38];
280   static const uint8_t table8_5_emit_[71];
281   static const uint16_t table8_5_inner_[38];
282   static const uint8_t table8_6_emit_[71];
283   static const uint16_t table8_6_inner_[38];
284   static const uint8_t table8_7_emit_[71];
285   static const uint16_t table8_7_inner_[38];
286   static const uint8_t table8_8_emit_[71];
287   static const uint16_t table8_8_inner_[38];
288   static const uint8_t table8_9_emit_[71];
289   static const uint16_t table8_9_inner_[38];
290   static const uint8_t table8_10_emit_[40];
291   static const uint16_t table8_10_inner_[23];
292   static const uint8_t table8_10_outer_[64];
293   static const uint8_t table8_11_emit_[40];
294   static const uint8_t table8_12_emit_[40];
295   static const uint8_t table8_13_emit_[40];
296   static const uint8_t table8_14_emit_[40];
297   static const uint8_t table8_15_emit_[40];
298   static const uint8_t table8_16_emit_[40];
299   static const uint8_t table8_17_emit_[40];
300   static const uint8_t table8_18_emit_[40];
301   static const uint8_t table8_19_emit_[40];
302   static const uint8_t table8_20_emit_[40];
303   static const uint8_t table8_21_emit_[40];
304   static const uint8_t table8_22_emit_[40];
305   static const uint8_t table8_23_emit_[4];
306   static const uint16_t table8_23_inner_[5];
307   static const uint8_t table8_23_outer_[64];
308   static const uint8_t table8_24_emit_[4];
309   static const uint8_t table8_25_emit_[4];
310   static const uint8_t table8_26_emit_[4];
311   static const uint8_t table8_27_emit_[4];
312   static const uint8_t table8_28_emit_[4];
313   static const uint8_t table8_29_emit_[4];
314   static const uint8_t table8_30_emit_[4];
315   static const uint8_t table8_31_emit_[14];
316   static const uint16_t table8_31_inner_[16];
317   static const uint8_t table8_31_outer_[64];
318   static const uint8_t* const table8_emit_[32];
319   static const uint16_t* const table8_inner_[32];
320   static const uint8_t* const table8_outer_[32];
321   static const uint8_t table1_0_emit_[135];
322   static const uint16_t table1_0_inner_[69];
323   static const uint8_t table1_0_outer_[128];
324   static const uint8_t table1_1_emit_[135];
325   static const uint16_t table1_1_inner_[69];
326   static const uint8_t table1_2_emit_[135];
327   static const uint16_t table1_2_inner_[69];
328   static const uint8_t table1_3_emit_[135];
329   static const uint16_t table1_3_inner_[69];
330   static const uint8_t table1_4_emit_[135];
331   static const uint16_t table1_4_inner_[69];
332   static const uint8_t table1_5_emit_[135];
333   static const uint16_t table1_5_inner_[69];
334   static const uint8_t table1_6_emit_[135];
335   static const uint16_t table1_6_inner_[69];
336   static const uint8_t table1_7_emit_[135];
337   static const uint16_t table1_7_inner_[69];
338   static const uint8_t table1_8_emit_[135];
339   static const uint16_t table1_8_inner_[69];
340   static const uint8_t table1_9_emit_[135];
341   static const uint16_t table1_9_inner_[69];
342   static const uint8_t table1_10_emit_[140];
343   static const uint16_t table1_10_inner_[74];
344   static const uint8_t table1_10_outer_[128];
345   static const uint8_t table1_11_emit_[140];
346   static const uint16_t table1_11_inner_[74];
347   static const uint8_t table1_12_emit_[140];
348   static const uint16_t table1_12_inner_[74];
349   static const uint8_t table1_13_emit_[140];
350   static const uint16_t table1_13_inner_[74];
351   static const uint8_t table1_14_emit_[140];
352   static const uint16_t table1_14_inner_[74];
353   static const uint8_t table1_15_emit_[140];
354   static const uint16_t table1_15_inner_[74];
355   static const uint8_t table1_16_emit_[140];
356   static const uint16_t table1_16_inner_[74];
357   static const uint8_t table1_17_emit_[140];
358   static const uint16_t table1_17_inner_[74];
359   static const uint8_t table1_18_emit_[140];
360   static const uint16_t table1_18_inner_[74];
361   static const uint8_t table1_19_emit_[140];
362   static const uint16_t table1_19_inner_[74];
363   static const uint8_t table1_20_emit_[140];
364   static const uint16_t table1_20_inner_[74];
365   static const uint8_t table1_21_emit_[140];
366   static const uint16_t table1_21_inner_[74];
367   static const uint8_t table1_22_emit_[142];
368   static const uint16_t table1_22_inner_[74];
369   static const uint8_t table1_23_emit_[80];
370   static const uint16_t table1_23_inner_[44];
371   static const uint8_t table1_23_outer_[128];
372   static const uint8_t table1_24_emit_[80];
373   static const uint8_t table1_25_emit_[80];
374   static const uint8_t table1_26_emit_[80];
375   static const uint8_t table1_27_emit_[80];
376   static const uint8_t table1_28_emit_[80];
377   static const uint8_t table1_29_emit_[80];
378   static const uint8_t table1_30_emit_[80];
379   static const uint8_t table1_31_emit_[16];
380   static const uint16_t table1_31_inner_[20];
381   static const uint8_t table1_31_outer_[128];
382   static const uint8_t* const table1_emit_[32];
383   static const uint16_t* const table1_inner_[32];
384   static const uint8_t* const table1_outer_[32];
385   static const uint8_t table14_0_emit_[5];
386   static const uint8_t table14_0_inner_[7];
387   static const uint8_t table14_0_outer_[8];
388   static const uint8_t table15_0_outer_[16];
389   static const uint8_t table16_0_ops_[32];
390   static const uint16_t table12_0_inner_[13];
391   static const uint8_t table12_0_outer_[64];
392   static const uint8_t table19_0_emit_[8];
393   static const uint8_t table19_0_inner_[8];
394   static const uint8_t table22_0_emit_[15];
395   static const uint8_t table22_0_inner_[15];
396   static const uint8_t table24_0_emit_[6];
397   static const uint8_t table24_0_inner_[6];
398   static const uint8_t table27_0_emit_[12];
399   static const uint8_t table27_0_inner_[13];
400   static const uint8_t table26_0_emit_[20];
401   static const uint8_t table26_0_ops_[32];
402   static const uint8_t table29_0_emit_[21];
403   static const uint8_t table29_0_ops_[32];
404   static const uint8_t table30_0_emit_[33];
405   static const uint8_t table30_0_ops_[64];
406   static const uint8_t table31_0_emit_[37];
407   static const uint8_t table31_0_ops_[128];
408   static const uint8_t table32_0_emit_[52];
409   static const uint8_t table32_0_ops_[256];
410   static const uint8_t table33_0_emit_[4];
411   static const uint8_t table33_0_ops_[64];
412   static const uint8_t table33_1_emit_[4];
413   static const uint8_t table33_2_emit_[4];
414   static const uint8_t table33_3_emit_[4];
415   static const uint8_t table33_4_emit_[4];
416   static const uint8_t table33_5_emit_[7];
417   static const uint8_t table33_5_ops_[64];
418   static const uint8_t table33_6_emit_[10];
419   static const uint8_t table33_6_ops_[64];
420   static const uint8_t table33_7_emit_[34];
421   static const uint8_t table33_7_ops_[64];
422   static const uint8_t* const table33_emit_[8];
423   static const uint8_t* const table33_ops_[8];
424   static const uint8_t table34_0_emit_[40];
425   static const uint8_t table34_0_ops_[64];
426   static const uint8_t table34_1_emit_[40];
427   static const uint8_t table34_2_emit_[40];
428   static const uint8_t table34_3_emit_[40];
429   static const uint8_t table34_4_emit_[40];
430   static const uint8_t table34_5_emit_[40];
431   static const uint8_t table34_6_emit_[40];
432   static const uint8_t table34_7_emit_[40];
433   static const uint8_t table34_8_emit_[40];
434   static const uint8_t table34_9_emit_[40];
435   static const uint8_t table34_10_emit_[22];
436   static const uint8_t table34_10_ops_[64];
437   static const uint8_t table34_11_emit_[4];
438   static const uint8_t table34_12_emit_[4];
439   static const uint8_t table34_13_emit_[6];
440   static const uint8_t table34_14_emit_[17];
441   static const uint8_t table34_14_ops_[64];
442   static const uint8_t table34_15_emit_[46];
443   static const uint8_t table34_15_ops_[64];
444   static const uint8_t* const table34_emit_[16];
445   static const uint8_t* const table34_ops_[16];
446   static const uint8_t table35_0_emit_[72];
447   static const uint16_t table35_0_ops_[64];
448   static const uint8_t table35_1_emit_[72];
449   static const uint8_t table35_2_emit_[72];
450   static const uint8_t table35_3_emit_[72];
451   static const uint8_t table35_4_emit_[72];
452   static const uint8_t table35_5_emit_[72];
453   static const uint8_t table35_6_emit_[72];
454   static const uint8_t table35_7_emit_[72];
455   static const uint8_t table35_8_emit_[72];
456   static const uint8_t table35_9_emit_[72];
457   static const uint8_t table35_10_emit_[72];
458   static const uint8_t table35_11_emit_[72];
459   static const uint8_t table35_12_emit_[72];
460   static const uint8_t table35_13_emit_[72];
461   static const uint8_t table35_14_emit_[72];
462   static const uint8_t table35_15_emit_[72];
463   static const uint8_t table35_16_emit_[72];
464   static const uint8_t table35_17_emit_[72];
465   static const uint8_t table35_18_emit_[72];
466   static const uint8_t table35_19_emit_[72];
467   static const uint8_t table35_20_emit_[72];
468   static const uint8_t table35_21_emit_[40];
469   static const uint16_t table35_21_ops_[64];
470   static const uint8_t table35_22_emit_[40];
471   static const uint8_t table35_23_emit_[40];
472   static const uint8_t table35_24_emit_[40];
473   static const uint8_t table35_25_emit_[40];
474   static const uint8_t table35_26_emit_[40];
475   static const uint8_t table35_27_emit_[4];
476   static const uint16_t table35_27_ops_[64];
477   static const uint8_t table35_28_emit_[8];
478   static const uint16_t table35_28_ops_[64];
479   static const uint8_t table35_29_emit_[9];
480   static const uint16_t table35_29_ops_[64];
481   static const uint8_t table35_30_emit_[16];
482   static const uint16_t table35_30_ops_[64];
483   static const uint8_t table35_31_emit_[30];
484   static const uint16_t table35_31_ops_[64];
485   static const uint8_t* const table35_emit_[32];
486   static const uint16_t* const table35_ops_[32];
487   static const uint8_t table28_0_emit_[1];
488   static const uint16_t table28_0_ops_[128];
489   static const uint8_t table28_1_emit_[1];
490   static const uint8_t table28_2_emit_[1];
491   static const uint8_t table28_3_emit_[1];
492   static const uint8_t table28_4_emit_[1];
493   static const uint8_t table28_5_emit_[1];
494   static const uint8_t table28_6_emit_[1];
495   static const uint8_t table28_7_emit_[1];
496   static const uint8_t table28_8_emit_[1];
497   static const uint8_t table28_9_emit_[1];
498   static const uint8_t table28_10_emit_[1];
499   static const uint8_t table28_11_emit_[1];
500   static const uint8_t table28_12_emit_[1];
501   static const uint8_t table28_13_emit_[1];
502   static const uint8_t table28_14_emit_[1];
503   static const uint8_t table28_15_emit_[1];
504   static const uint8_t table28_16_emit_[1];
505   static const uint8_t table28_17_emit_[1];
506   static const uint8_t table28_18_emit_[1];
507   static const uint8_t table28_19_emit_[1];
508   static const uint8_t table28_20_emit_[1];
509   static const uint8_t table28_21_emit_[2];
510   static const uint16_t table28_21_ops_[128];
511   static const uint8_t table28_22_emit_[2];
512   static const uint8_t table28_23_emit_[2];
513   static const uint8_t table28_24_emit_[2];
514   static const uint8_t table28_25_emit_[2];
515   static const uint8_t table28_26_emit_[2];
516   static const uint16_t table28_27_ops_[128];
517   static const uint16_t table28_28_ops_[128];
518   static const uint16_t table28_29_ops_[128];
519   static const uint16_t table28_30_ops_[128];
520   static const uint8_t table28_31_emit_[33];
521   static const uint16_t table28_31_ops_[128];
522   static const uint8_t* const table28_emit_[32];
523   static const uint16_t* const table28_ops_[32];
524 };
525 template <typename F>
526 class HuffDecoder : public HuffDecoderCommon {
527  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)528   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
529       : sink_(sink), begin_(begin), end_(end) {}
Run()530   bool Run() {
531     while (!done_) {
532       if (!RefillTo12()) {
533         Done0();
534         break;
535       }
536       const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff;
537       const auto op = GetOp1(index);
538       const int consumed = op & 15;
539       buffer_len_ -= consumed;
540       const auto emit_ofs = op >> 7;
541       switch ((op >> 4) & 7) {
542         case 0: {
543           sink_(GetEmit1(index, emit_ofs + 0));
544           sink_(GetEmit1(index, emit_ofs + 1));
545           break;
546         }
547         case 1: {
548           sink_(GetEmit1(index, emit_ofs + 0));
549           break;
550         }
551         case 2: {
552           DecodeStep0();
553           break;
554         }
555         case 3: {
556           DecodeStep1();
557           break;
558         }
559         case 4: {
560           DecodeStep2();
561           break;
562         }
563         case 5: {
564           DecodeStep3();
565           break;
566         }
567       }
568     }
569     return ok_;
570   }
571 
572  private:
RefillTo12()573   bool RefillTo12() {
574     switch (buffer_len_) {
575       case 0: {
576         return Read2to8Bytes();
577       }
578       case 1:
579       case 2:
580       case 3: {
581         return Read2to7Bytes();
582       }
583       case 4:
584       case 5:
585       case 6:
586       case 7:
587       case 8: {
588         return Read1to7Bytes();
589       }
590       case 9:
591       case 10:
592       case 11: {
593         return Read1to6Bytes();
594       }
595     }
596     return true;
597   }
Read2to8Bytes()598   bool Read2to8Bytes() {
599     switch (end_ - begin_) {
600       case 0:
601       case 1: {
602         return false;
603       }
604       case 2: {
605         Fill2();
606         return true;
607       }
608       case 3: {
609         Fill3();
610         return true;
611       }
612       case 4: {
613         Fill4();
614         return true;
615       }
616       case 5: {
617         Fill5();
618         return true;
619       }
620       case 6: {
621         Fill6();
622         return true;
623       }
624       case 7: {
625         Fill7();
626         return true;
627       }
628       default: {
629         Fill8();
630         return true;
631       }
632     }
633   }
Fill2()634   void Fill2() {
635     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
636               (static_cast<uint64_t>(begin_[1]) << 0);
637     begin_ += 2;
638     buffer_len_ += 16;
639   }
Fill3()640   void Fill3() {
641     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
642               (static_cast<uint64_t>(begin_[1]) << 8) |
643               (static_cast<uint64_t>(begin_[2]) << 0);
644     begin_ += 3;
645     buffer_len_ += 24;
646   }
Fill4()647   void Fill4() {
648     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
649               (static_cast<uint64_t>(begin_[1]) << 16) |
650               (static_cast<uint64_t>(begin_[2]) << 8) |
651               (static_cast<uint64_t>(begin_[3]) << 0);
652     begin_ += 4;
653     buffer_len_ += 32;
654   }
Fill5()655   void Fill5() {
656     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
657               (static_cast<uint64_t>(begin_[1]) << 24) |
658               (static_cast<uint64_t>(begin_[2]) << 16) |
659               (static_cast<uint64_t>(begin_[3]) << 8) |
660               (static_cast<uint64_t>(begin_[4]) << 0);
661     begin_ += 5;
662     buffer_len_ += 40;
663   }
Fill6()664   void Fill6() {
665     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
666               (static_cast<uint64_t>(begin_[1]) << 32) |
667               (static_cast<uint64_t>(begin_[2]) << 24) |
668               (static_cast<uint64_t>(begin_[3]) << 16) |
669               (static_cast<uint64_t>(begin_[4]) << 8) |
670               (static_cast<uint64_t>(begin_[5]) << 0);
671     begin_ += 6;
672     buffer_len_ += 48;
673   }
Fill7()674   void Fill7() {
675     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
676               (static_cast<uint64_t>(begin_[1]) << 40) |
677               (static_cast<uint64_t>(begin_[2]) << 32) |
678               (static_cast<uint64_t>(begin_[3]) << 24) |
679               (static_cast<uint64_t>(begin_[4]) << 16) |
680               (static_cast<uint64_t>(begin_[5]) << 8) |
681               (static_cast<uint64_t>(begin_[6]) << 0);
682     begin_ += 7;
683     buffer_len_ += 56;
684   }
Fill8()685   void Fill8() {
686     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
687               (static_cast<uint64_t>(begin_[1]) << 48) |
688               (static_cast<uint64_t>(begin_[2]) << 40) |
689               (static_cast<uint64_t>(begin_[3]) << 32) |
690               (static_cast<uint64_t>(begin_[4]) << 24) |
691               (static_cast<uint64_t>(begin_[5]) << 16) |
692               (static_cast<uint64_t>(begin_[6]) << 8) |
693               (static_cast<uint64_t>(begin_[7]) << 0);
694     begin_ += 8;
695     buffer_len_ += 64;
696   }
Read2to7Bytes()697   bool Read2to7Bytes() {
698     switch (end_ - begin_) {
699       case 0:
700       case 1: {
701         return false;
702       }
703       case 2: {
704         Fill2();
705         return true;
706       }
707       case 3: {
708         Fill3();
709         return true;
710       }
711       case 4: {
712         Fill4();
713         return true;
714       }
715       case 5: {
716         Fill5();
717         return true;
718       }
719       case 6: {
720         Fill6();
721         return true;
722       }
723       default: {
724         Fill7();
725         return true;
726       }
727     }
728   }
Read1to7Bytes()729   bool Read1to7Bytes() {
730     switch (end_ - begin_) {
731       case 0: {
732         return false;
733       }
734       case 1: {
735         Fill1();
736         return true;
737       }
738       case 2: {
739         Fill2();
740         return true;
741       }
742       case 3: {
743         Fill3();
744         return true;
745       }
746       case 4: {
747         Fill4();
748         return true;
749       }
750       case 5: {
751         Fill5();
752         return true;
753       }
754       case 6: {
755         Fill6();
756         return true;
757       }
758       default: {
759         Fill7();
760         return true;
761       }
762     }
763   }
Fill1()764   void Fill1() {
765     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
766     begin_ += 1;
767     buffer_len_ += 8;
768   }
Read1to6Bytes()769   bool Read1to6Bytes() {
770     switch (end_ - begin_) {
771       case 0: {
772         return false;
773       }
774       case 1: {
775         Fill1();
776         return true;
777       }
778       case 2: {
779         Fill2();
780         return true;
781       }
782       case 3: {
783         Fill3();
784         return true;
785       }
786       case 4: {
787         Fill4();
788         return true;
789       }
790       case 5: {
791         Fill5();
792         return true;
793       }
794       default: {
795         Fill6();
796         return true;
797       }
798     }
799   }
Done0()800   void Done0() {
801     done_ = true;
802     switch (end_ - begin_) {
803       case 1: {
804         Fill1();
805         break;
806       }
807     }
808     switch (buffer_len_) {
809       case 1:
810       case 2:
811       case 3:
812       case 4: {
813         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
814         return;
815       }
816       case 5: {
817         const auto index = buffer_ & 31;
818         const auto op = GetOp2(index);
819         switch (op & 3) {
820           case 0: {
821             sink_(GetEmit2(index, (op >> 2) + 0));
822             break;
823           }
824           case 1: {
825             ok_ = false;
826             break;
827           }
828         }
829         return;
830       }
831       case 6: {
832         const auto index = buffer_ & 63;
833         const auto op = GetOp3(index);
834         switch (op & 3) {
835           case 0: {
836             ok_ = false;
837             break;
838           }
839           case 1: {
840             sink_(GetEmit3(index, (op >> 2) + 0));
841             break;
842           }
843         }
844         return;
845       }
846       case 7: {
847         const auto index = buffer_ & 127;
848         const auto op = GetOp4(index);
849         switch (op & 3) {
850           case 0: {
851             ok_ = false;
852             break;
853           }
854           case 1: {
855             sink_(GetEmit4(index, (op >> 2) + 0));
856             break;
857           }
858         }
859         return;
860       }
861       case 8: {
862         const auto index = buffer_ & 255;
863         const auto op = GetOp5(index);
864         switch (op & 3) {
865           case 0: {
866             ok_ = false;
867             break;
868           }
869           case 1: {
870             sink_(GetEmit5(index, (op >> 2) + 0));
871             break;
872           }
873         }
874         return;
875       }
876       case 9: {
877         const auto index = buffer_ & 511;
878         const auto op = GetOp6(index);
879         switch (op & 3) {
880           case 0: {
881             ok_ = false;
882             break;
883           }
884           case 1: {
885             sink_(GetEmit6(index, (op >> 2) + 0));
886             break;
887           }
888         }
889         return;
890       }
891       case 10: {
892         const auto index = buffer_ & 1023;
893         const auto op = GetOp7(index);
894         switch (op & 3) {
895           case 0: {
896             sink_(GetEmit7(index, (op >> 2) + 0));
897             sink_(GetEmit7(index, (op >> 2) + 1));
898             break;
899           }
900           case 1: {
901             ok_ = false;
902             break;
903           }
904           case 2: {
905             sink_(GetEmit7(index, (op >> 2) + 0));
906             break;
907           }
908         }
909         return;
910       }
911       case 11: {
912         const auto index = buffer_ & 2047;
913         const auto op = GetOp8(index);
914         switch (op & 3) {
915           case 0: {
916             ok_ = false;
917             break;
918           }
919           case 1: {
920             sink_(GetEmit8(index, (op >> 2) + 0));
921             sink_(GetEmit8(index, (op >> 2) + 1));
922             break;
923           }
924           case 2: {
925             sink_(GetEmit8(index, (op >> 2) + 0));
926             break;
927           }
928         }
929         return;
930       }
931       case 0: {
932         return;
933       }
934     }
935   }
DecodeStep0()936   void DecodeStep0() {
937     if (!RefillTo1()) {
938       Done1();
939       return;
940     }
941     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
942     const auto op = GetOp9(index);
943     const int consumed = op & 1;
944     buffer_len_ -= consumed;
945     const auto emit_ofs = op >> 1;
946     sink_(GetEmit9(index, emit_ofs + 0));
947   }
RefillTo1()948   bool RefillTo1() {
949     switch (buffer_len_) {
950       case 0: {
951         return Read1to8Bytes();
952       }
953     }
954     return true;
955   }
Read1to8Bytes()956   bool Read1to8Bytes() {
957     switch (end_ - begin_) {
958       case 0: {
959         return false;
960       }
961       case 1: {
962         Fill1();
963         return true;
964       }
965       case 2: {
966         Fill2();
967         return true;
968       }
969       case 3: {
970         Fill3();
971         return true;
972       }
973       case 4: {
974         Fill4();
975         return true;
976       }
977       case 5: {
978         Fill5();
979         return true;
980       }
981       case 6: {
982         Fill6();
983         return true;
984       }
985       case 7: {
986         Fill7();
987         return true;
988       }
989       default: {
990         Fill8();
991         return true;
992       }
993     }
994   }
Done1()995   void Done1() {
996     done_ = true;
997     ok_ = false;
998   }
DecodeStep1()999   void DecodeStep1() {
1000     if (!RefillTo1()) {
1001       Done2();
1002       return;
1003     }
1004     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1005     const auto op = GetOp10(index);
1006     const int consumed = op & 1;
1007     buffer_len_ -= consumed;
1008     const auto emit_ofs = op >> 1;
1009     sink_(GetEmit10(index, emit_ofs + 0));
1010   }
Done2()1011   void Done2() {
1012     done_ = true;
1013     ok_ = false;
1014   }
DecodeStep2()1015   void DecodeStep2() {
1016     if (!RefillTo1()) {
1017       Done3();
1018       return;
1019     }
1020     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1021     const auto op = GetOp11(index);
1022     const int consumed = op & 1;
1023     buffer_len_ -= consumed;
1024     const auto emit_ofs = op >> 1;
1025     sink_(GetEmit11(index, emit_ofs + 0));
1026   }
Done3()1027   void Done3() {
1028     done_ = true;
1029     ok_ = false;
1030   }
DecodeStep3()1031   void DecodeStep3() {
1032     if (!RefillTo6()) {
1033       Done4();
1034       return;
1035     }
1036     const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f;
1037     const auto op = GetOp12(index);
1038     const int consumed = op & 7;
1039     buffer_len_ -= consumed;
1040     const auto emit_ofs = op >> 7;
1041     switch ((op >> 3) & 15) {
1042       case 0: {
1043         sink_(GetEmit12(index, emit_ofs + 0));
1044         break;
1045       }
1046       case 1: {
1047         DecodeStep4();
1048         break;
1049       }
1050       case 2: {
1051         DecodeStep7();
1052         break;
1053       }
1054       case 3: {
1055         DecodeStep5();
1056         break;
1057       }
1058       case 4: {
1059         DecodeStep9();
1060         break;
1061       }
1062       case 5: {
1063         DecodeStep6();
1064         break;
1065       }
1066       case 6: {
1067         DecodeStep8();
1068         break;
1069       }
1070       case 7: {
1071         DecodeStep10();
1072         break;
1073       }
1074       case 8: {
1075         DecodeStep11();
1076         break;
1077       }
1078     }
1079   }
RefillTo6()1080   bool RefillTo6() {
1081     switch (buffer_len_) {
1082       case 0: {
1083         return Read1to8Bytes();
1084       }
1085       case 1:
1086       case 2:
1087       case 3:
1088       case 4:
1089       case 5: {
1090         return Read1to7Bytes();
1091       }
1092     }
1093     return true;
1094   }
Done4()1095   void Done4() {
1096     done_ = true;
1097     switch (buffer_len_) {
1098       case 1: {
1099         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1100         return;
1101       }
1102       case 2: {
1103         const auto index = buffer_ & 3;
1104         const auto op = GetOp13(index);
1105         switch (op & 3) {
1106           case 0: {
1107             sink_(GetEmit13(index, (op >> 2) + 0));
1108             break;
1109           }
1110           case 1: {
1111             ok_ = false;
1112             break;
1113           }
1114         }
1115         return;
1116       }
1117       case 3: {
1118         const auto index = buffer_ & 7;
1119         const auto op = GetOp14(index);
1120         switch (op & 3) {
1121           case 0: {
1122             ok_ = false;
1123             break;
1124           }
1125           case 1: {
1126             sink_(GetEmit14(index, (op >> 2) + 0));
1127             break;
1128           }
1129         }
1130         return;
1131       }
1132       case 4: {
1133         const auto index = buffer_ & 15;
1134         const auto op = GetOp15(index);
1135         switch (op & 3) {
1136           case 0: {
1137             ok_ = false;
1138             break;
1139           }
1140           case 1: {
1141             sink_(GetEmit15(index, (op >> 2) + 0));
1142             break;
1143           }
1144         }
1145         return;
1146       }
1147       case 5: {
1148         const auto index = buffer_ & 31;
1149         const auto op = GetOp16(index);
1150         switch (op & 3) {
1151           case 0: {
1152             ok_ = false;
1153             break;
1154           }
1155           case 1: {
1156             sink_(GetEmit16(index, (op >> 2) + 0));
1157             break;
1158           }
1159         }
1160         return;
1161       }
1162       case 0: {
1163         return;
1164       }
1165     }
1166   }
DecodeStep4()1167   void DecodeStep4() {
1168     if (!RefillTo1()) {
1169       Done5();
1170       return;
1171     }
1172     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1173     const auto op = GetOp17(index);
1174     const int consumed = op & 1;
1175     buffer_len_ -= consumed;
1176     const auto emit_ofs = op >> 1;
1177     sink_(GetEmit17(index, emit_ofs + 0));
1178   }
Done5()1179   void Done5() {
1180     done_ = true;
1181     ok_ = false;
1182   }
DecodeStep5()1183   void DecodeStep5() {
1184     if (!RefillTo2()) {
1185       Done6();
1186       return;
1187     }
1188     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1189     const auto op = GetOp18(index);
1190     const int consumed = op & 3;
1191     buffer_len_ -= consumed;
1192     const auto emit_ofs = op >> 2;
1193     sink_(GetEmit18(index, emit_ofs + 0));
1194   }
RefillTo2()1195   bool RefillTo2() {
1196     switch (buffer_len_) {
1197       case 0: {
1198         return Read1to8Bytes();
1199       }
1200       case 1: {
1201         return Read1to7Bytes();
1202       }
1203     }
1204     return true;
1205   }
Done6()1206   void Done6() {
1207     done_ = true;
1208     switch (buffer_len_) {
1209       case 1:
1210       case 0: {
1211         ok_ = false;
1212         return;
1213       }
1214     }
1215   }
DecodeStep6()1216   void DecodeStep6() {
1217     if (!RefillTo3()) {
1218       Done7();
1219       return;
1220     }
1221     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1222     const auto op = GetOp19(index);
1223     const int consumed = op & 3;
1224     buffer_len_ -= consumed;
1225     const auto emit_ofs = op >> 2;
1226     sink_(GetEmit19(index, emit_ofs + 0));
1227   }
RefillTo3()1228   bool RefillTo3() {
1229     switch (buffer_len_) {
1230       case 0: {
1231         return Read1to8Bytes();
1232       }
1233       case 1:
1234       case 2: {
1235         return Read1to7Bytes();
1236       }
1237     }
1238     return true;
1239   }
Done7()1240   void Done7() {
1241     done_ = true;
1242     switch (buffer_len_) {
1243       case 1:
1244       case 2:
1245       case 0: {
1246         ok_ = false;
1247         return;
1248       }
1249     }
1250   }
DecodeStep7()1251   void DecodeStep7() {
1252     if (!RefillTo2()) {
1253       Done8();
1254       return;
1255     }
1256     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1257     const auto op = GetOp20(index);
1258     const int consumed = op & 3;
1259     buffer_len_ -= consumed;
1260     const auto emit_ofs = op >> 2;
1261     sink_(GetEmit20(index, emit_ofs + 0));
1262   }
Done8()1263   void Done8() {
1264     done_ = true;
1265     switch (buffer_len_) {
1266       case 1: {
1267         const auto index = buffer_ & 1;
1268         const auto op = GetOp21(index);
1269         switch (op & 1) {
1270           case 0: {
1271             sink_(GetEmit21(index, (op >> 1) + 0));
1272             break;
1273           }
1274           case 1: {
1275             ok_ = false;
1276             break;
1277           }
1278         }
1279         return;
1280       }
1281       case 0: {
1282         ok_ = false;
1283         return;
1284       }
1285     }
1286   }
DecodeStep8()1287   void DecodeStep8() {
1288     if (!RefillTo4()) {
1289       Done9();
1290       return;
1291     }
1292     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1293     const auto op = GetOp22(index);
1294     const int consumed = op & 7;
1295     buffer_len_ -= consumed;
1296     const auto emit_ofs = op >> 3;
1297     sink_(GetEmit22(index, emit_ofs + 0));
1298   }
RefillTo4()1299   bool RefillTo4() {
1300     switch (buffer_len_) {
1301       case 0: {
1302         return Read1to8Bytes();
1303       }
1304       case 1:
1305       case 2:
1306       case 3: {
1307         return Read1to7Bytes();
1308       }
1309     }
1310     return true;
1311   }
Done9()1312   void Done9() {
1313     done_ = true;
1314     switch (buffer_len_) {
1315       case 1:
1316       case 2:
1317       case 0: {
1318         ok_ = false;
1319         return;
1320       }
1321       case 3: {
1322         const auto index = buffer_ & 7;
1323         const auto op = GetOp23(index);
1324         switch (op & 1) {
1325           case 0: {
1326             sink_(GetEmit23(index, (op >> 1) + 0));
1327             break;
1328           }
1329           case 1: {
1330             ok_ = false;
1331             break;
1332           }
1333         }
1334         return;
1335       }
1336     }
1337   }
DecodeStep9()1338   void DecodeStep9() {
1339     if (!RefillTo3()) {
1340       Done10();
1341       return;
1342     }
1343     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1344     const auto op = GetOp24(index);
1345     const int consumed = op & 3;
1346     buffer_len_ -= consumed;
1347     const auto emit_ofs = op >> 2;
1348     sink_(GetEmit24(index, emit_ofs + 0));
1349   }
Done10()1350   void Done10() {
1351     done_ = true;
1352     switch (buffer_len_) {
1353       case 1:
1354       case 0: {
1355         ok_ = false;
1356         return;
1357       }
1358       case 2: {
1359         const auto index = buffer_ & 3;
1360         const auto op = GetOp25(index);
1361         switch (op & 1) {
1362           case 0: {
1363             sink_(GetEmit25(index, (op >> 1) + 0));
1364             break;
1365           }
1366           case 1: {
1367             ok_ = false;
1368             break;
1369           }
1370         }
1371         return;
1372       }
1373     }
1374   }
DecodeStep10()1375   void DecodeStep10() {
1376     if (!RefillTo5()) {
1377       Done11();
1378       return;
1379     }
1380     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1381     const auto op = GetOp26(index);
1382     const int consumed = op & 7;
1383     buffer_len_ -= consumed;
1384     const auto emit_ofs = op >> 3;
1385     sink_(GetEmit26(index, emit_ofs + 0));
1386   }
RefillTo5()1387   bool RefillTo5() {
1388     switch (buffer_len_) {
1389       case 0: {
1390         return Read1to8Bytes();
1391       }
1392       case 1:
1393       case 2:
1394       case 3:
1395       case 4: {
1396         return Read1to7Bytes();
1397       }
1398     }
1399     return true;
1400   }
Done11()1401   void Done11() {
1402     done_ = true;
1403     switch (buffer_len_) {
1404       case 1:
1405       case 2:
1406       case 3:
1407       case 0: {
1408         ok_ = false;
1409         return;
1410       }
1411       case 4: {
1412         const auto index = buffer_ & 15;
1413         const auto op = GetOp27(index);
1414         switch (op & 1) {
1415           case 0: {
1416             sink_(GetEmit27(index, (op >> 1) + 0));
1417             break;
1418           }
1419           case 1: {
1420             ok_ = false;
1421             break;
1422           }
1423         }
1424         return;
1425       }
1426     }
1427   }
DecodeStep11()1428   void DecodeStep11() {
1429     if (!RefillTo12()) {
1430       Done12();
1431       return;
1432     }
1433     const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff;
1434     const auto op = GetOp28(index);
1435     const int consumed = op & 15;
1436     buffer_len_ -= consumed;
1437     const auto emit_ofs = op >> 5;
1438     switch ((op >> 4) & 1) {
1439       case 0: {
1440         sink_(GetEmit28(index, emit_ofs + 0));
1441         break;
1442       }
1443       case 1: {
1444         begin_ = end_;
1445         buffer_len_ = 0;
1446         break;
1447       }
1448     }
1449   }
Done12()1450   void Done12() {
1451     done_ = true;
1452     switch (end_ - begin_) {
1453       case 1: {
1454         Fill1();
1455         break;
1456       }
1457     }
1458     switch (buffer_len_) {
1459       case 1:
1460       case 2:
1461       case 3:
1462       case 4: {
1463         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1464         return;
1465       }
1466       case 5: {
1467         const auto index = buffer_ & 31;
1468         const auto op = GetOp29(index);
1469         switch (op & 3) {
1470           case 0: {
1471             sink_(GetEmit29(index, (op >> 2) + 0));
1472             break;
1473           }
1474           case 1: {
1475             ok_ = false;
1476             break;
1477           }
1478         }
1479         return;
1480       }
1481       case 6: {
1482         const auto index = buffer_ & 63;
1483         const auto op = GetOp30(index);
1484         switch (op & 3) {
1485           case 0: {
1486             ok_ = false;
1487             break;
1488           }
1489           case 1: {
1490             sink_(GetEmit30(index, (op >> 2) + 0));
1491             break;
1492           }
1493         }
1494         return;
1495       }
1496       case 7: {
1497         const auto index = buffer_ & 127;
1498         const auto op = GetOp31(index);
1499         switch (op & 3) {
1500           case 0: {
1501             ok_ = false;
1502             break;
1503           }
1504           case 1: {
1505             sink_(GetEmit31(index, (op >> 2) + 0));
1506             break;
1507           }
1508         }
1509         return;
1510       }
1511       case 8: {
1512         const auto index = buffer_ & 255;
1513         const auto op = GetOp32(index);
1514         switch (op & 3) {
1515           case 0: {
1516             ok_ = false;
1517             break;
1518           }
1519           case 1: {
1520             sink_(GetEmit32(index, (op >> 2) + 0));
1521             break;
1522           }
1523         }
1524         return;
1525       }
1526       case 9: {
1527         const auto index = buffer_ & 511;
1528         const auto op = GetOp33(index);
1529         switch (op & 3) {
1530           case 0: {
1531             ok_ = false;
1532             break;
1533           }
1534           case 1: {
1535             sink_(GetEmit33(index, (op >> 2) + 0));
1536             break;
1537           }
1538         }
1539         return;
1540       }
1541       case 10: {
1542         const auto index = buffer_ & 1023;
1543         const auto op = GetOp34(index);
1544         switch (op & 3) {
1545           case 0: {
1546             sink_(GetEmit34(index, (op >> 2) + 0));
1547             sink_(GetEmit34(index, (op >> 2) + 1));
1548             break;
1549           }
1550           case 1: {
1551             ok_ = false;
1552             break;
1553           }
1554           case 2: {
1555             sink_(GetEmit34(index, (op >> 2) + 0));
1556             break;
1557           }
1558         }
1559         return;
1560       }
1561       case 11: {
1562         const auto index = buffer_ & 2047;
1563         const auto op = GetOp35(index);
1564         switch (op & 3) {
1565           case 0: {
1566             ok_ = false;
1567             break;
1568           }
1569           case 1: {
1570             sink_(GetEmit35(index, (op >> 2) + 0));
1571             sink_(GetEmit35(index, (op >> 2) + 1));
1572             break;
1573           }
1574           case 2: {
1575             sink_(GetEmit35(index, (op >> 2) + 0));
1576             break;
1577           }
1578         }
1579         return;
1580       }
1581       case 0: {
1582         return;
1583       }
1584     }
1585   }
1586   F sink_;
1587   const uint8_t* begin_;
1588   const uint8_t* const end_;
1589   uint64_t buffer_ = 0;
1590   int buffer_len_ = 0;
1591   bool ok_ = true;
1592   bool done_ = false;
1593 };
1594 }  // namespace geometry_12_6_12
1595 }  // namespace grpc_core
1596 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_6_12_H
1597