xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_7_10_13.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_7_10_13_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_10_13_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_7_10_13 {
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   }
GetOp1(size_t i)36   static inline uint64_t GetOp1(size_t i) {
37     return table1_0_inner_[table1_0_outer_[i]];
38   }
GetEmit1(size_t,size_t emit)39   static inline uint64_t GetEmit1(size_t, size_t emit) {
40     return table1_0_emit_[emit];
41   }
GetOp4(size_t i)42   static inline uint64_t GetOp4(size_t i) { return i ? 3 : 1; }
GetEmit4(size_t,size_t emit)43   static inline uint64_t GetEmit4(size_t, size_t emit) {
44     return emit ? 42 : 38;
45   }
GetOp5(size_t i)46   static inline uint64_t GetOp5(size_t i) { return i ? 3 : 1; }
GetEmit5(size_t,size_t emit)47   static inline uint64_t GetEmit5(size_t, size_t emit) {
48     return emit ? 59 : 44;
49   }
GetOp6(size_t i)50   static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; }
GetEmit6(size_t,size_t emit)51   static inline uint64_t GetEmit6(size_t, size_t emit) {
52     return emit ? 90 : 88;
53   }
GetOp8(size_t i)54   static inline uint64_t GetOp8(size_t i) {
55     return table8_0_inner_[(i < 6 ? (i) : ((i - 6) + 5))];
56   }
GetEmit8(size_t,size_t emit)57   static inline uint64_t GetEmit8(size_t, size_t emit) {
58     return table8_0_emit_[emit];
59   }
GetOp9(size_t i)60   static inline uint64_t GetOp9(size_t i) {
61     return table9_0_inner_[table9_0_outer_[i]];
62   }
GetEmit9(size_t,size_t emit)63   static inline uint64_t GetEmit9(size_t, size_t emit) {
64     return table9_0_emit_[emit];
65   }
GetOp10(size_t i)66   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)67   static inline uint64_t GetEmit10(size_t, size_t emit) {
68     return table10_0_emit_[emit];
69   }
GetOp11(size_t i)70   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)71   static inline uint64_t GetEmit11(size_t, size_t emit) {
72     return table11_0_emit_[emit];
73   }
GetOp12(size_t i)74   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)75   static inline uint64_t GetEmit12(size_t, size_t emit) {
76     return table12_0_emit_[emit];
77   }
GetOp13(size_t i)78   static inline uint64_t GetOp13(size_t i) {
79     return table13_ops_[i >> 6][i & 0x3f];
80   }
GetEmit13(size_t i,size_t emit)81   static inline uint64_t GetEmit13(size_t i, size_t emit) {
82     return table13_emit_[i >> 6][emit];
83   }
GetOp14(size_t i)84   static inline uint64_t GetOp14(size_t i) {
85     return table14_ops_[i >> 6][i & 0x3f];
86   }
GetEmit14(size_t i,size_t emit)87   static inline uint64_t GetEmit14(size_t i, size_t emit) {
88     return table14_emit_[i >> 6][emit];
89   }
GetOp7(size_t i)90   static inline uint64_t GetOp7(size_t i) {
91     return table7_ops_[i >> 6][i & 0x3f];
92   }
GetEmit7(size_t i,size_t emit)93   static inline uint64_t GetEmit7(size_t i, size_t emit) {
94     return table7_emit_[i >> 6][emit];
95   }
GetOp16(size_t i)96   static inline uint64_t GetOp16(size_t i) {
97     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
98   }
GetEmit16(size_t,size_t emit)99   static inline uint64_t GetEmit16(size_t, size_t emit) {
100     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
101   }
GetOp15(size_t i)102   static inline uint64_t GetOp15(size_t i) {
103     return table15_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))];
104   }
GetEmit15(size_t,size_t emit)105   static inline uint64_t GetEmit15(size_t, size_t emit) {
106     return table15_0_emit_[emit];
107   }
GetOp18(size_t i)108   static inline uint64_t GetOp18(size_t i) {
109     return table18_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))];
110   }
GetEmit18(size_t,size_t emit)111   static inline uint64_t GetEmit18(size_t, size_t emit) {
112     return table18_0_emit_[emit];
113   }
GetOp17(size_t i)114   static inline uint64_t GetOp17(size_t i) {
115     return table17_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))];
116   }
GetEmit17(size_t,size_t emit)117   static inline uint64_t GetEmit17(size_t, size_t emit) {
118     return table17_0_emit_[emit];
119   }
GetOp20(size_t i)120   static inline uint64_t GetOp20(size_t i) {
121     return table20_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))];
122   }
GetEmit20(size_t,size_t emit)123   static inline uint64_t GetEmit20(size_t, size_t emit) {
124     return table20_0_emit_[emit];
125   }
GetOp19(size_t i)126   static inline uint64_t GetOp19(size_t i) { return table19_0_ops_[i]; }
GetEmit19(size_t,size_t emit)127   static inline uint64_t GetEmit19(size_t, size_t emit) {
128     return table19_0_emit_[emit];
129   }
GetOp22(size_t i)130   static inline uint64_t GetOp22(size_t i) { return table22_0_ops_[i]; }
GetEmit22(size_t,size_t emit)131   static inline uint64_t GetEmit22(size_t, size_t emit) {
132     return table22_0_emit_[emit];
133   }
GetOp23(size_t i)134   static inline uint64_t GetOp23(size_t i) { return table23_0_ops_[i]; }
GetEmit23(size_t,size_t emit)135   static inline uint64_t GetEmit23(size_t, size_t emit) {
136     return table23_0_emit_[emit];
137   }
GetOp24(size_t i)138   static inline uint64_t GetOp24(size_t i) { return table24_0_ops_[i]; }
GetEmit24(size_t,size_t emit)139   static inline uint64_t GetEmit24(size_t, size_t emit) {
140     return table24_0_emit_[emit];
141   }
GetOp25(size_t i)142   static inline uint64_t GetOp25(size_t i) { return table25_0_ops_[i]; }
GetEmit25(size_t,size_t emit)143   static inline uint64_t GetEmit25(size_t, size_t emit) {
144     return table25_0_emit_[emit];
145   }
GetOp26(size_t i)146   static inline uint64_t GetOp26(size_t i) {
147     return table26_ops_[i >> 6][i & 0x3f];
148   }
GetEmit26(size_t i,size_t emit)149   static inline uint64_t GetEmit26(size_t i, size_t emit) {
150     return table26_emit_[i >> 6][emit];
151   }
GetOp27(size_t i)152   static inline uint64_t GetOp27(size_t i) {
153     return table27_ops_[i >> 6][i & 0x3f];
154   }
GetEmit27(size_t i,size_t emit)155   static inline uint64_t GetEmit27(size_t i, size_t emit) {
156     return table27_emit_[i >> 6][emit];
157   }
GetOp28(size_t i)158   static inline uint64_t GetOp28(size_t i) {
159     return table28_ops_[i >> 7][i & 0x7f];
160   }
GetEmit28(size_t i,size_t emit)161   static inline uint64_t GetEmit28(size_t i, size_t emit) {
162     return table28_emit_[i >> 7][emit];
163   }
GetOp29(size_t i)164   static inline uint64_t GetOp29(size_t i) {
165     return table29_ops_[i >> 7][i & 0x7f];
166   }
GetEmit29(size_t i,size_t emit)167   static inline uint64_t GetEmit29(size_t i, size_t emit) {
168     return table29_emit_[i >> 7][emit];
169   }
GetOp21(size_t i)170   static inline uint64_t GetOp21(size_t i) {
171     return table21_ops_[i >> 7][i & 0x7f];
172   }
GetEmit21(size_t i,size_t emit)173   static inline uint64_t GetEmit21(size_t i, size_t emit) {
174     return table21_emit_[i >> 7][emit];
175   }
176 
177  private:
178   static const uint8_t table2_0_emit_[10];
179   static const uint8_t table2_0_ops_[32];
180   static const uint8_t table3_0_emit_[36];
181   static const uint8_t table3_0_ops_[64];
182   static const uint8_t table1_0_emit_[68];
183   static const uint16_t table1_0_inner_[72];
184   static const uint8_t table1_0_outer_[128];
185   static const uint8_t table8_0_emit_[5];
186   static const uint8_t table8_0_inner_[7];
187   static const uint8_t table9_0_emit_[8];
188   static const uint8_t table9_0_inner_[10];
189   static const uint8_t table9_0_outer_[16];
190   static const uint8_t table10_0_emit_[10];
191   static const uint8_t table10_0_ops_[32];
192   static const uint8_t table11_0_emit_[16];
193   static const uint8_t table11_0_ops_[64];
194   static const uint8_t table12_0_emit_[18];
195   static const uint8_t table12_0_ops_[128];
196   static const uint8_t table13_0_emit_[40];
197   static const uint8_t table13_0_ops_[64];
198   static const uint8_t table13_1_emit_[40];
199   static const uint8_t table13_2_emit_[22];
200   static const uint8_t table13_2_ops_[64];
201   static const uint8_t table13_3_emit_[14];
202   static const uint8_t table13_3_ops_[64];
203   static const uint8_t* const table13_emit_[4];
204   static const uint8_t* const table13_ops_[4];
205   static const uint8_t table14_0_emit_[72];
206   static const uint16_t table14_0_ops_[64];
207   static const uint8_t table14_1_emit_[72];
208   static const uint8_t table14_2_emit_[72];
209   static const uint8_t table14_3_emit_[72];
210   static const uint8_t table14_4_emit_[72];
211   static const uint8_t table14_5_emit_[40];
212   static const uint16_t table14_5_ops_[64];
213   static const uint8_t table14_6_emit_[22];
214   static const uint16_t table14_6_ops_[64];
215   static const uint8_t table14_7_emit_[11];
216   static const uint16_t table14_7_ops_[64];
217   static const uint8_t* const table14_emit_[8];
218   static const uint16_t* const table14_ops_[8];
219   static const uint8_t table7_0_emit_[1];
220   static const uint16_t table7_0_ops_[64];
221   static const uint8_t table7_2_emit_[1];
222   static const uint8_t table7_4_emit_[1];
223   static const uint8_t table7_6_emit_[1];
224   static const uint8_t table7_8_emit_[1];
225   static const uint8_t table7_10_emit_[1];
226   static const uint16_t table7_10_ops_[64];
227   static const uint8_t table7_11_emit_[1];
228   static const uint8_t table7_12_emit_[1];
229   static const uint8_t table7_13_emit_[2];
230   static const uint16_t table7_13_ops_[64];
231   static const uint8_t table7_14_emit_[4];
232   static const uint16_t table7_14_ops_[64];
233   static const uint8_t table7_15_emit_[7];
234   static const uint16_t table7_15_ops_[64];
235   static const uint8_t* const table7_emit_[16];
236   static const uint16_t* const table7_ops_[16];
237   static const uint8_t table15_0_emit_[5];
238   static const uint8_t table15_0_inner_[5];
239   static const uint8_t table18_0_emit_[6];
240   static const uint8_t table18_0_inner_[7];
241   static const uint8_t table17_0_emit_[10];
242   static const uint8_t table17_0_inner_[10];
243   static const uint8_t table20_0_emit_[9];
244   static const uint8_t table20_0_inner_[10];
245   static const uint8_t table19_0_emit_[23];
246   static const uint8_t table19_0_ops_[32];
247   static const uint8_t table22_0_emit_[12];
248   static const uint8_t table22_0_ops_[32];
249   static const uint8_t table23_0_emit_[41];
250   static const uint8_t table23_0_ops_[64];
251   static const uint8_t table24_0_emit_[53];
252   static const uint8_t table24_0_ops_[128];
253   static const uint8_t table25_0_emit_[57];
254   static const uint8_t table25_0_ops_[256];
255   static const uint8_t table26_0_emit_[4];
256   static const uint8_t table26_0_ops_[64];
257   static const uint8_t table26_1_emit_[4];
258   static const uint8_t table26_2_emit_[4];
259   static const uint8_t table26_3_emit_[8];
260   static const uint8_t table26_3_ops_[64];
261   static const uint8_t table26_4_emit_[8];
262   static const uint8_t table26_5_emit_[8];
263   static const uint8_t table26_6_emit_[11];
264   static const uint8_t table26_6_ops_[64];
265   static const uint8_t table26_7_emit_[25];
266   static const uint8_t table26_7_ops_[64];
267   static const uint8_t* const table26_emit_[8];
268   static const uint8_t* const table26_ops_[8];
269   static const uint8_t table27_0_emit_[40];
270   static const uint8_t table27_1_emit_[40];
271   static const uint8_t table27_2_emit_[40];
272   static const uint8_t table27_3_emit_[40];
273   static const uint8_t table27_4_emit_[40];
274   static const uint8_t table27_5_emit_[40];
275   static const uint8_t table27_6_emit_[4];
276   static const uint8_t table27_6_ops_[64];
277   static const uint8_t table27_7_emit_[4];
278   static const uint8_t table27_8_emit_[4];
279   static const uint8_t table27_9_emit_[4];
280   static const uint8_t table27_10_emit_[4];
281   static const uint8_t table27_11_emit_[4];
282   static const uint8_t table27_12_emit_[4];
283   static const uint8_t table27_13_emit_[7];
284   static const uint8_t table27_13_ops_[64];
285   static const uint8_t table27_14_emit_[10];
286   static const uint8_t table27_14_ops_[64];
287   static const uint8_t table27_15_emit_[34];
288   static const uint8_t table27_15_ops_[64];
289   static const uint8_t* const table27_emit_[16];
290   static const uint8_t* const table27_ops_[16];
291   static const uint8_t table28_0_emit_[144];
292   static const uint16_t table28_0_ops_[128];
293   static const uint8_t table28_1_emit_[144];
294   static const uint8_t table28_2_emit_[144];
295   static const uint8_t table28_3_emit_[144];
296   static const uint8_t table28_4_emit_[144];
297   static const uint8_t table28_5_emit_[144];
298   static const uint8_t table28_6_emit_[80];
299   static const uint16_t table28_6_ops_[128];
300   static const uint8_t table28_7_emit_[80];
301   static const uint8_t table28_8_emit_[80];
302   static const uint8_t table28_9_emit_[80];
303   static const uint8_t table28_10_emit_[80];
304   static const uint8_t table28_11_emit_[80];
305   static const uint8_t table28_12_emit_[80];
306   static const uint8_t table28_13_emit_[26];
307   static const uint16_t table28_13_ops_[128];
308   static const uint16_t table28_14_ops_[128];
309   static const uint8_t table28_15_emit_[63];
310   static const uint16_t table28_15_ops_[128];
311   static const uint8_t* const table28_emit_[16];
312   static const uint16_t* const table28_ops_[16];
313   static const uint8_t table29_0_emit_[136];
314   static const uint16_t table29_0_ops_[128];
315   static const uint8_t table29_1_emit_[136];
316   static const uint8_t table29_2_emit_[136];
317   static const uint8_t table29_3_emit_[136];
318   static const uint8_t table29_4_emit_[136];
319   static const uint8_t table29_5_emit_[136];
320   static const uint8_t table29_6_emit_[136];
321   static const uint8_t table29_7_emit_[136];
322   static const uint8_t table29_8_emit_[136];
323   static const uint8_t table29_9_emit_[136];
324   static const uint8_t table29_10_emit_[136];
325   static const uint8_t table29_11_emit_[136];
326   static const uint8_t table29_12_emit_[144];
327   static const uint8_t table29_13_emit_[144];
328   static const uint8_t table29_14_emit_[144];
329   static const uint8_t table29_15_emit_[144];
330   static const uint8_t table29_16_emit_[144];
331   static const uint8_t table29_17_emit_[144];
332   static const uint8_t table29_18_emit_[144];
333   static const uint8_t table29_19_emit_[144];
334   static const uint8_t table29_20_emit_[144];
335   static const uint8_t table29_21_emit_[144];
336   static const uint8_t table29_22_emit_[144];
337   static const uint8_t table29_23_emit_[144];
338   static const uint8_t table29_24_emit_[144];
339   static const uint8_t table29_25_emit_[144];
340   static const uint8_t table29_26_emit_[112];
341   static const uint16_t table29_26_ops_[128];
342   static const uint8_t table29_27_emit_[80];
343   static const uint8_t table29_28_emit_[80];
344   static const uint8_t table29_29_emit_[44];
345   static const uint16_t table29_29_ops_[128];
346   static const uint8_t table29_30_emit_[17];
347   static const uint16_t table29_30_ops_[128];
348   static const uint8_t table29_31_emit_[46];
349   static const uint16_t table29_31_ops_[128];
350   static const uint8_t* const table29_emit_[32];
351   static const uint16_t* const table29_ops_[32];
352   static const uint8_t table21_0_emit_[1];
353   static const uint16_t table21_0_ops_[128];
354   static const uint8_t table21_2_emit_[1];
355   static const uint8_t table21_4_emit_[1];
356   static const uint8_t table21_6_emit_[1];
357   static const uint8_t table21_8_emit_[1];
358   static const uint8_t table21_10_emit_[1];
359   static const uint8_t table21_12_emit_[1];
360   static const uint8_t table21_14_emit_[1];
361   static const uint8_t table21_16_emit_[1];
362   static const uint8_t table21_18_emit_[1];
363   static const uint8_t table21_20_emit_[1];
364   static const uint8_t table21_22_emit_[1];
365   static const uint8_t table21_24_emit_[1];
366   static const uint16_t table21_24_ops_[128];
367   static const uint8_t table21_25_emit_[1];
368   static const uint8_t table21_26_emit_[1];
369   static const uint8_t table21_27_emit_[1];
370   static const uint8_t table21_28_emit_[1];
371   static const uint8_t table21_29_emit_[1];
372   static const uint8_t table21_30_emit_[1];
373   static const uint8_t table21_31_emit_[1];
374   static const uint8_t table21_32_emit_[1];
375   static const uint8_t table21_33_emit_[1];
376   static const uint8_t table21_34_emit_[1];
377   static const uint8_t table21_35_emit_[1];
378   static const uint8_t table21_36_emit_[1];
379   static const uint8_t table21_37_emit_[1];
380   static const uint8_t table21_38_emit_[1];
381   static const uint8_t table21_39_emit_[1];
382   static const uint8_t table21_40_emit_[1];
383   static const uint8_t table21_41_emit_[1];
384   static const uint8_t table21_42_emit_[1];
385   static const uint8_t table21_43_emit_[1];
386   static const uint8_t table21_44_emit_[1];
387   static const uint8_t table21_45_emit_[1];
388   static const uint8_t table21_46_emit_[1];
389   static const uint8_t table21_47_emit_[1];
390   static const uint8_t table21_48_emit_[1];
391   static const uint8_t table21_49_emit_[1];
392   static const uint8_t table21_50_emit_[1];
393   static const uint8_t table21_51_emit_[1];
394   static const uint8_t table21_52_emit_[1];
395   static const uint8_t table21_53_emit_[2];
396   static const uint16_t table21_53_ops_[128];
397   static const uint8_t table21_54_emit_[2];
398   static const uint8_t table21_55_emit_[2];
399   static const uint8_t table21_56_emit_[2];
400   static const uint8_t table21_57_emit_[2];
401   static const uint8_t table21_58_emit_[2];
402   static const uint8_t table21_59_emit_[4];
403   static const uint16_t table21_59_ops_[128];
404   static const uint8_t table21_60_emit_[8];
405   static const uint16_t table21_60_ops_[128];
406   static const uint8_t table21_61_emit_[9];
407   static const uint16_t table21_61_ops_[128];
408   static const uint8_t table21_62_emit_[16];
409   static const uint16_t table21_62_ops_[128];
410   static const uint8_t table21_63_emit_[33];
411   static const uint16_t table21_63_ops_[128];
412   static const uint8_t* const table21_emit_[64];
413   static const uint16_t* const table21_ops_[64];
414 };
415 template <typename F>
416 class HuffDecoder : public HuffDecoderCommon {
417  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)418   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
419       : sink_(sink), begin_(begin), end_(end) {}
Run()420   bool Run() {
421     while (!done_) {
422       if (!RefillTo7()) {
423         Done0();
424         break;
425       }
426       const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
427       const auto op = GetOp1(index);
428       const int consumed = op & 7;
429       buffer_len_ -= consumed;
430       const auto emit_ofs = op >> 6;
431       switch ((op >> 3) & 7) {
432         case 0: {
433           sink_(GetEmit1(index, emit_ofs + 0));
434           break;
435         }
436         case 1: {
437           DecodeStep0();
438           break;
439         }
440         case 2: {
441           DecodeStep1();
442           break;
443         }
444         case 3: {
445           DecodeStep2();
446           break;
447         }
448         case 4: {
449           DecodeStep3();
450           break;
451         }
452       }
453     }
454     return ok_;
455   }
456 
457  private:
RefillTo7()458   bool RefillTo7() {
459     switch (buffer_len_) {
460       case 0: {
461         return Read1to8Bytes();
462       }
463       case 1:
464       case 2:
465       case 3:
466       case 4:
467       case 5:
468       case 6: {
469         return Read1to7Bytes();
470       }
471     }
472     return true;
473   }
Read1to8Bytes()474   bool Read1to8Bytes() {
475     switch (end_ - begin_) {
476       case 0: {
477         return false;
478       }
479       case 1: {
480         Fill1();
481         return true;
482       }
483       case 2: {
484         Fill2();
485         return true;
486       }
487       case 3: {
488         Fill3();
489         return true;
490       }
491       case 4: {
492         Fill4();
493         return true;
494       }
495       case 5: {
496         Fill5();
497         return true;
498       }
499       case 6: {
500         Fill6();
501         return true;
502       }
503       case 7: {
504         Fill7();
505         return true;
506       }
507       default: {
508         Fill8();
509         return true;
510       }
511     }
512   }
Fill1()513   void Fill1() {
514     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
515     begin_ += 1;
516     buffer_len_ += 8;
517   }
Fill2()518   void Fill2() {
519     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
520               (static_cast<uint64_t>(begin_[1]) << 0);
521     begin_ += 2;
522     buffer_len_ += 16;
523   }
Fill3()524   void Fill3() {
525     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
526               (static_cast<uint64_t>(begin_[1]) << 8) |
527               (static_cast<uint64_t>(begin_[2]) << 0);
528     begin_ += 3;
529     buffer_len_ += 24;
530   }
Fill4()531   void Fill4() {
532     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
533               (static_cast<uint64_t>(begin_[1]) << 16) |
534               (static_cast<uint64_t>(begin_[2]) << 8) |
535               (static_cast<uint64_t>(begin_[3]) << 0);
536     begin_ += 4;
537     buffer_len_ += 32;
538   }
Fill5()539   void Fill5() {
540     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
541               (static_cast<uint64_t>(begin_[1]) << 24) |
542               (static_cast<uint64_t>(begin_[2]) << 16) |
543               (static_cast<uint64_t>(begin_[3]) << 8) |
544               (static_cast<uint64_t>(begin_[4]) << 0);
545     begin_ += 5;
546     buffer_len_ += 40;
547   }
Fill6()548   void Fill6() {
549     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
550               (static_cast<uint64_t>(begin_[1]) << 32) |
551               (static_cast<uint64_t>(begin_[2]) << 24) |
552               (static_cast<uint64_t>(begin_[3]) << 16) |
553               (static_cast<uint64_t>(begin_[4]) << 8) |
554               (static_cast<uint64_t>(begin_[5]) << 0);
555     begin_ += 6;
556     buffer_len_ += 48;
557   }
Fill7()558   void Fill7() {
559     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
560               (static_cast<uint64_t>(begin_[1]) << 40) |
561               (static_cast<uint64_t>(begin_[2]) << 32) |
562               (static_cast<uint64_t>(begin_[3]) << 24) |
563               (static_cast<uint64_t>(begin_[4]) << 16) |
564               (static_cast<uint64_t>(begin_[5]) << 8) |
565               (static_cast<uint64_t>(begin_[6]) << 0);
566     begin_ += 7;
567     buffer_len_ += 56;
568   }
Fill8()569   void Fill8() {
570     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
571               (static_cast<uint64_t>(begin_[1]) << 48) |
572               (static_cast<uint64_t>(begin_[2]) << 40) |
573               (static_cast<uint64_t>(begin_[3]) << 32) |
574               (static_cast<uint64_t>(begin_[4]) << 24) |
575               (static_cast<uint64_t>(begin_[5]) << 16) |
576               (static_cast<uint64_t>(begin_[6]) << 8) |
577               (static_cast<uint64_t>(begin_[7]) << 0);
578     begin_ += 8;
579     buffer_len_ += 64;
580   }
Read1to7Bytes()581   bool Read1to7Bytes() {
582     switch (end_ - begin_) {
583       case 0: {
584         return false;
585       }
586       case 1: {
587         Fill1();
588         return true;
589       }
590       case 2: {
591         Fill2();
592         return true;
593       }
594       case 3: {
595         Fill3();
596         return true;
597       }
598       case 4: {
599         Fill4();
600         return true;
601       }
602       case 5: {
603         Fill5();
604         return true;
605       }
606       case 6: {
607         Fill6();
608         return true;
609       }
610       default: {
611         Fill7();
612         return true;
613       }
614     }
615   }
Done0()616   void Done0() {
617     done_ = true;
618     switch (buffer_len_) {
619       case 1:
620       case 2:
621       case 3:
622       case 4: {
623         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
624         return;
625       }
626       case 5: {
627         const auto index = buffer_ & 31;
628         const auto op = GetOp2(index);
629         switch (op & 3) {
630           case 0: {
631             sink_(GetEmit2(index, (op >> 2) + 0));
632             break;
633           }
634           case 1: {
635             ok_ = false;
636             break;
637           }
638         }
639         return;
640       }
641       case 6: {
642         const auto index = buffer_ & 63;
643         const auto op = GetOp3(index);
644         switch (op & 3) {
645           case 0: {
646             ok_ = false;
647             break;
648           }
649           case 1: {
650             sink_(GetEmit3(index, (op >> 2) + 0));
651             break;
652           }
653         }
654         return;
655       }
656       case 0: {
657         return;
658       }
659     }
660   }
DecodeStep0()661   void DecodeStep0() {
662     if (!RefillTo1()) {
663       Done1();
664       return;
665     }
666     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
667     const auto op = GetOp4(index);
668     const int consumed = op & 1;
669     buffer_len_ -= consumed;
670     const auto emit_ofs = op >> 1;
671     sink_(GetEmit4(index, emit_ofs + 0));
672   }
RefillTo1()673   bool RefillTo1() {
674     switch (buffer_len_) {
675       case 0: {
676         return Read1to8Bytes();
677       }
678     }
679     return true;
680   }
Done1()681   void Done1() {
682     done_ = true;
683     ok_ = false;
684   }
DecodeStep1()685   void DecodeStep1() {
686     if (!RefillTo1()) {
687       Done2();
688       return;
689     }
690     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
691     const auto op = GetOp5(index);
692     const int consumed = op & 1;
693     buffer_len_ -= consumed;
694     const auto emit_ofs = op >> 1;
695     sink_(GetEmit5(index, emit_ofs + 0));
696   }
Done2()697   void Done2() {
698     done_ = true;
699     ok_ = false;
700   }
DecodeStep2()701   void DecodeStep2() {
702     if (!RefillTo1()) {
703       Done3();
704       return;
705     }
706     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
707     const auto op = GetOp6(index);
708     const int consumed = op & 1;
709     buffer_len_ -= consumed;
710     const auto emit_ofs = op >> 1;
711     sink_(GetEmit6(index, emit_ofs + 0));
712   }
Done3()713   void Done3() {
714     done_ = true;
715     ok_ = false;
716   }
DecodeStep3()717   void DecodeStep3() {
718     if (!RefillTo10()) {
719       Done4();
720       return;
721     }
722     const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
723     const auto op = GetOp7(index);
724     const int consumed = op & 15;
725     buffer_len_ -= consumed;
726     const auto emit_ofs = op >> 7;
727     switch ((op >> 4) & 7) {
728       case 0: {
729         sink_(GetEmit7(index, emit_ofs + 0));
730         break;
731       }
732       case 1: {
733         DecodeStep4();
734         break;
735       }
736       case 2: {
737         DecodeStep5();
738         break;
739       }
740       case 3: {
741         DecodeStep6();
742         break;
743       }
744       case 4: {
745         DecodeStep7();
746         break;
747       }
748     }
749   }
RefillTo10()750   bool RefillTo10() {
751     switch (buffer_len_) {
752       case 0: {
753         return Read2to8Bytes();
754       }
755       case 1: {
756         return Read2to7Bytes();
757       }
758       case 2:
759       case 3:
760       case 4:
761       case 5:
762       case 6:
763       case 7:
764       case 8: {
765         return Read1to7Bytes();
766       }
767       case 9: {
768         return Read1to6Bytes();
769       }
770     }
771     return true;
772   }
Read2to8Bytes()773   bool Read2to8Bytes() {
774     switch (end_ - begin_) {
775       case 0:
776       case 1: {
777         return false;
778       }
779       case 2: {
780         Fill2();
781         return true;
782       }
783       case 3: {
784         Fill3();
785         return true;
786       }
787       case 4: {
788         Fill4();
789         return true;
790       }
791       case 5: {
792         Fill5();
793         return true;
794       }
795       case 6: {
796         Fill6();
797         return true;
798       }
799       case 7: {
800         Fill7();
801         return true;
802       }
803       default: {
804         Fill8();
805         return true;
806       }
807     }
808   }
Read2to7Bytes()809   bool Read2to7Bytes() {
810     switch (end_ - begin_) {
811       case 0:
812       case 1: {
813         return false;
814       }
815       case 2: {
816         Fill2();
817         return true;
818       }
819       case 3: {
820         Fill3();
821         return true;
822       }
823       case 4: {
824         Fill4();
825         return true;
826       }
827       case 5: {
828         Fill5();
829         return true;
830       }
831       case 6: {
832         Fill6();
833         return true;
834       }
835       default: {
836         Fill7();
837         return true;
838       }
839     }
840   }
Read1to6Bytes()841   bool Read1to6Bytes() {
842     switch (end_ - begin_) {
843       case 0: {
844         return false;
845       }
846       case 1: {
847         Fill1();
848         return true;
849       }
850       case 2: {
851         Fill2();
852         return true;
853       }
854       case 3: {
855         Fill3();
856         return true;
857       }
858       case 4: {
859         Fill4();
860         return true;
861       }
862       case 5: {
863         Fill5();
864         return true;
865       }
866       default: {
867         Fill6();
868         return true;
869       }
870     }
871   }
Done4()872   void Done4() {
873     done_ = true;
874     switch (end_ - begin_) {
875       case 1: {
876         Fill1();
877         break;
878       }
879     }
880     switch (buffer_len_) {
881       case 1:
882       case 2: {
883         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
884         return;
885       }
886       case 3: {
887         const auto index = buffer_ & 7;
888         const auto op = GetOp8(index);
889         switch (op & 3) {
890           case 0: {
891             sink_(GetEmit8(index, (op >> 2) + 0));
892             break;
893           }
894           case 1: {
895             ok_ = false;
896             break;
897           }
898         }
899         return;
900       }
901       case 4: {
902         const auto index = buffer_ & 15;
903         const auto op = GetOp9(index);
904         switch (op & 3) {
905           case 0: {
906             ok_ = false;
907             break;
908           }
909           case 1: {
910             sink_(GetEmit9(index, (op >> 2) + 0));
911             break;
912           }
913         }
914         return;
915       }
916       case 5: {
917         const auto index = buffer_ & 31;
918         const auto op = GetOp10(index);
919         switch (op & 3) {
920           case 0: {
921             ok_ = false;
922             break;
923           }
924           case 1: {
925             sink_(GetEmit10(index, (op >> 2) + 0));
926             break;
927           }
928         }
929         return;
930       }
931       case 6: {
932         const auto index = buffer_ & 63;
933         const auto op = GetOp11(index);
934         switch (op & 3) {
935           case 0: {
936             ok_ = false;
937             break;
938           }
939           case 1: {
940             sink_(GetEmit11(index, (op >> 2) + 0));
941             break;
942           }
943         }
944         return;
945       }
946       case 7: {
947         const auto index = buffer_ & 127;
948         const auto op = GetOp12(index);
949         switch (op & 3) {
950           case 0: {
951             ok_ = false;
952             break;
953           }
954           case 1: {
955             sink_(GetEmit12(index, (op >> 2) + 0));
956             break;
957           }
958         }
959         return;
960       }
961       case 8: {
962         const auto index = buffer_ & 255;
963         const auto op = GetOp13(index);
964         switch (op & 3) {
965           case 0: {
966             sink_(GetEmit13(index, (op >> 2) + 0));
967             sink_(GetEmit13(index, (op >> 2) + 1));
968             break;
969           }
970           case 1: {
971             ok_ = false;
972             break;
973           }
974           case 2: {
975             sink_(GetEmit13(index, (op >> 2) + 0));
976             break;
977           }
978         }
979         return;
980       }
981       case 9: {
982         const auto index = buffer_ & 511;
983         const auto op = GetOp14(index);
984         switch (op & 3) {
985           case 0: {
986             ok_ = false;
987             break;
988           }
989           case 1: {
990             sink_(GetEmit14(index, (op >> 2) + 0));
991             sink_(GetEmit14(index, (op >> 2) + 1));
992             break;
993           }
994           case 2: {
995             sink_(GetEmit14(index, (op >> 2) + 0));
996             break;
997           }
998         }
999         return;
1000       }
1001       case 0: {
1002         return;
1003       }
1004     }
1005   }
DecodeStep4()1006   void DecodeStep4() {
1007     if (!RefillTo3()) {
1008       Done5();
1009       return;
1010     }
1011     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1012     const auto op = GetOp15(index);
1013     const int consumed = op & 3;
1014     buffer_len_ -= consumed;
1015     const auto emit_ofs = op >> 2;
1016     sink_(GetEmit15(index, emit_ofs + 0));
1017   }
RefillTo3()1018   bool RefillTo3() {
1019     switch (buffer_len_) {
1020       case 0: {
1021         return Read1to8Bytes();
1022       }
1023       case 1:
1024       case 2: {
1025         return Read1to7Bytes();
1026       }
1027     }
1028     return true;
1029   }
Done5()1030   void Done5() {
1031     done_ = true;
1032     switch (buffer_len_) {
1033       case 1:
1034       case 0: {
1035         ok_ = false;
1036         return;
1037       }
1038       case 2: {
1039         const auto index = buffer_ & 3;
1040         const auto op = GetOp16(index);
1041         switch (op & 1) {
1042           case 0: {
1043             sink_(GetEmit16(index, (op >> 1) + 0));
1044             break;
1045           }
1046           case 1: {
1047             ok_ = false;
1048             break;
1049           }
1050         }
1051         return;
1052       }
1053     }
1054   }
DecodeStep5()1055   void DecodeStep5() {
1056     if (!RefillTo4()) {
1057       Done6();
1058       return;
1059     }
1060     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1061     const auto op = GetOp17(index);
1062     const int consumed = op & 7;
1063     buffer_len_ -= consumed;
1064     const auto emit_ofs = op >> 3;
1065     sink_(GetEmit17(index, emit_ofs + 0));
1066   }
RefillTo4()1067   bool RefillTo4() {
1068     switch (buffer_len_) {
1069       case 0: {
1070         return Read1to8Bytes();
1071       }
1072       case 1:
1073       case 2:
1074       case 3: {
1075         return Read1to7Bytes();
1076       }
1077     }
1078     return true;
1079   }
Done6()1080   void Done6() {
1081     done_ = true;
1082     switch (buffer_len_) {
1083       case 1:
1084       case 2:
1085       case 0: {
1086         ok_ = false;
1087         return;
1088       }
1089       case 3: {
1090         const auto index = buffer_ & 7;
1091         const auto op = GetOp18(index);
1092         switch (op & 1) {
1093           case 0: {
1094             sink_(GetEmit18(index, (op >> 1) + 0));
1095             break;
1096           }
1097           case 1: {
1098             ok_ = false;
1099             break;
1100           }
1101         }
1102         return;
1103       }
1104     }
1105   }
DecodeStep6()1106   void DecodeStep6() {
1107     if (!RefillTo5()) {
1108       Done7();
1109       return;
1110     }
1111     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1112     const auto op = GetOp19(index);
1113     const int consumed = op & 7;
1114     buffer_len_ -= consumed;
1115     const auto emit_ofs = op >> 3;
1116     sink_(GetEmit19(index, emit_ofs + 0));
1117   }
RefillTo5()1118   bool RefillTo5() {
1119     switch (buffer_len_) {
1120       case 0: {
1121         return Read1to8Bytes();
1122       }
1123       case 1:
1124       case 2:
1125       case 3:
1126       case 4: {
1127         return Read1to7Bytes();
1128       }
1129     }
1130     return true;
1131   }
Done7()1132   void Done7() {
1133     done_ = true;
1134     switch (buffer_len_) {
1135       case 1:
1136       case 2:
1137       case 3:
1138       case 0: {
1139         ok_ = false;
1140         return;
1141       }
1142       case 4: {
1143         const auto index = buffer_ & 15;
1144         const auto op = GetOp20(index);
1145         switch (op & 1) {
1146           case 0: {
1147             sink_(GetEmit20(index, (op >> 1) + 0));
1148             break;
1149           }
1150           case 1: {
1151             ok_ = false;
1152             break;
1153           }
1154         }
1155         return;
1156       }
1157     }
1158   }
DecodeStep7()1159   void DecodeStep7() {
1160     if (!RefillTo13()) {
1161       Done8();
1162       return;
1163     }
1164     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
1165     const auto op = GetOp21(index);
1166     const int consumed = op & 15;
1167     buffer_len_ -= consumed;
1168     const auto emit_ofs = op >> 5;
1169     switch ((op >> 4) & 1) {
1170       case 0: {
1171         sink_(GetEmit21(index, emit_ofs + 0));
1172         break;
1173       }
1174       case 1: {
1175         begin_ = end_;
1176         buffer_len_ = 0;
1177         break;
1178       }
1179     }
1180   }
RefillTo13()1181   bool RefillTo13() {
1182     switch (buffer_len_) {
1183       case 0: {
1184         return Read2to8Bytes();
1185       }
1186       case 1:
1187       case 2:
1188       case 3:
1189       case 4: {
1190         return Read2to7Bytes();
1191       }
1192       case 5:
1193       case 6:
1194       case 7:
1195       case 8: {
1196         return Read1to7Bytes();
1197       }
1198       case 9:
1199       case 10:
1200       case 11:
1201       case 12: {
1202         return Read1to6Bytes();
1203       }
1204     }
1205     return true;
1206   }
Done8()1207   void Done8() {
1208     done_ = true;
1209     switch (end_ - begin_) {
1210       case 1: {
1211         Fill1();
1212         break;
1213       }
1214     }
1215     switch (buffer_len_) {
1216       case 1:
1217       case 2:
1218       case 3:
1219       case 4: {
1220         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1221         return;
1222       }
1223       case 5: {
1224         const auto index = buffer_ & 31;
1225         const auto op = GetOp22(index);
1226         switch (op & 3) {
1227           case 0: {
1228             sink_(GetEmit22(index, (op >> 2) + 0));
1229             break;
1230           }
1231           case 1: {
1232             ok_ = false;
1233             break;
1234           }
1235         }
1236         return;
1237       }
1238       case 6: {
1239         const auto index = buffer_ & 63;
1240         const auto op = GetOp23(index);
1241         switch (op & 3) {
1242           case 0: {
1243             ok_ = false;
1244             break;
1245           }
1246           case 1: {
1247             sink_(GetEmit23(index, (op >> 2) + 0));
1248             break;
1249           }
1250         }
1251         return;
1252       }
1253       case 7: {
1254         const auto index = buffer_ & 127;
1255         const auto op = GetOp24(index);
1256         switch (op & 3) {
1257           case 0: {
1258             ok_ = false;
1259             break;
1260           }
1261           case 1: {
1262             sink_(GetEmit24(index, (op >> 2) + 0));
1263             break;
1264           }
1265         }
1266         return;
1267       }
1268       case 8: {
1269         const auto index = buffer_ & 255;
1270         const auto op = GetOp25(index);
1271         switch (op & 3) {
1272           case 0: {
1273             ok_ = false;
1274             break;
1275           }
1276           case 1: {
1277             sink_(GetEmit25(index, (op >> 2) + 0));
1278             break;
1279           }
1280         }
1281         return;
1282       }
1283       case 9: {
1284         const auto index = buffer_ & 511;
1285         const auto op = GetOp26(index);
1286         switch (op & 3) {
1287           case 0: {
1288             ok_ = false;
1289             break;
1290           }
1291           case 1: {
1292             sink_(GetEmit26(index, (op >> 2) + 0));
1293             break;
1294           }
1295         }
1296         return;
1297       }
1298       case 10: {
1299         const auto index = buffer_ & 1023;
1300         const auto op = GetOp27(index);
1301         switch (op & 3) {
1302           case 0: {
1303             sink_(GetEmit27(index, (op >> 2) + 0));
1304             sink_(GetEmit27(index, (op >> 2) + 1));
1305             break;
1306           }
1307           case 1: {
1308             ok_ = false;
1309             break;
1310           }
1311           case 2: {
1312             sink_(GetEmit27(index, (op >> 2) + 0));
1313             break;
1314           }
1315         }
1316         return;
1317       }
1318       case 11: {
1319         const auto index = buffer_ & 2047;
1320         const auto op = GetOp28(index);
1321         switch (op & 3) {
1322           case 0: {
1323             ok_ = false;
1324             break;
1325           }
1326           case 1: {
1327             sink_(GetEmit28(index, (op >> 2) + 0));
1328             sink_(GetEmit28(index, (op >> 2) + 1));
1329             break;
1330           }
1331           case 2: {
1332             sink_(GetEmit28(index, (op >> 2) + 0));
1333             break;
1334           }
1335         }
1336         return;
1337       }
1338       case 12: {
1339         const auto index = buffer_ & 4095;
1340         const auto op = GetOp29(index);
1341         switch (op & 3) {
1342           case 0: {
1343             ok_ = false;
1344             break;
1345           }
1346           case 1: {
1347             sink_(GetEmit29(index, (op >> 2) + 0));
1348             sink_(GetEmit29(index, (op >> 2) + 1));
1349             break;
1350           }
1351           case 2: {
1352             sink_(GetEmit29(index, (op >> 2) + 0));
1353             break;
1354           }
1355         }
1356         return;
1357       }
1358       case 0: {
1359         return;
1360       }
1361     }
1362   }
1363   F sink_;
1364   const uint8_t* begin_;
1365   const uint8_t* const end_;
1366   uint64_t buffer_ = 0;
1367   int buffer_len_ = 0;
1368   bool ok_ = true;
1369   bool done_ = false;
1370 };
1371 }  // namespace geometry_7_10_13
1372 }  // namespace grpc_core
1373 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_10_13_H
1374