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