xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_12_5_13.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // This file is autogenerated: see
16 // tools/codegen/core/gen_huffman_decompressor.cc
17 
18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_5_13_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_5_13_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_12_5_13 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp6(size_t i)48   static inline uint64_t GetOp6(size_t i) {
49     return table6_ops_[i >> 5][i & 0x1f];
50   }
GetEmit6(size_t i,size_t emit)51   static inline uint64_t GetEmit6(size_t i, size_t emit) {
52     return table6_emit_[i >> 5][emit];
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return table7_ops_[i >> 6][i & 0x3f];
56   }
GetEmit7(size_t i,size_t emit)57   static inline uint64_t GetEmit7(size_t i, size_t emit) {
58     return table7_emit_[i >> 6][emit];
59   }
GetOp8(size_t i)60   static inline uint64_t GetOp8(size_t i) {
61     return table8_inner_[i >> 6][table8_outer_[i >> 6][i & 0x3f]];
62   }
GetEmit8(size_t i,size_t emit)63   static inline uint64_t GetEmit8(size_t i, size_t emit) {
64     return table8_emit_[i >> 6][emit];
65   }
GetOp1(size_t i)66   static inline uint64_t GetOp1(size_t i) {
67     return table1_inner_[i >> 7][table1_outer_[i >> 7][i & 0x7f]];
68   }
GetEmit1(size_t i,size_t emit)69   static inline uint64_t GetEmit1(size_t i, size_t emit) {
70     return table1_emit_[i >> 7][emit];
71   }
GetOp9(size_t i)72   static inline uint64_t GetOp9(size_t i) { return i ? 3 : 1; }
GetEmit9(size_t,size_t emit)73   static inline uint64_t GetEmit9(size_t, size_t emit) { return emit ? 36 : 0; }
GetOp10(size_t i)74   static inline uint64_t GetOp10(size_t i) { return i ? 3 : 1; }
GetEmit10(size_t,size_t emit)75   static inline uint64_t GetEmit10(size_t, size_t emit) {
76     return emit ? 91 : 64;
77   }
GetOp11(size_t i)78   static inline uint64_t GetOp11(size_t i) { return i ? 3 : 1; }
GetEmit11(size_t,size_t emit)79   static inline uint64_t GetEmit11(size_t, size_t emit) {
80     return emit ? 126 : 93;
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) {
83     return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1));
84   }
GetEmit13(size_t,size_t emit)85   static inline uint64_t GetEmit13(size_t, size_t emit) {
86     return emit ? 125 : 94;
87   }
GetOp14(size_t i)88   static inline uint64_t GetOp14(size_t i) {
89     return table14_0_inner_[table14_0_outer_[i]];
90   }
GetEmit14(size_t,size_t emit)91   static inline uint64_t GetEmit14(size_t, size_t emit) {
92     return table14_0_emit_[emit];
93   }
GetOp15(size_t i)94   static inline uint64_t GetOp15(size_t i) {
95     return table14_0_inner_[table15_0_outer_[i]];
96   }
GetEmit15(size_t,size_t emit)97   static inline uint64_t GetEmit15(size_t, size_t emit) {
98     return table14_0_emit_[emit];
99   }
GetOp12(size_t i)100   static inline uint64_t GetOp12(size_t i) {
101     return table12_0_inner_[table12_0_outer_[i]];
102   }
GetEmit12(size_t,size_t emit)103   static inline uint64_t GetEmit12(size_t, size_t emit) {
104     return table14_0_emit_[emit];
105   }
GetOp17(size_t i)106   static inline uint64_t GetOp17(size_t i) {
107     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
108   }
GetEmit17(size_t,size_t emit)109   static inline uint64_t GetEmit17(size_t, size_t emit) {
110     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
111   }
GetOp16(size_t i)112   static inline uint64_t GetOp16(size_t i) {
113     return table16_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))];
114   }
GetEmit16(size_t,size_t emit)115   static inline uint64_t GetEmit16(size_t, size_t emit) {
116     return table16_0_emit_[emit];
117   }
GetOp19(size_t i)118   static inline uint64_t GetOp19(size_t i) {
119     return table19_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))];
120   }
GetEmit19(size_t,size_t emit)121   static inline uint64_t GetEmit19(size_t, size_t emit) {
122     return table19_0_emit_[emit];
123   }
GetOp18(size_t i)124   static inline uint64_t GetOp18(size_t i) {
125     return table18_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))];
126   }
GetEmit18(size_t,size_t emit)127   static inline uint64_t GetEmit18(size_t, size_t emit) {
128     return table18_0_emit_[emit];
129   }
GetOp21(size_t i)130   static inline uint64_t GetOp21(size_t i) {
131     return table21_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))];
132   }
GetEmit21(size_t,size_t emit)133   static inline uint64_t GetEmit21(size_t, size_t emit) {
134     return table21_0_emit_[emit];
135   }
GetOp20(size_t i)136   static inline uint64_t GetOp20(size_t i) { return table20_0_ops_[i]; }
GetEmit20(size_t,size_t emit)137   static inline uint64_t GetEmit20(size_t, size_t emit) {
138     return table20_0_emit_[emit];
139   }
GetOp23(size_t i)140   static inline uint64_t GetOp23(size_t i) { return table23_0_ops_[i]; }
GetEmit23(size_t,size_t emit)141   static inline uint64_t GetEmit23(size_t, size_t emit) {
142     return table23_0_emit_[emit];
143   }
GetOp24(size_t i)144   static inline uint64_t GetOp24(size_t i) { return table24_0_ops_[i]; }
GetEmit24(size_t,size_t emit)145   static inline uint64_t GetEmit24(size_t, size_t emit) {
146     return table24_0_emit_[emit];
147   }
GetOp25(size_t i)148   static inline uint64_t GetOp25(size_t i) { return table25_0_ops_[i]; }
GetEmit25(size_t,size_t emit)149   static inline uint64_t GetEmit25(size_t, size_t emit) {
150     return table25_0_emit_[emit];
151   }
GetOp26(size_t i)152   static inline uint64_t GetOp26(size_t i) { return table26_0_ops_[i]; }
GetEmit26(size_t,size_t emit)153   static inline uint64_t GetEmit26(size_t, size_t emit) {
154     return table26_0_emit_[emit];
155   }
GetOp27(size_t i)156   static inline uint64_t GetOp27(size_t i) {
157     return table27_ops_[i >> 6][i & 0x3f];
158   }
GetEmit27(size_t i,size_t emit)159   static inline uint64_t GetEmit27(size_t i, size_t emit) {
160     return table27_emit_[i >> 6][emit];
161   }
GetOp28(size_t i)162   static inline uint64_t GetOp28(size_t i) {
163     return table28_ops_[i >> 6][i & 0x3f];
164   }
GetEmit28(size_t i,size_t emit)165   static inline uint64_t GetEmit28(size_t i, size_t emit) {
166     return table28_emit_[i >> 6][emit];
167   }
GetOp29(size_t i)168   static inline uint64_t GetOp29(size_t i) {
169     return table29_ops_[i >> 7][i & 0x7f];
170   }
GetEmit29(size_t i,size_t emit)171   static inline uint64_t GetEmit29(size_t i, size_t emit) {
172     return table29_emit_[i >> 7][emit];
173   }
GetOp30(size_t i)174   static inline uint64_t GetOp30(size_t i) {
175     return table30_ops_[i >> 7][i & 0x7f];
176   }
GetEmit30(size_t i,size_t emit)177   static inline uint64_t GetEmit30(size_t i, size_t emit) {
178     return table30_emit_[i >> 7][emit];
179   }
GetOp22(size_t i)180   static inline uint64_t GetOp22(size_t i) {
181     return table22_ops_[i >> 7][i & 0x7f];
182   }
GetEmit22(size_t i,size_t emit)183   static inline uint64_t GetEmit22(size_t i, size_t emit) {
184     return table22_emit_[i >> 7][emit];
185   }
186 
187  private:
188   static const uint8_t table2_0_emit_[10];
189   static const uint8_t table2_0_ops_[32];
190   static const uint8_t table3_0_emit_[36];
191   static const uint8_t table3_0_ops_[64];
192   static const uint8_t table4_0_emit_[22];
193   static const uint8_t table4_0_ops_[64];
194   static const uint8_t table4_1_emit_[46];
195   static const uint8_t table4_1_ops_[64];
196   static const uint8_t* const table4_emit_[2];
197   static const uint8_t* const table4_ops_[2];
198   static const uint8_t table5_0_ops_[128];
199   static const uint8_t table5_1_emit_[52];
200   static const uint8_t table5_1_ops_[128];
201   static const uint8_t* const table5_emit_[2];
202   static const uint8_t* const table5_ops_[2];
203   static const uint8_t table6_0_emit_[2];
204   static const uint8_t table6_0_ops_[32];
205   static const uint8_t table6_1_emit_[2];
206   static const uint8_t table6_2_emit_[2];
207   static const uint8_t table6_3_emit_[2];
208   static const uint8_t table6_4_emit_[2];
209   static const uint8_t table6_5_emit_[4];
210   static const uint8_t table6_5_ops_[32];
211   static const uint8_t table6_6_emit_[4];
212   static const uint8_t table6_7_emit_[4];
213   static const uint8_t table6_8_emit_[4];
214   static const uint8_t table6_9_emit_[4];
215   static const uint8_t table6_10_emit_[4];
216   static const uint8_t table6_11_emit_[6];
217   static const uint8_t table6_11_ops_[32];
218   static const uint8_t table6_12_emit_[8];
219   static const uint8_t table6_12_ops_[32];
220   static const uint8_t table6_13_emit_[8];
221   static const uint8_t table6_14_emit_[8];
222   static const uint8_t table6_15_emit_[10];
223   static const uint8_t table6_15_ops_[32];
224   static const uint8_t* const table6_emit_[16];
225   static const uint8_t* const table6_ops_[16];
226   static const uint8_t table7_0_emit_[36];
227   static const uint8_t table7_0_ops_[64];
228   static const uint8_t table7_1_emit_[36];
229   static const uint8_t table7_1_ops_[64];
230   static const uint8_t table7_2_emit_[36];
231   static const uint8_t table7_2_ops_[64];
232   static const uint8_t table7_3_emit_[36];
233   static const uint8_t table7_3_ops_[64];
234   static const uint8_t table7_4_emit_[38];
235   static const uint8_t table7_4_ops_[64];
236   static const uint8_t table7_5_ops_[64];
237   static const uint8_t table7_11_ops_[64];
238   static const uint8_t table7_12_ops_[64];
239   static const uint8_t table7_15_emit_[15];
240   static const uint8_t table7_15_ops_[64];
241   static const uint8_t* const table7_emit_[16];
242   static const uint8_t* const table7_ops_[16];
243   static const uint8_t table8_0_emit_[71];
244   static const uint16_t table8_0_inner_[38];
245   static const uint8_t table8_0_outer_[64];
246   static const uint8_t table8_1_emit_[71];
247   static const uint16_t table8_1_inner_[38];
248   static const uint8_t table8_2_emit_[71];
249   static const uint16_t table8_2_inner_[38];
250   static const uint8_t table8_3_emit_[71];
251   static const uint16_t table8_3_inner_[38];
252   static const uint8_t table8_4_emit_[71];
253   static const uint16_t table8_4_inner_[38];
254   static const uint8_t table8_5_emit_[71];
255   static const uint16_t table8_5_inner_[38];
256   static const uint8_t table8_6_emit_[71];
257   static const uint16_t table8_6_inner_[38];
258   static const uint8_t table8_7_emit_[71];
259   static const uint16_t table8_7_inner_[38];
260   static const uint8_t table8_8_emit_[71];
261   static const uint16_t table8_8_inner_[38];
262   static const uint8_t table8_9_emit_[71];
263   static const uint16_t table8_9_inner_[38];
264   static const uint8_t table8_10_emit_[40];
265   static const uint16_t table8_10_inner_[23];
266   static const uint8_t table8_10_outer_[64];
267   static const uint8_t table8_11_emit_[40];
268   static const uint8_t table8_12_emit_[40];
269   static const uint8_t table8_13_emit_[40];
270   static const uint8_t table8_14_emit_[40];
271   static const uint8_t table8_15_emit_[40];
272   static const uint8_t table8_16_emit_[40];
273   static const uint8_t table8_17_emit_[40];
274   static const uint8_t table8_18_emit_[40];
275   static const uint8_t table8_19_emit_[40];
276   static const uint8_t table8_20_emit_[40];
277   static const uint8_t table8_21_emit_[40];
278   static const uint8_t table8_22_emit_[40];
279   static const uint8_t table8_23_emit_[4];
280   static const uint16_t table8_23_inner_[5];
281   static const uint8_t table8_23_outer_[64];
282   static const uint8_t table8_24_emit_[4];
283   static const uint8_t table8_25_emit_[4];
284   static const uint8_t table8_26_emit_[4];
285   static const uint8_t table8_27_emit_[4];
286   static const uint8_t table8_28_emit_[4];
287   static const uint8_t table8_29_emit_[4];
288   static const uint8_t table8_30_emit_[4];
289   static const uint8_t table8_31_emit_[14];
290   static const uint16_t table8_31_inner_[16];
291   static const uint8_t table8_31_outer_[64];
292   static const uint8_t* const table8_emit_[32];
293   static const uint16_t* const table8_inner_[32];
294   static const uint8_t* const table8_outer_[32];
295   static const uint8_t table1_0_emit_[135];
296   static const uint16_t table1_0_inner_[69];
297   static const uint8_t table1_0_outer_[128];
298   static const uint8_t table1_1_emit_[135];
299   static const uint16_t table1_1_inner_[69];
300   static const uint8_t table1_2_emit_[135];
301   static const uint16_t table1_2_inner_[69];
302   static const uint8_t table1_3_emit_[135];
303   static const uint16_t table1_3_inner_[69];
304   static const uint8_t table1_4_emit_[135];
305   static const uint16_t table1_4_inner_[69];
306   static const uint8_t table1_5_emit_[135];
307   static const uint16_t table1_5_inner_[69];
308   static const uint8_t table1_6_emit_[135];
309   static const uint16_t table1_6_inner_[69];
310   static const uint8_t table1_7_emit_[135];
311   static const uint16_t table1_7_inner_[69];
312   static const uint8_t table1_8_emit_[135];
313   static const uint16_t table1_8_inner_[69];
314   static const uint8_t table1_9_emit_[135];
315   static const uint16_t table1_9_inner_[69];
316   static const uint8_t table1_10_emit_[140];
317   static const uint16_t table1_10_inner_[74];
318   static const uint8_t table1_10_outer_[128];
319   static const uint8_t table1_11_emit_[140];
320   static const uint16_t table1_11_inner_[74];
321   static const uint8_t table1_12_emit_[140];
322   static const uint16_t table1_12_inner_[74];
323   static const uint8_t table1_13_emit_[140];
324   static const uint16_t table1_13_inner_[74];
325   static const uint8_t table1_14_emit_[140];
326   static const uint16_t table1_14_inner_[74];
327   static const uint8_t table1_15_emit_[140];
328   static const uint16_t table1_15_inner_[74];
329   static const uint8_t table1_16_emit_[140];
330   static const uint16_t table1_16_inner_[74];
331   static const uint8_t table1_17_emit_[140];
332   static const uint16_t table1_17_inner_[74];
333   static const uint8_t table1_18_emit_[140];
334   static const uint16_t table1_18_inner_[74];
335   static const uint8_t table1_19_emit_[140];
336   static const uint16_t table1_19_inner_[74];
337   static const uint8_t table1_20_emit_[140];
338   static const uint16_t table1_20_inner_[74];
339   static const uint8_t table1_21_emit_[140];
340   static const uint16_t table1_21_inner_[74];
341   static const uint8_t table1_22_emit_[142];
342   static const uint16_t table1_22_inner_[74];
343   static const uint8_t table1_23_emit_[80];
344   static const uint16_t table1_23_inner_[44];
345   static const uint8_t table1_23_outer_[128];
346   static const uint8_t table1_24_emit_[80];
347   static const uint8_t table1_25_emit_[80];
348   static const uint8_t table1_26_emit_[80];
349   static const uint8_t table1_27_emit_[80];
350   static const uint8_t table1_28_emit_[80];
351   static const uint8_t table1_29_emit_[80];
352   static const uint8_t table1_30_emit_[80];
353   static const uint8_t table1_31_emit_[16];
354   static const uint16_t table1_31_inner_[20];
355   static const uint8_t table1_31_outer_[128];
356   static const uint8_t* const table1_emit_[32];
357   static const uint16_t* const table1_inner_[32];
358   static const uint8_t* const table1_outer_[32];
359   static const uint8_t table14_0_emit_[5];
360   static const uint8_t table14_0_inner_[7];
361   static const uint8_t table14_0_outer_[8];
362   static const uint8_t table15_0_outer_[16];
363   static const uint16_t table12_0_inner_[9];
364   static const uint8_t table12_0_outer_[32];
365   static const uint8_t table16_0_emit_[5];
366   static const uint8_t table16_0_inner_[5];
367   static const uint8_t table19_0_emit_[6];
368   static const uint8_t table19_0_inner_[7];
369   static const uint8_t table18_0_emit_[10];
370   static const uint8_t table18_0_inner_[10];
371   static const uint8_t table21_0_emit_[9];
372   static const uint8_t table21_0_inner_[10];
373   static const uint8_t table20_0_emit_[23];
374   static const uint8_t table20_0_ops_[32];
375   static const uint8_t table23_0_emit_[12];
376   static const uint8_t table23_0_ops_[32];
377   static const uint8_t table24_0_emit_[41];
378   static const uint8_t table24_0_ops_[64];
379   static const uint8_t table25_0_emit_[53];
380   static const uint8_t table25_0_ops_[128];
381   static const uint8_t table26_0_emit_[57];
382   static const uint8_t table26_0_ops_[256];
383   static const uint8_t table27_0_emit_[4];
384   static const uint8_t table27_0_ops_[64];
385   static const uint8_t table27_1_emit_[4];
386   static const uint8_t table27_2_emit_[4];
387   static const uint8_t table27_3_emit_[8];
388   static const uint8_t table27_3_ops_[64];
389   static const uint8_t table27_4_emit_[8];
390   static const uint8_t table27_5_emit_[8];
391   static const uint8_t table27_6_emit_[11];
392   static const uint8_t table27_6_ops_[64];
393   static const uint8_t table27_7_emit_[25];
394   static const uint8_t table27_7_ops_[64];
395   static const uint8_t* const table27_emit_[8];
396   static const uint8_t* const table27_ops_[8];
397   static const uint8_t table28_0_emit_[40];
398   static const uint8_t table28_0_ops_[64];
399   static const uint8_t table28_1_emit_[40];
400   static const uint8_t table28_2_emit_[40];
401   static const uint8_t table28_3_emit_[40];
402   static const uint8_t table28_4_emit_[40];
403   static const uint8_t table28_5_emit_[40];
404   static const uint8_t table28_6_emit_[4];
405   static const uint8_t table28_7_emit_[4];
406   static const uint8_t table28_8_emit_[4];
407   static const uint8_t table28_9_emit_[4];
408   static const uint8_t table28_10_emit_[4];
409   static const uint8_t table28_11_emit_[4];
410   static const uint8_t table28_12_emit_[4];
411   static const uint8_t table28_13_emit_[7];
412   static const uint8_t table28_13_ops_[64];
413   static const uint8_t table28_14_emit_[10];
414   static const uint8_t table28_14_ops_[64];
415   static const uint8_t table28_15_emit_[34];
416   static const uint8_t table28_15_ops_[64];
417   static const uint8_t* const table28_emit_[16];
418   static const uint8_t* const table28_ops_[16];
419   static const uint8_t table29_0_emit_[144];
420   static const uint16_t table29_0_ops_[128];
421   static const uint8_t table29_1_emit_[144];
422   static const uint8_t table29_2_emit_[144];
423   static const uint8_t table29_3_emit_[144];
424   static const uint8_t table29_4_emit_[144];
425   static const uint8_t table29_5_emit_[144];
426   static const uint8_t table29_6_emit_[80];
427   static const uint16_t table29_6_ops_[128];
428   static const uint8_t table29_7_emit_[80];
429   static const uint8_t table29_8_emit_[80];
430   static const uint8_t table29_9_emit_[80];
431   static const uint8_t table29_10_emit_[80];
432   static const uint8_t table29_11_emit_[80];
433   static const uint8_t table29_12_emit_[80];
434   static const uint8_t table29_13_emit_[26];
435   static const uint16_t table29_13_ops_[128];
436   static const uint16_t table29_14_ops_[128];
437   static const uint8_t table29_15_emit_[63];
438   static const uint16_t table29_15_ops_[128];
439   static const uint8_t* const table29_emit_[16];
440   static const uint16_t* const table29_ops_[16];
441   static const uint8_t table30_0_emit_[136];
442   static const uint16_t table30_0_ops_[128];
443   static const uint8_t table30_1_emit_[136];
444   static const uint8_t table30_2_emit_[136];
445   static const uint8_t table30_3_emit_[136];
446   static const uint8_t table30_4_emit_[136];
447   static const uint8_t table30_5_emit_[136];
448   static const uint8_t table30_6_emit_[136];
449   static const uint8_t table30_7_emit_[136];
450   static const uint8_t table30_8_emit_[136];
451   static const uint8_t table30_9_emit_[136];
452   static const uint8_t table30_10_emit_[136];
453   static const uint8_t table30_11_emit_[136];
454   static const uint8_t table30_12_emit_[144];
455   static const uint8_t table30_13_emit_[144];
456   static const uint8_t table30_14_emit_[144];
457   static const uint8_t table30_15_emit_[144];
458   static const uint8_t table30_16_emit_[144];
459   static const uint8_t table30_17_emit_[144];
460   static const uint8_t table30_18_emit_[144];
461   static const uint8_t table30_19_emit_[144];
462   static const uint8_t table30_20_emit_[144];
463   static const uint8_t table30_21_emit_[144];
464   static const uint8_t table30_22_emit_[144];
465   static const uint8_t table30_23_emit_[144];
466   static const uint8_t table30_24_emit_[144];
467   static const uint8_t table30_25_emit_[144];
468   static const uint8_t table30_26_emit_[112];
469   static const uint16_t table30_26_ops_[128];
470   static const uint8_t table30_27_emit_[80];
471   static const uint8_t table30_28_emit_[80];
472   static const uint8_t table30_29_emit_[44];
473   static const uint16_t table30_29_ops_[128];
474   static const uint8_t table30_30_emit_[17];
475   static const uint16_t table30_30_ops_[128];
476   static const uint8_t table30_31_emit_[46];
477   static const uint16_t table30_31_ops_[128];
478   static const uint8_t* const table30_emit_[32];
479   static const uint16_t* const table30_ops_[32];
480   static const uint8_t table22_0_emit_[1];
481   static const uint16_t table22_0_ops_[128];
482   static const uint8_t table22_2_emit_[1];
483   static const uint8_t table22_4_emit_[1];
484   static const uint8_t table22_6_emit_[1];
485   static const uint8_t table22_8_emit_[1];
486   static const uint8_t table22_10_emit_[1];
487   static const uint8_t table22_12_emit_[1];
488   static const uint8_t table22_14_emit_[1];
489   static const uint8_t table22_16_emit_[1];
490   static const uint8_t table22_18_emit_[1];
491   static const uint8_t table22_20_emit_[1];
492   static const uint8_t table22_22_emit_[1];
493   static const uint8_t table22_24_emit_[1];
494   static const uint16_t table22_24_ops_[128];
495   static const uint8_t table22_25_emit_[1];
496   static const uint8_t table22_26_emit_[1];
497   static const uint8_t table22_27_emit_[1];
498   static const uint8_t table22_28_emit_[1];
499   static const uint8_t table22_29_emit_[1];
500   static const uint8_t table22_30_emit_[1];
501   static const uint8_t table22_31_emit_[1];
502   static const uint8_t table22_32_emit_[1];
503   static const uint8_t table22_33_emit_[1];
504   static const uint8_t table22_34_emit_[1];
505   static const uint8_t table22_35_emit_[1];
506   static const uint8_t table22_36_emit_[1];
507   static const uint8_t table22_37_emit_[1];
508   static const uint8_t table22_38_emit_[1];
509   static const uint8_t table22_39_emit_[1];
510   static const uint8_t table22_40_emit_[1];
511   static const uint8_t table22_41_emit_[1];
512   static const uint8_t table22_42_emit_[1];
513   static const uint8_t table22_43_emit_[1];
514   static const uint8_t table22_44_emit_[1];
515   static const uint8_t table22_45_emit_[1];
516   static const uint8_t table22_46_emit_[1];
517   static const uint8_t table22_47_emit_[1];
518   static const uint8_t table22_48_emit_[1];
519   static const uint8_t table22_49_emit_[1];
520   static const uint8_t table22_50_emit_[1];
521   static const uint8_t table22_51_emit_[1];
522   static const uint8_t table22_52_emit_[1];
523   static const uint8_t table22_53_emit_[2];
524   static const uint16_t table22_53_ops_[128];
525   static const uint8_t table22_54_emit_[2];
526   static const uint8_t table22_55_emit_[2];
527   static const uint8_t table22_56_emit_[2];
528   static const uint8_t table22_57_emit_[2];
529   static const uint8_t table22_58_emit_[2];
530   static const uint8_t table22_59_emit_[4];
531   static const uint16_t table22_59_ops_[128];
532   static const uint8_t table22_60_emit_[8];
533   static const uint16_t table22_60_ops_[128];
534   static const uint8_t table22_61_emit_[9];
535   static const uint16_t table22_61_ops_[128];
536   static const uint8_t table22_62_emit_[16];
537   static const uint16_t table22_62_ops_[128];
538   static const uint8_t table22_63_emit_[33];
539   static const uint16_t table22_63_ops_[128];
540   static const uint8_t* const table22_emit_[64];
541   static const uint16_t* const table22_ops_[64];
542 };
543 template <typename F>
544 class HuffDecoder : public HuffDecoderCommon {
545  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)546   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
547       : sink_(sink), begin_(begin), end_(end) {}
Run()548   bool Run() {
549     while (!done_) {
550       if (!RefillTo12()) {
551         Done0();
552         break;
553       }
554       const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff;
555       const auto op = GetOp1(index);
556       const int consumed = op & 15;
557       buffer_len_ -= consumed;
558       const auto emit_ofs = op >> 7;
559       switch ((op >> 4) & 7) {
560         case 0: {
561           sink_(GetEmit1(index, emit_ofs + 0));
562           sink_(GetEmit1(index, emit_ofs + 1));
563           break;
564         }
565         case 1: {
566           sink_(GetEmit1(index, emit_ofs + 0));
567           break;
568         }
569         case 2: {
570           DecodeStep0();
571           break;
572         }
573         case 3: {
574           DecodeStep1();
575           break;
576         }
577         case 4: {
578           DecodeStep2();
579           break;
580         }
581         case 5: {
582           DecodeStep3();
583           break;
584         }
585       }
586     }
587     return ok_;
588   }
589 
590  private:
RefillTo12()591   bool RefillTo12() {
592     switch (buffer_len_) {
593       case 0: {
594         return Read2to8Bytes();
595       }
596       case 1:
597       case 2:
598       case 3: {
599         return Read2to7Bytes();
600       }
601       case 4:
602       case 5:
603       case 6:
604       case 7:
605       case 8: {
606         return Read1to7Bytes();
607       }
608       case 9:
609       case 10:
610       case 11: {
611         return Read1to6Bytes();
612       }
613     }
614     return true;
615   }
Read2to8Bytes()616   bool Read2to8Bytes() {
617     switch (end_ - begin_) {
618       case 0:
619       case 1: {
620         return false;
621       }
622       case 2: {
623         Fill2();
624         return true;
625       }
626       case 3: {
627         Fill3();
628         return true;
629       }
630       case 4: {
631         Fill4();
632         return true;
633       }
634       case 5: {
635         Fill5();
636         return true;
637       }
638       case 6: {
639         Fill6();
640         return true;
641       }
642       case 7: {
643         Fill7();
644         return true;
645       }
646       default: {
647         Fill8();
648         return true;
649       }
650     }
651   }
Fill2()652   void Fill2() {
653     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
654               (static_cast<uint64_t>(begin_[1]) << 0);
655     begin_ += 2;
656     buffer_len_ += 16;
657   }
Fill3()658   void Fill3() {
659     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
660               (static_cast<uint64_t>(begin_[1]) << 8) |
661               (static_cast<uint64_t>(begin_[2]) << 0);
662     begin_ += 3;
663     buffer_len_ += 24;
664   }
Fill4()665   void Fill4() {
666     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
667               (static_cast<uint64_t>(begin_[1]) << 16) |
668               (static_cast<uint64_t>(begin_[2]) << 8) |
669               (static_cast<uint64_t>(begin_[3]) << 0);
670     begin_ += 4;
671     buffer_len_ += 32;
672   }
Fill5()673   void Fill5() {
674     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
675               (static_cast<uint64_t>(begin_[1]) << 24) |
676               (static_cast<uint64_t>(begin_[2]) << 16) |
677               (static_cast<uint64_t>(begin_[3]) << 8) |
678               (static_cast<uint64_t>(begin_[4]) << 0);
679     begin_ += 5;
680     buffer_len_ += 40;
681   }
Fill6()682   void Fill6() {
683     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
684               (static_cast<uint64_t>(begin_[1]) << 32) |
685               (static_cast<uint64_t>(begin_[2]) << 24) |
686               (static_cast<uint64_t>(begin_[3]) << 16) |
687               (static_cast<uint64_t>(begin_[4]) << 8) |
688               (static_cast<uint64_t>(begin_[5]) << 0);
689     begin_ += 6;
690     buffer_len_ += 48;
691   }
Fill7()692   void Fill7() {
693     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
694               (static_cast<uint64_t>(begin_[1]) << 40) |
695               (static_cast<uint64_t>(begin_[2]) << 32) |
696               (static_cast<uint64_t>(begin_[3]) << 24) |
697               (static_cast<uint64_t>(begin_[4]) << 16) |
698               (static_cast<uint64_t>(begin_[5]) << 8) |
699               (static_cast<uint64_t>(begin_[6]) << 0);
700     begin_ += 7;
701     buffer_len_ += 56;
702   }
Fill8()703   void Fill8() {
704     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
705               (static_cast<uint64_t>(begin_[1]) << 48) |
706               (static_cast<uint64_t>(begin_[2]) << 40) |
707               (static_cast<uint64_t>(begin_[3]) << 32) |
708               (static_cast<uint64_t>(begin_[4]) << 24) |
709               (static_cast<uint64_t>(begin_[5]) << 16) |
710               (static_cast<uint64_t>(begin_[6]) << 8) |
711               (static_cast<uint64_t>(begin_[7]) << 0);
712     begin_ += 8;
713     buffer_len_ += 64;
714   }
Read2to7Bytes()715   bool Read2to7Bytes() {
716     switch (end_ - begin_) {
717       case 0:
718       case 1: {
719         return false;
720       }
721       case 2: {
722         Fill2();
723         return true;
724       }
725       case 3: {
726         Fill3();
727         return true;
728       }
729       case 4: {
730         Fill4();
731         return true;
732       }
733       case 5: {
734         Fill5();
735         return true;
736       }
737       case 6: {
738         Fill6();
739         return true;
740       }
741       default: {
742         Fill7();
743         return true;
744       }
745     }
746   }
Read1to7Bytes()747   bool Read1to7Bytes() {
748     switch (end_ - begin_) {
749       case 0: {
750         return false;
751       }
752       case 1: {
753         Fill1();
754         return true;
755       }
756       case 2: {
757         Fill2();
758         return true;
759       }
760       case 3: {
761         Fill3();
762         return true;
763       }
764       case 4: {
765         Fill4();
766         return true;
767       }
768       case 5: {
769         Fill5();
770         return true;
771       }
772       case 6: {
773         Fill6();
774         return true;
775       }
776       default: {
777         Fill7();
778         return true;
779       }
780     }
781   }
Fill1()782   void Fill1() {
783     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
784     begin_ += 1;
785     buffer_len_ += 8;
786   }
Read1to6Bytes()787   bool Read1to6Bytes() {
788     switch (end_ - begin_) {
789       case 0: {
790         return false;
791       }
792       case 1: {
793         Fill1();
794         return true;
795       }
796       case 2: {
797         Fill2();
798         return true;
799       }
800       case 3: {
801         Fill3();
802         return true;
803       }
804       case 4: {
805         Fill4();
806         return true;
807       }
808       case 5: {
809         Fill5();
810         return true;
811       }
812       default: {
813         Fill6();
814         return true;
815       }
816     }
817   }
Done0()818   void Done0() {
819     done_ = true;
820     switch (end_ - begin_) {
821       case 1: {
822         Fill1();
823         break;
824       }
825     }
826     switch (buffer_len_) {
827       case 1:
828       case 2:
829       case 3:
830       case 4: {
831         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
832         return;
833       }
834       case 5: {
835         const auto index = buffer_ & 31;
836         const auto op = GetOp2(index);
837         switch (op & 3) {
838           case 0: {
839             sink_(GetEmit2(index, (op >> 2) + 0));
840             break;
841           }
842           case 1: {
843             ok_ = false;
844             break;
845           }
846         }
847         return;
848       }
849       case 6: {
850         const auto index = buffer_ & 63;
851         const auto op = GetOp3(index);
852         switch (op & 3) {
853           case 0: {
854             ok_ = false;
855             break;
856           }
857           case 1: {
858             sink_(GetEmit3(index, (op >> 2) + 0));
859             break;
860           }
861         }
862         return;
863       }
864       case 7: {
865         const auto index = buffer_ & 127;
866         const auto op = GetOp4(index);
867         switch (op & 3) {
868           case 0: {
869             ok_ = false;
870             break;
871           }
872           case 1: {
873             sink_(GetEmit4(index, (op >> 2) + 0));
874             break;
875           }
876         }
877         return;
878       }
879       case 8: {
880         const auto index = buffer_ & 255;
881         const auto op = GetOp5(index);
882         switch (op & 3) {
883           case 0: {
884             ok_ = false;
885             break;
886           }
887           case 1: {
888             sink_(GetEmit5(index, (op >> 2) + 0));
889             break;
890           }
891         }
892         return;
893       }
894       case 9: {
895         const auto index = buffer_ & 511;
896         const auto op = GetOp6(index);
897         switch (op & 3) {
898           case 0: {
899             ok_ = false;
900             break;
901           }
902           case 1: {
903             sink_(GetEmit6(index, (op >> 2) + 0));
904             break;
905           }
906         }
907         return;
908       }
909       case 10: {
910         const auto index = buffer_ & 1023;
911         const auto op = GetOp7(index);
912         switch (op & 3) {
913           case 0: {
914             sink_(GetEmit7(index, (op >> 2) + 0));
915             sink_(GetEmit7(index, (op >> 2) + 1));
916             break;
917           }
918           case 1: {
919             ok_ = false;
920             break;
921           }
922           case 2: {
923             sink_(GetEmit7(index, (op >> 2) + 0));
924             break;
925           }
926         }
927         return;
928       }
929       case 11: {
930         const auto index = buffer_ & 2047;
931         const auto op = GetOp8(index);
932         switch (op & 3) {
933           case 0: {
934             ok_ = false;
935             break;
936           }
937           case 1: {
938             sink_(GetEmit8(index, (op >> 2) + 0));
939             sink_(GetEmit8(index, (op >> 2) + 1));
940             break;
941           }
942           case 2: {
943             sink_(GetEmit8(index, (op >> 2) + 0));
944             break;
945           }
946         }
947         return;
948       }
949       case 0: {
950         return;
951       }
952     }
953   }
DecodeStep0()954   void DecodeStep0() {
955     if (!RefillTo1()) {
956       Done1();
957       return;
958     }
959     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
960     const auto op = GetOp9(index);
961     const int consumed = op & 1;
962     buffer_len_ -= consumed;
963     const auto emit_ofs = op >> 1;
964     sink_(GetEmit9(index, emit_ofs + 0));
965   }
RefillTo1()966   bool RefillTo1() {
967     switch (buffer_len_) {
968       case 0: {
969         return Read1to8Bytes();
970       }
971     }
972     return true;
973   }
Read1to8Bytes()974   bool Read1to8Bytes() {
975     switch (end_ - begin_) {
976       case 0: {
977         return false;
978       }
979       case 1: {
980         Fill1();
981         return true;
982       }
983       case 2: {
984         Fill2();
985         return true;
986       }
987       case 3: {
988         Fill3();
989         return true;
990       }
991       case 4: {
992         Fill4();
993         return true;
994       }
995       case 5: {
996         Fill5();
997         return true;
998       }
999       case 6: {
1000         Fill6();
1001         return true;
1002       }
1003       case 7: {
1004         Fill7();
1005         return true;
1006       }
1007       default: {
1008         Fill8();
1009         return true;
1010       }
1011     }
1012   }
Done1()1013   void Done1() {
1014     done_ = true;
1015     ok_ = false;
1016   }
DecodeStep1()1017   void DecodeStep1() {
1018     if (!RefillTo1()) {
1019       Done2();
1020       return;
1021     }
1022     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1023     const auto op = GetOp10(index);
1024     const int consumed = op & 1;
1025     buffer_len_ -= consumed;
1026     const auto emit_ofs = op >> 1;
1027     sink_(GetEmit10(index, emit_ofs + 0));
1028   }
Done2()1029   void Done2() {
1030     done_ = true;
1031     ok_ = false;
1032   }
DecodeStep2()1033   void DecodeStep2() {
1034     if (!RefillTo1()) {
1035       Done3();
1036       return;
1037     }
1038     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1039     const auto op = GetOp11(index);
1040     const int consumed = op & 1;
1041     buffer_len_ -= consumed;
1042     const auto emit_ofs = op >> 1;
1043     sink_(GetEmit11(index, emit_ofs + 0));
1044   }
Done3()1045   void Done3() {
1046     done_ = true;
1047     ok_ = false;
1048   }
DecodeStep3()1049   void DecodeStep3() {
1050     if (!RefillTo5()) {
1051       Done4();
1052       return;
1053     }
1054     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1055     const auto op = GetOp12(index);
1056     const int consumed = op & 7;
1057     buffer_len_ -= consumed;
1058     const auto emit_ofs = op >> 6;
1059     switch ((op >> 3) & 7) {
1060       case 0: {
1061         sink_(GetEmit12(index, emit_ofs + 0));
1062         break;
1063       }
1064       case 1: {
1065         DecodeStep4();
1066         break;
1067       }
1068       case 2: {
1069         DecodeStep5();
1070         break;
1071       }
1072       case 3: {
1073         DecodeStep6();
1074         break;
1075       }
1076       case 4: {
1077         DecodeStep7();
1078         break;
1079       }
1080     }
1081   }
RefillTo5()1082   bool RefillTo5() {
1083     switch (buffer_len_) {
1084       case 0: {
1085         return Read1to8Bytes();
1086       }
1087       case 1:
1088       case 2:
1089       case 3:
1090       case 4: {
1091         return Read1to7Bytes();
1092       }
1093     }
1094     return true;
1095   }
Done4()1096   void Done4() {
1097     done_ = true;
1098     switch (buffer_len_) {
1099       case 1: {
1100         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1101         return;
1102       }
1103       case 2: {
1104         const auto index = buffer_ & 3;
1105         const auto op = GetOp13(index);
1106         switch (op & 3) {
1107           case 0: {
1108             sink_(GetEmit13(index, (op >> 2) + 0));
1109             break;
1110           }
1111           case 1: {
1112             ok_ = false;
1113             break;
1114           }
1115         }
1116         return;
1117       }
1118       case 3: {
1119         const auto index = buffer_ & 7;
1120         const auto op = GetOp14(index);
1121         switch (op & 3) {
1122           case 0: {
1123             ok_ = false;
1124             break;
1125           }
1126           case 1: {
1127             sink_(GetEmit14(index, (op >> 2) + 0));
1128             break;
1129           }
1130         }
1131         return;
1132       }
1133       case 4: {
1134         const auto index = buffer_ & 15;
1135         const auto op = GetOp15(index);
1136         switch (op & 3) {
1137           case 0: {
1138             ok_ = false;
1139             break;
1140           }
1141           case 1: {
1142             sink_(GetEmit15(index, (op >> 2) + 0));
1143             break;
1144           }
1145         }
1146         return;
1147       }
1148       case 0: {
1149         return;
1150       }
1151     }
1152   }
DecodeStep4()1153   void DecodeStep4() {
1154     if (!RefillTo3()) {
1155       Done5();
1156       return;
1157     }
1158     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1159     const auto op = GetOp16(index);
1160     const int consumed = op & 3;
1161     buffer_len_ -= consumed;
1162     const auto emit_ofs = op >> 2;
1163     sink_(GetEmit16(index, emit_ofs + 0));
1164   }
RefillTo3()1165   bool RefillTo3() {
1166     switch (buffer_len_) {
1167       case 0: {
1168         return Read1to8Bytes();
1169       }
1170       case 1:
1171       case 2: {
1172         return Read1to7Bytes();
1173       }
1174     }
1175     return true;
1176   }
Done5()1177   void Done5() {
1178     done_ = true;
1179     switch (buffer_len_) {
1180       case 1:
1181       case 0: {
1182         ok_ = false;
1183         return;
1184       }
1185       case 2: {
1186         const auto index = buffer_ & 3;
1187         const auto op = GetOp17(index);
1188         switch (op & 1) {
1189           case 0: {
1190             sink_(GetEmit17(index, (op >> 1) + 0));
1191             break;
1192           }
1193           case 1: {
1194             ok_ = false;
1195             break;
1196           }
1197         }
1198         return;
1199       }
1200     }
1201   }
DecodeStep5()1202   void DecodeStep5() {
1203     if (!RefillTo4()) {
1204       Done6();
1205       return;
1206     }
1207     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1208     const auto op = GetOp18(index);
1209     const int consumed = op & 7;
1210     buffer_len_ -= consumed;
1211     const auto emit_ofs = op >> 3;
1212     sink_(GetEmit18(index, emit_ofs + 0));
1213   }
RefillTo4()1214   bool RefillTo4() {
1215     switch (buffer_len_) {
1216       case 0: {
1217         return Read1to8Bytes();
1218       }
1219       case 1:
1220       case 2:
1221       case 3: {
1222         return Read1to7Bytes();
1223       }
1224     }
1225     return true;
1226   }
Done6()1227   void Done6() {
1228     done_ = true;
1229     switch (buffer_len_) {
1230       case 1:
1231       case 2:
1232       case 0: {
1233         ok_ = false;
1234         return;
1235       }
1236       case 3: {
1237         const auto index = buffer_ & 7;
1238         const auto op = GetOp19(index);
1239         switch (op & 1) {
1240           case 0: {
1241             sink_(GetEmit19(index, (op >> 1) + 0));
1242             break;
1243           }
1244           case 1: {
1245             ok_ = false;
1246             break;
1247           }
1248         }
1249         return;
1250       }
1251     }
1252   }
DecodeStep6()1253   void DecodeStep6() {
1254     if (!RefillTo5()) {
1255       Done7();
1256       return;
1257     }
1258     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1259     const auto op = GetOp20(index);
1260     const int consumed = op & 7;
1261     buffer_len_ -= consumed;
1262     const auto emit_ofs = op >> 3;
1263     sink_(GetEmit20(index, emit_ofs + 0));
1264   }
Done7()1265   void Done7() {
1266     done_ = true;
1267     switch (buffer_len_) {
1268       case 1:
1269       case 2:
1270       case 3:
1271       case 0: {
1272         ok_ = false;
1273         return;
1274       }
1275       case 4: {
1276         const auto index = buffer_ & 15;
1277         const auto op = GetOp21(index);
1278         switch (op & 1) {
1279           case 0: {
1280             sink_(GetEmit21(index, (op >> 1) + 0));
1281             break;
1282           }
1283           case 1: {
1284             ok_ = false;
1285             break;
1286           }
1287         }
1288         return;
1289       }
1290     }
1291   }
DecodeStep7()1292   void DecodeStep7() {
1293     if (!RefillTo13()) {
1294       Done8();
1295       return;
1296     }
1297     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
1298     const auto op = GetOp22(index);
1299     const int consumed = op & 15;
1300     buffer_len_ -= consumed;
1301     const auto emit_ofs = op >> 5;
1302     switch ((op >> 4) & 1) {
1303       case 0: {
1304         sink_(GetEmit22(index, emit_ofs + 0));
1305         break;
1306       }
1307       case 1: {
1308         begin_ = end_;
1309         buffer_len_ = 0;
1310         break;
1311       }
1312     }
1313   }
RefillTo13()1314   bool RefillTo13() {
1315     switch (buffer_len_) {
1316       case 0: {
1317         return Read2to8Bytes();
1318       }
1319       case 1:
1320       case 2:
1321       case 3:
1322       case 4: {
1323         return Read2to7Bytes();
1324       }
1325       case 5:
1326       case 6:
1327       case 7:
1328       case 8: {
1329         return Read1to7Bytes();
1330       }
1331       case 9:
1332       case 10:
1333       case 11:
1334       case 12: {
1335         return Read1to6Bytes();
1336       }
1337     }
1338     return true;
1339   }
Done8()1340   void Done8() {
1341     done_ = true;
1342     switch (end_ - begin_) {
1343       case 1: {
1344         Fill1();
1345         break;
1346       }
1347     }
1348     switch (buffer_len_) {
1349       case 1:
1350       case 2:
1351       case 3:
1352       case 4: {
1353         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1354         return;
1355       }
1356       case 5: {
1357         const auto index = buffer_ & 31;
1358         const auto op = GetOp23(index);
1359         switch (op & 3) {
1360           case 0: {
1361             sink_(GetEmit23(index, (op >> 2) + 0));
1362             break;
1363           }
1364           case 1: {
1365             ok_ = false;
1366             break;
1367           }
1368         }
1369         return;
1370       }
1371       case 6: {
1372         const auto index = buffer_ & 63;
1373         const auto op = GetOp24(index);
1374         switch (op & 3) {
1375           case 0: {
1376             ok_ = false;
1377             break;
1378           }
1379           case 1: {
1380             sink_(GetEmit24(index, (op >> 2) + 0));
1381             break;
1382           }
1383         }
1384         return;
1385       }
1386       case 7: {
1387         const auto index = buffer_ & 127;
1388         const auto op = GetOp25(index);
1389         switch (op & 3) {
1390           case 0: {
1391             ok_ = false;
1392             break;
1393           }
1394           case 1: {
1395             sink_(GetEmit25(index, (op >> 2) + 0));
1396             break;
1397           }
1398         }
1399         return;
1400       }
1401       case 8: {
1402         const auto index = buffer_ & 255;
1403         const auto op = GetOp26(index);
1404         switch (op & 3) {
1405           case 0: {
1406             ok_ = false;
1407             break;
1408           }
1409           case 1: {
1410             sink_(GetEmit26(index, (op >> 2) + 0));
1411             break;
1412           }
1413         }
1414         return;
1415       }
1416       case 9: {
1417         const auto index = buffer_ & 511;
1418         const auto op = GetOp27(index);
1419         switch (op & 3) {
1420           case 0: {
1421             ok_ = false;
1422             break;
1423           }
1424           case 1: {
1425             sink_(GetEmit27(index, (op >> 2) + 0));
1426             break;
1427           }
1428         }
1429         return;
1430       }
1431       case 10: {
1432         const auto index = buffer_ & 1023;
1433         const auto op = GetOp28(index);
1434         switch (op & 3) {
1435           case 0: {
1436             sink_(GetEmit28(index, (op >> 2) + 0));
1437             sink_(GetEmit28(index, (op >> 2) + 1));
1438             break;
1439           }
1440           case 1: {
1441             ok_ = false;
1442             break;
1443           }
1444           case 2: {
1445             sink_(GetEmit28(index, (op >> 2) + 0));
1446             break;
1447           }
1448         }
1449         return;
1450       }
1451       case 11: {
1452         const auto index = buffer_ & 2047;
1453         const auto op = GetOp29(index);
1454         switch (op & 3) {
1455           case 0: {
1456             ok_ = false;
1457             break;
1458           }
1459           case 1: {
1460             sink_(GetEmit29(index, (op >> 2) + 0));
1461             sink_(GetEmit29(index, (op >> 2) + 1));
1462             break;
1463           }
1464           case 2: {
1465             sink_(GetEmit29(index, (op >> 2) + 0));
1466             break;
1467           }
1468         }
1469         return;
1470       }
1471       case 12: {
1472         const auto index = buffer_ & 4095;
1473         const auto op = GetOp30(index);
1474         switch (op & 3) {
1475           case 0: {
1476             ok_ = false;
1477             break;
1478           }
1479           case 1: {
1480             sink_(GetEmit30(index, (op >> 2) + 0));
1481             sink_(GetEmit30(index, (op >> 2) + 1));
1482             break;
1483           }
1484           case 2: {
1485             sink_(GetEmit30(index, (op >> 2) + 0));
1486             break;
1487           }
1488         }
1489         return;
1490       }
1491       case 0: {
1492         return;
1493       }
1494     }
1495   }
1496   F sink_;
1497   const uint8_t* begin_;
1498   const uint8_t* const end_;
1499   uint64_t buffer_ = 0;
1500   int buffer_len_ = 0;
1501   bool ok_ = true;
1502   bool done_ = false;
1503 };
1504 }  // namespace geometry_12_5_13
1505 }  // namespace grpc_core
1506 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_5_13_H
1507