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