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