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