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