xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_10_7_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_10_7_13_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_7_13_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_10_7_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   }
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   }
GetOp8(size_t i)82   static inline uint64_t GetOp8(size_t i) {
83     return table8_ops_[i >> 5][i & 0x1f];
84   }
GetEmit8(size_t i,size_t emit)85   static inline uint64_t GetEmit8(size_t i, size_t emit) {
86     return table8_emit_[i >> 5][emit];
87   }
GetOp14(size_t i)88   static inline uint64_t GetOp14(size_t i) {
89     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
90   }
GetEmit14(size_t,size_t emit)91   static inline uint64_t GetEmit14(size_t, size_t emit) {
92     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
93   }
GetOp13(size_t i)94   static inline uint64_t GetOp13(size_t i) {
95     return table13_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))];
96   }
GetEmit13(size_t,size_t emit)97   static inline uint64_t GetEmit13(size_t, size_t emit) {
98     return table13_0_emit_[emit];
99   }
GetOp16(size_t i)100   static inline uint64_t GetOp16(size_t i) {
101     return table16_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))];
102   }
GetEmit16(size_t,size_t emit)103   static inline uint64_t GetEmit16(size_t, size_t emit) {
104     return table16_0_emit_[emit];
105   }
GetOp15(size_t i)106   static inline uint64_t GetOp15(size_t i) {
107     return table15_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))];
108   }
GetEmit15(size_t,size_t emit)109   static inline uint64_t GetEmit15(size_t, size_t emit) {
110     return table15_0_emit_[emit];
111   }
GetOp18(size_t i)112   static inline uint64_t GetOp18(size_t i) {
113     return table18_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))];
114   }
GetEmit18(size_t,size_t emit)115   static inline uint64_t GetEmit18(size_t, size_t emit) {
116     return table18_0_emit_[emit];
117   }
GetOp17(size_t i)118   static inline uint64_t GetOp17(size_t i) { return table17_0_ops_[i]; }
GetEmit17(size_t,size_t emit)119   static inline uint64_t GetEmit17(size_t, size_t emit) {
120     return table17_0_emit_[emit];
121   }
GetOp20(size_t i)122   static inline uint64_t GetOp20(size_t i) { return table20_0_ops_[i]; }
GetEmit20(size_t,size_t emit)123   static inline uint64_t GetEmit20(size_t, size_t emit) {
124     return table20_0_emit_[emit];
125   }
GetOp21(size_t i)126   static inline uint64_t GetOp21(size_t i) { return table21_0_ops_[i]; }
GetEmit21(size_t,size_t emit)127   static inline uint64_t GetEmit21(size_t, size_t emit) {
128     return table21_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) {
139     return table24_ops_[i >> 6][i & 0x3f];
140   }
GetEmit24(size_t i,size_t emit)141   static inline uint64_t GetEmit24(size_t i, size_t emit) {
142     return table24_emit_[i >> 6][emit];
143   }
GetOp25(size_t i)144   static inline uint64_t GetOp25(size_t i) {
145     return table25_ops_[i >> 6][i & 0x3f];
146   }
GetEmit25(size_t i,size_t emit)147   static inline uint64_t GetEmit25(size_t i, size_t emit) {
148     return table25_emit_[i >> 6][emit];
149   }
GetOp26(size_t i)150   static inline uint64_t GetOp26(size_t i) {
151     return table26_ops_[i >> 7][i & 0x7f];
152   }
GetEmit26(size_t i,size_t emit)153   static inline uint64_t GetEmit26(size_t i, size_t emit) {
154     return table26_emit_[i >> 7][emit];
155   }
GetOp27(size_t i)156   static inline uint64_t GetOp27(size_t i) {
157     return table27_ops_[i >> 7][i & 0x7f];
158   }
GetEmit27(size_t i,size_t emit)159   static inline uint64_t GetEmit27(size_t i, size_t emit) {
160     return table27_emit_[i >> 7][emit];
161   }
GetOp19(size_t i)162   static inline uint64_t GetOp19(size_t i) {
163     return table19_ops_[i >> 7][i & 0x7f];
164   }
GetEmit19(size_t i,size_t emit)165   static inline uint64_t GetEmit19(size_t i, size_t emit) {
166     return table19_emit_[i >> 7][emit];
167   }
GetOp29(size_t i)168   static inline uint64_t GetOp29(size_t i) { return i; }
GetEmit29(size_t,size_t emit)169   static inline uint64_t GetEmit29(size_t, size_t emit) {
170     return ((void)emit, 124);
171   }
GetOp28(size_t i)172   static inline uint64_t GetOp28(size_t i) {
173     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
174                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
175                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
176   }
GetEmit28(size_t,size_t emit)177   static inline uint64_t GetEmit28(size_t, size_t emit) {
178     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
179   }
180 
181  private:
182   static const uint8_t table2_0_emit_[10];
183   static const uint8_t table2_0_ops_[32];
184   static const uint8_t table3_0_emit_[36];
185   static const uint8_t table3_0_ops_[64];
186   static const uint8_t table4_0_emit_[22];
187   static const uint8_t table4_0_ops_[64];
188   static const uint8_t table4_1_emit_[46];
189   static const uint8_t table4_1_ops_[64];
190   static const uint8_t* const table4_emit_[2];
191   static const uint8_t* const table4_ops_[2];
192   static const uint8_t table5_0_ops_[128];
193   static const uint8_t table5_1_emit_[52];
194   static const uint8_t table5_1_ops_[128];
195   static const uint8_t* const table5_emit_[2];
196   static const uint8_t* const table5_ops_[2];
197   static const uint8_t table6_0_emit_[2];
198   static const uint8_t table6_0_ops_[32];
199   static const uint8_t table6_1_emit_[2];
200   static const uint8_t table6_2_emit_[2];
201   static const uint8_t table6_3_emit_[2];
202   static const uint8_t table6_4_emit_[2];
203   static const uint8_t table6_5_emit_[4];
204   static const uint8_t table6_5_ops_[32];
205   static const uint8_t table6_6_emit_[4];
206   static const uint8_t table6_7_emit_[4];
207   static const uint8_t table6_8_emit_[4];
208   static const uint8_t table6_9_emit_[4];
209   static const uint8_t table6_10_emit_[4];
210   static const uint8_t table6_11_emit_[6];
211   static const uint8_t table6_11_ops_[32];
212   static const uint8_t table6_12_emit_[8];
213   static const uint8_t table6_12_ops_[32];
214   static const uint8_t table6_13_emit_[8];
215   static const uint8_t table6_14_emit_[8];
216   static const uint8_t table6_15_emit_[10];
217   static const uint8_t table6_15_ops_[32];
218   static const uint8_t* const table6_emit_[16];
219   static const uint8_t* const table6_ops_[16];
220   static const uint8_t table1_0_emit_[36];
221   static const uint16_t table1_0_inner_[22];
222   static const uint8_t table1_0_outer_[64];
223   static const uint8_t table1_1_emit_[36];
224   static const uint16_t table1_1_inner_[22];
225   static const uint8_t table1_2_emit_[36];
226   static const uint16_t table1_2_inner_[22];
227   static const uint8_t table1_3_emit_[36];
228   static const uint16_t table1_3_inner_[22];
229   static const uint8_t table1_4_emit_[38];
230   static const uint16_t table1_4_inner_[22];
231   static const uint16_t table1_5_inner_[4];
232   static const uint8_t table1_5_outer_[64];
233   static const uint16_t table1_11_inner_[6];
234   static const uint8_t table1_11_outer_[64];
235   static const uint16_t table1_12_inner_[8];
236   static const uint8_t table1_12_outer_[64];
237   static const uint8_t table1_15_emit_[15];
238   static const uint16_t table1_15_inner_[18];
239   static const uint8_t table1_15_outer_[64];
240   static const uint8_t* const table1_emit_[16];
241   static const uint16_t* const table1_inner_[16];
242   static const uint8_t* const table1_outer_[16];
243   static const uint8_t table9_0_emit_[6];
244   static const uint8_t table9_0_inner_[8];
245   static const uint8_t table10_0_emit_[8];
246   static const uint8_t table10_0_inner_[10];
247   static const uint8_t table10_0_outer_[16];
248   static const uint8_t table11_0_emit_[11];
249   static const uint8_t table11_0_ops_[32];
250   static const uint8_t table12_0_ops_[64];
251   static const uint8_t table8_0_emit_[2];
252   static const uint16_t table8_0_ops_[32];
253   static const uint8_t table8_1_emit_[2];
254   static const uint8_t table8_2_emit_[2];
255   static const uint8_t table8_3_emit_[5];
256   static const uint16_t table8_3_ops_[32];
257   static const uint8_t* const table8_emit_[4];
258   static const uint16_t* const table8_ops_[4];
259   static const uint8_t table13_0_emit_[5];
260   static const uint8_t table13_0_inner_[5];
261   static const uint8_t table16_0_emit_[6];
262   static const uint8_t table16_0_inner_[7];
263   static const uint8_t table15_0_emit_[10];
264   static const uint8_t table15_0_inner_[10];
265   static const uint8_t table18_0_emit_[9];
266   static const uint8_t table18_0_inner_[10];
267   static const uint8_t table17_0_emit_[23];
268   static const uint8_t table17_0_ops_[32];
269   static const uint8_t table20_0_emit_[12];
270   static const uint8_t table20_0_ops_[32];
271   static const uint8_t table21_0_emit_[41];
272   static const uint8_t table21_0_ops_[64];
273   static const uint8_t table22_0_emit_[53];
274   static const uint8_t table22_0_ops_[128];
275   static const uint8_t table23_0_emit_[57];
276   static const uint8_t table23_0_ops_[256];
277   static const uint8_t table24_0_emit_[4];
278   static const uint8_t table24_0_ops_[64];
279   static const uint8_t table24_1_emit_[4];
280   static const uint8_t table24_2_emit_[4];
281   static const uint8_t table24_3_emit_[8];
282   static const uint8_t table24_3_ops_[64];
283   static const uint8_t table24_4_emit_[8];
284   static const uint8_t table24_5_emit_[8];
285   static const uint8_t table24_6_emit_[11];
286   static const uint8_t table24_6_ops_[64];
287   static const uint8_t table24_7_emit_[25];
288   static const uint8_t table24_7_ops_[64];
289   static const uint8_t* const table24_emit_[8];
290   static const uint8_t* const table24_ops_[8];
291   static const uint8_t table25_0_emit_[40];
292   static const uint8_t table25_0_ops_[64];
293   static const uint8_t table25_1_emit_[40];
294   static const uint8_t table25_2_emit_[40];
295   static const uint8_t table25_3_emit_[40];
296   static const uint8_t table25_4_emit_[40];
297   static const uint8_t table25_5_emit_[40];
298   static const uint8_t table25_6_emit_[4];
299   static const uint8_t table25_6_ops_[64];
300   static const uint8_t table25_7_emit_[4];
301   static const uint8_t table25_8_emit_[4];
302   static const uint8_t table25_9_emit_[4];
303   static const uint8_t table25_10_emit_[4];
304   static const uint8_t table25_11_emit_[4];
305   static const uint8_t table25_12_emit_[4];
306   static const uint8_t table25_13_emit_[7];
307   static const uint8_t table25_13_ops_[64];
308   static const uint8_t table25_14_emit_[10];
309   static const uint8_t table25_14_ops_[64];
310   static const uint8_t table25_15_emit_[34];
311   static const uint8_t table25_15_ops_[64];
312   static const uint8_t* const table25_emit_[16];
313   static const uint8_t* const table25_ops_[16];
314   static const uint8_t table26_0_emit_[144];
315   static const uint16_t table26_0_ops_[128];
316   static const uint8_t table26_1_emit_[144];
317   static const uint8_t table26_2_emit_[144];
318   static const uint8_t table26_3_emit_[144];
319   static const uint8_t table26_4_emit_[144];
320   static const uint8_t table26_5_emit_[144];
321   static const uint8_t table26_6_emit_[80];
322   static const uint16_t table26_6_ops_[128];
323   static const uint8_t table26_7_emit_[80];
324   static const uint8_t table26_8_emit_[80];
325   static const uint8_t table26_9_emit_[80];
326   static const uint8_t table26_10_emit_[80];
327   static const uint8_t table26_11_emit_[80];
328   static const uint8_t table26_12_emit_[80];
329   static const uint8_t table26_13_emit_[26];
330   static const uint16_t table26_13_ops_[128];
331   static const uint16_t table26_14_ops_[128];
332   static const uint8_t table26_15_emit_[63];
333   static const uint16_t table26_15_ops_[128];
334   static const uint8_t* const table26_emit_[16];
335   static const uint16_t* const table26_ops_[16];
336   static const uint8_t table27_0_emit_[136];
337   static const uint16_t table27_0_ops_[128];
338   static const uint8_t table27_1_emit_[136];
339   static const uint8_t table27_2_emit_[136];
340   static const uint8_t table27_3_emit_[136];
341   static const uint8_t table27_4_emit_[136];
342   static const uint8_t table27_5_emit_[136];
343   static const uint8_t table27_6_emit_[136];
344   static const uint8_t table27_7_emit_[136];
345   static const uint8_t table27_8_emit_[136];
346   static const uint8_t table27_9_emit_[136];
347   static const uint8_t table27_10_emit_[136];
348   static const uint8_t table27_11_emit_[136];
349   static const uint8_t table27_12_emit_[144];
350   static const uint8_t table27_13_emit_[144];
351   static const uint8_t table27_14_emit_[144];
352   static const uint8_t table27_15_emit_[144];
353   static const uint8_t table27_16_emit_[144];
354   static const uint8_t table27_17_emit_[144];
355   static const uint8_t table27_18_emit_[144];
356   static const uint8_t table27_19_emit_[144];
357   static const uint8_t table27_20_emit_[144];
358   static const uint8_t table27_21_emit_[144];
359   static const uint8_t table27_22_emit_[144];
360   static const uint8_t table27_23_emit_[144];
361   static const uint8_t table27_24_emit_[144];
362   static const uint8_t table27_25_emit_[144];
363   static const uint8_t table27_26_emit_[112];
364   static const uint16_t table27_26_ops_[128];
365   static const uint8_t table27_27_emit_[80];
366   static const uint8_t table27_28_emit_[80];
367   static const uint8_t table27_29_emit_[44];
368   static const uint16_t table27_29_ops_[128];
369   static const uint8_t table27_30_emit_[17];
370   static const uint16_t table27_30_ops_[128];
371   static const uint8_t table27_31_emit_[46];
372   static const uint16_t table27_31_ops_[128];
373   static const uint8_t* const table27_emit_[32];
374   static const uint16_t* const table27_ops_[32];
375   static const uint8_t table19_0_emit_[1];
376   static const uint16_t table19_0_ops_[128];
377   static const uint8_t table19_2_emit_[1];
378   static const uint8_t table19_4_emit_[1];
379   static const uint8_t table19_6_emit_[1];
380   static const uint8_t table19_8_emit_[1];
381   static const uint8_t table19_10_emit_[1];
382   static const uint8_t table19_12_emit_[1];
383   static const uint8_t table19_14_emit_[1];
384   static const uint8_t table19_16_emit_[1];
385   static const uint8_t table19_18_emit_[1];
386   static const uint8_t table19_20_emit_[1];
387   static const uint8_t table19_22_emit_[1];
388   static const uint8_t table19_24_emit_[1];
389   static const uint16_t table19_24_ops_[128];
390   static const uint8_t table19_25_emit_[1];
391   static const uint8_t table19_26_emit_[1];
392   static const uint8_t table19_27_emit_[1];
393   static const uint8_t table19_28_emit_[1];
394   static const uint8_t table19_29_emit_[1];
395   static const uint8_t table19_30_emit_[1];
396   static const uint8_t table19_31_emit_[1];
397   static const uint8_t table19_32_emit_[1];
398   static const uint8_t table19_33_emit_[1];
399   static const uint8_t table19_34_emit_[1];
400   static const uint8_t table19_35_emit_[1];
401   static const uint8_t table19_36_emit_[1];
402   static const uint8_t table19_37_emit_[1];
403   static const uint8_t table19_38_emit_[1];
404   static const uint8_t table19_39_emit_[1];
405   static const uint8_t table19_40_emit_[1];
406   static const uint8_t table19_41_emit_[1];
407   static const uint8_t table19_42_emit_[1];
408   static const uint8_t table19_43_emit_[1];
409   static const uint8_t table19_44_emit_[1];
410   static const uint8_t table19_45_emit_[1];
411   static const uint8_t table19_46_emit_[1];
412   static const uint8_t table19_47_emit_[1];
413   static const uint8_t table19_48_emit_[1];
414   static const uint8_t table19_49_emit_[1];
415   static const uint8_t table19_50_emit_[1];
416   static const uint8_t table19_51_emit_[1];
417   static const uint8_t table19_52_emit_[1];
418   static const uint8_t table19_53_emit_[2];
419   static const uint16_t table19_53_ops_[128];
420   static const uint8_t table19_54_emit_[2];
421   static const uint8_t table19_55_emit_[2];
422   static const uint8_t table19_56_emit_[2];
423   static const uint8_t table19_57_emit_[2];
424   static const uint8_t table19_58_emit_[2];
425   static const uint8_t table19_59_emit_[4];
426   static const uint16_t table19_59_ops_[128];
427   static const uint8_t table19_60_emit_[8];
428   static const uint16_t table19_60_ops_[128];
429   static const uint8_t table19_61_emit_[9];
430   static const uint16_t table19_61_ops_[128];
431   static const uint8_t table19_62_emit_[16];
432   static const uint16_t table19_62_ops_[128];
433   static const uint8_t table19_63_emit_[33];
434   static const uint16_t table19_63_ops_[128];
435   static const uint8_t* const table19_emit_[64];
436   static const uint16_t* const table19_ops_[64];
437 };
438 template <typename F>
439 class HuffDecoder : public HuffDecoderCommon {
440  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)441   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
442       : sink_(sink), begin_(begin), end_(end) {}
Run()443   bool Run() {
444     while (!done_) {
445       if (!RefillTo10()) {
446         Done0();
447         break;
448       }
449       const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff;
450       const auto op = GetOp1(index);
451       const int consumed = op & 15;
452       buffer_len_ -= consumed;
453       const auto emit_ofs = op >> 7;
454       switch ((op >> 4) & 7) {
455         case 0: {
456           sink_(GetEmit1(index, emit_ofs + 0));
457           sink_(GetEmit1(index, emit_ofs + 1));
458           break;
459         }
460         case 1: {
461           sink_(GetEmit1(index, emit_ofs + 0));
462           break;
463         }
464         case 2: {
465           DecodeStep0();
466           break;
467         }
468         case 3: {
469           DecodeStep6();
470           break;
471         }
472         case 4: {
473           DecodeStep1();
474           break;
475         }
476       }
477     }
478     return ok_;
479   }
480 
481  private:
RefillTo10()482   bool RefillTo10() {
483     switch (buffer_len_) {
484       case 0: {
485         return Read2to8Bytes();
486       }
487       case 1: {
488         return Read2to7Bytes();
489       }
490       case 2:
491       case 3:
492       case 4:
493       case 5:
494       case 6:
495       case 7:
496       case 8: {
497         return Read1to7Bytes();
498       }
499       case 9: {
500         return Read1to6Bytes();
501       }
502     }
503     return true;
504   }
Read2to8Bytes()505   bool Read2to8Bytes() {
506     switch (end_ - begin_) {
507       case 0:
508       case 1: {
509         return false;
510       }
511       case 2: {
512         Fill2();
513         return true;
514       }
515       case 3: {
516         Fill3();
517         return true;
518       }
519       case 4: {
520         Fill4();
521         return true;
522       }
523       case 5: {
524         Fill5();
525         return true;
526       }
527       case 6: {
528         Fill6();
529         return true;
530       }
531       case 7: {
532         Fill7();
533         return true;
534       }
535       default: {
536         Fill8();
537         return true;
538       }
539     }
540   }
Fill2()541   void Fill2() {
542     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
543               (static_cast<uint64_t>(begin_[1]) << 0);
544     begin_ += 2;
545     buffer_len_ += 16;
546   }
Fill3()547   void Fill3() {
548     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
549               (static_cast<uint64_t>(begin_[1]) << 8) |
550               (static_cast<uint64_t>(begin_[2]) << 0);
551     begin_ += 3;
552     buffer_len_ += 24;
553   }
Fill4()554   void Fill4() {
555     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
556               (static_cast<uint64_t>(begin_[1]) << 16) |
557               (static_cast<uint64_t>(begin_[2]) << 8) |
558               (static_cast<uint64_t>(begin_[3]) << 0);
559     begin_ += 4;
560     buffer_len_ += 32;
561   }
Fill5()562   void Fill5() {
563     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
564               (static_cast<uint64_t>(begin_[1]) << 24) |
565               (static_cast<uint64_t>(begin_[2]) << 16) |
566               (static_cast<uint64_t>(begin_[3]) << 8) |
567               (static_cast<uint64_t>(begin_[4]) << 0);
568     begin_ += 5;
569     buffer_len_ += 40;
570   }
Fill6()571   void Fill6() {
572     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
573               (static_cast<uint64_t>(begin_[1]) << 32) |
574               (static_cast<uint64_t>(begin_[2]) << 24) |
575               (static_cast<uint64_t>(begin_[3]) << 16) |
576               (static_cast<uint64_t>(begin_[4]) << 8) |
577               (static_cast<uint64_t>(begin_[5]) << 0);
578     begin_ += 6;
579     buffer_len_ += 48;
580   }
Fill7()581   void Fill7() {
582     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
583               (static_cast<uint64_t>(begin_[1]) << 40) |
584               (static_cast<uint64_t>(begin_[2]) << 32) |
585               (static_cast<uint64_t>(begin_[3]) << 24) |
586               (static_cast<uint64_t>(begin_[4]) << 16) |
587               (static_cast<uint64_t>(begin_[5]) << 8) |
588               (static_cast<uint64_t>(begin_[6]) << 0);
589     begin_ += 7;
590     buffer_len_ += 56;
591   }
Fill8()592   void Fill8() {
593     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
594               (static_cast<uint64_t>(begin_[1]) << 48) |
595               (static_cast<uint64_t>(begin_[2]) << 40) |
596               (static_cast<uint64_t>(begin_[3]) << 32) |
597               (static_cast<uint64_t>(begin_[4]) << 24) |
598               (static_cast<uint64_t>(begin_[5]) << 16) |
599               (static_cast<uint64_t>(begin_[6]) << 8) |
600               (static_cast<uint64_t>(begin_[7]) << 0);
601     begin_ += 8;
602     buffer_len_ += 64;
603   }
Read2to7Bytes()604   bool Read2to7Bytes() {
605     switch (end_ - begin_) {
606       case 0:
607       case 1: {
608         return false;
609       }
610       case 2: {
611         Fill2();
612         return true;
613       }
614       case 3: {
615         Fill3();
616         return true;
617       }
618       case 4: {
619         Fill4();
620         return true;
621       }
622       case 5: {
623         Fill5();
624         return true;
625       }
626       case 6: {
627         Fill6();
628         return true;
629       }
630       default: {
631         Fill7();
632         return true;
633       }
634     }
635   }
Read1to7Bytes()636   bool Read1to7Bytes() {
637     switch (end_ - begin_) {
638       case 0: {
639         return false;
640       }
641       case 1: {
642         Fill1();
643         return true;
644       }
645       case 2: {
646         Fill2();
647         return true;
648       }
649       case 3: {
650         Fill3();
651         return true;
652       }
653       case 4: {
654         Fill4();
655         return true;
656       }
657       case 5: {
658         Fill5();
659         return true;
660       }
661       case 6: {
662         Fill6();
663         return true;
664       }
665       default: {
666         Fill7();
667         return true;
668       }
669     }
670   }
Fill1()671   void Fill1() {
672     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
673     begin_ += 1;
674     buffer_len_ += 8;
675   }
Read1to6Bytes()676   bool Read1to6Bytes() {
677     switch (end_ - begin_) {
678       case 0: {
679         return false;
680       }
681       case 1: {
682         Fill1();
683         return true;
684       }
685       case 2: {
686         Fill2();
687         return true;
688       }
689       case 3: {
690         Fill3();
691         return true;
692       }
693       case 4: {
694         Fill4();
695         return true;
696       }
697       case 5: {
698         Fill5();
699         return true;
700       }
701       default: {
702         Fill6();
703         return true;
704       }
705     }
706   }
Done0()707   void Done0() {
708     done_ = true;
709     switch (end_ - begin_) {
710       case 1: {
711         Fill1();
712         break;
713       }
714     }
715     switch (buffer_len_) {
716       case 1:
717       case 2:
718       case 3:
719       case 4: {
720         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
721         return;
722       }
723       case 5: {
724         const auto index = buffer_ & 31;
725         const auto op = GetOp2(index);
726         switch (op & 3) {
727           case 0: {
728             sink_(GetEmit2(index, (op >> 2) + 0));
729             break;
730           }
731           case 1: {
732             ok_ = false;
733             break;
734           }
735         }
736         return;
737       }
738       case 6: {
739         const auto index = buffer_ & 63;
740         const auto op = GetOp3(index);
741         switch (op & 3) {
742           case 0: {
743             ok_ = false;
744             break;
745           }
746           case 1: {
747             sink_(GetEmit3(index, (op >> 2) + 0));
748             break;
749           }
750         }
751         return;
752       }
753       case 7: {
754         const auto index = buffer_ & 127;
755         const auto op = GetOp4(index);
756         switch (op & 3) {
757           case 0: {
758             ok_ = false;
759             break;
760           }
761           case 1: {
762             sink_(GetEmit4(index, (op >> 2) + 0));
763             break;
764           }
765         }
766         return;
767       }
768       case 8: {
769         const auto index = buffer_ & 255;
770         const auto op = GetOp5(index);
771         switch (op & 3) {
772           case 0: {
773             ok_ = false;
774             break;
775           }
776           case 1: {
777             sink_(GetEmit5(index, (op >> 2) + 0));
778             break;
779           }
780         }
781         return;
782       }
783       case 9: {
784         const auto index = buffer_ & 511;
785         const auto op = GetOp6(index);
786         switch (op & 3) {
787           case 0: {
788             ok_ = false;
789             break;
790           }
791           case 1: {
792             sink_(GetEmit6(index, (op >> 2) + 0));
793             break;
794           }
795         }
796         return;
797       }
798       case 0: {
799         return;
800       }
801     }
802   }
DecodeStep0()803   void DecodeStep0() {
804     if (!RefillTo1()) {
805       Done1();
806       return;
807     }
808     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
809     const auto op = GetOp7(index);
810     const int consumed = op & 1;
811     buffer_len_ -= consumed;
812     const auto emit_ofs = op >> 1;
813     sink_(GetEmit7(index, emit_ofs + 0));
814   }
RefillTo1()815   bool RefillTo1() {
816     switch (buffer_len_) {
817       case 0: {
818         return Read1to8Bytes();
819       }
820     }
821     return true;
822   }
Read1to8Bytes()823   bool Read1to8Bytes() {
824     switch (end_ - begin_) {
825       case 0: {
826         return false;
827       }
828       case 1: {
829         Fill1();
830         return true;
831       }
832       case 2: {
833         Fill2();
834         return true;
835       }
836       case 3: {
837         Fill3();
838         return true;
839       }
840       case 4: {
841         Fill4();
842         return true;
843       }
844       case 5: {
845         Fill5();
846         return true;
847       }
848       case 6: {
849         Fill6();
850         return true;
851       }
852       case 7: {
853         Fill7();
854         return true;
855       }
856       default: {
857         Fill8();
858         return true;
859       }
860     }
861   }
Done1()862   void Done1() {
863     done_ = true;
864     ok_ = false;
865   }
DecodeStep1()866   void DecodeStep1() {
867     if (!RefillTo7()) {
868       Done2();
869       return;
870     }
871     const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
872     const auto op = GetOp8(index);
873     const int consumed = op & 7;
874     buffer_len_ -= consumed;
875     const auto emit_ofs = op >> 6;
876     switch ((op >> 3) & 7) {
877       case 0: {
878         sink_(GetEmit8(index, emit_ofs + 0));
879         break;
880       }
881       case 1: {
882         DecodeStep2();
883         break;
884       }
885       case 2: {
886         DecodeStep3();
887         break;
888       }
889       case 3: {
890         DecodeStep4();
891         break;
892       }
893       case 4: {
894         DecodeStep5();
895         break;
896       }
897     }
898   }
RefillTo7()899   bool RefillTo7() {
900     switch (buffer_len_) {
901       case 0: {
902         return Read1to8Bytes();
903       }
904       case 1:
905       case 2:
906       case 3:
907       case 4:
908       case 5:
909       case 6: {
910         return Read1to7Bytes();
911       }
912     }
913     return true;
914   }
Done2()915   void Done2() {
916     done_ = true;
917     switch (buffer_len_) {
918       case 1:
919       case 2: {
920         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
921         return;
922       }
923       case 3: {
924         const auto index = buffer_ & 7;
925         const auto op = GetOp9(index);
926         switch (op & 3) {
927           case 0: {
928             sink_(GetEmit9(index, (op >> 2) + 0));
929             break;
930           }
931           case 1: {
932             ok_ = false;
933             break;
934           }
935         }
936         return;
937       }
938       case 4: {
939         const auto index = buffer_ & 15;
940         const auto op = GetOp10(index);
941         switch (op & 3) {
942           case 0: {
943             ok_ = false;
944             break;
945           }
946           case 1: {
947             sink_(GetEmit10(index, (op >> 2) + 0));
948             break;
949           }
950         }
951         return;
952       }
953       case 5: {
954         const auto index = buffer_ & 31;
955         const auto op = GetOp11(index);
956         switch (op & 3) {
957           case 0: {
958             ok_ = false;
959             break;
960           }
961           case 1: {
962             sink_(GetEmit11(index, (op >> 2) + 0));
963             break;
964           }
965         }
966         return;
967       }
968       case 6: {
969         const auto index = buffer_ & 63;
970         const auto op = GetOp12(index);
971         switch (op & 3) {
972           case 0: {
973             ok_ = false;
974             break;
975           }
976           case 1: {
977             sink_(GetEmit12(index, (op >> 2) + 0));
978             break;
979           }
980         }
981         return;
982       }
983       case 0: {
984         return;
985       }
986     }
987   }
DecodeStep2()988   void DecodeStep2() {
989     if (!RefillTo3()) {
990       Done3();
991       return;
992     }
993     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
994     const auto op = GetOp13(index);
995     const int consumed = op & 3;
996     buffer_len_ -= consumed;
997     const auto emit_ofs = op >> 2;
998     sink_(GetEmit13(index, emit_ofs + 0));
999   }
RefillTo3()1000   bool RefillTo3() {
1001     switch (buffer_len_) {
1002       case 0: {
1003         return Read1to8Bytes();
1004       }
1005       case 1:
1006       case 2: {
1007         return Read1to7Bytes();
1008       }
1009     }
1010     return true;
1011   }
Done3()1012   void Done3() {
1013     done_ = true;
1014     switch (buffer_len_) {
1015       case 1:
1016       case 0: {
1017         ok_ = false;
1018         return;
1019       }
1020       case 2: {
1021         const auto index = buffer_ & 3;
1022         const auto op = GetOp14(index);
1023         switch (op & 1) {
1024           case 0: {
1025             sink_(GetEmit14(index, (op >> 1) + 0));
1026             break;
1027           }
1028           case 1: {
1029             ok_ = false;
1030             break;
1031           }
1032         }
1033         return;
1034       }
1035     }
1036   }
DecodeStep3()1037   void DecodeStep3() {
1038     if (!RefillTo4()) {
1039       Done4();
1040       return;
1041     }
1042     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1043     const auto op = GetOp15(index);
1044     const int consumed = op & 7;
1045     buffer_len_ -= consumed;
1046     const auto emit_ofs = op >> 3;
1047     sink_(GetEmit15(index, emit_ofs + 0));
1048   }
RefillTo4()1049   bool RefillTo4() {
1050     switch (buffer_len_) {
1051       case 0: {
1052         return Read1to8Bytes();
1053       }
1054       case 1:
1055       case 2:
1056       case 3: {
1057         return Read1to7Bytes();
1058       }
1059     }
1060     return true;
1061   }
Done4()1062   void Done4() {
1063     done_ = true;
1064     switch (buffer_len_) {
1065       case 1:
1066       case 2:
1067       case 0: {
1068         ok_ = false;
1069         return;
1070       }
1071       case 3: {
1072         const auto index = buffer_ & 7;
1073         const auto op = GetOp16(index);
1074         switch (op & 1) {
1075           case 0: {
1076             sink_(GetEmit16(index, (op >> 1) + 0));
1077             break;
1078           }
1079           case 1: {
1080             ok_ = false;
1081             break;
1082           }
1083         }
1084         return;
1085       }
1086     }
1087   }
DecodeStep4()1088   void DecodeStep4() {
1089     if (!RefillTo5()) {
1090       Done5();
1091       return;
1092     }
1093     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1094     const auto op = GetOp17(index);
1095     const int consumed = op & 7;
1096     buffer_len_ -= consumed;
1097     const auto emit_ofs = op >> 3;
1098     sink_(GetEmit17(index, emit_ofs + 0));
1099   }
RefillTo5()1100   bool RefillTo5() {
1101     switch (buffer_len_) {
1102       case 0: {
1103         return Read1to8Bytes();
1104       }
1105       case 1:
1106       case 2:
1107       case 3:
1108       case 4: {
1109         return Read1to7Bytes();
1110       }
1111     }
1112     return true;
1113   }
Done5()1114   void Done5() {
1115     done_ = true;
1116     switch (buffer_len_) {
1117       case 1:
1118       case 2:
1119       case 3:
1120       case 0: {
1121         ok_ = false;
1122         return;
1123       }
1124       case 4: {
1125         const auto index = buffer_ & 15;
1126         const auto op = GetOp18(index);
1127         switch (op & 1) {
1128           case 0: {
1129             sink_(GetEmit18(index, (op >> 1) + 0));
1130             break;
1131           }
1132           case 1: {
1133             ok_ = false;
1134             break;
1135           }
1136         }
1137         return;
1138       }
1139     }
1140   }
DecodeStep5()1141   void DecodeStep5() {
1142     if (!RefillTo13()) {
1143       Done6();
1144       return;
1145     }
1146     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
1147     const auto op = GetOp19(index);
1148     const int consumed = op & 15;
1149     buffer_len_ -= consumed;
1150     const auto emit_ofs = op >> 5;
1151     switch ((op >> 4) & 1) {
1152       case 0: {
1153         sink_(GetEmit19(index, emit_ofs + 0));
1154         break;
1155       }
1156       case 1: {
1157         begin_ = end_;
1158         buffer_len_ = 0;
1159         break;
1160       }
1161     }
1162   }
RefillTo13()1163   bool RefillTo13() {
1164     switch (buffer_len_) {
1165       case 0: {
1166         return Read2to8Bytes();
1167       }
1168       case 1:
1169       case 2:
1170       case 3:
1171       case 4: {
1172         return Read2to7Bytes();
1173       }
1174       case 5:
1175       case 6:
1176       case 7:
1177       case 8: {
1178         return Read1to7Bytes();
1179       }
1180       case 9:
1181       case 10:
1182       case 11:
1183       case 12: {
1184         return Read1to6Bytes();
1185       }
1186     }
1187     return true;
1188   }
Done6()1189   void Done6() {
1190     done_ = true;
1191     switch (end_ - begin_) {
1192       case 1: {
1193         Fill1();
1194         break;
1195       }
1196     }
1197     switch (buffer_len_) {
1198       case 1:
1199       case 2:
1200       case 3:
1201       case 4: {
1202         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1203         return;
1204       }
1205       case 5: {
1206         const auto index = buffer_ & 31;
1207         const auto op = GetOp20(index);
1208         switch (op & 3) {
1209           case 0: {
1210             sink_(GetEmit20(index, (op >> 2) + 0));
1211             break;
1212           }
1213           case 1: {
1214             ok_ = false;
1215             break;
1216           }
1217         }
1218         return;
1219       }
1220       case 6: {
1221         const auto index = buffer_ & 63;
1222         const auto op = GetOp21(index);
1223         switch (op & 3) {
1224           case 0: {
1225             ok_ = false;
1226             break;
1227           }
1228           case 1: {
1229             sink_(GetEmit21(index, (op >> 2) + 0));
1230             break;
1231           }
1232         }
1233         return;
1234       }
1235       case 7: {
1236         const auto index = buffer_ & 127;
1237         const auto op = GetOp22(index);
1238         switch (op & 3) {
1239           case 0: {
1240             ok_ = false;
1241             break;
1242           }
1243           case 1: {
1244             sink_(GetEmit22(index, (op >> 2) + 0));
1245             break;
1246           }
1247         }
1248         return;
1249       }
1250       case 8: {
1251         const auto index = buffer_ & 255;
1252         const auto op = GetOp23(index);
1253         switch (op & 3) {
1254           case 0: {
1255             ok_ = false;
1256             break;
1257           }
1258           case 1: {
1259             sink_(GetEmit23(index, (op >> 2) + 0));
1260             break;
1261           }
1262         }
1263         return;
1264       }
1265       case 9: {
1266         const auto index = buffer_ & 511;
1267         const auto op = GetOp24(index);
1268         switch (op & 3) {
1269           case 0: {
1270             ok_ = false;
1271             break;
1272           }
1273           case 1: {
1274             sink_(GetEmit24(index, (op >> 2) + 0));
1275             break;
1276           }
1277         }
1278         return;
1279       }
1280       case 10: {
1281         const auto index = buffer_ & 1023;
1282         const auto op = GetOp25(index);
1283         switch (op & 3) {
1284           case 0: {
1285             sink_(GetEmit25(index, (op >> 2) + 0));
1286             sink_(GetEmit25(index, (op >> 2) + 1));
1287             break;
1288           }
1289           case 1: {
1290             ok_ = false;
1291             break;
1292           }
1293           case 2: {
1294             sink_(GetEmit25(index, (op >> 2) + 0));
1295             break;
1296           }
1297         }
1298         return;
1299       }
1300       case 11: {
1301         const auto index = buffer_ & 2047;
1302         const auto op = GetOp26(index);
1303         switch (op & 3) {
1304           case 0: {
1305             ok_ = false;
1306             break;
1307           }
1308           case 1: {
1309             sink_(GetEmit26(index, (op >> 2) + 0));
1310             sink_(GetEmit26(index, (op >> 2) + 1));
1311             break;
1312           }
1313           case 2: {
1314             sink_(GetEmit26(index, (op >> 2) + 0));
1315             break;
1316           }
1317         }
1318         return;
1319       }
1320       case 12: {
1321         const auto index = buffer_ & 4095;
1322         const auto op = GetOp27(index);
1323         switch (op & 3) {
1324           case 0: {
1325             ok_ = false;
1326             break;
1327           }
1328           case 1: {
1329             sink_(GetEmit27(index, (op >> 2) + 0));
1330             sink_(GetEmit27(index, (op >> 2) + 1));
1331             break;
1332           }
1333           case 2: {
1334             sink_(GetEmit27(index, (op >> 2) + 0));
1335             break;
1336           }
1337         }
1338         return;
1339       }
1340       case 0: {
1341         return;
1342       }
1343     }
1344   }
DecodeStep6()1345   void DecodeStep6() {
1346     if (!RefillTo2()) {
1347       Done7();
1348       return;
1349     }
1350     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
1351     const auto op = GetOp28(index);
1352     const int consumed = op & 3;
1353     buffer_len_ -= consumed;
1354     const auto emit_ofs = op >> 2;
1355     sink_(GetEmit28(index, emit_ofs + 0));
1356   }
RefillTo2()1357   bool RefillTo2() {
1358     switch (buffer_len_) {
1359       case 0: {
1360         return Read1to8Bytes();
1361       }
1362       case 1: {
1363         return Read1to7Bytes();
1364       }
1365     }
1366     return true;
1367   }
Done7()1368   void Done7() {
1369     done_ = true;
1370     switch (buffer_len_) {
1371       case 1: {
1372         const auto index = buffer_ & 1;
1373         const auto op = GetOp29(index);
1374         switch (op & 1) {
1375           case 0: {
1376             sink_(GetEmit29(index, (op >> 1) + 0));
1377             break;
1378           }
1379           case 1: {
1380             ok_ = false;
1381             break;
1382           }
1383         }
1384         return;
1385       }
1386       case 0: {
1387         ok_ = false;
1388         return;
1389       }
1390     }
1391   }
1392   F sink_;
1393   const uint8_t* begin_;
1394   const uint8_t* const end_;
1395   uint64_t buffer_ = 0;
1396   int buffer_len_ = 0;
1397   bool ok_ = true;
1398   bool done_ = false;
1399 };
1400 }  // namespace geometry_10_7_13
1401 }  // namespace grpc_core
1402 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_7_13_H
1403