xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_8_8_14.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // This file is autogenerated: see
16 // tools/codegen/core/gen_huffman_decompressor.cc
17 
18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_8_14_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_8_14_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_8_8_14 {
26 class HuffDecoderCommon {
27  protected:
GetOp2(size_t i)28   static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; }
GetEmit2(size_t,size_t emit)29   static inline uint64_t GetEmit2(size_t, size_t emit) {
30     return table2_0_emit_[emit];
31   }
GetOp3(size_t i)32   static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; }
GetEmit3(size_t,size_t emit)33   static inline uint64_t GetEmit3(size_t, size_t emit) {
34     return table3_0_emit_[emit];
35   }
GetOp4(size_t i)36   static inline uint64_t GetOp4(size_t i) {
37     return table4_ops_[i >> 6][i & 0x3f];
38   }
GetEmit4(size_t i,size_t emit)39   static inline uint64_t GetEmit4(size_t i, size_t emit) {
40     return table4_emit_[i >> 6][emit];
41   }
GetOp1(size_t i)42   static inline uint64_t GetOp1(size_t i) {
43     return table1_0_inner_[table1_0_outer_[i]];
44   }
GetEmit1(size_t,size_t emit)45   static inline uint64_t GetEmit1(size_t, size_t emit) {
46     return table1_0_emit_[emit];
47   }
GetOp5(size_t i)48   static inline uint64_t GetOp5(size_t i) {
49     return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10));
50   }
GetEmit5(size_t,size_t emit)51   static inline uint64_t GetEmit5(size_t, size_t emit) {
52     return (emit < 2 ? (emit + 33) : ((emit - 2) + 40));
53   }
GetOp7(size_t i)54   static inline uint64_t GetOp7(size_t i) {
55     return (i < 2 ? (i) : ((i - 2) + 1));
56   }
GetEmit7(size_t,size_t emit)57   static inline uint64_t GetEmit7(size_t, size_t emit) {
58     return ((void)emit, 63);
59   }
GetOp8(size_t i)60   static inline uint64_t GetOp8(size_t i) {
61     return table8_0_inner_[table8_0_outer_[i]];
62   }
GetEmit8(size_t,size_t emit)63   static inline uint64_t GetEmit8(size_t, size_t emit) {
64     return (emit < 2 ? (emit ? 39 : 63) : ((emit - 2) ? 124 : 43));
65   }
GetOp9(size_t i)66   static inline uint64_t GetOp9(size_t i) {
67     return table9_0_inner_[table9_0_outer_[i]];
68   }
GetEmit9(size_t,size_t emit)69   static inline uint64_t GetEmit9(size_t, size_t emit) {
70     return table9_0_emit_[emit];
71   }
GetOp10(size_t i)72   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)73   static inline uint64_t GetEmit10(size_t, size_t emit) {
74     return table10_0_emit_[emit];
75   }
GetOp11(size_t i)76   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)77   static inline uint64_t GetEmit11(size_t, size_t emit) {
78     return table11_0_emit_[emit];
79   }
GetOp12(size_t i)80   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)81   static inline uint64_t GetEmit12(size_t, size_t emit) {
82     return table12_0_emit_[emit];
83   }
GetOp6(size_t i)84   static inline uint64_t GetOp6(size_t i) {
85     return table6_ops_[i >> 5][i & 0x1f];
86   }
GetEmit6(size_t i,size_t emit)87   static inline uint64_t GetEmit6(size_t i, size_t emit) {
88     return table6_emit_[i >> 5][emit];
89   }
GetOp14(size_t i)90   static inline uint64_t GetOp14(size_t i) {
91     return ((i < 3 ? (i) : (((void)(i - 3), 3))) < 2
92                 ? ((i < 3 ? (i) : (((void)(i - 3), 3))) ? 2 : 0)
93                 : (((i < 3 ? (i) : (((void)(i - 3), 3))) - 2) ? 1 : 4));
94   }
GetEmit14(size_t,size_t emit)95   static inline uint64_t GetEmit14(size_t, size_t emit) {
96     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
97   }
GetOp15(size_t i)98   static inline uint64_t GetOp15(size_t i) {
99     return table15_0_inner_[table15_0_outer_[i]];
100   }
GetEmit15(size_t,size_t emit)101   static inline uint64_t GetEmit15(size_t, size_t emit) {
102     return table15_0_emit_[emit];
103   }
GetOp13(size_t i)104   static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; }
GetEmit13(size_t,size_t emit)105   static inline uint64_t GetEmit13(size_t, size_t emit) {
106     return table13_0_emit_[emit];
107   }
GetOp17(size_t i)108   static inline uint64_t GetOp17(size_t i) { return table17_0_ops_[i]; }
GetEmit17(size_t,size_t emit)109   static inline uint64_t GetEmit17(size_t, size_t emit) {
110     return table17_0_emit_[emit];
111   }
GetOp18(size_t i)112   static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; }
GetEmit18(size_t,size_t emit)113   static inline uint64_t GetEmit18(size_t, size_t emit) {
114     return table18_0_emit_[emit];
115   }
GetOp19(size_t i)116   static inline uint64_t GetOp19(size_t i) { return table19_0_ops_[i]; }
GetEmit19(size_t,size_t emit)117   static inline uint64_t GetEmit19(size_t, size_t emit) {
118     return table19_0_emit_[emit];
119   }
GetOp20(size_t i)120   static inline uint64_t GetOp20(size_t i) {
121     return table20_ops_[i >> 7][i & 0x7f];
122   }
GetEmit20(size_t i,size_t emit)123   static inline uint64_t GetEmit20(size_t i, size_t emit) {
124     return table20_emit_[i >> 7][emit];
125   }
GetOp21(size_t i)126   static inline uint64_t GetOp21(size_t i) {
127     return table21_ops_[i >> 8][i & 0xff];
128   }
GetEmit21(size_t i,size_t emit)129   static inline uint64_t GetEmit21(size_t i, size_t emit) {
130     return table21_emit_[i >> 8][emit];
131   }
GetOp22(size_t i)132   static inline uint64_t GetOp22(size_t i) {
133     return table22_ops_[i >> 6][i & 0x3f];
134   }
GetEmit22(size_t i,size_t emit)135   static inline uint64_t GetEmit22(size_t i, size_t emit) {
136     return table22_emit_[i >> 6][emit];
137   }
GetOp23(size_t i)138   static inline uint64_t GetOp23(size_t i) {
139     return table23_ops_[i >> 6][i & 0x3f];
140   }
GetEmit23(size_t i,size_t emit)141   static inline uint64_t GetEmit23(size_t i, size_t emit) {
142     return table23_emit_[i >> 6][emit];
143   }
GetOp24(size_t i)144   static inline uint64_t GetOp24(size_t i) {
145     return table24_ops_[i >> 7][i & 0x7f];
146   }
GetEmit24(size_t i,size_t emit)147   static inline uint64_t GetEmit24(size_t i, size_t emit) {
148     return table24_emit_[i >> 7][emit];
149   }
GetOp25(size_t i)150   static inline uint64_t GetOp25(size_t i) {
151     return table25_ops_[i >> 7][i & 0x7f];
152   }
GetEmit25(size_t i,size_t emit)153   static inline uint64_t GetEmit25(size_t i, size_t emit) {
154     return table25_emit_[i >> 7][emit];
155   }
GetOp16(size_t i)156   static inline uint64_t GetOp16(size_t i) {
157     return table16_ops_[i >> 8][i & 0xff];
158   }
GetEmit16(size_t i,size_t emit)159   static inline uint64_t GetEmit16(size_t i, size_t emit) {
160     return table16_emit_[i >> 8][emit];
161   }
162 
163  private:
164   static const uint8_t table2_0_emit_[10];
165   static const uint8_t table2_0_ops_[32];
166   static const uint8_t table3_0_emit_[36];
167   static const uint8_t table3_0_ops_[64];
168   static const uint8_t table4_0_emit_[22];
169   static const uint8_t table4_0_ops_[64];
170   static const uint8_t table4_1_emit_[46];
171   static const uint8_t table4_1_ops_[64];
172   static const uint8_t* const table4_emit_[2];
173   static const uint8_t* const table4_ops_[2];
174   static const uint8_t table1_0_emit_[74];
175   static const uint16_t table1_0_inner_[76];
176   static const uint8_t table1_0_outer_[256];
177   static const uint8_t table8_0_inner_[6];
178   static const uint8_t table8_0_outer_[8];
179   static const uint8_t table9_0_emit_[6];
180   static const uint8_t table9_0_inner_[8];
181   static const uint8_t table9_0_outer_[16];
182   static const uint8_t table10_0_emit_[12];
183   static const uint8_t table10_0_ops_[32];
184   static const uint8_t table11_0_emit_[14];
185   static const uint8_t table11_0_ops_[64];
186   static const uint8_t table12_0_emit_[36];
187   static const uint8_t table12_0_ops_[128];
188   static const uint8_t table6_0_emit_[1];
189   static const uint16_t table6_0_ops_[32];
190   static const uint8_t table6_2_emit_[1];
191   static const uint16_t table6_2_ops_[32];
192   static const uint8_t table6_3_emit_[1];
193   static const uint8_t table6_4_emit_[1];
194   static const uint8_t table6_5_emit_[2];
195   static const uint16_t table6_5_ops_[32];
196   static const uint8_t table6_6_emit_[4];
197   static const uint16_t table6_6_ops_[32];
198   static const uint8_t table6_7_emit_[7];
199   static const uint16_t table6_7_ops_[32];
200   static const uint8_t* const table6_emit_[8];
201   static const uint16_t* const table6_ops_[8];
202   static const uint8_t table15_0_emit_[11];
203   static const uint8_t table15_0_inner_[12];
204   static const uint8_t table15_0_outer_[16];
205   static const uint8_t table13_0_emit_[15];
206   static const uint8_t table13_0_ops_[32];
207   static const uint8_t table17_0_emit_[9];
208   static const uint8_t table17_0_ops_[32];
209   static const uint8_t table18_0_emit_[35];
210   static const uint8_t table18_0_ops_[64];
211   static const uint8_t table19_0_emit_[64];
212   static const uint8_t table19_0_ops_[128];
213   static const uint8_t table20_0_emit_[23];
214   static const uint8_t table20_0_ops_[128];
215   static const uint8_t table20_1_emit_[53];
216   static const uint8_t table20_1_ops_[128];
217   static const uint8_t* const table20_emit_[2];
218   static const uint8_t* const table20_ops_[2];
219   static const uint8_t table21_0_ops_[256];
220   static const uint8_t table21_1_emit_[57];
221   static const uint8_t table21_1_ops_[256];
222   static const uint8_t* const table21_emit_[2];
223   static const uint8_t* const table21_ops_[2];
224   static const uint8_t table22_0_emit_[40];
225   static const uint8_t table22_0_ops_[64];
226   static const uint8_t table22_1_emit_[40];
227   static const uint8_t table22_2_emit_[40];
228   static const uint8_t table22_3_emit_[40];
229   static const uint8_t table22_4_emit_[22];
230   static const uint8_t table22_4_ops_[64];
231   static const uint8_t table22_5_emit_[4];
232   static const uint8_t table22_5_ops_[64];
233   static const uint8_t table22_6_emit_[4];
234   static const uint8_t table22_7_emit_[4];
235   static const uint8_t table22_8_emit_[4];
236   static const uint8_t table22_9_emit_[4];
237   static const uint8_t table22_10_emit_[4];
238   static const uint8_t table22_11_emit_[8];
239   static const uint8_t table22_11_ops_[64];
240   static const uint8_t table22_12_emit_[8];
241   static const uint8_t table22_13_emit_[8];
242   static const uint8_t table22_14_emit_[11];
243   static const uint8_t table22_14_ops_[64];
244   static const uint8_t table22_15_emit_[25];
245   static const uint8_t table22_15_ops_[64];
246   static const uint8_t* const table22_emit_[16];
247   static const uint8_t* const table22_ops_[16];
248   static const uint8_t table23_0_emit_[72];
249   static const uint16_t table23_0_ops_[64];
250   static const uint8_t table23_1_emit_[72];
251   static const uint8_t table23_2_emit_[72];
252   static const uint8_t table23_3_emit_[72];
253   static const uint8_t table23_4_emit_[72];
254   static const uint8_t table23_5_emit_[72];
255   static const uint8_t table23_6_emit_[72];
256   static const uint8_t table23_7_emit_[72];
257   static const uint8_t table23_8_emit_[72];
258   static const uint8_t table23_9_emit_[40];
259   static const uint16_t table23_9_ops_[64];
260   static const uint8_t table23_10_emit_[40];
261   static const uint8_t table23_11_emit_[40];
262   static const uint8_t table23_12_emit_[40];
263   static const uint8_t table23_13_emit_[40];
264   static const uint8_t table23_14_emit_[40];
265   static const uint8_t table23_15_emit_[40];
266   static const uint8_t table23_16_emit_[40];
267   static const uint8_t table23_17_emit_[40];
268   static const uint8_t table23_18_emit_[40];
269   static const uint8_t table23_19_emit_[40];
270   static const uint8_t table23_20_emit_[40];
271   static const uint8_t table23_21_emit_[40];
272   static const uint8_t table23_22_emit_[4];
273   static const uint16_t table23_22_ops_[64];
274   static const uint8_t table23_23_emit_[4];
275   static const uint8_t table23_24_emit_[4];
276   static const uint8_t table23_25_emit_[4];
277   static const uint8_t table23_26_emit_[4];
278   static const uint8_t table23_27_emit_[4];
279   static const uint8_t table23_28_emit_[4];
280   static const uint8_t table23_29_emit_[7];
281   static const uint16_t table23_29_ops_[64];
282   static const uint8_t table23_30_emit_[10];
283   static const uint16_t table23_30_ops_[64];
284   static const uint8_t table23_31_emit_[34];
285   static const uint16_t table23_31_ops_[64];
286   static const uint8_t* const table23_emit_[32];
287   static const uint16_t* const table23_ops_[32];
288   static const uint8_t table24_0_emit_[136];
289   static const uint16_t table24_0_ops_[128];
290   static const uint8_t table24_1_emit_[136];
291   static const uint8_t table24_2_emit_[136];
292   static const uint8_t table24_3_emit_[136];
293   static const uint8_t table24_4_emit_[136];
294   static const uint8_t table24_5_emit_[136];
295   static const uint8_t table24_6_emit_[136];
296   static const uint8_t table24_7_emit_[136];
297   static const uint8_t table24_8_emit_[136];
298   static const uint8_t table24_9_emit_[144];
299   static const uint16_t table24_9_ops_[128];
300   static const uint8_t table24_10_emit_[144];
301   static const uint8_t table24_11_emit_[144];
302   static const uint8_t table24_12_emit_[144];
303   static const uint8_t table24_13_emit_[144];
304   static const uint8_t table24_14_emit_[144];
305   static const uint8_t table24_15_emit_[144];
306   static const uint8_t table24_16_emit_[144];
307   static const uint8_t table24_17_emit_[144];
308   static const uint8_t table24_18_emit_[144];
309   static const uint8_t table24_19_emit_[144];
310   static const uint8_t table24_20_emit_[144];
311   static const uint8_t table24_21_emit_[144];
312   static const uint8_t table24_22_emit_[80];
313   static const uint16_t table24_22_ops_[128];
314   static const uint8_t table24_23_emit_[80];
315   static const uint8_t table24_24_emit_[80];
316   static const uint8_t table24_25_emit_[80];
317   static const uint8_t table24_26_emit_[80];
318   static const uint8_t table24_27_emit_[80];
319   static const uint8_t table24_28_emit_[80];
320   static const uint8_t table24_29_emit_[26];
321   static const uint16_t table24_29_ops_[128];
322   static const uint16_t table24_30_ops_[128];
323   static const uint8_t table24_31_emit_[63];
324   static const uint16_t table24_31_ops_[128];
325   static const uint8_t* const table24_emit_[32];
326   static const uint16_t* const table24_ops_[32];
327   static const uint8_t table25_0_emit_[44];
328   static const uint16_t table25_0_ops_[128];
329   static const uint8_t table25_1_emit_[104];
330   static const uint16_t table25_1_ops_[128];
331   static const uint8_t table25_2_emit_[44];
332   static const uint8_t table25_3_emit_[104];
333   static const uint8_t table25_4_emit_[44];
334   static const uint8_t table25_5_emit_[104];
335   static const uint8_t table25_6_emit_[44];
336   static const uint8_t table25_7_emit_[104];
337   static const uint8_t table25_8_emit_[44];
338   static const uint8_t table25_9_emit_[104];
339   static const uint8_t table25_10_emit_[44];
340   static const uint8_t table25_11_emit_[104];
341   static const uint8_t table25_12_emit_[44];
342   static const uint8_t table25_13_emit_[104];
343   static const uint8_t table25_14_emit_[44];
344   static const uint8_t table25_15_emit_[104];
345   static const uint8_t table25_16_emit_[44];
346   static const uint8_t table25_17_emit_[104];
347   static const uint8_t table25_18_emit_[136];
348   static const uint8_t table25_19_emit_[136];
349   static const uint8_t table25_20_emit_[136];
350   static const uint8_t table25_21_emit_[136];
351   static const uint8_t table25_22_emit_[136];
352   static const uint8_t table25_23_emit_[136];
353   static const uint8_t table25_24_emit_[136];
354   static const uint8_t table25_25_emit_[136];
355   static const uint8_t table25_26_emit_[136];
356   static const uint8_t table25_27_emit_[136];
357   static const uint8_t table25_28_emit_[136];
358   static const uint8_t table25_29_emit_[136];
359   static const uint8_t table25_30_emit_[136];
360   static const uint8_t table25_31_emit_[136];
361   static const uint8_t table25_32_emit_[136];
362   static const uint8_t table25_33_emit_[136];
363   static const uint8_t table25_34_emit_[136];
364   static const uint8_t table25_35_emit_[136];
365   static const uint8_t table25_36_emit_[136];
366   static const uint8_t table25_37_emit_[136];
367   static const uint8_t table25_38_emit_[136];
368   static const uint8_t table25_39_emit_[136];
369   static const uint8_t table25_40_emit_[136];
370   static const uint8_t table25_41_emit_[136];
371   static const uint8_t table25_42_emit_[136];
372   static const uint8_t table25_43_emit_[136];
373   static const uint8_t table25_44_emit_[144];
374   static const uint8_t table25_45_emit_[144];
375   static const uint8_t table25_46_emit_[144];
376   static const uint8_t table25_47_emit_[144];
377   static const uint8_t table25_48_emit_[144];
378   static const uint8_t table25_49_emit_[144];
379   static const uint8_t table25_50_emit_[144];
380   static const uint8_t table25_51_emit_[144];
381   static const uint8_t table25_52_emit_[144];
382   static const uint8_t table25_53_emit_[144];
383   static const uint8_t table25_54_emit_[144];
384   static const uint8_t table25_55_emit_[144];
385   static const uint8_t table25_56_emit_[144];
386   static const uint8_t table25_57_emit_[144];
387   static const uint8_t table25_58_emit_[112];
388   static const uint16_t table25_58_ops_[128];
389   static const uint8_t table25_59_emit_[80];
390   static const uint8_t table25_60_emit_[80];
391   static const uint8_t table25_61_emit_[44];
392   static const uint16_t table25_61_ops_[128];
393   static const uint8_t table25_62_emit_[17];
394   static const uint16_t table25_62_ops_[128];
395   static const uint8_t table25_63_emit_[46];
396   static const uint16_t table25_63_ops_[128];
397   static const uint8_t* const table25_emit_[64];
398   static const uint16_t* const table25_ops_[64];
399   static const uint8_t table16_0_emit_[1];
400   static const uint16_t table16_0_ops_[256];
401   static const uint8_t table16_2_emit_[1];
402   static const uint8_t table16_4_emit_[1];
403   static const uint8_t table16_6_emit_[1];
404   static const uint8_t table16_8_emit_[1];
405   static const uint8_t table16_10_emit_[1];
406   static const uint8_t table16_12_emit_[1];
407   static const uint8_t table16_14_emit_[1];
408   static const uint8_t table16_16_emit_[1];
409   static const uint8_t table16_18_emit_[1];
410   static const uint16_t table16_18_ops_[256];
411   static const uint8_t table16_19_emit_[1];
412   static const uint8_t table16_20_emit_[1];
413   static const uint8_t table16_21_emit_[1];
414   static const uint8_t table16_22_emit_[1];
415   static const uint8_t table16_23_emit_[1];
416   static const uint8_t table16_24_emit_[1];
417   static const uint8_t table16_25_emit_[1];
418   static const uint8_t table16_26_emit_[1];
419   static const uint8_t table16_27_emit_[1];
420   static const uint8_t table16_28_emit_[1];
421   static const uint8_t table16_29_emit_[1];
422   static const uint8_t table16_30_emit_[1];
423   static const uint8_t table16_31_emit_[1];
424   static const uint8_t table16_32_emit_[1];
425   static const uint8_t table16_33_emit_[1];
426   static const uint8_t table16_34_emit_[1];
427   static const uint8_t table16_35_emit_[1];
428   static const uint8_t table16_36_emit_[1];
429   static const uint8_t table16_37_emit_[1];
430   static const uint8_t table16_38_emit_[1];
431   static const uint8_t table16_39_emit_[1];
432   static const uint8_t table16_40_emit_[1];
433   static const uint8_t table16_41_emit_[1];
434   static const uint8_t table16_42_emit_[1];
435   static const uint8_t table16_43_emit_[1];
436   static const uint8_t table16_44_emit_[2];
437   static const uint16_t table16_44_ops_[256];
438   static const uint8_t table16_45_emit_[2];
439   static const uint8_t table16_46_emit_[2];
440   static const uint8_t table16_47_emit_[2];
441   static const uint8_t table16_48_emit_[2];
442   static const uint8_t table16_49_emit_[2];
443   static const uint8_t table16_50_emit_[2];
444   static const uint8_t table16_51_emit_[2];
445   static const uint8_t table16_52_emit_[2];
446   static const uint8_t table16_53_emit_[2];
447   static const uint8_t table16_54_emit_[2];
448   static const uint8_t table16_55_emit_[2];
449   static const uint8_t table16_56_emit_[2];
450   static const uint8_t table16_57_emit_[2];
451   static const uint8_t table16_58_emit_[3];
452   static const uint16_t table16_58_ops_[256];
453   static const uint8_t table16_59_emit_[4];
454   static const uint16_t table16_59_ops_[256];
455   static const uint8_t table16_60_emit_[4];
456   static const uint8_t table16_61_emit_[6];
457   static const uint16_t table16_61_ops_[256];
458   static const uint16_t table16_62_ops_[256];
459   static const uint8_t table16_63_emit_[49];
460   static const uint16_t table16_63_ops_[256];
461   static const uint8_t* const table16_emit_[64];
462   static const uint16_t* const table16_ops_[64];
463 };
464 template <typename F>
465 class HuffDecoder : public HuffDecoderCommon {
466  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)467   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
468       : sink_(sink), begin_(begin), end_(end) {}
Run()469   bool Run() {
470     while (!done_) {
471       if (!RefillTo8()) {
472         Done0();
473         break;
474       }
475       const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
476       const auto op = GetOp1(index);
477       const int consumed = op & 15;
478       buffer_len_ -= consumed;
479       const auto emit_ofs = op >> 6;
480       switch ((op >> 4) & 3) {
481         case 0: {
482           sink_(GetEmit1(index, emit_ofs + 0));
483           break;
484         }
485         case 1: {
486           DecodeStep0();
487           break;
488         }
489         case 2: {
490           DecodeStep1();
491           break;
492         }
493       }
494     }
495     return ok_;
496   }
497 
498  private:
RefillTo8()499   bool RefillTo8() {
500     switch (buffer_len_) {
501       case 0: {
502         return Read1to8Bytes();
503       }
504       case 1:
505       case 2:
506       case 3:
507       case 4:
508       case 5:
509       case 6:
510       case 7: {
511         return Read1to7Bytes();
512       }
513     }
514     return true;
515   }
Read1to8Bytes()516   bool Read1to8Bytes() {
517     switch (end_ - begin_) {
518       case 0: {
519         return false;
520       }
521       case 1: {
522         Fill1();
523         return true;
524       }
525       case 2: {
526         Fill2();
527         return true;
528       }
529       case 3: {
530         Fill3();
531         return true;
532       }
533       case 4: {
534         Fill4();
535         return true;
536       }
537       case 5: {
538         Fill5();
539         return true;
540       }
541       case 6: {
542         Fill6();
543         return true;
544       }
545       case 7: {
546         Fill7();
547         return true;
548       }
549       default: {
550         Fill8();
551         return true;
552       }
553     }
554   }
Fill1()555   void Fill1() {
556     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
557     begin_ += 1;
558     buffer_len_ += 8;
559   }
Fill2()560   void Fill2() {
561     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
562               (static_cast<uint64_t>(begin_[1]) << 0);
563     begin_ += 2;
564     buffer_len_ += 16;
565   }
Fill3()566   void Fill3() {
567     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
568               (static_cast<uint64_t>(begin_[1]) << 8) |
569               (static_cast<uint64_t>(begin_[2]) << 0);
570     begin_ += 3;
571     buffer_len_ += 24;
572   }
Fill4()573   void Fill4() {
574     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
575               (static_cast<uint64_t>(begin_[1]) << 16) |
576               (static_cast<uint64_t>(begin_[2]) << 8) |
577               (static_cast<uint64_t>(begin_[3]) << 0);
578     begin_ += 4;
579     buffer_len_ += 32;
580   }
Fill5()581   void Fill5() {
582     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
583               (static_cast<uint64_t>(begin_[1]) << 24) |
584               (static_cast<uint64_t>(begin_[2]) << 16) |
585               (static_cast<uint64_t>(begin_[3]) << 8) |
586               (static_cast<uint64_t>(begin_[4]) << 0);
587     begin_ += 5;
588     buffer_len_ += 40;
589   }
Fill6()590   void Fill6() {
591     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
592               (static_cast<uint64_t>(begin_[1]) << 32) |
593               (static_cast<uint64_t>(begin_[2]) << 24) |
594               (static_cast<uint64_t>(begin_[3]) << 16) |
595               (static_cast<uint64_t>(begin_[4]) << 8) |
596               (static_cast<uint64_t>(begin_[5]) << 0);
597     begin_ += 6;
598     buffer_len_ += 48;
599   }
Fill7()600   void Fill7() {
601     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
602               (static_cast<uint64_t>(begin_[1]) << 40) |
603               (static_cast<uint64_t>(begin_[2]) << 32) |
604               (static_cast<uint64_t>(begin_[3]) << 24) |
605               (static_cast<uint64_t>(begin_[4]) << 16) |
606               (static_cast<uint64_t>(begin_[5]) << 8) |
607               (static_cast<uint64_t>(begin_[6]) << 0);
608     begin_ += 7;
609     buffer_len_ += 56;
610   }
Fill8()611   void Fill8() {
612     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
613               (static_cast<uint64_t>(begin_[1]) << 48) |
614               (static_cast<uint64_t>(begin_[2]) << 40) |
615               (static_cast<uint64_t>(begin_[3]) << 32) |
616               (static_cast<uint64_t>(begin_[4]) << 24) |
617               (static_cast<uint64_t>(begin_[5]) << 16) |
618               (static_cast<uint64_t>(begin_[6]) << 8) |
619               (static_cast<uint64_t>(begin_[7]) << 0);
620     begin_ += 8;
621     buffer_len_ += 64;
622   }
Read1to7Bytes()623   bool Read1to7Bytes() {
624     switch (end_ - begin_) {
625       case 0: {
626         return false;
627       }
628       case 1: {
629         Fill1();
630         return true;
631       }
632       case 2: {
633         Fill2();
634         return true;
635       }
636       case 3: {
637         Fill3();
638         return true;
639       }
640       case 4: {
641         Fill4();
642         return true;
643       }
644       case 5: {
645         Fill5();
646         return true;
647       }
648       case 6: {
649         Fill6();
650         return true;
651       }
652       default: {
653         Fill7();
654         return true;
655       }
656     }
657   }
Done0()658   void Done0() {
659     done_ = true;
660     switch (end_ - begin_) {}
661     switch (buffer_len_) {
662       case 1:
663       case 2:
664       case 3:
665       case 4: {
666         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
667         return;
668       }
669       case 5: {
670         const auto index = buffer_ & 31;
671         const auto op = GetOp2(index);
672         switch (op & 3) {
673           case 0: {
674             sink_(GetEmit2(index, (op >> 2) + 0));
675             break;
676           }
677           case 1: {
678             ok_ = false;
679             break;
680           }
681         }
682         return;
683       }
684       case 6: {
685         const auto index = buffer_ & 63;
686         const auto op = GetOp3(index);
687         switch (op & 3) {
688           case 0: {
689             ok_ = false;
690             break;
691           }
692           case 1: {
693             sink_(GetEmit3(index, (op >> 2) + 0));
694             break;
695           }
696         }
697         return;
698       }
699       case 7: {
700         const auto index = buffer_ & 127;
701         const auto op = GetOp4(index);
702         switch (op & 3) {
703           case 0: {
704             ok_ = false;
705             break;
706           }
707           case 1: {
708             sink_(GetEmit4(index, (op >> 2) + 0));
709             break;
710           }
711         }
712         return;
713       }
714       case 0: {
715         return;
716       }
717     }
718   }
DecodeStep0()719   void DecodeStep0() {
720     if (!RefillTo2()) {
721       Done1();
722       return;
723     }
724     const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3;
725     const auto op = GetOp5(index);
726     const int consumed = op & 3;
727     buffer_len_ -= consumed;
728     const auto emit_ofs = op >> 2;
729     sink_(GetEmit5(index, emit_ofs + 0));
730   }
RefillTo2()731   bool RefillTo2() {
732     switch (buffer_len_) {
733       case 0: {
734         return Read1to8Bytes();
735       }
736       case 1: {
737         return Read1to7Bytes();
738       }
739     }
740     return true;
741   }
Done1()742   void Done1() {
743     done_ = true;
744     switch (buffer_len_) {
745       case 1:
746       case 0: {
747         ok_ = false;
748         return;
749       }
750     }
751   }
DecodeStep1()752   void DecodeStep1() {
753     if (!RefillTo8()) {
754       Done2();
755       return;
756     }
757     const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff;
758     const auto op = GetOp6(index);
759     const int consumed = op & 15;
760     buffer_len_ -= consumed;
761     const auto emit_ofs = op >> 6;
762     switch ((op >> 4) & 3) {
763       case 0: {
764         sink_(GetEmit6(index, emit_ofs + 0));
765         break;
766       }
767       case 1: {
768         DecodeStep2();
769         break;
770       }
771       case 2: {
772         DecodeStep3();
773         break;
774       }
775     }
776   }
Done2()777   void Done2() {
778     done_ = true;
779     switch (end_ - begin_) {}
780     switch (buffer_len_) {
781       case 1: {
782         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
783         return;
784       }
785       case 2: {
786         const auto index = buffer_ & 3;
787         const auto op = GetOp7(index);
788         switch (op & 3) {
789           case 0: {
790             sink_(GetEmit7(index, (op >> 2) + 0));
791             break;
792           }
793           case 1: {
794             ok_ = false;
795             break;
796           }
797         }
798         return;
799       }
800       case 3: {
801         const auto index = buffer_ & 7;
802         const auto op = GetOp8(index);
803         switch (op & 3) {
804           case 0: {
805             ok_ = false;
806             break;
807           }
808           case 1: {
809             sink_(GetEmit8(index, (op >> 2) + 0));
810             break;
811           }
812         }
813         return;
814       }
815       case 4: {
816         const auto index = buffer_ & 15;
817         const auto op = GetOp9(index);
818         switch (op & 3) {
819           case 0: {
820             ok_ = false;
821             break;
822           }
823           case 1: {
824             sink_(GetEmit9(index, (op >> 2) + 0));
825             break;
826           }
827         }
828         return;
829       }
830       case 5: {
831         const auto index = buffer_ & 31;
832         const auto op = GetOp10(index);
833         switch (op & 3) {
834           case 0: {
835             ok_ = false;
836             break;
837           }
838           case 1: {
839             sink_(GetEmit10(index, (op >> 2) + 0));
840             break;
841           }
842         }
843         return;
844       }
845       case 6: {
846         const auto index = buffer_ & 63;
847         const auto op = GetOp11(index);
848         switch (op & 3) {
849           case 0: {
850             ok_ = false;
851             break;
852           }
853           case 1: {
854             sink_(GetEmit11(index, (op >> 2) + 0));
855             break;
856           }
857         }
858         return;
859       }
860       case 7: {
861         const auto index = buffer_ & 127;
862         const auto op = GetOp12(index);
863         switch (op & 3) {
864           case 0: {
865             sink_(GetEmit12(index, (op >> 2) + 0));
866             sink_(GetEmit12(index, (op >> 2) + 1));
867             break;
868           }
869           case 1: {
870             ok_ = false;
871             break;
872           }
873           case 2: {
874             sink_(GetEmit12(index, (op >> 2) + 0));
875             break;
876           }
877         }
878         return;
879       }
880       case 0: {
881         return;
882       }
883     }
884   }
DecodeStep2()885   void DecodeStep2() {
886     if (!RefillTo5()) {
887       Done3();
888       return;
889     }
890     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
891     const auto op = GetOp13(index);
892     const int consumed = op & 7;
893     buffer_len_ -= consumed;
894     const auto emit_ofs = op >> 3;
895     sink_(GetEmit13(index, emit_ofs + 0));
896   }
RefillTo5()897   bool RefillTo5() {
898     switch (buffer_len_) {
899       case 0: {
900         return Read1to8Bytes();
901       }
902       case 1:
903       case 2:
904       case 3:
905       case 4: {
906         return Read1to7Bytes();
907       }
908     }
909     return true;
910   }
Done3()911   void Done3() {
912     done_ = true;
913     switch (buffer_len_) {
914       case 1:
915       case 2:
916       case 0: {
917         ok_ = false;
918         return;
919       }
920       case 3: {
921         const auto index = buffer_ & 7;
922         const auto op = GetOp14(index);
923         switch (op & 1) {
924           case 0: {
925             sink_(GetEmit14(index, (op >> 1) + 0));
926             break;
927           }
928           case 1: {
929             ok_ = false;
930             break;
931           }
932         }
933         return;
934       }
935       case 4: {
936         const auto index = buffer_ & 15;
937         const auto op = GetOp15(index);
938         switch (op & 1) {
939           case 0: {
940             ok_ = false;
941             break;
942           }
943           case 1: {
944             sink_(GetEmit15(index, (op >> 1) + 0));
945             break;
946           }
947         }
948         return;
949       }
950     }
951   }
DecodeStep3()952   void DecodeStep3() {
953     if (!RefillTo14()) {
954       Done4();
955       return;
956     }
957     const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff;
958     const auto op = GetOp16(index);
959     const int consumed = op & 15;
960     buffer_len_ -= consumed;
961     const auto emit_ofs = op >> 5;
962     switch ((op >> 4) & 1) {
963       case 0: {
964         sink_(GetEmit16(index, emit_ofs + 0));
965         break;
966       }
967       case 1: {
968         begin_ = end_;
969         buffer_len_ = 0;
970         break;
971       }
972     }
973   }
RefillTo14()974   bool RefillTo14() {
975     switch (buffer_len_) {
976       case 0: {
977         return Read2to8Bytes();
978       }
979       case 1:
980       case 2:
981       case 3:
982       case 4:
983       case 5: {
984         return Read2to7Bytes();
985       }
986       case 6:
987       case 7:
988       case 8: {
989         return Read1to7Bytes();
990       }
991       case 9:
992       case 10:
993       case 11:
994       case 12:
995       case 13: {
996         return Read1to6Bytes();
997       }
998     }
999     return true;
1000   }
Read2to8Bytes()1001   bool Read2to8Bytes() {
1002     switch (end_ - begin_) {
1003       case 0:
1004       case 1: {
1005         return false;
1006       }
1007       case 2: {
1008         Fill2();
1009         return true;
1010       }
1011       case 3: {
1012         Fill3();
1013         return true;
1014       }
1015       case 4: {
1016         Fill4();
1017         return true;
1018       }
1019       case 5: {
1020         Fill5();
1021         return true;
1022       }
1023       case 6: {
1024         Fill6();
1025         return true;
1026       }
1027       case 7: {
1028         Fill7();
1029         return true;
1030       }
1031       default: {
1032         Fill8();
1033         return true;
1034       }
1035     }
1036   }
Read2to7Bytes()1037   bool Read2to7Bytes() {
1038     switch (end_ - begin_) {
1039       case 0:
1040       case 1: {
1041         return false;
1042       }
1043       case 2: {
1044         Fill2();
1045         return true;
1046       }
1047       case 3: {
1048         Fill3();
1049         return true;
1050       }
1051       case 4: {
1052         Fill4();
1053         return true;
1054       }
1055       case 5: {
1056         Fill5();
1057         return true;
1058       }
1059       case 6: {
1060         Fill6();
1061         return true;
1062       }
1063       default: {
1064         Fill7();
1065         return true;
1066       }
1067     }
1068   }
Read1to6Bytes()1069   bool Read1to6Bytes() {
1070     switch (end_ - begin_) {
1071       case 0: {
1072         return false;
1073       }
1074       case 1: {
1075         Fill1();
1076         return true;
1077       }
1078       case 2: {
1079         Fill2();
1080         return true;
1081       }
1082       case 3: {
1083         Fill3();
1084         return true;
1085       }
1086       case 4: {
1087         Fill4();
1088         return true;
1089       }
1090       case 5: {
1091         Fill5();
1092         return true;
1093       }
1094       default: {
1095         Fill6();
1096         return true;
1097       }
1098     }
1099   }
Done4()1100   void Done4() {
1101     done_ = true;
1102     switch (end_ - begin_) {
1103       case 1: {
1104         Fill1();
1105         break;
1106       }
1107     }
1108     switch (buffer_len_) {
1109       case 1:
1110       case 2:
1111       case 3:
1112       case 4: {
1113         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1114         return;
1115       }
1116       case 5: {
1117         const auto index = buffer_ & 31;
1118         const auto op = GetOp17(index);
1119         switch (op & 3) {
1120           case 0: {
1121             sink_(GetEmit17(index, (op >> 2) + 0));
1122             break;
1123           }
1124           case 1: {
1125             ok_ = false;
1126             break;
1127           }
1128         }
1129         return;
1130       }
1131       case 6: {
1132         const auto index = buffer_ & 63;
1133         const auto op = GetOp18(index);
1134         switch (op & 3) {
1135           case 0: {
1136             ok_ = false;
1137             break;
1138           }
1139           case 1: {
1140             sink_(GetEmit18(index, (op >> 2) + 0));
1141             break;
1142           }
1143         }
1144         return;
1145       }
1146       case 7: {
1147         const auto index = buffer_ & 127;
1148         const auto op = GetOp19(index);
1149         switch (op & 3) {
1150           case 0: {
1151             ok_ = false;
1152             break;
1153           }
1154           case 1: {
1155             sink_(GetEmit19(index, (op >> 2) + 0));
1156             break;
1157           }
1158         }
1159         return;
1160       }
1161       case 8: {
1162         const auto index = buffer_ & 255;
1163         const auto op = GetOp20(index);
1164         switch (op & 3) {
1165           case 0: {
1166             ok_ = false;
1167             break;
1168           }
1169           case 1: {
1170             sink_(GetEmit20(index, (op >> 2) + 0));
1171             break;
1172           }
1173         }
1174         return;
1175       }
1176       case 9: {
1177         const auto index = buffer_ & 511;
1178         const auto op = GetOp21(index);
1179         switch (op & 3) {
1180           case 0: {
1181             ok_ = false;
1182             break;
1183           }
1184           case 1: {
1185             sink_(GetEmit21(index, (op >> 2) + 0));
1186             break;
1187           }
1188         }
1189         return;
1190       }
1191       case 10: {
1192         const auto index = buffer_ & 1023;
1193         const auto op = GetOp22(index);
1194         switch (op & 3) {
1195           case 0: {
1196             sink_(GetEmit22(index, (op >> 2) + 0));
1197             sink_(GetEmit22(index, (op >> 2) + 1));
1198             break;
1199           }
1200           case 1: {
1201             ok_ = false;
1202             break;
1203           }
1204           case 2: {
1205             sink_(GetEmit22(index, (op >> 2) + 0));
1206             break;
1207           }
1208         }
1209         return;
1210       }
1211       case 11: {
1212         const auto index = buffer_ & 2047;
1213         const auto op = GetOp23(index);
1214         switch (op & 3) {
1215           case 0: {
1216             ok_ = false;
1217             break;
1218           }
1219           case 1: {
1220             sink_(GetEmit23(index, (op >> 2) + 0));
1221             sink_(GetEmit23(index, (op >> 2) + 1));
1222             break;
1223           }
1224           case 2: {
1225             sink_(GetEmit23(index, (op >> 2) + 0));
1226             break;
1227           }
1228         }
1229         return;
1230       }
1231       case 12: {
1232         const auto index = buffer_ & 4095;
1233         const auto op = GetOp24(index);
1234         switch (op & 3) {
1235           case 0: {
1236             ok_ = false;
1237             break;
1238           }
1239           case 1: {
1240             sink_(GetEmit24(index, (op >> 2) + 0));
1241             sink_(GetEmit24(index, (op >> 2) + 1));
1242             break;
1243           }
1244           case 2: {
1245             sink_(GetEmit24(index, (op >> 2) + 0));
1246             break;
1247           }
1248         }
1249         return;
1250       }
1251       case 13: {
1252         const auto index = buffer_ & 8191;
1253         const auto op = GetOp25(index);
1254         switch (op & 3) {
1255           case 0: {
1256             ok_ = false;
1257             break;
1258           }
1259           case 1: {
1260             sink_(GetEmit25(index, (op >> 2) + 0));
1261             sink_(GetEmit25(index, (op >> 2) + 1));
1262             break;
1263           }
1264           case 2: {
1265             sink_(GetEmit25(index, (op >> 2) + 0));
1266             break;
1267           }
1268         }
1269         return;
1270       }
1271       case 0: {
1272         return;
1273       }
1274     }
1275   }
1276   F sink_;
1277   const uint8_t* begin_;
1278   const uint8_t* const end_;
1279   uint64_t buffer_ = 0;
1280   int buffer_len_ = 0;
1281   bool ok_ = true;
1282   bool done_ = false;
1283 };
1284 }  // namespace geometry_8_8_14
1285 }  // namespace grpc_core
1286 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_8_14_H
1287