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_12_12_6_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_12_6_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_12_12_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 } GetOp8(size_t i)60 static inline uint64_t GetOp8(size_t i) { 61 return table8_inner_[i >> 6][table8_outer_[i >> 6][i & 0x3f]]; 62 } GetEmit8(size_t i,size_t emit)63 static inline uint64_t GetEmit8(size_t i, size_t emit) { 64 return table8_emit_[i >> 6][emit]; 65 } GetOp1(size_t i)66 static inline uint64_t GetOp1(size_t i) { 67 return table1_inner_[i >> 7][table1_outer_[i >> 7][i & 0x7f]]; 68 } GetEmit1(size_t i,size_t emit)69 static inline uint64_t GetEmit1(size_t i, size_t emit) { 70 return table1_emit_[i >> 7][emit]; 71 } GetOp9(size_t i)72 static inline uint64_t GetOp9(size_t i) { return i ? 3 : 1; } GetEmit9(size_t,size_t emit)73 static inline uint64_t GetEmit9(size_t, size_t emit) { return emit ? 36 : 0; } GetOp10(size_t i)74 static inline uint64_t GetOp10(size_t i) { return i ? 3 : 1; } GetEmit10(size_t,size_t emit)75 static inline uint64_t GetEmit10(size_t, size_t emit) { 76 return emit ? 91 : 64; 77 } GetOp11(size_t i)78 static inline uint64_t GetOp11(size_t i) { return i ? 3 : 1; } GetEmit11(size_t,size_t emit)79 static inline uint64_t GetEmit11(size_t, size_t emit) { 80 return emit ? 126 : 93; 81 } GetOp13(size_t i)82 static inline uint64_t GetOp13(size_t i) { 83 return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1)); 84 } GetEmit13(size_t,size_t emit)85 static inline uint64_t GetEmit13(size_t, size_t emit) { 86 return emit ? 125 : 94; 87 } GetOp14(size_t i)88 static inline uint64_t GetOp14(size_t i) { 89 return table14_0_inner_[table14_0_outer_[i]]; 90 } GetEmit14(size_t,size_t emit)91 static inline uint64_t GetEmit14(size_t, size_t emit) { 92 return table14_0_emit_[emit]; 93 } GetOp15(size_t i)94 static inline uint64_t GetOp15(size_t i) { 95 return table14_0_inner_[table15_0_outer_[i]]; 96 } GetEmit15(size_t,size_t emit)97 static inline uint64_t GetEmit15(size_t, size_t emit) { 98 return table14_0_emit_[emit]; 99 } GetOp16(size_t i)100 static inline uint64_t GetOp16(size_t i) { return table16_0_ops_[i]; } GetEmit16(size_t,size_t emit)101 static inline uint64_t GetEmit16(size_t, size_t emit) { 102 return table14_0_emit_[emit]; 103 } GetOp17(size_t i)104 static inline uint64_t GetOp17(size_t i) { return table17_0_ops_[i]; } GetEmit17(size_t,size_t emit)105 static inline uint64_t GetEmit17(size_t, size_t emit) { 106 return table14_0_emit_[emit]; 107 } GetOp18(size_t i)108 static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; } GetEmit18(size_t,size_t emit)109 static inline uint64_t GetEmit18(size_t, size_t emit) { 110 return table18_0_emit_[emit]; 111 } GetOp19(size_t i)112 static inline uint64_t GetOp19(size_t i) { 113 return table19_ops_[i >> 5][i & 0x1f]; 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 >> 5][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 >> 7][i & 0x7f]; 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 >> 7][emit]; 129 } GetOp22(size_t i)130 static inline uint64_t GetOp22(size_t i) { 131 return table22_ops_[i >> 7][i & 0x7f]; 132 } GetEmit22(size_t i,size_t emit)133 static inline uint64_t GetEmit22(size_t i, size_t emit) { 134 return table22_emit_[i >> 7][emit]; 135 } GetOp12(size_t i)136 static inline uint64_t GetOp12(size_t i) { 137 return table12_ops_[i >> 8][i & 0xff]; 138 } GetEmit12(size_t i,size_t emit)139 static inline uint64_t GetEmit12(size_t i, size_t emit) { 140 return table12_emit_[i >> 8][emit]; 141 } GetOp23(size_t i)142 static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; } GetEmit23(size_t,size_t emit)143 static inline uint64_t GetEmit23(size_t, size_t emit) { 144 return emit ? 207 : 199; 145 } GetOp24(size_t i)146 static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; } GetEmit24(size_t,size_t emit)147 static inline uint64_t GetEmit24(size_t, size_t emit) { return emit + 234; } GetOp25(size_t i)148 static inline uint64_t GetOp25(size_t i) { 149 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 150 } GetEmit25(size_t,size_t emit)151 static inline uint64_t GetEmit25(size_t, size_t emit) { 152 return (emit < 2 ? (emit + 192) : ((emit - 2) + 200)); 153 } GetOp26(size_t i)154 static inline uint64_t GetOp26(size_t i) { 155 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 156 } GetEmit26(size_t,size_t emit)157 static inline uint64_t GetEmit26(size_t, size_t emit) { 158 return (emit < 2 ? (emit ? 205 : 202) : ((emit - 2) ? 213 : 210)); 159 } GetOp27(size_t i)160 static inline uint64_t GetOp27(size_t i) { 161 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 162 } GetEmit27(size_t,size_t emit)163 static inline uint64_t GetEmit27(size_t, size_t emit) { 164 return (emit < 2 ? (emit + 218) : ((emit - 2) ? 240 : 238)); 165 } GetOp28(size_t i)166 static inline uint64_t GetOp28(size_t i) { return table28_0_inner_[i]; } GetEmit28(size_t,size_t emit)167 static inline uint64_t GetEmit28(size_t, size_t emit) { 168 return table28_0_emit_[emit]; 169 } GetOp29(size_t i)170 static inline uint64_t GetOp29(size_t i) { return table28_0_inner_[i]; } GetEmit29(size_t,size_t emit)171 static inline uint64_t GetEmit29(size_t, size_t emit) { 172 return (emit < 4 ? (emit + 245) : ((emit - 4) + 250)); 173 } GetOp31(size_t i)174 static inline uint64_t GetOp31(size_t i) { 175 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 176 } GetEmit31(size_t,size_t emit)177 static inline uint64_t GetEmit31(size_t, size_t emit) { 178 return ((void)emit, 254); 179 } GetOp30(size_t i)180 static inline uint64_t GetOp30(size_t i) { 181 return table30_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 182 } GetEmit30(size_t,size_t emit)183 static inline uint64_t GetEmit30(size_t, size_t emit) { 184 return table30_0_emit_[emit]; 185 } GetOp33(size_t i)186 static inline uint64_t GetOp33(size_t i) { 187 return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4)); 188 } GetEmit33(size_t,size_t emit)189 static inline uint64_t GetEmit33(size_t, size_t emit) { 190 return (emit < 1 ? (((void)emit, 242)) : ((emit - 1) ? 255 : 243)); 191 } GetOp32(size_t i)192 static inline uint64_t GetOp32(size_t i) { 193 return table32_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))]; 194 } GetEmit32(size_t,size_t emit)195 static inline uint64_t GetEmit32(size_t, size_t emit) { 196 return table32_0_emit_[emit]; 197 } GetOp35(size_t i)198 static inline uint64_t GetOp35(size_t i) { return table35_0_inner_[i]; } GetEmit35(size_t,size_t emit)199 static inline uint64_t GetEmit35(size_t, size_t emit) { 200 return table35_0_emit_[emit]; 201 } GetOp36(size_t i)202 static inline uint64_t GetOp36(size_t i) { return table36_0_ops_[i]; } GetEmit36(size_t,size_t emit)203 static inline uint64_t GetEmit36(size_t, size_t emit) { 204 return table35_0_emit_[emit]; 205 } GetOp34(size_t i)206 static inline uint64_t GetOp34(size_t i) { 207 return table34_ops_[i >> 5][i & 0x1f]; 208 } GetEmit34(size_t i,size_t emit)209 static inline uint64_t GetEmit34(size_t i, size_t emit) { 210 return table34_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 table8_0_emit_[71]; 270 static const uint16_t table8_0_inner_[38]; 271 static const uint8_t table8_0_outer_[64]; 272 static const uint8_t table8_1_emit_[71]; 273 static const uint16_t table8_1_inner_[38]; 274 static const uint8_t table8_2_emit_[71]; 275 static const uint16_t table8_2_inner_[38]; 276 static const uint8_t table8_3_emit_[71]; 277 static const uint16_t table8_3_inner_[38]; 278 static const uint8_t table8_4_emit_[71]; 279 static const uint16_t table8_4_inner_[38]; 280 static const uint8_t table8_5_emit_[71]; 281 static const uint16_t table8_5_inner_[38]; 282 static const uint8_t table8_6_emit_[71]; 283 static const uint16_t table8_6_inner_[38]; 284 static const uint8_t table8_7_emit_[71]; 285 static const uint16_t table8_7_inner_[38]; 286 static const uint8_t table8_8_emit_[71]; 287 static const uint16_t table8_8_inner_[38]; 288 static const uint8_t table8_9_emit_[71]; 289 static const uint16_t table8_9_inner_[38]; 290 static const uint8_t table8_10_emit_[40]; 291 static const uint16_t table8_10_inner_[23]; 292 static const uint8_t table8_10_outer_[64]; 293 static const uint8_t table8_11_emit_[40]; 294 static const uint8_t table8_12_emit_[40]; 295 static const uint8_t table8_13_emit_[40]; 296 static const uint8_t table8_14_emit_[40]; 297 static const uint8_t table8_15_emit_[40]; 298 static const uint8_t table8_16_emit_[40]; 299 static const uint8_t table8_17_emit_[40]; 300 static const uint8_t table8_18_emit_[40]; 301 static const uint8_t table8_19_emit_[40]; 302 static const uint8_t table8_20_emit_[40]; 303 static const uint8_t table8_21_emit_[40]; 304 static const uint8_t table8_22_emit_[40]; 305 static const uint8_t table8_23_emit_[4]; 306 static const uint16_t table8_23_inner_[5]; 307 static const uint8_t table8_23_outer_[64]; 308 static const uint8_t table8_24_emit_[4]; 309 static const uint8_t table8_25_emit_[4]; 310 static const uint8_t table8_26_emit_[4]; 311 static const uint8_t table8_27_emit_[4]; 312 static const uint8_t table8_28_emit_[4]; 313 static const uint8_t table8_29_emit_[4]; 314 static const uint8_t table8_30_emit_[4]; 315 static const uint8_t table8_31_emit_[14]; 316 static const uint16_t table8_31_inner_[16]; 317 static const uint8_t table8_31_outer_[64]; 318 static const uint8_t* const table8_emit_[32]; 319 static const uint16_t* const table8_inner_[32]; 320 static const uint8_t* const table8_outer_[32]; 321 static const uint8_t table1_0_emit_[135]; 322 static const uint16_t table1_0_inner_[69]; 323 static const uint8_t table1_0_outer_[128]; 324 static const uint8_t table1_1_emit_[135]; 325 static const uint16_t table1_1_inner_[69]; 326 static const uint8_t table1_2_emit_[135]; 327 static const uint16_t table1_2_inner_[69]; 328 static const uint8_t table1_3_emit_[135]; 329 static const uint16_t table1_3_inner_[69]; 330 static const uint8_t table1_4_emit_[135]; 331 static const uint16_t table1_4_inner_[69]; 332 static const uint8_t table1_5_emit_[135]; 333 static const uint16_t table1_5_inner_[69]; 334 static const uint8_t table1_6_emit_[135]; 335 static const uint16_t table1_6_inner_[69]; 336 static const uint8_t table1_7_emit_[135]; 337 static const uint16_t table1_7_inner_[69]; 338 static const uint8_t table1_8_emit_[135]; 339 static const uint16_t table1_8_inner_[69]; 340 static const uint8_t table1_9_emit_[135]; 341 static const uint16_t table1_9_inner_[69]; 342 static const uint8_t table1_10_emit_[140]; 343 static const uint16_t table1_10_inner_[74]; 344 static const uint8_t table1_10_outer_[128]; 345 static const uint8_t table1_11_emit_[140]; 346 static const uint16_t table1_11_inner_[74]; 347 static const uint8_t table1_12_emit_[140]; 348 static const uint16_t table1_12_inner_[74]; 349 static const uint8_t table1_13_emit_[140]; 350 static const uint16_t table1_13_inner_[74]; 351 static const uint8_t table1_14_emit_[140]; 352 static const uint16_t table1_14_inner_[74]; 353 static const uint8_t table1_15_emit_[140]; 354 static const uint16_t table1_15_inner_[74]; 355 static const uint8_t table1_16_emit_[140]; 356 static const uint16_t table1_16_inner_[74]; 357 static const uint8_t table1_17_emit_[140]; 358 static const uint16_t table1_17_inner_[74]; 359 static const uint8_t table1_18_emit_[140]; 360 static const uint16_t table1_18_inner_[74]; 361 static const uint8_t table1_19_emit_[140]; 362 static const uint16_t table1_19_inner_[74]; 363 static const uint8_t table1_20_emit_[140]; 364 static const uint16_t table1_20_inner_[74]; 365 static const uint8_t table1_21_emit_[140]; 366 static const uint16_t table1_21_inner_[74]; 367 static const uint8_t table1_22_emit_[142]; 368 static const uint16_t table1_22_inner_[74]; 369 static const uint8_t table1_23_emit_[80]; 370 static const uint16_t table1_23_inner_[44]; 371 static const uint8_t table1_23_outer_[128]; 372 static const uint8_t table1_24_emit_[80]; 373 static const uint8_t table1_25_emit_[80]; 374 static const uint8_t table1_26_emit_[80]; 375 static const uint8_t table1_27_emit_[80]; 376 static const uint8_t table1_28_emit_[80]; 377 static const uint8_t table1_29_emit_[80]; 378 static const uint8_t table1_30_emit_[80]; 379 static const uint8_t table1_31_emit_[16]; 380 static const uint16_t table1_31_inner_[20]; 381 static const uint8_t table1_31_outer_[128]; 382 static const uint8_t* const table1_emit_[32]; 383 static const uint16_t* const table1_inner_[32]; 384 static const uint8_t* const table1_outer_[32]; 385 static const uint8_t table14_0_emit_[5]; 386 static const uint8_t table14_0_inner_[7]; 387 static const uint8_t table14_0_outer_[8]; 388 static const uint8_t table15_0_outer_[16]; 389 static const uint8_t table16_0_ops_[32]; 390 static const uint8_t table17_0_ops_[64]; 391 static const uint8_t table18_0_emit_[46]; 392 static const uint8_t table18_0_ops_[128]; 393 static const uint8_t table19_0_emit_[44]; 394 static const uint8_t table19_0_ops_[32]; 395 static const uint8_t table19_1_emit_[28]; 396 static const uint8_t table19_1_ops_[32]; 397 static const uint8_t table19_2_emit_[44]; 398 static const uint8_t table19_3_emit_[28]; 399 static const uint8_t table19_4_emit_[20]; 400 static const uint8_t table19_4_ops_[32]; 401 static const uint8_t table19_5_emit_[20]; 402 static const uint8_t table19_6_emit_[20]; 403 static const uint8_t table19_7_emit_[11]; 404 static const uint8_t table19_7_ops_[32]; 405 static const uint8_t* const table19_emit_[8]; 406 static const uint8_t* const table19_ops_[8]; 407 static const uint16_t table20_0_ops_[64]; 408 static const uint8_t table20_1_emit_[92]; 409 static const uint16_t table20_1_ops_[64]; 410 static const uint8_t table20_3_emit_[92]; 411 static const uint8_t table20_4_emit_[72]; 412 static const uint16_t table20_4_ops_[64]; 413 static const uint8_t table20_5_emit_[72]; 414 static const uint8_t table20_6_emit_[72]; 415 static const uint8_t table20_7_emit_[24]; 416 static const uint16_t table20_7_ops_[64]; 417 static const uint8_t* const table20_emit_[8]; 418 static const uint16_t* const table20_ops_[8]; 419 static const uint16_t table21_0_ops_[128]; 420 static const uint8_t table21_1_emit_[104]; 421 static const uint16_t table21_1_ops_[128]; 422 static const uint8_t table21_3_emit_[104]; 423 static const uint8_t table21_4_emit_[136]; 424 static const uint16_t table21_4_ops_[128]; 425 static const uint8_t table21_5_emit_[136]; 426 static const uint8_t table21_6_emit_[136]; 427 static const uint8_t table21_7_emit_[50]; 428 static const uint16_t table21_7_ops_[128]; 429 static const uint8_t* const table21_emit_[8]; 430 static const uint16_t* const table21_ops_[8]; 431 static const uint8_t table22_0_emit_[16]; 432 static const uint16_t table22_0_ops_[128]; 433 static const uint8_t table22_1_emit_[28]; 434 static const uint16_t table22_1_ops_[128]; 435 static const uint8_t table22_2_emit_[36]; 436 static const uint16_t table22_2_ops_[128]; 437 static const uint8_t table22_3_emit_[68]; 438 static const uint16_t table22_3_ops_[128]; 439 static const uint8_t table22_4_emit_[16]; 440 static const uint8_t table22_5_emit_[28]; 441 static const uint8_t table22_6_emit_[36]; 442 static const uint8_t table22_7_emit_[68]; 443 static const uint8_t table22_8_emit_[44]; 444 static const uint8_t table22_9_emit_[104]; 445 static const uint8_t table22_10_emit_[44]; 446 static const uint8_t table22_11_emit_[104]; 447 static const uint8_t table22_12_emit_[44]; 448 static const uint8_t table22_13_emit_[104]; 449 static const uint8_t table22_14_emit_[15]; 450 static const uint16_t table22_14_ops_[128]; 451 static const uint8_t table22_15_emit_[64]; 452 static const uint16_t table22_15_ops_[128]; 453 static const uint8_t* const table22_emit_[16]; 454 static const uint16_t* const table22_ops_[16]; 455 static const uint8_t table12_0_emit_[1]; 456 static const uint16_t table12_0_ops_[256]; 457 static const uint8_t table12_4_emit_[1]; 458 static const uint8_t table12_8_emit_[1]; 459 static const uint16_t table12_8_ops_[256]; 460 static const uint8_t table12_10_emit_[1]; 461 static const uint8_t table12_12_emit_[1]; 462 static const uint16_t table12_14_ops_[256]; 463 static const uint8_t table12_15_emit_[76]; 464 static const uint16_t table12_15_ops_[256]; 465 static const uint8_t* const table12_emit_[16]; 466 static const uint16_t* const table12_ops_[16]; 467 static const uint8_t table28_0_emit_[8]; 468 static const uint8_t table28_0_inner_[8]; 469 static const uint8_t table30_0_emit_[15]; 470 static const uint8_t table30_0_inner_[15]; 471 static const uint8_t table32_0_emit_[5]; 472 static const uint8_t table32_0_inner_[5]; 473 static const uint8_t table35_0_emit_[15]; 474 static const uint8_t table35_0_inner_[16]; 475 static const uint8_t table36_0_ops_[32]; 476 static const uint8_t table34_0_emit_[8]; 477 static const uint8_t table34_0_ops_[32]; 478 static const uint8_t table34_1_emit_[10]; 479 static const uint8_t table34_1_ops_[32]; 480 static const uint8_t* const table34_emit_[2]; 481 static const uint8_t* const table34_ops_[2]; 482 }; 483 template <typename F> 484 class HuffDecoder : public HuffDecoderCommon { 485 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)486 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 487 : sink_(sink), begin_(begin), end_(end) {} Run()488 bool Run() { 489 while (!done_) { 490 if (!RefillTo12()) { 491 Done0(); 492 break; 493 } 494 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 495 const auto op = GetOp1(index); 496 const int consumed = op & 15; 497 buffer_len_ -= consumed; 498 const auto emit_ofs = op >> 7; 499 switch ((op >> 4) & 7) { 500 case 0: { 501 sink_(GetEmit1(index, emit_ofs + 0)); 502 sink_(GetEmit1(index, emit_ofs + 1)); 503 break; 504 } 505 case 1: { 506 sink_(GetEmit1(index, emit_ofs + 0)); 507 break; 508 } 509 case 2: { 510 DecodeStep0(); 511 break; 512 } 513 case 3: { 514 DecodeStep1(); 515 break; 516 } 517 case 4: { 518 DecodeStep2(); 519 break; 520 } 521 case 5: { 522 DecodeStep3(); 523 break; 524 } 525 } 526 } 527 return ok_; 528 } 529 530 private: RefillTo12()531 bool RefillTo12() { 532 switch (buffer_len_) { 533 case 0: { 534 return Read2to8Bytes(); 535 } 536 case 1: 537 case 2: 538 case 3: { 539 return Read2to7Bytes(); 540 } 541 case 4: 542 case 5: 543 case 6: 544 case 7: 545 case 8: { 546 return Read1to7Bytes(); 547 } 548 case 9: 549 case 10: 550 case 11: { 551 return Read1to6Bytes(); 552 } 553 } 554 return true; 555 } Read2to8Bytes()556 bool Read2to8Bytes() { 557 switch (end_ - begin_) { 558 case 0: 559 case 1: { 560 return false; 561 } 562 case 2: { 563 Fill2(); 564 return true; 565 } 566 case 3: { 567 Fill3(); 568 return true; 569 } 570 case 4: { 571 Fill4(); 572 return true; 573 } 574 case 5: { 575 Fill5(); 576 return true; 577 } 578 case 6: { 579 Fill6(); 580 return true; 581 } 582 case 7: { 583 Fill7(); 584 return true; 585 } 586 default: { 587 Fill8(); 588 return true; 589 } 590 } 591 } Fill2()592 void Fill2() { 593 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 594 (static_cast<uint64_t>(begin_[1]) << 0); 595 begin_ += 2; 596 buffer_len_ += 16; 597 } Fill3()598 void Fill3() { 599 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 600 (static_cast<uint64_t>(begin_[1]) << 8) | 601 (static_cast<uint64_t>(begin_[2]) << 0); 602 begin_ += 3; 603 buffer_len_ += 24; 604 } Fill4()605 void Fill4() { 606 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 607 (static_cast<uint64_t>(begin_[1]) << 16) | 608 (static_cast<uint64_t>(begin_[2]) << 8) | 609 (static_cast<uint64_t>(begin_[3]) << 0); 610 begin_ += 4; 611 buffer_len_ += 32; 612 } Fill5()613 void Fill5() { 614 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 615 (static_cast<uint64_t>(begin_[1]) << 24) | 616 (static_cast<uint64_t>(begin_[2]) << 16) | 617 (static_cast<uint64_t>(begin_[3]) << 8) | 618 (static_cast<uint64_t>(begin_[4]) << 0); 619 begin_ += 5; 620 buffer_len_ += 40; 621 } Fill6()622 void Fill6() { 623 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 624 (static_cast<uint64_t>(begin_[1]) << 32) | 625 (static_cast<uint64_t>(begin_[2]) << 24) | 626 (static_cast<uint64_t>(begin_[3]) << 16) | 627 (static_cast<uint64_t>(begin_[4]) << 8) | 628 (static_cast<uint64_t>(begin_[5]) << 0); 629 begin_ += 6; 630 buffer_len_ += 48; 631 } Fill7()632 void Fill7() { 633 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 634 (static_cast<uint64_t>(begin_[1]) << 40) | 635 (static_cast<uint64_t>(begin_[2]) << 32) | 636 (static_cast<uint64_t>(begin_[3]) << 24) | 637 (static_cast<uint64_t>(begin_[4]) << 16) | 638 (static_cast<uint64_t>(begin_[5]) << 8) | 639 (static_cast<uint64_t>(begin_[6]) << 0); 640 begin_ += 7; 641 buffer_len_ += 56; 642 } Fill8()643 void Fill8() { 644 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 645 (static_cast<uint64_t>(begin_[1]) << 48) | 646 (static_cast<uint64_t>(begin_[2]) << 40) | 647 (static_cast<uint64_t>(begin_[3]) << 32) | 648 (static_cast<uint64_t>(begin_[4]) << 24) | 649 (static_cast<uint64_t>(begin_[5]) << 16) | 650 (static_cast<uint64_t>(begin_[6]) << 8) | 651 (static_cast<uint64_t>(begin_[7]) << 0); 652 begin_ += 8; 653 buffer_len_ += 64; 654 } Read2to7Bytes()655 bool Read2to7Bytes() { 656 switch (end_ - begin_) { 657 case 0: 658 case 1: { 659 return false; 660 } 661 case 2: { 662 Fill2(); 663 return true; 664 } 665 case 3: { 666 Fill3(); 667 return true; 668 } 669 case 4: { 670 Fill4(); 671 return true; 672 } 673 case 5: { 674 Fill5(); 675 return true; 676 } 677 case 6: { 678 Fill6(); 679 return true; 680 } 681 default: { 682 Fill7(); 683 return true; 684 } 685 } 686 } Read1to7Bytes()687 bool Read1to7Bytes() { 688 switch (end_ - begin_) { 689 case 0: { 690 return false; 691 } 692 case 1: { 693 Fill1(); 694 return true; 695 } 696 case 2: { 697 Fill2(); 698 return true; 699 } 700 case 3: { 701 Fill3(); 702 return true; 703 } 704 case 4: { 705 Fill4(); 706 return true; 707 } 708 case 5: { 709 Fill5(); 710 return true; 711 } 712 case 6: { 713 Fill6(); 714 return true; 715 } 716 default: { 717 Fill7(); 718 return true; 719 } 720 } 721 } Fill1()722 void Fill1() { 723 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 724 begin_ += 1; 725 buffer_len_ += 8; 726 } Read1to6Bytes()727 bool Read1to6Bytes() { 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 default: { 753 Fill6(); 754 return true; 755 } 756 } 757 } Done0()758 void Done0() { 759 done_ = true; 760 switch (end_ - begin_) { 761 case 1: { 762 Fill1(); 763 break; 764 } 765 } 766 switch (buffer_len_) { 767 case 1: 768 case 2: 769 case 3: 770 case 4: { 771 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 772 return; 773 } 774 case 5: { 775 const auto index = buffer_ & 31; 776 const auto op = GetOp2(index); 777 switch (op & 3) { 778 case 0: { 779 sink_(GetEmit2(index, (op >> 2) + 0)); 780 break; 781 } 782 case 1: { 783 ok_ = false; 784 break; 785 } 786 } 787 return; 788 } 789 case 6: { 790 const auto index = buffer_ & 63; 791 const auto op = GetOp3(index); 792 switch (op & 3) { 793 case 0: { 794 ok_ = false; 795 break; 796 } 797 case 1: { 798 sink_(GetEmit3(index, (op >> 2) + 0)); 799 break; 800 } 801 } 802 return; 803 } 804 case 7: { 805 const auto index = buffer_ & 127; 806 const auto op = GetOp4(index); 807 switch (op & 3) { 808 case 0: { 809 ok_ = false; 810 break; 811 } 812 case 1: { 813 sink_(GetEmit4(index, (op >> 2) + 0)); 814 break; 815 } 816 } 817 return; 818 } 819 case 8: { 820 const auto index = buffer_ & 255; 821 const auto op = GetOp5(index); 822 switch (op & 3) { 823 case 0: { 824 ok_ = false; 825 break; 826 } 827 case 1: { 828 sink_(GetEmit5(index, (op >> 2) + 0)); 829 break; 830 } 831 } 832 return; 833 } 834 case 9: { 835 const auto index = buffer_ & 511; 836 const auto op = GetOp6(index); 837 switch (op & 3) { 838 case 0: { 839 ok_ = false; 840 break; 841 } 842 case 1: { 843 sink_(GetEmit6(index, (op >> 2) + 0)); 844 break; 845 } 846 } 847 return; 848 } 849 case 10: { 850 const auto index = buffer_ & 1023; 851 const auto op = GetOp7(index); 852 switch (op & 3) { 853 case 0: { 854 sink_(GetEmit7(index, (op >> 2) + 0)); 855 sink_(GetEmit7(index, (op >> 2) + 1)); 856 break; 857 } 858 case 1: { 859 ok_ = false; 860 break; 861 } 862 case 2: { 863 sink_(GetEmit7(index, (op >> 2) + 0)); 864 break; 865 } 866 } 867 return; 868 } 869 case 11: { 870 const auto index = buffer_ & 2047; 871 const auto op = GetOp8(index); 872 switch (op & 3) { 873 case 0: { 874 ok_ = false; 875 break; 876 } 877 case 1: { 878 sink_(GetEmit8(index, (op >> 2) + 0)); 879 sink_(GetEmit8(index, (op >> 2) + 1)); 880 break; 881 } 882 case 2: { 883 sink_(GetEmit8(index, (op >> 2) + 0)); 884 break; 885 } 886 } 887 return; 888 } 889 case 0: { 890 return; 891 } 892 } 893 } DecodeStep0()894 void DecodeStep0() { 895 if (!RefillTo1()) { 896 Done1(); 897 return; 898 } 899 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 900 const auto op = GetOp9(index); 901 const int consumed = op & 1; 902 buffer_len_ -= consumed; 903 const auto emit_ofs = op >> 1; 904 sink_(GetEmit9(index, emit_ofs + 0)); 905 } RefillTo1()906 bool RefillTo1() { 907 switch (buffer_len_) { 908 case 0: { 909 return Read1to8Bytes(); 910 } 911 } 912 return true; 913 } Read1to8Bytes()914 bool Read1to8Bytes() { 915 switch (end_ - begin_) { 916 case 0: { 917 return false; 918 } 919 case 1: { 920 Fill1(); 921 return true; 922 } 923 case 2: { 924 Fill2(); 925 return true; 926 } 927 case 3: { 928 Fill3(); 929 return true; 930 } 931 case 4: { 932 Fill4(); 933 return true; 934 } 935 case 5: { 936 Fill5(); 937 return true; 938 } 939 case 6: { 940 Fill6(); 941 return true; 942 } 943 case 7: { 944 Fill7(); 945 return true; 946 } 947 default: { 948 Fill8(); 949 return true; 950 } 951 } 952 } Done1()953 void Done1() { 954 done_ = true; 955 ok_ = false; 956 } DecodeStep1()957 void DecodeStep1() { 958 if (!RefillTo1()) { 959 Done2(); 960 return; 961 } 962 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 963 const auto op = GetOp10(index); 964 const int consumed = op & 1; 965 buffer_len_ -= consumed; 966 const auto emit_ofs = op >> 1; 967 sink_(GetEmit10(index, emit_ofs + 0)); 968 } Done2()969 void Done2() { 970 done_ = true; 971 ok_ = false; 972 } DecodeStep2()973 void DecodeStep2() { 974 if (!RefillTo1()) { 975 Done3(); 976 return; 977 } 978 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 979 const auto op = GetOp11(index); 980 const int consumed = op & 1; 981 buffer_len_ -= consumed; 982 const auto emit_ofs = op >> 1; 983 sink_(GetEmit11(index, emit_ofs + 0)); 984 } Done3()985 void Done3() { 986 done_ = true; 987 ok_ = false; 988 } DecodeStep3()989 void DecodeStep3() { 990 if (!RefillTo12()) { 991 Done4(); 992 return; 993 } 994 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 995 const auto op = GetOp12(index); 996 const int consumed = op & 15; 997 buffer_len_ -= consumed; 998 const auto emit_ofs = op >> 8; 999 switch ((op >> 4) & 15) { 1000 case 0: { 1001 sink_(GetEmit12(index, emit_ofs + 0)); 1002 break; 1003 } 1004 case 1: { 1005 DecodeStep4(); 1006 break; 1007 } 1008 case 2: { 1009 DecodeStep5(); 1010 break; 1011 } 1012 case 3: { 1013 DecodeStep6(); 1014 break; 1015 } 1016 case 4: { 1017 DecodeStep7(); 1018 break; 1019 } 1020 case 5: { 1021 DecodeStep8(); 1022 break; 1023 } 1024 case 6: { 1025 DecodeStep12(); 1026 break; 1027 } 1028 case 7: { 1029 DecodeStep9(); 1030 break; 1031 } 1032 case 8: { 1033 DecodeStep10(); 1034 break; 1035 } 1036 case 9: { 1037 DecodeStep11(); 1038 break; 1039 } 1040 case 10: { 1041 DecodeStep13(); 1042 break; 1043 } 1044 } 1045 } Done4()1046 void Done4() { 1047 done_ = true; 1048 switch (end_ - begin_) { 1049 case 1: { 1050 Fill1(); 1051 break; 1052 } 1053 } 1054 switch (buffer_len_) { 1055 case 1: { 1056 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1057 return; 1058 } 1059 case 2: { 1060 const auto index = buffer_ & 3; 1061 const auto op = GetOp13(index); 1062 switch (op & 3) { 1063 case 0: { 1064 sink_(GetEmit13(index, (op >> 2) + 0)); 1065 break; 1066 } 1067 case 1: { 1068 ok_ = false; 1069 break; 1070 } 1071 } 1072 return; 1073 } 1074 case 3: { 1075 const auto index = buffer_ & 7; 1076 const auto op = GetOp14(index); 1077 switch (op & 3) { 1078 case 0: { 1079 ok_ = false; 1080 break; 1081 } 1082 case 1: { 1083 sink_(GetEmit14(index, (op >> 2) + 0)); 1084 break; 1085 } 1086 } 1087 return; 1088 } 1089 case 4: { 1090 const auto index = buffer_ & 15; 1091 const auto op = GetOp15(index); 1092 switch (op & 3) { 1093 case 0: { 1094 ok_ = false; 1095 break; 1096 } 1097 case 1: { 1098 sink_(GetEmit15(index, (op >> 2) + 0)); 1099 break; 1100 } 1101 } 1102 return; 1103 } 1104 case 5: { 1105 const auto index = buffer_ & 31; 1106 const auto op = GetOp16(index); 1107 switch (op & 3) { 1108 case 0: { 1109 ok_ = false; 1110 break; 1111 } 1112 case 1: { 1113 sink_(GetEmit16(index, (op >> 2) + 0)); 1114 break; 1115 } 1116 } 1117 return; 1118 } 1119 case 6: { 1120 const auto index = buffer_ & 63; 1121 const auto op = GetOp17(index); 1122 switch (op & 3) { 1123 case 0: { 1124 ok_ = false; 1125 break; 1126 } 1127 case 1: { 1128 sink_(GetEmit17(index, (op >> 2) + 0)); 1129 break; 1130 } 1131 } 1132 return; 1133 } 1134 case 7: { 1135 const auto index = buffer_ & 127; 1136 const auto op = GetOp18(index); 1137 switch (op & 3) { 1138 case 0: { 1139 sink_(GetEmit18(index, (op >> 2) + 0)); 1140 sink_(GetEmit18(index, (op >> 2) + 1)); 1141 break; 1142 } 1143 case 1: { 1144 ok_ = false; 1145 break; 1146 } 1147 case 2: { 1148 sink_(GetEmit18(index, (op >> 2) + 0)); 1149 break; 1150 } 1151 } 1152 return; 1153 } 1154 case 8: { 1155 const auto index = buffer_ & 255; 1156 const auto op = GetOp19(index); 1157 switch (op & 3) { 1158 case 0: { 1159 ok_ = false; 1160 break; 1161 } 1162 case 1: { 1163 sink_(GetEmit19(index, (op >> 2) + 0)); 1164 sink_(GetEmit19(index, (op >> 2) + 1)); 1165 break; 1166 } 1167 case 2: { 1168 sink_(GetEmit19(index, (op >> 2) + 0)); 1169 break; 1170 } 1171 } 1172 return; 1173 } 1174 case 9: { 1175 const auto index = buffer_ & 511; 1176 const auto op = GetOp20(index); 1177 switch (op & 3) { 1178 case 0: { 1179 ok_ = false; 1180 break; 1181 } 1182 case 1: { 1183 sink_(GetEmit20(index, (op >> 2) + 0)); 1184 sink_(GetEmit20(index, (op >> 2) + 1)); 1185 break; 1186 } 1187 case 2: { 1188 sink_(GetEmit20(index, (op >> 2) + 0)); 1189 break; 1190 } 1191 } 1192 return; 1193 } 1194 case 10: { 1195 const auto index = buffer_ & 1023; 1196 const auto op = GetOp21(index); 1197 switch (op & 3) { 1198 case 0: { 1199 ok_ = false; 1200 break; 1201 } 1202 case 1: { 1203 sink_(GetEmit21(index, (op >> 2) + 0)); 1204 sink_(GetEmit21(index, (op >> 2) + 1)); 1205 break; 1206 } 1207 case 2: { 1208 sink_(GetEmit21(index, (op >> 2) + 0)); 1209 break; 1210 } 1211 } 1212 return; 1213 } 1214 case 11: { 1215 const auto index = buffer_ & 2047; 1216 const auto op = GetOp22(index); 1217 switch (op & 3) { 1218 case 0: { 1219 ok_ = false; 1220 break; 1221 } 1222 case 1: { 1223 sink_(GetEmit22(index, (op >> 2) + 0)); 1224 sink_(GetEmit22(index, (op >> 2) + 1)); 1225 break; 1226 } 1227 case 2: { 1228 sink_(GetEmit22(index, (op >> 2) + 0)); 1229 break; 1230 } 1231 } 1232 return; 1233 } 1234 case 0: { 1235 return; 1236 } 1237 } 1238 } DecodeStep4()1239 void DecodeStep4() { 1240 if (!RefillTo1()) { 1241 Done5(); 1242 return; 1243 } 1244 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1245 const auto op = GetOp23(index); 1246 const int consumed = op & 1; 1247 buffer_len_ -= consumed; 1248 const auto emit_ofs = op >> 1; 1249 sink_(GetEmit23(index, emit_ofs + 0)); 1250 } Done5()1251 void Done5() { 1252 done_ = true; 1253 ok_ = false; 1254 } DecodeStep5()1255 void DecodeStep5() { 1256 if (!RefillTo1()) { 1257 Done6(); 1258 return; 1259 } 1260 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1261 const auto op = GetOp24(index); 1262 const int consumed = op & 1; 1263 buffer_len_ -= consumed; 1264 const auto emit_ofs = op >> 1; 1265 sink_(GetEmit24(index, emit_ofs + 0)); 1266 } Done6()1267 void Done6() { 1268 done_ = true; 1269 ok_ = false; 1270 } DecodeStep6()1271 void DecodeStep6() { 1272 if (!RefillTo2()) { 1273 Done7(); 1274 return; 1275 } 1276 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1277 const auto op = GetOp25(index); 1278 const int consumed = op & 3; 1279 buffer_len_ -= consumed; 1280 const auto emit_ofs = op >> 2; 1281 sink_(GetEmit25(index, emit_ofs + 0)); 1282 } RefillTo2()1283 bool RefillTo2() { 1284 switch (buffer_len_) { 1285 case 0: { 1286 return Read1to8Bytes(); 1287 } 1288 case 1: { 1289 return Read1to7Bytes(); 1290 } 1291 } 1292 return true; 1293 } Done7()1294 void Done7() { 1295 done_ = true; 1296 switch (buffer_len_) { 1297 case 1: 1298 case 0: { 1299 ok_ = false; 1300 return; 1301 } 1302 } 1303 } DecodeStep7()1304 void DecodeStep7() { 1305 if (!RefillTo2()) { 1306 Done8(); 1307 return; 1308 } 1309 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1310 const auto op = GetOp26(index); 1311 const int consumed = op & 3; 1312 buffer_len_ -= consumed; 1313 const auto emit_ofs = op >> 2; 1314 sink_(GetEmit26(index, emit_ofs + 0)); 1315 } Done8()1316 void Done8() { 1317 done_ = true; 1318 switch (buffer_len_) { 1319 case 1: 1320 case 0: { 1321 ok_ = false; 1322 return; 1323 } 1324 } 1325 } DecodeStep8()1326 void DecodeStep8() { 1327 if (!RefillTo2()) { 1328 Done9(); 1329 return; 1330 } 1331 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1332 const auto op = GetOp27(index); 1333 const int consumed = op & 3; 1334 buffer_len_ -= consumed; 1335 const auto emit_ofs = op >> 2; 1336 sink_(GetEmit27(index, emit_ofs + 0)); 1337 } Done9()1338 void Done9() { 1339 done_ = true; 1340 switch (buffer_len_) { 1341 case 1: 1342 case 0: { 1343 ok_ = false; 1344 return; 1345 } 1346 } 1347 } DecodeStep9()1348 void DecodeStep9() { 1349 if (!RefillTo3()) { 1350 Done10(); 1351 return; 1352 } 1353 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1354 const auto op = GetOp28(index); 1355 const int consumed = op & 3; 1356 buffer_len_ -= consumed; 1357 const auto emit_ofs = op >> 2; 1358 sink_(GetEmit28(index, emit_ofs + 0)); 1359 } RefillTo3()1360 bool RefillTo3() { 1361 switch (buffer_len_) { 1362 case 0: { 1363 return Read1to8Bytes(); 1364 } 1365 case 1: 1366 case 2: { 1367 return Read1to7Bytes(); 1368 } 1369 } 1370 return true; 1371 } Done10()1372 void Done10() { 1373 done_ = true; 1374 switch (buffer_len_) { 1375 case 1: 1376 case 2: 1377 case 0: { 1378 ok_ = false; 1379 return; 1380 } 1381 } 1382 } DecodeStep10()1383 void DecodeStep10() { 1384 if (!RefillTo3()) { 1385 Done11(); 1386 return; 1387 } 1388 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1389 const auto op = GetOp29(index); 1390 const int consumed = op & 3; 1391 buffer_len_ -= consumed; 1392 const auto emit_ofs = op >> 2; 1393 sink_(GetEmit29(index, emit_ofs + 0)); 1394 } Done11()1395 void Done11() { 1396 done_ = true; 1397 switch (buffer_len_) { 1398 case 1: 1399 case 2: 1400 case 0: { 1401 ok_ = false; 1402 return; 1403 } 1404 } 1405 } DecodeStep11()1406 void DecodeStep11() { 1407 if (!RefillTo4()) { 1408 Done12(); 1409 return; 1410 } 1411 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1412 const auto op = GetOp30(index); 1413 const int consumed = op & 7; 1414 buffer_len_ -= consumed; 1415 const auto emit_ofs = op >> 3; 1416 sink_(GetEmit30(index, emit_ofs + 0)); 1417 } RefillTo4()1418 bool RefillTo4() { 1419 switch (buffer_len_) { 1420 case 0: { 1421 return Read1to8Bytes(); 1422 } 1423 case 1: 1424 case 2: 1425 case 3: { 1426 return Read1to7Bytes(); 1427 } 1428 } 1429 return true; 1430 } Done12()1431 void Done12() { 1432 done_ = true; 1433 switch (buffer_len_) { 1434 case 1: 1435 case 2: 1436 case 0: { 1437 ok_ = false; 1438 return; 1439 } 1440 case 3: { 1441 const auto index = buffer_ & 7; 1442 const auto op = GetOp31(index); 1443 switch (op & 1) { 1444 case 0: { 1445 sink_(GetEmit31(index, (op >> 1) + 0)); 1446 break; 1447 } 1448 case 1: { 1449 ok_ = false; 1450 break; 1451 } 1452 } 1453 return; 1454 } 1455 } 1456 } DecodeStep12()1457 void DecodeStep12() { 1458 if (!RefillTo3()) { 1459 Done13(); 1460 return; 1461 } 1462 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1463 const auto op = GetOp32(index); 1464 const int consumed = op & 3; 1465 buffer_len_ -= consumed; 1466 const auto emit_ofs = op >> 2; 1467 sink_(GetEmit32(index, emit_ofs + 0)); 1468 } Done13()1469 void Done13() { 1470 done_ = true; 1471 switch (buffer_len_) { 1472 case 1: 1473 case 0: { 1474 ok_ = false; 1475 return; 1476 } 1477 case 2: { 1478 const auto index = buffer_ & 3; 1479 const auto op = GetOp33(index); 1480 switch (op & 1) { 1481 case 0: { 1482 sink_(GetEmit33(index, (op >> 1) + 0)); 1483 break; 1484 } 1485 case 1: { 1486 ok_ = false; 1487 break; 1488 } 1489 } 1490 return; 1491 } 1492 } 1493 } DecodeStep13()1494 void DecodeStep13() { 1495 if (!RefillTo6()) { 1496 Done14(); 1497 return; 1498 } 1499 const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f; 1500 const auto op = GetOp34(index); 1501 const int consumed = op & 7; 1502 buffer_len_ -= consumed; 1503 const auto emit_ofs = op >> 4; 1504 switch ((op >> 3) & 1) { 1505 case 0: { 1506 sink_(GetEmit34(index, emit_ofs + 0)); 1507 break; 1508 } 1509 case 1: { 1510 begin_ = end_; 1511 buffer_len_ = 0; 1512 break; 1513 } 1514 } 1515 } RefillTo6()1516 bool RefillTo6() { 1517 switch (buffer_len_) { 1518 case 0: { 1519 return Read1to8Bytes(); 1520 } 1521 case 1: 1522 case 2: 1523 case 3: 1524 case 4: 1525 case 5: { 1526 return Read1to7Bytes(); 1527 } 1528 } 1529 return true; 1530 } Done14()1531 void Done14() { 1532 done_ = true; 1533 switch (buffer_len_) { 1534 case 1: 1535 case 2: 1536 case 3: { 1537 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1538 return; 1539 } 1540 case 4: { 1541 const auto index = buffer_ & 15; 1542 const auto op = GetOp35(index); 1543 switch (op & 1) { 1544 case 0: { 1545 sink_(GetEmit35(index, (op >> 1) + 0)); 1546 break; 1547 } 1548 } 1549 return; 1550 } 1551 case 5: { 1552 const auto index = buffer_ & 31; 1553 const auto op = GetOp36(index); 1554 switch (op & 3) { 1555 case 0: { 1556 ok_ = false; 1557 break; 1558 } 1559 case 1: { 1560 sink_(GetEmit36(index, (op >> 2) + 0)); 1561 break; 1562 } 1563 } 1564 return; 1565 } 1566 case 0: { 1567 return; 1568 } 1569 } 1570 } 1571 F sink_; 1572 const uint8_t* begin_; 1573 const uint8_t* const end_; 1574 uint64_t buffer_ = 0; 1575 int buffer_len_ = 0; 1576 bool ok_ = true; 1577 bool done_ = false; 1578 }; 1579 } // namespace geometry_12_12_6 1580 } // namespace grpc_core 1581 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_12_6_H 1582