xref: /aosp_15_r20/external/grpc-grpc/test/cpp/microbenchmarks/huffman_geometries/decode_huff_7_9_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_7_9_14_H
19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_9_14_H
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <grpc/support/port_platform.h>
24 namespace grpc_core {
25 namespace geometry_7_9_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   }
GetOp1(size_t i)36   static inline uint64_t GetOp1(size_t i) {
37     return table1_0_inner_[table1_0_outer_[i]];
38   }
GetEmit1(size_t,size_t emit)39   static inline uint64_t GetEmit1(size_t, size_t emit) {
40     return table1_0_emit_[emit];
41   }
GetOp4(size_t i)42   static inline uint64_t GetOp4(size_t i) { return i ? 3 : 1; }
GetEmit4(size_t,size_t emit)43   static inline uint64_t GetEmit4(size_t, size_t emit) {
44     return emit ? 42 : 38;
45   }
GetOp5(size_t i)46   static inline uint64_t GetOp5(size_t i) { return i ? 3 : 1; }
GetEmit5(size_t,size_t emit)47   static inline uint64_t GetEmit5(size_t, size_t emit) {
48     return emit ? 59 : 44;
49   }
GetOp6(size_t i)50   static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; }
GetEmit6(size_t,size_t emit)51   static inline uint64_t GetEmit6(size_t, size_t emit) {
52     return emit ? 90 : 88;
53   }
GetOp8(size_t i)54   static inline uint64_t GetOp8(size_t i) {
55     return table8_0_inner_[(i < 6 ? (i) : ((i - 6) + 5))];
56   }
GetEmit8(size_t,size_t emit)57   static inline uint64_t GetEmit8(size_t, size_t emit) {
58     return table8_0_emit_[emit];
59   }
GetOp9(size_t i)60   static inline uint64_t GetOp9(size_t i) {
61     return table9_0_inner_[table9_0_outer_[i]];
62   }
GetEmit9(size_t,size_t emit)63   static inline uint64_t GetEmit9(size_t, size_t emit) {
64     return table9_0_emit_[emit];
65   }
GetOp10(size_t i)66   static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; }
GetEmit10(size_t,size_t emit)67   static inline uint64_t GetEmit10(size_t, size_t emit) {
68     return table10_0_emit_[emit];
69   }
GetOp11(size_t i)70   static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; }
GetEmit11(size_t,size_t emit)71   static inline uint64_t GetEmit11(size_t, size_t emit) {
72     return table11_0_emit_[emit];
73   }
GetOp12(size_t i)74   static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; }
GetEmit12(size_t,size_t emit)75   static inline uint64_t GetEmit12(size_t, size_t emit) {
76     return table12_0_emit_[emit];
77   }
GetOp13(size_t i)78   static inline uint64_t GetOp13(size_t i) {
79     return table13_ops_[i >> 6][i & 0x3f];
80   }
GetEmit13(size_t i,size_t emit)81   static inline uint64_t GetEmit13(size_t i, size_t emit) {
82     return table13_emit_[i >> 6][emit];
83   }
GetOp7(size_t i)84   static inline uint64_t GetOp7(size_t i) {
85     return table7_ops_[i >> 6][i & 0x3f];
86   }
GetEmit7(size_t i,size_t emit)87   static inline uint64_t GetEmit7(size_t i, size_t emit) {
88     return table7_emit_[i >> 6][emit];
89   }
GetOp15(size_t i)90   static inline uint64_t GetOp15(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   }
GetEmit15(size_t,size_t emit)95   static inline uint64_t GetEmit15(size_t, size_t emit) {
96     return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195));
97   }
GetOp16(size_t i)98   static inline uint64_t GetOp16(size_t i) {
99     return table16_0_inner_[table16_0_outer_[i]];
100   }
GetEmit16(size_t,size_t emit)101   static inline uint64_t GetEmit16(size_t, size_t emit) {
102     return table16_0_emit_[emit];
103   }
GetOp14(size_t i)104   static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; }
GetEmit14(size_t,size_t emit)105   static inline uint64_t GetEmit14(size_t, size_t emit) {
106     return table14_0_emit_[emit];
107   }
GetOp18(size_t i)108   static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; }
GetEmit18(size_t,size_t emit)109   static inline uint64_t GetEmit18(size_t, size_t emit) {
110     return table18_0_emit_[emit];
111   }
GetOp19(size_t i)112   static inline uint64_t GetOp19(size_t i) { return table19_0_ops_[i]; }
GetEmit19(size_t,size_t emit)113   static inline uint64_t GetEmit19(size_t, size_t emit) {
114     return table19_0_emit_[emit];
115   }
GetOp20(size_t i)116   static inline uint64_t GetOp20(size_t i) { return table20_0_ops_[i]; }
GetEmit20(size_t,size_t emit)117   static inline uint64_t GetEmit20(size_t, size_t emit) {
118     return table20_0_emit_[emit];
119   }
GetOp21(size_t i)120   static inline uint64_t GetOp21(size_t i) {
121     return table21_ops_[i >> 7][i & 0x7f];
122   }
GetEmit21(size_t i,size_t emit)123   static inline uint64_t GetEmit21(size_t i, size_t emit) {
124     return table21_emit_[i >> 7][emit];
125   }
GetOp22(size_t i)126   static inline uint64_t GetOp22(size_t i) {
127     return table22_ops_[i >> 8][i & 0xff];
128   }
GetEmit22(size_t i,size_t emit)129   static inline uint64_t GetEmit22(size_t i, size_t emit) {
130     return table22_emit_[i >> 8][emit];
131   }
GetOp23(size_t i)132   static inline uint64_t GetOp23(size_t i) {
133     return table23_ops_[i >> 6][i & 0x3f];
134   }
GetEmit23(size_t i,size_t emit)135   static inline uint64_t GetEmit23(size_t i, size_t emit) {
136     return table23_emit_[i >> 6][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 >> 7][i & 0x7f];
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 >> 7][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   }
GetOp17(size_t i)156   static inline uint64_t GetOp17(size_t i) {
157     return table17_ops_[i >> 8][i & 0xff];
158   }
GetEmit17(size_t i,size_t emit)159   static inline uint64_t GetEmit17(size_t i, size_t emit) {
160     return table17_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 table1_0_emit_[68];
169   static const uint16_t table1_0_inner_[72];
170   static const uint8_t table1_0_outer_[128];
171   static const uint8_t table8_0_emit_[5];
172   static const uint8_t table8_0_inner_[7];
173   static const uint8_t table9_0_emit_[8];
174   static const uint8_t table9_0_inner_[10];
175   static const uint8_t table9_0_outer_[16];
176   static const uint8_t table10_0_emit_[10];
177   static const uint8_t table10_0_ops_[32];
178   static const uint8_t table11_0_emit_[16];
179   static const uint8_t table11_0_ops_[64];
180   static const uint8_t table12_0_emit_[18];
181   static const uint8_t table12_0_ops_[128];
182   static const uint8_t table13_0_emit_[40];
183   static const uint8_t table13_0_ops_[64];
184   static const uint8_t table13_1_emit_[40];
185   static const uint8_t table13_2_emit_[22];
186   static const uint8_t table13_2_ops_[64];
187   static const uint8_t table13_3_emit_[14];
188   static const uint8_t table13_3_ops_[64];
189   static const uint8_t* const table13_emit_[4];
190   static const uint8_t* const table13_ops_[4];
191   static const uint8_t table7_0_emit_[1];
192   static const uint16_t table7_0_ops_[64];
193   static const uint8_t table7_1_emit_[1];
194   static const uint8_t table7_2_emit_[1];
195   static const uint8_t table7_3_emit_[1];
196   static const uint8_t table7_4_emit_[1];
197   static const uint8_t table7_5_emit_[2];
198   static const uint16_t table7_5_ops_[64];
199   static const uint8_t table7_6_emit_[3];
200   static const uint16_t table7_6_ops_[64];
201   static const uint8_t table7_7_emit_[11];
202   static const uint16_t table7_7_ops_[64];
203   static const uint8_t* const table7_emit_[8];
204   static const uint16_t* const table7_ops_[8];
205   static const uint8_t table16_0_emit_[11];
206   static const uint8_t table16_0_inner_[12];
207   static const uint8_t table16_0_outer_[16];
208   static const uint8_t table14_0_emit_[15];
209   static const uint8_t table14_0_ops_[32];
210   static const uint8_t table18_0_emit_[9];
211   static const uint8_t table18_0_ops_[32];
212   static const uint8_t table19_0_emit_[35];
213   static const uint8_t table19_0_ops_[64];
214   static const uint8_t table20_0_emit_[64];
215   static const uint8_t table20_0_ops_[128];
216   static const uint8_t table21_0_emit_[23];
217   static const uint8_t table21_0_ops_[128];
218   static const uint8_t table21_1_emit_[53];
219   static const uint8_t table21_1_ops_[128];
220   static const uint8_t* const table21_emit_[2];
221   static const uint8_t* const table21_ops_[2];
222   static const uint8_t table22_0_ops_[256];
223   static const uint8_t table22_1_emit_[57];
224   static const uint8_t table22_1_ops_[256];
225   static const uint8_t* const table22_emit_[2];
226   static const uint8_t* const table22_ops_[2];
227   static const uint8_t table23_0_emit_[40];
228   static const uint8_t table23_1_emit_[40];
229   static const uint8_t table23_2_emit_[40];
230   static const uint8_t table23_3_emit_[40];
231   static const uint8_t table23_4_emit_[22];
232   static const uint8_t table23_5_emit_[4];
233   static const uint8_t table23_5_ops_[64];
234   static const uint8_t table23_6_emit_[4];
235   static const uint8_t table23_7_emit_[4];
236   static const uint8_t table23_8_emit_[4];
237   static const uint8_t table23_9_emit_[4];
238   static const uint8_t table23_10_emit_[4];
239   static const uint8_t table23_11_emit_[8];
240   static const uint8_t table23_11_ops_[64];
241   static const uint8_t table23_12_emit_[8];
242   static const uint8_t table23_13_emit_[8];
243   static const uint8_t table23_14_emit_[11];
244   static const uint8_t table23_14_ops_[64];
245   static const uint8_t table23_15_emit_[25];
246   static const uint8_t table23_15_ops_[64];
247   static const uint8_t* const table23_emit_[16];
248   static const uint8_t* const table23_ops_[16];
249   static const uint8_t table24_0_emit_[72];
250   static const uint16_t table24_0_ops_[64];
251   static const uint8_t table24_1_emit_[72];
252   static const uint8_t table24_2_emit_[72];
253   static const uint8_t table24_3_emit_[72];
254   static const uint8_t table24_4_emit_[72];
255   static const uint8_t table24_5_emit_[72];
256   static const uint8_t table24_6_emit_[72];
257   static const uint8_t table24_7_emit_[72];
258   static const uint8_t table24_8_emit_[72];
259   static const uint8_t table24_9_emit_[40];
260   static const uint16_t table24_9_ops_[64];
261   static const uint8_t table24_10_emit_[40];
262   static const uint8_t table24_11_emit_[40];
263   static const uint8_t table24_12_emit_[40];
264   static const uint8_t table24_13_emit_[40];
265   static const uint8_t table24_14_emit_[40];
266   static const uint8_t table24_15_emit_[40];
267   static const uint8_t table24_16_emit_[40];
268   static const uint8_t table24_17_emit_[40];
269   static const uint8_t table24_18_emit_[40];
270   static const uint8_t table24_19_emit_[40];
271   static const uint8_t table24_20_emit_[40];
272   static const uint8_t table24_21_emit_[40];
273   static const uint8_t table24_22_emit_[4];
274   static const uint16_t table24_22_ops_[64];
275   static const uint8_t table24_23_emit_[4];
276   static const uint8_t table24_24_emit_[4];
277   static const uint8_t table24_25_emit_[4];
278   static const uint8_t table24_26_emit_[4];
279   static const uint8_t table24_27_emit_[4];
280   static const uint8_t table24_28_emit_[4];
281   static const uint8_t table24_29_emit_[7];
282   static const uint16_t table24_29_ops_[64];
283   static const uint8_t table24_30_emit_[10];
284   static const uint16_t table24_30_ops_[64];
285   static const uint8_t table24_31_emit_[34];
286   static const uint16_t table24_31_ops_[64];
287   static const uint8_t* const table24_emit_[32];
288   static const uint16_t* const table24_ops_[32];
289   static const uint8_t table25_0_emit_[136];
290   static const uint16_t table25_0_ops_[128];
291   static const uint8_t table25_1_emit_[136];
292   static const uint8_t table25_2_emit_[136];
293   static const uint8_t table25_3_emit_[136];
294   static const uint8_t table25_4_emit_[136];
295   static const uint8_t table25_5_emit_[136];
296   static const uint8_t table25_6_emit_[136];
297   static const uint8_t table25_7_emit_[136];
298   static const uint8_t table25_8_emit_[136];
299   static const uint8_t table25_9_emit_[144];
300   static const uint16_t table25_9_ops_[128];
301   static const uint8_t table25_10_emit_[144];
302   static const uint8_t table25_11_emit_[144];
303   static const uint8_t table25_12_emit_[144];
304   static const uint8_t table25_13_emit_[144];
305   static const uint8_t table25_14_emit_[144];
306   static const uint8_t table25_15_emit_[144];
307   static const uint8_t table25_16_emit_[144];
308   static const uint8_t table25_17_emit_[144];
309   static const uint8_t table25_18_emit_[144];
310   static const uint8_t table25_19_emit_[144];
311   static const uint8_t table25_20_emit_[144];
312   static const uint8_t table25_21_emit_[144];
313   static const uint8_t table25_22_emit_[80];
314   static const uint16_t table25_22_ops_[128];
315   static const uint8_t table25_23_emit_[80];
316   static const uint8_t table25_24_emit_[80];
317   static const uint8_t table25_25_emit_[80];
318   static const uint8_t table25_26_emit_[80];
319   static const uint8_t table25_27_emit_[80];
320   static const uint8_t table25_28_emit_[80];
321   static const uint8_t table25_29_emit_[26];
322   static const uint16_t table25_29_ops_[128];
323   static const uint16_t table25_30_ops_[128];
324   static const uint8_t table25_31_emit_[63];
325   static const uint16_t table25_31_ops_[128];
326   static const uint8_t* const table25_emit_[32];
327   static const uint16_t* const table25_ops_[32];
328   static const uint8_t table26_0_emit_[44];
329   static const uint16_t table26_0_ops_[128];
330   static const uint8_t table26_1_emit_[104];
331   static const uint16_t table26_1_ops_[128];
332   static const uint8_t table26_2_emit_[44];
333   static const uint8_t table26_3_emit_[104];
334   static const uint8_t table26_4_emit_[44];
335   static const uint8_t table26_5_emit_[104];
336   static const uint8_t table26_6_emit_[44];
337   static const uint8_t table26_7_emit_[104];
338   static const uint8_t table26_8_emit_[44];
339   static const uint8_t table26_9_emit_[104];
340   static const uint8_t table26_10_emit_[44];
341   static const uint8_t table26_11_emit_[104];
342   static const uint8_t table26_12_emit_[44];
343   static const uint8_t table26_13_emit_[104];
344   static const uint8_t table26_14_emit_[44];
345   static const uint8_t table26_15_emit_[104];
346   static const uint8_t table26_16_emit_[44];
347   static const uint8_t table26_17_emit_[104];
348   static const uint8_t table26_18_emit_[136];
349   static const uint8_t table26_19_emit_[136];
350   static const uint8_t table26_20_emit_[136];
351   static const uint8_t table26_21_emit_[136];
352   static const uint8_t table26_22_emit_[136];
353   static const uint8_t table26_23_emit_[136];
354   static const uint8_t table26_24_emit_[136];
355   static const uint8_t table26_25_emit_[136];
356   static const uint8_t table26_26_emit_[136];
357   static const uint8_t table26_27_emit_[136];
358   static const uint8_t table26_28_emit_[136];
359   static const uint8_t table26_29_emit_[136];
360   static const uint8_t table26_30_emit_[136];
361   static const uint8_t table26_31_emit_[136];
362   static const uint8_t table26_32_emit_[136];
363   static const uint8_t table26_33_emit_[136];
364   static const uint8_t table26_34_emit_[136];
365   static const uint8_t table26_35_emit_[136];
366   static const uint8_t table26_36_emit_[136];
367   static const uint8_t table26_37_emit_[136];
368   static const uint8_t table26_38_emit_[136];
369   static const uint8_t table26_39_emit_[136];
370   static const uint8_t table26_40_emit_[136];
371   static const uint8_t table26_41_emit_[136];
372   static const uint8_t table26_42_emit_[136];
373   static const uint8_t table26_43_emit_[136];
374   static const uint8_t table26_44_emit_[144];
375   static const uint8_t table26_45_emit_[144];
376   static const uint8_t table26_46_emit_[144];
377   static const uint8_t table26_47_emit_[144];
378   static const uint8_t table26_48_emit_[144];
379   static const uint8_t table26_49_emit_[144];
380   static const uint8_t table26_50_emit_[144];
381   static const uint8_t table26_51_emit_[144];
382   static const uint8_t table26_52_emit_[144];
383   static const uint8_t table26_53_emit_[144];
384   static const uint8_t table26_54_emit_[144];
385   static const uint8_t table26_55_emit_[144];
386   static const uint8_t table26_56_emit_[144];
387   static const uint8_t table26_57_emit_[144];
388   static const uint8_t table26_58_emit_[112];
389   static const uint16_t table26_58_ops_[128];
390   static const uint8_t table26_59_emit_[80];
391   static const uint8_t table26_60_emit_[80];
392   static const uint8_t table26_61_emit_[44];
393   static const uint16_t table26_61_ops_[128];
394   static const uint8_t table26_62_emit_[17];
395   static const uint16_t table26_62_ops_[128];
396   static const uint8_t table26_63_emit_[46];
397   static const uint16_t table26_63_ops_[128];
398   static const uint8_t* const table26_emit_[64];
399   static const uint16_t* const table26_ops_[64];
400   static const uint8_t table17_0_emit_[1];
401   static const uint16_t table17_0_ops_[256];
402   static const uint8_t table17_2_emit_[1];
403   static const uint8_t table17_4_emit_[1];
404   static const uint8_t table17_6_emit_[1];
405   static const uint8_t table17_8_emit_[1];
406   static const uint8_t table17_10_emit_[1];
407   static const uint8_t table17_12_emit_[1];
408   static const uint8_t table17_14_emit_[1];
409   static const uint8_t table17_16_emit_[1];
410   static const uint8_t table17_18_emit_[1];
411   static const uint16_t table17_18_ops_[256];
412   static const uint8_t table17_19_emit_[1];
413   static const uint8_t table17_20_emit_[1];
414   static const uint8_t table17_21_emit_[1];
415   static const uint8_t table17_22_emit_[1];
416   static const uint8_t table17_23_emit_[1];
417   static const uint8_t table17_24_emit_[1];
418   static const uint8_t table17_25_emit_[1];
419   static const uint8_t table17_26_emit_[1];
420   static const uint8_t table17_27_emit_[1];
421   static const uint8_t table17_28_emit_[1];
422   static const uint8_t table17_29_emit_[1];
423   static const uint8_t table17_30_emit_[1];
424   static const uint8_t table17_31_emit_[1];
425   static const uint8_t table17_32_emit_[1];
426   static const uint8_t table17_33_emit_[1];
427   static const uint8_t table17_34_emit_[1];
428   static const uint8_t table17_35_emit_[1];
429   static const uint8_t table17_36_emit_[1];
430   static const uint8_t table17_37_emit_[1];
431   static const uint8_t table17_38_emit_[1];
432   static const uint8_t table17_39_emit_[1];
433   static const uint8_t table17_40_emit_[1];
434   static const uint8_t table17_41_emit_[1];
435   static const uint8_t table17_42_emit_[1];
436   static const uint8_t table17_43_emit_[1];
437   static const uint8_t table17_44_emit_[2];
438   static const uint16_t table17_44_ops_[256];
439   static const uint8_t table17_45_emit_[2];
440   static const uint8_t table17_46_emit_[2];
441   static const uint8_t table17_47_emit_[2];
442   static const uint8_t table17_48_emit_[2];
443   static const uint8_t table17_49_emit_[2];
444   static const uint8_t table17_50_emit_[2];
445   static const uint8_t table17_51_emit_[2];
446   static const uint8_t table17_52_emit_[2];
447   static const uint8_t table17_53_emit_[2];
448   static const uint8_t table17_54_emit_[2];
449   static const uint8_t table17_55_emit_[2];
450   static const uint8_t table17_56_emit_[2];
451   static const uint8_t table17_57_emit_[2];
452   static const uint8_t table17_58_emit_[3];
453   static const uint16_t table17_58_ops_[256];
454   static const uint8_t table17_59_emit_[4];
455   static const uint16_t table17_59_ops_[256];
456   static const uint8_t table17_60_emit_[4];
457   static const uint8_t table17_61_emit_[6];
458   static const uint16_t table17_61_ops_[256];
459   static const uint16_t table17_62_ops_[256];
460   static const uint8_t table17_63_emit_[49];
461   static const uint16_t table17_63_ops_[256];
462   static const uint8_t* const table17_emit_[64];
463   static const uint16_t* const table17_ops_[64];
464 };
465 template <typename F>
466 class HuffDecoder : public HuffDecoderCommon {
467  public:
HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)468   HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end)
469       : sink_(sink), begin_(begin), end_(end) {}
Run()470   bool Run() {
471     while (!done_) {
472       if (!RefillTo7()) {
473         Done0();
474         break;
475       }
476       const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f;
477       const auto op = GetOp1(index);
478       const int consumed = op & 7;
479       buffer_len_ -= consumed;
480       const auto emit_ofs = op >> 6;
481       switch ((op >> 3) & 7) {
482         case 0: {
483           sink_(GetEmit1(index, emit_ofs + 0));
484           break;
485         }
486         case 1: {
487           DecodeStep0();
488           break;
489         }
490         case 2: {
491           DecodeStep1();
492           break;
493         }
494         case 3: {
495           DecodeStep2();
496           break;
497         }
498         case 4: {
499           DecodeStep3();
500           break;
501         }
502       }
503     }
504     return ok_;
505   }
506 
507  private:
RefillTo7()508   bool RefillTo7() {
509     switch (buffer_len_) {
510       case 0: {
511         return Read1to8Bytes();
512       }
513       case 1:
514       case 2:
515       case 3:
516       case 4:
517       case 5:
518       case 6: {
519         return Read1to7Bytes();
520       }
521     }
522     return true;
523   }
Read1to8Bytes()524   bool Read1to8Bytes() {
525     switch (end_ - begin_) {
526       case 0: {
527         return false;
528       }
529       case 1: {
530         Fill1();
531         return true;
532       }
533       case 2: {
534         Fill2();
535         return true;
536       }
537       case 3: {
538         Fill3();
539         return true;
540       }
541       case 4: {
542         Fill4();
543         return true;
544       }
545       case 5: {
546         Fill5();
547         return true;
548       }
549       case 6: {
550         Fill6();
551         return true;
552       }
553       case 7: {
554         Fill7();
555         return true;
556       }
557       default: {
558         Fill8();
559         return true;
560       }
561     }
562   }
Fill1()563   void Fill1() {
564     buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0);
565     begin_ += 1;
566     buffer_len_ += 8;
567   }
Fill2()568   void Fill2() {
569     buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) |
570               (static_cast<uint64_t>(begin_[1]) << 0);
571     begin_ += 2;
572     buffer_len_ += 16;
573   }
Fill3()574   void Fill3() {
575     buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) |
576               (static_cast<uint64_t>(begin_[1]) << 8) |
577               (static_cast<uint64_t>(begin_[2]) << 0);
578     begin_ += 3;
579     buffer_len_ += 24;
580   }
Fill4()581   void Fill4() {
582     buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) |
583               (static_cast<uint64_t>(begin_[1]) << 16) |
584               (static_cast<uint64_t>(begin_[2]) << 8) |
585               (static_cast<uint64_t>(begin_[3]) << 0);
586     begin_ += 4;
587     buffer_len_ += 32;
588   }
Fill5()589   void Fill5() {
590     buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) |
591               (static_cast<uint64_t>(begin_[1]) << 24) |
592               (static_cast<uint64_t>(begin_[2]) << 16) |
593               (static_cast<uint64_t>(begin_[3]) << 8) |
594               (static_cast<uint64_t>(begin_[4]) << 0);
595     begin_ += 5;
596     buffer_len_ += 40;
597   }
Fill6()598   void Fill6() {
599     buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) |
600               (static_cast<uint64_t>(begin_[1]) << 32) |
601               (static_cast<uint64_t>(begin_[2]) << 24) |
602               (static_cast<uint64_t>(begin_[3]) << 16) |
603               (static_cast<uint64_t>(begin_[4]) << 8) |
604               (static_cast<uint64_t>(begin_[5]) << 0);
605     begin_ += 6;
606     buffer_len_ += 48;
607   }
Fill7()608   void Fill7() {
609     buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) |
610               (static_cast<uint64_t>(begin_[1]) << 40) |
611               (static_cast<uint64_t>(begin_[2]) << 32) |
612               (static_cast<uint64_t>(begin_[3]) << 24) |
613               (static_cast<uint64_t>(begin_[4]) << 16) |
614               (static_cast<uint64_t>(begin_[5]) << 8) |
615               (static_cast<uint64_t>(begin_[6]) << 0);
616     begin_ += 7;
617     buffer_len_ += 56;
618   }
Fill8()619   void Fill8() {
620     buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) |
621               (static_cast<uint64_t>(begin_[1]) << 48) |
622               (static_cast<uint64_t>(begin_[2]) << 40) |
623               (static_cast<uint64_t>(begin_[3]) << 32) |
624               (static_cast<uint64_t>(begin_[4]) << 24) |
625               (static_cast<uint64_t>(begin_[5]) << 16) |
626               (static_cast<uint64_t>(begin_[6]) << 8) |
627               (static_cast<uint64_t>(begin_[7]) << 0);
628     begin_ += 8;
629     buffer_len_ += 64;
630   }
Read1to7Bytes()631   bool Read1to7Bytes() {
632     switch (end_ - begin_) {
633       case 0: {
634         return false;
635       }
636       case 1: {
637         Fill1();
638         return true;
639       }
640       case 2: {
641         Fill2();
642         return true;
643       }
644       case 3: {
645         Fill3();
646         return true;
647       }
648       case 4: {
649         Fill4();
650         return true;
651       }
652       case 5: {
653         Fill5();
654         return true;
655       }
656       case 6: {
657         Fill6();
658         return true;
659       }
660       default: {
661         Fill7();
662         return true;
663       }
664     }
665   }
Done0()666   void Done0() {
667     done_ = true;
668     switch (buffer_len_) {
669       case 1:
670       case 2:
671       case 3:
672       case 4: {
673         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
674         return;
675       }
676       case 5: {
677         const auto index = buffer_ & 31;
678         const auto op = GetOp2(index);
679         switch (op & 3) {
680           case 0: {
681             sink_(GetEmit2(index, (op >> 2) + 0));
682             break;
683           }
684           case 1: {
685             ok_ = false;
686             break;
687           }
688         }
689         return;
690       }
691       case 6: {
692         const auto index = buffer_ & 63;
693         const auto op = GetOp3(index);
694         switch (op & 3) {
695           case 0: {
696             ok_ = false;
697             break;
698           }
699           case 1: {
700             sink_(GetEmit3(index, (op >> 2) + 0));
701             break;
702           }
703         }
704         return;
705       }
706       case 0: {
707         return;
708       }
709     }
710   }
DecodeStep0()711   void DecodeStep0() {
712     if (!RefillTo1()) {
713       Done1();
714       return;
715     }
716     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
717     const auto op = GetOp4(index);
718     const int consumed = op & 1;
719     buffer_len_ -= consumed;
720     const auto emit_ofs = op >> 1;
721     sink_(GetEmit4(index, emit_ofs + 0));
722   }
RefillTo1()723   bool RefillTo1() {
724     switch (buffer_len_) {
725       case 0: {
726         return Read1to8Bytes();
727       }
728     }
729     return true;
730   }
Done1()731   void Done1() {
732     done_ = true;
733     ok_ = false;
734   }
DecodeStep1()735   void DecodeStep1() {
736     if (!RefillTo1()) {
737       Done2();
738       return;
739     }
740     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
741     const auto op = GetOp5(index);
742     const int consumed = op & 1;
743     buffer_len_ -= consumed;
744     const auto emit_ofs = op >> 1;
745     sink_(GetEmit5(index, emit_ofs + 0));
746   }
Done2()747   void Done2() {
748     done_ = true;
749     ok_ = false;
750   }
DecodeStep2()751   void DecodeStep2() {
752     if (!RefillTo1()) {
753       Done3();
754       return;
755     }
756     const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1;
757     const auto op = GetOp6(index);
758     const int consumed = op & 1;
759     buffer_len_ -= consumed;
760     const auto emit_ofs = op >> 1;
761     sink_(GetEmit6(index, emit_ofs + 0));
762   }
Done3()763   void Done3() {
764     done_ = true;
765     ok_ = false;
766   }
DecodeStep3()767   void DecodeStep3() {
768     if (!RefillTo9()) {
769       Done4();
770       return;
771     }
772     const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff;
773     const auto op = GetOp7(index);
774     const int consumed = op & 15;
775     buffer_len_ -= consumed;
776     const auto emit_ofs = op >> 6;
777     switch ((op >> 4) & 3) {
778       case 0: {
779         sink_(GetEmit7(index, emit_ofs + 0));
780         break;
781       }
782       case 1: {
783         DecodeStep4();
784         break;
785       }
786       case 2: {
787         DecodeStep5();
788         break;
789       }
790     }
791   }
RefillTo9()792   bool RefillTo9() {
793     switch (buffer_len_) {
794       case 0: {
795         return Read2to8Bytes();
796       }
797       case 1:
798       case 2:
799       case 3:
800       case 4:
801       case 5:
802       case 6:
803       case 7:
804       case 8: {
805         return Read1to7Bytes();
806       }
807     }
808     return true;
809   }
Read2to8Bytes()810   bool Read2to8Bytes() {
811     switch (end_ - begin_) {
812       case 0:
813       case 1: {
814         return false;
815       }
816       case 2: {
817         Fill2();
818         return true;
819       }
820       case 3: {
821         Fill3();
822         return true;
823       }
824       case 4: {
825         Fill4();
826         return true;
827       }
828       case 5: {
829         Fill5();
830         return true;
831       }
832       case 6: {
833         Fill6();
834         return true;
835       }
836       case 7: {
837         Fill7();
838         return true;
839       }
840       default: {
841         Fill8();
842         return true;
843       }
844     }
845   }
Done4()846   void Done4() {
847     done_ = true;
848     switch (end_ - begin_) {
849       case 1: {
850         Fill1();
851         break;
852       }
853     }
854     switch (buffer_len_) {
855       case 1:
856       case 2: {
857         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
858         return;
859       }
860       case 3: {
861         const auto index = buffer_ & 7;
862         const auto op = GetOp8(index);
863         switch (op & 3) {
864           case 0: {
865             sink_(GetEmit8(index, (op >> 2) + 0));
866             break;
867           }
868           case 1: {
869             ok_ = false;
870             break;
871           }
872         }
873         return;
874       }
875       case 4: {
876         const auto index = buffer_ & 15;
877         const auto op = GetOp9(index);
878         switch (op & 3) {
879           case 0: {
880             ok_ = false;
881             break;
882           }
883           case 1: {
884             sink_(GetEmit9(index, (op >> 2) + 0));
885             break;
886           }
887         }
888         return;
889       }
890       case 5: {
891         const auto index = buffer_ & 31;
892         const auto op = GetOp10(index);
893         switch (op & 3) {
894           case 0: {
895             ok_ = false;
896             break;
897           }
898           case 1: {
899             sink_(GetEmit10(index, (op >> 2) + 0));
900             break;
901           }
902         }
903         return;
904       }
905       case 6: {
906         const auto index = buffer_ & 63;
907         const auto op = GetOp11(index);
908         switch (op & 3) {
909           case 0: {
910             ok_ = false;
911             break;
912           }
913           case 1: {
914             sink_(GetEmit11(index, (op >> 2) + 0));
915             break;
916           }
917         }
918         return;
919       }
920       case 7: {
921         const auto index = buffer_ & 127;
922         const auto op = GetOp12(index);
923         switch (op & 3) {
924           case 0: {
925             ok_ = false;
926             break;
927           }
928           case 1: {
929             sink_(GetEmit12(index, (op >> 2) + 0));
930             break;
931           }
932         }
933         return;
934       }
935       case 8: {
936         const auto index = buffer_ & 255;
937         const auto op = GetOp13(index);
938         switch (op & 3) {
939           case 0: {
940             sink_(GetEmit13(index, (op >> 2) + 0));
941             sink_(GetEmit13(index, (op >> 2) + 1));
942             break;
943           }
944           case 1: {
945             ok_ = false;
946             break;
947           }
948           case 2: {
949             sink_(GetEmit13(index, (op >> 2) + 0));
950             break;
951           }
952         }
953         return;
954       }
955       case 0: {
956         return;
957       }
958     }
959   }
DecodeStep4()960   void DecodeStep4() {
961     if (!RefillTo5()) {
962       Done5();
963       return;
964     }
965     const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f;
966     const auto op = GetOp14(index);
967     const int consumed = op & 7;
968     buffer_len_ -= consumed;
969     const auto emit_ofs = op >> 3;
970     sink_(GetEmit14(index, emit_ofs + 0));
971   }
RefillTo5()972   bool RefillTo5() {
973     switch (buffer_len_) {
974       case 0: {
975         return Read1to8Bytes();
976       }
977       case 1:
978       case 2:
979       case 3:
980       case 4: {
981         return Read1to7Bytes();
982       }
983     }
984     return true;
985   }
Done5()986   void Done5() {
987     done_ = true;
988     switch (buffer_len_) {
989       case 1:
990       case 2:
991       case 0: {
992         ok_ = false;
993         return;
994       }
995       case 3: {
996         const auto index = buffer_ & 7;
997         const auto op = GetOp15(index);
998         switch (op & 1) {
999           case 0: {
1000             sink_(GetEmit15(index, (op >> 1) + 0));
1001             break;
1002           }
1003           case 1: {
1004             ok_ = false;
1005             break;
1006           }
1007         }
1008         return;
1009       }
1010       case 4: {
1011         const auto index = buffer_ & 15;
1012         const auto op = GetOp16(index);
1013         switch (op & 1) {
1014           case 0: {
1015             ok_ = false;
1016             break;
1017           }
1018           case 1: {
1019             sink_(GetEmit16(index, (op >> 1) + 0));
1020             break;
1021           }
1022         }
1023         return;
1024       }
1025     }
1026   }
DecodeStep5()1027   void DecodeStep5() {
1028     if (!RefillTo14()) {
1029       Done6();
1030       return;
1031     }
1032     const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff;
1033     const auto op = GetOp17(index);
1034     const int consumed = op & 15;
1035     buffer_len_ -= consumed;
1036     const auto emit_ofs = op >> 5;
1037     switch ((op >> 4) & 1) {
1038       case 0: {
1039         sink_(GetEmit17(index, emit_ofs + 0));
1040         break;
1041       }
1042       case 1: {
1043         begin_ = end_;
1044         buffer_len_ = 0;
1045         break;
1046       }
1047     }
1048   }
RefillTo14()1049   bool RefillTo14() {
1050     switch (buffer_len_) {
1051       case 0: {
1052         return Read2to8Bytes();
1053       }
1054       case 1:
1055       case 2:
1056       case 3:
1057       case 4:
1058       case 5: {
1059         return Read2to7Bytes();
1060       }
1061       case 6:
1062       case 7:
1063       case 8: {
1064         return Read1to7Bytes();
1065       }
1066       case 9:
1067       case 10:
1068       case 11:
1069       case 12:
1070       case 13: {
1071         return Read1to6Bytes();
1072       }
1073     }
1074     return true;
1075   }
Read2to7Bytes()1076   bool Read2to7Bytes() {
1077     switch (end_ - begin_) {
1078       case 0:
1079       case 1: {
1080         return false;
1081       }
1082       case 2: {
1083         Fill2();
1084         return true;
1085       }
1086       case 3: {
1087         Fill3();
1088         return true;
1089       }
1090       case 4: {
1091         Fill4();
1092         return true;
1093       }
1094       case 5: {
1095         Fill5();
1096         return true;
1097       }
1098       case 6: {
1099         Fill6();
1100         return true;
1101       }
1102       default: {
1103         Fill7();
1104         return true;
1105       }
1106     }
1107   }
Read1to6Bytes()1108   bool Read1to6Bytes() {
1109     switch (end_ - begin_) {
1110       case 0: {
1111         return false;
1112       }
1113       case 1: {
1114         Fill1();
1115         return true;
1116       }
1117       case 2: {
1118         Fill2();
1119         return true;
1120       }
1121       case 3: {
1122         Fill3();
1123         return true;
1124       }
1125       case 4: {
1126         Fill4();
1127         return true;
1128       }
1129       case 5: {
1130         Fill5();
1131         return true;
1132       }
1133       default: {
1134         Fill6();
1135         return true;
1136       }
1137     }
1138   }
Done6()1139   void Done6() {
1140     done_ = true;
1141     switch (end_ - begin_) {
1142       case 1: {
1143         Fill1();
1144         break;
1145       }
1146     }
1147     switch (buffer_len_) {
1148       case 1:
1149       case 2:
1150       case 3:
1151       case 4: {
1152         ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1;
1153         return;
1154       }
1155       case 5: {
1156         const auto index = buffer_ & 31;
1157         const auto op = GetOp18(index);
1158         switch (op & 3) {
1159           case 0: {
1160             sink_(GetEmit18(index, (op >> 2) + 0));
1161             break;
1162           }
1163           case 1: {
1164             ok_ = false;
1165             break;
1166           }
1167         }
1168         return;
1169       }
1170       case 6: {
1171         const auto index = buffer_ & 63;
1172         const auto op = GetOp19(index);
1173         switch (op & 3) {
1174           case 0: {
1175             ok_ = false;
1176             break;
1177           }
1178           case 1: {
1179             sink_(GetEmit19(index, (op >> 2) + 0));
1180             break;
1181           }
1182         }
1183         return;
1184       }
1185       case 7: {
1186         const auto index = buffer_ & 127;
1187         const auto op = GetOp20(index);
1188         switch (op & 3) {
1189           case 0: {
1190             ok_ = false;
1191             break;
1192           }
1193           case 1: {
1194             sink_(GetEmit20(index, (op >> 2) + 0));
1195             break;
1196           }
1197         }
1198         return;
1199       }
1200       case 8: {
1201         const auto index = buffer_ & 255;
1202         const auto op = GetOp21(index);
1203         switch (op & 3) {
1204           case 0: {
1205             ok_ = false;
1206             break;
1207           }
1208           case 1: {
1209             sink_(GetEmit21(index, (op >> 2) + 0));
1210             break;
1211           }
1212         }
1213         return;
1214       }
1215       case 9: {
1216         const auto index = buffer_ & 511;
1217         const auto op = GetOp22(index);
1218         switch (op & 3) {
1219           case 0: {
1220             ok_ = false;
1221             break;
1222           }
1223           case 1: {
1224             sink_(GetEmit22(index, (op >> 2) + 0));
1225             break;
1226           }
1227         }
1228         return;
1229       }
1230       case 10: {
1231         const auto index = buffer_ & 1023;
1232         const auto op = GetOp23(index);
1233         switch (op & 3) {
1234           case 0: {
1235             sink_(GetEmit23(index, (op >> 2) + 0));
1236             sink_(GetEmit23(index, (op >> 2) + 1));
1237             break;
1238           }
1239           case 1: {
1240             ok_ = false;
1241             break;
1242           }
1243           case 2: {
1244             sink_(GetEmit23(index, (op >> 2) + 0));
1245             break;
1246           }
1247         }
1248         return;
1249       }
1250       case 11: {
1251         const auto index = buffer_ & 2047;
1252         const auto op = GetOp24(index);
1253         switch (op & 3) {
1254           case 0: {
1255             ok_ = false;
1256             break;
1257           }
1258           case 1: {
1259             sink_(GetEmit24(index, (op >> 2) + 0));
1260             sink_(GetEmit24(index, (op >> 2) + 1));
1261             break;
1262           }
1263           case 2: {
1264             sink_(GetEmit24(index, (op >> 2) + 0));
1265             break;
1266           }
1267         }
1268         return;
1269       }
1270       case 12: {
1271         const auto index = buffer_ & 4095;
1272         const auto op = GetOp25(index);
1273         switch (op & 3) {
1274           case 0: {
1275             ok_ = false;
1276             break;
1277           }
1278           case 1: {
1279             sink_(GetEmit25(index, (op >> 2) + 0));
1280             sink_(GetEmit25(index, (op >> 2) + 1));
1281             break;
1282           }
1283           case 2: {
1284             sink_(GetEmit25(index, (op >> 2) + 0));
1285             break;
1286           }
1287         }
1288         return;
1289       }
1290       case 13: {
1291         const auto index = buffer_ & 8191;
1292         const auto op = GetOp26(index);
1293         switch (op & 3) {
1294           case 0: {
1295             ok_ = false;
1296             break;
1297           }
1298           case 1: {
1299             sink_(GetEmit26(index, (op >> 2) + 0));
1300             sink_(GetEmit26(index, (op >> 2) + 1));
1301             break;
1302           }
1303           case 2: {
1304             sink_(GetEmit26(index, (op >> 2) + 0));
1305             break;
1306           }
1307         }
1308         return;
1309       }
1310       case 0: {
1311         return;
1312       }
1313     }
1314   }
1315   F sink_;
1316   const uint8_t* begin_;
1317   const uint8_t* const end_;
1318   uint64_t buffer_ = 0;
1319   int buffer_len_ = 0;
1320   bool ok_ = true;
1321   bool done_ = false;
1322 };
1323 }  // namespace geometry_7_9_14
1324 }  // namespace grpc_core
1325 #endif  // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_9_14_H
1326