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