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