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