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