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