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