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