xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_10_14_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_10_14_6_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_14_6_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_10_14_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   }
GetOp1(size_t i)54   static inline uint64_t GetOp1(size_t i) {
55     return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]];
56   }
GetEmit1(size_t i,size_t emit)57   static inline uint64_t GetEmit1(size_t i, size_t emit) {
58     return table1_emit_[i >> 6][emit];
59   }
GetOp7(size_t i)60   static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; }
GetEmit7(size_t,size_t emit)61   static inline uint64_t GetEmit7(size_t, size_t emit) {
62     return emit ? 43 : 39;
63   }
GetOp9(size_t i)64   static inline uint64_t GetOp9(size_t i) { return table9_0_inner_[i]; }
GetEmit9(size_t,size_t emit)65   static inline uint64_t GetEmit9(size_t, size_t emit) {
66     return table9_0_emit_[emit];
67   }
GetOp10(size_t i)68   static inline uint64_t GetOp10(size_t i) {
69     return table10_0_inner_[table10_0_outer_[i]];
70   }
GetEmit10(size_t,size_t emit)71   static inline uint64_t GetEmit10(size_t, size_t emit) {
72     return table10_0_emit_[emit];
73   }
GetOp11(size_t i)74   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)75   static inline uint64_t GetEmit11(size_t, size_t emit) {
76     return table11_0_emit_[emit];
77   }
GetOp12(size_t i)78   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)79   static inline uint64_t GetEmit12(size_t, size_t emit) {
80     return table11_0_emit_[emit];
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; }
GetEmit13(size_t,size_t emit)83   static inline uint64_t GetEmit13(size_t, size_t emit) {
84     return table11_0_emit_[emit];
85   }
GetOp14(size_t i)86   static inline uint64_t GetOp14(size_t i) {
87     return table14_ops_[i >> 6][i & 0x3f];
88   }
GetEmit14(size_t i,size_t emit)89   static inline uint64_t GetEmit14(size_t i, size_t emit) {
90     return table14_emit_[i >> 6][emit];
91   }
GetOp15(size_t i)92   static inline uint64_t GetOp15(size_t i) {
93     return table15_ops_[i >> 6][i & 0x3f];
94   }
GetEmit15(size_t i,size_t emit)95   static inline uint64_t GetEmit15(size_t i, size_t emit) {
96     return table15_emit_[i >> 6][emit];
97   }
GetOp16(size_t i)98   static inline uint64_t GetOp16(size_t i) {
99     return table16_ops_[i >> 6][i & 0x3f];
100   }
GetEmit16(size_t i,size_t emit)101   static inline uint64_t GetEmit16(size_t i, size_t emit) {
102     return table16_emit_[i >> 6][emit];
103   }
GetOp17(size_t i)104   static inline uint64_t GetOp17(size_t i) {
105     return table17_ops_[i >> 6][i & 0x3f];
106   }
GetEmit17(size_t i,size_t emit)107   static inline uint64_t GetEmit17(size_t i, size_t emit) {
108     return table17_emit_[i >> 6][emit];
109   }
GetOp18(size_t i)110   static inline uint64_t GetOp18(size_t i) {
111     return table18_ops_[i >> 7][i & 0x7f];
112   }
GetEmit18(size_t i,size_t emit)113   static inline uint64_t GetEmit18(size_t i, size_t emit) {
114     return table18_emit_[i >> 7][emit];
115   }
GetOp19(size_t i)116   static inline uint64_t GetOp19(size_t i) {
117     return table19_ops_[i >> 7][i & 0x7f];
118   }
GetEmit19(size_t i,size_t emit)119   static inline uint64_t GetEmit19(size_t i, size_t emit) {
120     return table19_emit_[i >> 7][emit];
121   }
GetOp8(size_t i)122   static inline uint64_t GetOp8(size_t i) {
123     return table8_ops_[i >> 9][i & 0x1ff];
124   }
GetEmit8(size_t i,size_t emit)125   static inline uint64_t GetEmit8(size_t i, size_t emit) {
126     return table8_emit_[i >> 9][emit];
127   }
GetOp20(size_t i)128   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)129   static inline uint64_t GetEmit20(size_t, size_t emit) {
130     return emit ? 207 : 199;
131   }
GetOp21(size_t i)132   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)133   static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 234; }
GetOp22(size_t i)134   static inline uint64_t GetOp22(size_t i) {
135     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
136   }
GetEmit22(size_t,size_t emit)137   static inline uint64_t GetEmit22(size_t, size_t emit) {
138     return (emit < 2 ? (emit + 192) : ((emit - 2) + 200));
139   }
GetOp23(size_t i)140   static inline uint64_t GetOp23(size_t i) {
141     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
142   }
GetEmit23(size_t,size_t emit)143   static inline uint64_t GetEmit23(size_t, size_t emit) {
144     return (emit < 2 ? (emit ? 205 : 202) : ((emit - 2) ? 213 : 210));
145   }
GetOp24(size_t i)146   static inline uint64_t GetOp24(size_t i) {
147     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
148   }
GetEmit24(size_t,size_t emit)149   static inline uint64_t GetEmit24(size_t, size_t emit) {
150     return (emit < 2 ? (emit + 218) : ((emit - 2) ? 240 : 238));
151   }
GetOp25(size_t i)152   static inline uint64_t GetOp25(size_t i) { return table25_0_inner_[i]; }
GetEmit25(size_t,size_t emit)153   static inline uint64_t GetEmit25(size_t, size_t emit) {
154     return table25_0_emit_[emit];
155   }
GetOp26(size_t i)156   static inline uint64_t GetOp26(size_t i) { return table25_0_inner_[i]; }
GetEmit26(size_t,size_t emit)157   static inline uint64_t GetEmit26(size_t, size_t emit) {
158     return (emit < 4 ? (emit + 245) : ((emit - 4) + 250));
159   }
GetOp28(size_t i)160   static inline uint64_t GetOp28(size_t i) {
161     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
162   }
GetEmit28(size_t,size_t emit)163   static inline uint64_t GetEmit28(size_t, size_t emit) {
164     return ((void)emit, 254);
165   }
GetOp27(size_t i)166   static inline uint64_t GetOp27(size_t i) {
167     return table27_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
168   }
GetEmit27(size_t,size_t emit)169   static inline uint64_t GetEmit27(size_t, size_t emit) {
170     return table27_0_emit_[emit];
171   }
GetOp30(size_t i)172   static inline uint64_t GetOp30(size_t i) {
173     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
174   }
GetEmit30(size_t,size_t emit)175   static inline uint64_t GetEmit30(size_t, size_t emit) {
176     return (emit < 1 ? (((void)emit, 242)) : ((emit - 1) ? 255 : 243));
177   }
GetOp29(size_t i)178   static inline uint64_t GetOp29(size_t i) {
179     return table29_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))];
180   }
GetEmit29(size_t,size_t emit)181   static inline uint64_t GetEmit29(size_t, size_t emit) {
182     return table29_0_emit_[emit];
183   }
GetOp32(size_t i)184   static inline uint64_t GetOp32(size_t i) { return table32_0_inner_[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) { return table33_0_ops_[i]; }
GetEmit33(size_t,size_t emit)189   static inline uint64_t GetEmit33(size_t, size_t emit) {
190     return table32_0_emit_[emit];
191   }
GetOp31(size_t i)192   static inline uint64_t GetOp31(size_t i) {
193     return table31_ops_[i >> 5][i & 0x1f];
194   }
GetEmit31(size_t i,size_t emit)195   static inline uint64_t GetEmit31(size_t i, size_t emit) {
196     return table31_emit_[i >> 5][emit];
197   }
GetOp35(size_t i)198   static inline uint64_t GetOp35(size_t i) { return i; }
GetEmit35(size_t,size_t emit)199   static inline uint64_t GetEmit35(size_t, size_t emit) {
200     return ((void)emit, 124);
201   }
GetOp34(size_t i)202   static inline uint64_t GetOp34(size_t i) {
203     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
204                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
205                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
206   }
GetEmit34(size_t,size_t emit)207   static inline uint64_t GetEmit34(size_t, size_t emit) {
208     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
209   }
210 
211  private:
212   static const uint8_t table2_0_emit_[10];
213   static const uint8_t table2_0_ops_[32];
214   static const uint8_t table3_0_emit_[36];
215   static const uint8_t table3_0_ops_[64];
216   static const uint8_t table4_0_emit_[22];
217   static const uint8_t table4_0_ops_[64];
218   static const uint8_t table4_1_emit_[46];
219   static const uint8_t table4_1_ops_[64];
220   static const uint8_t* const table4_emit_[2];
221   static const uint8_t* const table4_ops_[2];
222   static const uint8_t table5_0_ops_[128];
223   static const uint8_t table5_1_emit_[52];
224   static const uint8_t table5_1_ops_[128];
225   static const uint8_t* const table5_emit_[2];
226   static const uint8_t* const table5_ops_[2];
227   static const uint8_t table6_0_emit_[2];
228   static const uint8_t table6_0_ops_[32];
229   static const uint8_t table6_1_emit_[2];
230   static const uint8_t table6_2_emit_[2];
231   static const uint8_t table6_3_emit_[2];
232   static const uint8_t table6_4_emit_[2];
233   static const uint8_t table6_5_emit_[4];
234   static const uint8_t table6_5_ops_[32];
235   static const uint8_t table6_6_emit_[4];
236   static const uint8_t table6_7_emit_[4];
237   static const uint8_t table6_8_emit_[4];
238   static const uint8_t table6_9_emit_[4];
239   static const uint8_t table6_10_emit_[4];
240   static const uint8_t table6_11_emit_[6];
241   static const uint8_t table6_11_ops_[32];
242   static const uint8_t table6_12_emit_[8];
243   static const uint8_t table6_12_ops_[32];
244   static const uint8_t table6_13_emit_[8];
245   static const uint8_t table6_14_emit_[8];
246   static const uint8_t table6_15_emit_[10];
247   static const uint8_t table6_15_ops_[32];
248   static const uint8_t* const table6_emit_[16];
249   static const uint8_t* const table6_ops_[16];
250   static const uint8_t table1_0_emit_[36];
251   static const uint16_t table1_0_inner_[22];
252   static const uint8_t table1_0_outer_[64];
253   static const uint8_t table1_1_emit_[36];
254   static const uint16_t table1_1_inner_[22];
255   static const uint8_t table1_2_emit_[36];
256   static const uint16_t table1_2_inner_[22];
257   static const uint8_t table1_3_emit_[36];
258   static const uint16_t table1_3_inner_[22];
259   static const uint8_t table1_4_emit_[38];
260   static const uint16_t table1_4_inner_[22];
261   static const uint16_t table1_5_inner_[4];
262   static const uint8_t table1_5_outer_[64];
263   static const uint16_t table1_11_inner_[6];
264   static const uint8_t table1_11_outer_[64];
265   static const uint16_t table1_12_inner_[8];
266   static const uint8_t table1_12_outer_[64];
267   static const uint8_t table1_15_emit_[15];
268   static const uint16_t table1_15_inner_[18];
269   static const uint8_t table1_15_outer_[64];
270   static const uint8_t* const table1_emit_[16];
271   static const uint16_t* const table1_inner_[16];
272   static const uint8_t* const table1_outer_[16];
273   static const uint8_t table9_0_emit_[6];
274   static const uint8_t table9_0_inner_[8];
275   static const uint8_t table10_0_emit_[8];
276   static const uint8_t table10_0_inner_[10];
277   static const uint8_t table10_0_outer_[16];
278   static const uint8_t table11_0_emit_[11];
279   static const uint8_t table11_0_ops_[32];
280   static const uint8_t table12_0_ops_[64];
281   static const uint8_t table13_0_ops_[128];
282   static const uint8_t table14_0_emit_[40];
283   static const uint8_t table14_0_ops_[64];
284   static const uint8_t table14_1_emit_[40];
285   static const uint8_t table14_2_emit_[40];
286   static const uint8_t table14_3_emit_[5];
287   static const uint8_t table14_3_ops_[64];
288   static const uint8_t* const table14_emit_[4];
289   static const uint8_t* const table14_ops_[4];
290   static const uint8_t table15_0_emit_[72];
291   static const uint16_t table15_0_ops_[64];
292   static const uint8_t table15_1_emit_[72];
293   static const uint8_t table15_2_emit_[72];
294   static const uint8_t table15_3_emit_[72];
295   static const uint8_t table15_4_emit_[72];
296   static const uint8_t table15_5_emit_[72];
297   static const uint8_t table15_6_emit_[40];
298   static const uint16_t table15_6_ops_[64];
299   static const uint8_t table15_7_emit_[6];
300   static const uint16_t table15_7_ops_[64];
301   static const uint8_t* const table15_emit_[8];
302   static const uint16_t* const table15_ops_[8];
303   static const uint8_t table16_0_emit_[44];
304   static const uint16_t table16_0_ops_[64];
305   static const uint8_t table16_1_emit_[92];
306   static const uint16_t table16_1_ops_[64];
307   static const uint8_t table16_2_emit_[44];
308   static const uint8_t table16_3_emit_[92];
309   static const uint8_t table16_4_emit_[44];
310   static const uint8_t table16_5_emit_[92];
311   static const uint8_t table16_6_emit_[44];
312   static const uint8_t table16_7_emit_[92];
313   static const uint8_t table16_8_emit_[44];
314   static const uint8_t table16_9_emit_[92];
315   static const uint8_t table16_10_emit_[44];
316   static const uint8_t table16_11_emit_[92];
317   static const uint8_t table16_12_emit_[72];
318   static const uint8_t table16_13_emit_[72];
319   static const uint8_t table16_14_emit_[40];
320   static const uint8_t table16_15_emit_[31];
321   static const uint16_t table16_15_ops_[64];
322   static const uint8_t* const table16_emit_[16];
323   static const uint16_t* const table16_ops_[16];
324   static const uint8_t table17_0_emit_[16];
325   static const uint16_t table17_0_ops_[64];
326   static const uint8_t table17_1_emit_[28];
327   static const uint16_t table17_1_ops_[64];
328   static const uint8_t table17_2_emit_[36];
329   static const uint16_t table17_2_ops_[64];
330   static const uint8_t table17_3_emit_[68];
331   static const uint16_t table17_3_ops_[64];
332   static const uint8_t table17_4_emit_[16];
333   static const uint8_t table17_5_emit_[28];
334   static const uint8_t table17_6_emit_[36];
335   static const uint8_t table17_7_emit_[68];
336   static const uint8_t table17_8_emit_[16];
337   static const uint8_t table17_9_emit_[28];
338   static const uint8_t table17_10_emit_[36];
339   static const uint8_t table17_11_emit_[68];
340   static const uint8_t table17_12_emit_[16];
341   static const uint8_t table17_13_emit_[28];
342   static const uint8_t table17_14_emit_[36];
343   static const uint8_t table17_15_emit_[68];
344   static const uint8_t table17_16_emit_[16];
345   static const uint8_t table17_17_emit_[28];
346   static const uint8_t table17_18_emit_[36];
347   static const uint8_t table17_19_emit_[68];
348   static const uint8_t table17_20_emit_[16];
349   static const uint8_t table17_21_emit_[28];
350   static const uint8_t table17_22_emit_[36];
351   static const uint8_t table17_23_emit_[68];
352   static const uint8_t table17_24_emit_[44];
353   static const uint8_t table17_25_emit_[92];
354   static const uint8_t table17_26_emit_[44];
355   static const uint8_t table17_27_emit_[92];
356   static const uint8_t table17_28_emit_[72];
357   static const uint8_t table17_29_emit_[72];
358   static const uint8_t table17_30_emit_[72];
359   static const uint8_t table17_31_emit_[24];
360   static const uint16_t table17_31_ops_[64];
361   static const uint8_t* const table17_emit_[32];
362   static const uint16_t* const table17_ops_[32];
363   static const uint16_t table18_0_ops_[128];
364   static const uint16_t table18_1_ops_[128];
365   static const uint16_t table18_2_ops_[128];
366   static const uint16_t table18_3_ops_[128];
367   static const uint16_t table18_24_ops_[128];
368   static const uint8_t table18_25_emit_[104];
369   static const uint16_t table18_25_ops_[128];
370   static const uint8_t table18_27_emit_[104];
371   static const uint8_t table18_28_emit_[136];
372   static const uint16_t table18_28_ops_[128];
373   static const uint8_t table18_29_emit_[136];
374   static const uint8_t table18_30_emit_[136];
375   static const uint8_t table18_31_emit_[50];
376   static const uint16_t table18_31_ops_[128];
377   static const uint8_t* const table18_emit_[32];
378   static const uint16_t* const table18_ops_[32];
379   static const uint8_t table19_0_emit_[120];
380   static const uint16_t table19_0_ops_[128];
381   static const uint8_t table19_1_emit_[120];
382   static const uint8_t table19_2_emit_[68];
383   static const uint16_t table19_2_ops_[128];
384   static const uint8_t table19_3_emit_[16];
385   static const uint16_t table19_3_ops_[128];
386   static const uint8_t table19_4_emit_[16];
387   static const uint8_t table19_5_emit_[20];
388   static const uint16_t table19_5_ops_[128];
389   static const uint8_t table19_6_emit_[32];
390   static const uint16_t table19_6_ops_[128];
391   static const uint8_t table19_7_emit_[46];
392   static const uint16_t table19_7_ops_[128];
393   static const uint8_t table19_8_emit_[120];
394   static const uint8_t table19_9_emit_[120];
395   static const uint8_t table19_10_emit_[68];
396   static const uint8_t table19_11_emit_[16];
397   static const uint8_t table19_12_emit_[16];
398   static const uint8_t table19_13_emit_[20];
399   static const uint8_t table19_14_emit_[32];
400   static const uint8_t table19_15_emit_[46];
401   static const uint8_t table19_16_emit_[120];
402   static const uint8_t table19_17_emit_[120];
403   static const uint8_t table19_18_emit_[68];
404   static const uint8_t table19_19_emit_[16];
405   static const uint8_t table19_20_emit_[16];
406   static const uint8_t table19_21_emit_[20];
407   static const uint8_t table19_22_emit_[32];
408   static const uint8_t table19_23_emit_[46];
409   static const uint8_t table19_24_emit_[120];
410   static const uint8_t table19_25_emit_[120];
411   static const uint8_t table19_26_emit_[68];
412   static const uint8_t table19_27_emit_[16];
413   static const uint8_t table19_28_emit_[16];
414   static const uint8_t table19_29_emit_[20];
415   static const uint8_t table19_30_emit_[32];
416   static const uint8_t table19_31_emit_[46];
417   static const uint8_t table19_32_emit_[120];
418   static const uint8_t table19_33_emit_[120];
419   static const uint8_t table19_34_emit_[68];
420   static const uint8_t table19_35_emit_[16];
421   static const uint8_t table19_36_emit_[16];
422   static const uint8_t table19_37_emit_[20];
423   static const uint8_t table19_38_emit_[32];
424   static const uint8_t table19_39_emit_[46];
425   static const uint8_t table19_40_emit_[120];
426   static const uint8_t table19_41_emit_[120];
427   static const uint8_t table19_42_emit_[68];
428   static const uint8_t table19_43_emit_[16];
429   static const uint8_t table19_44_emit_[16];
430   static const uint8_t table19_45_emit_[20];
431   static const uint8_t table19_46_emit_[32];
432   static const uint8_t table19_47_emit_[46];
433   static const uint8_t table19_48_emit_[16];
434   static const uint8_t table19_49_emit_[28];
435   static const uint16_t table19_49_ops_[128];
436   static const uint8_t table19_50_emit_[36];
437   static const uint16_t table19_50_ops_[128];
438   static const uint8_t table19_51_emit_[68];
439   static const uint16_t table19_51_ops_[128];
440   static const uint8_t table19_52_emit_[16];
441   static const uint8_t table19_53_emit_[28];
442   static const uint8_t table19_54_emit_[36];
443   static const uint8_t table19_55_emit_[68];
444   static const uint8_t table19_56_emit_[44];
445   static const uint16_t table19_56_ops_[128];
446   static const uint8_t table19_57_emit_[104];
447   static const uint16_t table19_57_ops_[128];
448   static const uint8_t table19_58_emit_[44];
449   static const uint8_t table19_59_emit_[104];
450   static const uint8_t table19_60_emit_[44];
451   static const uint8_t table19_61_emit_[104];
452   static const uint8_t table19_62_emit_[15];
453   static const uint16_t table19_62_ops_[128];
454   static const uint8_t table19_63_emit_[64];
455   static const uint16_t table19_63_ops_[128];
456   static const uint8_t* const table19_emit_[64];
457   static const uint16_t* const table19_ops_[64];
458   static const uint8_t table8_0_emit_[1];
459   static const uint16_t table8_0_ops_[512];
460   static const uint8_t table8_4_emit_[1];
461   static const uint8_t table8_8_emit_[1];
462   static const uint8_t table8_12_emit_[1];
463   static const uint8_t table8_16_emit_[1];
464   static const uint8_t table8_20_emit_[1];
465   static const uint8_t table8_24_emit_[1];
466   static const uint16_t table8_24_ops_[512];
467   static const uint8_t table8_26_emit_[1];
468   static const uint8_t table8_28_emit_[1];
469   static const uint16_t table8_28_ops_[512];
470   static const uint8_t table8_29_emit_[1];
471   static const uint8_t table8_30_emit_[1];
472   static const uint8_t table8_31_emit_[91];
473   static const uint16_t table8_31_ops_[512];
474   static const uint8_t* const table8_emit_[32];
475   static const uint16_t* const table8_ops_[32];
476   static const uint8_t table25_0_emit_[8];
477   static const uint8_t table25_0_inner_[8];
478   static const uint8_t table27_0_emit_[15];
479   static const uint8_t table27_0_inner_[15];
480   static const uint8_t table29_0_emit_[5];
481   static const uint8_t table29_0_inner_[5];
482   static const uint8_t table32_0_emit_[15];
483   static const uint8_t table32_0_inner_[16];
484   static const uint8_t table33_0_ops_[32];
485   static const uint8_t table31_0_emit_[8];
486   static const uint8_t table31_0_ops_[32];
487   static const uint8_t table31_1_emit_[10];
488   static const uint8_t table31_1_ops_[32];
489   static const uint8_t* const table31_emit_[2];
490   static const uint8_t* const table31_ops_[2];
491 };
492 template <typename F>
493 class HuffDecoder : public HuffDecoderCommon {
494  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)495   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
496       : sink_(sink), begin_(begin), end_(end) {}
Run()497   bool Run() {
498     while (!done_) {
499       if (!RefillTo10()) {
500         Done0();
501         break;
502       }
503       const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
504       const auto op = GetOp1(index);
505       const int consumed = op & 15;
506       buffer_len_ -= consumed;
507       const auto emit_ofs = op >> 7;
508       switch ((op >> 4) & 7) {
509         case 0: {
510           sink_(GetEmit1(index, emit_ofs + 0));
511           sink_(GetEmit1(index, emit_ofs + 1));
512           break;
513         }
514         case 1: {
515           sink_(GetEmit1(index, emit_ofs + 0));
516           break;
517         }
518         case 2: {
519           DecodeStep0();
520           break;
521         }
522         case 3: {
523           DecodeStep12();
524           break;
525         }
526         case 4: {
527           DecodeStep1();
528           break;
529         }
530       }
531     }
532     return ok_;
533   }
534 
535  private:
RefillTo10()536   bool RefillTo10() {
537     switch (buffer_len_) {
538       case 0: {
539         return Read2to8Bytes();
540       }
541       case 1: {
542         return Read2to7Bytes();
543       }
544       case 2:
545       case 3:
546       case 4:
547       case 5:
548       case 6:
549       case 7:
550       case 8: {
551         return Read1to7Bytes();
552       }
553       case 9: {
554         return Read1to6Bytes();
555       }
556     }
557     return true;
558   }
Read2to8Bytes()559   bool Read2to8Bytes() {
560     switch (end_ - begin_) {
561       case 0:
562       case 1: {
563         return false;
564       }
565       case 2: {
566         Fill2();
567         return true;
568       }
569       case 3: {
570         Fill3();
571         return true;
572       }
573       case 4: {
574         Fill4();
575         return true;
576       }
577       case 5: {
578         Fill5();
579         return true;
580       }
581       case 6: {
582         Fill6();
583         return true;
584       }
585       case 7: {
586         Fill7();
587         return true;
588       }
589       default: {
590         Fill8();
591         return true;
592       }
593     }
594   }
Fill2()595   void Fill2() {
596     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
597               (static_cast<uint64_t>(begin_[1]) << 0);
598     begin_ += 2;
599     buffer_len_ += 16;
600   }
Fill3()601   void Fill3() {
602     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
603               (static_cast<uint64_t>(begin_[1]) << 8) |
604               (static_cast<uint64_t>(begin_[2]) << 0);
605     begin_ += 3;
606     buffer_len_ += 24;
607   }
Fill4()608   void Fill4() {
609     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
610               (static_cast<uint64_t>(begin_[1]) << 16) |
611               (static_cast<uint64_t>(begin_[2]) << 8) |
612               (static_cast<uint64_t>(begin_[3]) << 0);
613     begin_ += 4;
614     buffer_len_ += 32;
615   }
Fill5()616   void Fill5() {
617     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
618               (static_cast<uint64_t>(begin_[1]) << 24) |
619               (static_cast<uint64_t>(begin_[2]) << 16) |
620               (static_cast<uint64_t>(begin_[3]) << 8) |
621               (static_cast<uint64_t>(begin_[4]) << 0);
622     begin_ += 5;
623     buffer_len_ += 40;
624   }
Fill6()625   void Fill6() {
626     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
627               (static_cast<uint64_t>(begin_[1]) << 32) |
628               (static_cast<uint64_t>(begin_[2]) << 24) |
629               (static_cast<uint64_t>(begin_[3]) << 16) |
630               (static_cast<uint64_t>(begin_[4]) << 8) |
631               (static_cast<uint64_t>(begin_[5]) << 0);
632     begin_ += 6;
633     buffer_len_ += 48;
634   }
Fill7()635   void Fill7() {
636     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
637               (static_cast<uint64_t>(begin_[1]) << 40) |
638               (static_cast<uint64_t>(begin_[2]) << 32) |
639               (static_cast<uint64_t>(begin_[3]) << 24) |
640               (static_cast<uint64_t>(begin_[4]) << 16) |
641               (static_cast<uint64_t>(begin_[5]) << 8) |
642               (static_cast<uint64_t>(begin_[6]) << 0);
643     begin_ += 7;
644     buffer_len_ += 56;
645   }
Fill8()646   void Fill8() {
647     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
648               (static_cast<uint64_t>(begin_[1]) << 48) |
649               (static_cast<uint64_t>(begin_[2]) << 40) |
650               (static_cast<uint64_t>(begin_[3]) << 32) |
651               (static_cast<uint64_t>(begin_[4]) << 24) |
652               (static_cast<uint64_t>(begin_[5]) << 16) |
653               (static_cast<uint64_t>(begin_[6]) << 8) |
654               (static_cast<uint64_t>(begin_[7]) << 0);
655     begin_ += 8;
656     buffer_len_ += 64;
657   }
Read2to7Bytes()658   bool Read2to7Bytes() {
659     switch (end_ - begin_) {
660       case 0:
661       case 1: {
662         return false;
663       }
664       case 2: {
665         Fill2();
666         return true;
667       }
668       case 3: {
669         Fill3();
670         return true;
671       }
672       case 4: {
673         Fill4();
674         return true;
675       }
676       case 5: {
677         Fill5();
678         return true;
679       }
680       case 6: {
681         Fill6();
682         return true;
683       }
684       default: {
685         Fill7();
686         return true;
687       }
688     }
689   }
Read1to7Bytes()690   bool Read1to7Bytes() {
691     switch (end_ - begin_) {
692       case 0: {
693         return false;
694       }
695       case 1: {
696         Fill1();
697         return true;
698       }
699       case 2: {
700         Fill2();
701         return true;
702       }
703       case 3: {
704         Fill3();
705         return true;
706       }
707       case 4: {
708         Fill4();
709         return true;
710       }
711       case 5: {
712         Fill5();
713         return true;
714       }
715       case 6: {
716         Fill6();
717         return true;
718       }
719       default: {
720         Fill7();
721         return true;
722       }
723     }
724   }
Fill1()725   void Fill1() {
726     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
727     begin_ += 1;
728     buffer_len_ += 8;
729   }
Read1to6Bytes()730   bool Read1to6Bytes() {
731     switch (end_ - begin_) {
732       case 0: {
733         return false;
734       }
735       case 1: {
736         Fill1();
737         return true;
738       }
739       case 2: {
740         Fill2();
741         return true;
742       }
743       case 3: {
744         Fill3();
745         return true;
746       }
747       case 4: {
748         Fill4();
749         return true;
750       }
751       case 5: {
752         Fill5();
753         return true;
754       }
755       default: {
756         Fill6();
757         return true;
758       }
759     }
760   }
Done0()761   void Done0() {
762     done_ = true;
763     switch (end_ - begin_) {
764       case 1: {
765         Fill1();
766         break;
767       }
768     }
769     switch (buffer_len_) {
770       case 1:
771       case 2:
772       case 3:
773       case 4: {
774         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
775         return;
776       }
777       case 5: {
778         const auto index = buffer_ & 31;
779         const auto op = GetOp2(index);
780         switch (op & 3) {
781           case 0: {
782             sink_(GetEmit2(index, (op >> 2) + 0));
783             break;
784           }
785           case 1: {
786             ok_ = false;
787             break;
788           }
789         }
790         return;
791       }
792       case 6: {
793         const auto index = buffer_ & 63;
794         const auto op = GetOp3(index);
795         switch (op & 3) {
796           case 0: {
797             ok_ = false;
798             break;
799           }
800           case 1: {
801             sink_(GetEmit3(index, (op >> 2) + 0));
802             break;
803           }
804         }
805         return;
806       }
807       case 7: {
808         const auto index = buffer_ & 127;
809         const auto op = GetOp4(index);
810         switch (op & 3) {
811           case 0: {
812             ok_ = false;
813             break;
814           }
815           case 1: {
816             sink_(GetEmit4(index, (op >> 2) + 0));
817             break;
818           }
819         }
820         return;
821       }
822       case 8: {
823         const auto index = buffer_ & 255;
824         const auto op = GetOp5(index);
825         switch (op & 3) {
826           case 0: {
827             ok_ = false;
828             break;
829           }
830           case 1: {
831             sink_(GetEmit5(index, (op >> 2) + 0));
832             break;
833           }
834         }
835         return;
836       }
837       case 9: {
838         const auto index = buffer_ & 511;
839         const auto op = GetOp6(index);
840         switch (op & 3) {
841           case 0: {
842             ok_ = false;
843             break;
844           }
845           case 1: {
846             sink_(GetEmit6(index, (op >> 2) + 0));
847             break;
848           }
849         }
850         return;
851       }
852       case 0: {
853         return;
854       }
855     }
856   }
DecodeStep0()857   void DecodeStep0() {
858     if (!RefillTo1()) {
859       Done1();
860       return;
861     }
862     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
863     const auto op = GetOp7(index);
864     const int consumed = op & 1;
865     buffer_len_ -= consumed;
866     const auto emit_ofs = op >> 1;
867     sink_(GetEmit7(index, emit_ofs + 0));
868   }
RefillTo1()869   bool RefillTo1() {
870     switch (buffer_len_) {
871       case 0: {
872         return Read1to8Bytes();
873       }
874     }
875     return true;
876   }
Read1to8Bytes()877   bool Read1to8Bytes() {
878     switch (end_ - begin_) {
879       case 0: {
880         return false;
881       }
882       case 1: {
883         Fill1();
884         return true;
885       }
886       case 2: {
887         Fill2();
888         return true;
889       }
890       case 3: {
891         Fill3();
892         return true;
893       }
894       case 4: {
895         Fill4();
896         return true;
897       }
898       case 5: {
899         Fill5();
900         return true;
901       }
902       case 6: {
903         Fill6();
904         return true;
905       }
906       case 7: {
907         Fill7();
908         return true;
909       }
910       default: {
911         Fill8();
912         return true;
913       }
914     }
915   }
Done1()916   void Done1() {
917     done_ = true;
918     ok_ = false;
919   }
DecodeStep1()920   void DecodeStep1() {
921     if (!RefillTo14()) {
922       Done2();
923       return;
924     }
925     const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff;
926     const auto op = GetOp8(index);
927     const int consumed = op & 15;
928     buffer_len_ -= consumed;
929     const auto emit_ofs = op >> 8;
930     switch ((op >> 4) & 15) {
931       case 0: {
932         sink_(GetEmit8(index, emit_ofs + 0));
933         break;
934       }
935       case 1: {
936         DecodeStep2();
937         break;
938       }
939       case 2: {
940         DecodeStep3();
941         break;
942       }
943       case 3: {
944         DecodeStep4();
945         break;
946       }
947       case 4: {
948         DecodeStep5();
949         break;
950       }
951       case 5: {
952         DecodeStep6();
953         break;
954       }
955       case 6: {
956         DecodeStep10();
957         break;
958       }
959       case 7: {
960         DecodeStep7();
961         break;
962       }
963       case 8: {
964         DecodeStep8();
965         break;
966       }
967       case 9: {
968         DecodeStep9();
969         break;
970       }
971       case 10: {
972         DecodeStep11();
973         break;
974       }
975     }
976   }
RefillTo14()977   bool RefillTo14() {
978     switch (buffer_len_) {
979       case 0: {
980         return Read2to8Bytes();
981       }
982       case 1:
983       case 2:
984       case 3:
985       case 4:
986       case 5: {
987         return Read2to7Bytes();
988       }
989       case 6:
990       case 7:
991       case 8: {
992         return Read1to7Bytes();
993       }
994       case 9:
995       case 10:
996       case 11:
997       case 12:
998       case 13: {
999         return Read1to6Bytes();
1000       }
1001     }
1002     return true;
1003   }
Done2()1004   void Done2() {
1005     done_ = true;
1006     switch (end_ - begin_) {
1007       case 1: {
1008         Fill1();
1009         break;
1010       }
1011     }
1012     switch (buffer_len_) {
1013       case 1:
1014       case 2: {
1015         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1016         return;
1017       }
1018       case 3: {
1019         const auto index = buffer_ & 7;
1020         const auto op = GetOp9(index);
1021         switch (op & 3) {
1022           case 0: {
1023             sink_(GetEmit9(index, (op >> 2) + 0));
1024             break;
1025           }
1026           case 1: {
1027             ok_ = false;
1028             break;
1029           }
1030         }
1031         return;
1032       }
1033       case 4: {
1034         const auto index = buffer_ & 15;
1035         const auto op = GetOp10(index);
1036         switch (op & 3) {
1037           case 0: {
1038             ok_ = false;
1039             break;
1040           }
1041           case 1: {
1042             sink_(GetEmit10(index, (op >> 2) + 0));
1043             break;
1044           }
1045         }
1046         return;
1047       }
1048       case 5: {
1049         const auto index = buffer_ & 31;
1050         const auto op = GetOp11(index);
1051         switch (op & 3) {
1052           case 0: {
1053             ok_ = false;
1054             break;
1055           }
1056           case 1: {
1057             sink_(GetEmit11(index, (op >> 2) + 0));
1058             break;
1059           }
1060         }
1061         return;
1062       }
1063       case 6: {
1064         const auto index = buffer_ & 63;
1065         const auto op = GetOp12(index);
1066         switch (op & 3) {
1067           case 0: {
1068             ok_ = false;
1069             break;
1070           }
1071           case 1: {
1072             sink_(GetEmit12(index, (op >> 2) + 0));
1073             break;
1074           }
1075         }
1076         return;
1077       }
1078       case 7: {
1079         const auto index = buffer_ & 127;
1080         const auto op = GetOp13(index);
1081         switch (op & 3) {
1082           case 0: {
1083             ok_ = false;
1084             break;
1085           }
1086           case 1: {
1087             sink_(GetEmit13(index, (op >> 2) + 0));
1088             break;
1089           }
1090         }
1091         return;
1092       }
1093       case 8: {
1094         const auto index = buffer_ & 255;
1095         const auto op = GetOp14(index);
1096         switch (op & 3) {
1097           case 0: {
1098             sink_(GetEmit14(index, (op >> 2) + 0));
1099             sink_(GetEmit14(index, (op >> 2) + 1));
1100             break;
1101           }
1102           case 1: {
1103             ok_ = false;
1104             break;
1105           }
1106           case 2: {
1107             sink_(GetEmit14(index, (op >> 2) + 0));
1108             break;
1109           }
1110         }
1111         return;
1112       }
1113       case 9: {
1114         const auto index = buffer_ & 511;
1115         const auto op = GetOp15(index);
1116         switch (op & 3) {
1117           case 0: {
1118             ok_ = false;
1119             break;
1120           }
1121           case 1: {
1122             sink_(GetEmit15(index, (op >> 2) + 0));
1123             sink_(GetEmit15(index, (op >> 2) + 1));
1124             break;
1125           }
1126           case 2: {
1127             sink_(GetEmit15(index, (op >> 2) + 0));
1128             break;
1129           }
1130         }
1131         return;
1132       }
1133       case 10: {
1134         const auto index = buffer_ & 1023;
1135         const auto op = GetOp16(index);
1136         switch (op & 3) {
1137           case 0: {
1138             ok_ = false;
1139             break;
1140           }
1141           case 1: {
1142             sink_(GetEmit16(index, (op >> 2) + 0));
1143             sink_(GetEmit16(index, (op >> 2) + 1));
1144             break;
1145           }
1146           case 2: {
1147             sink_(GetEmit16(index, (op >> 2) + 0));
1148             break;
1149           }
1150         }
1151         return;
1152       }
1153       case 11: {
1154         const auto index = buffer_ & 2047;
1155         const auto op = GetOp17(index);
1156         switch (op & 3) {
1157           case 0: {
1158             ok_ = false;
1159             break;
1160           }
1161           case 1: {
1162             sink_(GetEmit17(index, (op >> 2) + 0));
1163             sink_(GetEmit17(index, (op >> 2) + 1));
1164             break;
1165           }
1166           case 2: {
1167             sink_(GetEmit17(index, (op >> 2) + 0));
1168             break;
1169           }
1170         }
1171         return;
1172       }
1173       case 12: {
1174         const auto index = buffer_ & 4095;
1175         const auto op = GetOp18(index);
1176         switch (op & 3) {
1177           case 0: {
1178             ok_ = false;
1179             break;
1180           }
1181           case 1: {
1182             sink_(GetEmit18(index, (op >> 2) + 0));
1183             sink_(GetEmit18(index, (op >> 2) + 1));
1184             break;
1185           }
1186           case 2: {
1187             sink_(GetEmit18(index, (op >> 2) + 0));
1188             break;
1189           }
1190         }
1191         return;
1192       }
1193       case 13: {
1194         const auto index = buffer_ & 8191;
1195         const auto op = GetOp19(index);
1196         switch (op & 7) {
1197           case 0: {
1198             sink_(GetEmit19(index, (op >> 3) + 0));
1199             sink_(GetEmit19(index, (op >> 3) + 1));
1200             sink_(GetEmit19(index, (op >> 3) + 2));
1201             break;
1202           }
1203           case 1: {
1204             ok_ = false;
1205             break;
1206           }
1207           case 2: {
1208             sink_(GetEmit19(index, (op >> 3) + 0));
1209             sink_(GetEmit19(index, (op >> 3) + 1));
1210             break;
1211           }
1212           case 3: {
1213             sink_(GetEmit19(index, (op >> 3) + 0));
1214             break;
1215           }
1216         }
1217         return;
1218       }
1219       case 0: {
1220         return;
1221       }
1222     }
1223   }
DecodeStep2()1224   void DecodeStep2() {
1225     if (!RefillTo1()) {
1226       Done3();
1227       return;
1228     }
1229     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1230     const auto op = GetOp20(index);
1231     const int consumed = op & 1;
1232     buffer_len_ -= consumed;
1233     const auto emit_ofs = op >> 1;
1234     sink_(GetEmit20(index, emit_ofs + 0));
1235   }
Done3()1236   void Done3() {
1237     done_ = true;
1238     ok_ = false;
1239   }
DecodeStep3()1240   void DecodeStep3() {
1241     if (!RefillTo1()) {
1242       Done4();
1243       return;
1244     }
1245     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1246     const auto op = GetOp21(index);
1247     const int consumed = op & 1;
1248     buffer_len_ -= consumed;
1249     const auto emit_ofs = op >> 1;
1250     sink_(GetEmit21(index, emit_ofs + 0));
1251   }
Done4()1252   void Done4() {
1253     done_ = true;
1254     ok_ = false;
1255   }
DecodeStep4()1256   void DecodeStep4() {
1257     if (!RefillTo2()) {
1258       Done5();
1259       return;
1260     }
1261     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1262     const auto op = GetOp22(index);
1263     const int consumed = op & 3;
1264     buffer_len_ -= consumed;
1265     const auto emit_ofs = op >> 2;
1266     sink_(GetEmit22(index, emit_ofs + 0));
1267   }
RefillTo2()1268   bool RefillTo2() {
1269     switch (buffer_len_) {
1270       case 0: {
1271         return Read1to8Bytes();
1272       }
1273       case 1: {
1274         return Read1to7Bytes();
1275       }
1276     }
1277     return true;
1278   }
Done5()1279   void Done5() {
1280     done_ = true;
1281     switch (buffer_len_) {
1282       case 1:
1283       case 0: {
1284         ok_ = false;
1285         return;
1286       }
1287     }
1288   }
DecodeStep5()1289   void DecodeStep5() {
1290     if (!RefillTo2()) {
1291       Done6();
1292       return;
1293     }
1294     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1295     const auto op = GetOp23(index);
1296     const int consumed = op & 3;
1297     buffer_len_ -= consumed;
1298     const auto emit_ofs = op >> 2;
1299     sink_(GetEmit23(index, emit_ofs + 0));
1300   }
Done6()1301   void Done6() {
1302     done_ = true;
1303     switch (buffer_len_) {
1304       case 1:
1305       case 0: {
1306         ok_ = false;
1307         return;
1308       }
1309     }
1310   }
DecodeStep6()1311   void DecodeStep6() {
1312     if (!RefillTo2()) {
1313       Done7();
1314       return;
1315     }
1316     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1317     const auto op = GetOp24(index);
1318     const int consumed = op & 3;
1319     buffer_len_ -= consumed;
1320     const auto emit_ofs = op >> 2;
1321     sink_(GetEmit24(index, emit_ofs + 0));
1322   }
Done7()1323   void Done7() {
1324     done_ = true;
1325     switch (buffer_len_) {
1326       case 1:
1327       case 0: {
1328         ok_ = false;
1329         return;
1330       }
1331     }
1332   }
DecodeStep7()1333   void DecodeStep7() {
1334     if (!RefillTo3()) {
1335       Done8();
1336       return;
1337     }
1338     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1339     const auto op = GetOp25(index);
1340     const int consumed = op & 3;
1341     buffer_len_ -= consumed;
1342     const auto emit_ofs = op >> 2;
1343     sink_(GetEmit25(index, emit_ofs + 0));
1344   }
RefillTo3()1345   bool RefillTo3() {
1346     switch (buffer_len_) {
1347       case 0: {
1348         return Read1to8Bytes();
1349       }
1350       case 1:
1351       case 2: {
1352         return Read1to7Bytes();
1353       }
1354     }
1355     return true;
1356   }
Done8()1357   void Done8() {
1358     done_ = true;
1359     switch (buffer_len_) {
1360       case 1:
1361       case 2:
1362       case 0: {
1363         ok_ = false;
1364         return;
1365       }
1366     }
1367   }
DecodeStep8()1368   void DecodeStep8() {
1369     if (!RefillTo3()) {
1370       Done9();
1371       return;
1372     }
1373     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1374     const auto op = GetOp26(index);
1375     const int consumed = op & 3;
1376     buffer_len_ -= consumed;
1377     const auto emit_ofs = op >> 2;
1378     sink_(GetEmit26(index, emit_ofs + 0));
1379   }
Done9()1380   void Done9() {
1381     done_ = true;
1382     switch (buffer_len_) {
1383       case 1:
1384       case 2:
1385       case 0: {
1386         ok_ = false;
1387         return;
1388       }
1389     }
1390   }
DecodeStep9()1391   void DecodeStep9() {
1392     if (!RefillTo4()) {
1393       Done10();
1394       return;
1395     }
1396     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1397     const auto op = GetOp27(index);
1398     const int consumed = op & 7;
1399     buffer_len_ -= consumed;
1400     const auto emit_ofs = op >> 3;
1401     sink_(GetEmit27(index, emit_ofs + 0));
1402   }
RefillTo4()1403   bool RefillTo4() {
1404     switch (buffer_len_) {
1405       case 0: {
1406         return Read1to8Bytes();
1407       }
1408       case 1:
1409       case 2:
1410       case 3: {
1411         return Read1to7Bytes();
1412       }
1413     }
1414     return true;
1415   }
Done10()1416   void Done10() {
1417     done_ = true;
1418     switch (buffer_len_) {
1419       case 1:
1420       case 2:
1421       case 0: {
1422         ok_ = false;
1423         return;
1424       }
1425       case 3: {
1426         const auto index = buffer_ & 7;
1427         const auto op = GetOp28(index);
1428         switch (op & 1) {
1429           case 0: {
1430             sink_(GetEmit28(index, (op >> 1) + 0));
1431             break;
1432           }
1433           case 1: {
1434             ok_ = false;
1435             break;
1436           }
1437         }
1438         return;
1439       }
1440     }
1441   }
DecodeStep10()1442   void DecodeStep10() {
1443     if (!RefillTo3()) {
1444       Done11();
1445       return;
1446     }
1447     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1448     const auto op = GetOp29(index);
1449     const int consumed = op & 3;
1450     buffer_len_ -= consumed;
1451     const auto emit_ofs = op >> 2;
1452     sink_(GetEmit29(index, emit_ofs + 0));
1453   }
Done11()1454   void Done11() {
1455     done_ = true;
1456     switch (buffer_len_) {
1457       case 1:
1458       case 0: {
1459         ok_ = false;
1460         return;
1461       }
1462       case 2: {
1463         const auto index = buffer_ & 3;
1464         const auto op = GetOp30(index);
1465         switch (op & 1) {
1466           case 0: {
1467             sink_(GetEmit30(index, (op >> 1) + 0));
1468             break;
1469           }
1470           case 1: {
1471             ok_ = false;
1472             break;
1473           }
1474         }
1475         return;
1476       }
1477     }
1478   }
DecodeStep11()1479   void DecodeStep11() {
1480     if (!RefillTo6()) {
1481       Done12();
1482       return;
1483     }
1484     const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f;
1485     const auto op = GetOp31(index);
1486     const int consumed = op & 7;
1487     buffer_len_ -= consumed;
1488     const auto emit_ofs = op >> 4;
1489     switch ((op >> 3) & 1) {
1490       case 0: {
1491         sink_(GetEmit31(index, emit_ofs + 0));
1492         break;
1493       }
1494       case 1: {
1495         begin_ = end_;
1496         buffer_len_ = 0;
1497         break;
1498       }
1499     }
1500   }
RefillTo6()1501   bool RefillTo6() {
1502     switch (buffer_len_) {
1503       case 0: {
1504         return Read1to8Bytes();
1505       }
1506       case 1:
1507       case 2:
1508       case 3:
1509       case 4:
1510       case 5: {
1511         return Read1to7Bytes();
1512       }
1513     }
1514     return true;
1515   }
Done12()1516   void Done12() {
1517     done_ = true;
1518     switch (buffer_len_) {
1519       case 1:
1520       case 2:
1521       case 3: {
1522         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1523         return;
1524       }
1525       case 4: {
1526         const auto index = buffer_ & 15;
1527         const auto op = GetOp32(index);
1528         switch (op & 1) {
1529           case 0: {
1530             sink_(GetEmit32(index, (op >> 1) + 0));
1531             break;
1532           }
1533         }
1534         return;
1535       }
1536       case 5: {
1537         const auto index = buffer_ & 31;
1538         const auto op = GetOp33(index);
1539         switch (op & 3) {
1540           case 0: {
1541             ok_ = false;
1542             break;
1543           }
1544           case 1: {
1545             sink_(GetEmit33(index, (op >> 2) + 0));
1546             break;
1547           }
1548         }
1549         return;
1550       }
1551       case 0: {
1552         return;
1553       }
1554     }
1555   }
DecodeStep12()1556   void DecodeStep12() {
1557     if (!RefillTo2()) {
1558       Done13();
1559       return;
1560     }
1561     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1562     const auto op = GetOp34(index);
1563     const int consumed = op & 3;
1564     buffer_len_ -= consumed;
1565     const auto emit_ofs = op >> 2;
1566     sink_(GetEmit34(index, emit_ofs + 0));
1567   }
Done13()1568   void Done13() {
1569     done_ = true;
1570     switch (buffer_len_) {
1571       case 1: {
1572         const auto index = buffer_ & 1;
1573         const auto op = GetOp35(index);
1574         switch (op & 1) {
1575           case 0: {
1576             sink_(GetEmit35(index, (op >> 1) + 0));
1577             break;
1578           }
1579           case 1: {
1580             ok_ = false;
1581             break;
1582           }
1583         }
1584         return;
1585       }
1586       case 0: {
1587         ok_ = false;
1588         return;
1589       }
1590     }
1591   }
1592   F sink_;
1593   const uint8_t* begin_;
1594   const uint8_t* const end_;
1595   uint64_t buffer_ = 0;
1596   int buffer_len_ = 0;
1597   bool ok_ = true;
1598   bool done_ = false;
1599 };
1600 }  // namespace geometry_10_14_6
1601 }  // namespace grpc_core
1602 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_14_6_H
1603