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