xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_9_8_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_9_8_13_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_9_8_13_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_9_8_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   }
GetOp1(size_t i)48   static inline uint64_t GetOp1(size_t i) {
49     return table1_ops_[i >> 5][i & 0x1f];
50   }
GetEmit1(size_t i,size_t emit)51   static inline uint64_t GetEmit1(size_t i, size_t emit) {
52     return table1_emit_[i >> 5][emit];
53   }
GetOp6(size_t i)54   static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; }
GetEmit6(size_t,size_t emit)55   static inline uint64_t GetEmit6(size_t, size_t emit) { return emit + 33; }
GetOp7(size_t i)56   static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; }
GetEmit7(size_t,size_t emit)57   static inline uint64_t GetEmit7(size_t, size_t emit) { return emit + 40; }
GetOp9(size_t i)58   static inline uint64_t GetOp9(size_t i) { return i; }
GetEmit9(size_t,size_t emit)59   static inline uint64_t GetEmit9(size_t, size_t emit) {
60     return ((void)emit, 63);
61   }
GetOp8(size_t i)62   static inline uint64_t GetOp8(size_t i) {
63     return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1
64                 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1))
65                 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6));
66   }
GetEmit8(size_t,size_t emit)67   static inline uint64_t GetEmit8(size_t, size_t emit) {
68     return (emit < 1 ? (((void)emit, 63)) : ((emit - 1) ? 43 : 39));
69   }
GetOp11(size_t i)70   static inline uint64_t GetOp11(size_t i) {
71     return (i < 2 ? (i) : ((i - 2) + 1));
72   }
GetEmit11(size_t,size_t emit)73   static inline uint64_t GetEmit11(size_t, size_t emit) {
74     return ((void)emit, 124);
75   }
GetOp12(size_t i)76   static inline uint64_t GetOp12(size_t i) {
77     return table12_0_inner_[table12_0_outer_[i]];
78   }
GetEmit12(size_t,size_t emit)79   static inline uint64_t GetEmit12(size_t, size_t emit) {
80     return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35));
81   }
GetOp13(size_t i)82   static inline uint64_t GetOp13(size_t i) {
83     return table13_0_inner_[table13_0_outer_[i]];
84   }
GetEmit13(size_t,size_t emit)85   static inline uint64_t GetEmit13(size_t, size_t emit) {
86     return table13_0_emit_[emit];
87   }
GetOp14(size_t i)88   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)89   static inline uint64_t GetEmit14(size_t, size_t emit) {
90     return table14_0_emit_[emit];
91   }
GetOp15(size_t i)92   static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; }
GetEmit15(size_t,size_t emit)93   static inline uint64_t GetEmit15(size_t, size_t emit) {
94     return table15_0_emit_[emit];
95   }
GetOp16(size_t i)96   static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; }
GetEmit16(size_t,size_t emit)97   static inline uint64_t GetEmit16(size_t, size_t emit) {
98     return table16_0_emit_[emit];
99   }
GetOp10(size_t i)100   static inline uint64_t GetOp10(size_t i) {
101     return table10_ops_[i >> 5][i & 0x1f];
102   }
GetEmit10(size_t i,size_t emit)103   static inline uint64_t GetEmit10(size_t i, size_t emit) {
104     return table10_emit_[i >> 5][emit];
105   }
GetOp18(size_t i)106   static inline uint64_t GetOp18(size_t i) {
107     return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4));
108   }
GetEmit18(size_t,size_t emit)109   static inline uint64_t GetEmit18(size_t, size_t emit) {
110     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
111   }
GetOp17(size_t i)112   static inline uint64_t GetOp17(size_t i) {
113     return table17_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))];
114   }
GetEmit17(size_t,size_t emit)115   static inline uint64_t GetEmit17(size_t, size_t emit) {
116     return table17_0_emit_[emit];
117   }
GetOp20(size_t i)118   static inline uint64_t GetOp20(size_t i) {
119     return table20_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))];
120   }
GetEmit20(size_t,size_t emit)121   static inline uint64_t GetEmit20(size_t, size_t emit) {
122     return table20_0_emit_[emit];
123   }
GetOp19(size_t i)124   static inline uint64_t GetOp19(size_t i) {
125     return table19_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))];
126   }
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) {
131     return table22_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))];
132   }
GetEmit22(size_t,size_t emit)133   static inline uint64_t GetEmit22(size_t, size_t emit) {
134     return table22_0_emit_[emit];
135   }
GetOp21(size_t i)136   static inline uint64_t GetOp21(size_t i) { return table21_0_ops_[i]; }
GetEmit21(size_t,size_t emit)137   static inline uint64_t GetEmit21(size_t, size_t emit) {
138     return table21_0_emit_[emit];
139   }
GetOp24(size_t i)140   static inline uint64_t GetOp24(size_t i) { return table24_0_ops_[i]; }
GetEmit24(size_t,size_t emit)141   static inline uint64_t GetEmit24(size_t, size_t emit) {
142     return table24_0_emit_[emit];
143   }
GetOp25(size_t i)144   static inline uint64_t GetOp25(size_t i) { return table25_0_ops_[i]; }
GetEmit25(size_t,size_t emit)145   static inline uint64_t GetEmit25(size_t, size_t emit) {
146     return table25_0_emit_[emit];
147   }
GetOp26(size_t i)148   static inline uint64_t GetOp26(size_t i) { return table26_0_ops_[i]; }
GetEmit26(size_t,size_t emit)149   static inline uint64_t GetEmit26(size_t, size_t emit) {
150     return table26_0_emit_[emit];
151   }
GetOp27(size_t i)152   static inline uint64_t GetOp27(size_t i) { return table27_0_ops_[i]; }
GetEmit27(size_t,size_t emit)153   static inline uint64_t GetEmit27(size_t, size_t emit) {
154     return table27_0_emit_[emit];
155   }
GetOp28(size_t i)156   static inline uint64_t GetOp28(size_t i) {
157     return table28_ops_[i >> 6][i & 0x3f];
158   }
GetEmit28(size_t i,size_t emit)159   static inline uint64_t GetEmit28(size_t i, size_t emit) {
160     return table28_emit_[i >> 6][emit];
161   }
GetOp29(size_t i)162   static inline uint64_t GetOp29(size_t i) {
163     return table29_ops_[i >> 6][i & 0x3f];
164   }
GetEmit29(size_t i,size_t emit)165   static inline uint64_t GetEmit29(size_t i, size_t emit) {
166     return table29_emit_[i >> 6][emit];
167   }
GetOp30(size_t i)168   static inline uint64_t GetOp30(size_t i) {
169     return table30_ops_[i >> 7][i & 0x7f];
170   }
GetEmit30(size_t i,size_t emit)171   static inline uint64_t GetEmit30(size_t i, size_t emit) {
172     return table30_emit_[i >> 7][emit];
173   }
GetOp31(size_t i)174   static inline uint64_t GetOp31(size_t i) {
175     return table31_ops_[i >> 7][i & 0x7f];
176   }
GetEmit31(size_t i,size_t emit)177   static inline uint64_t GetEmit31(size_t i, size_t emit) {
178     return table31_emit_[i >> 7][emit];
179   }
GetOp23(size_t i)180   static inline uint64_t GetOp23(size_t i) {
181     return table23_ops_[i >> 7][i & 0x7f];
182   }
GetEmit23(size_t i,size_t emit)183   static inline uint64_t GetEmit23(size_t i, size_t emit) {
184     return table23_emit_[i >> 7][emit];
185   }
186 
187  private:
188   static const uint8_t table2_0_emit_[10];
189   static const uint8_t table2_0_ops_[32];
190   static const uint8_t table3_0_emit_[36];
191   static const uint8_t table3_0_ops_[64];
192   static const uint8_t table4_0_emit_[22];
193   static const uint8_t table4_0_ops_[64];
194   static const uint8_t table4_1_emit_[46];
195   static const uint8_t table4_1_ops_[64];
196   static const uint8_t* const table4_emit_[2];
197   static const uint8_t* const table4_ops_[2];
198   static const uint8_t table5_0_ops_[128];
199   static const uint8_t table5_1_emit_[52];
200   static const uint8_t table5_1_ops_[128];
201   static const uint8_t* const table5_emit_[2];
202   static const uint8_t* const table5_ops_[2];
203   static const uint8_t table1_0_emit_[2];
204   static const uint16_t table1_0_ops_[32];
205   static const uint8_t table1_1_emit_[2];
206   static const uint8_t table1_2_emit_[2];
207   static const uint8_t table1_3_emit_[2];
208   static const uint8_t table1_4_emit_[2];
209   static const uint8_t table1_5_emit_[4];
210   static const uint16_t table1_5_ops_[32];
211   static const uint8_t table1_6_emit_[4];
212   static const uint8_t table1_7_emit_[4];
213   static const uint8_t table1_8_emit_[4];
214   static const uint8_t table1_9_emit_[4];
215   static const uint8_t table1_10_emit_[4];
216   static const uint8_t table1_11_emit_[6];
217   static const uint16_t table1_11_ops_[32];
218   static const uint8_t table1_12_emit_[8];
219   static const uint16_t table1_12_ops_[32];
220   static const uint8_t table1_13_emit_[8];
221   static const uint8_t table1_14_emit_[8];
222   static const uint8_t table1_15_emit_[10];
223   static const uint16_t table1_15_ops_[32];
224   static const uint8_t* const table1_emit_[16];
225   static const uint16_t* const table1_ops_[16];
226   static const uint8_t table12_0_inner_[5];
227   static const uint8_t table12_0_outer_[8];
228   static const uint8_t table13_0_emit_[9];
229   static const uint8_t table13_0_inner_[11];
230   static const uint8_t table13_0_outer_[16];
231   static const uint8_t table14_0_emit_[11];
232   static const uint8_t table14_0_ops_[32];
233   static const uint8_t table15_0_emit_[14];
234   static const uint8_t table15_0_ops_[64];
235   static const uint8_t table16_0_emit_[33];
236   static const uint8_t table16_0_ops_[128];
237   static const uint8_t table10_0_emit_[1];
238   static const uint16_t table10_0_ops_[32];
239   static const uint8_t table10_2_emit_[1];
240   static const uint16_t table10_2_ops_[32];
241   static const uint8_t table10_3_emit_[1];
242   static const uint8_t table10_4_emit_[2];
243   static const uint16_t table10_4_ops_[32];
244   static const uint8_t table10_5_emit_[2];
245   static const uint8_t table10_6_emit_[2];
246   static const uint8_t table10_7_emit_[5];
247   static const uint16_t table10_7_ops_[32];
248   static const uint8_t* const table10_emit_[8];
249   static const uint16_t* const table10_ops_[8];
250   static const uint8_t table17_0_emit_[5];
251   static const uint8_t table17_0_inner_[5];
252   static const uint8_t table20_0_emit_[6];
253   static const uint8_t table20_0_inner_[7];
254   static const uint8_t table19_0_emit_[10];
255   static const uint8_t table19_0_inner_[10];
256   static const uint8_t table22_0_emit_[9];
257   static const uint8_t table22_0_inner_[10];
258   static const uint8_t table21_0_emit_[23];
259   static const uint8_t table21_0_ops_[32];
260   static const uint8_t table24_0_emit_[12];
261   static const uint8_t table24_0_ops_[32];
262   static const uint8_t table25_0_emit_[41];
263   static const uint8_t table25_0_ops_[64];
264   static const uint8_t table26_0_emit_[53];
265   static const uint8_t table26_0_ops_[128];
266   static const uint8_t table27_0_emit_[57];
267   static const uint8_t table27_0_ops_[256];
268   static const uint8_t table28_0_emit_[4];
269   static const uint8_t table28_0_ops_[64];
270   static const uint8_t table28_1_emit_[4];
271   static const uint8_t table28_2_emit_[4];
272   static const uint8_t table28_3_emit_[8];
273   static const uint8_t table28_3_ops_[64];
274   static const uint8_t table28_4_emit_[8];
275   static const uint8_t table28_5_emit_[8];
276   static const uint8_t table28_6_emit_[11];
277   static const uint8_t table28_6_ops_[64];
278   static const uint8_t table28_7_emit_[25];
279   static const uint8_t table28_7_ops_[64];
280   static const uint8_t* const table28_emit_[8];
281   static const uint8_t* const table28_ops_[8];
282   static const uint8_t table29_0_emit_[40];
283   static const uint8_t table29_0_ops_[64];
284   static const uint8_t table29_1_emit_[40];
285   static const uint8_t table29_2_emit_[40];
286   static const uint8_t table29_3_emit_[40];
287   static const uint8_t table29_4_emit_[40];
288   static const uint8_t table29_5_emit_[40];
289   static const uint8_t table29_6_emit_[4];
290   static const uint8_t table29_6_ops_[64];
291   static const uint8_t table29_7_emit_[4];
292   static const uint8_t table29_8_emit_[4];
293   static const uint8_t table29_9_emit_[4];
294   static const uint8_t table29_10_emit_[4];
295   static const uint8_t table29_11_emit_[4];
296   static const uint8_t table29_12_emit_[4];
297   static const uint8_t table29_13_emit_[7];
298   static const uint8_t table29_13_ops_[64];
299   static const uint8_t table29_14_emit_[10];
300   static const uint8_t table29_14_ops_[64];
301   static const uint8_t table29_15_emit_[34];
302   static const uint8_t table29_15_ops_[64];
303   static const uint8_t* const table29_emit_[16];
304   static const uint8_t* const table29_ops_[16];
305   static const uint8_t table30_0_emit_[144];
306   static const uint16_t table30_0_ops_[128];
307   static const uint8_t table30_1_emit_[144];
308   static const uint8_t table30_2_emit_[144];
309   static const uint8_t table30_3_emit_[144];
310   static const uint8_t table30_4_emit_[144];
311   static const uint8_t table30_5_emit_[144];
312   static const uint8_t table30_6_emit_[80];
313   static const uint16_t table30_6_ops_[128];
314   static const uint8_t table30_7_emit_[80];
315   static const uint8_t table30_8_emit_[80];
316   static const uint8_t table30_9_emit_[80];
317   static const uint8_t table30_10_emit_[80];
318   static const uint8_t table30_11_emit_[80];
319   static const uint8_t table30_12_emit_[80];
320   static const uint8_t table30_13_emit_[26];
321   static const uint16_t table30_13_ops_[128];
322   static const uint16_t table30_14_ops_[128];
323   static const uint8_t table30_15_emit_[63];
324   static const uint16_t table30_15_ops_[128];
325   static const uint8_t* const table30_emit_[16];
326   static const uint16_t* const table30_ops_[16];
327   static const uint8_t table31_0_emit_[136];
328   static const uint16_t table31_0_ops_[128];
329   static const uint8_t table31_1_emit_[136];
330   static const uint8_t table31_2_emit_[136];
331   static const uint8_t table31_3_emit_[136];
332   static const uint8_t table31_4_emit_[136];
333   static const uint8_t table31_5_emit_[136];
334   static const uint8_t table31_6_emit_[136];
335   static const uint8_t table31_7_emit_[136];
336   static const uint8_t table31_8_emit_[136];
337   static const uint8_t table31_9_emit_[136];
338   static const uint8_t table31_10_emit_[136];
339   static const uint8_t table31_11_emit_[136];
340   static const uint8_t table31_12_emit_[144];
341   static const uint8_t table31_13_emit_[144];
342   static const uint8_t table31_14_emit_[144];
343   static const uint8_t table31_15_emit_[144];
344   static const uint8_t table31_16_emit_[144];
345   static const uint8_t table31_17_emit_[144];
346   static const uint8_t table31_18_emit_[144];
347   static const uint8_t table31_19_emit_[144];
348   static const uint8_t table31_20_emit_[144];
349   static const uint8_t table31_21_emit_[144];
350   static const uint8_t table31_22_emit_[144];
351   static const uint8_t table31_23_emit_[144];
352   static const uint8_t table31_24_emit_[144];
353   static const uint8_t table31_25_emit_[144];
354   static const uint8_t table31_26_emit_[112];
355   static const uint16_t table31_26_ops_[128];
356   static const uint8_t table31_27_emit_[80];
357   static const uint8_t table31_28_emit_[80];
358   static const uint8_t table31_29_emit_[44];
359   static const uint16_t table31_29_ops_[128];
360   static const uint8_t table31_30_emit_[17];
361   static const uint16_t table31_30_ops_[128];
362   static const uint8_t table31_31_emit_[46];
363   static const uint16_t table31_31_ops_[128];
364   static const uint8_t* const table31_emit_[32];
365   static const uint16_t* const table31_ops_[32];
366   static const uint8_t table23_0_emit_[1];
367   static const uint16_t table23_0_ops_[128];
368   static const uint8_t table23_2_emit_[1];
369   static const uint8_t table23_4_emit_[1];
370   static const uint8_t table23_6_emit_[1];
371   static const uint8_t table23_8_emit_[1];
372   static const uint8_t table23_10_emit_[1];
373   static const uint8_t table23_12_emit_[1];
374   static const uint8_t table23_14_emit_[1];
375   static const uint8_t table23_16_emit_[1];
376   static const uint8_t table23_18_emit_[1];
377   static const uint8_t table23_20_emit_[1];
378   static const uint8_t table23_22_emit_[1];
379   static const uint8_t table23_24_emit_[1];
380   static const uint16_t table23_24_ops_[128];
381   static const uint8_t table23_25_emit_[1];
382   static const uint8_t table23_26_emit_[1];
383   static const uint8_t table23_27_emit_[1];
384   static const uint8_t table23_28_emit_[1];
385   static const uint8_t table23_29_emit_[1];
386   static const uint8_t table23_30_emit_[1];
387   static const uint8_t table23_31_emit_[1];
388   static const uint8_t table23_32_emit_[1];
389   static const uint8_t table23_33_emit_[1];
390   static const uint8_t table23_34_emit_[1];
391   static const uint8_t table23_35_emit_[1];
392   static const uint8_t table23_36_emit_[1];
393   static const uint8_t table23_37_emit_[1];
394   static const uint8_t table23_38_emit_[1];
395   static const uint8_t table23_39_emit_[1];
396   static const uint8_t table23_40_emit_[1];
397   static const uint8_t table23_41_emit_[1];
398   static const uint8_t table23_42_emit_[1];
399   static const uint8_t table23_43_emit_[1];
400   static const uint8_t table23_44_emit_[1];
401   static const uint8_t table23_45_emit_[1];
402   static const uint8_t table23_46_emit_[1];
403   static const uint8_t table23_47_emit_[1];
404   static const uint8_t table23_48_emit_[1];
405   static const uint8_t table23_49_emit_[1];
406   static const uint8_t table23_50_emit_[1];
407   static const uint8_t table23_51_emit_[1];
408   static const uint8_t table23_52_emit_[1];
409   static const uint8_t table23_53_emit_[2];
410   static const uint16_t table23_53_ops_[128];
411   static const uint8_t table23_54_emit_[2];
412   static const uint8_t table23_55_emit_[2];
413   static const uint8_t table23_56_emit_[2];
414   static const uint8_t table23_57_emit_[2];
415   static const uint8_t table23_58_emit_[2];
416   static const uint8_t table23_59_emit_[4];
417   static const uint16_t table23_59_ops_[128];
418   static const uint8_t table23_60_emit_[8];
419   static const uint16_t table23_60_ops_[128];
420   static const uint8_t table23_61_emit_[9];
421   static const uint16_t table23_61_ops_[128];
422   static const uint8_t table23_62_emit_[16];
423   static const uint16_t table23_62_ops_[128];
424   static const uint8_t table23_63_emit_[33];
425   static const uint16_t table23_63_ops_[128];
426   static const uint8_t* const table23_emit_[64];
427   static const uint16_t* const table23_ops_[64];
428 };
429 template <typename F>
430 class HuffDecoder : public HuffDecoderCommon {
431  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)432   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
433       : sink_(sink), begin_(begin), end_(end) {}
Run()434   bool Run() {
435     while (!done_) {
436       if (!RefillTo9()) {
437         Done0();
438         break;
439       }
440       const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
441       const auto op = GetOp1(index);
442       const int consumed = op & 15;
443       buffer_len_ -= consumed;
444       const auto emit_ofs = op >> 7;
445       switch ((op >> 4) & 7) {
446         case 0: {
447           sink_(GetEmit1(index, emit_ofs + 0));
448           break;
449         }
450         case 1: {
451           DecodeStep0();
452           break;
453         }
454         case 2: {
455           DecodeStep1();
456           break;
457         }
458         case 3: {
459           DecodeStep2();
460           break;
461         }
462         case 4: {
463           DecodeStep3();
464           break;
465         }
466       }
467     }
468     return ok_;
469   }
470 
471  private:
RefillTo9()472   bool RefillTo9() {
473     switch (buffer_len_) {
474       case 0: {
475         return Read2to8Bytes();
476       }
477       case 1:
478       case 2:
479       case 3:
480       case 4:
481       case 5:
482       case 6:
483       case 7:
484       case 8: {
485         return Read1to7Bytes();
486       }
487     }
488     return true;
489   }
Read2to8Bytes()490   bool Read2to8Bytes() {
491     switch (end_ - begin_) {
492       case 0:
493       case 1: {
494         return false;
495       }
496       case 2: {
497         Fill2();
498         return true;
499       }
500       case 3: {
501         Fill3();
502         return true;
503       }
504       case 4: {
505         Fill4();
506         return true;
507       }
508       case 5: {
509         Fill5();
510         return true;
511       }
512       case 6: {
513         Fill6();
514         return true;
515       }
516       case 7: {
517         Fill7();
518         return true;
519       }
520       default: {
521         Fill8();
522         return true;
523       }
524     }
525   }
Fill2()526   void Fill2() {
527     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
528               (static_cast<uint64_t>(begin_[1]) << 0);
529     begin_ += 2;
530     buffer_len_ += 16;
531   }
Fill3()532   void Fill3() {
533     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
534               (static_cast<uint64_t>(begin_[1]) << 8) |
535               (static_cast<uint64_t>(begin_[2]) << 0);
536     begin_ += 3;
537     buffer_len_ += 24;
538   }
Fill4()539   void Fill4() {
540     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
541               (static_cast<uint64_t>(begin_[1]) << 16) |
542               (static_cast<uint64_t>(begin_[2]) << 8) |
543               (static_cast<uint64_t>(begin_[3]) << 0);
544     begin_ += 4;
545     buffer_len_ += 32;
546   }
Fill5()547   void Fill5() {
548     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
549               (static_cast<uint64_t>(begin_[1]) << 24) |
550               (static_cast<uint64_t>(begin_[2]) << 16) |
551               (static_cast<uint64_t>(begin_[3]) << 8) |
552               (static_cast<uint64_t>(begin_[4]) << 0);
553     begin_ += 5;
554     buffer_len_ += 40;
555   }
Fill6()556   void Fill6() {
557     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
558               (static_cast<uint64_t>(begin_[1]) << 32) |
559               (static_cast<uint64_t>(begin_[2]) << 24) |
560               (static_cast<uint64_t>(begin_[3]) << 16) |
561               (static_cast<uint64_t>(begin_[4]) << 8) |
562               (static_cast<uint64_t>(begin_[5]) << 0);
563     begin_ += 6;
564     buffer_len_ += 48;
565   }
Fill7()566   void Fill7() {
567     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
568               (static_cast<uint64_t>(begin_[1]) << 40) |
569               (static_cast<uint64_t>(begin_[2]) << 32) |
570               (static_cast<uint64_t>(begin_[3]) << 24) |
571               (static_cast<uint64_t>(begin_[4]) << 16) |
572               (static_cast<uint64_t>(begin_[5]) << 8) |
573               (static_cast<uint64_t>(begin_[6]) << 0);
574     begin_ += 7;
575     buffer_len_ += 56;
576   }
Fill8()577   void Fill8() {
578     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
579               (static_cast<uint64_t>(begin_[1]) << 48) |
580               (static_cast<uint64_t>(begin_[2]) << 40) |
581               (static_cast<uint64_t>(begin_[3]) << 32) |
582               (static_cast<uint64_t>(begin_[4]) << 24) |
583               (static_cast<uint64_t>(begin_[5]) << 16) |
584               (static_cast<uint64_t>(begin_[6]) << 8) |
585               (static_cast<uint64_t>(begin_[7]) << 0);
586     begin_ += 8;
587     buffer_len_ += 64;
588   }
Read1to7Bytes()589   bool Read1to7Bytes() {
590     switch (end_ - begin_) {
591       case 0: {
592         return false;
593       }
594       case 1: {
595         Fill1();
596         return true;
597       }
598       case 2: {
599         Fill2();
600         return true;
601       }
602       case 3: {
603         Fill3();
604         return true;
605       }
606       case 4: {
607         Fill4();
608         return true;
609       }
610       case 5: {
611         Fill5();
612         return true;
613       }
614       case 6: {
615         Fill6();
616         return true;
617       }
618       default: {
619         Fill7();
620         return true;
621       }
622     }
623   }
Fill1()624   void Fill1() {
625     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
626     begin_ += 1;
627     buffer_len_ += 8;
628   }
Done0()629   void Done0() {
630     done_ = true;
631     switch (end_ - begin_) {
632       case 1: {
633         Fill1();
634         break;
635       }
636     }
637     switch (buffer_len_) {
638       case 1:
639       case 2:
640       case 3:
641       case 4: {
642         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
643         return;
644       }
645       case 5: {
646         const auto index = buffer_ & 31;
647         const auto op = GetOp2(index);
648         switch (op & 3) {
649           case 0: {
650             sink_(GetEmit2(index, (op >> 2) + 0));
651             break;
652           }
653           case 1: {
654             ok_ = false;
655             break;
656           }
657         }
658         return;
659       }
660       case 6: {
661         const auto index = buffer_ & 63;
662         const auto op = GetOp3(index);
663         switch (op & 3) {
664           case 0: {
665             ok_ = false;
666             break;
667           }
668           case 1: {
669             sink_(GetEmit3(index, (op >> 2) + 0));
670             break;
671           }
672         }
673         return;
674       }
675       case 7: {
676         const auto index = buffer_ & 127;
677         const auto op = GetOp4(index);
678         switch (op & 3) {
679           case 0: {
680             ok_ = false;
681             break;
682           }
683           case 1: {
684             sink_(GetEmit4(index, (op >> 2) + 0));
685             break;
686           }
687         }
688         return;
689       }
690       case 8: {
691         const auto index = buffer_ & 255;
692         const auto op = GetOp5(index);
693         switch (op & 3) {
694           case 0: {
695             ok_ = false;
696             break;
697           }
698           case 1: {
699             sink_(GetEmit5(index, (op >> 2) + 0));
700             break;
701           }
702         }
703         return;
704       }
705       case 0: {
706         return;
707       }
708     }
709   }
DecodeStep0()710   void DecodeStep0() {
711     if (!RefillTo1()) {
712       Done1();
713       return;
714     }
715     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
716     const auto op = GetOp6(index);
717     const int consumed = op & 1;
718     buffer_len_ -= consumed;
719     const auto emit_ofs = op >> 1;
720     sink_(GetEmit6(index, emit_ofs + 0));
721   }
RefillTo1()722   bool RefillTo1() {
723     switch (buffer_len_) {
724       case 0: {
725         return Read1to8Bytes();
726       }
727     }
728     return true;
729   }
Read1to8Bytes()730   bool Read1to8Bytes() {
731     switch (end_ - begin_) {
732       case 0: {
733         return false;
734       }
735       case 1: {
736         Fill1();
737         return true;
738       }
739       case 2: {
740         Fill2();
741         return true;
742       }
743       case 3: {
744         Fill3();
745         return true;
746       }
747       case 4: {
748         Fill4();
749         return true;
750       }
751       case 5: {
752         Fill5();
753         return true;
754       }
755       case 6: {
756         Fill6();
757         return true;
758       }
759       case 7: {
760         Fill7();
761         return true;
762       }
763       default: {
764         Fill8();
765         return true;
766       }
767     }
768   }
Done1()769   void Done1() {
770     done_ = true;
771     ok_ = false;
772   }
DecodeStep1()773   void DecodeStep1() {
774     if (!RefillTo1()) {
775       Done2();
776       return;
777     }
778     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
779     const auto op = GetOp7(index);
780     const int consumed = op & 1;
781     buffer_len_ -= consumed;
782     const auto emit_ofs = op >> 1;
783     sink_(GetEmit7(index, emit_ofs + 0));
784   }
Done2()785   void Done2() {
786     done_ = true;
787     ok_ = false;
788   }
DecodeStep2()789   void DecodeStep2() {
790     if (!RefillTo2()) {
791       Done3();
792       return;
793     }
794     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
795     const auto op = GetOp8(index);
796     const int consumed = op & 3;
797     buffer_len_ -= consumed;
798     const auto emit_ofs = op >> 2;
799     sink_(GetEmit8(index, emit_ofs + 0));
800   }
RefillTo2()801   bool RefillTo2() {
802     switch (buffer_len_) {
803       case 0: {
804         return Read1to8Bytes();
805       }
806       case 1: {
807         return Read1to7Bytes();
808       }
809     }
810     return true;
811   }
Done3()812   void Done3() {
813     done_ = true;
814     switch (buffer_len_) {
815       case 1: {
816         const auto index = buffer_ & 1;
817         const auto op = GetOp9(index);
818         switch (op & 1) {
819           case 0: {
820             sink_(GetEmit9(index, (op >> 1) + 0));
821             break;
822           }
823           case 1: {
824             ok_ = false;
825             break;
826           }
827         }
828         return;
829       }
830       case 0: {
831         ok_ = false;
832         return;
833       }
834     }
835   }
DecodeStep3()836   void DecodeStep3() {
837     if (!RefillTo8()) {
838       Done4();
839       return;
840     }
841     const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
842     const auto op = GetOp10(index);
843     const int consumed = op & 15;
844     buffer_len_ -= consumed;
845     const auto emit_ofs = op >> 7;
846     switch ((op >> 4) & 7) {
847       case 0: {
848         sink_(GetEmit10(index, emit_ofs + 0));
849         break;
850       }
851       case 1: {
852         DecodeStep4();
853         break;
854       }
855       case 2: {
856         DecodeStep5();
857         break;
858       }
859       case 3: {
860         DecodeStep6();
861         break;
862       }
863       case 4: {
864         DecodeStep7();
865         break;
866       }
867     }
868   }
RefillTo8()869   bool RefillTo8() {
870     switch (buffer_len_) {
871       case 0: {
872         return Read1to8Bytes();
873       }
874       case 1:
875       case 2:
876       case 3:
877       case 4:
878       case 5:
879       case 6:
880       case 7: {
881         return Read1to7Bytes();
882       }
883     }
884     return true;
885   }
Done4()886   void Done4() {
887     done_ = true;
888     switch (end_ - begin_) {}
889     switch (buffer_len_) {
890       case 1: {
891         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
892         return;
893       }
894       case 2: {
895         const auto index = buffer_ & 3;
896         const auto op = GetOp11(index);
897         switch (op & 3) {
898           case 0: {
899             sink_(GetEmit11(index, (op >> 2) + 0));
900             break;
901           }
902           case 1: {
903             ok_ = false;
904             break;
905           }
906         }
907         return;
908       }
909       case 3: {
910         const auto index = buffer_ & 7;
911         const auto op = GetOp12(index);
912         switch (op & 3) {
913           case 0: {
914             ok_ = false;
915             break;
916           }
917           case 1: {
918             sink_(GetEmit12(index, (op >> 2) + 0));
919             break;
920           }
921         }
922         return;
923       }
924       case 4: {
925         const auto index = buffer_ & 15;
926         const auto op = GetOp13(index);
927         switch (op & 3) {
928           case 0: {
929             ok_ = false;
930             break;
931           }
932           case 1: {
933             sink_(GetEmit13(index, (op >> 2) + 0));
934             break;
935           }
936         }
937         return;
938       }
939       case 5: {
940         const auto index = buffer_ & 31;
941         const auto op = GetOp14(index);
942         switch (op & 3) {
943           case 0: {
944             ok_ = false;
945             break;
946           }
947           case 1: {
948             sink_(GetEmit14(index, (op >> 2) + 0));
949             break;
950           }
951         }
952         return;
953       }
954       case 6: {
955         const auto index = buffer_ & 63;
956         const auto op = GetOp15(index);
957         switch (op & 3) {
958           case 0: {
959             ok_ = false;
960             break;
961           }
962           case 1: {
963             sink_(GetEmit15(index, (op >> 2) + 0));
964             break;
965           }
966         }
967         return;
968       }
969       case 7: {
970         const auto index = buffer_ & 127;
971         const auto op = GetOp16(index);
972         switch (op & 3) {
973           case 0: {
974             sink_(GetEmit16(index, (op >> 2) + 0));
975             sink_(GetEmit16(index, (op >> 2) + 1));
976             break;
977           }
978           case 1: {
979             ok_ = false;
980             break;
981           }
982           case 2: {
983             sink_(GetEmit16(index, (op >> 2) + 0));
984             break;
985           }
986         }
987         return;
988       }
989       case 0: {
990         return;
991       }
992     }
993   }
DecodeStep4()994   void DecodeStep4() {
995     if (!RefillTo3()) {
996       Done5();
997       return;
998     }
999     const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7;
1000     const auto op = GetOp17(index);
1001     const int consumed = op & 3;
1002     buffer_len_ -= consumed;
1003     const auto emit_ofs = op >> 2;
1004     sink_(GetEmit17(index, emit_ofs + 0));
1005   }
RefillTo3()1006   bool RefillTo3() {
1007     switch (buffer_len_) {
1008       case 0: {
1009         return Read1to8Bytes();
1010       }
1011       case 1:
1012       case 2: {
1013         return Read1to7Bytes();
1014       }
1015     }
1016     return true;
1017   }
Done5()1018   void Done5() {
1019     done_ = true;
1020     switch (buffer_len_) {
1021       case 1:
1022       case 0: {
1023         ok_ = false;
1024         return;
1025       }
1026       case 2: {
1027         const auto index = buffer_ & 3;
1028         const auto op = GetOp18(index);
1029         switch (op & 1) {
1030           case 0: {
1031             sink_(GetEmit18(index, (op >> 1) + 0));
1032             break;
1033           }
1034           case 1: {
1035             ok_ = false;
1036             break;
1037           }
1038         }
1039         return;
1040       }
1041     }
1042   }
DecodeStep5()1043   void DecodeStep5() {
1044     if (!RefillTo4()) {
1045       Done6();
1046       return;
1047     }
1048     const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf;
1049     const auto op = GetOp19(index);
1050     const int consumed = op & 7;
1051     buffer_len_ -= consumed;
1052     const auto emit_ofs = op >> 3;
1053     sink_(GetEmit19(index, emit_ofs + 0));
1054   }
RefillTo4()1055   bool RefillTo4() {
1056     switch (buffer_len_) {
1057       case 0: {
1058         return Read1to8Bytes();
1059       }
1060       case 1:
1061       case 2:
1062       case 3: {
1063         return Read1to7Bytes();
1064       }
1065     }
1066     return true;
1067   }
Done6()1068   void Done6() {
1069     done_ = true;
1070     switch (buffer_len_) {
1071       case 1:
1072       case 2:
1073       case 0: {
1074         ok_ = false;
1075         return;
1076       }
1077       case 3: {
1078         const auto index = buffer_ & 7;
1079         const auto op = GetOp20(index);
1080         switch (op & 1) {
1081           case 0: {
1082             sink_(GetEmit20(index, (op >> 1) + 0));
1083             break;
1084           }
1085           case 1: {
1086             ok_ = false;
1087             break;
1088           }
1089         }
1090         return;
1091       }
1092     }
1093   }
DecodeStep6()1094   void DecodeStep6() {
1095     if (!RefillTo5()) {
1096       Done7();
1097       return;
1098     }
1099     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
1100     const auto op = GetOp21(index);
1101     const int consumed = op & 7;
1102     buffer_len_ -= consumed;
1103     const auto emit_ofs = op >> 3;
1104     sink_(GetEmit21(index, emit_ofs + 0));
1105   }
RefillTo5()1106   bool RefillTo5() {
1107     switch (buffer_len_) {
1108       case 0: {
1109         return Read1to8Bytes();
1110       }
1111       case 1:
1112       case 2:
1113       case 3:
1114       case 4: {
1115         return Read1to7Bytes();
1116       }
1117     }
1118     return true;
1119   }
Done7()1120   void Done7() {
1121     done_ = true;
1122     switch (buffer_len_) {
1123       case 1:
1124       case 2:
1125       case 3:
1126       case 0: {
1127         ok_ = false;
1128         return;
1129       }
1130       case 4: {
1131         const auto index = buffer_ & 15;
1132         const auto op = GetOp22(index);
1133         switch (op & 1) {
1134           case 0: {
1135             sink_(GetEmit22(index, (op >> 1) + 0));
1136             break;
1137           }
1138           case 1: {
1139             ok_ = false;
1140             break;
1141           }
1142         }
1143         return;
1144       }
1145     }
1146   }
DecodeStep7()1147   void DecodeStep7() {
1148     if (!RefillTo13()) {
1149       Done8();
1150       return;
1151     }
1152     const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff;
1153     const auto op = GetOp23(index);
1154     const int consumed = op & 15;
1155     buffer_len_ -= consumed;
1156     const auto emit_ofs = op >> 5;
1157     switch ((op >> 4) & 1) {
1158       case 0: {
1159         sink_(GetEmit23(index, emit_ofs + 0));
1160         break;
1161       }
1162       case 1: {
1163         begin_ = end_;
1164         buffer_len_ = 0;
1165         break;
1166       }
1167     }
1168   }
RefillTo13()1169   bool RefillTo13() {
1170     switch (buffer_len_) {
1171       case 0: {
1172         return Read2to8Bytes();
1173       }
1174       case 1:
1175       case 2:
1176       case 3:
1177       case 4: {
1178         return Read2to7Bytes();
1179       }
1180       case 5:
1181       case 6:
1182       case 7:
1183       case 8: {
1184         return Read1to7Bytes();
1185       }
1186       case 9:
1187       case 10:
1188       case 11:
1189       case 12: {
1190         return Read1to6Bytes();
1191       }
1192     }
1193     return true;
1194   }
Read2to7Bytes()1195   bool Read2to7Bytes() {
1196     switch (end_ - begin_) {
1197       case 0:
1198       case 1: {
1199         return false;
1200       }
1201       case 2: {
1202         Fill2();
1203         return true;
1204       }
1205       case 3: {
1206         Fill3();
1207         return true;
1208       }
1209       case 4: {
1210         Fill4();
1211         return true;
1212       }
1213       case 5: {
1214         Fill5();
1215         return true;
1216       }
1217       case 6: {
1218         Fill6();
1219         return true;
1220       }
1221       default: {
1222         Fill7();
1223         return true;
1224       }
1225     }
1226   }
Read1to6Bytes()1227   bool Read1to6Bytes() {
1228     switch (end_ - begin_) {
1229       case 0: {
1230         return false;
1231       }
1232       case 1: {
1233         Fill1();
1234         return true;
1235       }
1236       case 2: {
1237         Fill2();
1238         return true;
1239       }
1240       case 3: {
1241         Fill3();
1242         return true;
1243       }
1244       case 4: {
1245         Fill4();
1246         return true;
1247       }
1248       case 5: {
1249         Fill5();
1250         return true;
1251       }
1252       default: {
1253         Fill6();
1254         return true;
1255       }
1256     }
1257   }
Done8()1258   void Done8() {
1259     done_ = true;
1260     switch (end_ - begin_) {
1261       case 1: {
1262         Fill1();
1263         break;
1264       }
1265     }
1266     switch (buffer_len_) {
1267       case 1:
1268       case 2:
1269       case 3:
1270       case 4: {
1271         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1272         return;
1273       }
1274       case 5: {
1275         const auto index = buffer_ & 31;
1276         const auto op = GetOp24(index);
1277         switch (op & 3) {
1278           case 0: {
1279             sink_(GetEmit24(index, (op >> 2) + 0));
1280             break;
1281           }
1282           case 1: {
1283             ok_ = false;
1284             break;
1285           }
1286         }
1287         return;
1288       }
1289       case 6: {
1290         const auto index = buffer_ & 63;
1291         const auto op = GetOp25(index);
1292         switch (op & 3) {
1293           case 0: {
1294             ok_ = false;
1295             break;
1296           }
1297           case 1: {
1298             sink_(GetEmit25(index, (op >> 2) + 0));
1299             break;
1300           }
1301         }
1302         return;
1303       }
1304       case 7: {
1305         const auto index = buffer_ & 127;
1306         const auto op = GetOp26(index);
1307         switch (op & 3) {
1308           case 0: {
1309             ok_ = false;
1310             break;
1311           }
1312           case 1: {
1313             sink_(GetEmit26(index, (op >> 2) + 0));
1314             break;
1315           }
1316         }
1317         return;
1318       }
1319       case 8: {
1320         const auto index = buffer_ & 255;
1321         const auto op = GetOp27(index);
1322         switch (op & 3) {
1323           case 0: {
1324             ok_ = false;
1325             break;
1326           }
1327           case 1: {
1328             sink_(GetEmit27(index, (op >> 2) + 0));
1329             break;
1330           }
1331         }
1332         return;
1333       }
1334       case 9: {
1335         const auto index = buffer_ & 511;
1336         const auto op = GetOp28(index);
1337         switch (op & 3) {
1338           case 0: {
1339             ok_ = false;
1340             break;
1341           }
1342           case 1: {
1343             sink_(GetEmit28(index, (op >> 2) + 0));
1344             break;
1345           }
1346         }
1347         return;
1348       }
1349       case 10: {
1350         const auto index = buffer_ & 1023;
1351         const auto op = GetOp29(index);
1352         switch (op & 3) {
1353           case 0: {
1354             sink_(GetEmit29(index, (op >> 2) + 0));
1355             sink_(GetEmit29(index, (op >> 2) + 1));
1356             break;
1357           }
1358           case 1: {
1359             ok_ = false;
1360             break;
1361           }
1362           case 2: {
1363             sink_(GetEmit29(index, (op >> 2) + 0));
1364             break;
1365           }
1366         }
1367         return;
1368       }
1369       case 11: {
1370         const auto index = buffer_ & 2047;
1371         const auto op = GetOp30(index);
1372         switch (op & 3) {
1373           case 0: {
1374             ok_ = false;
1375             break;
1376           }
1377           case 1: {
1378             sink_(GetEmit30(index, (op >> 2) + 0));
1379             sink_(GetEmit30(index, (op >> 2) + 1));
1380             break;
1381           }
1382           case 2: {
1383             sink_(GetEmit30(index, (op >> 2) + 0));
1384             break;
1385           }
1386         }
1387         return;
1388       }
1389       case 12: {
1390         const auto index = buffer_ & 4095;
1391         const auto op = GetOp31(index);
1392         switch (op & 3) {
1393           case 0: {
1394             ok_ = false;
1395             break;
1396           }
1397           case 1: {
1398             sink_(GetEmit31(index, (op >> 2) + 0));
1399             sink_(GetEmit31(index, (op >> 2) + 1));
1400             break;
1401           }
1402           case 2: {
1403             sink_(GetEmit31(index, (op >> 2) + 0));
1404             break;
1405           }
1406         }
1407         return;
1408       }
1409       case 0: {
1410         return;
1411       }
1412     }
1413   }
1414   F sink_;
1415   const uint8_t* begin_;
1416   const uint8_t* const end_;
1417   uint64_t buffer_ = 0;
1418   int buffer_len_ = 0;
1419   bool ok_ = true;
1420   bool done_ = false;
1421 };
1422 }  // namespace geometry_9_8_13
1423 }  // namespace grpc_core
1424 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_9_8_13_H
1425