xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_11_13_6.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // This file is autogenerated: see
16 // tools/codegen/core/gen_huffman_decompressor.cc
17 
18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_13_6_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_13_6_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_11_13_6 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp1(size_t i)60   static inline uint64_t GetOp1(size_t i) {
61     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit1(size_t i,size_t emit)63   static inline uint64_t GetEmit1(size_t i, size_t emit) {
64     return table1_emit_[i >> 6][emit];
65   }
GetOp8(size_t i)66   static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return emit ? 62 : 35;
69   }
GetOp9(size_t i)70   static inline uint64_t GetOp9(size_t i) {
71     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
72   }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) {
74     return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64));
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) {
77     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
78   }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp12(size_t i)82   static inline uint64_t GetOp12(size_t i) {
83     return table12_0_inner_[table12_0_outer_[i]];
84   }
GetEmit12(size_t,size_t emit)85   static inline uint64_t GetEmit12(size_t, size_t emit) {
86     return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94));
87   }
GetOp13(size_t i)88   static inline uint64_t GetOp13(size_t i) {
89     return table13_0_inner_[table13_0_outer_[i]];
90   }
GetEmit13(size_t,size_t emit)91   static inline uint64_t GetEmit13(size_t, size_t emit) {
92     return table13_0_emit_[emit];
93   }
GetOp14(size_t i)94   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)95   static inline uint64_t GetEmit14(size_t, size_t emit) {
96     return table13_0_emit_[emit];
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)99   static inline uint64_t GetEmit15(size_t, size_t emit) {
100     return table13_0_emit_[emit];
101   }
GetOp16(size_t i)102   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)103   static inline uint64_t GetEmit16(size_t, size_t emit) {
104     return table16_0_emit_[emit];
105   }
GetOp17(size_t i)106   static inline uint64_t GetOp17(size_t i) {
107     return table17_ops_[i >> 6][i & 0x3f];
108   }
GetEmit17(size_t i,size_t emit)109   static inline uint64_t GetEmit17(size_t i, size_t emit) {
110     return table17_emit_[i >> 6][emit];
111   }
GetOp18(size_t i)112   static inline uint64_t GetOp18(size_t i) {
113     return table18_ops_[i >> 6][i & 0x3f];
114   }
GetEmit18(size_t i,size_t emit)115   static inline uint64_t GetEmit18(size_t i, size_t emit) {
116     return table18_emit_[i >> 6][emit];
117   }
GetOp19(size_t i)118   static inline uint64_t GetOp19(size_t i) {
119     return table19_ops_[i >> 6][i & 0x3f];
120   }
GetEmit19(size_t i,size_t emit)121   static inline uint64_t GetEmit19(size_t i, size_t emit) {
122     return table19_emit_[i >> 6][emit];
123   }
GetOp20(size_t i)124   static inline uint64_t GetOp20(size_t i) {
125     return table20_ops_[i >> 6][i & 0x3f];
126   }
GetEmit20(size_t i,size_t emit)127   static inline uint64_t GetEmit20(size_t i, size_t emit) {
128     return table20_emit_[i >> 6][emit];
129   }
GetOp21(size_t i)130   static inline uint64_t GetOp21(size_t i) {
131     return table21_ops_[i >> 6][i & 0x3f];
132   }
GetEmit21(size_t i,size_t emit)133   static inline uint64_t GetEmit21(size_t i, size_t emit) {
134     return table21_emit_[i >> 6][emit];
135   }
GetOp10(size_t i)136   static inline uint64_t GetOp10(size_t i) {
137     return table10_ops_[i >> 8][i & 0xff];
138   }
GetEmit10(size_t i,size_t emit)139   static inline uint64_t GetEmit10(size_t i, size_t emit) {
140     return table10_emit_[i >> 8][emit];
141   }
GetOp22(size_t i)142   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)143   static inline uint64_t GetEmit22(size_t, size_t emit) {
144     return emit ? 207 : 199;
145   }
GetOp23(size_t i)146   static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; }
GetEmit23(size_t,size_t emit)147   static inline uint64_t GetEmit23(size_t, size_t emit) { return emit + 234; }
GetOp24(size_t i)148   static inline uint64_t GetOp24(size_t i) {
149     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
150   }
GetEmit24(size_t,size_t emit)151   static inline uint64_t GetEmit24(size_t, size_t emit) {
152     return (emit < 2 ? (emit + 192) : ((emit - 2) + 200));
153   }
GetOp25(size_t i)154   static inline uint64_t GetOp25(size_t i) {
155     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
156   }
GetEmit25(size_t,size_t emit)157   static inline uint64_t GetEmit25(size_t, size_t emit) {
158     return (emit < 2 ? (emit ? 205 : 202) : ((emit - 2) ? 213 : 210));
159   }
GetOp26(size_t i)160   static inline uint64_t GetOp26(size_t i) {
161     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
162   }
GetEmit26(size_t,size_t emit)163   static inline uint64_t GetEmit26(size_t, size_t emit) {
164     return (emit < 2 ? (emit + 218) : ((emit - 2) ? 240 : 238));
165   }
GetOp27(size_t i)166   static inline uint64_t GetOp27(size_t i) { return table27_0_inner_[i]; }
GetEmit27(size_t,size_t emit)167   static inline uint64_t GetEmit27(size_t, size_t emit) {
168     return table27_0_emit_[emit];
169   }
GetOp28(size_t i)170   static inline uint64_t GetOp28(size_t i) { return table27_0_inner_[i]; }
GetEmit28(size_t,size_t emit)171   static inline uint64_t GetEmit28(size_t, size_t emit) {
172     return (emit < 4 ? (emit + 245) : ((emit - 4) + 250));
173   }
GetOp30(size_t i)174   static inline uint64_t GetOp30(size_t i) {
175     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
176   }
GetEmit30(size_t,size_t emit)177   static inline uint64_t GetEmit30(size_t, size_t emit) {
178     return ((void)emit, 254);
179   }
GetOp29(size_t i)180   static inline uint64_t GetOp29(size_t i) {
181     return table29_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
182   }
GetEmit29(size_t,size_t emit)183   static inline uint64_t GetEmit29(size_t, size_t emit) {
184     return table29_0_emit_[emit];
185   }
GetOp32(size_t i)186   static inline uint64_t GetOp32(size_t i) {
187     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
188   }
GetEmit32(size_t,size_t emit)189   static inline uint64_t GetEmit32(size_t, size_t emit) {
190     return (emit < 1 ? (((void)emit, 242)) : ((emit - 1) ? 255 : 243));
191   }
GetOp31(size_t i)192   static inline uint64_t GetOp31(size_t i) {
193     return table31_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))];
194   }
GetEmit31(size_t,size_t emit)195   static inline uint64_t GetEmit31(size_t, size_t emit) {
196     return table31_0_emit_[emit];
197   }
GetOp34(size_t i)198   static inline uint64_t GetOp34(size_t i) { return table34_0_inner_[i]; }
GetEmit34(size_t,size_t emit)199   static inline uint64_t GetEmit34(size_t, size_t emit) {
200     return table34_0_emit_[emit];
201   }
GetOp35(size_t i)202   static inline uint64_t GetOp35(size_t i) { return table35_0_ops_[i]; }
GetEmit35(size_t,size_t emit)203   static inline uint64_t GetEmit35(size_t, size_t emit) {
204     return table34_0_emit_[emit];
205   }
GetOp33(size_t i)206   static inline uint64_t GetOp33(size_t i) {
207     return table33_ops_[i >> 5][i & 0x1f];
208   }
GetEmit33(size_t i,size_t emit)209   static inline uint64_t GetEmit33(size_t i, size_t emit) {
210     return table33_emit_[i >> 5][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 table1_0_emit_[71];
270   static const uint16_t table1_0_inner_[37];
271   static const uint8_t table1_0_outer_[64];
272   static const uint8_t table1_1_emit_[71];
273   static const uint16_t table1_1_inner_[37];
274   static const uint8_t table1_2_emit_[71];
275   static const uint16_t table1_2_inner_[37];
276   static const uint8_t table1_3_emit_[71];
277   static const uint16_t table1_3_inner_[37];
278   static const uint8_t table1_4_emit_[71];
279   static const uint16_t table1_4_inner_[37];
280   static const uint8_t table1_5_emit_[71];
281   static const uint16_t table1_5_inner_[37];
282   static const uint8_t table1_6_emit_[71];
283   static const uint16_t table1_6_inner_[37];
284   static const uint8_t table1_7_emit_[71];
285   static const uint16_t table1_7_inner_[37];
286   static const uint8_t table1_8_emit_[71];
287   static const uint16_t table1_8_inner_[37];
288   static const uint8_t table1_9_emit_[71];
289   static const uint16_t table1_9_inner_[37];
290   static const uint8_t table1_10_emit_[40];
291   static const uint16_t table1_10_inner_[22];
292   static const uint8_t table1_10_outer_[64];
293   static const uint8_t table1_11_emit_[40];
294   static const uint8_t table1_12_emit_[40];
295   static const uint8_t table1_13_emit_[40];
296   static const uint8_t table1_14_emit_[40];
297   static const uint8_t table1_15_emit_[40];
298   static const uint8_t table1_16_emit_[40];
299   static const uint8_t table1_17_emit_[40];
300   static const uint8_t table1_18_emit_[40];
301   static const uint8_t table1_19_emit_[40];
302   static const uint8_t table1_20_emit_[40];
303   static const uint8_t table1_21_emit_[40];
304   static const uint8_t table1_22_emit_[40];
305   static const uint8_t table1_23_emit_[4];
306   static const uint16_t table1_23_inner_[4];
307   static const uint8_t table1_23_outer_[64];
308   static const uint8_t table1_24_emit_[4];
309   static const uint8_t table1_25_emit_[4];
310   static const uint8_t table1_26_emit_[4];
311   static const uint8_t table1_27_emit_[4];
312   static const uint8_t table1_28_emit_[4];
313   static const uint8_t table1_29_emit_[4];
314   static const uint8_t table1_30_emit_[4];
315   static const uint8_t table1_31_emit_[14];
316   static const uint16_t table1_31_inner_[17];
317   static const uint8_t table1_31_outer_[64];
318   static const uint8_t* const table1_emit_[32];
319   static const uint16_t* const table1_inner_[32];
320   static const uint8_t* const table1_outer_[32];
321   static const uint8_t table12_0_inner_[6];
322   static const uint8_t table12_0_outer_[8];
323   static const uint8_t table13_0_emit_[7];
324   static const uint8_t table13_0_inner_[9];
325   static const uint8_t table13_0_outer_[16];
326   static const uint8_t table14_0_ops_[32];
327   static const uint8_t table15_0_ops_[64];
328   static const uint8_t table16_0_emit_[45];
329   static const uint8_t table16_0_ops_[128];
330   static const uint8_t table17_0_emit_[72];
331   static const uint16_t table17_0_ops_[64];
332   static const uint8_t table17_1_emit_[72];
333   static const uint8_t table17_2_emit_[40];
334   static const uint16_t table17_2_ops_[64];
335   static const uint8_t table17_3_emit_[6];
336   static const uint16_t table17_3_ops_[64];
337   static const uint8_t* const table17_emit_[4];
338   static const uint16_t* const table17_ops_[4];
339   static const uint8_t table18_0_emit_[44];
340   static const uint16_t table18_0_ops_[64];
341   static const uint8_t table18_1_emit_[92];
342   static const uint16_t table18_1_ops_[64];
343   static const uint8_t table18_2_emit_[44];
344   static const uint8_t table18_3_emit_[92];
345   static const uint8_t table18_4_emit_[72];
346   static const uint8_t table18_5_emit_[72];
347   static const uint8_t table18_6_emit_[40];
348   static const uint8_t table18_7_emit_[31];
349   static const uint16_t table18_7_ops_[64];
350   static const uint8_t* const table18_emit_[8];
351   static const uint16_t* const table18_ops_[8];
352   static const uint8_t table19_0_emit_[16];
353   static const uint16_t table19_0_ops_[64];
354   static const uint8_t table19_1_emit_[28];
355   static const uint16_t table19_1_ops_[64];
356   static const uint8_t table19_2_emit_[36];
357   static const uint16_t table19_2_ops_[64];
358   static const uint8_t table19_3_emit_[68];
359   static const uint16_t table19_3_ops_[64];
360   static const uint8_t table19_4_emit_[16];
361   static const uint8_t table19_5_emit_[28];
362   static const uint8_t table19_6_emit_[36];
363   static const uint8_t table19_7_emit_[68];
364   static const uint8_t table19_8_emit_[44];
365   static const uint8_t table19_9_emit_[92];
366   static const uint8_t table19_10_emit_[44];
367   static const uint8_t table19_11_emit_[92];
368   static const uint8_t table19_12_emit_[72];
369   static const uint8_t table19_13_emit_[72];
370   static const uint8_t table19_14_emit_[72];
371   static const uint8_t table19_15_emit_[24];
372   static const uint16_t table19_15_ops_[64];
373   static const uint8_t* const table19_emit_[16];
374   static const uint16_t* const table19_ops_[16];
375   static const uint8_t table20_0_emit_[8];
376   static const uint16_t table20_0_ops_[64];
377   static const uint8_t table20_1_emit_[8];
378   static const uint8_t table20_2_emit_[12];
379   static const uint16_t table20_2_ops_[64];
380   static const uint8_t table20_3_emit_[16];
381   static const uint8_t table20_4_emit_[16];
382   static const uint8_t table20_5_emit_[20];
383   static const uint16_t table20_5_ops_[64];
384   static const uint8_t table20_6_emit_[32];
385   static const uint16_t table20_6_ops_[64];
386   static const uint8_t table20_7_emit_[36];
387   static const uint16_t table20_7_ops_[64];
388   static const uint8_t table20_8_emit_[8];
389   static const uint8_t table20_9_emit_[8];
390   static const uint8_t table20_10_emit_[12];
391   static const uint8_t table20_11_emit_[16];
392   static const uint8_t table20_12_emit_[16];
393   static const uint8_t table20_13_emit_[20];
394   static const uint8_t table20_14_emit_[32];
395   static const uint8_t table20_15_emit_[36];
396   static const uint8_t table20_16_emit_[16];
397   static const uint8_t table20_17_emit_[28];
398   static const uint8_t table20_18_emit_[36];
399   static const uint8_t table20_19_emit_[68];
400   static const uint8_t table20_20_emit_[16];
401   static const uint8_t table20_21_emit_[28];
402   static const uint8_t table20_22_emit_[36];
403   static const uint8_t table20_23_emit_[68];
404   static const uint8_t table20_24_emit_[44];
405   static const uint8_t table20_25_emit_[92];
406   static const uint8_t table20_26_emit_[44];
407   static const uint8_t table20_27_emit_[92];
408   static const uint8_t table20_28_emit_[44];
409   static const uint8_t table20_29_emit_[92];
410   static const uint8_t table20_30_emit_[15];
411   static const uint16_t table20_30_ops_[64];
412   static const uint8_t table20_31_emit_[35];
413   static const uint16_t table20_31_ops_[64];
414   static const uint8_t* const table20_emit_[32];
415   static const uint16_t* const table20_ops_[32];
416   static const uint8_t table21_0_emit_[60];
417   static const uint16_t table21_0_ops_[64];
418   static const uint8_t table21_1_emit_[60];
419   static const uint8_t table21_2_emit_[60];
420   static const uint8_t table21_3_emit_[60];
421   static const uint8_t table21_4_emit_[60];
422   static const uint8_t table21_5_emit_[8];
423   static const uint16_t table21_5_ops_[64];
424   static const uint8_t table21_6_emit_[8];
425   static const uint8_t table21_7_emit_[8];
426   static const uint8_t table21_8_emit_[8];
427   static const uint8_t table21_9_emit_[8];
428   static const uint8_t table21_10_emit_[8];
429   static const uint8_t table21_11_emit_[12];
430   static const uint16_t table21_11_ops_[64];
431   static const uint8_t table21_12_emit_[16];
432   static const uint16_t table21_12_ops_[64];
433   static const uint8_t table21_13_emit_[16];
434   static const uint8_t table21_14_emit_[16];
435   static const uint8_t table21_15_emit_[30];
436   static const uint16_t table21_15_ops_[64];
437   static const uint8_t table21_16_emit_[60];
438   static const uint8_t table21_17_emit_[60];
439   static const uint8_t table21_18_emit_[60];
440   static const uint8_t table21_19_emit_[60];
441   static const uint8_t table21_20_emit_[60];
442   static const uint8_t table21_21_emit_[8];
443   static const uint8_t table21_22_emit_[8];
444   static const uint8_t table21_23_emit_[8];
445   static const uint8_t table21_24_emit_[8];
446   static const uint8_t table21_25_emit_[8];
447   static const uint8_t table21_26_emit_[8];
448   static const uint8_t table21_27_emit_[12];
449   static const uint8_t table21_28_emit_[16];
450   static const uint8_t table21_29_emit_[16];
451   static const uint8_t table21_30_emit_[16];
452   static const uint8_t table21_31_emit_[30];
453   static const uint8_t table21_32_emit_[8];
454   static const uint8_t table21_33_emit_[8];
455   static const uint8_t table21_34_emit_[12];
456   static const uint8_t table21_35_emit_[16];
457   static const uint8_t table21_36_emit_[16];
458   static const uint8_t table21_37_emit_[20];
459   static const uint16_t table21_37_ops_[64];
460   static const uint8_t table21_38_emit_[32];
461   static const uint16_t table21_38_ops_[64];
462   static const uint8_t table21_39_emit_[36];
463   static const uint16_t table21_39_ops_[64];
464   static const uint8_t table21_40_emit_[8];
465   static const uint8_t table21_41_emit_[8];
466   static const uint8_t table21_42_emit_[12];
467   static const uint8_t table21_43_emit_[16];
468   static const uint8_t table21_44_emit_[16];
469   static const uint8_t table21_45_emit_[20];
470   static const uint8_t table21_46_emit_[32];
471   static const uint8_t table21_47_emit_[36];
472   static const uint8_t table21_48_emit_[16];
473   static const uint8_t table21_49_emit_[28];
474   static const uint16_t table21_49_ops_[64];
475   static const uint8_t table21_50_emit_[36];
476   static const uint16_t table21_50_ops_[64];
477   static const uint8_t table21_51_emit_[68];
478   static const uint16_t table21_51_ops_[64];
479   static const uint8_t table21_52_emit_[16];
480   static const uint8_t table21_53_emit_[28];
481   static const uint8_t table21_54_emit_[36];
482   static const uint8_t table21_55_emit_[68];
483   static const uint8_t table21_56_emit_[16];
484   static const uint8_t table21_57_emit_[28];
485   static const uint8_t table21_58_emit_[36];
486   static const uint8_t table21_59_emit_[68];
487   static const uint8_t table21_60_emit_[5];
488   static const uint16_t table21_60_ops_[64];
489   static const uint8_t table21_61_emit_[10];
490   static const uint16_t table21_61_ops_[64];
491   static const uint8_t table21_62_emit_[23];
492   static const uint16_t table21_62_ops_[64];
493   static const uint8_t table21_63_emit_[41];
494   static const uint16_t table21_63_ops_[64];
495   static const uint8_t* const table21_emit_[64];
496   static const uint16_t* const table21_ops_[64];
497   static const uint8_t table10_0_emit_[1];
498   static const uint16_t table10_0_ops_[256];
499   static const uint8_t table10_8_emit_[1];
500   static const uint8_t table10_16_emit_[1];
501   static const uint16_t table10_16_ops_[256];
502   static const uint8_t table10_20_emit_[1];
503   static const uint8_t table10_24_emit_[1];
504   static const uint16_t table10_24_ops_[256];
505   static const uint8_t table10_26_emit_[1];
506   static const uint8_t table10_28_emit_[1];
507   static const uint16_t table10_30_ops_[256];
508   static const uint8_t table10_31_emit_[76];
509   static const uint16_t table10_31_ops_[256];
510   static const uint8_t* const table10_emit_[32];
511   static const uint16_t* const table10_ops_[32];
512   static const uint8_t table27_0_emit_[8];
513   static const uint8_t table27_0_inner_[8];
514   static const uint8_t table29_0_emit_[15];
515   static const uint8_t table29_0_inner_[15];
516   static const uint8_t table31_0_emit_[5];
517   static const uint8_t table31_0_inner_[5];
518   static const uint8_t table34_0_emit_[15];
519   static const uint8_t table34_0_inner_[16];
520   static const uint8_t table35_0_ops_[32];
521   static const uint8_t table33_0_emit_[8];
522   static const uint8_t table33_0_ops_[32];
523   static const uint8_t table33_1_emit_[10];
524   static const uint8_t table33_1_ops_[32];
525   static const uint8_t* const table33_emit_[2];
526   static const uint8_t* const table33_ops_[2];
527 };
528 template <typename F>
529 class HuffDecoder : public HuffDecoderCommon {
530  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)531   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
532       : sink_(sink), begin_(begin), end_(end) {}
Run()533   bool Run() {
534     while (!done_) {
535       if (!RefillTo11()) {
536         Done0();
537         break;
538       }
539       const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
540       const auto op = GetOp1(index);
541       const int consumed = op & 15;
542       buffer_len_ -= consumed;
543       const auto emit_ofs = op >> 7;
544       switch ((op >> 4) & 7) {
545         case 0: {
546           sink_(GetEmit1(index, emit_ofs + 0));
547           sink_(GetEmit1(index, emit_ofs + 1));
548           break;
549         }
550         case 1: {
551           sink_(GetEmit1(index, emit_ofs + 0));
552           break;
553         }
554         case 2: {
555           DecodeStep0();
556           break;
557         }
558         case 3: {
559           DecodeStep1();
560           break;
561         }
562         case 4: {
563           DecodeStep2();
564           break;
565         }
566       }
567     }
568     return ok_;
569   }
570 
571  private:
RefillTo11()572   bool RefillTo11() {
573     switch (buffer_len_) {
574       case 0: {
575         return Read2to8Bytes();
576       }
577       case 1:
578       case 2: {
579         return Read2to7Bytes();
580       }
581       case 3:
582       case 4:
583       case 5:
584       case 6:
585       case 7:
586       case 8: {
587         return Read1to7Bytes();
588       }
589       case 9:
590       case 10: {
591         return Read1to6Bytes();
592       }
593     }
594     return true;
595   }
Read2to8Bytes()596   bool Read2to8Bytes() {
597     switch (end_ - begin_) {
598       case 0:
599       case 1: {
600         return false;
601       }
602       case 2: {
603         Fill2();
604         return true;
605       }
606       case 3: {
607         Fill3();
608         return true;
609       }
610       case 4: {
611         Fill4();
612         return true;
613       }
614       case 5: {
615         Fill5();
616         return true;
617       }
618       case 6: {
619         Fill6();
620         return true;
621       }
622       case 7: {
623         Fill7();
624         return true;
625       }
626       default: {
627         Fill8();
628         return true;
629       }
630     }
631   }
Fill2()632   void Fill2() {
633     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
634               (static_cast<uint64_t>(begin_[1]) << 0);
635     begin_ += 2;
636     buffer_len_ += 16;
637   }
Fill3()638   void Fill3() {
639     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
640               (static_cast<uint64_t>(begin_[1]) << 8) |
641               (static_cast<uint64_t>(begin_[2]) << 0);
642     begin_ += 3;
643     buffer_len_ += 24;
644   }
Fill4()645   void Fill4() {
646     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
647               (static_cast<uint64_t>(begin_[1]) << 16) |
648               (static_cast<uint64_t>(begin_[2]) << 8) |
649               (static_cast<uint64_t>(begin_[3]) << 0);
650     begin_ += 4;
651     buffer_len_ += 32;
652   }
Fill5()653   void Fill5() {
654     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
655               (static_cast<uint64_t>(begin_[1]) << 24) |
656               (static_cast<uint64_t>(begin_[2]) << 16) |
657               (static_cast<uint64_t>(begin_[3]) << 8) |
658               (static_cast<uint64_t>(begin_[4]) << 0);
659     begin_ += 5;
660     buffer_len_ += 40;
661   }
Fill6()662   void Fill6() {
663     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
664               (static_cast<uint64_t>(begin_[1]) << 32) |
665               (static_cast<uint64_t>(begin_[2]) << 24) |
666               (static_cast<uint64_t>(begin_[3]) << 16) |
667               (static_cast<uint64_t>(begin_[4]) << 8) |
668               (static_cast<uint64_t>(begin_[5]) << 0);
669     begin_ += 6;
670     buffer_len_ += 48;
671   }
Fill7()672   void Fill7() {
673     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
674               (static_cast<uint64_t>(begin_[1]) << 40) |
675               (static_cast<uint64_t>(begin_[2]) << 32) |
676               (static_cast<uint64_t>(begin_[3]) << 24) |
677               (static_cast<uint64_t>(begin_[4]) << 16) |
678               (static_cast<uint64_t>(begin_[5]) << 8) |
679               (static_cast<uint64_t>(begin_[6]) << 0);
680     begin_ += 7;
681     buffer_len_ += 56;
682   }
Fill8()683   void Fill8() {
684     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
685               (static_cast<uint64_t>(begin_[1]) << 48) |
686               (static_cast<uint64_t>(begin_[2]) << 40) |
687               (static_cast<uint64_t>(begin_[3]) << 32) |
688               (static_cast<uint64_t>(begin_[4]) << 24) |
689               (static_cast<uint64_t>(begin_[5]) << 16) |
690               (static_cast<uint64_t>(begin_[6]) << 8) |
691               (static_cast<uint64_t>(begin_[7]) << 0);
692     begin_ += 8;
693     buffer_len_ += 64;
694   }
Read2to7Bytes()695   bool Read2to7Bytes() {
696     switch (end_ - begin_) {
697       case 0:
698       case 1: {
699         return false;
700       }
701       case 2: {
702         Fill2();
703         return true;
704       }
705       case 3: {
706         Fill3();
707         return true;
708       }
709       case 4: {
710         Fill4();
711         return true;
712       }
713       case 5: {
714         Fill5();
715         return true;
716       }
717       case 6: {
718         Fill6();
719         return true;
720       }
721       default: {
722         Fill7();
723         return true;
724       }
725     }
726   }
Read1to7Bytes()727   bool Read1to7Bytes() {
728     switch (end_ - begin_) {
729       case 0: {
730         return false;
731       }
732       case 1: {
733         Fill1();
734         return true;
735       }
736       case 2: {
737         Fill2();
738         return true;
739       }
740       case 3: {
741         Fill3();
742         return true;
743       }
744       case 4: {
745         Fill4();
746         return true;
747       }
748       case 5: {
749         Fill5();
750         return true;
751       }
752       case 6: {
753         Fill6();
754         return true;
755       }
756       default: {
757         Fill7();
758         return true;
759       }
760     }
761   }
Fill1()762   void Fill1() {
763     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
764     begin_ += 1;
765     buffer_len_ += 8;
766   }
Read1to6Bytes()767   bool Read1to6Bytes() {
768     switch (end_ - begin_) {
769       case 0: {
770         return false;
771       }
772       case 1: {
773         Fill1();
774         return true;
775       }
776       case 2: {
777         Fill2();
778         return true;
779       }
780       case 3: {
781         Fill3();
782         return true;
783       }
784       case 4: {
785         Fill4();
786         return true;
787       }
788       case 5: {
789         Fill5();
790         return true;
791       }
792       default: {
793         Fill6();
794         return true;
795       }
796     }
797   }
Done0()798   void Done0() {
799     done_ = true;
800     switch (end_ - begin_) {
801       case 1: {
802         Fill1();
803         break;
804       }
805     }
806     switch (buffer_len_) {
807       case 1:
808       case 2:
809       case 3:
810       case 4: {
811         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
812         return;
813       }
814       case 5: {
815         const auto index = buffer_ & 31;
816         const auto op = GetOp2(index);
817         switch (op & 3) {
818           case 0: {
819             sink_(GetEmit2(index, (op >> 2) + 0));
820             break;
821           }
822           case 1: {
823             ok_ = false;
824             break;
825           }
826         }
827         return;
828       }
829       case 6: {
830         const auto index = buffer_ & 63;
831         const auto op = GetOp3(index);
832         switch (op & 3) {
833           case 0: {
834             ok_ = false;
835             break;
836           }
837           case 1: {
838             sink_(GetEmit3(index, (op >> 2) + 0));
839             break;
840           }
841         }
842         return;
843       }
844       case 7: {
845         const auto index = buffer_ & 127;
846         const auto op = GetOp4(index);
847         switch (op & 3) {
848           case 0: {
849             ok_ = false;
850             break;
851           }
852           case 1: {
853             sink_(GetEmit4(index, (op >> 2) + 0));
854             break;
855           }
856         }
857         return;
858       }
859       case 8: {
860         const auto index = buffer_ & 255;
861         const auto op = GetOp5(index);
862         switch (op & 3) {
863           case 0: {
864             ok_ = false;
865             break;
866           }
867           case 1: {
868             sink_(GetEmit5(index, (op >> 2) + 0));
869             break;
870           }
871         }
872         return;
873       }
874       case 9: {
875         const auto index = buffer_ & 511;
876         const auto op = GetOp6(index);
877         switch (op & 3) {
878           case 0: {
879             ok_ = false;
880             break;
881           }
882           case 1: {
883             sink_(GetEmit6(index, (op >> 2) + 0));
884             break;
885           }
886         }
887         return;
888       }
889       case 10: {
890         const auto index = buffer_ & 1023;
891         const auto op = GetOp7(index);
892         switch (op & 3) {
893           case 0: {
894             sink_(GetEmit7(index, (op >> 2) + 0));
895             sink_(GetEmit7(index, (op >> 2) + 1));
896             break;
897           }
898           case 1: {
899             ok_ = false;
900             break;
901           }
902           case 2: {
903             sink_(GetEmit7(index, (op >> 2) + 0));
904             break;
905           }
906         }
907         return;
908       }
909       case 0: {
910         return;
911       }
912     }
913   }
DecodeStep0()914   void DecodeStep0() {
915     if (!RefillTo1()) {
916       Done1();
917       return;
918     }
919     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
920     const auto op = GetOp8(index);
921     const int consumed = op & 1;
922     buffer_len_ -= consumed;
923     const auto emit_ofs = op >> 1;
924     sink_(GetEmit8(index, emit_ofs + 0));
925   }
RefillTo1()926   bool RefillTo1() {
927     switch (buffer_len_) {
928       case 0: {
929         return Read1to8Bytes();
930       }
931     }
932     return true;
933   }
Read1to8Bytes()934   bool Read1to8Bytes() {
935     switch (end_ - begin_) {
936       case 0: {
937         return false;
938       }
939       case 1: {
940         Fill1();
941         return true;
942       }
943       case 2: {
944         Fill2();
945         return true;
946       }
947       case 3: {
948         Fill3();
949         return true;
950       }
951       case 4: {
952         Fill4();
953         return true;
954       }
955       case 5: {
956         Fill5();
957         return true;
958       }
959       case 6: {
960         Fill6();
961         return true;
962       }
963       case 7: {
964         Fill7();
965         return true;
966       }
967       default: {
968         Fill8();
969         return true;
970       }
971     }
972   }
Done1()973   void Done1() {
974     done_ = true;
975     ok_ = false;
976   }
DecodeStep1()977   void DecodeStep1() {
978     if (!RefillTo2()) {
979       Done2();
980       return;
981     }
982     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
983     const auto op = GetOp9(index);
984     const int consumed = op & 3;
985     buffer_len_ -= consumed;
986     const auto emit_ofs = op >> 2;
987     sink_(GetEmit9(index, emit_ofs + 0));
988   }
RefillTo2()989   bool RefillTo2() {
990     switch (buffer_len_) {
991       case 0: {
992         return Read1to8Bytes();
993       }
994       case 1: {
995         return Read1to7Bytes();
996       }
997     }
998     return true;
999   }
Done2()1000   void Done2() {
1001     done_ = true;
1002     switch (buffer_len_) {
1003       case 1:
1004       case 0: {
1005         ok_ = false;
1006         return;
1007       }
1008     }
1009   }
DecodeStep2()1010   void DecodeStep2() {
1011     if (!RefillTo13()) {
1012       Done3();
1013       return;
1014     }
1015     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
1016     const auto op = GetOp10(index);
1017     const int consumed = op & 15;
1018     buffer_len_ -= consumed;
1019     const auto emit_ofs = op >> 8;
1020     switch ((op >> 4) & 15) {
1021       case 0: {
1022         sink_(GetEmit10(index, emit_ofs + 0));
1023         break;
1024       }
1025       case 1: {
1026         DecodeStep3();
1027         break;
1028       }
1029       case 2: {
1030         DecodeStep4();
1031         break;
1032       }
1033       case 3: {
1034         DecodeStep5();
1035         break;
1036       }
1037       case 4: {
1038         DecodeStep6();
1039         break;
1040       }
1041       case 5: {
1042         DecodeStep7();
1043         break;
1044       }
1045       case 6: {
1046         DecodeStep11();
1047         break;
1048       }
1049       case 7: {
1050         DecodeStep8();
1051         break;
1052       }
1053       case 8: {
1054         DecodeStep9();
1055         break;
1056       }
1057       case 9: {
1058         DecodeStep10();
1059         break;
1060       }
1061       case 10: {
1062         DecodeStep12();
1063         break;
1064       }
1065     }
1066   }
RefillTo13()1067   bool RefillTo13() {
1068     switch (buffer_len_) {
1069       case 0: {
1070         return Read2to8Bytes();
1071       }
1072       case 1:
1073       case 2:
1074       case 3:
1075       case 4: {
1076         return Read2to7Bytes();
1077       }
1078       case 5:
1079       case 6:
1080       case 7:
1081       case 8: {
1082         return Read1to7Bytes();
1083       }
1084       case 9:
1085       case 10:
1086       case 11:
1087       case 12: {
1088         return Read1to6Bytes();
1089       }
1090     }
1091     return true;
1092   }
Done3()1093   void Done3() {
1094     done_ = true;
1095     switch (end_ - begin_) {
1096       case 1: {
1097         Fill1();
1098         break;
1099       }
1100     }
1101     switch (buffer_len_) {
1102       case 1: {
1103         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1104         return;
1105       }
1106       case 2: {
1107         const auto index = buffer_ & 3;
1108         const auto op = GetOp11(index);
1109         switch (op & 3) {
1110           case 0: {
1111             sink_(GetEmit11(index, (op >> 2) + 0));
1112             break;
1113           }
1114           case 1: {
1115             ok_ = false;
1116             break;
1117           }
1118         }
1119         return;
1120       }
1121       case 3: {
1122         const auto index = buffer_ & 7;
1123         const auto op = GetOp12(index);
1124         switch (op & 3) {
1125           case 0: {
1126             ok_ = false;
1127             break;
1128           }
1129           case 1: {
1130             sink_(GetEmit12(index, (op >> 2) + 0));
1131             break;
1132           }
1133         }
1134         return;
1135       }
1136       case 4: {
1137         const auto index = buffer_ & 15;
1138         const auto op = GetOp13(index);
1139         switch (op & 3) {
1140           case 0: {
1141             ok_ = false;
1142             break;
1143           }
1144           case 1: {
1145             sink_(GetEmit13(index, (op >> 2) + 0));
1146             break;
1147           }
1148         }
1149         return;
1150       }
1151       case 5: {
1152         const auto index = buffer_ & 31;
1153         const auto op = GetOp14(index);
1154         switch (op & 3) {
1155           case 0: {
1156             ok_ = false;
1157             break;
1158           }
1159           case 1: {
1160             sink_(GetEmit14(index, (op >> 2) + 0));
1161             break;
1162           }
1163         }
1164         return;
1165       }
1166       case 6: {
1167         const auto index = buffer_ & 63;
1168         const auto op = GetOp15(index);
1169         switch (op & 3) {
1170           case 0: {
1171             ok_ = false;
1172             break;
1173           }
1174           case 1: {
1175             sink_(GetEmit15(index, (op >> 2) + 0));
1176             break;
1177           }
1178         }
1179         return;
1180       }
1181       case 7: {
1182         const auto index = buffer_ & 127;
1183         const auto op = GetOp16(index);
1184         switch (op & 3) {
1185           case 0: {
1186             sink_(GetEmit16(index, (op >> 2) + 0));
1187             sink_(GetEmit16(index, (op >> 2) + 1));
1188             break;
1189           }
1190           case 1: {
1191             ok_ = false;
1192             break;
1193           }
1194           case 2: {
1195             sink_(GetEmit16(index, (op >> 2) + 0));
1196             break;
1197           }
1198         }
1199         return;
1200       }
1201       case 8: {
1202         const auto index = buffer_ & 255;
1203         const auto op = GetOp17(index);
1204         switch (op & 3) {
1205           case 0: {
1206             ok_ = false;
1207             break;
1208           }
1209           case 1: {
1210             sink_(GetEmit17(index, (op >> 2) + 0));
1211             sink_(GetEmit17(index, (op >> 2) + 1));
1212             break;
1213           }
1214           case 2: {
1215             sink_(GetEmit17(index, (op >> 2) + 0));
1216             break;
1217           }
1218         }
1219         return;
1220       }
1221       case 9: {
1222         const auto index = buffer_ & 511;
1223         const auto op = GetOp18(index);
1224         switch (op & 3) {
1225           case 0: {
1226             ok_ = false;
1227             break;
1228           }
1229           case 1: {
1230             sink_(GetEmit18(index, (op >> 2) + 0));
1231             sink_(GetEmit18(index, (op >> 2) + 1));
1232             break;
1233           }
1234           case 2: {
1235             sink_(GetEmit18(index, (op >> 2) + 0));
1236             break;
1237           }
1238         }
1239         return;
1240       }
1241       case 10: {
1242         const auto index = buffer_ & 1023;
1243         const auto op = GetOp19(index);
1244         switch (op & 3) {
1245           case 0: {
1246             ok_ = false;
1247             break;
1248           }
1249           case 1: {
1250             sink_(GetEmit19(index, (op >> 2) + 0));
1251             sink_(GetEmit19(index, (op >> 2) + 1));
1252             break;
1253           }
1254           case 2: {
1255             sink_(GetEmit19(index, (op >> 2) + 0));
1256             break;
1257           }
1258         }
1259         return;
1260       }
1261       case 11: {
1262         const auto index = buffer_ & 2047;
1263         const auto op = GetOp20(index);
1264         switch (op & 3) {
1265           case 0: {
1266             ok_ = false;
1267             break;
1268           }
1269           case 1: {
1270             sink_(GetEmit20(index, (op >> 2) + 0));
1271             sink_(GetEmit20(index, (op >> 2) + 1));
1272             break;
1273           }
1274           case 2: {
1275             sink_(GetEmit20(index, (op >> 2) + 0));
1276             break;
1277           }
1278         }
1279         return;
1280       }
1281       case 12: {
1282         const auto index = buffer_ & 4095;
1283         const auto op = GetOp21(index);
1284         switch (op & 7) {
1285           case 0: {
1286             sink_(GetEmit21(index, (op >> 3) + 0));
1287             sink_(GetEmit21(index, (op >> 3) + 1));
1288             sink_(GetEmit21(index, (op >> 3) + 2));
1289             break;
1290           }
1291           case 1: {
1292             ok_ = false;
1293             break;
1294           }
1295           case 2: {
1296             sink_(GetEmit21(index, (op >> 3) + 0));
1297             sink_(GetEmit21(index, (op >> 3) + 1));
1298             break;
1299           }
1300           case 3: {
1301             sink_(GetEmit21(index, (op >> 3) + 0));
1302             break;
1303           }
1304         }
1305         return;
1306       }
1307       case 0: {
1308         return;
1309       }
1310     }
1311   }
DecodeStep3()1312   void DecodeStep3() {
1313     if (!RefillTo1()) {
1314       Done4();
1315       return;
1316     }
1317     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1318     const auto op = GetOp22(index);
1319     const int consumed = op & 1;
1320     buffer_len_ -= consumed;
1321     const auto emit_ofs = op >> 1;
1322     sink_(GetEmit22(index, emit_ofs + 0));
1323   }
Done4()1324   void Done4() {
1325     done_ = true;
1326     ok_ = false;
1327   }
DecodeStep4()1328   void DecodeStep4() {
1329     if (!RefillTo1()) {
1330       Done5();
1331       return;
1332     }
1333     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1334     const auto op = GetOp23(index);
1335     const int consumed = op & 1;
1336     buffer_len_ -= consumed;
1337     const auto emit_ofs = op >> 1;
1338     sink_(GetEmit23(index, emit_ofs + 0));
1339   }
Done5()1340   void Done5() {
1341     done_ = true;
1342     ok_ = false;
1343   }
DecodeStep5()1344   void DecodeStep5() {
1345     if (!RefillTo2()) {
1346       Done6();
1347       return;
1348     }
1349     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1350     const auto op = GetOp24(index);
1351     const int consumed = op & 3;
1352     buffer_len_ -= consumed;
1353     const auto emit_ofs = op >> 2;
1354     sink_(GetEmit24(index, emit_ofs + 0));
1355   }
Done6()1356   void Done6() {
1357     done_ = true;
1358     switch (buffer_len_) {
1359       case 1:
1360       case 0: {
1361         ok_ = false;
1362         return;
1363       }
1364     }
1365   }
DecodeStep6()1366   void DecodeStep6() {
1367     if (!RefillTo2()) {
1368       Done7();
1369       return;
1370     }
1371     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1372     const auto op = GetOp25(index);
1373     const int consumed = op & 3;
1374     buffer_len_ -= consumed;
1375     const auto emit_ofs = op >> 2;
1376     sink_(GetEmit25(index, emit_ofs + 0));
1377   }
Done7()1378   void Done7() {
1379     done_ = true;
1380     switch (buffer_len_) {
1381       case 1:
1382       case 0: {
1383         ok_ = false;
1384         return;
1385       }
1386     }
1387   }
DecodeStep7()1388   void DecodeStep7() {
1389     if (!RefillTo2()) {
1390       Done8();
1391       return;
1392     }
1393     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1394     const auto op = GetOp26(index);
1395     const int consumed = op & 3;
1396     buffer_len_ -= consumed;
1397     const auto emit_ofs = op >> 2;
1398     sink_(GetEmit26(index, emit_ofs + 0));
1399   }
Done8()1400   void Done8() {
1401     done_ = true;
1402     switch (buffer_len_) {
1403       case 1:
1404       case 0: {
1405         ok_ = false;
1406         return;
1407       }
1408     }
1409   }
DecodeStep8()1410   void DecodeStep8() {
1411     if (!RefillTo3()) {
1412       Done9();
1413       return;
1414     }
1415     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1416     const auto op = GetOp27(index);
1417     const int consumed = op & 3;
1418     buffer_len_ -= consumed;
1419     const auto emit_ofs = op >> 2;
1420     sink_(GetEmit27(index, emit_ofs + 0));
1421   }
RefillTo3()1422   bool RefillTo3() {
1423     switch (buffer_len_) {
1424       case 0: {
1425         return Read1to8Bytes();
1426       }
1427       case 1:
1428       case 2: {
1429         return Read1to7Bytes();
1430       }
1431     }
1432     return true;
1433   }
Done9()1434   void Done9() {
1435     done_ = true;
1436     switch (buffer_len_) {
1437       case 1:
1438       case 2:
1439       case 0: {
1440         ok_ = false;
1441         return;
1442       }
1443     }
1444   }
DecodeStep9()1445   void DecodeStep9() {
1446     if (!RefillTo3()) {
1447       Done10();
1448       return;
1449     }
1450     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1451     const auto op = GetOp28(index);
1452     const int consumed = op & 3;
1453     buffer_len_ -= consumed;
1454     const auto emit_ofs = op >> 2;
1455     sink_(GetEmit28(index, emit_ofs + 0));
1456   }
Done10()1457   void Done10() {
1458     done_ = true;
1459     switch (buffer_len_) {
1460       case 1:
1461       case 2:
1462       case 0: {
1463         ok_ = false;
1464         return;
1465       }
1466     }
1467   }
DecodeStep10()1468   void DecodeStep10() {
1469     if (!RefillTo4()) {
1470       Done11();
1471       return;
1472     }
1473     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1474     const auto op = GetOp29(index);
1475     const int consumed = op & 7;
1476     buffer_len_ -= consumed;
1477     const auto emit_ofs = op >> 3;
1478     sink_(GetEmit29(index, emit_ofs + 0));
1479   }
RefillTo4()1480   bool RefillTo4() {
1481     switch (buffer_len_) {
1482       case 0: {
1483         return Read1to8Bytes();
1484       }
1485       case 1:
1486       case 2:
1487       case 3: {
1488         return Read1to7Bytes();
1489       }
1490     }
1491     return true;
1492   }
Done11()1493   void Done11() {
1494     done_ = true;
1495     switch (buffer_len_) {
1496       case 1:
1497       case 2:
1498       case 0: {
1499         ok_ = false;
1500         return;
1501       }
1502       case 3: {
1503         const auto index = buffer_ & 7;
1504         const auto op = GetOp30(index);
1505         switch (op & 1) {
1506           case 0: {
1507             sink_(GetEmit30(index, (op >> 1) + 0));
1508             break;
1509           }
1510           case 1: {
1511             ok_ = false;
1512             break;
1513           }
1514         }
1515         return;
1516       }
1517     }
1518   }
DecodeStep11()1519   void DecodeStep11() {
1520     if (!RefillTo3()) {
1521       Done12();
1522       return;
1523     }
1524     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1525     const auto op = GetOp31(index);
1526     const int consumed = op & 3;
1527     buffer_len_ -= consumed;
1528     const auto emit_ofs = op >> 2;
1529     sink_(GetEmit31(index, emit_ofs + 0));
1530   }
Done12()1531   void Done12() {
1532     done_ = true;
1533     switch (buffer_len_) {
1534       case 1:
1535       case 0: {
1536         ok_ = false;
1537         return;
1538       }
1539       case 2: {
1540         const auto index = buffer_ & 3;
1541         const auto op = GetOp32(index);
1542         switch (op & 1) {
1543           case 0: {
1544             sink_(GetEmit32(index, (op >> 1) + 0));
1545             break;
1546           }
1547           case 1: {
1548             ok_ = false;
1549             break;
1550           }
1551         }
1552         return;
1553       }
1554     }
1555   }
DecodeStep12()1556   void DecodeStep12() {
1557     if (!RefillTo6()) {
1558       Done13();
1559       return;
1560     }
1561     const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f;
1562     const auto op = GetOp33(index);
1563     const int consumed = op & 7;
1564     buffer_len_ -= consumed;
1565     const auto emit_ofs = op >> 4;
1566     switch ((op >> 3) & 1) {
1567       case 0: {
1568         sink_(GetEmit33(index, emit_ofs + 0));
1569         break;
1570       }
1571       case 1: {
1572         begin_ = end_;
1573         buffer_len_ = 0;
1574         break;
1575       }
1576     }
1577   }
RefillTo6()1578   bool RefillTo6() {
1579     switch (buffer_len_) {
1580       case 0: {
1581         return Read1to8Bytes();
1582       }
1583       case 1:
1584       case 2:
1585       case 3:
1586       case 4:
1587       case 5: {
1588         return Read1to7Bytes();
1589       }
1590     }
1591     return true;
1592   }
Done13()1593   void Done13() {
1594     done_ = true;
1595     switch (buffer_len_) {
1596       case 1:
1597       case 2:
1598       case 3: {
1599         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1600         return;
1601       }
1602       case 4: {
1603         const auto index = buffer_ & 15;
1604         const auto op = GetOp34(index);
1605         switch (op & 1) {
1606           case 0: {
1607             sink_(GetEmit34(index, (op >> 1) + 0));
1608             break;
1609           }
1610         }
1611         return;
1612       }
1613       case 5: {
1614         const auto index = buffer_ & 31;
1615         const auto op = GetOp35(index);
1616         switch (op & 3) {
1617           case 0: {
1618             ok_ = false;
1619             break;
1620           }
1621           case 1: {
1622             sink_(GetEmit35(index, (op >> 2) + 0));
1623             break;
1624           }
1625         }
1626         return;
1627       }
1628       case 0: {
1629         return;
1630       }
1631     }
1632   }
1633   F sink_;
1634   const uint8_t* begin_;
1635   const uint8_t* const end_;
1636   uint64_t buffer_ = 0;
1637   int buffer_len_ = 0;
1638   bool ok_ = true;
1639   bool done_ = false;
1640 };
1641 }  // namespace geometry_11_13_6
1642 }  // namespace grpc_core
1643 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_13_6_H
1644