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