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