xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_9_6_15.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_9_6_15_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_9_6_15_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_9_6_15 {
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   }
GetOp1(size_t i)48   static inline uint64_t GetOp1(size_t i) {
49     return table1_ops_[i >> 5][i & 0x1f];
50   }
GetEmit1(size_t i,size_t emit)51   static inline uint64_t GetEmit1(size_t i, size_t emit) {
52     return table1_emit_[i >> 5][emit];
53   }
GetOp6(size_t i)54   static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; }
GetEmit6(size_t,size_t emit)55   static inline uint64_t GetEmit6(size_t, size_t emit) { return emit + 33; }
GetOp7(size_t i)56   static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; }
GetEmit7(size_t,size_t emit)57   static inline uint64_t GetEmit7(size_t, size_t emit) { return emit + 40; }
GetOp9(size_t i)58   static inline uint64_t GetOp9(size_t i) { return i; }
GetEmit9(size_t,size_t emit)59   static inline uint64_t GetEmit9(size_t, size_t emit) {
60     return ((void)emit, 63);
61   }
GetOp8(size_t i)62   static inline uint64_t GetOp8(size_t i) {
63     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
64                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
65                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
66   }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return (emit < 1 ? (((void)emit, 63)) : ((emit - 1) ? 43 : 39));
69   }
GetOp11(size_t i)70   static inline uint64_t GetOp11(size_t i) {
71     return (i < 2 ? (i) : ((i - 2) + 1));
72   }
GetEmit11(size_t,size_t emit)73   static inline uint64_t GetEmit11(size_t, size_t emit) {
74     return ((void)emit, 124);
75   }
GetOp12(size_t i)76   static inline uint64_t GetOp12(size_t i) {
77     return table12_0_inner_[table12_0_outer_[i]];
78   }
GetEmit12(size_t,size_t emit)79   static inline uint64_t GetEmit12(size_t, size_t emit) {
80     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) {
83     return table13_0_inner_[table13_0_outer_[i]];
84   }
GetEmit13(size_t,size_t emit)85   static inline uint64_t GetEmit13(size_t, size_t emit) {
86     return table13_0_emit_[emit];
87   }
GetOp14(size_t i)88   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)89   static inline uint64_t GetEmit14(size_t, size_t emit) {
90     return table14_0_emit_[emit];
91   }
GetOp10(size_t i)92   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)93   static inline uint64_t GetEmit10(size_t, size_t emit) {
94     return table10_0_emit_[emit];
95   }
GetOp16(size_t i)96   static inline uint64_t GetOp16(size_t i) {
97     return table16_0_inner_[(i < 3 ? (i) : ((i - 3) / 12 + 3))];
98   }
GetEmit16(size_t,size_t emit)99   static inline uint64_t GetEmit16(size_t, size_t emit) {
100     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
101   }
GetOp17(size_t i)102   static inline uint64_t GetOp17(size_t i) { return table17_0_ops_[i]; }
GetEmit17(size_t,size_t emit)103   static inline uint64_t GetEmit17(size_t, size_t emit) {
104     return table17_0_emit_[emit];
105   }
GetOp18(size_t i)106   static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; }
GetEmit18(size_t,size_t emit)107   static inline uint64_t GetEmit18(size_t, size_t emit) {
108     return table18_0_emit_[emit];
109   }
GetOp19(size_t i)110   static inline uint64_t GetOp19(size_t i) { return table19_0_ops_[i]; }
GetEmit19(size_t,size_t emit)111   static inline uint64_t GetEmit19(size_t, size_t emit) {
112     return table19_0_emit_[emit];
113   }
GetOp20(size_t i)114   static inline uint64_t GetOp20(size_t i) {
115     return table20_ops_[i >> 7][i & 0x7f];
116   }
GetEmit20(size_t i,size_t emit)117   static inline uint64_t GetEmit20(size_t i, size_t emit) {
118     return table20_emit_[i >> 7][emit];
119   }
GetOp21(size_t i)120   static inline uint64_t GetOp21(size_t i) {
121     return table21_ops_[i >> 7][i & 0x7f];
122   }
GetEmit21(size_t i,size_t emit)123   static inline uint64_t GetEmit21(size_t i, size_t emit) {
124     return table21_emit_[i >> 7][emit];
125   }
GetOp22(size_t i)126   static inline uint64_t GetOp22(size_t i) {
127     return table22_ops_[i >> 6][i & 0x3f];
128   }
GetEmit22(size_t i,size_t emit)129   static inline uint64_t GetEmit22(size_t i, size_t emit) {
130     return table22_emit_[i >> 6][emit];
131   }
GetOp23(size_t i)132   static inline uint64_t GetOp23(size_t i) {
133     return table23_ops_[i >> 6][i & 0x3f];
134   }
GetEmit23(size_t i,size_t emit)135   static inline uint64_t GetEmit23(size_t i, size_t emit) {
136     return table23_emit_[i >> 6][emit];
137   }
GetOp24(size_t i)138   static inline uint64_t GetOp24(size_t i) {
139     return table24_ops_[i >> 6][i & 0x3f];
140   }
GetEmit24(size_t i,size_t emit)141   static inline uint64_t GetEmit24(size_t i, size_t emit) {
142     return table24_emit_[i >> 6][emit];
143   }
GetOp25(size_t i)144   static inline uint64_t GetOp25(size_t i) {
145     return table25_ops_[i >> 7][i & 0x7f];
146   }
GetEmit25(size_t i,size_t emit)147   static inline uint64_t GetEmit25(size_t i, size_t emit) {
148     return table25_emit_[i >> 7][emit];
149   }
GetOp26(size_t i)150   static inline uint64_t GetOp26(size_t i) {
151     return table26_ops_[i >> 7][i & 0x7f];
152   }
GetEmit26(size_t i,size_t emit)153   static inline uint64_t GetEmit26(size_t i, size_t emit) {
154     return table26_emit_[i >> 7][emit];
155   }
GetOp15(size_t i)156   static inline uint64_t GetOp15(size_t i) {
157     return table15_ops_[i >> 8][i & 0xff];
158   }
GetEmit15(size_t i,size_t emit)159   static inline uint64_t GetEmit15(size_t i, size_t emit) {
160     return table15_emit_[i >> 8][emit];
161   }
162 
163  private:
164   static const uint8_t table2_0_emit_[10];
165   static const uint8_t table2_0_ops_[32];
166   static const uint8_t table3_0_emit_[36];
167   static const uint8_t table3_0_ops_[64];
168   static const uint8_t table4_0_emit_[22];
169   static const uint8_t table4_0_ops_[64];
170   static const uint8_t table4_1_emit_[46];
171   static const uint8_t table4_1_ops_[64];
172   static const uint8_t* const table4_emit_[2];
173   static const uint8_t* const table4_ops_[2];
174   static const uint8_t table5_0_ops_[128];
175   static const uint8_t table5_1_emit_[52];
176   static const uint8_t table5_1_ops_[128];
177   static const uint8_t* const table5_emit_[2];
178   static const uint8_t* const table5_ops_[2];
179   static const uint8_t table1_0_emit_[2];
180   static const uint16_t table1_0_ops_[32];
181   static const uint8_t table1_1_emit_[2];
182   static const uint8_t table1_2_emit_[2];
183   static const uint8_t table1_3_emit_[2];
184   static const uint8_t table1_4_emit_[2];
185   static const uint8_t table1_5_emit_[4];
186   static const uint16_t table1_5_ops_[32];
187   static const uint8_t table1_6_emit_[4];
188   static const uint8_t table1_7_emit_[4];
189   static const uint8_t table1_8_emit_[4];
190   static const uint8_t table1_9_emit_[4];
191   static const uint8_t table1_10_emit_[4];
192   static const uint8_t table1_11_emit_[6];
193   static const uint16_t table1_11_ops_[32];
194   static const uint8_t table1_12_emit_[8];
195   static const uint16_t table1_12_ops_[32];
196   static const uint8_t table1_13_emit_[8];
197   static const uint8_t table1_14_emit_[8];
198   static const uint8_t table1_15_emit_[10];
199   static const uint16_t table1_15_ops_[32];
200   static const uint8_t* const table1_emit_[16];
201   static const uint16_t* const table1_ops_[16];
202   static const uint8_t table12_0_inner_[5];
203   static const uint8_t table12_0_outer_[8];
204   static const uint8_t table13_0_emit_[9];
205   static const uint8_t table13_0_inner_[11];
206   static const uint8_t table13_0_outer_[16];
207   static const uint8_t table14_0_emit_[11];
208   static const uint8_t table14_0_ops_[32];
209   static const uint8_t table10_0_emit_[14];
210   static const uint8_t table10_0_ops_[64];
211   static const uint8_t table16_0_inner_[5];
212   static const uint8_t table17_0_emit_[11];
213   static const uint8_t table17_0_ops_[32];
214   static const uint8_t table18_0_emit_[24];
215   static const uint8_t table18_0_ops_[64];
216   static const uint8_t table19_0_emit_[50];
217   static const uint8_t table19_0_ops_[128];
218   static const uint8_t table20_0_emit_[15];
219   static const uint8_t table20_0_ops_[128];
220   static const uint8_t table20_1_emit_[64];
221   static const uint8_t table20_1_ops_[128];
222   static const uint8_t* const table20_emit_[2];
223   static const uint8_t* const table20_ops_[2];
224   static const uint8_t table21_0_emit_[62];
225   static const uint8_t table21_0_ops_[128];
226   static const uint8_t table21_1_emit_[10];
227   static const uint8_t table21_1_ops_[128];
228   static const uint8_t table21_2_emit_[23];
229   static const uint8_t table21_2_ops_[128];
230   static const uint8_t table21_3_emit_[53];
231   static const uint8_t table21_3_ops_[128];
232   static const uint8_t* const table21_emit_[4];
233   static const uint8_t* const table21_ops_[4];
234   static const uint8_t table22_0_emit_[72];
235   static const uint16_t table22_0_ops_[64];
236   static const uint8_t table22_1_emit_[72];
237   static const uint8_t table22_2_emit_[72];
238   static const uint8_t table22_3_emit_[40];
239   static const uint16_t table22_3_ops_[64];
240   static const uint8_t table22_4_emit_[40];
241   static const uint8_t table22_5_emit_[40];
242   static const uint8_t table22_6_emit_[40];
243   static const uint8_t table22_7_emit_[4];
244   static const uint16_t table22_7_ops_[64];
245   static const uint8_t table22_8_emit_[4];
246   static const uint8_t table22_9_emit_[4];
247   static const uint8_t table22_10_emit_[7];
248   static const uint16_t table22_10_ops_[64];
249   static const uint8_t table22_11_emit_[8];
250   static const uint16_t table22_11_ops_[64];
251   static const uint8_t table22_12_emit_[8];
252   static const uint8_t table22_13_emit_[12];
253   static const uint16_t table22_13_ops_[64];
254   static const uint8_t table22_14_emit_[16];
255   static const uint16_t table22_14_ops_[64];
256   static const uint8_t table22_15_emit_[21];
257   static const uint16_t table22_15_ops_[64];
258   static const uint8_t* const table22_emit_[16];
259   static const uint16_t* const table22_ops_[16];
260   static const uint8_t table23_0_emit_[44];
261   static const uint16_t table23_0_ops_[64];
262   static const uint8_t table23_1_emit_[92];
263   static const uint16_t table23_1_ops_[64];
264   static const uint8_t table23_2_emit_[44];
265   static const uint8_t table23_3_emit_[92];
266   static const uint8_t table23_4_emit_[44];
267   static const uint8_t table23_5_emit_[92];
268   static const uint8_t table23_6_emit_[72];
269   static const uint8_t table23_7_emit_[72];
270   static const uint8_t table23_8_emit_[72];
271   static const uint8_t table23_9_emit_[72];
272   static const uint8_t table23_10_emit_[72];
273   static const uint8_t table23_11_emit_[72];
274   static const uint8_t table23_12_emit_[72];
275   static const uint8_t table23_13_emit_[72];
276   static const uint8_t table23_14_emit_[40];
277   static const uint8_t table23_15_emit_[40];
278   static const uint8_t table23_16_emit_[40];
279   static const uint8_t table23_17_emit_[40];
280   static const uint8_t table23_18_emit_[40];
281   static const uint8_t table23_19_emit_[40];
282   static const uint8_t table23_20_emit_[22];
283   static const uint16_t table23_20_ops_[64];
284   static const uint8_t table23_21_emit_[4];
285   static const uint8_t table23_22_emit_[4];
286   static const uint8_t table23_23_emit_[4];
287   static const uint8_t table23_24_emit_[4];
288   static const uint8_t table23_25_emit_[4];
289   static const uint8_t table23_26_emit_[4];
290   static const uint8_t table23_27_emit_[8];
291   static const uint8_t table23_28_emit_[8];
292   static const uint8_t table23_29_emit_[8];
293   static const uint8_t table23_30_emit_[11];
294   static const uint16_t table23_30_ops_[64];
295   static const uint8_t table23_31_emit_[25];
296   static const uint16_t table23_31_ops_[64];
297   static const uint8_t* const table23_emit_[32];
298   static const uint16_t* const table23_ops_[32];
299   static const uint8_t table24_0_emit_[16];
300   static const uint16_t table24_0_ops_[64];
301   static const uint8_t table24_1_emit_[28];
302   static const uint16_t table24_1_ops_[64];
303   static const uint8_t table24_2_emit_[36];
304   static const uint16_t table24_2_ops_[64];
305   static const uint8_t table24_3_emit_[68];
306   static const uint16_t table24_3_ops_[64];
307   static const uint8_t table24_4_emit_[16];
308   static const uint8_t table24_5_emit_[28];
309   static const uint8_t table24_6_emit_[36];
310   static const uint8_t table24_7_emit_[68];
311   static const uint8_t table24_8_emit_[16];
312   static const uint8_t table24_9_emit_[28];
313   static const uint8_t table24_10_emit_[36];
314   static const uint8_t table24_11_emit_[68];
315   static const uint8_t table24_12_emit_[44];
316   static const uint8_t table24_13_emit_[92];
317   static const uint8_t table24_14_emit_[44];
318   static const uint8_t table24_15_emit_[92];
319   static const uint8_t table24_16_emit_[44];
320   static const uint8_t table24_17_emit_[92];
321   static const uint8_t table24_18_emit_[44];
322   static const uint8_t table24_19_emit_[92];
323   static const uint8_t table24_20_emit_[44];
324   static const uint8_t table24_21_emit_[92];
325   static const uint8_t table24_22_emit_[44];
326   static const uint8_t table24_23_emit_[92];
327   static const uint8_t table24_24_emit_[44];
328   static const uint8_t table24_25_emit_[92];
329   static const uint8_t table24_26_emit_[44];
330   static const uint8_t table24_27_emit_[92];
331   static const uint8_t table24_28_emit_[72];
332   static const uint8_t table24_29_emit_[72];
333   static const uint8_t table24_30_emit_[72];
334   static const uint8_t table24_31_emit_[72];
335   static const uint8_t table24_32_emit_[72];
336   static const uint8_t table24_33_emit_[72];
337   static const uint8_t table24_34_emit_[72];
338   static const uint8_t table24_35_emit_[72];
339   static const uint8_t table24_36_emit_[72];
340   static const uint8_t table24_37_emit_[72];
341   static const uint8_t table24_38_emit_[72];
342   static const uint8_t table24_39_emit_[72];
343   static const uint8_t table24_40_emit_[72];
344   static const uint8_t table24_41_emit_[40];
345   static const uint8_t table24_42_emit_[40];
346   static const uint8_t table24_43_emit_[40];
347   static const uint8_t table24_44_emit_[40];
348   static const uint8_t table24_45_emit_[40];
349   static const uint8_t table24_46_emit_[40];
350   static const uint8_t table24_47_emit_[40];
351   static const uint8_t table24_48_emit_[40];
352   static const uint8_t table24_49_emit_[40];
353   static const uint8_t table24_50_emit_[40];
354   static const uint8_t table24_51_emit_[40];
355   static const uint8_t table24_52_emit_[40];
356   static const uint8_t table24_53_emit_[40];
357   static const uint8_t table24_54_emit_[4];
358   static const uint8_t table24_55_emit_[4];
359   static const uint8_t table24_56_emit_[4];
360   static const uint8_t table24_57_emit_[4];
361   static const uint8_t table24_58_emit_[4];
362   static const uint8_t table24_59_emit_[4];
363   static const uint8_t table24_60_emit_[4];
364   static const uint8_t table24_61_emit_[7];
365   static const uint8_t table24_62_emit_[10];
366   static const uint16_t table24_62_ops_[64];
367   static const uint8_t table24_63_emit_[34];
368   static const uint16_t table24_63_ops_[64];
369   static const uint8_t* const table24_emit_[64];
370   static const uint16_t* const table24_ops_[64];
371   static const uint16_t table25_0_ops_[128];
372   static const uint16_t table25_1_ops_[128];
373   static const uint16_t table25_2_ops_[128];
374   static const uint16_t table25_3_ops_[128];
375   static const uint16_t table25_12_ops_[128];
376   static const uint8_t table25_13_emit_[104];
377   static const uint16_t table25_13_ops_[128];
378   static const uint8_t table25_15_emit_[104];
379   static const uint8_t table25_17_emit_[104];
380   static const uint8_t table25_19_emit_[104];
381   static const uint8_t table25_21_emit_[104];
382   static const uint8_t table25_23_emit_[104];
383   static const uint8_t table25_25_emit_[104];
384   static const uint8_t table25_27_emit_[104];
385   static const uint8_t table25_28_emit_[136];
386   static const uint16_t table25_28_ops_[128];
387   static const uint8_t table25_29_emit_[136];
388   static const uint8_t table25_30_emit_[136];
389   static const uint8_t table25_31_emit_[136];
390   static const uint8_t table25_32_emit_[136];
391   static const uint8_t table25_33_emit_[136];
392   static const uint8_t table25_34_emit_[136];
393   static const uint8_t table25_35_emit_[136];
394   static const uint8_t table25_36_emit_[136];
395   static const uint8_t table25_37_emit_[136];
396   static const uint8_t table25_38_emit_[136];
397   static const uint8_t table25_39_emit_[136];
398   static const uint8_t table25_40_emit_[136];
399   static const uint8_t table25_41_emit_[144];
400   static const uint16_t table25_41_ops_[128];
401   static const uint8_t table25_42_emit_[144];
402   static const uint8_t table25_43_emit_[144];
403   static const uint8_t table25_44_emit_[144];
404   static const uint8_t table25_45_emit_[144];
405   static const uint8_t table25_46_emit_[144];
406   static const uint8_t table25_47_emit_[144];
407   static const uint8_t table25_48_emit_[144];
408   static const uint8_t table25_49_emit_[144];
409   static const uint8_t table25_50_emit_[144];
410   static const uint8_t table25_51_emit_[144];
411   static const uint8_t table25_52_emit_[144];
412   static const uint8_t table25_53_emit_[144];
413   static const uint8_t table25_54_emit_[80];
414   static const uint16_t table25_54_ops_[128];
415   static const uint8_t table25_55_emit_[80];
416   static const uint8_t table25_56_emit_[80];
417   static const uint8_t table25_57_emit_[80];
418   static const uint8_t table25_58_emit_[80];
419   static const uint8_t table25_59_emit_[80];
420   static const uint8_t table25_60_emit_[80];
421   static const uint8_t table25_61_emit_[26];
422   static const uint16_t table25_61_ops_[128];
423   static const uint16_t table25_62_ops_[128];
424   static const uint8_t table25_63_emit_[63];
425   static const uint16_t table25_63_ops_[128];
426   static const uint8_t* const table25_emit_[64];
427   static const uint16_t* const table25_ops_[64];
428   static const uint8_t table26_0_emit_[120];
429   static const uint16_t table26_0_ops_[128];
430   static const uint8_t table26_1_emit_[120];
431   static const uint8_t table26_2_emit_[68];
432   static const uint16_t table26_2_ops_[128];
433   static const uint8_t table26_3_emit_[16];
434   static const uint16_t table26_3_ops_[128];
435   static const uint8_t table26_4_emit_[16];
436   static const uint8_t table26_5_emit_[20];
437   static const uint16_t table26_5_ops_[128];
438   static const uint8_t table26_6_emit_[32];
439   static const uint16_t table26_6_ops_[128];
440   static const uint8_t table26_7_emit_[46];
441   static const uint16_t table26_7_ops_[128];
442   static const uint8_t table26_8_emit_[120];
443   static const uint8_t table26_9_emit_[120];
444   static const uint8_t table26_10_emit_[68];
445   static const uint8_t table26_11_emit_[16];
446   static const uint8_t table26_12_emit_[16];
447   static const uint8_t table26_13_emit_[20];
448   static const uint8_t table26_14_emit_[32];
449   static const uint8_t table26_15_emit_[46];
450   static const uint8_t table26_16_emit_[120];
451   static const uint8_t table26_17_emit_[120];
452   static const uint8_t table26_18_emit_[68];
453   static const uint8_t table26_19_emit_[16];
454   static const uint8_t table26_20_emit_[16];
455   static const uint8_t table26_21_emit_[20];
456   static const uint8_t table26_22_emit_[32];
457   static const uint8_t table26_23_emit_[46];
458   static const uint8_t table26_24_emit_[16];
459   static const uint8_t table26_25_emit_[28];
460   static const uint16_t table26_25_ops_[128];
461   static const uint8_t table26_26_emit_[36];
462   static const uint16_t table26_26_ops_[128];
463   static const uint8_t table26_27_emit_[68];
464   static const uint16_t table26_27_ops_[128];
465   static const uint8_t table26_28_emit_[16];
466   static const uint8_t table26_29_emit_[28];
467   static const uint8_t table26_30_emit_[36];
468   static const uint8_t table26_31_emit_[68];
469   static const uint8_t table26_32_emit_[16];
470   static const uint8_t table26_33_emit_[28];
471   static const uint8_t table26_34_emit_[36];
472   static const uint8_t table26_35_emit_[68];
473   static const uint8_t table26_36_emit_[16];
474   static const uint8_t table26_37_emit_[28];
475   static const uint8_t table26_38_emit_[36];
476   static const uint8_t table26_39_emit_[68];
477   static const uint8_t table26_40_emit_[16];
478   static const uint8_t table26_41_emit_[28];
479   static const uint8_t table26_42_emit_[36];
480   static const uint8_t table26_43_emit_[68];
481   static const uint8_t table26_44_emit_[16];
482   static const uint8_t table26_45_emit_[28];
483   static const uint8_t table26_46_emit_[36];
484   static const uint8_t table26_47_emit_[68];
485   static const uint8_t table26_48_emit_[16];
486   static const uint8_t table26_49_emit_[28];
487   static const uint8_t table26_50_emit_[36];
488   static const uint8_t table26_51_emit_[68];
489   static const uint8_t table26_52_emit_[16];
490   static const uint8_t table26_53_emit_[28];
491   static const uint8_t table26_54_emit_[36];
492   static const uint8_t table26_55_emit_[68];
493   static const uint8_t table26_56_emit_[44];
494   static const uint16_t table26_56_ops_[128];
495   static const uint8_t table26_57_emit_[104];
496   static const uint16_t table26_57_ops_[128];
497   static const uint8_t table26_58_emit_[44];
498   static const uint8_t table26_59_emit_[104];
499   static const uint8_t table26_60_emit_[44];
500   static const uint8_t table26_61_emit_[104];
501   static const uint8_t table26_62_emit_[44];
502   static const uint8_t table26_63_emit_[104];
503   static const uint8_t table26_64_emit_[44];
504   static const uint8_t table26_65_emit_[104];
505   static const uint8_t table26_66_emit_[44];
506   static const uint8_t table26_67_emit_[104];
507   static const uint8_t table26_68_emit_[44];
508   static const uint8_t table26_69_emit_[104];
509   static const uint8_t table26_70_emit_[44];
510   static const uint8_t table26_71_emit_[104];
511   static const uint8_t table26_72_emit_[44];
512   static const uint8_t table26_73_emit_[104];
513   static const uint8_t table26_74_emit_[44];
514   static const uint8_t table26_75_emit_[104];
515   static const uint8_t table26_76_emit_[44];
516   static const uint8_t table26_77_emit_[104];
517   static const uint8_t table26_78_emit_[44];
518   static const uint8_t table26_79_emit_[104];
519   static const uint8_t table26_80_emit_[44];
520   static const uint8_t table26_81_emit_[104];
521   static const uint8_t table26_82_emit_[136];
522   static const uint16_t table26_82_ops_[128];
523   static const uint8_t table26_83_emit_[136];
524   static const uint8_t table26_84_emit_[136];
525   static const uint8_t table26_85_emit_[136];
526   static const uint8_t table26_86_emit_[136];
527   static const uint8_t table26_87_emit_[136];
528   static const uint8_t table26_88_emit_[136];
529   static const uint8_t table26_89_emit_[136];
530   static const uint8_t table26_90_emit_[136];
531   static const uint8_t table26_91_emit_[136];
532   static const uint8_t table26_92_emit_[136];
533   static const uint8_t table26_93_emit_[136];
534   static const uint8_t table26_94_emit_[136];
535   static const uint8_t table26_95_emit_[136];
536   static const uint8_t table26_96_emit_[136];
537   static const uint8_t table26_97_emit_[136];
538   static const uint8_t table26_98_emit_[136];
539   static const uint8_t table26_99_emit_[136];
540   static const uint8_t table26_100_emit_[136];
541   static const uint8_t table26_101_emit_[136];
542   static const uint8_t table26_102_emit_[136];
543   static const uint8_t table26_103_emit_[136];
544   static const uint8_t table26_104_emit_[136];
545   static const uint8_t table26_105_emit_[136];
546   static const uint8_t table26_106_emit_[136];
547   static const uint8_t table26_107_emit_[136];
548   static const uint8_t table26_108_emit_[144];
549   static const uint16_t table26_108_ops_[128];
550   static const uint8_t table26_109_emit_[144];
551   static const uint8_t table26_110_emit_[144];
552   static const uint8_t table26_111_emit_[144];
553   static const uint8_t table26_112_emit_[144];
554   static const uint8_t table26_113_emit_[144];
555   static const uint8_t table26_114_emit_[144];
556   static const uint8_t table26_115_emit_[144];
557   static const uint8_t table26_116_emit_[144];
558   static const uint8_t table26_117_emit_[144];
559   static const uint8_t table26_118_emit_[144];
560   static const uint8_t table26_119_emit_[144];
561   static const uint8_t table26_120_emit_[144];
562   static const uint8_t table26_121_emit_[144];
563   static const uint8_t table26_122_emit_[112];
564   static const uint16_t table26_122_ops_[128];
565   static const uint8_t table26_123_emit_[80];
566   static const uint16_t table26_123_ops_[128];
567   static const uint8_t table26_124_emit_[80];
568   static const uint8_t table26_125_emit_[44];
569   static const uint16_t table26_125_ops_[128];
570   static const uint8_t table26_126_emit_[17];
571   static const uint16_t table26_126_ops_[128];
572   static const uint8_t table26_127_emit_[46];
573   static const uint16_t table26_127_ops_[128];
574   static const uint8_t* const table26_emit_[128];
575   static const uint16_t* const table26_ops_[128];
576   static const uint8_t table15_0_emit_[1];
577   static const uint16_t table15_0_ops_[256];
578   static const uint8_t table15_8_emit_[1];
579   static const uint8_t table15_16_emit_[1];
580   static const uint8_t table15_24_emit_[1];
581   static const uint16_t table15_24_ops_[256];
582   static const uint8_t table15_28_emit_[1];
583   static const uint8_t table15_32_emit_[1];
584   static const uint8_t table15_36_emit_[1];
585   static const uint8_t table15_40_emit_[1];
586   static const uint8_t table15_44_emit_[1];
587   static const uint8_t table15_48_emit_[1];
588   static const uint8_t table15_52_emit_[1];
589   static const uint8_t table15_56_emit_[1];
590   static const uint16_t table15_56_ops_[256];
591   static const uint8_t table15_58_emit_[1];
592   static const uint8_t table15_60_emit_[1];
593   static const uint8_t table15_62_emit_[1];
594   static const uint8_t table15_64_emit_[1];
595   static const uint8_t table15_66_emit_[1];
596   static const uint8_t table15_68_emit_[1];
597   static const uint8_t table15_70_emit_[1];
598   static const uint8_t table15_72_emit_[1];
599   static const uint8_t table15_74_emit_[1];
600   static const uint8_t table15_76_emit_[1];
601   static const uint8_t table15_78_emit_[1];
602   static const uint8_t table15_80_emit_[1];
603   static const uint8_t table15_82_emit_[1];
604   static const uint16_t table15_82_ops_[256];
605   static const uint8_t table15_83_emit_[1];
606   static const uint8_t table15_84_emit_[1];
607   static const uint8_t table15_85_emit_[1];
608   static const uint8_t table15_86_emit_[1];
609   static const uint8_t table15_87_emit_[1];
610   static const uint8_t table15_88_emit_[1];
611   static const uint8_t table15_89_emit_[1];
612   static const uint8_t table15_90_emit_[1];
613   static const uint8_t table15_91_emit_[1];
614   static const uint8_t table15_92_emit_[1];
615   static const uint8_t table15_93_emit_[1];
616   static const uint8_t table15_94_emit_[1];
617   static const uint8_t table15_95_emit_[1];
618   static const uint8_t table15_96_emit_[1];
619   static const uint8_t table15_97_emit_[1];
620   static const uint8_t table15_98_emit_[1];
621   static const uint8_t table15_99_emit_[1];
622   static const uint8_t table15_100_emit_[1];
623   static const uint8_t table15_101_emit_[1];
624   static const uint8_t table15_102_emit_[1];
625   static const uint8_t table15_103_emit_[1];
626   static const uint8_t table15_104_emit_[1];
627   static const uint8_t table15_105_emit_[1];
628   static const uint8_t table15_106_emit_[1];
629   static const uint8_t table15_107_emit_[1];
630   static const uint8_t table15_108_emit_[2];
631   static const uint16_t table15_108_ops_[256];
632   static const uint8_t table15_109_emit_[2];
633   static const uint8_t table15_110_emit_[2];
634   static const uint8_t table15_111_emit_[2];
635   static const uint8_t table15_112_emit_[2];
636   static const uint8_t table15_113_emit_[2];
637   static const uint8_t table15_114_emit_[2];
638   static const uint8_t table15_115_emit_[2];
639   static const uint8_t table15_116_emit_[2];
640   static const uint8_t table15_117_emit_[2];
641   static const uint8_t table15_118_emit_[2];
642   static const uint8_t table15_119_emit_[2];
643   static const uint8_t table15_120_emit_[2];
644   static const uint8_t table15_121_emit_[2];
645   static const uint8_t table15_122_emit_[3];
646   static const uint16_t table15_122_ops_[256];
647   static const uint8_t table15_123_emit_[4];
648   static const uint16_t table15_123_ops_[256];
649   static const uint8_t table15_124_emit_[4];
650   static const uint8_t table15_125_emit_[6];
651   static const uint16_t table15_125_ops_[256];
652   static const uint16_t table15_126_ops_[256];
653   static const uint8_t table15_127_emit_[49];
654   static const uint16_t table15_127_ops_[256];
655   static const uint8_t* const table15_emit_[128];
656   static const uint16_t* const table15_ops_[128];
657 };
658 template <typename F>
659 class HuffDecoder : public HuffDecoderCommon {
660  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)661   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
662       : sink_(sink), begin_(begin), end_(end) {}
Run()663   bool Run() {
664     while (!done_) {
665       if (!RefillTo9()) {
666         Done0();
667         break;
668       }
669       const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
670       const auto op = GetOp1(index);
671       const int consumed = op & 15;
672       buffer_len_ -= consumed;
673       const auto emit_ofs = op >> 7;
674       switch ((op >> 4) & 7) {
675         case 0: {
676           sink_(GetEmit1(index, emit_ofs + 0));
677           break;
678         }
679         case 1: {
680           DecodeStep0();
681           break;
682         }
683         case 2: {
684           DecodeStep1();
685           break;
686         }
687         case 3: {
688           DecodeStep2();
689           break;
690         }
691         case 4: {
692           DecodeStep3();
693           break;
694         }
695       }
696     }
697     return ok_;
698   }
699 
700  private:
RefillTo9()701   bool RefillTo9() {
702     switch (buffer_len_) {
703       case 0: {
704         return Read2to8Bytes();
705       }
706       case 1:
707       case 2:
708       case 3:
709       case 4:
710       case 5:
711       case 6:
712       case 7:
713       case 8: {
714         return Read1to7Bytes();
715       }
716     }
717     return true;
718   }
Read2to8Bytes()719   bool Read2to8Bytes() {
720     switch (end_ - begin_) {
721       case 0:
722       case 1: {
723         return false;
724       }
725       case 2: {
726         Fill2();
727         return true;
728       }
729       case 3: {
730         Fill3();
731         return true;
732       }
733       case 4: {
734         Fill4();
735         return true;
736       }
737       case 5: {
738         Fill5();
739         return true;
740       }
741       case 6: {
742         Fill6();
743         return true;
744       }
745       case 7: {
746         Fill7();
747         return true;
748       }
749       default: {
750         Fill8();
751         return true;
752       }
753     }
754   }
Fill2()755   void Fill2() {
756     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
757               (static_cast<uint64_t>(begin_[1]) << 0);
758     begin_ += 2;
759     buffer_len_ += 16;
760   }
Fill3()761   void Fill3() {
762     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
763               (static_cast<uint64_t>(begin_[1]) << 8) |
764               (static_cast<uint64_t>(begin_[2]) << 0);
765     begin_ += 3;
766     buffer_len_ += 24;
767   }
Fill4()768   void Fill4() {
769     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
770               (static_cast<uint64_t>(begin_[1]) << 16) |
771               (static_cast<uint64_t>(begin_[2]) << 8) |
772               (static_cast<uint64_t>(begin_[3]) << 0);
773     begin_ += 4;
774     buffer_len_ += 32;
775   }
Fill5()776   void Fill5() {
777     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
778               (static_cast<uint64_t>(begin_[1]) << 24) |
779               (static_cast<uint64_t>(begin_[2]) << 16) |
780               (static_cast<uint64_t>(begin_[3]) << 8) |
781               (static_cast<uint64_t>(begin_[4]) << 0);
782     begin_ += 5;
783     buffer_len_ += 40;
784   }
Fill6()785   void Fill6() {
786     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
787               (static_cast<uint64_t>(begin_[1]) << 32) |
788               (static_cast<uint64_t>(begin_[2]) << 24) |
789               (static_cast<uint64_t>(begin_[3]) << 16) |
790               (static_cast<uint64_t>(begin_[4]) << 8) |
791               (static_cast<uint64_t>(begin_[5]) << 0);
792     begin_ += 6;
793     buffer_len_ += 48;
794   }
Fill7()795   void Fill7() {
796     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
797               (static_cast<uint64_t>(begin_[1]) << 40) |
798               (static_cast<uint64_t>(begin_[2]) << 32) |
799               (static_cast<uint64_t>(begin_[3]) << 24) |
800               (static_cast<uint64_t>(begin_[4]) << 16) |
801               (static_cast<uint64_t>(begin_[5]) << 8) |
802               (static_cast<uint64_t>(begin_[6]) << 0);
803     begin_ += 7;
804     buffer_len_ += 56;
805   }
Fill8()806   void Fill8() {
807     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
808               (static_cast<uint64_t>(begin_[1]) << 48) |
809               (static_cast<uint64_t>(begin_[2]) << 40) |
810               (static_cast<uint64_t>(begin_[3]) << 32) |
811               (static_cast<uint64_t>(begin_[4]) << 24) |
812               (static_cast<uint64_t>(begin_[5]) << 16) |
813               (static_cast<uint64_t>(begin_[6]) << 8) |
814               (static_cast<uint64_t>(begin_[7]) << 0);
815     begin_ += 8;
816     buffer_len_ += 64;
817   }
Read1to7Bytes()818   bool Read1to7Bytes() {
819     switch (end_ - begin_) {
820       case 0: {
821         return false;
822       }
823       case 1: {
824         Fill1();
825         return true;
826       }
827       case 2: {
828         Fill2();
829         return true;
830       }
831       case 3: {
832         Fill3();
833         return true;
834       }
835       case 4: {
836         Fill4();
837         return true;
838       }
839       case 5: {
840         Fill5();
841         return true;
842       }
843       case 6: {
844         Fill6();
845         return true;
846       }
847       default: {
848         Fill7();
849         return true;
850       }
851     }
852   }
Fill1()853   void Fill1() {
854     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
855     begin_ += 1;
856     buffer_len_ += 8;
857   }
Done0()858   void Done0() {
859     done_ = true;
860     switch (end_ - begin_) {
861       case 1: {
862         Fill1();
863         break;
864       }
865     }
866     switch (buffer_len_) {
867       case 1:
868       case 2:
869       case 3:
870       case 4: {
871         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
872         return;
873       }
874       case 5: {
875         const auto index = buffer_ & 31;
876         const auto op = GetOp2(index);
877         switch (op & 3) {
878           case 0: {
879             sink_(GetEmit2(index, (op >> 2) + 0));
880             break;
881           }
882           case 1: {
883             ok_ = false;
884             break;
885           }
886         }
887         return;
888       }
889       case 6: {
890         const auto index = buffer_ & 63;
891         const auto op = GetOp3(index);
892         switch (op & 3) {
893           case 0: {
894             ok_ = false;
895             break;
896           }
897           case 1: {
898             sink_(GetEmit3(index, (op >> 2) + 0));
899             break;
900           }
901         }
902         return;
903       }
904       case 7: {
905         const auto index = buffer_ & 127;
906         const auto op = GetOp4(index);
907         switch (op & 3) {
908           case 0: {
909             ok_ = false;
910             break;
911           }
912           case 1: {
913             sink_(GetEmit4(index, (op >> 2) + 0));
914             break;
915           }
916         }
917         return;
918       }
919       case 8: {
920         const auto index = buffer_ & 255;
921         const auto op = GetOp5(index);
922         switch (op & 3) {
923           case 0: {
924             ok_ = false;
925             break;
926           }
927           case 1: {
928             sink_(GetEmit5(index, (op >> 2) + 0));
929             break;
930           }
931         }
932         return;
933       }
934       case 0: {
935         return;
936       }
937     }
938   }
DecodeStep0()939   void DecodeStep0() {
940     if (!RefillTo1()) {
941       Done1();
942       return;
943     }
944     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
945     const auto op = GetOp6(index);
946     const int consumed = op & 1;
947     buffer_len_ -= consumed;
948     const auto emit_ofs = op >> 1;
949     sink_(GetEmit6(index, emit_ofs + 0));
950   }
RefillTo1()951   bool RefillTo1() {
952     switch (buffer_len_) {
953       case 0: {
954         return Read1to8Bytes();
955       }
956     }
957     return true;
958   }
Read1to8Bytes()959   bool Read1to8Bytes() {
960     switch (end_ - begin_) {
961       case 0: {
962         return false;
963       }
964       case 1: {
965         Fill1();
966         return true;
967       }
968       case 2: {
969         Fill2();
970         return true;
971       }
972       case 3: {
973         Fill3();
974         return true;
975       }
976       case 4: {
977         Fill4();
978         return true;
979       }
980       case 5: {
981         Fill5();
982         return true;
983       }
984       case 6: {
985         Fill6();
986         return true;
987       }
988       case 7: {
989         Fill7();
990         return true;
991       }
992       default: {
993         Fill8();
994         return true;
995       }
996     }
997   }
Done1()998   void Done1() {
999     done_ = true;
1000     ok_ = false;
1001   }
DecodeStep1()1002   void DecodeStep1() {
1003     if (!RefillTo1()) {
1004       Done2();
1005       return;
1006     }
1007     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1008     const auto op = GetOp7(index);
1009     const int consumed = op & 1;
1010     buffer_len_ -= consumed;
1011     const auto emit_ofs = op >> 1;
1012     sink_(GetEmit7(index, emit_ofs + 0));
1013   }
Done2()1014   void Done2() {
1015     done_ = true;
1016     ok_ = false;
1017   }
DecodeStep2()1018   void DecodeStep2() {
1019     if (!RefillTo2()) {
1020       Done3();
1021       return;
1022     }
1023     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1024     const auto op = GetOp8(index);
1025     const int consumed = op & 3;
1026     buffer_len_ -= consumed;
1027     const auto emit_ofs = op >> 2;
1028     sink_(GetEmit8(index, emit_ofs + 0));
1029   }
RefillTo2()1030   bool RefillTo2() {
1031     switch (buffer_len_) {
1032       case 0: {
1033         return Read1to8Bytes();
1034       }
1035       case 1: {
1036         return Read1to7Bytes();
1037       }
1038     }
1039     return true;
1040   }
Done3()1041   void Done3() {
1042     done_ = true;
1043     switch (buffer_len_) {
1044       case 1: {
1045         const auto index = buffer_ & 1;
1046         const auto op = GetOp9(index);
1047         switch (op & 1) {
1048           case 0: {
1049             sink_(GetEmit9(index, (op >> 1) + 0));
1050             break;
1051           }
1052           case 1: {
1053             ok_ = false;
1054             break;
1055           }
1056         }
1057         return;
1058       }
1059       case 0: {
1060         ok_ = false;
1061         return;
1062       }
1063     }
1064   }
DecodeStep3()1065   void DecodeStep3() {
1066     if (!RefillTo6()) {
1067       Done4();
1068       return;
1069     }
1070     const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f;
1071     const auto op = GetOp10(index);
1072     const int consumed = op & 7;
1073     buffer_len_ -= consumed;
1074     const auto emit_ofs = op >> 4;
1075     switch ((op >> 3) & 1) {
1076       case 0: {
1077         sink_(GetEmit10(index, emit_ofs + 0));
1078         break;
1079       }
1080       case 1: {
1081         DecodeStep4();
1082         break;
1083       }
1084     }
1085   }
RefillTo6()1086   bool RefillTo6() {
1087     switch (buffer_len_) {
1088       case 0: {
1089         return Read1to8Bytes();
1090       }
1091       case 1:
1092       case 2:
1093       case 3:
1094       case 4:
1095       case 5: {
1096         return Read1to7Bytes();
1097       }
1098     }
1099     return true;
1100   }
Done4()1101   void Done4() {
1102     done_ = true;
1103     switch (buffer_len_) {
1104       case 1: {
1105         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1106         return;
1107       }
1108       case 2: {
1109         const auto index = buffer_ & 3;
1110         const auto op = GetOp11(index);
1111         switch (op & 3) {
1112           case 0: {
1113             sink_(GetEmit11(index, (op >> 2) + 0));
1114             break;
1115           }
1116           case 1: {
1117             ok_ = false;
1118             break;
1119           }
1120         }
1121         return;
1122       }
1123       case 3: {
1124         const auto index = buffer_ & 7;
1125         const auto op = GetOp12(index);
1126         switch (op & 3) {
1127           case 0: {
1128             ok_ = false;
1129             break;
1130           }
1131           case 1: {
1132             sink_(GetEmit12(index, (op >> 2) + 0));
1133             break;
1134           }
1135         }
1136         return;
1137       }
1138       case 4: {
1139         const auto index = buffer_ & 15;
1140         const auto op = GetOp13(index);
1141         switch (op & 3) {
1142           case 0: {
1143             ok_ = false;
1144             break;
1145           }
1146           case 1: {
1147             sink_(GetEmit13(index, (op >> 2) + 0));
1148             break;
1149           }
1150         }
1151         return;
1152       }
1153       case 5: {
1154         const auto index = buffer_ & 31;
1155         const auto op = GetOp14(index);
1156         switch (op & 3) {
1157           case 0: {
1158             ok_ = false;
1159             break;
1160           }
1161           case 1: {
1162             sink_(GetEmit14(index, (op >> 2) + 0));
1163             break;
1164           }
1165         }
1166         return;
1167       }
1168       case 0: {
1169         return;
1170       }
1171     }
1172   }
DecodeStep4()1173   void DecodeStep4() {
1174     if (!RefillTo15()) {
1175       Done5();
1176       return;
1177     }
1178     const auto index = (buffer_ >> (buffer_len_ - 15)) & 0x7fff;
1179     const auto op = GetOp15(index);
1180     const int consumed = op & 15;
1181     buffer_len_ -= consumed;
1182     const auto emit_ofs = op >> 5;
1183     switch ((op >> 4) & 1) {
1184       case 0: {
1185         sink_(GetEmit15(index, emit_ofs + 0));
1186         break;
1187       }
1188       case 1: {
1189         begin_ = end_;
1190         buffer_len_ = 0;
1191         break;
1192       }
1193     }
1194   }
RefillTo15()1195   bool RefillTo15() {
1196     switch (buffer_len_) {
1197       case 0: {
1198         return Read2to8Bytes();
1199       }
1200       case 1:
1201       case 2:
1202       case 3:
1203       case 4:
1204       case 5:
1205       case 6: {
1206         return Read2to7Bytes();
1207       }
1208       case 7:
1209       case 8: {
1210         return Read1to7Bytes();
1211       }
1212       case 9:
1213       case 10:
1214       case 11:
1215       case 12:
1216       case 13:
1217       case 14: {
1218         return Read1to6Bytes();
1219       }
1220     }
1221     return true;
1222   }
Read2to7Bytes()1223   bool Read2to7Bytes() {
1224     switch (end_ - begin_) {
1225       case 0:
1226       case 1: {
1227         return false;
1228       }
1229       case 2: {
1230         Fill2();
1231         return true;
1232       }
1233       case 3: {
1234         Fill3();
1235         return true;
1236       }
1237       case 4: {
1238         Fill4();
1239         return true;
1240       }
1241       case 5: {
1242         Fill5();
1243         return true;
1244       }
1245       case 6: {
1246         Fill6();
1247         return true;
1248       }
1249       default: {
1250         Fill7();
1251         return true;
1252       }
1253     }
1254   }
Read1to6Bytes()1255   bool Read1to6Bytes() {
1256     switch (end_ - begin_) {
1257       case 0: {
1258         return false;
1259       }
1260       case 1: {
1261         Fill1();
1262         return true;
1263       }
1264       case 2: {
1265         Fill2();
1266         return true;
1267       }
1268       case 3: {
1269         Fill3();
1270         return true;
1271       }
1272       case 4: {
1273         Fill4();
1274         return true;
1275       }
1276       case 5: {
1277         Fill5();
1278         return true;
1279       }
1280       default: {
1281         Fill6();
1282         return true;
1283       }
1284     }
1285   }
Done5()1286   void Done5() {
1287     done_ = true;
1288     switch (end_ - begin_) {
1289       case 1: {
1290         Fill1();
1291         break;
1292       }
1293     }
1294     switch (buffer_len_) {
1295       case 1:
1296       case 2:
1297       case 3: {
1298         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1299         return;
1300       }
1301       case 4: {
1302         const auto index = buffer_ & 15;
1303         const auto op = GetOp16(index);
1304         switch (op & 3) {
1305           case 0: {
1306             sink_(GetEmit16(index, (op >> 2) + 0));
1307             break;
1308           }
1309           case 1: {
1310             ok_ = false;
1311             break;
1312           }
1313         }
1314         return;
1315       }
1316       case 5: {
1317         const auto index = buffer_ & 31;
1318         const auto op = GetOp17(index);
1319         switch (op & 3) {
1320           case 0: {
1321             ok_ = false;
1322             break;
1323           }
1324           case 1: {
1325             sink_(GetEmit17(index, (op >> 2) + 0));
1326             break;
1327           }
1328         }
1329         return;
1330       }
1331       case 6: {
1332         const auto index = buffer_ & 63;
1333         const auto op = GetOp18(index);
1334         switch (op & 3) {
1335           case 0: {
1336             ok_ = false;
1337             break;
1338           }
1339           case 1: {
1340             sink_(GetEmit18(index, (op >> 2) + 0));
1341             break;
1342           }
1343         }
1344         return;
1345       }
1346       case 7: {
1347         const auto index = buffer_ & 127;
1348         const auto op = GetOp19(index);
1349         switch (op & 3) {
1350           case 0: {
1351             ok_ = false;
1352             break;
1353           }
1354           case 1: {
1355             sink_(GetEmit19(index, (op >> 2) + 0));
1356             break;
1357           }
1358         }
1359         return;
1360       }
1361       case 8: {
1362         const auto index = buffer_ & 255;
1363         const auto op = GetOp20(index);
1364         switch (op & 3) {
1365           case 0: {
1366             ok_ = false;
1367             break;
1368           }
1369           case 1: {
1370             sink_(GetEmit20(index, (op >> 2) + 0));
1371             break;
1372           }
1373         }
1374         return;
1375       }
1376       case 9: {
1377         const auto index = buffer_ & 511;
1378         const auto op = GetOp21(index);
1379         switch (op & 3) {
1380           case 0: {
1381             sink_(GetEmit21(index, (op >> 2) + 0));
1382             sink_(GetEmit21(index, (op >> 2) + 1));
1383             break;
1384           }
1385           case 1: {
1386             ok_ = false;
1387             break;
1388           }
1389           case 2: {
1390             sink_(GetEmit21(index, (op >> 2) + 0));
1391             break;
1392           }
1393         }
1394         return;
1395       }
1396       case 10: {
1397         const auto index = buffer_ & 1023;
1398         const auto op = GetOp22(index);
1399         switch (op & 3) {
1400           case 0: {
1401             ok_ = false;
1402             break;
1403           }
1404           case 1: {
1405             sink_(GetEmit22(index, (op >> 2) + 0));
1406             sink_(GetEmit22(index, (op >> 2) + 1));
1407             break;
1408           }
1409           case 2: {
1410             sink_(GetEmit22(index, (op >> 2) + 0));
1411             break;
1412           }
1413         }
1414         return;
1415       }
1416       case 11: {
1417         const auto index = buffer_ & 2047;
1418         const auto op = GetOp23(index);
1419         switch (op & 3) {
1420           case 0: {
1421             ok_ = false;
1422             break;
1423           }
1424           case 1: {
1425             sink_(GetEmit23(index, (op >> 2) + 0));
1426             sink_(GetEmit23(index, (op >> 2) + 1));
1427             break;
1428           }
1429           case 2: {
1430             sink_(GetEmit23(index, (op >> 2) + 0));
1431             break;
1432           }
1433         }
1434         return;
1435       }
1436       case 12: {
1437         const auto index = buffer_ & 4095;
1438         const auto op = GetOp24(index);
1439         switch (op & 3) {
1440           case 0: {
1441             ok_ = false;
1442             break;
1443           }
1444           case 1: {
1445             sink_(GetEmit24(index, (op >> 2) + 0));
1446             sink_(GetEmit24(index, (op >> 2) + 1));
1447             break;
1448           }
1449           case 2: {
1450             sink_(GetEmit24(index, (op >> 2) + 0));
1451             break;
1452           }
1453         }
1454         return;
1455       }
1456       case 13: {
1457         const auto index = buffer_ & 8191;
1458         const auto op = GetOp25(index);
1459         switch (op & 3) {
1460           case 0: {
1461             ok_ = false;
1462             break;
1463           }
1464           case 1: {
1465             sink_(GetEmit25(index, (op >> 2) + 0));
1466             sink_(GetEmit25(index, (op >> 2) + 1));
1467             break;
1468           }
1469           case 2: {
1470             sink_(GetEmit25(index, (op >> 2) + 0));
1471             break;
1472           }
1473         }
1474         return;
1475       }
1476       case 14: {
1477         const auto index = buffer_ & 16383;
1478         const auto op = GetOp26(index);
1479         switch (op & 7) {
1480           case 0: {
1481             sink_(GetEmit26(index, (op >> 3) + 0));
1482             sink_(GetEmit26(index, (op >> 3) + 1));
1483             sink_(GetEmit26(index, (op >> 3) + 2));
1484             break;
1485           }
1486           case 1: {
1487             ok_ = false;
1488             break;
1489           }
1490           case 2: {
1491             sink_(GetEmit26(index, (op >> 3) + 0));
1492             sink_(GetEmit26(index, (op >> 3) + 1));
1493             break;
1494           }
1495           case 3: {
1496             sink_(GetEmit26(index, (op >> 3) + 0));
1497             break;
1498           }
1499         }
1500         return;
1501       }
1502       case 0: {
1503         return;
1504       }
1505     }
1506   }
1507   F sink_;
1508   const uint8_t* begin_;
1509   const uint8_t* const end_;
1510   uint64_t buffer_ = 0;
1511   int buffer_len_ = 0;
1512   bool ok_ = true;
1513   bool done_ = false;
1514 };
1515 }  // namespace geometry_9_6_15
1516 }  // namespace grpc_core
1517 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_9_6_15_H
1518