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_6_12_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_6_12_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_12_6_12 { 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 } GetOp12(size_t i)104 static inline uint64_t GetOp12(size_t i) { 105 return table12_0_inner_[table12_0_outer_[i]]; 106 } GetEmit12(size_t,size_t emit)107 static inline uint64_t GetEmit12(size_t, size_t emit) { 108 return table14_0_emit_[emit]; 109 } GetOp17(size_t i)110 static inline uint64_t GetOp17(size_t i) { return i ? 3 : 1; } GetEmit17(size_t,size_t emit)111 static inline uint64_t GetEmit17(size_t, size_t emit) { 112 return emit ? 195 : 92; 113 } GetOp18(size_t i)114 static inline uint64_t GetOp18(size_t i) { 115 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 116 } GetEmit18(size_t,size_t emit)117 static inline uint64_t GetEmit18(size_t, size_t emit) { 118 return (emit < 2 ? (emit ? 162 : 131) : ((emit - 2) ? 194 : 184)); 119 } GetOp19(size_t i)120 static inline uint64_t GetOp19(size_t i) { return table19_0_inner_[i]; } GetEmit19(size_t,size_t emit)121 static inline uint64_t GetEmit19(size_t, size_t emit) { 122 return table19_0_emit_[emit]; 123 } GetOp21(size_t i)124 static inline uint64_t GetOp21(size_t i) { return i; } GetEmit21(size_t,size_t emit)125 static inline uint64_t GetEmit21(size_t, size_t emit) { 126 return ((void)emit, 208); 127 } GetOp20(size_t i)128 static inline uint64_t GetOp20(size_t i) { 129 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 130 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 131 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 132 } GetEmit20(size_t,size_t emit)133 static inline uint64_t GetEmit20(size_t, size_t emit) { 134 return (emit < 1 ? (((void)emit, 208)) : ((emit - 1) ? 130 : 128)); 135 } GetOp23(size_t i)136 static inline uint64_t GetOp23(size_t i) { 137 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 138 } GetEmit23(size_t,size_t emit)139 static inline uint64_t GetEmit23(size_t, size_t emit) { 140 return ((void)emit, 230); 141 } GetOp22(size_t i)142 static inline uint64_t GetOp22(size_t i) { 143 return table22_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 144 } GetEmit22(size_t,size_t emit)145 static inline uint64_t GetEmit22(size_t, size_t emit) { 146 return table22_0_emit_[emit]; 147 } GetOp25(size_t i)148 static inline uint64_t GetOp25(size_t i) { 149 return ((i < 2 ? (i) : (((void)(i - 2), 2))) < 1 150 ? (((void)(i < 2 ? (i) : (((void)(i - 2), 2))), 0)) 151 : (((i < 2 ? (i) : (((void)(i - 2), 2))) - 1) ? 1 : 2)); 152 } GetEmit25(size_t,size_t emit)153 static inline uint64_t GetEmit25(size_t, size_t emit) { 154 return emit ? 226 : 224; 155 } GetOp24(size_t i)156 static inline uint64_t GetOp24(size_t i) { 157 return table24_0_inner_[(i < 3 ? (i / 2 + 0) : ((i - 3) + 1))]; 158 } GetEmit24(size_t,size_t emit)159 static inline uint64_t GetEmit24(size_t, size_t emit) { 160 return table24_0_emit_[emit]; 161 } GetOp27(size_t i)162 static inline uint64_t GetOp27(size_t i) { 163 return table27_0_inner_[(i < 12 ? (i) : (((void)(i - 12), 12)))]; 164 } GetEmit27(size_t,size_t emit)165 static inline uint64_t GetEmit27(size_t, size_t emit) { 166 return table27_0_emit_[emit]; 167 } GetOp26(size_t i)168 static inline uint64_t GetOp26(size_t i) { return table26_0_ops_[i]; } GetEmit26(size_t,size_t emit)169 static inline uint64_t GetEmit26(size_t, size_t emit) { 170 return table26_0_emit_[emit]; 171 } GetOp29(size_t i)172 static inline uint64_t GetOp29(size_t i) { return table29_0_ops_[i]; } GetEmit29(size_t,size_t emit)173 static inline uint64_t GetEmit29(size_t, size_t emit) { 174 return table29_0_emit_[emit]; 175 } GetOp30(size_t i)176 static inline uint64_t GetOp30(size_t i) { return table30_0_ops_[i]; } GetEmit30(size_t,size_t emit)177 static inline uint64_t GetEmit30(size_t, size_t emit) { 178 return table30_0_emit_[emit]; 179 } GetOp31(size_t i)180 static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; } GetEmit31(size_t,size_t emit)181 static inline uint64_t GetEmit31(size_t, size_t emit) { 182 return table31_0_emit_[emit]; 183 } GetOp32(size_t i)184 static inline uint64_t GetOp32(size_t i) { return table32_0_ops_[i]; } GetEmit32(size_t,size_t emit)185 static inline uint64_t GetEmit32(size_t, size_t emit) { 186 return table32_0_emit_[emit]; 187 } GetOp33(size_t i)188 static inline uint64_t GetOp33(size_t i) { 189 return table33_ops_[i >> 6][i & 0x3f]; 190 } GetEmit33(size_t i,size_t emit)191 static inline uint64_t GetEmit33(size_t i, size_t emit) { 192 return table33_emit_[i >> 6][emit]; 193 } GetOp34(size_t i)194 static inline uint64_t GetOp34(size_t i) { 195 return table34_ops_[i >> 6][i & 0x3f]; 196 } GetEmit34(size_t i,size_t emit)197 static inline uint64_t GetEmit34(size_t i, size_t emit) { 198 return table34_emit_[i >> 6][emit]; 199 } GetOp35(size_t i)200 static inline uint64_t GetOp35(size_t i) { 201 return table35_ops_[i >> 6][i & 0x3f]; 202 } GetEmit35(size_t i,size_t emit)203 static inline uint64_t GetEmit35(size_t i, size_t emit) { 204 return table35_emit_[i >> 6][emit]; 205 } GetOp28(size_t i)206 static inline uint64_t GetOp28(size_t i) { 207 return table28_ops_[i >> 7][i & 0x7f]; 208 } GetEmit28(size_t i,size_t emit)209 static inline uint64_t GetEmit28(size_t i, size_t emit) { 210 return table28_emit_[i >> 7][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 uint16_t table12_0_inner_[13]; 391 static const uint8_t table12_0_outer_[64]; 392 static const uint8_t table19_0_emit_[8]; 393 static const uint8_t table19_0_inner_[8]; 394 static const uint8_t table22_0_emit_[15]; 395 static const uint8_t table22_0_inner_[15]; 396 static const uint8_t table24_0_emit_[6]; 397 static const uint8_t table24_0_inner_[6]; 398 static const uint8_t table27_0_emit_[12]; 399 static const uint8_t table27_0_inner_[13]; 400 static const uint8_t table26_0_emit_[20]; 401 static const uint8_t table26_0_ops_[32]; 402 static const uint8_t table29_0_emit_[21]; 403 static const uint8_t table29_0_ops_[32]; 404 static const uint8_t table30_0_emit_[33]; 405 static const uint8_t table30_0_ops_[64]; 406 static const uint8_t table31_0_emit_[37]; 407 static const uint8_t table31_0_ops_[128]; 408 static const uint8_t table32_0_emit_[52]; 409 static const uint8_t table32_0_ops_[256]; 410 static const uint8_t table33_0_emit_[4]; 411 static const uint8_t table33_0_ops_[64]; 412 static const uint8_t table33_1_emit_[4]; 413 static const uint8_t table33_2_emit_[4]; 414 static const uint8_t table33_3_emit_[4]; 415 static const uint8_t table33_4_emit_[4]; 416 static const uint8_t table33_5_emit_[7]; 417 static const uint8_t table33_5_ops_[64]; 418 static const uint8_t table33_6_emit_[10]; 419 static const uint8_t table33_6_ops_[64]; 420 static const uint8_t table33_7_emit_[34]; 421 static const uint8_t table33_7_ops_[64]; 422 static const uint8_t* const table33_emit_[8]; 423 static const uint8_t* const table33_ops_[8]; 424 static const uint8_t table34_0_emit_[40]; 425 static const uint8_t table34_0_ops_[64]; 426 static const uint8_t table34_1_emit_[40]; 427 static const uint8_t table34_2_emit_[40]; 428 static const uint8_t table34_3_emit_[40]; 429 static const uint8_t table34_4_emit_[40]; 430 static const uint8_t table34_5_emit_[40]; 431 static const uint8_t table34_6_emit_[40]; 432 static const uint8_t table34_7_emit_[40]; 433 static const uint8_t table34_8_emit_[40]; 434 static const uint8_t table34_9_emit_[40]; 435 static const uint8_t table34_10_emit_[22]; 436 static const uint8_t table34_10_ops_[64]; 437 static const uint8_t table34_11_emit_[4]; 438 static const uint8_t table34_12_emit_[4]; 439 static const uint8_t table34_13_emit_[6]; 440 static const uint8_t table34_14_emit_[17]; 441 static const uint8_t table34_14_ops_[64]; 442 static const uint8_t table34_15_emit_[46]; 443 static const uint8_t table34_15_ops_[64]; 444 static const uint8_t* const table34_emit_[16]; 445 static const uint8_t* const table34_ops_[16]; 446 static const uint8_t table35_0_emit_[72]; 447 static const uint16_t table35_0_ops_[64]; 448 static const uint8_t table35_1_emit_[72]; 449 static const uint8_t table35_2_emit_[72]; 450 static const uint8_t table35_3_emit_[72]; 451 static const uint8_t table35_4_emit_[72]; 452 static const uint8_t table35_5_emit_[72]; 453 static const uint8_t table35_6_emit_[72]; 454 static const uint8_t table35_7_emit_[72]; 455 static const uint8_t table35_8_emit_[72]; 456 static const uint8_t table35_9_emit_[72]; 457 static const uint8_t table35_10_emit_[72]; 458 static const uint8_t table35_11_emit_[72]; 459 static const uint8_t table35_12_emit_[72]; 460 static const uint8_t table35_13_emit_[72]; 461 static const uint8_t table35_14_emit_[72]; 462 static const uint8_t table35_15_emit_[72]; 463 static const uint8_t table35_16_emit_[72]; 464 static const uint8_t table35_17_emit_[72]; 465 static const uint8_t table35_18_emit_[72]; 466 static const uint8_t table35_19_emit_[72]; 467 static const uint8_t table35_20_emit_[72]; 468 static const uint8_t table35_21_emit_[40]; 469 static const uint16_t table35_21_ops_[64]; 470 static const uint8_t table35_22_emit_[40]; 471 static const uint8_t table35_23_emit_[40]; 472 static const uint8_t table35_24_emit_[40]; 473 static const uint8_t table35_25_emit_[40]; 474 static const uint8_t table35_26_emit_[40]; 475 static const uint8_t table35_27_emit_[4]; 476 static const uint16_t table35_27_ops_[64]; 477 static const uint8_t table35_28_emit_[8]; 478 static const uint16_t table35_28_ops_[64]; 479 static const uint8_t table35_29_emit_[9]; 480 static const uint16_t table35_29_ops_[64]; 481 static const uint8_t table35_30_emit_[16]; 482 static const uint16_t table35_30_ops_[64]; 483 static const uint8_t table35_31_emit_[30]; 484 static const uint16_t table35_31_ops_[64]; 485 static const uint8_t* const table35_emit_[32]; 486 static const uint16_t* const table35_ops_[32]; 487 static const uint8_t table28_0_emit_[1]; 488 static const uint16_t table28_0_ops_[128]; 489 static const uint8_t table28_1_emit_[1]; 490 static const uint8_t table28_2_emit_[1]; 491 static const uint8_t table28_3_emit_[1]; 492 static const uint8_t table28_4_emit_[1]; 493 static const uint8_t table28_5_emit_[1]; 494 static const uint8_t table28_6_emit_[1]; 495 static const uint8_t table28_7_emit_[1]; 496 static const uint8_t table28_8_emit_[1]; 497 static const uint8_t table28_9_emit_[1]; 498 static const uint8_t table28_10_emit_[1]; 499 static const uint8_t table28_11_emit_[1]; 500 static const uint8_t table28_12_emit_[1]; 501 static const uint8_t table28_13_emit_[1]; 502 static const uint8_t table28_14_emit_[1]; 503 static const uint8_t table28_15_emit_[1]; 504 static const uint8_t table28_16_emit_[1]; 505 static const uint8_t table28_17_emit_[1]; 506 static const uint8_t table28_18_emit_[1]; 507 static const uint8_t table28_19_emit_[1]; 508 static const uint8_t table28_20_emit_[1]; 509 static const uint8_t table28_21_emit_[2]; 510 static const uint16_t table28_21_ops_[128]; 511 static const uint8_t table28_22_emit_[2]; 512 static const uint8_t table28_23_emit_[2]; 513 static const uint8_t table28_24_emit_[2]; 514 static const uint8_t table28_25_emit_[2]; 515 static const uint8_t table28_26_emit_[2]; 516 static const uint16_t table28_27_ops_[128]; 517 static const uint16_t table28_28_ops_[128]; 518 static const uint16_t table28_29_ops_[128]; 519 static const uint16_t table28_30_ops_[128]; 520 static const uint8_t table28_31_emit_[33]; 521 static const uint16_t table28_31_ops_[128]; 522 static const uint8_t* const table28_emit_[32]; 523 static const uint16_t* const table28_ops_[32]; 524 }; 525 template <typename F> 526 class HuffDecoder : public HuffDecoderCommon { 527 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)528 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 529 : sink_(sink), begin_(begin), end_(end) {} Run()530 bool Run() { 531 while (!done_) { 532 if (!RefillTo12()) { 533 Done0(); 534 break; 535 } 536 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 537 const auto op = GetOp1(index); 538 const int consumed = op & 15; 539 buffer_len_ -= consumed; 540 const auto emit_ofs = op >> 7; 541 switch ((op >> 4) & 7) { 542 case 0: { 543 sink_(GetEmit1(index, emit_ofs + 0)); 544 sink_(GetEmit1(index, emit_ofs + 1)); 545 break; 546 } 547 case 1: { 548 sink_(GetEmit1(index, emit_ofs + 0)); 549 break; 550 } 551 case 2: { 552 DecodeStep0(); 553 break; 554 } 555 case 3: { 556 DecodeStep1(); 557 break; 558 } 559 case 4: { 560 DecodeStep2(); 561 break; 562 } 563 case 5: { 564 DecodeStep3(); 565 break; 566 } 567 } 568 } 569 return ok_; 570 } 571 572 private: RefillTo12()573 bool RefillTo12() { 574 switch (buffer_len_) { 575 case 0: { 576 return Read2to8Bytes(); 577 } 578 case 1: 579 case 2: 580 case 3: { 581 return Read2to7Bytes(); 582 } 583 case 4: 584 case 5: 585 case 6: 586 case 7: 587 case 8: { 588 return Read1to7Bytes(); 589 } 590 case 9: 591 case 10: 592 case 11: { 593 return Read1to6Bytes(); 594 } 595 } 596 return true; 597 } Read2to8Bytes()598 bool Read2to8Bytes() { 599 switch (end_ - begin_) { 600 case 0: 601 case 1: { 602 return false; 603 } 604 case 2: { 605 Fill2(); 606 return true; 607 } 608 case 3: { 609 Fill3(); 610 return true; 611 } 612 case 4: { 613 Fill4(); 614 return true; 615 } 616 case 5: { 617 Fill5(); 618 return true; 619 } 620 case 6: { 621 Fill6(); 622 return true; 623 } 624 case 7: { 625 Fill7(); 626 return true; 627 } 628 default: { 629 Fill8(); 630 return true; 631 } 632 } 633 } Fill2()634 void Fill2() { 635 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 636 (static_cast<uint64_t>(begin_[1]) << 0); 637 begin_ += 2; 638 buffer_len_ += 16; 639 } Fill3()640 void Fill3() { 641 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 642 (static_cast<uint64_t>(begin_[1]) << 8) | 643 (static_cast<uint64_t>(begin_[2]) << 0); 644 begin_ += 3; 645 buffer_len_ += 24; 646 } Fill4()647 void Fill4() { 648 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 649 (static_cast<uint64_t>(begin_[1]) << 16) | 650 (static_cast<uint64_t>(begin_[2]) << 8) | 651 (static_cast<uint64_t>(begin_[3]) << 0); 652 begin_ += 4; 653 buffer_len_ += 32; 654 } Fill5()655 void Fill5() { 656 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 657 (static_cast<uint64_t>(begin_[1]) << 24) | 658 (static_cast<uint64_t>(begin_[2]) << 16) | 659 (static_cast<uint64_t>(begin_[3]) << 8) | 660 (static_cast<uint64_t>(begin_[4]) << 0); 661 begin_ += 5; 662 buffer_len_ += 40; 663 } Fill6()664 void Fill6() { 665 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 666 (static_cast<uint64_t>(begin_[1]) << 32) | 667 (static_cast<uint64_t>(begin_[2]) << 24) | 668 (static_cast<uint64_t>(begin_[3]) << 16) | 669 (static_cast<uint64_t>(begin_[4]) << 8) | 670 (static_cast<uint64_t>(begin_[5]) << 0); 671 begin_ += 6; 672 buffer_len_ += 48; 673 } Fill7()674 void Fill7() { 675 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 676 (static_cast<uint64_t>(begin_[1]) << 40) | 677 (static_cast<uint64_t>(begin_[2]) << 32) | 678 (static_cast<uint64_t>(begin_[3]) << 24) | 679 (static_cast<uint64_t>(begin_[4]) << 16) | 680 (static_cast<uint64_t>(begin_[5]) << 8) | 681 (static_cast<uint64_t>(begin_[6]) << 0); 682 begin_ += 7; 683 buffer_len_ += 56; 684 } Fill8()685 void Fill8() { 686 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 687 (static_cast<uint64_t>(begin_[1]) << 48) | 688 (static_cast<uint64_t>(begin_[2]) << 40) | 689 (static_cast<uint64_t>(begin_[3]) << 32) | 690 (static_cast<uint64_t>(begin_[4]) << 24) | 691 (static_cast<uint64_t>(begin_[5]) << 16) | 692 (static_cast<uint64_t>(begin_[6]) << 8) | 693 (static_cast<uint64_t>(begin_[7]) << 0); 694 begin_ += 8; 695 buffer_len_ += 64; 696 } Read2to7Bytes()697 bool Read2to7Bytes() { 698 switch (end_ - begin_) { 699 case 0: 700 case 1: { 701 return false; 702 } 703 case 2: { 704 Fill2(); 705 return true; 706 } 707 case 3: { 708 Fill3(); 709 return true; 710 } 711 case 4: { 712 Fill4(); 713 return true; 714 } 715 case 5: { 716 Fill5(); 717 return true; 718 } 719 case 6: { 720 Fill6(); 721 return true; 722 } 723 default: { 724 Fill7(); 725 return true; 726 } 727 } 728 } Read1to7Bytes()729 bool Read1to7Bytes() { 730 switch (end_ - begin_) { 731 case 0: { 732 return false; 733 } 734 case 1: { 735 Fill1(); 736 return true; 737 } 738 case 2: { 739 Fill2(); 740 return true; 741 } 742 case 3: { 743 Fill3(); 744 return true; 745 } 746 case 4: { 747 Fill4(); 748 return true; 749 } 750 case 5: { 751 Fill5(); 752 return true; 753 } 754 case 6: { 755 Fill6(); 756 return true; 757 } 758 default: { 759 Fill7(); 760 return true; 761 } 762 } 763 } Fill1()764 void Fill1() { 765 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 766 begin_ += 1; 767 buffer_len_ += 8; 768 } Read1to6Bytes()769 bool Read1to6Bytes() { 770 switch (end_ - begin_) { 771 case 0: { 772 return false; 773 } 774 case 1: { 775 Fill1(); 776 return true; 777 } 778 case 2: { 779 Fill2(); 780 return true; 781 } 782 case 3: { 783 Fill3(); 784 return true; 785 } 786 case 4: { 787 Fill4(); 788 return true; 789 } 790 case 5: { 791 Fill5(); 792 return true; 793 } 794 default: { 795 Fill6(); 796 return true; 797 } 798 } 799 } Done0()800 void Done0() { 801 done_ = true; 802 switch (end_ - begin_) { 803 case 1: { 804 Fill1(); 805 break; 806 } 807 } 808 switch (buffer_len_) { 809 case 1: 810 case 2: 811 case 3: 812 case 4: { 813 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 814 return; 815 } 816 case 5: { 817 const auto index = buffer_ & 31; 818 const auto op = GetOp2(index); 819 switch (op & 3) { 820 case 0: { 821 sink_(GetEmit2(index, (op >> 2) + 0)); 822 break; 823 } 824 case 1: { 825 ok_ = false; 826 break; 827 } 828 } 829 return; 830 } 831 case 6: { 832 const auto index = buffer_ & 63; 833 const auto op = GetOp3(index); 834 switch (op & 3) { 835 case 0: { 836 ok_ = false; 837 break; 838 } 839 case 1: { 840 sink_(GetEmit3(index, (op >> 2) + 0)); 841 break; 842 } 843 } 844 return; 845 } 846 case 7: { 847 const auto index = buffer_ & 127; 848 const auto op = GetOp4(index); 849 switch (op & 3) { 850 case 0: { 851 ok_ = false; 852 break; 853 } 854 case 1: { 855 sink_(GetEmit4(index, (op >> 2) + 0)); 856 break; 857 } 858 } 859 return; 860 } 861 case 8: { 862 const auto index = buffer_ & 255; 863 const auto op = GetOp5(index); 864 switch (op & 3) { 865 case 0: { 866 ok_ = false; 867 break; 868 } 869 case 1: { 870 sink_(GetEmit5(index, (op >> 2) + 0)); 871 break; 872 } 873 } 874 return; 875 } 876 case 9: { 877 const auto index = buffer_ & 511; 878 const auto op = GetOp6(index); 879 switch (op & 3) { 880 case 0: { 881 ok_ = false; 882 break; 883 } 884 case 1: { 885 sink_(GetEmit6(index, (op >> 2) + 0)); 886 break; 887 } 888 } 889 return; 890 } 891 case 10: { 892 const auto index = buffer_ & 1023; 893 const auto op = GetOp7(index); 894 switch (op & 3) { 895 case 0: { 896 sink_(GetEmit7(index, (op >> 2) + 0)); 897 sink_(GetEmit7(index, (op >> 2) + 1)); 898 break; 899 } 900 case 1: { 901 ok_ = false; 902 break; 903 } 904 case 2: { 905 sink_(GetEmit7(index, (op >> 2) + 0)); 906 break; 907 } 908 } 909 return; 910 } 911 case 11: { 912 const auto index = buffer_ & 2047; 913 const auto op = GetOp8(index); 914 switch (op & 3) { 915 case 0: { 916 ok_ = false; 917 break; 918 } 919 case 1: { 920 sink_(GetEmit8(index, (op >> 2) + 0)); 921 sink_(GetEmit8(index, (op >> 2) + 1)); 922 break; 923 } 924 case 2: { 925 sink_(GetEmit8(index, (op >> 2) + 0)); 926 break; 927 } 928 } 929 return; 930 } 931 case 0: { 932 return; 933 } 934 } 935 } DecodeStep0()936 void DecodeStep0() { 937 if (!RefillTo1()) { 938 Done1(); 939 return; 940 } 941 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 942 const auto op = GetOp9(index); 943 const int consumed = op & 1; 944 buffer_len_ -= consumed; 945 const auto emit_ofs = op >> 1; 946 sink_(GetEmit9(index, emit_ofs + 0)); 947 } RefillTo1()948 bool RefillTo1() { 949 switch (buffer_len_) { 950 case 0: { 951 return Read1to8Bytes(); 952 } 953 } 954 return true; 955 } Read1to8Bytes()956 bool Read1to8Bytes() { 957 switch (end_ - begin_) { 958 case 0: { 959 return false; 960 } 961 case 1: { 962 Fill1(); 963 return true; 964 } 965 case 2: { 966 Fill2(); 967 return true; 968 } 969 case 3: { 970 Fill3(); 971 return true; 972 } 973 case 4: { 974 Fill4(); 975 return true; 976 } 977 case 5: { 978 Fill5(); 979 return true; 980 } 981 case 6: { 982 Fill6(); 983 return true; 984 } 985 case 7: { 986 Fill7(); 987 return true; 988 } 989 default: { 990 Fill8(); 991 return true; 992 } 993 } 994 } Done1()995 void Done1() { 996 done_ = true; 997 ok_ = false; 998 } DecodeStep1()999 void DecodeStep1() { 1000 if (!RefillTo1()) { 1001 Done2(); 1002 return; 1003 } 1004 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1005 const auto op = GetOp10(index); 1006 const int consumed = op & 1; 1007 buffer_len_ -= consumed; 1008 const auto emit_ofs = op >> 1; 1009 sink_(GetEmit10(index, emit_ofs + 0)); 1010 } Done2()1011 void Done2() { 1012 done_ = true; 1013 ok_ = false; 1014 } DecodeStep2()1015 void DecodeStep2() { 1016 if (!RefillTo1()) { 1017 Done3(); 1018 return; 1019 } 1020 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1021 const auto op = GetOp11(index); 1022 const int consumed = op & 1; 1023 buffer_len_ -= consumed; 1024 const auto emit_ofs = op >> 1; 1025 sink_(GetEmit11(index, emit_ofs + 0)); 1026 } Done3()1027 void Done3() { 1028 done_ = true; 1029 ok_ = false; 1030 } DecodeStep3()1031 void DecodeStep3() { 1032 if (!RefillTo6()) { 1033 Done4(); 1034 return; 1035 } 1036 const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f; 1037 const auto op = GetOp12(index); 1038 const int consumed = op & 7; 1039 buffer_len_ -= consumed; 1040 const auto emit_ofs = op >> 7; 1041 switch ((op >> 3) & 15) { 1042 case 0: { 1043 sink_(GetEmit12(index, emit_ofs + 0)); 1044 break; 1045 } 1046 case 1: { 1047 DecodeStep4(); 1048 break; 1049 } 1050 case 2: { 1051 DecodeStep7(); 1052 break; 1053 } 1054 case 3: { 1055 DecodeStep5(); 1056 break; 1057 } 1058 case 4: { 1059 DecodeStep9(); 1060 break; 1061 } 1062 case 5: { 1063 DecodeStep6(); 1064 break; 1065 } 1066 case 6: { 1067 DecodeStep8(); 1068 break; 1069 } 1070 case 7: { 1071 DecodeStep10(); 1072 break; 1073 } 1074 case 8: { 1075 DecodeStep11(); 1076 break; 1077 } 1078 } 1079 } RefillTo6()1080 bool RefillTo6() { 1081 switch (buffer_len_) { 1082 case 0: { 1083 return Read1to8Bytes(); 1084 } 1085 case 1: 1086 case 2: 1087 case 3: 1088 case 4: 1089 case 5: { 1090 return Read1to7Bytes(); 1091 } 1092 } 1093 return true; 1094 } Done4()1095 void Done4() { 1096 done_ = true; 1097 switch (buffer_len_) { 1098 case 1: { 1099 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1100 return; 1101 } 1102 case 2: { 1103 const auto index = buffer_ & 3; 1104 const auto op = GetOp13(index); 1105 switch (op & 3) { 1106 case 0: { 1107 sink_(GetEmit13(index, (op >> 2) + 0)); 1108 break; 1109 } 1110 case 1: { 1111 ok_ = false; 1112 break; 1113 } 1114 } 1115 return; 1116 } 1117 case 3: { 1118 const auto index = buffer_ & 7; 1119 const auto op = GetOp14(index); 1120 switch (op & 3) { 1121 case 0: { 1122 ok_ = false; 1123 break; 1124 } 1125 case 1: { 1126 sink_(GetEmit14(index, (op >> 2) + 0)); 1127 break; 1128 } 1129 } 1130 return; 1131 } 1132 case 4: { 1133 const auto index = buffer_ & 15; 1134 const auto op = GetOp15(index); 1135 switch (op & 3) { 1136 case 0: { 1137 ok_ = false; 1138 break; 1139 } 1140 case 1: { 1141 sink_(GetEmit15(index, (op >> 2) + 0)); 1142 break; 1143 } 1144 } 1145 return; 1146 } 1147 case 5: { 1148 const auto index = buffer_ & 31; 1149 const auto op = GetOp16(index); 1150 switch (op & 3) { 1151 case 0: { 1152 ok_ = false; 1153 break; 1154 } 1155 case 1: { 1156 sink_(GetEmit16(index, (op >> 2) + 0)); 1157 break; 1158 } 1159 } 1160 return; 1161 } 1162 case 0: { 1163 return; 1164 } 1165 } 1166 } DecodeStep4()1167 void DecodeStep4() { 1168 if (!RefillTo1()) { 1169 Done5(); 1170 return; 1171 } 1172 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1173 const auto op = GetOp17(index); 1174 const int consumed = op & 1; 1175 buffer_len_ -= consumed; 1176 const auto emit_ofs = op >> 1; 1177 sink_(GetEmit17(index, emit_ofs + 0)); 1178 } Done5()1179 void Done5() { 1180 done_ = true; 1181 ok_ = false; 1182 } DecodeStep5()1183 void DecodeStep5() { 1184 if (!RefillTo2()) { 1185 Done6(); 1186 return; 1187 } 1188 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1189 const auto op = GetOp18(index); 1190 const int consumed = op & 3; 1191 buffer_len_ -= consumed; 1192 const auto emit_ofs = op >> 2; 1193 sink_(GetEmit18(index, emit_ofs + 0)); 1194 } RefillTo2()1195 bool RefillTo2() { 1196 switch (buffer_len_) { 1197 case 0: { 1198 return Read1to8Bytes(); 1199 } 1200 case 1: { 1201 return Read1to7Bytes(); 1202 } 1203 } 1204 return true; 1205 } Done6()1206 void Done6() { 1207 done_ = true; 1208 switch (buffer_len_) { 1209 case 1: 1210 case 0: { 1211 ok_ = false; 1212 return; 1213 } 1214 } 1215 } DecodeStep6()1216 void DecodeStep6() { 1217 if (!RefillTo3()) { 1218 Done7(); 1219 return; 1220 } 1221 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1222 const auto op = GetOp19(index); 1223 const int consumed = op & 3; 1224 buffer_len_ -= consumed; 1225 const auto emit_ofs = op >> 2; 1226 sink_(GetEmit19(index, emit_ofs + 0)); 1227 } RefillTo3()1228 bool RefillTo3() { 1229 switch (buffer_len_) { 1230 case 0: { 1231 return Read1to8Bytes(); 1232 } 1233 case 1: 1234 case 2: { 1235 return Read1to7Bytes(); 1236 } 1237 } 1238 return true; 1239 } Done7()1240 void Done7() { 1241 done_ = true; 1242 switch (buffer_len_) { 1243 case 1: 1244 case 2: 1245 case 0: { 1246 ok_ = false; 1247 return; 1248 } 1249 } 1250 } DecodeStep7()1251 void DecodeStep7() { 1252 if (!RefillTo2()) { 1253 Done8(); 1254 return; 1255 } 1256 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1257 const auto op = GetOp20(index); 1258 const int consumed = op & 3; 1259 buffer_len_ -= consumed; 1260 const auto emit_ofs = op >> 2; 1261 sink_(GetEmit20(index, emit_ofs + 0)); 1262 } Done8()1263 void Done8() { 1264 done_ = true; 1265 switch (buffer_len_) { 1266 case 1: { 1267 const auto index = buffer_ & 1; 1268 const auto op = GetOp21(index); 1269 switch (op & 1) { 1270 case 0: { 1271 sink_(GetEmit21(index, (op >> 1) + 0)); 1272 break; 1273 } 1274 case 1: { 1275 ok_ = false; 1276 break; 1277 } 1278 } 1279 return; 1280 } 1281 case 0: { 1282 ok_ = false; 1283 return; 1284 } 1285 } 1286 } DecodeStep8()1287 void DecodeStep8() { 1288 if (!RefillTo4()) { 1289 Done9(); 1290 return; 1291 } 1292 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1293 const auto op = GetOp22(index); 1294 const int consumed = op & 7; 1295 buffer_len_ -= consumed; 1296 const auto emit_ofs = op >> 3; 1297 sink_(GetEmit22(index, emit_ofs + 0)); 1298 } RefillTo4()1299 bool RefillTo4() { 1300 switch (buffer_len_) { 1301 case 0: { 1302 return Read1to8Bytes(); 1303 } 1304 case 1: 1305 case 2: 1306 case 3: { 1307 return Read1to7Bytes(); 1308 } 1309 } 1310 return true; 1311 } Done9()1312 void Done9() { 1313 done_ = true; 1314 switch (buffer_len_) { 1315 case 1: 1316 case 2: 1317 case 0: { 1318 ok_ = false; 1319 return; 1320 } 1321 case 3: { 1322 const auto index = buffer_ & 7; 1323 const auto op = GetOp23(index); 1324 switch (op & 1) { 1325 case 0: { 1326 sink_(GetEmit23(index, (op >> 1) + 0)); 1327 break; 1328 } 1329 case 1: { 1330 ok_ = false; 1331 break; 1332 } 1333 } 1334 return; 1335 } 1336 } 1337 } DecodeStep9()1338 void DecodeStep9() { 1339 if (!RefillTo3()) { 1340 Done10(); 1341 return; 1342 } 1343 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1344 const auto op = GetOp24(index); 1345 const int consumed = op & 3; 1346 buffer_len_ -= consumed; 1347 const auto emit_ofs = op >> 2; 1348 sink_(GetEmit24(index, emit_ofs + 0)); 1349 } Done10()1350 void Done10() { 1351 done_ = true; 1352 switch (buffer_len_) { 1353 case 1: 1354 case 0: { 1355 ok_ = false; 1356 return; 1357 } 1358 case 2: { 1359 const auto index = buffer_ & 3; 1360 const auto op = GetOp25(index); 1361 switch (op & 1) { 1362 case 0: { 1363 sink_(GetEmit25(index, (op >> 1) + 0)); 1364 break; 1365 } 1366 case 1: { 1367 ok_ = false; 1368 break; 1369 } 1370 } 1371 return; 1372 } 1373 } 1374 } DecodeStep10()1375 void DecodeStep10() { 1376 if (!RefillTo5()) { 1377 Done11(); 1378 return; 1379 } 1380 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1381 const auto op = GetOp26(index); 1382 const int consumed = op & 7; 1383 buffer_len_ -= consumed; 1384 const auto emit_ofs = op >> 3; 1385 sink_(GetEmit26(index, emit_ofs + 0)); 1386 } RefillTo5()1387 bool RefillTo5() { 1388 switch (buffer_len_) { 1389 case 0: { 1390 return Read1to8Bytes(); 1391 } 1392 case 1: 1393 case 2: 1394 case 3: 1395 case 4: { 1396 return Read1to7Bytes(); 1397 } 1398 } 1399 return true; 1400 } Done11()1401 void Done11() { 1402 done_ = true; 1403 switch (buffer_len_) { 1404 case 1: 1405 case 2: 1406 case 3: 1407 case 0: { 1408 ok_ = false; 1409 return; 1410 } 1411 case 4: { 1412 const auto index = buffer_ & 15; 1413 const auto op = GetOp27(index); 1414 switch (op & 1) { 1415 case 0: { 1416 sink_(GetEmit27(index, (op >> 1) + 0)); 1417 break; 1418 } 1419 case 1: { 1420 ok_ = false; 1421 break; 1422 } 1423 } 1424 return; 1425 } 1426 } 1427 } DecodeStep11()1428 void DecodeStep11() { 1429 if (!RefillTo12()) { 1430 Done12(); 1431 return; 1432 } 1433 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 1434 const auto op = GetOp28(index); 1435 const int consumed = op & 15; 1436 buffer_len_ -= consumed; 1437 const auto emit_ofs = op >> 5; 1438 switch ((op >> 4) & 1) { 1439 case 0: { 1440 sink_(GetEmit28(index, emit_ofs + 0)); 1441 break; 1442 } 1443 case 1: { 1444 begin_ = end_; 1445 buffer_len_ = 0; 1446 break; 1447 } 1448 } 1449 } Done12()1450 void Done12() { 1451 done_ = true; 1452 switch (end_ - begin_) { 1453 case 1: { 1454 Fill1(); 1455 break; 1456 } 1457 } 1458 switch (buffer_len_) { 1459 case 1: 1460 case 2: 1461 case 3: 1462 case 4: { 1463 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1464 return; 1465 } 1466 case 5: { 1467 const auto index = buffer_ & 31; 1468 const auto op = GetOp29(index); 1469 switch (op & 3) { 1470 case 0: { 1471 sink_(GetEmit29(index, (op >> 2) + 0)); 1472 break; 1473 } 1474 case 1: { 1475 ok_ = false; 1476 break; 1477 } 1478 } 1479 return; 1480 } 1481 case 6: { 1482 const auto index = buffer_ & 63; 1483 const auto op = GetOp30(index); 1484 switch (op & 3) { 1485 case 0: { 1486 ok_ = false; 1487 break; 1488 } 1489 case 1: { 1490 sink_(GetEmit30(index, (op >> 2) + 0)); 1491 break; 1492 } 1493 } 1494 return; 1495 } 1496 case 7: { 1497 const auto index = buffer_ & 127; 1498 const auto op = GetOp31(index); 1499 switch (op & 3) { 1500 case 0: { 1501 ok_ = false; 1502 break; 1503 } 1504 case 1: { 1505 sink_(GetEmit31(index, (op >> 2) + 0)); 1506 break; 1507 } 1508 } 1509 return; 1510 } 1511 case 8: { 1512 const auto index = buffer_ & 255; 1513 const auto op = GetOp32(index); 1514 switch (op & 3) { 1515 case 0: { 1516 ok_ = false; 1517 break; 1518 } 1519 case 1: { 1520 sink_(GetEmit32(index, (op >> 2) + 0)); 1521 break; 1522 } 1523 } 1524 return; 1525 } 1526 case 9: { 1527 const auto index = buffer_ & 511; 1528 const auto op = GetOp33(index); 1529 switch (op & 3) { 1530 case 0: { 1531 ok_ = false; 1532 break; 1533 } 1534 case 1: { 1535 sink_(GetEmit33(index, (op >> 2) + 0)); 1536 break; 1537 } 1538 } 1539 return; 1540 } 1541 case 10: { 1542 const auto index = buffer_ & 1023; 1543 const auto op = GetOp34(index); 1544 switch (op & 3) { 1545 case 0: { 1546 sink_(GetEmit34(index, (op >> 2) + 0)); 1547 sink_(GetEmit34(index, (op >> 2) + 1)); 1548 break; 1549 } 1550 case 1: { 1551 ok_ = false; 1552 break; 1553 } 1554 case 2: { 1555 sink_(GetEmit34(index, (op >> 2) + 0)); 1556 break; 1557 } 1558 } 1559 return; 1560 } 1561 case 11: { 1562 const auto index = buffer_ & 2047; 1563 const auto op = GetOp35(index); 1564 switch (op & 3) { 1565 case 0: { 1566 ok_ = false; 1567 break; 1568 } 1569 case 1: { 1570 sink_(GetEmit35(index, (op >> 2) + 0)); 1571 sink_(GetEmit35(index, (op >> 2) + 1)); 1572 break; 1573 } 1574 case 2: { 1575 sink_(GetEmit35(index, (op >> 2) + 0)); 1576 break; 1577 } 1578 } 1579 return; 1580 } 1581 case 0: { 1582 return; 1583 } 1584 } 1585 } 1586 F sink_; 1587 const uint8_t* begin_; 1588 const uint8_t* const end_; 1589 uint64_t buffer_ = 0; 1590 int buffer_len_ = 0; 1591 bool ok_ = true; 1592 bool done_ = false; 1593 }; 1594 } // namespace geometry_12_6_12 1595 } // namespace grpc_core 1596 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_6_12_H 1597