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_12_10_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_12_10_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_8_12_10 { 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 } GetOp6(size_t i)108 static inline uint64_t GetOp6(size_t i) { 109 return table6_ops_[i >> 7][i & 0x7f]; 110 } GetEmit6(size_t i,size_t emit)111 static inline uint64_t GetEmit6(size_t i, size_t emit) { 112 return table6_emit_[i >> 7][emit]; 113 } GetOp17(size_t i)114 static inline uint64_t GetOp17(size_t i) { return i ? 3 : 1; } GetEmit17(size_t,size_t emit)115 static inline uint64_t GetEmit17(size_t, size_t emit) { 116 return emit ? 161 : 153; 117 } GetOp18(size_t i)118 static inline uint64_t GetOp18(size_t i) { return i ? 3 : 1; } GetEmit18(size_t,size_t emit)119 static inline uint64_t GetEmit18(size_t, size_t emit) { 120 return emit ? 172 : 167; 121 } GetOp19(size_t i)122 static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; } GetEmit19(size_t,size_t emit)123 static inline uint64_t GetEmit19(size_t, size_t emit) { return emit + 176; } GetOp20(size_t i)124 static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; } GetEmit20(size_t,size_t emit)125 static inline uint64_t GetEmit20(size_t, size_t emit) { 126 return emit ? 209 : 179; 127 } GetOp21(size_t i)128 static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; } GetEmit21(size_t,size_t emit)129 static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 216; } GetOp22(size_t i)130 static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; } GetEmit22(size_t,size_t emit)131 static inline uint64_t GetEmit22(size_t, size_t emit) { 132 return emit ? 229 : 227; 133 } GetOp23(size_t i)134 static inline uint64_t GetOp23(size_t i) { 135 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 136 } GetEmit23(size_t,size_t emit)137 static inline uint64_t GetEmit23(size_t, size_t emit) { 138 return (emit < 2 ? (emit + 133) : ((emit - 2) ? 146 : 136)); 139 } GetOp24(size_t i)140 static inline uint64_t GetOp24(size_t i) { 141 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 142 } GetEmit24(size_t,size_t emit)143 static inline uint64_t GetEmit24(size_t, size_t emit) { 144 return (emit < 2 ? (emit ? 156 : 154) : ((emit - 2) ? 163 : 160)); 145 } GetOp25(size_t i)146 static inline uint64_t GetOp25(size_t i) { 147 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 148 } GetEmit25(size_t,size_t emit)149 static inline uint64_t GetEmit25(size_t, size_t emit) { 150 return (emit < 2 ? (emit ? 169 : 164) : ((emit - 2) ? 173 : 170)); 151 } 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 ? 181 : 178) : ((emit - 2) + 185)); 157 } GetOp27(size_t i)158 static inline uint64_t GetOp27(size_t i) { 159 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 160 } GetEmit27(size_t,size_t emit)161 static inline uint64_t GetEmit27(size_t, size_t emit) { 162 return (emit < 2 ? (emit ? 189 : 187) : ((emit - 2) ? 196 : 190)); 163 } GetOp28(size_t i)164 static inline uint64_t GetOp28(size_t i) { 165 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 166 } GetEmit28(size_t,size_t emit)167 static inline uint64_t GetEmit28(size_t, size_t emit) { 168 return (emit < 2 ? (emit ? 228 : 198) : ((emit - 2) + 232)); 169 } GetOp29(size_t i)170 static inline uint64_t GetOp29(size_t i) { return table29_0_inner_[i]; } GetEmit29(size_t,size_t emit)171 static inline uint64_t GetEmit29(size_t, size_t emit) { 172 return table29_0_emit_[emit]; 173 } GetOp30(size_t i)174 static inline uint64_t GetOp30(size_t i) { return table29_0_inner_[i]; } GetEmit30(size_t,size_t emit)175 static inline uint64_t GetEmit30(size_t, size_t emit) { 176 return table30_0_emit_[emit]; 177 } GetOp31(size_t i)178 static inline uint64_t GetOp31(size_t i) { return table29_0_inner_[i]; } GetEmit31(size_t,size_t emit)179 static inline uint64_t GetEmit31(size_t, size_t emit) { 180 return table31_0_emit_[emit]; 181 } GetOp33(size_t i)182 static inline uint64_t GetOp33(size_t i) { return i; } GetEmit33(size_t,size_t emit)183 static inline uint64_t GetEmit33(size_t, size_t emit) { 184 return ((void)emit, 230); 185 } GetOp32(size_t i)186 static inline uint64_t GetOp32(size_t i) { 187 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 188 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 189 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 190 } GetEmit32(size_t,size_t emit)191 static inline uint64_t GetEmit32(size_t, size_t emit) { 192 return (emit < 1 ? (((void)emit, 230)) : ((emit - 1) ? 132 : 129)); 193 } GetOp35(size_t i)194 static inline uint64_t GetOp35(size_t i) { 195 return table35_0_inner_[(i < 5 ? (i) : (((void)(i - 5), 5)))]; 196 } GetEmit35(size_t,size_t emit)197 static inline uint64_t GetEmit35(size_t, size_t emit) { 198 return table35_0_emit_[emit]; 199 } GetOp34(size_t i)200 static inline uint64_t GetOp34(size_t i) { 201 return table34_0_inner_[(i < 9 ? (i / 2 + 0) : ((i - 9) + 4))]; 202 } GetEmit34(size_t,size_t emit)203 static inline uint64_t GetEmit34(size_t, size_t emit) { 204 return table34_0_emit_[emit]; 205 } GetOp37(size_t i)206 static inline uint64_t GetOp37(size_t i) { 207 return table37_0_inner_[(i < 6 ? (i) : ((i - 6) / 9 + 6))]; 208 } GetEmit37(size_t,size_t emit)209 static inline uint64_t GetEmit37(size_t, size_t emit) { 210 return table37_0_emit_[emit]; 211 } GetOp38(size_t i)212 static inline uint64_t GetOp38(size_t i) { return table38_0_ops_[i]; } GetEmit38(size_t,size_t emit)213 static inline uint64_t GetEmit38(size_t, size_t emit) { 214 return table38_0_emit_[emit]; 215 } GetOp39(size_t i)216 static inline uint64_t GetOp39(size_t i) { return table39_0_ops_[i]; } GetEmit39(size_t,size_t emit)217 static inline uint64_t GetEmit39(size_t, size_t emit) { 218 return table39_0_emit_[emit]; 219 } GetOp40(size_t i)220 static inline uint64_t GetOp40(size_t i) { return table40_0_ops_[i]; } GetEmit40(size_t,size_t emit)221 static inline uint64_t GetEmit40(size_t, size_t emit) { 222 return table40_0_emit_[emit]; 223 } GetOp41(size_t i)224 static inline uint64_t GetOp41(size_t i) { 225 return table41_ops_[i >> 7][i & 0x7f]; 226 } GetEmit41(size_t i,size_t emit)227 static inline uint64_t GetEmit41(size_t i, size_t emit) { 228 return table41_emit_[i >> 7][emit]; 229 } GetOp42(size_t i)230 static inline uint64_t GetOp42(size_t i) { 231 return table42_ops_[i >> 6][i & 0x3f]; 232 } GetEmit42(size_t i,size_t emit)233 static inline uint64_t GetEmit42(size_t i, size_t emit) { 234 return table42_emit_[i >> 6][emit]; 235 } GetOp36(size_t i)236 static inline uint64_t GetOp36(size_t i) { 237 return table36_ops_[i >> 6][i & 0x3f]; 238 } GetEmit36(size_t i,size_t emit)239 static inline uint64_t GetEmit36(size_t i, size_t emit) { 240 return table36_emit_[i >> 6][emit]; 241 } 242 243 private: 244 static const uint8_t table2_0_emit_[10]; 245 static const uint8_t table2_0_ops_[32]; 246 static const uint8_t table3_0_emit_[36]; 247 static const uint8_t table3_0_ops_[64]; 248 static const uint8_t table4_0_emit_[22]; 249 static const uint8_t table4_0_ops_[64]; 250 static const uint8_t table4_1_emit_[46]; 251 static const uint8_t table4_1_ops_[64]; 252 static const uint8_t* const table4_emit_[2]; 253 static const uint8_t* const table4_ops_[2]; 254 static const uint8_t table1_0_emit_[74]; 255 static const uint16_t table1_0_inner_[76]; 256 static const uint8_t table1_0_outer_[256]; 257 static const uint8_t table8_0_inner_[6]; 258 static const uint8_t table8_0_outer_[8]; 259 static const uint8_t table9_0_emit_[6]; 260 static const uint8_t table9_0_inner_[8]; 261 static const uint8_t table9_0_outer_[16]; 262 static const uint8_t table10_0_emit_[12]; 263 static const uint8_t table10_0_ops_[32]; 264 static const uint8_t table11_0_emit_[14]; 265 static const uint8_t table11_0_ops_[64]; 266 static const uint8_t table12_0_emit_[36]; 267 static const uint8_t table12_0_ops_[128]; 268 static const uint8_t table13_0_emit_[44]; 269 static const uint8_t table13_0_ops_[32]; 270 static const uint8_t table13_1_emit_[28]; 271 static const uint8_t table13_1_ops_[32]; 272 static const uint8_t table13_2_emit_[20]; 273 static const uint8_t table13_2_ops_[32]; 274 static const uint8_t table13_3_emit_[20]; 275 static const uint8_t table13_4_emit_[20]; 276 static const uint8_t table13_5_emit_[2]; 277 static const uint8_t table13_5_ops_[32]; 278 static const uint8_t table13_6_emit_[4]; 279 static const uint8_t table13_6_ops_[32]; 280 static const uint8_t table13_7_emit_[7]; 281 static const uint8_t table13_7_ops_[32]; 282 static const uint8_t* const table13_emit_[8]; 283 static const uint8_t* const table13_ops_[8]; 284 static const uint8_t table14_0_emit_[16]; 285 static const uint8_t table14_0_ops_[32]; 286 static const uint8_t table14_1_emit_[28]; 287 static const uint8_t table14_1_ops_[32]; 288 static const uint8_t table14_2_emit_[36]; 289 static const uint8_t table14_2_ops_[32]; 290 static const uint8_t table14_3_emit_[56]; 291 static const uint8_t table14_3_ops_[32]; 292 static const uint8_t table14_4_emit_[44]; 293 static const uint8_t table14_5_emit_[28]; 294 static const uint8_t table14_6_emit_[44]; 295 static const uint8_t table14_7_emit_[28]; 296 static const uint8_t table14_8_emit_[44]; 297 static const uint8_t table14_9_emit_[28]; 298 static const uint8_t table14_10_emit_[20]; 299 static const uint8_t table14_11_emit_[20]; 300 static const uint8_t table14_12_emit_[2]; 301 static const uint8_t table14_13_emit_[2]; 302 static const uint8_t table14_14_emit_[2]; 303 static const uint8_t table14_15_emit_[5]; 304 static const uint8_t table14_15_ops_[32]; 305 static const uint8_t* const table14_emit_[16]; 306 static const uint8_t* const table14_ops_[16]; 307 static const uint16_t table15_0_ops_[64]; 308 static const uint16_t table15_1_ops_[64]; 309 static const uint16_t table15_2_ops_[64]; 310 static const uint8_t table15_3_emit_[68]; 311 static const uint16_t table15_3_ops_[64]; 312 static const uint16_t table15_4_ops_[64]; 313 static const uint8_t table15_5_emit_[92]; 314 static const uint16_t table15_5_ops_[64]; 315 static const uint8_t table15_7_emit_[92]; 316 static const uint8_t table15_9_emit_[92]; 317 static const uint8_t table15_10_emit_[72]; 318 static const uint16_t table15_10_ops_[64]; 319 static const uint8_t table15_11_emit_[72]; 320 static const uint8_t table15_12_emit_[40]; 321 static const uint16_t table15_12_ops_[64]; 322 static const uint8_t table15_13_emit_[40]; 323 static const uint8_t table15_14_emit_[40]; 324 static const uint16_t table15_15_ops_[64]; 325 static const uint8_t* const table15_emit_[16]; 326 static const uint16_t* const table15_ops_[16]; 327 static const uint8_t table16_0_emit_[8]; 328 static const uint16_t table16_0_ops_[64]; 329 static const uint8_t table16_1_emit_[8]; 330 static const uint8_t table16_2_emit_[12]; 331 static const uint16_t table16_2_ops_[64]; 332 static const uint8_t table16_3_emit_[16]; 333 static const uint8_t table16_4_emit_[16]; 334 static const uint8_t table16_5_emit_[20]; 335 static const uint16_t table16_5_ops_[64]; 336 static const uint8_t table16_6_emit_[32]; 337 static const uint16_t table16_6_ops_[64]; 338 static const uint8_t table16_7_emit_[36]; 339 static const uint16_t table16_7_ops_[64]; 340 static const uint8_t table16_8_emit_[16]; 341 static const uint8_t table16_9_emit_[28]; 342 static const uint8_t table16_10_emit_[36]; 343 static const uint8_t table16_11_emit_[68]; 344 static const uint8_t table16_12_emit_[16]; 345 static const uint8_t table16_13_emit_[28]; 346 static const uint8_t table16_14_emit_[36]; 347 static const uint8_t table16_15_emit_[68]; 348 static const uint8_t table16_16_emit_[16]; 349 static const uint8_t table16_17_emit_[28]; 350 static const uint8_t table16_18_emit_[36]; 351 static const uint8_t table16_19_emit_[68]; 352 static const uint8_t table16_20_emit_[44]; 353 static const uint8_t table16_21_emit_[92]; 354 static const uint8_t table16_22_emit_[44]; 355 static const uint8_t table16_23_emit_[92]; 356 static const uint8_t table16_24_emit_[72]; 357 static const uint8_t table16_25_emit_[72]; 358 static const uint8_t table16_26_emit_[72]; 359 static const uint8_t table16_27_emit_[72]; 360 static const uint8_t table16_28_emit_[72]; 361 static const uint8_t table16_29_emit_[72]; 362 static const uint8_t table16_30_emit_[40]; 363 static const uint8_t table16_31_emit_[6]; 364 static const uint16_t table16_31_ops_[64]; 365 static const uint8_t* const table16_emit_[32]; 366 static const uint16_t* const table16_ops_[32]; 367 static const uint8_t table6_0_emit_[1]; 368 static const uint16_t table6_0_ops_[128]; 369 static const uint8_t table6_8_emit_[1]; 370 static const uint16_t table6_8_ops_[128]; 371 static const uint8_t table6_12_emit_[1]; 372 static const uint8_t table6_16_emit_[1]; 373 static const uint8_t table6_20_emit_[1]; 374 static const uint16_t table6_20_ops_[128]; 375 static const uint8_t table6_22_emit_[1]; 376 static const uint8_t table6_24_emit_[1]; 377 static const uint16_t table6_24_ops_[128]; 378 static const uint8_t table6_25_emit_[1]; 379 static const uint8_t table6_26_emit_[1]; 380 static const uint8_t table6_27_emit_[1]; 381 static const uint8_t table6_28_emit_[1]; 382 static const uint8_t table6_29_emit_[1]; 383 static const uint8_t table6_30_emit_[2]; 384 static const uint16_t table6_30_ops_[128]; 385 static const uint8_t table6_31_emit_[14]; 386 static const uint16_t table6_31_ops_[128]; 387 static const uint8_t* const table6_emit_[32]; 388 static const uint16_t* const table6_ops_[32]; 389 static const uint8_t table29_0_emit_[8]; 390 static const uint8_t table29_0_inner_[8]; 391 static const uint8_t table30_0_emit_[8]; 392 static const uint8_t table31_0_emit_[8]; 393 static const uint8_t table35_0_emit_[5]; 394 static const uint8_t table35_0_inner_[6]; 395 static const uint8_t table34_0_emit_[11]; 396 static const uint8_t table34_0_inner_[11]; 397 static const uint8_t table37_0_emit_[6]; 398 static const uint8_t table37_0_inner_[8]; 399 static const uint8_t table38_0_emit_[10]; 400 static const uint8_t table38_0_ops_[32]; 401 static const uint8_t table39_0_emit_[25]; 402 static const uint8_t table39_0_ops_[64]; 403 static const uint8_t table40_0_emit_[44]; 404 static const uint8_t table40_0_ops_[128]; 405 static const uint8_t table41_0_ops_[128]; 406 static const uint8_t table41_1_emit_[63]; 407 static const uint8_t table41_1_ops_[128]; 408 static const uint8_t* const table41_emit_[2]; 409 static const uint8_t* const table41_ops_[2]; 410 static const uint8_t table42_0_emit_[40]; 411 static const uint8_t table42_0_ops_[64]; 412 static const uint8_t table42_1_emit_[40]; 413 static const uint8_t table42_2_emit_[40]; 414 static const uint8_t table42_3_emit_[4]; 415 static const uint8_t table42_3_ops_[64]; 416 static const uint8_t table42_4_emit_[8]; 417 static const uint8_t table42_4_ops_[64]; 418 static const uint8_t table42_5_emit_[9]; 419 static const uint8_t table42_5_ops_[64]; 420 static const uint8_t table42_6_emit_[16]; 421 static const uint8_t table42_6_ops_[64]; 422 static const uint8_t table42_7_emit_[30]; 423 static const uint8_t table42_7_ops_[64]; 424 static const uint8_t* const table42_emit_[8]; 425 static const uint8_t* const table42_ops_[8]; 426 static const uint8_t table36_0_emit_[1]; 427 static const uint16_t table36_0_ops_[64]; 428 static const uint8_t table36_1_emit_[1]; 429 static const uint8_t table36_2_emit_[1]; 430 static const uint8_t table36_3_emit_[1]; 431 static const uint8_t table36_4_emit_[1]; 432 static const uint8_t table36_5_emit_[1]; 433 static const uint8_t table36_6_emit_[2]; 434 static const uint16_t table36_6_ops_[64]; 435 static const uint8_t table36_7_emit_[2]; 436 static const uint8_t table36_8_emit_[4]; 437 static const uint16_t table36_8_ops_[64]; 438 static const uint8_t table36_9_emit_[4]; 439 static const uint8_t table36_10_emit_[4]; 440 static const uint8_t table36_11_emit_[5]; 441 static const uint16_t table36_11_ops_[64]; 442 static const uint8_t table36_12_emit_[8]; 443 static const uint16_t table36_12_ops_[64]; 444 static const uint8_t table36_13_emit_[8]; 445 static const uint8_t table36_14_emit_[15]; 446 static const uint16_t table36_14_ops_[64]; 447 static const uint8_t table36_15_emit_[18]; 448 static const uint16_t table36_15_ops_[64]; 449 static const uint8_t* const table36_emit_[16]; 450 static const uint16_t* const table36_ops_[16]; 451 }; 452 template <typename F> 453 class HuffDecoder : public HuffDecoderCommon { 454 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)455 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 456 : sink_(sink), begin_(begin), end_(end) {} Run()457 bool Run() { 458 while (!done_) { 459 if (!RefillTo8()) { 460 Done0(); 461 break; 462 } 463 const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff; 464 const auto op = GetOp1(index); 465 const int consumed = op & 15; 466 buffer_len_ -= consumed; 467 const auto emit_ofs = op >> 6; 468 switch ((op >> 4) & 3) { 469 case 0: { 470 sink_(GetEmit1(index, emit_ofs + 0)); 471 break; 472 } 473 case 1: { 474 DecodeStep0(); 475 break; 476 } 477 case 2: { 478 DecodeStep1(); 479 break; 480 } 481 } 482 } 483 return ok_; 484 } 485 486 private: RefillTo8()487 bool RefillTo8() { 488 switch (buffer_len_) { 489 case 0: { 490 return Read1to8Bytes(); 491 } 492 case 1: 493 case 2: 494 case 3: 495 case 4: 496 case 5: 497 case 6: 498 case 7: { 499 return Read1to7Bytes(); 500 } 501 } 502 return true; 503 } Read1to8Bytes()504 bool Read1to8Bytes() { 505 switch (end_ - begin_) { 506 case 0: { 507 return false; 508 } 509 case 1: { 510 Fill1(); 511 return true; 512 } 513 case 2: { 514 Fill2(); 515 return true; 516 } 517 case 3: { 518 Fill3(); 519 return true; 520 } 521 case 4: { 522 Fill4(); 523 return true; 524 } 525 case 5: { 526 Fill5(); 527 return true; 528 } 529 case 6: { 530 Fill6(); 531 return true; 532 } 533 case 7: { 534 Fill7(); 535 return true; 536 } 537 default: { 538 Fill8(); 539 return true; 540 } 541 } 542 } Fill1()543 void Fill1() { 544 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 545 begin_ += 1; 546 buffer_len_ += 8; 547 } Fill2()548 void Fill2() { 549 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 550 (static_cast<uint64_t>(begin_[1]) << 0); 551 begin_ += 2; 552 buffer_len_ += 16; 553 } Fill3()554 void Fill3() { 555 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 556 (static_cast<uint64_t>(begin_[1]) << 8) | 557 (static_cast<uint64_t>(begin_[2]) << 0); 558 begin_ += 3; 559 buffer_len_ += 24; 560 } Fill4()561 void Fill4() { 562 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 563 (static_cast<uint64_t>(begin_[1]) << 16) | 564 (static_cast<uint64_t>(begin_[2]) << 8) | 565 (static_cast<uint64_t>(begin_[3]) << 0); 566 begin_ += 4; 567 buffer_len_ += 32; 568 } Fill5()569 void Fill5() { 570 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 571 (static_cast<uint64_t>(begin_[1]) << 24) | 572 (static_cast<uint64_t>(begin_[2]) << 16) | 573 (static_cast<uint64_t>(begin_[3]) << 8) | 574 (static_cast<uint64_t>(begin_[4]) << 0); 575 begin_ += 5; 576 buffer_len_ += 40; 577 } Fill6()578 void Fill6() { 579 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 580 (static_cast<uint64_t>(begin_[1]) << 32) | 581 (static_cast<uint64_t>(begin_[2]) << 24) | 582 (static_cast<uint64_t>(begin_[3]) << 16) | 583 (static_cast<uint64_t>(begin_[4]) << 8) | 584 (static_cast<uint64_t>(begin_[5]) << 0); 585 begin_ += 6; 586 buffer_len_ += 48; 587 } Fill7()588 void Fill7() { 589 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 590 (static_cast<uint64_t>(begin_[1]) << 40) | 591 (static_cast<uint64_t>(begin_[2]) << 32) | 592 (static_cast<uint64_t>(begin_[3]) << 24) | 593 (static_cast<uint64_t>(begin_[4]) << 16) | 594 (static_cast<uint64_t>(begin_[5]) << 8) | 595 (static_cast<uint64_t>(begin_[6]) << 0); 596 begin_ += 7; 597 buffer_len_ += 56; 598 } Fill8()599 void Fill8() { 600 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 601 (static_cast<uint64_t>(begin_[1]) << 48) | 602 (static_cast<uint64_t>(begin_[2]) << 40) | 603 (static_cast<uint64_t>(begin_[3]) << 32) | 604 (static_cast<uint64_t>(begin_[4]) << 24) | 605 (static_cast<uint64_t>(begin_[5]) << 16) | 606 (static_cast<uint64_t>(begin_[6]) << 8) | 607 (static_cast<uint64_t>(begin_[7]) << 0); 608 begin_ += 8; 609 buffer_len_ += 64; 610 } Read1to7Bytes()611 bool Read1to7Bytes() { 612 switch (end_ - begin_) { 613 case 0: { 614 return false; 615 } 616 case 1: { 617 Fill1(); 618 return true; 619 } 620 case 2: { 621 Fill2(); 622 return true; 623 } 624 case 3: { 625 Fill3(); 626 return true; 627 } 628 case 4: { 629 Fill4(); 630 return true; 631 } 632 case 5: { 633 Fill5(); 634 return true; 635 } 636 case 6: { 637 Fill6(); 638 return true; 639 } 640 default: { 641 Fill7(); 642 return true; 643 } 644 } 645 } Done0()646 void Done0() { 647 done_ = true; 648 switch (end_ - begin_) {} 649 switch (buffer_len_) { 650 case 1: 651 case 2: 652 case 3: 653 case 4: { 654 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 655 return; 656 } 657 case 5: { 658 const auto index = buffer_ & 31; 659 const auto op = GetOp2(index); 660 switch (op & 3) { 661 case 0: { 662 sink_(GetEmit2(index, (op >> 2) + 0)); 663 break; 664 } 665 case 1: { 666 ok_ = false; 667 break; 668 } 669 } 670 return; 671 } 672 case 6: { 673 const auto index = buffer_ & 63; 674 const auto op = GetOp3(index); 675 switch (op & 3) { 676 case 0: { 677 ok_ = false; 678 break; 679 } 680 case 1: { 681 sink_(GetEmit3(index, (op >> 2) + 0)); 682 break; 683 } 684 } 685 return; 686 } 687 case 7: { 688 const auto index = buffer_ & 127; 689 const auto op = GetOp4(index); 690 switch (op & 3) { 691 case 0: { 692 ok_ = false; 693 break; 694 } 695 case 1: { 696 sink_(GetEmit4(index, (op >> 2) + 0)); 697 break; 698 } 699 } 700 return; 701 } 702 case 0: { 703 return; 704 } 705 } 706 } DecodeStep0()707 void DecodeStep0() { 708 if (!RefillTo2()) { 709 Done1(); 710 return; 711 } 712 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 713 const auto op = GetOp5(index); 714 const int consumed = op & 3; 715 buffer_len_ -= consumed; 716 const auto emit_ofs = op >> 2; 717 sink_(GetEmit5(index, emit_ofs + 0)); 718 } RefillTo2()719 bool RefillTo2() { 720 switch (buffer_len_) { 721 case 0: { 722 return Read1to8Bytes(); 723 } 724 case 1: { 725 return Read1to7Bytes(); 726 } 727 } 728 return true; 729 } Done1()730 void Done1() { 731 done_ = true; 732 switch (buffer_len_) { 733 case 1: 734 case 0: { 735 ok_ = false; 736 return; 737 } 738 } 739 } DecodeStep1()740 void DecodeStep1() { 741 if (!RefillTo12()) { 742 Done2(); 743 return; 744 } 745 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 746 const auto op = GetOp6(index); 747 const int consumed = op & 15; 748 buffer_len_ -= consumed; 749 const auto emit_ofs = op >> 9; 750 switch ((op >> 4) & 31) { 751 case 0: { 752 sink_(GetEmit6(index, emit_ofs + 0)); 753 break; 754 } 755 case 1: { 756 DecodeStep2(); 757 break; 758 } 759 case 2: { 760 DecodeStep3(); 761 break; 762 } 763 case 3: { 764 DecodeStep4(); 765 break; 766 } 767 case 4: { 768 DecodeStep5(); 769 break; 770 } 771 case 5: { 772 DecodeStep6(); 773 break; 774 } 775 case 6: { 776 DecodeStep7(); 777 break; 778 } 779 case 7: { 780 DecodeStep17(); 781 break; 782 } 783 case 8: { 784 DecodeStep8(); 785 break; 786 } 787 case 9: { 788 DecodeStep9(); 789 break; 790 } 791 case 10: { 792 DecodeStep10(); 793 break; 794 } 795 case 11: { 796 DecodeStep11(); 797 break; 798 } 799 case 12: { 800 DecodeStep12(); 801 break; 802 } 803 case 13: { 804 DecodeStep13(); 805 break; 806 } 807 case 14: { 808 DecodeStep14(); 809 break; 810 } 811 case 15: { 812 DecodeStep15(); 813 break; 814 } 815 case 16: { 816 DecodeStep16(); 817 break; 818 } 819 case 17: { 820 DecodeStep18(); 821 break; 822 } 823 case 18: { 824 DecodeStep19(); 825 break; 826 } 827 } 828 } RefillTo12()829 bool RefillTo12() { 830 switch (buffer_len_) { 831 case 0: { 832 return Read2to8Bytes(); 833 } 834 case 1: 835 case 2: 836 case 3: { 837 return Read2to7Bytes(); 838 } 839 case 4: 840 case 5: 841 case 6: 842 case 7: 843 case 8: { 844 return Read1to7Bytes(); 845 } 846 case 9: 847 case 10: 848 case 11: { 849 return Read1to6Bytes(); 850 } 851 } 852 return true; 853 } Read2to8Bytes()854 bool Read2to8Bytes() { 855 switch (end_ - begin_) { 856 case 0: 857 case 1: { 858 return false; 859 } 860 case 2: { 861 Fill2(); 862 return true; 863 } 864 case 3: { 865 Fill3(); 866 return true; 867 } 868 case 4: { 869 Fill4(); 870 return true; 871 } 872 case 5: { 873 Fill5(); 874 return true; 875 } 876 case 6: { 877 Fill6(); 878 return true; 879 } 880 case 7: { 881 Fill7(); 882 return true; 883 } 884 default: { 885 Fill8(); 886 return true; 887 } 888 } 889 } Read2to7Bytes()890 bool Read2to7Bytes() { 891 switch (end_ - begin_) { 892 case 0: 893 case 1: { 894 return false; 895 } 896 case 2: { 897 Fill2(); 898 return true; 899 } 900 case 3: { 901 Fill3(); 902 return true; 903 } 904 case 4: { 905 Fill4(); 906 return true; 907 } 908 case 5: { 909 Fill5(); 910 return true; 911 } 912 case 6: { 913 Fill6(); 914 return true; 915 } 916 default: { 917 Fill7(); 918 return true; 919 } 920 } 921 } Read1to6Bytes()922 bool Read1to6Bytes() { 923 switch (end_ - begin_) { 924 case 0: { 925 return false; 926 } 927 case 1: { 928 Fill1(); 929 return true; 930 } 931 case 2: { 932 Fill2(); 933 return true; 934 } 935 case 3: { 936 Fill3(); 937 return true; 938 } 939 case 4: { 940 Fill4(); 941 return true; 942 } 943 case 5: { 944 Fill5(); 945 return true; 946 } 947 default: { 948 Fill6(); 949 return true; 950 } 951 } 952 } Done2()953 void Done2() { 954 done_ = true; 955 switch (end_ - begin_) { 956 case 1: { 957 Fill1(); 958 break; 959 } 960 } 961 switch (buffer_len_) { 962 case 1: { 963 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 964 return; 965 } 966 case 2: { 967 const auto index = buffer_ & 3; 968 const auto op = GetOp7(index); 969 switch (op & 3) { 970 case 0: { 971 sink_(GetEmit7(index, (op >> 2) + 0)); 972 break; 973 } 974 case 1: { 975 ok_ = false; 976 break; 977 } 978 } 979 return; 980 } 981 case 3: { 982 const auto index = buffer_ & 7; 983 const auto op = GetOp8(index); 984 switch (op & 3) { 985 case 0: { 986 ok_ = false; 987 break; 988 } 989 case 1: { 990 sink_(GetEmit8(index, (op >> 2) + 0)); 991 break; 992 } 993 } 994 return; 995 } 996 case 4: { 997 const auto index = buffer_ & 15; 998 const auto op = GetOp9(index); 999 switch (op & 3) { 1000 case 0: { 1001 ok_ = false; 1002 break; 1003 } 1004 case 1: { 1005 sink_(GetEmit9(index, (op >> 2) + 0)); 1006 break; 1007 } 1008 } 1009 return; 1010 } 1011 case 5: { 1012 const auto index = buffer_ & 31; 1013 const auto op = GetOp10(index); 1014 switch (op & 3) { 1015 case 0: { 1016 ok_ = false; 1017 break; 1018 } 1019 case 1: { 1020 sink_(GetEmit10(index, (op >> 2) + 0)); 1021 break; 1022 } 1023 } 1024 return; 1025 } 1026 case 6: { 1027 const auto index = buffer_ & 63; 1028 const auto op = GetOp11(index); 1029 switch (op & 3) { 1030 case 0: { 1031 ok_ = false; 1032 break; 1033 } 1034 case 1: { 1035 sink_(GetEmit11(index, (op >> 2) + 0)); 1036 break; 1037 } 1038 } 1039 return; 1040 } 1041 case 7: { 1042 const auto index = buffer_ & 127; 1043 const auto op = GetOp12(index); 1044 switch (op & 3) { 1045 case 0: { 1046 sink_(GetEmit12(index, (op >> 2) + 0)); 1047 sink_(GetEmit12(index, (op >> 2) + 1)); 1048 break; 1049 } 1050 case 1: { 1051 ok_ = false; 1052 break; 1053 } 1054 case 2: { 1055 sink_(GetEmit12(index, (op >> 2) + 0)); 1056 break; 1057 } 1058 } 1059 return; 1060 } 1061 case 8: { 1062 const auto index = buffer_ & 255; 1063 const auto op = GetOp13(index); 1064 switch (op & 3) { 1065 case 0: { 1066 ok_ = false; 1067 break; 1068 } 1069 case 1: { 1070 sink_(GetEmit13(index, (op >> 2) + 0)); 1071 sink_(GetEmit13(index, (op >> 2) + 1)); 1072 break; 1073 } 1074 case 2: { 1075 sink_(GetEmit13(index, (op >> 2) + 0)); 1076 break; 1077 } 1078 } 1079 return; 1080 } 1081 case 9: { 1082 const auto index = buffer_ & 511; 1083 const auto op = GetOp14(index); 1084 switch (op & 3) { 1085 case 0: { 1086 ok_ = false; 1087 break; 1088 } 1089 case 1: { 1090 sink_(GetEmit14(index, (op >> 2) + 0)); 1091 sink_(GetEmit14(index, (op >> 2) + 1)); 1092 break; 1093 } 1094 case 2: { 1095 sink_(GetEmit14(index, (op >> 2) + 0)); 1096 break; 1097 } 1098 } 1099 return; 1100 } 1101 case 10: { 1102 const auto index = buffer_ & 1023; 1103 const auto op = GetOp15(index); 1104 switch (op & 3) { 1105 case 0: { 1106 ok_ = false; 1107 break; 1108 } 1109 case 1: { 1110 sink_(GetEmit15(index, (op >> 2) + 0)); 1111 sink_(GetEmit15(index, (op >> 2) + 1)); 1112 break; 1113 } 1114 case 2: { 1115 sink_(GetEmit15(index, (op >> 2) + 0)); 1116 break; 1117 } 1118 } 1119 return; 1120 } 1121 case 11: { 1122 const auto index = buffer_ & 2047; 1123 const auto op = GetOp16(index); 1124 switch (op & 3) { 1125 case 0: { 1126 ok_ = false; 1127 break; 1128 } 1129 case 1: { 1130 sink_(GetEmit16(index, (op >> 2) + 0)); 1131 sink_(GetEmit16(index, (op >> 2) + 1)); 1132 break; 1133 } 1134 case 2: { 1135 sink_(GetEmit16(index, (op >> 2) + 0)); 1136 break; 1137 } 1138 } 1139 return; 1140 } 1141 case 0: { 1142 return; 1143 } 1144 } 1145 } DecodeStep2()1146 void DecodeStep2() { 1147 if (!RefillTo1()) { 1148 Done3(); 1149 return; 1150 } 1151 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1152 const auto op = GetOp17(index); 1153 const int consumed = op & 1; 1154 buffer_len_ -= consumed; 1155 const auto emit_ofs = op >> 1; 1156 sink_(GetEmit17(index, emit_ofs + 0)); 1157 } RefillTo1()1158 bool RefillTo1() { 1159 switch (buffer_len_) { 1160 case 0: { 1161 return Read1to8Bytes(); 1162 } 1163 } 1164 return true; 1165 } Done3()1166 void Done3() { 1167 done_ = true; 1168 ok_ = false; 1169 } DecodeStep3()1170 void DecodeStep3() { 1171 if (!RefillTo1()) { 1172 Done4(); 1173 return; 1174 } 1175 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1176 const auto op = GetOp18(index); 1177 const int consumed = op & 1; 1178 buffer_len_ -= consumed; 1179 const auto emit_ofs = op >> 1; 1180 sink_(GetEmit18(index, emit_ofs + 0)); 1181 } Done4()1182 void Done4() { 1183 done_ = true; 1184 ok_ = false; 1185 } DecodeStep4()1186 void DecodeStep4() { 1187 if (!RefillTo1()) { 1188 Done5(); 1189 return; 1190 } 1191 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1192 const auto op = GetOp19(index); 1193 const int consumed = op & 1; 1194 buffer_len_ -= consumed; 1195 const auto emit_ofs = op >> 1; 1196 sink_(GetEmit19(index, emit_ofs + 0)); 1197 } Done5()1198 void Done5() { 1199 done_ = true; 1200 ok_ = false; 1201 } DecodeStep5()1202 void DecodeStep5() { 1203 if (!RefillTo1()) { 1204 Done6(); 1205 return; 1206 } 1207 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1208 const auto op = GetOp20(index); 1209 const int consumed = op & 1; 1210 buffer_len_ -= consumed; 1211 const auto emit_ofs = op >> 1; 1212 sink_(GetEmit20(index, emit_ofs + 0)); 1213 } Done6()1214 void Done6() { 1215 done_ = true; 1216 ok_ = false; 1217 } DecodeStep6()1218 void DecodeStep6() { 1219 if (!RefillTo1()) { 1220 Done7(); 1221 return; 1222 } 1223 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1224 const auto op = GetOp21(index); 1225 const int consumed = op & 1; 1226 buffer_len_ -= consumed; 1227 const auto emit_ofs = op >> 1; 1228 sink_(GetEmit21(index, emit_ofs + 0)); 1229 } Done7()1230 void Done7() { 1231 done_ = true; 1232 ok_ = false; 1233 } DecodeStep7()1234 void DecodeStep7() { 1235 if (!RefillTo1()) { 1236 Done8(); 1237 return; 1238 } 1239 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1240 const auto op = GetOp22(index); 1241 const int consumed = op & 1; 1242 buffer_len_ -= consumed; 1243 const auto emit_ofs = op >> 1; 1244 sink_(GetEmit22(index, emit_ofs + 0)); 1245 } Done8()1246 void Done8() { 1247 done_ = true; 1248 ok_ = false; 1249 } DecodeStep8()1250 void DecodeStep8() { 1251 if (!RefillTo2()) { 1252 Done9(); 1253 return; 1254 } 1255 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1256 const auto op = GetOp23(index); 1257 const int consumed = op & 3; 1258 buffer_len_ -= consumed; 1259 const auto emit_ofs = op >> 2; 1260 sink_(GetEmit23(index, emit_ofs + 0)); 1261 } Done9()1262 void Done9() { 1263 done_ = true; 1264 switch (buffer_len_) { 1265 case 1: 1266 case 0: { 1267 ok_ = false; 1268 return; 1269 } 1270 } 1271 } DecodeStep9()1272 void DecodeStep9() { 1273 if (!RefillTo2()) { 1274 Done10(); 1275 return; 1276 } 1277 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1278 const auto op = GetOp24(index); 1279 const int consumed = op & 3; 1280 buffer_len_ -= consumed; 1281 const auto emit_ofs = op >> 2; 1282 sink_(GetEmit24(index, emit_ofs + 0)); 1283 } Done10()1284 void Done10() { 1285 done_ = true; 1286 switch (buffer_len_) { 1287 case 1: 1288 case 0: { 1289 ok_ = false; 1290 return; 1291 } 1292 } 1293 } DecodeStep10()1294 void DecodeStep10() { 1295 if (!RefillTo2()) { 1296 Done11(); 1297 return; 1298 } 1299 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1300 const auto op = GetOp25(index); 1301 const int consumed = op & 3; 1302 buffer_len_ -= consumed; 1303 const auto emit_ofs = op >> 2; 1304 sink_(GetEmit25(index, emit_ofs + 0)); 1305 } Done11()1306 void Done11() { 1307 done_ = true; 1308 switch (buffer_len_) { 1309 case 1: 1310 case 0: { 1311 ok_ = false; 1312 return; 1313 } 1314 } 1315 } DecodeStep11()1316 void DecodeStep11() { 1317 if (!RefillTo2()) { 1318 Done12(); 1319 return; 1320 } 1321 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1322 const auto op = GetOp26(index); 1323 const int consumed = op & 3; 1324 buffer_len_ -= consumed; 1325 const auto emit_ofs = op >> 2; 1326 sink_(GetEmit26(index, emit_ofs + 0)); 1327 } Done12()1328 void Done12() { 1329 done_ = true; 1330 switch (buffer_len_) { 1331 case 1: 1332 case 0: { 1333 ok_ = false; 1334 return; 1335 } 1336 } 1337 } DecodeStep12()1338 void DecodeStep12() { 1339 if (!RefillTo2()) { 1340 Done13(); 1341 return; 1342 } 1343 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1344 const auto op = GetOp27(index); 1345 const int consumed = op & 3; 1346 buffer_len_ -= consumed; 1347 const auto emit_ofs = op >> 2; 1348 sink_(GetEmit27(index, emit_ofs + 0)); 1349 } Done13()1350 void Done13() { 1351 done_ = true; 1352 switch (buffer_len_) { 1353 case 1: 1354 case 0: { 1355 ok_ = false; 1356 return; 1357 } 1358 } 1359 } DecodeStep13()1360 void DecodeStep13() { 1361 if (!RefillTo2()) { 1362 Done14(); 1363 return; 1364 } 1365 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1366 const auto op = GetOp28(index); 1367 const int consumed = op & 3; 1368 buffer_len_ -= consumed; 1369 const auto emit_ofs = op >> 2; 1370 sink_(GetEmit28(index, emit_ofs + 0)); 1371 } Done14()1372 void Done14() { 1373 done_ = true; 1374 switch (buffer_len_) { 1375 case 1: 1376 case 0: { 1377 ok_ = false; 1378 return; 1379 } 1380 } 1381 } DecodeStep14()1382 void DecodeStep14() { 1383 if (!RefillTo3()) { 1384 Done15(); 1385 return; 1386 } 1387 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1388 const auto op = GetOp29(index); 1389 const int consumed = op & 3; 1390 buffer_len_ -= consumed; 1391 const auto emit_ofs = op >> 2; 1392 sink_(GetEmit29(index, emit_ofs + 0)); 1393 } RefillTo3()1394 bool RefillTo3() { 1395 switch (buffer_len_) { 1396 case 0: { 1397 return Read1to8Bytes(); 1398 } 1399 case 1: 1400 case 2: { 1401 return Read1to7Bytes(); 1402 } 1403 } 1404 return true; 1405 } Done15()1406 void Done15() { 1407 done_ = true; 1408 switch (buffer_len_) { 1409 case 1: 1410 case 2: 1411 case 0: { 1412 ok_ = false; 1413 return; 1414 } 1415 } 1416 } DecodeStep15()1417 void DecodeStep15() { 1418 if (!RefillTo3()) { 1419 Done16(); 1420 return; 1421 } 1422 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1423 const auto op = GetOp30(index); 1424 const int consumed = op & 3; 1425 buffer_len_ -= consumed; 1426 const auto emit_ofs = op >> 2; 1427 sink_(GetEmit30(index, emit_ofs + 0)); 1428 } Done16()1429 void Done16() { 1430 done_ = true; 1431 switch (buffer_len_) { 1432 case 1: 1433 case 2: 1434 case 0: { 1435 ok_ = false; 1436 return; 1437 } 1438 } 1439 } DecodeStep16()1440 void DecodeStep16() { 1441 if (!RefillTo3()) { 1442 Done17(); 1443 return; 1444 } 1445 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1446 const auto op = GetOp31(index); 1447 const int consumed = op & 3; 1448 buffer_len_ -= consumed; 1449 const auto emit_ofs = op >> 2; 1450 sink_(GetEmit31(index, emit_ofs + 0)); 1451 } Done17()1452 void Done17() { 1453 done_ = true; 1454 switch (buffer_len_) { 1455 case 1: 1456 case 2: 1457 case 0: { 1458 ok_ = false; 1459 return; 1460 } 1461 } 1462 } DecodeStep17()1463 void DecodeStep17() { 1464 if (!RefillTo2()) { 1465 Done18(); 1466 return; 1467 } 1468 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1469 const auto op = GetOp32(index); 1470 const int consumed = op & 3; 1471 buffer_len_ -= consumed; 1472 const auto emit_ofs = op >> 2; 1473 sink_(GetEmit32(index, emit_ofs + 0)); 1474 } Done18()1475 void Done18() { 1476 done_ = true; 1477 switch (buffer_len_) { 1478 case 1: { 1479 const auto index = buffer_ & 1; 1480 const auto op = GetOp33(index); 1481 switch (op & 1) { 1482 case 0: { 1483 sink_(GetEmit33(index, (op >> 1) + 0)); 1484 break; 1485 } 1486 case 1: { 1487 ok_ = false; 1488 break; 1489 } 1490 } 1491 return; 1492 } 1493 case 0: { 1494 ok_ = false; 1495 return; 1496 } 1497 } 1498 } DecodeStep18()1499 void DecodeStep18() { 1500 if (!RefillTo4()) { 1501 Done19(); 1502 return; 1503 } 1504 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1505 const auto op = GetOp34(index); 1506 const int consumed = op & 7; 1507 buffer_len_ -= consumed; 1508 const auto emit_ofs = op >> 3; 1509 sink_(GetEmit34(index, emit_ofs + 0)); 1510 } RefillTo4()1511 bool RefillTo4() { 1512 switch (buffer_len_) { 1513 case 0: { 1514 return Read1to8Bytes(); 1515 } 1516 case 1: 1517 case 2: 1518 case 3: { 1519 return Read1to7Bytes(); 1520 } 1521 } 1522 return true; 1523 } Done19()1524 void Done19() { 1525 done_ = true; 1526 switch (buffer_len_) { 1527 case 1: 1528 case 2: 1529 case 0: { 1530 ok_ = false; 1531 return; 1532 } 1533 case 3: { 1534 const auto index = buffer_ & 7; 1535 const auto op = GetOp35(index); 1536 switch (op & 1) { 1537 case 0: { 1538 sink_(GetEmit35(index, (op >> 1) + 0)); 1539 break; 1540 } 1541 case 1: { 1542 ok_ = false; 1543 break; 1544 } 1545 } 1546 return; 1547 } 1548 } 1549 } DecodeStep19()1550 void DecodeStep19() { 1551 if (!RefillTo10()) { 1552 Done20(); 1553 return; 1554 } 1555 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 1556 const auto op = GetOp36(index); 1557 const int consumed = op & 15; 1558 buffer_len_ -= consumed; 1559 const auto emit_ofs = op >> 5; 1560 switch ((op >> 4) & 1) { 1561 case 0: { 1562 sink_(GetEmit36(index, emit_ofs + 0)); 1563 break; 1564 } 1565 case 1: { 1566 begin_ = end_; 1567 buffer_len_ = 0; 1568 break; 1569 } 1570 } 1571 } RefillTo10()1572 bool RefillTo10() { 1573 switch (buffer_len_) { 1574 case 0: { 1575 return Read2to8Bytes(); 1576 } 1577 case 1: { 1578 return Read2to7Bytes(); 1579 } 1580 case 2: 1581 case 3: 1582 case 4: 1583 case 5: 1584 case 6: 1585 case 7: 1586 case 8: { 1587 return Read1to7Bytes(); 1588 } 1589 case 9: { 1590 return Read1to6Bytes(); 1591 } 1592 } 1593 return true; 1594 } Done20()1595 void Done20() { 1596 done_ = true; 1597 switch (end_ - begin_) { 1598 case 1: { 1599 Fill1(); 1600 break; 1601 } 1602 } 1603 switch (buffer_len_) { 1604 case 1: 1605 case 2: 1606 case 3: { 1607 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1608 return; 1609 } 1610 case 4: { 1611 const auto index = buffer_ & 15; 1612 const auto op = GetOp37(index); 1613 switch (op & 3) { 1614 case 0: { 1615 sink_(GetEmit37(index, (op >> 2) + 0)); 1616 break; 1617 } 1618 case 1: { 1619 ok_ = false; 1620 break; 1621 } 1622 } 1623 return; 1624 } 1625 case 5: { 1626 const auto index = buffer_ & 31; 1627 const auto op = GetOp38(index); 1628 switch (op & 3) { 1629 case 0: { 1630 ok_ = false; 1631 break; 1632 } 1633 case 1: { 1634 sink_(GetEmit38(index, (op >> 2) + 0)); 1635 break; 1636 } 1637 } 1638 return; 1639 } 1640 case 6: { 1641 const auto index = buffer_ & 63; 1642 const auto op = GetOp39(index); 1643 switch (op & 3) { 1644 case 0: { 1645 ok_ = false; 1646 break; 1647 } 1648 case 1: { 1649 sink_(GetEmit39(index, (op >> 2) + 0)); 1650 break; 1651 } 1652 } 1653 return; 1654 } 1655 case 7: { 1656 const auto index = buffer_ & 127; 1657 const auto op = GetOp40(index); 1658 switch (op & 3) { 1659 case 0: { 1660 ok_ = false; 1661 break; 1662 } 1663 case 1: { 1664 sink_(GetEmit40(index, (op >> 2) + 0)); 1665 break; 1666 } 1667 } 1668 return; 1669 } 1670 case 8: { 1671 const auto index = buffer_ & 255; 1672 const auto op = GetOp41(index); 1673 switch (op & 3) { 1674 case 0: { 1675 ok_ = false; 1676 break; 1677 } 1678 case 1: { 1679 sink_(GetEmit41(index, (op >> 2) + 0)); 1680 break; 1681 } 1682 } 1683 return; 1684 } 1685 case 9: { 1686 const auto index = buffer_ & 511; 1687 const auto op = GetOp42(index); 1688 switch (op & 3) { 1689 case 0: { 1690 sink_(GetEmit42(index, (op >> 2) + 0)); 1691 sink_(GetEmit42(index, (op >> 2) + 1)); 1692 break; 1693 } 1694 case 1: { 1695 ok_ = false; 1696 break; 1697 } 1698 case 2: { 1699 sink_(GetEmit42(index, (op >> 2) + 0)); 1700 break; 1701 } 1702 } 1703 return; 1704 } 1705 case 0: { 1706 return; 1707 } 1708 } 1709 } 1710 F sink_; 1711 const uint8_t* begin_; 1712 const uint8_t* const end_; 1713 uint64_t buffer_ = 0; 1714 int buffer_len_ = 0; 1715 bool ok_ = true; 1716 bool done_ = false; 1717 }; 1718 } // namespace geometry_8_12_10 1719 } // namespace grpc_core 1720 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_12_10_H 1721