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