xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_9_10_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_9_10_11_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_9_10_11_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_9_10_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   }
GetOp5(size_t i)42   static inline uint64_t GetOp5(size_t i) {
43     return table5_ops_[i >> 7][i & 0x7f];
44   }
GetEmit5(size_t i,size_t emit)45   static inline uint64_t GetEmit5(size_t i, size_t emit) {
46     return table5_emit_[i >> 7][emit];
47   }
GetOp1(size_t i)48   static inline uint64_t GetOp1(size_t i) {
49     return table1_ops_[i >> 5][i & 0x1f];
50   }
GetEmit1(size_t i,size_t emit)51   static inline uint64_t GetEmit1(size_t i, size_t emit) {
52     return table1_emit_[i >> 5][emit];
53   }
GetOp6(size_t i)54   static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; }
GetEmit6(size_t,size_t emit)55   static inline uint64_t GetEmit6(size_t, size_t emit) { return emit + 33; }
GetOp7(size_t i)56   static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; }
GetEmit7(size_t,size_t emit)57   static inline uint64_t GetEmit7(size_t, size_t emit) { return emit + 40; }
GetOp9(size_t i)58   static inline uint64_t GetOp9(size_t i) { return i; }
GetEmit9(size_t,size_t emit)59   static inline uint64_t GetEmit9(size_t, size_t emit) {
60     return ((void)emit, 63);
61   }
GetOp8(size_t i)62   static inline uint64_t GetOp8(size_t i) {
63     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
64                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
65                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
66   }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return (emit < 1 ? (((void)emit, 63)) : ((emit - 1) ? 43 : 39));
69   }
GetOp11(size_t i)70   static inline uint64_t GetOp11(size_t i) {
71     return (i < 2 ? (i) : ((i - 2) + 1));
72   }
GetEmit11(size_t,size_t emit)73   static inline uint64_t GetEmit11(size_t, size_t emit) {
74     return ((void)emit, 124);
75   }
GetOp12(size_t i)76   static inline uint64_t GetOp12(size_t i) {
77     return table12_0_inner_[table12_0_outer_[i]];
78   }
GetEmit12(size_t,size_t emit)79   static inline uint64_t GetEmit12(size_t, size_t emit) {
80     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) {
83     return table13_0_inner_[table13_0_outer_[i]];
84   }
GetEmit13(size_t,size_t emit)85   static inline uint64_t GetEmit13(size_t, size_t emit) {
86     return table13_0_emit_[emit];
87   }
GetOp14(size_t i)88   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)89   static inline uint64_t GetEmit14(size_t, size_t emit) {
90     return table14_0_emit_[emit];
91   }
GetOp15(size_t i)92   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)93   static inline uint64_t GetEmit15(size_t, size_t emit) {
94     return table15_0_emit_[emit];
95   }
GetOp16(size_t i)96   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)97   static inline uint64_t GetEmit16(size_t, size_t emit) {
98     return table16_0_emit_[emit];
99   }
GetOp17(size_t i)100   static inline uint64_t GetOp17(size_t i) {
101     return table17_ops_[i >> 5][i & 0x1f];
102   }
GetEmit17(size_t i,size_t emit)103   static inline uint64_t GetEmit17(size_t i, size_t emit) {
104     return table17_emit_[i >> 5][emit];
105   }
GetOp18(size_t i)106   static inline uint64_t GetOp18(size_t i) {
107     return table18_ops_[i >> 6][i & 0x3f];
108   }
GetEmit18(size_t i,size_t emit)109   static inline uint64_t GetEmit18(size_t i, size_t emit) {
110     return table18_emit_[i >> 6][emit];
111   }
GetOp10(size_t i)112   static inline uint64_t GetOp10(size_t i) {
113     return table10_ops_[i >> 6][i & 0x3f];
114   }
GetEmit10(size_t i,size_t emit)115   static inline uint64_t GetEmit10(size_t i, size_t emit) {
116     return table10_emit_[i >> 6][emit];
117   }
GetOp19(size_t i)118   static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; }
GetEmit19(size_t,size_t emit)119   static inline uint64_t GetEmit19(size_t, size_t emit) {
120     return emit ? 130 : 128;
121   }
GetOp20(size_t i)122   static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; }
GetEmit20(size_t,size_t emit)123   static inline uint64_t GetEmit20(size_t, size_t emit) {
124     return emit ? 162 : 131;
125   }
GetOp21(size_t i)126   static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; }
GetEmit21(size_t,size_t emit)127   static inline uint64_t GetEmit21(size_t, size_t emit) {
128     return emit ? 194 : 184;
129   }
GetOp22(size_t i)130   static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; }
GetEmit22(size_t,size_t emit)131   static inline uint64_t GetEmit22(size_t, size_t emit) {
132     return emit ? 226 : 224;
133   }
GetOp23(size_t i)134   static inline uint64_t GetOp23(size_t i) {
135     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
136   }
GetEmit23(size_t,size_t emit)137   static inline uint64_t GetEmit23(size_t, size_t emit) {
138     return (emit < 2 ? (emit ? 161 : 153) : ((emit - 2) ? 172 : 167));
139   }
GetOp24(size_t i)140   static inline uint64_t GetOp24(size_t i) {
141     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
142   }
GetEmit24(size_t,size_t emit)143   static inline uint64_t GetEmit24(size_t, size_t emit) {
144     return (emit < 2 ? (emit + 176) : ((emit - 2) ? 209 : 179));
145   }
GetOp25(size_t i)146   static inline uint64_t GetOp25(size_t i) {
147     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
148   }
GetEmit25(size_t,size_t emit)149   static inline uint64_t GetEmit25(size_t, size_t emit) {
150     return (emit < 2 ? (emit + 216) : ((emit - 2) ? 229 : 227));
151   }
GetOp26(size_t i)152   static inline uint64_t GetOp26(size_t i) { return table26_0_inner_[i]; }
GetEmit26(size_t,size_t emit)153   static inline uint64_t GetEmit26(size_t, size_t emit) {
154     return table26_0_emit_[emit];
155   }
GetOp27(size_t i)156   static inline uint64_t GetOp27(size_t i) { return table26_0_inner_[i]; }
GetEmit27(size_t,size_t emit)157   static inline uint64_t GetEmit27(size_t, size_t emit) {
158     return table27_0_emit_[emit];
159   }
GetOp28(size_t i)160   static inline uint64_t GetOp28(size_t i) { return table28_0_inner_[i]; }
GetEmit28(size_t,size_t emit)161   static inline uint64_t GetEmit28(size_t, size_t emit) {
162     return table28_0_emit_[emit];
163   }
GetOp30(size_t i)164   static inline uint64_t GetOp30(size_t i) {
165     return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1)));
166   }
GetEmit30(size_t,size_t emit)167   static inline uint64_t GetEmit30(size_t, size_t emit) {
168     return ((void)emit, 230);
169   }
GetOp29(size_t i)170   static inline uint64_t GetOp29(size_t i) {
171     return table29_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))];
172   }
GetEmit29(size_t,size_t emit)173   static inline uint64_t GetEmit29(size_t, size_t emit) {
174     return table29_0_emit_[emit];
175   }
GetOp32(size_t i)176   static inline uint64_t GetOp32(size_t i) {
177     return table32_0_inner_[(i < 4 ? (i) : (((void)(i - 4), 4)))];
178   }
GetEmit32(size_t,size_t emit)179   static inline uint64_t GetEmit32(size_t, size_t emit) {
180     return (emit < 2 ? (emit ? 228 : 198) : ((emit - 2) + 232));
181   }
GetOp31(size_t i)182   static inline uint64_t GetOp31(size_t i) {
183     return table31_0_inner_[(i < 7 ? (i / 2 + 0) : ((i - 7) + 3))];
184   }
GetEmit31(size_t,size_t emit)185   static inline uint64_t GetEmit31(size_t, size_t emit) {
186     return table31_0_emit_[emit];
187   }
GetOp34(size_t i)188   static inline uint64_t GetOp34(size_t i) {
189     return table34_0_inner_[(i < 5 ? (i) : ((i - 5) / 10 + 5))];
190   }
GetEmit34(size_t,size_t emit)191   static inline uint64_t GetEmit34(size_t, size_t emit) {
192     return table34_0_emit_[emit];
193   }
GetOp35(size_t i)194   static inline uint64_t GetOp35(size_t i) { return table35_0_ops_[i]; }
GetEmit35(size_t,size_t emit)195   static inline uint64_t GetEmit35(size_t, size_t emit) {
196     return table35_0_emit_[emit];
197   }
GetOp36(size_t i)198   static inline uint64_t GetOp36(size_t i) { return table36_0_ops_[i]; }
GetEmit36(size_t,size_t emit)199   static inline uint64_t GetEmit36(size_t, size_t emit) {
200     return table36_0_emit_[emit];
201   }
GetOp37(size_t i)202   static inline uint64_t GetOp37(size_t i) { return table37_0_ops_[i]; }
GetEmit37(size_t,size_t emit)203   static inline uint64_t GetEmit37(size_t, size_t emit) {
204     return table37_0_emit_[emit];
205   }
GetOp38(size_t i)206   static inline uint64_t GetOp38(size_t i) { return table38_0_ops_[i]; }
GetEmit38(size_t,size_t emit)207   static inline uint64_t GetEmit38(size_t, size_t emit) {
208     return table38_0_emit_[emit];
209   }
GetOp39(size_t i)210   static inline uint64_t GetOp39(size_t i) {
211     return table39_ops_[i >> 6][i & 0x3f];
212   }
GetEmit39(size_t i,size_t emit)213   static inline uint64_t GetEmit39(size_t i, size_t emit) {
214     return table39_emit_[i >> 6][emit];
215   }
GetOp40(size_t i)216   static inline uint64_t GetOp40(size_t i) {
217     return table40_ops_[i >> 6][i & 0x3f];
218   }
GetEmit40(size_t i,size_t emit)219   static inline uint64_t GetEmit40(size_t i, size_t emit) {
220     return table40_emit_[i >> 6][emit];
221   }
GetOp33(size_t i)222   static inline uint64_t GetOp33(size_t i) {
223     return table33_ops_[i >> 6][i & 0x3f];
224   }
GetEmit33(size_t i,size_t emit)225   static inline uint64_t GetEmit33(size_t i, size_t emit) {
226     return table33_emit_[i >> 6][emit];
227   }
228 
229  private:
230   static const uint8_t table2_0_emit_[10];
231   static const uint8_t table2_0_ops_[32];
232   static const uint8_t table3_0_emit_[36];
233   static const uint8_t table3_0_ops_[64];
234   static const uint8_t table4_0_emit_[22];
235   static const uint8_t table4_0_ops_[64];
236   static const uint8_t table4_1_emit_[46];
237   static const uint8_t table4_1_ops_[64];
238   static const uint8_t* const table4_emit_[2];
239   static const uint8_t* const table4_ops_[2];
240   static const uint8_t table5_0_ops_[128];
241   static const uint8_t table5_1_emit_[52];
242   static const uint8_t table5_1_ops_[128];
243   static const uint8_t* const table5_emit_[2];
244   static const uint8_t* const table5_ops_[2];
245   static const uint8_t table1_0_emit_[2];
246   static const uint16_t table1_0_ops_[32];
247   static const uint8_t table1_1_emit_[2];
248   static const uint8_t table1_2_emit_[2];
249   static const uint8_t table1_3_emit_[2];
250   static const uint8_t table1_4_emit_[2];
251   static const uint8_t table1_5_emit_[4];
252   static const uint16_t table1_5_ops_[32];
253   static const uint8_t table1_6_emit_[4];
254   static const uint8_t table1_7_emit_[4];
255   static const uint8_t table1_8_emit_[4];
256   static const uint8_t table1_9_emit_[4];
257   static const uint8_t table1_10_emit_[4];
258   static const uint8_t table1_11_emit_[6];
259   static const uint16_t table1_11_ops_[32];
260   static const uint8_t table1_12_emit_[8];
261   static const uint16_t table1_12_ops_[32];
262   static const uint8_t table1_13_emit_[8];
263   static const uint8_t table1_14_emit_[8];
264   static const uint8_t table1_15_emit_[10];
265   static const uint16_t table1_15_ops_[32];
266   static const uint8_t* const table1_emit_[16];
267   static const uint16_t* const table1_ops_[16];
268   static const uint8_t table12_0_inner_[5];
269   static const uint8_t table12_0_outer_[8];
270   static const uint8_t table13_0_emit_[9];
271   static const uint8_t table13_0_inner_[11];
272   static const uint8_t table13_0_outer_[16];
273   static const uint8_t table14_0_emit_[11];
274   static const uint8_t table14_0_ops_[32];
275   static const uint8_t table15_0_emit_[14];
276   static const uint8_t table15_0_ops_[64];
277   static const uint8_t table16_0_emit_[33];
278   static const uint8_t table16_0_ops_[128];
279   static const uint8_t table17_0_emit_[44];
280   static const uint8_t table17_0_ops_[32];
281   static const uint8_t table17_1_emit_[28];
282   static const uint8_t table17_1_ops_[32];
283   static const uint8_t table17_2_emit_[20];
284   static const uint8_t table17_2_ops_[32];
285   static const uint8_t table17_3_emit_[20];
286   static const uint8_t table17_4_emit_[2];
287   static const uint8_t table17_4_ops_[32];
288   static const uint8_t table17_5_emit_[2];
289   static const uint8_t table17_6_emit_[2];
290   static const uint8_t table17_7_emit_[5];
291   static const uint8_t table17_7_ops_[32];
292   static const uint8_t* const table17_emit_[8];
293   static const uint8_t* const table17_ops_[8];
294   static const uint16_t table18_0_ops_[64];
295   static const uint8_t table18_1_emit_[92];
296   static const uint16_t table18_1_ops_[64];
297   static const uint8_t table18_2_emit_[72];
298   static const uint16_t table18_2_ops_[64];
299   static const uint8_t table18_3_emit_[72];
300   static const uint8_t table18_4_emit_[40];
301   static const uint16_t table18_4_ops_[64];
302   static const uint8_t table18_5_emit_[40];
303   static const uint8_t table18_6_emit_[40];
304   static const uint16_t table18_7_ops_[64];
305   static const uint8_t* const table18_emit_[8];
306   static const uint16_t* const table18_ops_[8];
307   static const uint8_t table10_0_emit_[1];
308   static const uint16_t table10_0_ops_[64];
309   static const uint8_t table10_4_emit_[1];
310   static const uint16_t table10_4_ops_[64];
311   static const uint8_t table10_6_emit_[1];
312   static const uint8_t table10_8_emit_[1];
313   static const uint16_t table10_8_ops_[64];
314   static const uint8_t table10_9_emit_[1];
315   static const uint8_t table10_10_emit_[1];
316   static const uint8_t table10_11_emit_[1];
317   static const uint8_t table10_12_emit_[1];
318   static const uint8_t table10_13_emit_[1];
319   static const uint8_t table10_14_emit_[2];
320   static const uint16_t table10_14_ops_[64];
321   static const uint8_t table10_15_emit_[6];
322   static const uint16_t table10_15_ops_[64];
323   static const uint8_t* const table10_emit_[16];
324   static const uint16_t* const table10_ops_[16];
325   static const uint8_t table26_0_emit_[8];
326   static const uint8_t table26_0_inner_[8];
327   static const uint8_t table27_0_emit_[8];
328   static const uint8_t table28_0_emit_[16];
329   static const uint8_t table28_0_inner_[16];
330   static const uint8_t table29_0_emit_[7];
331   static const uint8_t table29_0_inner_[7];
332   static const uint8_t table32_0_inner_[5];
333   static const uint8_t table31_0_emit_[12];
334   static const uint8_t table31_0_inner_[12];
335   static const uint8_t table34_0_emit_[5];
336   static const uint8_t table34_0_inner_[7];
337   static const uint8_t table35_0_emit_[17];
338   static const uint8_t table35_0_ops_[32];
339   static const uint8_t table36_0_emit_[21];
340   static const uint8_t table36_0_ops_[64];
341   static const uint8_t table37_0_emit_[36];
342   static const uint8_t table37_0_ops_[128];
343   static const uint8_t table38_0_emit_[55];
344   static const uint8_t table38_0_ops_[256];
345   static const uint8_t table39_0_emit_[40];
346   static const uint8_t table39_0_ops_[64];
347   static const uint8_t table39_1_emit_[40];
348   static const uint8_t table39_2_emit_[22];
349   static const uint8_t table39_2_ops_[64];
350   static const uint8_t table39_3_emit_[4];
351   static const uint8_t table39_3_ops_[64];
352   static const uint8_t table39_4_emit_[4];
353   static const uint8_t table39_5_emit_[6];
354   static const uint8_t table39_5_ops_[64];
355   static const uint8_t table39_6_emit_[17];
356   static const uint8_t table39_6_ops_[64];
357   static const uint8_t table39_7_emit_[46];
358   static const uint8_t table39_7_ops_[64];
359   static const uint8_t* const table39_emit_[8];
360   static const uint8_t* const table39_ops_[8];
361   static const uint8_t table40_0_emit_[72];
362   static const uint8_t table40_1_emit_[72];
363   static const uint8_t table40_2_emit_[72];
364   static const uint8_t table40_3_emit_[72];
365   static const uint8_t table40_4_emit_[72];
366   static const uint8_t table40_5_emit_[40];
367   static const uint8_t table40_6_emit_[40];
368   static const uint8_t table40_7_emit_[40];
369   static const uint8_t table40_8_emit_[40];
370   static const uint8_t table40_9_emit_[40];
371   static const uint8_t table40_10_emit_[40];
372   static const uint8_t table40_11_emit_[4];
373   static const uint16_t table40_11_ops_[64];
374   static const uint8_t table40_12_emit_[8];
375   static const uint16_t table40_12_ops_[64];
376   static const uint8_t table40_13_emit_[9];
377   static const uint16_t table40_13_ops_[64];
378   static const uint8_t table40_14_emit_[16];
379   static const uint16_t table40_14_ops_[64];
380   static const uint8_t table40_15_emit_[30];
381   static const uint16_t table40_15_ops_[64];
382   static const uint8_t* const table40_emit_[16];
383   static const uint16_t* const table40_ops_[16];
384   static const uint8_t table33_0_emit_[1];
385   static const uint8_t table33_2_emit_[1];
386   static const uint8_t table33_4_emit_[1];
387   static const uint8_t table33_6_emit_[1];
388   static const uint8_t table33_8_emit_[1];
389   static const uint8_t table33_10_emit_[1];
390   static const uint16_t table33_10_ops_[64];
391   static const uint8_t table33_11_emit_[1];
392   static const uint8_t table33_12_emit_[1];
393   static const uint8_t table33_13_emit_[1];
394   static const uint8_t table33_14_emit_[1];
395   static const uint8_t table33_15_emit_[1];
396   static const uint8_t table33_16_emit_[1];
397   static const uint8_t table33_17_emit_[1];
398   static const uint8_t table33_18_emit_[1];
399   static const uint8_t table33_19_emit_[1];
400   static const uint8_t table33_20_emit_[1];
401   static const uint8_t table33_21_emit_[1];
402   static const uint8_t table33_22_emit_[2];
403   static const uint16_t table33_22_ops_[64];
404   static const uint8_t table33_23_emit_[2];
405   static const uint8_t table33_24_emit_[4];
406   static const uint16_t table33_24_ops_[64];
407   static const uint8_t table33_25_emit_[4];
408   static const uint8_t table33_26_emit_[4];
409   static const uint8_t table33_27_emit_[5];
410   static const uint16_t table33_27_ops_[64];
411   static const uint8_t table33_28_emit_[8];
412   static const uint16_t table33_28_ops_[64];
413   static const uint8_t table33_29_emit_[8];
414   static const uint8_t table33_30_emit_[15];
415   static const uint16_t table33_30_ops_[64];
416   static const uint8_t table33_31_emit_[18];
417   static const uint16_t table33_31_ops_[64];
418   static const uint8_t* const table33_emit_[32];
419   static const uint16_t* const table33_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 (!RefillTo9()) {
429         Done0();
430         break;
431       }
432       const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
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           break;
441         }
442         case 1: {
443           DecodeStep0();
444           break;
445         }
446         case 2: {
447           DecodeStep1();
448           break;
449         }
450         case 3: {
451           DecodeStep2();
452           break;
453         }
454         case 4: {
455           DecodeStep3();
456           break;
457         }
458       }
459     }
460     return ok_;
461   }
462 
463  private:
RefillTo9()464   bool RefillTo9() {
465     switch (buffer_len_) {
466       case 0: {
467         return Read2to8Bytes();
468       }
469       case 1:
470       case 2:
471       case 3:
472       case 4:
473       case 5:
474       case 6:
475       case 7:
476       case 8: {
477         return Read1to7Bytes();
478       }
479     }
480     return true;
481   }
Read2to8Bytes()482   bool Read2to8Bytes() {
483     switch (end_ - begin_) {
484       case 0:
485       case 1: {
486         return false;
487       }
488       case 2: {
489         Fill2();
490         return true;
491       }
492       case 3: {
493         Fill3();
494         return true;
495       }
496       case 4: {
497         Fill4();
498         return true;
499       }
500       case 5: {
501         Fill5();
502         return true;
503       }
504       case 6: {
505         Fill6();
506         return true;
507       }
508       case 7: {
509         Fill7();
510         return true;
511       }
512       default: {
513         Fill8();
514         return true;
515       }
516     }
517   }
Fill2()518   void Fill2() {
519     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
520               (static_cast<uint64_t>(begin_[1]) << 0);
521     begin_ += 2;
522     buffer_len_ += 16;
523   }
Fill3()524   void Fill3() {
525     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
526               (static_cast<uint64_t>(begin_[1]) << 8) |
527               (static_cast<uint64_t>(begin_[2]) << 0);
528     begin_ += 3;
529     buffer_len_ += 24;
530   }
Fill4()531   void Fill4() {
532     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
533               (static_cast<uint64_t>(begin_[1]) << 16) |
534               (static_cast<uint64_t>(begin_[2]) << 8) |
535               (static_cast<uint64_t>(begin_[3]) << 0);
536     begin_ += 4;
537     buffer_len_ += 32;
538   }
Fill5()539   void Fill5() {
540     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
541               (static_cast<uint64_t>(begin_[1]) << 24) |
542               (static_cast<uint64_t>(begin_[2]) << 16) |
543               (static_cast<uint64_t>(begin_[3]) << 8) |
544               (static_cast<uint64_t>(begin_[4]) << 0);
545     begin_ += 5;
546     buffer_len_ += 40;
547   }
Fill6()548   void Fill6() {
549     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
550               (static_cast<uint64_t>(begin_[1]) << 32) |
551               (static_cast<uint64_t>(begin_[2]) << 24) |
552               (static_cast<uint64_t>(begin_[3]) << 16) |
553               (static_cast<uint64_t>(begin_[4]) << 8) |
554               (static_cast<uint64_t>(begin_[5]) << 0);
555     begin_ += 6;
556     buffer_len_ += 48;
557   }
Fill7()558   void Fill7() {
559     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
560               (static_cast<uint64_t>(begin_[1]) << 40) |
561               (static_cast<uint64_t>(begin_[2]) << 32) |
562               (static_cast<uint64_t>(begin_[3]) << 24) |
563               (static_cast<uint64_t>(begin_[4]) << 16) |
564               (static_cast<uint64_t>(begin_[5]) << 8) |
565               (static_cast<uint64_t>(begin_[6]) << 0);
566     begin_ += 7;
567     buffer_len_ += 56;
568   }
Fill8()569   void Fill8() {
570     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
571               (static_cast<uint64_t>(begin_[1]) << 48) |
572               (static_cast<uint64_t>(begin_[2]) << 40) |
573               (static_cast<uint64_t>(begin_[3]) << 32) |
574               (static_cast<uint64_t>(begin_[4]) << 24) |
575               (static_cast<uint64_t>(begin_[5]) << 16) |
576               (static_cast<uint64_t>(begin_[6]) << 8) |
577               (static_cast<uint64_t>(begin_[7]) << 0);
578     begin_ += 8;
579     buffer_len_ += 64;
580   }
Read1to7Bytes()581   bool Read1to7Bytes() {
582     switch (end_ - begin_) {
583       case 0: {
584         return false;
585       }
586       case 1: {
587         Fill1();
588         return true;
589       }
590       case 2: {
591         Fill2();
592         return true;
593       }
594       case 3: {
595         Fill3();
596         return true;
597       }
598       case 4: {
599         Fill4();
600         return true;
601       }
602       case 5: {
603         Fill5();
604         return true;
605       }
606       case 6: {
607         Fill6();
608         return true;
609       }
610       default: {
611         Fill7();
612         return true;
613       }
614     }
615   }
Fill1()616   void Fill1() {
617     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
618     begin_ += 1;
619     buffer_len_ += 8;
620   }
Done0()621   void Done0() {
622     done_ = true;
623     switch (end_ - begin_) {
624       case 1: {
625         Fill1();
626         break;
627       }
628     }
629     switch (buffer_len_) {
630       case 1:
631       case 2:
632       case 3:
633       case 4: {
634         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
635         return;
636       }
637       case 5: {
638         const auto index = buffer_ & 31;
639         const auto op = GetOp2(index);
640         switch (op & 3) {
641           case 0: {
642             sink_(GetEmit2(index, (op >> 2) + 0));
643             break;
644           }
645           case 1: {
646             ok_ = false;
647             break;
648           }
649         }
650         return;
651       }
652       case 6: {
653         const auto index = buffer_ & 63;
654         const auto op = GetOp3(index);
655         switch (op & 3) {
656           case 0: {
657             ok_ = false;
658             break;
659           }
660           case 1: {
661             sink_(GetEmit3(index, (op >> 2) + 0));
662             break;
663           }
664         }
665         return;
666       }
667       case 7: {
668         const auto index = buffer_ & 127;
669         const auto op = GetOp4(index);
670         switch (op & 3) {
671           case 0: {
672             ok_ = false;
673             break;
674           }
675           case 1: {
676             sink_(GetEmit4(index, (op >> 2) + 0));
677             break;
678           }
679         }
680         return;
681       }
682       case 8: {
683         const auto index = buffer_ & 255;
684         const auto op = GetOp5(index);
685         switch (op & 3) {
686           case 0: {
687             ok_ = false;
688             break;
689           }
690           case 1: {
691             sink_(GetEmit5(index, (op >> 2) + 0));
692             break;
693           }
694         }
695         return;
696       }
697       case 0: {
698         return;
699       }
700     }
701   }
DecodeStep0()702   void DecodeStep0() {
703     if (!RefillTo1()) {
704       Done1();
705       return;
706     }
707     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
708     const auto op = GetOp6(index);
709     const int consumed = op & 1;
710     buffer_len_ -= consumed;
711     const auto emit_ofs = op >> 1;
712     sink_(GetEmit6(index, emit_ofs + 0));
713   }
RefillTo1()714   bool RefillTo1() {
715     switch (buffer_len_) {
716       case 0: {
717         return Read1to8Bytes();
718       }
719     }
720     return true;
721   }
Read1to8Bytes()722   bool Read1to8Bytes() {
723     switch (end_ - begin_) {
724       case 0: {
725         return false;
726       }
727       case 1: {
728         Fill1();
729         return true;
730       }
731       case 2: {
732         Fill2();
733         return true;
734       }
735       case 3: {
736         Fill3();
737         return true;
738       }
739       case 4: {
740         Fill4();
741         return true;
742       }
743       case 5: {
744         Fill5();
745         return true;
746       }
747       case 6: {
748         Fill6();
749         return true;
750       }
751       case 7: {
752         Fill7();
753         return true;
754       }
755       default: {
756         Fill8();
757         return true;
758       }
759     }
760   }
Done1()761   void Done1() {
762     done_ = true;
763     ok_ = false;
764   }
DecodeStep1()765   void DecodeStep1() {
766     if (!RefillTo1()) {
767       Done2();
768       return;
769     }
770     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
771     const auto op = GetOp7(index);
772     const int consumed = op & 1;
773     buffer_len_ -= consumed;
774     const auto emit_ofs = op >> 1;
775     sink_(GetEmit7(index, emit_ofs + 0));
776   }
Done2()777   void Done2() {
778     done_ = true;
779     ok_ = false;
780   }
DecodeStep2()781   void DecodeStep2() {
782     if (!RefillTo2()) {
783       Done3();
784       return;
785     }
786     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
787     const auto op = GetOp8(index);
788     const int consumed = op & 3;
789     buffer_len_ -= consumed;
790     const auto emit_ofs = op >> 2;
791     sink_(GetEmit8(index, emit_ofs + 0));
792   }
RefillTo2()793   bool RefillTo2() {
794     switch (buffer_len_) {
795       case 0: {
796         return Read1to8Bytes();
797       }
798       case 1: {
799         return Read1to7Bytes();
800       }
801     }
802     return true;
803   }
Done3()804   void Done3() {
805     done_ = true;
806     switch (buffer_len_) {
807       case 1: {
808         const auto index = buffer_ & 1;
809         const auto op = GetOp9(index);
810         switch (op & 1) {
811           case 0: {
812             sink_(GetEmit9(index, (op >> 1) + 0));
813             break;
814           }
815           case 1: {
816             ok_ = false;
817             break;
818           }
819         }
820         return;
821       }
822       case 0: {
823         ok_ = false;
824         return;
825       }
826     }
827   }
DecodeStep3()828   void DecodeStep3() {
829     if (!RefillTo10()) {
830       Done4();
831       return;
832     }
833     const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
834     const auto op = GetOp10(index);
835     const int consumed = op & 15;
836     buffer_len_ -= consumed;
837     const auto emit_ofs = op >> 8;
838     switch ((op >> 4) & 15) {
839       case 0: {
840         sink_(GetEmit10(index, emit_ofs + 0));
841         break;
842       }
843       case 1: {
844         DecodeStep4();
845         break;
846       }
847       case 2: {
848         DecodeStep5();
849         break;
850       }
851       case 3: {
852         DecodeStep6();
853         break;
854       }
855       case 4: {
856         DecodeStep7();
857         break;
858       }
859       case 5: {
860         DecodeStep8();
861         break;
862       }
863       case 6: {
864         DecodeStep9();
865         break;
866       }
867       case 7: {
868         DecodeStep10();
869         break;
870       }
871       case 8: {
872         DecodeStep14();
873         break;
874       }
875       case 9: {
876         DecodeStep11();
877         break;
878       }
879       case 10: {
880         DecodeStep12();
881         break;
882       }
883       case 11: {
884         DecodeStep15();
885         break;
886       }
887       case 12: {
888         DecodeStep13();
889         break;
890       }
891       case 13: {
892         DecodeStep16();
893         break;
894       }
895     }
896   }
RefillTo10()897   bool RefillTo10() {
898     switch (buffer_len_) {
899       case 0: {
900         return Read2to8Bytes();
901       }
902       case 1: {
903         return Read2to7Bytes();
904       }
905       case 2:
906       case 3:
907       case 4:
908       case 5:
909       case 6:
910       case 7:
911       case 8: {
912         return Read1to7Bytes();
913       }
914       case 9: {
915         return Read1to6Bytes();
916       }
917     }
918     return true;
919   }
Read2to7Bytes()920   bool Read2to7Bytes() {
921     switch (end_ - begin_) {
922       case 0:
923       case 1: {
924         return false;
925       }
926       case 2: {
927         Fill2();
928         return true;
929       }
930       case 3: {
931         Fill3();
932         return true;
933       }
934       case 4: {
935         Fill4();
936         return true;
937       }
938       case 5: {
939         Fill5();
940         return true;
941       }
942       case 6: {
943         Fill6();
944         return true;
945       }
946       default: {
947         Fill7();
948         return true;
949       }
950     }
951   }
Read1to6Bytes()952   bool Read1to6Bytes() {
953     switch (end_ - begin_) {
954       case 0: {
955         return false;
956       }
957       case 1: {
958         Fill1();
959         return true;
960       }
961       case 2: {
962         Fill2();
963         return true;
964       }
965       case 3: {
966         Fill3();
967         return true;
968       }
969       case 4: {
970         Fill4();
971         return true;
972       }
973       case 5: {
974         Fill5();
975         return true;
976       }
977       default: {
978         Fill6();
979         return true;
980       }
981     }
982   }
Done4()983   void Done4() {
984     done_ = true;
985     switch (end_ - begin_) {
986       case 1: {
987         Fill1();
988         break;
989       }
990     }
991     switch (buffer_len_) {
992       case 1: {
993         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
994         return;
995       }
996       case 2: {
997         const auto index = buffer_ & 3;
998         const auto op = GetOp11(index);
999         switch (op & 3) {
1000           case 0: {
1001             sink_(GetEmit11(index, (op >> 2) + 0));
1002             break;
1003           }
1004           case 1: {
1005             ok_ = false;
1006             break;
1007           }
1008         }
1009         return;
1010       }
1011       case 3: {
1012         const auto index = buffer_ & 7;
1013         const auto op = GetOp12(index);
1014         switch (op & 3) {
1015           case 0: {
1016             ok_ = false;
1017             break;
1018           }
1019           case 1: {
1020             sink_(GetEmit12(index, (op >> 2) + 0));
1021             break;
1022           }
1023         }
1024         return;
1025       }
1026       case 4: {
1027         const auto index = buffer_ & 15;
1028         const auto op = GetOp13(index);
1029         switch (op & 3) {
1030           case 0: {
1031             ok_ = false;
1032             break;
1033           }
1034           case 1: {
1035             sink_(GetEmit13(index, (op >> 2) + 0));
1036             break;
1037           }
1038         }
1039         return;
1040       }
1041       case 5: {
1042         const auto index = buffer_ & 31;
1043         const auto op = GetOp14(index);
1044         switch (op & 3) {
1045           case 0: {
1046             ok_ = false;
1047             break;
1048           }
1049           case 1: {
1050             sink_(GetEmit14(index, (op >> 2) + 0));
1051             break;
1052           }
1053         }
1054         return;
1055       }
1056       case 6: {
1057         const auto index = buffer_ & 63;
1058         const auto op = GetOp15(index);
1059         switch (op & 3) {
1060           case 0: {
1061             ok_ = false;
1062             break;
1063           }
1064           case 1: {
1065             sink_(GetEmit15(index, (op >> 2) + 0));
1066             break;
1067           }
1068         }
1069         return;
1070       }
1071       case 7: {
1072         const auto index = buffer_ & 127;
1073         const auto op = GetOp16(index);
1074         switch (op & 3) {
1075           case 0: {
1076             sink_(GetEmit16(index, (op >> 2) + 0));
1077             sink_(GetEmit16(index, (op >> 2) + 1));
1078             break;
1079           }
1080           case 1: {
1081             ok_ = false;
1082             break;
1083           }
1084           case 2: {
1085             sink_(GetEmit16(index, (op >> 2) + 0));
1086             break;
1087           }
1088         }
1089         return;
1090       }
1091       case 8: {
1092         const auto index = buffer_ & 255;
1093         const auto op = GetOp17(index);
1094         switch (op & 3) {
1095           case 0: {
1096             ok_ = false;
1097             break;
1098           }
1099           case 1: {
1100             sink_(GetEmit17(index, (op >> 2) + 0));
1101             sink_(GetEmit17(index, (op >> 2) + 1));
1102             break;
1103           }
1104           case 2: {
1105             sink_(GetEmit17(index, (op >> 2) + 0));
1106             break;
1107           }
1108         }
1109         return;
1110       }
1111       case 9: {
1112         const auto index = buffer_ & 511;
1113         const auto op = GetOp18(index);
1114         switch (op & 3) {
1115           case 0: {
1116             ok_ = false;
1117             break;
1118           }
1119           case 1: {
1120             sink_(GetEmit18(index, (op >> 2) + 0));
1121             sink_(GetEmit18(index, (op >> 2) + 1));
1122             break;
1123           }
1124           case 2: {
1125             sink_(GetEmit18(index, (op >> 2) + 0));
1126             break;
1127           }
1128         }
1129         return;
1130       }
1131       case 0: {
1132         return;
1133       }
1134     }
1135   }
DecodeStep4()1136   void DecodeStep4() {
1137     if (!RefillTo1()) {
1138       Done5();
1139       return;
1140     }
1141     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1142     const auto op = GetOp19(index);
1143     const int consumed = op & 1;
1144     buffer_len_ -= consumed;
1145     const auto emit_ofs = op >> 1;
1146     sink_(GetEmit19(index, emit_ofs + 0));
1147   }
Done5()1148   void Done5() {
1149     done_ = true;
1150     ok_ = false;
1151   }
DecodeStep5()1152   void DecodeStep5() {
1153     if (!RefillTo1()) {
1154       Done6();
1155       return;
1156     }
1157     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1158     const auto op = GetOp20(index);
1159     const int consumed = op & 1;
1160     buffer_len_ -= consumed;
1161     const auto emit_ofs = op >> 1;
1162     sink_(GetEmit20(index, emit_ofs + 0));
1163   }
Done6()1164   void Done6() {
1165     done_ = true;
1166     ok_ = false;
1167   }
DecodeStep6()1168   void DecodeStep6() {
1169     if (!RefillTo1()) {
1170       Done7();
1171       return;
1172     }
1173     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1174     const auto op = GetOp21(index);
1175     const int consumed = op & 1;
1176     buffer_len_ -= consumed;
1177     const auto emit_ofs = op >> 1;
1178     sink_(GetEmit21(index, emit_ofs + 0));
1179   }
Done7()1180   void Done7() {
1181     done_ = true;
1182     ok_ = false;
1183   }
DecodeStep7()1184   void DecodeStep7() {
1185     if (!RefillTo1()) {
1186       Done8();
1187       return;
1188     }
1189     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
1190     const auto op = GetOp22(index);
1191     const int consumed = op & 1;
1192     buffer_len_ -= consumed;
1193     const auto emit_ofs = op >> 1;
1194     sink_(GetEmit22(index, emit_ofs + 0));
1195   }
Done8()1196   void Done8() {
1197     done_ = true;
1198     ok_ = false;
1199   }
DecodeStep8()1200   void DecodeStep8() {
1201     if (!RefillTo2()) {
1202       Done9();
1203       return;
1204     }
1205     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1206     const auto op = GetOp23(index);
1207     const int consumed = op & 3;
1208     buffer_len_ -= consumed;
1209     const auto emit_ofs = op >> 2;
1210     sink_(GetEmit23(index, emit_ofs + 0));
1211   }
Done9()1212   void Done9() {
1213     done_ = true;
1214     switch (buffer_len_) {
1215       case 1:
1216       case 0: {
1217         ok_ = false;
1218         return;
1219       }
1220     }
1221   }
DecodeStep9()1222   void DecodeStep9() {
1223     if (!RefillTo2()) {
1224       Done10();
1225       return;
1226     }
1227     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1228     const auto op = GetOp24(index);
1229     const int consumed = op & 3;
1230     buffer_len_ -= consumed;
1231     const auto emit_ofs = op >> 2;
1232     sink_(GetEmit24(index, emit_ofs + 0));
1233   }
Done10()1234   void Done10() {
1235     done_ = true;
1236     switch (buffer_len_) {
1237       case 1:
1238       case 0: {
1239         ok_ = false;
1240         return;
1241       }
1242     }
1243   }
DecodeStep10()1244   void DecodeStep10() {
1245     if (!RefillTo2()) {
1246       Done11();
1247       return;
1248     }
1249     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1250     const auto op = GetOp25(index);
1251     const int consumed = op & 3;
1252     buffer_len_ -= consumed;
1253     const auto emit_ofs = op >> 2;
1254     sink_(GetEmit25(index, emit_ofs + 0));
1255   }
Done11()1256   void Done11() {
1257     done_ = true;
1258     switch (buffer_len_) {
1259       case 1:
1260       case 0: {
1261         ok_ = false;
1262         return;
1263       }
1264     }
1265   }
DecodeStep11()1266   void DecodeStep11() {
1267     if (!RefillTo3()) {
1268       Done12();
1269       return;
1270     }
1271     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1272     const auto op = GetOp26(index);
1273     const int consumed = op & 3;
1274     buffer_len_ -= consumed;
1275     const auto emit_ofs = op >> 2;
1276     sink_(GetEmit26(index, emit_ofs + 0));
1277   }
RefillTo3()1278   bool RefillTo3() {
1279     switch (buffer_len_) {
1280       case 0: {
1281         return Read1to8Bytes();
1282       }
1283       case 1:
1284       case 2: {
1285         return Read1to7Bytes();
1286       }
1287     }
1288     return true;
1289   }
Done12()1290   void Done12() {
1291     done_ = true;
1292     switch (buffer_len_) {
1293       case 1:
1294       case 2:
1295       case 0: {
1296         ok_ = false;
1297         return;
1298       }
1299     }
1300   }
DecodeStep12()1301   void DecodeStep12() {
1302     if (!RefillTo3()) {
1303       Done13();
1304       return;
1305     }
1306     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1307     const auto op = GetOp27(index);
1308     const int consumed = op & 3;
1309     buffer_len_ -= consumed;
1310     const auto emit_ofs = op >> 2;
1311     sink_(GetEmit27(index, emit_ofs + 0));
1312   }
Done13()1313   void Done13() {
1314     done_ = true;
1315     switch (buffer_len_) {
1316       case 1:
1317       case 2:
1318       case 0: {
1319         ok_ = false;
1320         return;
1321       }
1322     }
1323   }
DecodeStep13()1324   void DecodeStep13() {
1325     if (!RefillTo4()) {
1326       Done14();
1327       return;
1328     }
1329     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1330     const auto op = GetOp28(index);
1331     const int consumed = op & 7;
1332     buffer_len_ -= consumed;
1333     const auto emit_ofs = op >> 3;
1334     sink_(GetEmit28(index, emit_ofs + 0));
1335   }
RefillTo4()1336   bool RefillTo4() {
1337     switch (buffer_len_) {
1338       case 0: {
1339         return Read1to8Bytes();
1340       }
1341       case 1:
1342       case 2:
1343       case 3: {
1344         return Read1to7Bytes();
1345       }
1346     }
1347     return true;
1348   }
Done14()1349   void Done14() {
1350     done_ = true;
1351     switch (buffer_len_) {
1352       case 1:
1353       case 2:
1354       case 3:
1355       case 0: {
1356         ok_ = false;
1357         return;
1358       }
1359     }
1360   }
DecodeStep14()1361   void DecodeStep14() {
1362     if (!RefillTo3()) {
1363       Done15();
1364       return;
1365     }
1366     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1367     const auto op = GetOp29(index);
1368     const int consumed = op & 3;
1369     buffer_len_ -= consumed;
1370     const auto emit_ofs = op >> 2;
1371     sink_(GetEmit29(index, emit_ofs + 0));
1372   }
Done15()1373   void Done15() {
1374     done_ = true;
1375     switch (buffer_len_) {
1376       case 1:
1377       case 0: {
1378         ok_ = false;
1379         return;
1380       }
1381       case 2: {
1382         const auto index = buffer_ & 3;
1383         const auto op = GetOp30(index);
1384         switch (op & 1) {
1385           case 0: {
1386             sink_(GetEmit30(index, (op >> 1) + 0));
1387             break;
1388           }
1389           case 1: {
1390             ok_ = false;
1391             break;
1392           }
1393         }
1394         return;
1395       }
1396     }
1397   }
DecodeStep15()1398   void DecodeStep15() {
1399     if (!RefillTo4()) {
1400       Done16();
1401       return;
1402     }
1403     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1404     const auto op = GetOp31(index);
1405     const int consumed = op & 7;
1406     buffer_len_ -= consumed;
1407     const auto emit_ofs = op >> 3;
1408     sink_(GetEmit31(index, emit_ofs + 0));
1409   }
Done16()1410   void Done16() {
1411     done_ = true;
1412     switch (buffer_len_) {
1413       case 1:
1414       case 2:
1415       case 0: {
1416         ok_ = false;
1417         return;
1418       }
1419       case 3: {
1420         const auto index = buffer_ & 7;
1421         const auto op = GetOp32(index);
1422         switch (op & 1) {
1423           case 0: {
1424             sink_(GetEmit32(index, (op >> 1) + 0));
1425             break;
1426           }
1427           case 1: {
1428             ok_ = false;
1429             break;
1430           }
1431         }
1432         return;
1433       }
1434     }
1435   }
DecodeStep16()1436   void DecodeStep16() {
1437     if (!RefillTo11()) {
1438       Done17();
1439       return;
1440     }
1441     const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff;
1442     const auto op = GetOp33(index);
1443     const int consumed = op & 15;
1444     buffer_len_ -= consumed;
1445     const auto emit_ofs = op >> 5;
1446     switch ((op >> 4) & 1) {
1447       case 0: {
1448         sink_(GetEmit33(index, emit_ofs + 0));
1449         break;
1450       }
1451       case 1: {
1452         begin_ = end_;
1453         buffer_len_ = 0;
1454         break;
1455       }
1456     }
1457   }
RefillTo11()1458   bool RefillTo11() {
1459     switch (buffer_len_) {
1460       case 0: {
1461         return Read2to8Bytes();
1462       }
1463       case 1:
1464       case 2: {
1465         return Read2to7Bytes();
1466       }
1467       case 3:
1468       case 4:
1469       case 5:
1470       case 6:
1471       case 7:
1472       case 8: {
1473         return Read1to7Bytes();
1474       }
1475       case 9:
1476       case 10: {
1477         return Read1to6Bytes();
1478       }
1479     }
1480     return true;
1481   }
Done17()1482   void Done17() {
1483     done_ = true;
1484     switch (end_ - begin_) {
1485       case 1: {
1486         Fill1();
1487         break;
1488       }
1489     }
1490     switch (buffer_len_) {
1491       case 1:
1492       case 2:
1493       case 3: {
1494         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1495         return;
1496       }
1497       case 4: {
1498         const auto index = buffer_ & 15;
1499         const auto op = GetOp34(index);
1500         switch (op & 3) {
1501           case 0: {
1502             sink_(GetEmit34(index, (op >> 2) + 0));
1503             break;
1504           }
1505           case 1: {
1506             ok_ = false;
1507             break;
1508           }
1509         }
1510         return;
1511       }
1512       case 5: {
1513         const auto index = buffer_ & 31;
1514         const auto op = GetOp35(index);
1515         switch (op & 3) {
1516           case 0: {
1517             ok_ = false;
1518             break;
1519           }
1520           case 1: {
1521             sink_(GetEmit35(index, (op >> 2) + 0));
1522             break;
1523           }
1524         }
1525         return;
1526       }
1527       case 6: {
1528         const auto index = buffer_ & 63;
1529         const auto op = GetOp36(index);
1530         switch (op & 3) {
1531           case 0: {
1532             ok_ = false;
1533             break;
1534           }
1535           case 1: {
1536             sink_(GetEmit36(index, (op >> 2) + 0));
1537             break;
1538           }
1539         }
1540         return;
1541       }
1542       case 7: {
1543         const auto index = buffer_ & 127;
1544         const auto op = GetOp37(index);
1545         switch (op & 3) {
1546           case 0: {
1547             ok_ = false;
1548             break;
1549           }
1550           case 1: {
1551             sink_(GetEmit37(index, (op >> 2) + 0));
1552             break;
1553           }
1554         }
1555         return;
1556       }
1557       case 8: {
1558         const auto index = buffer_ & 255;
1559         const auto op = GetOp38(index);
1560         switch (op & 3) {
1561           case 0: {
1562             ok_ = false;
1563             break;
1564           }
1565           case 1: {
1566             sink_(GetEmit38(index, (op >> 2) + 0));
1567             break;
1568           }
1569         }
1570         return;
1571       }
1572       case 9: {
1573         const auto index = buffer_ & 511;
1574         const auto op = GetOp39(index);
1575         switch (op & 3) {
1576           case 0: {
1577             sink_(GetEmit39(index, (op >> 2) + 0));
1578             sink_(GetEmit39(index, (op >> 2) + 1));
1579             break;
1580           }
1581           case 1: {
1582             ok_ = false;
1583             break;
1584           }
1585           case 2: {
1586             sink_(GetEmit39(index, (op >> 2) + 0));
1587             break;
1588           }
1589         }
1590         return;
1591       }
1592       case 10: {
1593         const auto index = buffer_ & 1023;
1594         const auto op = GetOp40(index);
1595         switch (op & 3) {
1596           case 0: {
1597             ok_ = false;
1598             break;
1599           }
1600           case 1: {
1601             sink_(GetEmit40(index, (op >> 2) + 0));
1602             sink_(GetEmit40(index, (op >> 2) + 1));
1603             break;
1604           }
1605           case 2: {
1606             sink_(GetEmit40(index, (op >> 2) + 0));
1607             break;
1608           }
1609         }
1610         return;
1611       }
1612       case 0: {
1613         return;
1614       }
1615     }
1616   }
1617   F sink_;
1618   const uint8_t* begin_;
1619   const uint8_t* const end_;
1620   uint64_t buffer_ = 0;
1621   int buffer_len_ = 0;
1622   bool ok_ = true;
1623   bool done_ = false;
1624 };
1625 }  // namespace geometry_9_10_11
1626 }  // namespace grpc_core
1627 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_9_10_11_H
1628