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