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_15_7_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_15_7_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_8_15_7 { 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 } GetOp13(size_t i)84 static inline uint64_t GetOp13(size_t i) { 85 return table13_ops_[i >> 5][i & 0x1f]; 86 } GetEmit13(size_t i,size_t emit)87 static inline uint64_t GetEmit13(size_t i, size_t emit) { 88 return table13_emit_[i >> 5][emit]; 89 } GetOp14(size_t i)90 static inline uint64_t GetOp14(size_t i) { 91 return table14_ops_[i >> 5][i & 0x1f]; 92 } GetEmit14(size_t i,size_t emit)93 static inline uint64_t GetEmit14(size_t i, size_t emit) { 94 return table14_emit_[i >> 5][emit]; 95 } GetOp15(size_t i)96 static inline uint64_t GetOp15(size_t i) { 97 return table15_ops_[i >> 6][i & 0x3f]; 98 } GetEmit15(size_t i,size_t emit)99 static inline uint64_t GetEmit15(size_t i, size_t emit) { 100 return table15_emit_[i >> 6][emit]; 101 } GetOp16(size_t i)102 static inline uint64_t GetOp16(size_t i) { 103 return table16_ops_[i >> 6][i & 0x3f]; 104 } GetEmit16(size_t i,size_t emit)105 static inline uint64_t GetEmit16(size_t i, size_t emit) { 106 return table16_emit_[i >> 6][emit]; 107 } GetOp17(size_t i)108 static inline uint64_t GetOp17(size_t i) { 109 return table17_ops_[i >> 6][i & 0x3f]; 110 } GetEmit17(size_t i,size_t emit)111 static inline uint64_t GetEmit17(size_t i, size_t emit) { 112 return table17_emit_[i >> 6][emit]; 113 } GetOp18(size_t i)114 static inline uint64_t GetOp18(size_t i) { 115 return table18_ops_[i >> 6][i & 0x3f]; 116 } GetEmit18(size_t i,size_t emit)117 static inline uint64_t GetEmit18(size_t i, size_t emit) { 118 return table18_emit_[i >> 6][emit]; 119 } GetOp19(size_t i)120 static inline uint64_t GetOp19(size_t i) { 121 return table19_ops_[i >> 7][i & 0x7f]; 122 } GetEmit19(size_t i,size_t emit)123 static inline uint64_t GetEmit19(size_t i, size_t emit) { 124 return table19_emit_[i >> 7][emit]; 125 } GetOp6(size_t i)126 static inline uint64_t GetOp6(size_t i) { 127 return table6_ops_[i >> 8][i & 0xff]; 128 } GetEmit6(size_t i,size_t emit)129 static inline uint64_t GetEmit6(size_t i, size_t emit) { 130 return table6_emit_[i >> 8][emit]; 131 } GetOp20(size_t i)132 static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; } GetEmit20(size_t,size_t emit)133 static inline uint64_t GetEmit20(size_t, size_t emit) { 134 return emit ? 142 : 9; 135 } GetOp21(size_t i)136 static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; } GetEmit21(size_t,size_t emit)137 static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 144; } GetOp22(size_t i)138 static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; } GetEmit22(size_t,size_t emit)139 static inline uint64_t GetEmit22(size_t, size_t emit) { 140 return emit ? 159 : 148; 141 } GetOp23(size_t i)142 static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; } GetEmit23(size_t,size_t emit)143 static inline uint64_t GetEmit23(size_t, size_t emit) { 144 return emit ? 206 : 171; 145 } GetOp24(size_t i)146 static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; } GetEmit24(size_t,size_t emit)147 static inline uint64_t GetEmit24(size_t, size_t emit) { 148 return emit ? 225 : 215; 149 } GetOp25(size_t i)150 static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; } GetEmit25(size_t,size_t emit)151 static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 236; } GetOp26(size_t i)152 static inline uint64_t GetOp26(size_t i) { 153 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 154 } GetEmit26(size_t,size_t emit)155 static inline uint64_t GetEmit26(size_t, size_t emit) { 156 return (emit < 2 ? (emit ? 207 : 199) : ((emit - 2) + 234)); 157 } GetOp27(size_t i)158 static inline uint64_t GetOp27(size_t i) { return table27_0_inner_[i]; } GetEmit27(size_t,size_t emit)159 static inline uint64_t GetEmit27(size_t, size_t emit) { 160 return table27_0_emit_[emit]; 161 } GetOp28(size_t i)162 static inline uint64_t GetOp28(size_t i) { return table28_0_inner_[i]; } GetEmit28(size_t,size_t emit)163 static inline uint64_t GetEmit28(size_t, size_t emit) { 164 return table28_0_emit_[emit]; 165 } GetOp30(size_t i)166 static inline uint64_t GetOp30(size_t i) { 167 return (i < 1 ? (((void)i, 0)) : ((i - 1) / 14 + 1)); 168 } GetEmit30(size_t,size_t emit)169 static inline uint64_t GetEmit30(size_t, size_t emit) { 170 return ((void)emit, 254); 171 } GetOp31(size_t i)172 static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; } GetEmit31(size_t,size_t emit)173 static inline uint64_t GetEmit31(size_t, size_t emit) { 174 return table31_0_emit_[emit]; 175 } GetOp32(size_t i)176 static inline uint64_t GetOp32(size_t i) { return table32_0_ops_[i]; } GetEmit32(size_t,size_t emit)177 static inline uint64_t GetEmit32(size_t, size_t emit) { 178 return table31_0_emit_[emit]; 179 } GetOp29(size_t i)180 static inline uint64_t GetOp29(size_t i) { 181 return table29_ops_[i >> 5][i & 0x1f]; 182 } GetEmit29(size_t i,size_t emit)183 static inline uint64_t GetEmit29(size_t i, size_t emit) { 184 return table29_emit_[i >> 5][emit]; 185 } GetOp34(size_t i)186 static inline uint64_t GetOp34(size_t i) { return table34_0_inner_[i]; } GetEmit34(size_t,size_t emit)187 static inline uint64_t GetEmit34(size_t, size_t emit) { 188 return table34_0_emit_[emit]; 189 } GetOp33(size_t i)190 static inline uint64_t GetOp33(size_t i) { 191 return table33_0_inner_[(i < 13 ? (i / 2 + 0) : ((i - 13) + 6))]; 192 } GetEmit33(size_t,size_t emit)193 static inline uint64_t GetEmit33(size_t, size_t emit) { 194 return table33_0_emit_[emit]; 195 } 196 197 private: 198 static const uint8_t table2_0_emit_[10]; 199 static const uint8_t table2_0_ops_[32]; 200 static const uint8_t table3_0_emit_[36]; 201 static const uint8_t table3_0_ops_[64]; 202 static const uint8_t table4_0_emit_[22]; 203 static const uint8_t table4_0_ops_[64]; 204 static const uint8_t table4_1_emit_[46]; 205 static const uint8_t table4_1_ops_[64]; 206 static const uint8_t* const table4_emit_[2]; 207 static const uint8_t* const table4_ops_[2]; 208 static const uint8_t table1_0_emit_[74]; 209 static const uint16_t table1_0_inner_[76]; 210 static const uint8_t table1_0_outer_[256]; 211 static const uint8_t table8_0_inner_[6]; 212 static const uint8_t table8_0_outer_[8]; 213 static const uint8_t table9_0_emit_[6]; 214 static const uint8_t table9_0_inner_[8]; 215 static const uint8_t table9_0_outer_[16]; 216 static const uint8_t table10_0_emit_[12]; 217 static const uint8_t table10_0_ops_[32]; 218 static const uint8_t table11_0_emit_[14]; 219 static const uint8_t table11_0_ops_[64]; 220 static const uint8_t table12_0_emit_[36]; 221 static const uint8_t table12_0_ops_[128]; 222 static const uint8_t table13_0_emit_[44]; 223 static const uint8_t table13_0_ops_[32]; 224 static const uint8_t table13_1_emit_[28]; 225 static const uint8_t table13_1_ops_[32]; 226 static const uint8_t table13_2_emit_[20]; 227 static const uint8_t table13_2_ops_[32]; 228 static const uint8_t table13_3_emit_[20]; 229 static const uint8_t table13_4_emit_[20]; 230 static const uint8_t table13_5_emit_[2]; 231 static const uint8_t table13_5_ops_[32]; 232 static const uint8_t table13_6_emit_[4]; 233 static const uint8_t table13_6_ops_[32]; 234 static const uint8_t table13_7_emit_[7]; 235 static const uint8_t table13_7_ops_[32]; 236 static const uint8_t* const table13_emit_[8]; 237 static const uint8_t* const table13_ops_[8]; 238 static const uint8_t table14_0_emit_[16]; 239 static const uint8_t table14_0_ops_[32]; 240 static const uint8_t table14_1_emit_[28]; 241 static const uint8_t table14_1_ops_[32]; 242 static const uint8_t table14_2_emit_[36]; 243 static const uint8_t table14_2_ops_[32]; 244 static const uint8_t table14_3_emit_[56]; 245 static const uint8_t table14_3_ops_[32]; 246 static const uint8_t table14_4_emit_[44]; 247 static const uint8_t table14_5_emit_[28]; 248 static const uint8_t table14_6_emit_[44]; 249 static const uint8_t table14_7_emit_[28]; 250 static const uint8_t table14_8_emit_[44]; 251 static const uint8_t table14_9_emit_[28]; 252 static const uint8_t table14_10_emit_[20]; 253 static const uint8_t table14_11_emit_[20]; 254 static const uint8_t table14_12_emit_[2]; 255 static const uint8_t table14_13_emit_[2]; 256 static const uint8_t table14_14_emit_[2]; 257 static const uint8_t table14_15_emit_[5]; 258 static const uint8_t table14_15_ops_[32]; 259 static const uint8_t* const table14_emit_[16]; 260 static const uint8_t* const table14_ops_[16]; 261 static const uint16_t table15_0_ops_[64]; 262 static const uint16_t table15_1_ops_[64]; 263 static const uint16_t table15_2_ops_[64]; 264 static const uint8_t table15_3_emit_[68]; 265 static const uint16_t table15_3_ops_[64]; 266 static const uint16_t table15_4_ops_[64]; 267 static const uint8_t table15_5_emit_[92]; 268 static const uint16_t table15_5_ops_[64]; 269 static const uint8_t table15_7_emit_[92]; 270 static const uint8_t table15_9_emit_[92]; 271 static const uint8_t table15_10_emit_[72]; 272 static const uint16_t table15_10_ops_[64]; 273 static const uint8_t table15_11_emit_[72]; 274 static const uint8_t table15_12_emit_[40]; 275 static const uint16_t table15_12_ops_[64]; 276 static const uint8_t table15_13_emit_[40]; 277 static const uint8_t table15_14_emit_[40]; 278 static const uint16_t table15_15_ops_[64]; 279 static const uint8_t* const table15_emit_[16]; 280 static const uint16_t* const table15_ops_[16]; 281 static const uint8_t table16_0_emit_[8]; 282 static const uint16_t table16_0_ops_[64]; 283 static const uint8_t table16_1_emit_[8]; 284 static const uint8_t table16_2_emit_[12]; 285 static const uint16_t table16_2_ops_[64]; 286 static const uint8_t table16_3_emit_[16]; 287 static const uint8_t table16_4_emit_[16]; 288 static const uint8_t table16_5_emit_[20]; 289 static const uint16_t table16_5_ops_[64]; 290 static const uint8_t table16_6_emit_[32]; 291 static const uint16_t table16_6_ops_[64]; 292 static const uint8_t table16_7_emit_[36]; 293 static const uint16_t table16_7_ops_[64]; 294 static const uint8_t table16_8_emit_[16]; 295 static const uint8_t table16_9_emit_[28]; 296 static const uint8_t table16_10_emit_[36]; 297 static const uint8_t table16_11_emit_[68]; 298 static const uint8_t table16_12_emit_[16]; 299 static const uint8_t table16_13_emit_[28]; 300 static const uint8_t table16_14_emit_[36]; 301 static const uint8_t table16_15_emit_[68]; 302 static const uint8_t table16_16_emit_[16]; 303 static const uint8_t table16_17_emit_[28]; 304 static const uint8_t table16_18_emit_[36]; 305 static const uint8_t table16_19_emit_[68]; 306 static const uint8_t table16_20_emit_[44]; 307 static const uint8_t table16_21_emit_[92]; 308 static const uint8_t table16_22_emit_[44]; 309 static const uint8_t table16_23_emit_[92]; 310 static const uint8_t table16_24_emit_[72]; 311 static const uint8_t table16_25_emit_[72]; 312 static const uint8_t table16_26_emit_[72]; 313 static const uint8_t table16_27_emit_[72]; 314 static const uint8_t table16_28_emit_[72]; 315 static const uint8_t table16_29_emit_[72]; 316 static const uint8_t table16_30_emit_[40]; 317 static const uint8_t table16_31_emit_[6]; 318 static const uint16_t table16_31_ops_[64]; 319 static const uint8_t* const table16_emit_[32]; 320 static const uint16_t* const table16_ops_[32]; 321 static const uint8_t table17_0_emit_[60]; 322 static const uint16_t table17_0_ops_[64]; 323 static const uint8_t table17_1_emit_[60]; 324 static const uint8_t table17_2_emit_[60]; 325 static const uint8_t table17_3_emit_[60]; 326 static const uint8_t table17_4_emit_[60]; 327 static const uint8_t table17_5_emit_[8]; 328 static const uint16_t table17_5_ops_[64]; 329 static const uint8_t table17_6_emit_[8]; 330 static const uint8_t table17_7_emit_[8]; 331 static const uint8_t table17_8_emit_[8]; 332 static const uint8_t table17_9_emit_[8]; 333 static const uint8_t table17_10_emit_[8]; 334 static const uint8_t table17_11_emit_[12]; 335 static const uint16_t table17_11_ops_[64]; 336 static const uint8_t table17_12_emit_[16]; 337 static const uint16_t table17_12_ops_[64]; 338 static const uint8_t table17_13_emit_[16]; 339 static const uint8_t table17_14_emit_[16]; 340 static const uint8_t table17_15_emit_[30]; 341 static const uint16_t table17_15_ops_[64]; 342 static const uint8_t table17_16_emit_[8]; 343 static const uint8_t table17_17_emit_[8]; 344 static const uint8_t table17_18_emit_[12]; 345 static const uint8_t table17_19_emit_[16]; 346 static const uint8_t table17_20_emit_[16]; 347 static const uint8_t table17_21_emit_[20]; 348 static const uint16_t table17_21_ops_[64]; 349 static const uint8_t table17_22_emit_[32]; 350 static const uint16_t table17_22_ops_[64]; 351 static const uint8_t table17_23_emit_[36]; 352 static const uint16_t table17_23_ops_[64]; 353 static const uint8_t table17_24_emit_[8]; 354 static const uint8_t table17_25_emit_[8]; 355 static const uint8_t table17_26_emit_[12]; 356 static const uint8_t table17_27_emit_[16]; 357 static const uint8_t table17_28_emit_[16]; 358 static const uint8_t table17_29_emit_[20]; 359 static const uint8_t table17_30_emit_[32]; 360 static const uint8_t table17_31_emit_[36]; 361 static const uint8_t table17_32_emit_[8]; 362 static const uint8_t table17_33_emit_[8]; 363 static const uint8_t table17_34_emit_[12]; 364 static const uint8_t table17_35_emit_[16]; 365 static const uint8_t table17_36_emit_[16]; 366 static const uint8_t table17_37_emit_[20]; 367 static const uint8_t table17_38_emit_[32]; 368 static const uint8_t table17_39_emit_[36]; 369 static const uint8_t table17_40_emit_[16]; 370 static const uint8_t table17_41_emit_[28]; 371 static const uint16_t table17_41_ops_[64]; 372 static const uint8_t table17_42_emit_[36]; 373 static const uint16_t table17_42_ops_[64]; 374 static const uint8_t table17_43_emit_[68]; 375 static const uint16_t table17_43_ops_[64]; 376 static const uint8_t table17_44_emit_[16]; 377 static const uint8_t table17_45_emit_[28]; 378 static const uint8_t table17_46_emit_[36]; 379 static const uint8_t table17_47_emit_[68]; 380 static const uint8_t table17_48_emit_[44]; 381 static const uint16_t table17_48_ops_[64]; 382 static const uint8_t table17_49_emit_[92]; 383 static const uint16_t table17_49_ops_[64]; 384 static const uint8_t table17_50_emit_[44]; 385 static const uint8_t table17_51_emit_[92]; 386 static const uint8_t table17_52_emit_[44]; 387 static const uint8_t table17_53_emit_[92]; 388 static const uint8_t table17_54_emit_[44]; 389 static const uint8_t table17_55_emit_[92]; 390 static const uint8_t table17_56_emit_[44]; 391 static const uint8_t table17_57_emit_[92]; 392 static const uint8_t table17_58_emit_[44]; 393 static const uint8_t table17_59_emit_[92]; 394 static const uint8_t table17_60_emit_[72]; 395 static const uint16_t table17_60_ops_[64]; 396 static const uint8_t table17_61_emit_[72]; 397 static const uint8_t table17_62_emit_[40]; 398 static const uint16_t table17_62_ops_[64]; 399 static const uint8_t table17_63_emit_[31]; 400 static const uint16_t table17_63_ops_[64]; 401 static const uint8_t* const table17_emit_[64]; 402 static const uint16_t* const table17_ops_[64]; 403 static const uint8_t table18_0_emit_[108]; 404 static const uint16_t table18_0_ops_[64]; 405 static const uint8_t table18_1_emit_[108]; 406 static const uint8_t table18_2_emit_[108]; 407 static const uint8_t table18_3_emit_[108]; 408 static const uint8_t table18_4_emit_[108]; 409 static const uint8_t table18_5_emit_[108]; 410 static const uint8_t table18_6_emit_[108]; 411 static const uint8_t table18_7_emit_[108]; 412 static const uint8_t table18_8_emit_[108]; 413 static const uint8_t table18_9_emit_[108]; 414 static const uint8_t table18_10_emit_[60]; 415 static const uint16_t table18_10_ops_[64]; 416 static const uint8_t table18_11_emit_[60]; 417 static const uint8_t table18_12_emit_[60]; 418 static const uint8_t table18_13_emit_[60]; 419 static const uint8_t table18_14_emit_[60]; 420 static const uint8_t table18_15_emit_[60]; 421 static const uint8_t table18_16_emit_[60]; 422 static const uint8_t table18_17_emit_[60]; 423 static const uint8_t table18_18_emit_[60]; 424 static const uint8_t table18_19_emit_[60]; 425 static const uint8_t table18_20_emit_[60]; 426 static const uint8_t table18_21_emit_[60]; 427 static const uint8_t table18_22_emit_[60]; 428 static const uint8_t table18_23_emit_[8]; 429 static const uint16_t table18_23_ops_[64]; 430 static const uint8_t table18_24_emit_[8]; 431 static const uint8_t table18_25_emit_[8]; 432 static const uint8_t table18_26_emit_[8]; 433 static const uint8_t table18_27_emit_[8]; 434 static const uint8_t table18_28_emit_[8]; 435 static const uint8_t table18_29_emit_[8]; 436 static const uint8_t table18_30_emit_[8]; 437 static const uint8_t table18_31_emit_[27]; 438 static const uint16_t table18_31_ops_[64]; 439 static const uint8_t table18_32_emit_[60]; 440 static const uint8_t table18_33_emit_[60]; 441 static const uint8_t table18_34_emit_[60]; 442 static const uint8_t table18_35_emit_[60]; 443 static const uint8_t table18_36_emit_[60]; 444 static const uint8_t table18_37_emit_[8]; 445 static const uint8_t table18_38_emit_[8]; 446 static const uint8_t table18_39_emit_[8]; 447 static const uint8_t table18_40_emit_[8]; 448 static const uint8_t table18_41_emit_[8]; 449 static const uint8_t table18_42_emit_[8]; 450 static const uint8_t table18_43_emit_[12]; 451 static const uint16_t table18_43_ops_[64]; 452 static const uint8_t table18_44_emit_[16]; 453 static const uint16_t table18_44_ops_[64]; 454 static const uint8_t table18_45_emit_[16]; 455 static const uint8_t table18_46_emit_[16]; 456 static const uint8_t table18_47_emit_[30]; 457 static const uint16_t table18_47_ops_[64]; 458 static const uint8_t table18_48_emit_[60]; 459 static const uint8_t table18_49_emit_[60]; 460 static const uint8_t table18_50_emit_[60]; 461 static const uint8_t table18_51_emit_[60]; 462 static const uint8_t table18_52_emit_[60]; 463 static const uint8_t table18_53_emit_[8]; 464 static const uint8_t table18_54_emit_[8]; 465 static const uint8_t table18_55_emit_[8]; 466 static const uint8_t table18_56_emit_[8]; 467 static const uint8_t table18_57_emit_[8]; 468 static const uint8_t table18_58_emit_[8]; 469 static const uint8_t table18_59_emit_[12]; 470 static const uint8_t table18_60_emit_[16]; 471 static const uint8_t table18_61_emit_[16]; 472 static const uint8_t table18_62_emit_[16]; 473 static const uint8_t table18_63_emit_[30]; 474 static const uint8_t table18_64_emit_[60]; 475 static const uint8_t table18_65_emit_[60]; 476 static const uint8_t table18_66_emit_[60]; 477 static const uint8_t table18_67_emit_[60]; 478 static const uint8_t table18_68_emit_[60]; 479 static const uint8_t table18_69_emit_[8]; 480 static const uint8_t table18_70_emit_[8]; 481 static const uint8_t table18_71_emit_[8]; 482 static const uint8_t table18_72_emit_[8]; 483 static const uint8_t table18_73_emit_[8]; 484 static const uint8_t table18_74_emit_[8]; 485 static const uint8_t table18_75_emit_[12]; 486 static const uint8_t table18_76_emit_[16]; 487 static const uint8_t table18_77_emit_[16]; 488 static const uint8_t table18_78_emit_[16]; 489 static const uint8_t table18_79_emit_[30]; 490 static const uint8_t table18_80_emit_[8]; 491 static const uint8_t table18_81_emit_[8]; 492 static const uint8_t table18_82_emit_[12]; 493 static const uint8_t table18_83_emit_[16]; 494 static const uint8_t table18_84_emit_[16]; 495 static const uint8_t table18_85_emit_[20]; 496 static const uint16_t table18_85_ops_[64]; 497 static const uint8_t table18_86_emit_[32]; 498 static const uint16_t table18_86_ops_[64]; 499 static const uint8_t table18_87_emit_[36]; 500 static const uint16_t table18_87_ops_[64]; 501 static const uint8_t table18_88_emit_[8]; 502 static const uint8_t table18_89_emit_[8]; 503 static const uint8_t table18_90_emit_[12]; 504 static const uint8_t table18_91_emit_[16]; 505 static const uint8_t table18_92_emit_[16]; 506 static const uint8_t table18_93_emit_[20]; 507 static const uint8_t table18_94_emit_[32]; 508 static const uint8_t table18_95_emit_[36]; 509 static const uint8_t table18_96_emit_[16]; 510 static const uint8_t table18_97_emit_[28]; 511 static const uint16_t table18_97_ops_[64]; 512 static const uint8_t table18_98_emit_[36]; 513 static const uint16_t table18_98_ops_[64]; 514 static const uint8_t table18_99_emit_[68]; 515 static const uint16_t table18_99_ops_[64]; 516 static const uint8_t table18_100_emit_[16]; 517 static const uint8_t table18_101_emit_[28]; 518 static const uint8_t table18_102_emit_[36]; 519 static const uint8_t table18_103_emit_[68]; 520 static const uint8_t table18_104_emit_[16]; 521 static const uint8_t table18_105_emit_[28]; 522 static const uint8_t table18_106_emit_[36]; 523 static const uint8_t table18_107_emit_[68]; 524 static const uint8_t table18_108_emit_[16]; 525 static const uint8_t table18_109_emit_[28]; 526 static const uint8_t table18_110_emit_[36]; 527 static const uint8_t table18_111_emit_[68]; 528 static const uint8_t table18_112_emit_[16]; 529 static const uint8_t table18_113_emit_[28]; 530 static const uint8_t table18_114_emit_[36]; 531 static const uint8_t table18_115_emit_[68]; 532 static const uint8_t table18_116_emit_[16]; 533 static const uint8_t table18_117_emit_[28]; 534 static const uint8_t table18_118_emit_[36]; 535 static const uint8_t table18_119_emit_[68]; 536 static const uint8_t table18_120_emit_[44]; 537 static const uint16_t table18_120_ops_[64]; 538 static const uint8_t table18_121_emit_[92]; 539 static const uint16_t table18_121_ops_[64]; 540 static const uint8_t table18_122_emit_[44]; 541 static const uint8_t table18_123_emit_[92]; 542 static const uint8_t table18_124_emit_[72]; 543 static const uint16_t table18_124_ops_[64]; 544 static const uint8_t table18_125_emit_[72]; 545 static const uint8_t table18_126_emit_[72]; 546 static const uint8_t table18_127_emit_[24]; 547 static const uint16_t table18_127_ops_[64]; 548 static const uint8_t* const table18_emit_[128]; 549 static const uint16_t* const table18_ops_[128]; 550 static const uint8_t table19_0_emit_[204]; 551 static const uint16_t table19_0_ops_[128]; 552 static const uint8_t table19_1_emit_[204]; 553 static const uint8_t table19_2_emit_[204]; 554 static const uint8_t table19_3_emit_[204]; 555 static const uint8_t table19_4_emit_[204]; 556 static const uint8_t table19_5_emit_[204]; 557 static const uint8_t table19_6_emit_[204]; 558 static const uint8_t table19_7_emit_[204]; 559 static const uint8_t table19_8_emit_[204]; 560 static const uint8_t table19_9_emit_[204]; 561 static const uint8_t table19_10_emit_[216]; 562 static const uint16_t table19_10_ops_[128]; 563 static const uint8_t table19_11_emit_[216]; 564 static const uint8_t table19_12_emit_[216]; 565 static const uint8_t table19_13_emit_[216]; 566 static const uint8_t table19_14_emit_[216]; 567 static const uint8_t table19_15_emit_[216]; 568 static const uint8_t table19_16_emit_[216]; 569 static const uint8_t table19_17_emit_[216]; 570 static const uint8_t table19_18_emit_[216]; 571 static const uint8_t table19_19_emit_[216]; 572 static const uint8_t table19_20_emit_[216]; 573 static const uint8_t table19_21_emit_[216]; 574 static const uint8_t table19_22_emit_[216]; 575 static const uint8_t table19_23_emit_[120]; 576 static const uint16_t table19_23_ops_[128]; 577 static const uint8_t table19_24_emit_[120]; 578 static const uint8_t table19_25_emit_[120]; 579 static const uint8_t table19_26_emit_[120]; 580 static const uint8_t table19_27_emit_[120]; 581 static const uint8_t table19_28_emit_[120]; 582 static const uint8_t table19_29_emit_[120]; 583 static const uint8_t table19_30_emit_[120]; 584 static const uint8_t table19_31_emit_[31]; 585 static const uint16_t table19_31_ops_[128]; 586 static const uint8_t table19_32_emit_[216]; 587 static const uint8_t table19_33_emit_[216]; 588 static const uint8_t table19_34_emit_[216]; 589 static const uint8_t table19_35_emit_[216]; 590 static const uint8_t table19_36_emit_[216]; 591 static const uint8_t table19_37_emit_[120]; 592 static const uint8_t table19_38_emit_[120]; 593 static const uint8_t table19_39_emit_[120]; 594 static const uint8_t table19_40_emit_[120]; 595 static const uint8_t table19_41_emit_[120]; 596 static const uint8_t table19_42_emit_[120]; 597 static const uint8_t table19_43_emit_[68]; 598 static const uint16_t table19_43_ops_[128]; 599 static const uint16_t table19_44_ops_[128]; 600 static const uint8_t table19_47_emit_[35]; 601 static const uint16_t table19_47_ops_[128]; 602 static const uint8_t table19_48_emit_[216]; 603 static const uint8_t table19_49_emit_[216]; 604 static const uint8_t table19_50_emit_[216]; 605 static const uint8_t table19_51_emit_[216]; 606 static const uint8_t table19_52_emit_[216]; 607 static const uint8_t table19_53_emit_[120]; 608 static const uint8_t table19_54_emit_[120]; 609 static const uint8_t table19_55_emit_[120]; 610 static const uint8_t table19_56_emit_[120]; 611 static const uint8_t table19_57_emit_[120]; 612 static const uint8_t table19_58_emit_[120]; 613 static const uint8_t table19_59_emit_[68]; 614 static const uint8_t table19_63_emit_[35]; 615 static const uint16_t table19_63_ops_[128]; 616 static const uint8_t table19_64_emit_[216]; 617 static const uint8_t table19_65_emit_[216]; 618 static const uint8_t table19_66_emit_[216]; 619 static const uint8_t table19_67_emit_[216]; 620 static const uint8_t table19_68_emit_[216]; 621 static const uint8_t table19_69_emit_[120]; 622 static const uint8_t table19_70_emit_[120]; 623 static const uint8_t table19_71_emit_[120]; 624 static const uint8_t table19_72_emit_[120]; 625 static const uint8_t table19_73_emit_[120]; 626 static const uint8_t table19_74_emit_[120]; 627 static const uint8_t table19_75_emit_[68]; 628 static const uint8_t table19_79_emit_[36]; 629 static const uint16_t table19_79_ops_[128]; 630 static const uint8_t table19_80_emit_[120]; 631 static const uint8_t table19_81_emit_[120]; 632 static const uint8_t table19_82_emit_[68]; 633 static const uint16_t table19_85_ops_[128]; 634 static const uint16_t table19_86_ops_[128]; 635 static const uint8_t table19_87_emit_[46]; 636 static const uint16_t table19_87_ops_[128]; 637 static const uint8_t table19_88_emit_[120]; 638 static const uint8_t table19_89_emit_[120]; 639 static const uint8_t table19_90_emit_[68]; 640 static const uint8_t table19_95_emit_[46]; 641 static const uint16_t table19_97_ops_[128]; 642 static const uint16_t table19_98_ops_[128]; 643 static const uint16_t table19_99_ops_[128]; 644 static const uint16_t table19_120_ops_[128]; 645 static const uint8_t table19_121_emit_[104]; 646 static const uint16_t table19_121_ops_[128]; 647 static const uint8_t table19_123_emit_[104]; 648 static const uint8_t table19_124_emit_[136]; 649 static const uint16_t table19_124_ops_[128]; 650 static const uint8_t table19_125_emit_[136]; 651 static const uint8_t table19_126_emit_[136]; 652 static const uint8_t table19_127_emit_[50]; 653 static const uint16_t table19_127_ops_[128]; 654 static const uint8_t* const table19_emit_[128]; 655 static const uint16_t* const table19_ops_[128]; 656 static const uint8_t table6_0_emit_[1]; 657 static const uint16_t table6_0_ops_[256]; 658 static const uint8_t table6_32_emit_[1]; 659 static const uint16_t table6_32_ops_[256]; 660 static const uint8_t table6_48_emit_[1]; 661 static const uint8_t table6_64_emit_[1]; 662 static const uint8_t table6_80_emit_[1]; 663 static const uint16_t table6_80_ops_[256]; 664 static const uint8_t table6_88_emit_[1]; 665 static const uint8_t table6_96_emit_[1]; 666 static const uint16_t table6_96_ops_[256]; 667 static const uint8_t table6_100_emit_[1]; 668 static const uint8_t table6_104_emit_[1]; 669 static const uint8_t table6_108_emit_[1]; 670 static const uint8_t table6_112_emit_[1]; 671 static const uint8_t table6_116_emit_[1]; 672 static const uint8_t table6_120_emit_[1]; 673 static const uint16_t table6_120_ops_[256]; 674 static const uint8_t table6_122_emit_[1]; 675 static const uint8_t table6_124_emit_[1]; 676 static const uint16_t table6_124_ops_[256]; 677 static const uint8_t table6_125_emit_[1]; 678 static const uint8_t table6_126_emit_[1]; 679 static const uint8_t table6_127_emit_[79]; 680 static const uint16_t table6_127_ops_[256]; 681 static const uint8_t* const table6_emit_[128]; 682 static const uint16_t* const table6_ops_[128]; 683 static const uint8_t table27_0_emit_[8]; 684 static const uint8_t table27_0_inner_[8]; 685 static const uint8_t table28_0_emit_[16]; 686 static const uint8_t table28_0_inner_[16]; 687 static const uint8_t table31_0_emit_[30]; 688 static const uint8_t table31_0_ops_[32]; 689 static const uint8_t table32_0_ops_[64]; 690 static const uint8_t table29_0_emit_[7]; 691 static const uint8_t table29_0_ops_[32]; 692 static const uint8_t table29_1_emit_[8]; 693 static const uint8_t table29_1_ops_[32]; 694 static const uint8_t table29_2_emit_[8]; 695 static const uint8_t table29_3_emit_[10]; 696 static const uint8_t table29_3_ops_[32]; 697 static const uint8_t* const table29_emit_[4]; 698 static const uint8_t* const table29_ops_[4]; 699 static const uint8_t table34_0_emit_[7]; 700 static const uint8_t table34_0_inner_[8]; 701 static const uint8_t table33_0_emit_[9]; 702 static const uint8_t table33_0_inner_[9]; 703 }; 704 template <typename F> 705 class HuffDecoder : public HuffDecoderCommon { 706 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)707 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 708 : sink_(sink), begin_(begin), end_(end) {} Run()709 bool Run() { 710 while (!done_) { 711 if (!RefillTo8()) { 712 Done0(); 713 break; 714 } 715 const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff; 716 const auto op = GetOp1(index); 717 const int consumed = op & 15; 718 buffer_len_ -= consumed; 719 const auto emit_ofs = op >> 6; 720 switch ((op >> 4) & 3) { 721 case 0: { 722 sink_(GetEmit1(index, emit_ofs + 0)); 723 break; 724 } 725 case 1: { 726 DecodeStep0(); 727 break; 728 } 729 case 2: { 730 DecodeStep1(); 731 break; 732 } 733 } 734 } 735 return ok_; 736 } 737 738 private: RefillTo8()739 bool RefillTo8() { 740 switch (buffer_len_) { 741 case 0: { 742 return Read1to8Bytes(); 743 } 744 case 1: 745 case 2: 746 case 3: 747 case 4: 748 case 5: 749 case 6: 750 case 7: { 751 return Read1to7Bytes(); 752 } 753 } 754 return true; 755 } Read1to8Bytes()756 bool Read1to8Bytes() { 757 switch (end_ - begin_) { 758 case 0: { 759 return false; 760 } 761 case 1: { 762 Fill1(); 763 return true; 764 } 765 case 2: { 766 Fill2(); 767 return true; 768 } 769 case 3: { 770 Fill3(); 771 return true; 772 } 773 case 4: { 774 Fill4(); 775 return true; 776 } 777 case 5: { 778 Fill5(); 779 return true; 780 } 781 case 6: { 782 Fill6(); 783 return true; 784 } 785 case 7: { 786 Fill7(); 787 return true; 788 } 789 default: { 790 Fill8(); 791 return true; 792 } 793 } 794 } Fill1()795 void Fill1() { 796 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 797 begin_ += 1; 798 buffer_len_ += 8; 799 } Fill2()800 void Fill2() { 801 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 802 (static_cast<uint64_t>(begin_[1]) << 0); 803 begin_ += 2; 804 buffer_len_ += 16; 805 } Fill3()806 void Fill3() { 807 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 808 (static_cast<uint64_t>(begin_[1]) << 8) | 809 (static_cast<uint64_t>(begin_[2]) << 0); 810 begin_ += 3; 811 buffer_len_ += 24; 812 } Fill4()813 void Fill4() { 814 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 815 (static_cast<uint64_t>(begin_[1]) << 16) | 816 (static_cast<uint64_t>(begin_[2]) << 8) | 817 (static_cast<uint64_t>(begin_[3]) << 0); 818 begin_ += 4; 819 buffer_len_ += 32; 820 } Fill5()821 void Fill5() { 822 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 823 (static_cast<uint64_t>(begin_[1]) << 24) | 824 (static_cast<uint64_t>(begin_[2]) << 16) | 825 (static_cast<uint64_t>(begin_[3]) << 8) | 826 (static_cast<uint64_t>(begin_[4]) << 0); 827 begin_ += 5; 828 buffer_len_ += 40; 829 } Fill6()830 void Fill6() { 831 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 832 (static_cast<uint64_t>(begin_[1]) << 32) | 833 (static_cast<uint64_t>(begin_[2]) << 24) | 834 (static_cast<uint64_t>(begin_[3]) << 16) | 835 (static_cast<uint64_t>(begin_[4]) << 8) | 836 (static_cast<uint64_t>(begin_[5]) << 0); 837 begin_ += 6; 838 buffer_len_ += 48; 839 } Fill7()840 void Fill7() { 841 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 842 (static_cast<uint64_t>(begin_[1]) << 40) | 843 (static_cast<uint64_t>(begin_[2]) << 32) | 844 (static_cast<uint64_t>(begin_[3]) << 24) | 845 (static_cast<uint64_t>(begin_[4]) << 16) | 846 (static_cast<uint64_t>(begin_[5]) << 8) | 847 (static_cast<uint64_t>(begin_[6]) << 0); 848 begin_ += 7; 849 buffer_len_ += 56; 850 } Fill8()851 void Fill8() { 852 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 853 (static_cast<uint64_t>(begin_[1]) << 48) | 854 (static_cast<uint64_t>(begin_[2]) << 40) | 855 (static_cast<uint64_t>(begin_[3]) << 32) | 856 (static_cast<uint64_t>(begin_[4]) << 24) | 857 (static_cast<uint64_t>(begin_[5]) << 16) | 858 (static_cast<uint64_t>(begin_[6]) << 8) | 859 (static_cast<uint64_t>(begin_[7]) << 0); 860 begin_ += 8; 861 buffer_len_ += 64; 862 } Read1to7Bytes()863 bool Read1to7Bytes() { 864 switch (end_ - begin_) { 865 case 0: { 866 return false; 867 } 868 case 1: { 869 Fill1(); 870 return true; 871 } 872 case 2: { 873 Fill2(); 874 return true; 875 } 876 case 3: { 877 Fill3(); 878 return true; 879 } 880 case 4: { 881 Fill4(); 882 return true; 883 } 884 case 5: { 885 Fill5(); 886 return true; 887 } 888 case 6: { 889 Fill6(); 890 return true; 891 } 892 default: { 893 Fill7(); 894 return true; 895 } 896 } 897 } Done0()898 void Done0() { 899 done_ = true; 900 switch (end_ - begin_) {} 901 switch (buffer_len_) { 902 case 1: 903 case 2: 904 case 3: 905 case 4: { 906 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 907 return; 908 } 909 case 5: { 910 const auto index = buffer_ & 31; 911 const auto op = GetOp2(index); 912 switch (op & 3) { 913 case 0: { 914 sink_(GetEmit2(index, (op >> 2) + 0)); 915 break; 916 } 917 case 1: { 918 ok_ = false; 919 break; 920 } 921 } 922 return; 923 } 924 case 6: { 925 const auto index = buffer_ & 63; 926 const auto op = GetOp3(index); 927 switch (op & 3) { 928 case 0: { 929 ok_ = false; 930 break; 931 } 932 case 1: { 933 sink_(GetEmit3(index, (op >> 2) + 0)); 934 break; 935 } 936 } 937 return; 938 } 939 case 7: { 940 const auto index = buffer_ & 127; 941 const auto op = GetOp4(index); 942 switch (op & 3) { 943 case 0: { 944 ok_ = false; 945 break; 946 } 947 case 1: { 948 sink_(GetEmit4(index, (op >> 2) + 0)); 949 break; 950 } 951 } 952 return; 953 } 954 case 0: { 955 return; 956 } 957 } 958 } DecodeStep0()959 void DecodeStep0() { 960 if (!RefillTo2()) { 961 Done1(); 962 return; 963 } 964 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 965 const auto op = GetOp5(index); 966 const int consumed = op & 3; 967 buffer_len_ -= consumed; 968 const auto emit_ofs = op >> 2; 969 sink_(GetEmit5(index, emit_ofs + 0)); 970 } RefillTo2()971 bool RefillTo2() { 972 switch (buffer_len_) { 973 case 0: { 974 return Read1to8Bytes(); 975 } 976 case 1: { 977 return Read1to7Bytes(); 978 } 979 } 980 return true; 981 } Done1()982 void Done1() { 983 done_ = true; 984 switch (buffer_len_) { 985 case 1: 986 case 0: { 987 ok_ = false; 988 return; 989 } 990 } 991 } DecodeStep1()992 void DecodeStep1() { 993 if (!RefillTo15()) { 994 Done2(); 995 return; 996 } 997 const auto index = (buffer_ >> (buffer_len_ - 15)) & 0x7fff; 998 const auto op = GetOp6(index); 999 const int consumed = op & 15; 1000 buffer_len_ -= consumed; 1001 const auto emit_ofs = op >> 8; 1002 switch ((op >> 4) & 15) { 1003 case 0: { 1004 sink_(GetEmit6(index, emit_ofs + 0)); 1005 break; 1006 } 1007 case 1: { 1008 DecodeStep2(); 1009 break; 1010 } 1011 case 2: { 1012 DecodeStep3(); 1013 break; 1014 } 1015 case 3: { 1016 DecodeStep4(); 1017 break; 1018 } 1019 case 4: { 1020 DecodeStep5(); 1021 break; 1022 } 1023 case 5: { 1024 DecodeStep6(); 1025 break; 1026 } 1027 case 6: { 1028 DecodeStep7(); 1029 break; 1030 } 1031 case 7: { 1032 DecodeStep8(); 1033 break; 1034 } 1035 case 8: { 1036 DecodeStep9(); 1037 break; 1038 } 1039 case 9: { 1040 DecodeStep12(); 1041 break; 1042 } 1043 case 10: { 1044 DecodeStep10(); 1045 break; 1046 } 1047 case 11: { 1048 DecodeStep11(); 1049 break; 1050 } 1051 } 1052 } RefillTo15()1053 bool RefillTo15() { 1054 switch (buffer_len_) { 1055 case 0: { 1056 return Read2to8Bytes(); 1057 } 1058 case 1: 1059 case 2: 1060 case 3: 1061 case 4: 1062 case 5: 1063 case 6: { 1064 return Read2to7Bytes(); 1065 } 1066 case 7: 1067 case 8: { 1068 return Read1to7Bytes(); 1069 } 1070 case 9: 1071 case 10: 1072 case 11: 1073 case 12: 1074 case 13: 1075 case 14: { 1076 return Read1to6Bytes(); 1077 } 1078 } 1079 return true; 1080 } Read2to8Bytes()1081 bool Read2to8Bytes() { 1082 switch (end_ - begin_) { 1083 case 0: 1084 case 1: { 1085 return false; 1086 } 1087 case 2: { 1088 Fill2(); 1089 return true; 1090 } 1091 case 3: { 1092 Fill3(); 1093 return true; 1094 } 1095 case 4: { 1096 Fill4(); 1097 return true; 1098 } 1099 case 5: { 1100 Fill5(); 1101 return true; 1102 } 1103 case 6: { 1104 Fill6(); 1105 return true; 1106 } 1107 case 7: { 1108 Fill7(); 1109 return true; 1110 } 1111 default: { 1112 Fill8(); 1113 return true; 1114 } 1115 } 1116 } Read2to7Bytes()1117 bool Read2to7Bytes() { 1118 switch (end_ - begin_) { 1119 case 0: 1120 case 1: { 1121 return false; 1122 } 1123 case 2: { 1124 Fill2(); 1125 return true; 1126 } 1127 case 3: { 1128 Fill3(); 1129 return true; 1130 } 1131 case 4: { 1132 Fill4(); 1133 return true; 1134 } 1135 case 5: { 1136 Fill5(); 1137 return true; 1138 } 1139 case 6: { 1140 Fill6(); 1141 return true; 1142 } 1143 default: { 1144 Fill7(); 1145 return true; 1146 } 1147 } 1148 } Read1to6Bytes()1149 bool Read1to6Bytes() { 1150 switch (end_ - begin_) { 1151 case 0: { 1152 return false; 1153 } 1154 case 1: { 1155 Fill1(); 1156 return true; 1157 } 1158 case 2: { 1159 Fill2(); 1160 return true; 1161 } 1162 case 3: { 1163 Fill3(); 1164 return true; 1165 } 1166 case 4: { 1167 Fill4(); 1168 return true; 1169 } 1170 case 5: { 1171 Fill5(); 1172 return true; 1173 } 1174 default: { 1175 Fill6(); 1176 return true; 1177 } 1178 } 1179 } Done2()1180 void Done2() { 1181 done_ = true; 1182 switch (end_ - begin_) { 1183 case 1: { 1184 Fill1(); 1185 break; 1186 } 1187 } 1188 switch (buffer_len_) { 1189 case 1: { 1190 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1191 return; 1192 } 1193 case 2: { 1194 const auto index = buffer_ & 3; 1195 const auto op = GetOp7(index); 1196 switch (op & 3) { 1197 case 0: { 1198 sink_(GetEmit7(index, (op >> 2) + 0)); 1199 break; 1200 } 1201 case 1: { 1202 ok_ = false; 1203 break; 1204 } 1205 } 1206 return; 1207 } 1208 case 3: { 1209 const auto index = buffer_ & 7; 1210 const auto op = GetOp8(index); 1211 switch (op & 3) { 1212 case 0: { 1213 ok_ = false; 1214 break; 1215 } 1216 case 1: { 1217 sink_(GetEmit8(index, (op >> 2) + 0)); 1218 break; 1219 } 1220 } 1221 return; 1222 } 1223 case 4: { 1224 const auto index = buffer_ & 15; 1225 const auto op = GetOp9(index); 1226 switch (op & 3) { 1227 case 0: { 1228 ok_ = false; 1229 break; 1230 } 1231 case 1: { 1232 sink_(GetEmit9(index, (op >> 2) + 0)); 1233 break; 1234 } 1235 } 1236 return; 1237 } 1238 case 5: { 1239 const auto index = buffer_ & 31; 1240 const auto op = GetOp10(index); 1241 switch (op & 3) { 1242 case 0: { 1243 ok_ = false; 1244 break; 1245 } 1246 case 1: { 1247 sink_(GetEmit10(index, (op >> 2) + 0)); 1248 break; 1249 } 1250 } 1251 return; 1252 } 1253 case 6: { 1254 const auto index = buffer_ & 63; 1255 const auto op = GetOp11(index); 1256 switch (op & 3) { 1257 case 0: { 1258 ok_ = false; 1259 break; 1260 } 1261 case 1: { 1262 sink_(GetEmit11(index, (op >> 2) + 0)); 1263 break; 1264 } 1265 } 1266 return; 1267 } 1268 case 7: { 1269 const auto index = buffer_ & 127; 1270 const auto op = GetOp12(index); 1271 switch (op & 3) { 1272 case 0: { 1273 sink_(GetEmit12(index, (op >> 2) + 0)); 1274 sink_(GetEmit12(index, (op >> 2) + 1)); 1275 break; 1276 } 1277 case 1: { 1278 ok_ = false; 1279 break; 1280 } 1281 case 2: { 1282 sink_(GetEmit12(index, (op >> 2) + 0)); 1283 break; 1284 } 1285 } 1286 return; 1287 } 1288 case 8: { 1289 const auto index = buffer_ & 255; 1290 const auto op = GetOp13(index); 1291 switch (op & 3) { 1292 case 0: { 1293 ok_ = false; 1294 break; 1295 } 1296 case 1: { 1297 sink_(GetEmit13(index, (op >> 2) + 0)); 1298 sink_(GetEmit13(index, (op >> 2) + 1)); 1299 break; 1300 } 1301 case 2: { 1302 sink_(GetEmit13(index, (op >> 2) + 0)); 1303 break; 1304 } 1305 } 1306 return; 1307 } 1308 case 9: { 1309 const auto index = buffer_ & 511; 1310 const auto op = GetOp14(index); 1311 switch (op & 3) { 1312 case 0: { 1313 ok_ = false; 1314 break; 1315 } 1316 case 1: { 1317 sink_(GetEmit14(index, (op >> 2) + 0)); 1318 sink_(GetEmit14(index, (op >> 2) + 1)); 1319 break; 1320 } 1321 case 2: { 1322 sink_(GetEmit14(index, (op >> 2) + 0)); 1323 break; 1324 } 1325 } 1326 return; 1327 } 1328 case 10: { 1329 const auto index = buffer_ & 1023; 1330 const auto op = GetOp15(index); 1331 switch (op & 3) { 1332 case 0: { 1333 ok_ = false; 1334 break; 1335 } 1336 case 1: { 1337 sink_(GetEmit15(index, (op >> 2) + 0)); 1338 sink_(GetEmit15(index, (op >> 2) + 1)); 1339 break; 1340 } 1341 case 2: { 1342 sink_(GetEmit15(index, (op >> 2) + 0)); 1343 break; 1344 } 1345 } 1346 return; 1347 } 1348 case 11: { 1349 const auto index = buffer_ & 2047; 1350 const auto op = GetOp16(index); 1351 switch (op & 3) { 1352 case 0: { 1353 ok_ = false; 1354 break; 1355 } 1356 case 1: { 1357 sink_(GetEmit16(index, (op >> 2) + 0)); 1358 sink_(GetEmit16(index, (op >> 2) + 1)); 1359 break; 1360 } 1361 case 2: { 1362 sink_(GetEmit16(index, (op >> 2) + 0)); 1363 break; 1364 } 1365 } 1366 return; 1367 } 1368 case 12: { 1369 const auto index = buffer_ & 4095; 1370 const auto op = GetOp17(index); 1371 switch (op & 7) { 1372 case 0: { 1373 sink_(GetEmit17(index, (op >> 3) + 0)); 1374 sink_(GetEmit17(index, (op >> 3) + 1)); 1375 sink_(GetEmit17(index, (op >> 3) + 2)); 1376 break; 1377 } 1378 case 1: { 1379 ok_ = false; 1380 break; 1381 } 1382 case 2: { 1383 sink_(GetEmit17(index, (op >> 3) + 0)); 1384 sink_(GetEmit17(index, (op >> 3) + 1)); 1385 break; 1386 } 1387 case 3: { 1388 sink_(GetEmit17(index, (op >> 3) + 0)); 1389 break; 1390 } 1391 } 1392 return; 1393 } 1394 case 13: { 1395 const auto index = buffer_ & 8191; 1396 const auto op = GetOp18(index); 1397 switch (op & 7) { 1398 case 0: { 1399 ok_ = false; 1400 break; 1401 } 1402 case 1: { 1403 sink_(GetEmit18(index, (op >> 3) + 0)); 1404 sink_(GetEmit18(index, (op >> 3) + 1)); 1405 sink_(GetEmit18(index, (op >> 3) + 2)); 1406 break; 1407 } 1408 case 2: { 1409 sink_(GetEmit18(index, (op >> 3) + 0)); 1410 sink_(GetEmit18(index, (op >> 3) + 1)); 1411 break; 1412 } 1413 case 3: { 1414 sink_(GetEmit18(index, (op >> 3) + 0)); 1415 break; 1416 } 1417 } 1418 return; 1419 } 1420 case 14: { 1421 const auto index = buffer_ & 16383; 1422 const auto op = GetOp19(index); 1423 switch (op & 7) { 1424 case 0: { 1425 ok_ = false; 1426 break; 1427 } 1428 case 1: { 1429 sink_(GetEmit19(index, (op >> 3) + 0)); 1430 sink_(GetEmit19(index, (op >> 3) + 1)); 1431 sink_(GetEmit19(index, (op >> 3) + 2)); 1432 break; 1433 } 1434 case 2: { 1435 sink_(GetEmit19(index, (op >> 3) + 0)); 1436 sink_(GetEmit19(index, (op >> 3) + 1)); 1437 break; 1438 } 1439 case 3: { 1440 sink_(GetEmit19(index, (op >> 3) + 0)); 1441 break; 1442 } 1443 } 1444 return; 1445 } 1446 case 0: { 1447 return; 1448 } 1449 } 1450 } DecodeStep2()1451 void DecodeStep2() { 1452 if (!RefillTo1()) { 1453 Done3(); 1454 return; 1455 } 1456 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1457 const auto op = GetOp20(index); 1458 const int consumed = op & 1; 1459 buffer_len_ -= consumed; 1460 const auto emit_ofs = op >> 1; 1461 sink_(GetEmit20(index, emit_ofs + 0)); 1462 } RefillTo1()1463 bool RefillTo1() { 1464 switch (buffer_len_) { 1465 case 0: { 1466 return Read1to8Bytes(); 1467 } 1468 } 1469 return true; 1470 } Done3()1471 void Done3() { 1472 done_ = true; 1473 ok_ = false; 1474 } DecodeStep3()1475 void DecodeStep3() { 1476 if (!RefillTo1()) { 1477 Done4(); 1478 return; 1479 } 1480 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1481 const auto op = GetOp21(index); 1482 const int consumed = op & 1; 1483 buffer_len_ -= consumed; 1484 const auto emit_ofs = op >> 1; 1485 sink_(GetEmit21(index, emit_ofs + 0)); 1486 } Done4()1487 void Done4() { 1488 done_ = true; 1489 ok_ = false; 1490 } DecodeStep4()1491 void DecodeStep4() { 1492 if (!RefillTo1()) { 1493 Done5(); 1494 return; 1495 } 1496 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1497 const auto op = GetOp22(index); 1498 const int consumed = op & 1; 1499 buffer_len_ -= consumed; 1500 const auto emit_ofs = op >> 1; 1501 sink_(GetEmit22(index, emit_ofs + 0)); 1502 } Done5()1503 void Done5() { 1504 done_ = true; 1505 ok_ = false; 1506 } DecodeStep5()1507 void DecodeStep5() { 1508 if (!RefillTo1()) { 1509 Done6(); 1510 return; 1511 } 1512 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1513 const auto op = GetOp23(index); 1514 const int consumed = op & 1; 1515 buffer_len_ -= consumed; 1516 const auto emit_ofs = op >> 1; 1517 sink_(GetEmit23(index, emit_ofs + 0)); 1518 } Done6()1519 void Done6() { 1520 done_ = true; 1521 ok_ = false; 1522 } DecodeStep6()1523 void DecodeStep6() { 1524 if (!RefillTo1()) { 1525 Done7(); 1526 return; 1527 } 1528 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1529 const auto op = GetOp24(index); 1530 const int consumed = op & 1; 1531 buffer_len_ -= consumed; 1532 const auto emit_ofs = op >> 1; 1533 sink_(GetEmit24(index, emit_ofs + 0)); 1534 } Done7()1535 void Done7() { 1536 done_ = true; 1537 ok_ = false; 1538 } DecodeStep7()1539 void DecodeStep7() { 1540 if (!RefillTo1()) { 1541 Done8(); 1542 return; 1543 } 1544 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1545 const auto op = GetOp25(index); 1546 const int consumed = op & 1; 1547 buffer_len_ -= consumed; 1548 const auto emit_ofs = op >> 1; 1549 sink_(GetEmit25(index, emit_ofs + 0)); 1550 } Done8()1551 void Done8() { 1552 done_ = true; 1553 ok_ = false; 1554 } DecodeStep8()1555 void DecodeStep8() { 1556 if (!RefillTo2()) { 1557 Done9(); 1558 return; 1559 } 1560 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1561 const auto op = GetOp26(index); 1562 const int consumed = op & 3; 1563 buffer_len_ -= consumed; 1564 const auto emit_ofs = op >> 2; 1565 sink_(GetEmit26(index, emit_ofs + 0)); 1566 } Done9()1567 void Done9() { 1568 done_ = true; 1569 switch (buffer_len_) { 1570 case 1: 1571 case 0: { 1572 ok_ = false; 1573 return; 1574 } 1575 } 1576 } DecodeStep9()1577 void DecodeStep9() { 1578 if (!RefillTo3()) { 1579 Done10(); 1580 return; 1581 } 1582 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1583 const auto op = GetOp27(index); 1584 const int consumed = op & 3; 1585 buffer_len_ -= consumed; 1586 const auto emit_ofs = op >> 2; 1587 sink_(GetEmit27(index, emit_ofs + 0)); 1588 } RefillTo3()1589 bool RefillTo3() { 1590 switch (buffer_len_) { 1591 case 0: { 1592 return Read1to8Bytes(); 1593 } 1594 case 1: 1595 case 2: { 1596 return Read1to7Bytes(); 1597 } 1598 } 1599 return true; 1600 } Done10()1601 void Done10() { 1602 done_ = true; 1603 switch (buffer_len_) { 1604 case 1: 1605 case 2: 1606 case 0: { 1607 ok_ = false; 1608 return; 1609 } 1610 } 1611 } DecodeStep10()1612 void DecodeStep10() { 1613 if (!RefillTo4()) { 1614 Done11(); 1615 return; 1616 } 1617 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1618 const auto op = GetOp28(index); 1619 const int consumed = op & 7; 1620 buffer_len_ -= consumed; 1621 const auto emit_ofs = op >> 3; 1622 sink_(GetEmit28(index, emit_ofs + 0)); 1623 } RefillTo4()1624 bool RefillTo4() { 1625 switch (buffer_len_) { 1626 case 0: { 1627 return Read1to8Bytes(); 1628 } 1629 case 1: 1630 case 2: 1631 case 3: { 1632 return Read1to7Bytes(); 1633 } 1634 } 1635 return true; 1636 } Done11()1637 void Done11() { 1638 done_ = true; 1639 switch (buffer_len_) { 1640 case 1: 1641 case 2: 1642 case 3: 1643 case 0: { 1644 ok_ = false; 1645 return; 1646 } 1647 } 1648 } DecodeStep11()1649 void DecodeStep11() { 1650 if (!RefillTo7()) { 1651 Done12(); 1652 return; 1653 } 1654 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 1655 const auto op = GetOp29(index); 1656 const int consumed = op & 7; 1657 buffer_len_ -= consumed; 1658 const auto emit_ofs = op >> 4; 1659 switch ((op >> 3) & 1) { 1660 case 0: { 1661 sink_(GetEmit29(index, emit_ofs + 0)); 1662 break; 1663 } 1664 case 1: { 1665 begin_ = end_; 1666 buffer_len_ = 0; 1667 break; 1668 } 1669 } 1670 } RefillTo7()1671 bool RefillTo7() { 1672 switch (buffer_len_) { 1673 case 0: { 1674 return Read1to8Bytes(); 1675 } 1676 case 1: 1677 case 2: 1678 case 3: 1679 case 4: 1680 case 5: 1681 case 6: { 1682 return Read1to7Bytes(); 1683 } 1684 } 1685 return true; 1686 } Done12()1687 void Done12() { 1688 done_ = true; 1689 switch (buffer_len_) { 1690 case 1: 1691 case 2: 1692 case 3: { 1693 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1694 return; 1695 } 1696 case 4: { 1697 const auto index = buffer_ & 15; 1698 const auto op = GetOp30(index); 1699 switch (op & 3) { 1700 case 0: { 1701 sink_(GetEmit30(index, (op >> 2) + 0)); 1702 break; 1703 } 1704 case 1: { 1705 ok_ = false; 1706 break; 1707 } 1708 } 1709 return; 1710 } 1711 case 5: { 1712 const auto index = buffer_ & 31; 1713 const auto op = GetOp31(index); 1714 switch (op & 3) { 1715 case 0: { 1716 ok_ = false; 1717 break; 1718 } 1719 case 1: { 1720 sink_(GetEmit31(index, (op >> 2) + 0)); 1721 break; 1722 } 1723 } 1724 return; 1725 } 1726 case 6: { 1727 const auto index = buffer_ & 63; 1728 const auto op = GetOp32(index); 1729 switch (op & 3) { 1730 case 0: { 1731 ok_ = false; 1732 break; 1733 } 1734 case 1: { 1735 sink_(GetEmit32(index, (op >> 2) + 0)); 1736 break; 1737 } 1738 } 1739 return; 1740 } 1741 case 0: { 1742 return; 1743 } 1744 } 1745 } DecodeStep12()1746 void DecodeStep12() { 1747 if (!RefillTo4()) { 1748 Done13(); 1749 return; 1750 } 1751 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1752 const auto op = GetOp33(index); 1753 const int consumed = op & 7; 1754 buffer_len_ -= consumed; 1755 const auto emit_ofs = op >> 3; 1756 sink_(GetEmit33(index, emit_ofs + 0)); 1757 } Done13()1758 void Done13() { 1759 done_ = true; 1760 switch (buffer_len_) { 1761 case 1: 1762 case 2: 1763 case 0: { 1764 ok_ = false; 1765 return; 1766 } 1767 case 3: { 1768 const auto index = buffer_ & 7; 1769 const auto op = GetOp34(index); 1770 switch (op & 1) { 1771 case 0: { 1772 sink_(GetEmit34(index, (op >> 1) + 0)); 1773 break; 1774 } 1775 case 1: { 1776 ok_ = false; 1777 break; 1778 } 1779 } 1780 return; 1781 } 1782 } 1783 } 1784 F sink_; 1785 const uint8_t* begin_; 1786 const uint8_t* const end_; 1787 uint64_t buffer_ = 0; 1788 int buffer_len_ = 0; 1789 bool ok_ = true; 1790 bool done_ = false; 1791 }; 1792 } // namespace geometry_8_15_7 1793 } // namespace grpc_core 1794 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_15_7_H 1795