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