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