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_13_5_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_13_5_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_12_13_5 { 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 } GetOp23(size_t i)136 static inline uint64_t GetOp23(size_t i) { 137 return table23_ops_[i >> 6][i & 0x3f]; 138 } GetEmit23(size_t i,size_t emit)139 static inline uint64_t GetEmit23(size_t i, size_t emit) { 140 return table23_emit_[i >> 6][emit]; 141 } GetOp12(size_t i)142 static inline uint64_t GetOp12(size_t i) { 143 return table12_ops_[i >> 8][i & 0xff]; 144 } GetEmit12(size_t i,size_t emit)145 static inline uint64_t GetEmit12(size_t i, size_t emit) { 146 return table12_emit_[i >> 8][emit]; 147 } GetOp24(size_t i)148 static inline uint64_t GetOp24(size_t i) { return i ? 3 : 1; } GetEmit24(size_t,size_t emit)149 static inline uint64_t GetEmit24(size_t, size_t emit) { return emit + 192; } GetOp25(size_t i)150 static inline uint64_t GetOp25(size_t i) { return i ? 3 : 1; } GetEmit25(size_t,size_t emit)151 static inline uint64_t GetEmit25(size_t, size_t emit) { return emit + 200; } GetOp26(size_t i)152 static inline uint64_t GetOp26(size_t i) { return i ? 3 : 1; } GetEmit26(size_t,size_t emit)153 static inline uint64_t GetEmit26(size_t, size_t emit) { 154 return emit ? 205 : 202; 155 } GetOp27(size_t i)156 static inline uint64_t GetOp27(size_t i) { return i ? 3 : 1; } GetEmit27(size_t,size_t emit)157 static inline uint64_t GetEmit27(size_t, size_t emit) { 158 return emit ? 213 : 210; 159 } GetOp28(size_t i)160 static inline uint64_t GetOp28(size_t i) { return i ? 3 : 1; } GetEmit28(size_t,size_t emit)161 static inline uint64_t GetEmit28(size_t, size_t emit) { return emit + 218; } GetOp29(size_t i)162 static inline uint64_t GetOp29(size_t i) { return i ? 3 : 1; } GetEmit29(size_t,size_t emit)163 static inline uint64_t GetEmit29(size_t, size_t emit) { 164 return emit ? 240 : 238; 165 } GetOp30(size_t i)166 static inline uint64_t GetOp30(size_t i) { return i ? 3 : 1; } GetEmit30(size_t,size_t emit)167 static inline uint64_t GetEmit30(size_t, size_t emit) { return emit + 242; } GetOp31(size_t i)168 static inline uint64_t GetOp31(size_t i) { 169 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 170 } GetEmit31(size_t,size_t emit)171 static inline uint64_t GetEmit31(size_t, size_t emit) { 172 return (emit < 2 ? (emit + 211) : ((emit - 2) ? 221 : 214)); 173 } GetOp32(size_t i)174 static inline uint64_t GetOp32(size_t i) { 175 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 176 } GetEmit32(size_t,size_t emit)177 static inline uint64_t GetEmit32(size_t, size_t emit) { 178 return (emit < 2 ? (emit + 222) : ((emit - 2) ? 244 : 241)); 179 } GetOp33(size_t i)180 static inline uint64_t GetOp33(size_t i) { 181 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 182 } GetEmit33(size_t,size_t emit)183 static inline uint64_t GetEmit33(size_t, size_t emit) { return emit + 245; } GetOp34(size_t i)184 static inline uint64_t GetOp34(size_t i) { 185 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 186 } GetEmit34(size_t,size_t emit)187 static inline uint64_t GetEmit34(size_t, size_t emit) { return emit + 250; } GetOp35(size_t i)188 static inline uint64_t GetOp35(size_t i) { return table35_0_inner_[i]; } GetEmit35(size_t,size_t emit)189 static inline uint64_t GetEmit35(size_t, size_t emit) { 190 return table35_0_emit_[emit]; 191 } GetOp36(size_t i)192 static inline uint64_t GetOp36(size_t i) { return table35_0_inner_[i]; } GetEmit36(size_t,size_t emit)193 static inline uint64_t GetEmit36(size_t, size_t emit) { 194 return (emit < 3 ? (emit + 19) : ((emit - 3) + 23)); 195 } GetOp38(size_t i)196 static inline uint64_t GetOp38(size_t i) { return i; } GetEmit38(size_t,size_t emit)197 static inline uint64_t GetEmit38(size_t, size_t emit) { 198 return ((void)emit, 255); 199 } GetOp37(size_t i)200 static inline uint64_t GetOp37(size_t i) { 201 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 202 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 203 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 204 } GetEmit37(size_t,size_t emit)205 static inline uint64_t GetEmit37(size_t, size_t emit) { 206 return (emit < 1 ? (((void)emit, 255)) : ((emit - 1) + 203)); 207 } GetOp40(size_t i)208 static inline uint64_t GetOp40(size_t i) { 209 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 210 } GetEmit40(size_t,size_t emit)211 static inline uint64_t GetEmit40(size_t, size_t emit) { 212 return ((void)emit, 254); 213 } GetOp39(size_t i)214 static inline uint64_t GetOp39(size_t i) { 215 return table39_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 216 } GetEmit39(size_t,size_t emit)217 static inline uint64_t GetEmit39(size_t, size_t emit) { 218 return (emit < 1 ? (((void)emit, 254)) : ((emit - 1) + 2)); 219 } GetOp42(size_t i)220 static inline uint64_t GetOp42(size_t i) { return table42_0_inner_[i]; } GetEmit42(size_t,size_t emit)221 static inline uint64_t GetEmit42(size_t, size_t emit) { 222 return table42_0_emit_[emit]; 223 } GetOp43(size_t i)224 static inline uint64_t GetOp43(size_t i) { 225 return table43_0_inner_[table43_0_outer_[i]]; 226 } GetEmit43(size_t,size_t emit)227 static inline uint64_t GetEmit43(size_t, size_t emit) { 228 return table42_0_emit_[emit]; 229 } GetOp41(size_t i)230 static inline uint64_t GetOp41(size_t i) { return table41_0_ops_[i]; } GetEmit41(size_t,size_t emit)231 static inline uint64_t GetEmit41(size_t, size_t emit) { 232 return table41_0_emit_[emit]; 233 } 234 235 private: 236 static const uint8_t table2_0_emit_[10]; 237 static const uint8_t table2_0_ops_[32]; 238 static const uint8_t table3_0_emit_[36]; 239 static const uint8_t table3_0_ops_[64]; 240 static const uint8_t table4_0_emit_[22]; 241 static const uint8_t table4_0_ops_[64]; 242 static const uint8_t table4_1_emit_[46]; 243 static const uint8_t table4_1_ops_[64]; 244 static const uint8_t* const table4_emit_[2]; 245 static const uint8_t* const table4_ops_[2]; 246 static const uint8_t table5_0_ops_[128]; 247 static const uint8_t table5_1_emit_[52]; 248 static const uint8_t table5_1_ops_[128]; 249 static const uint8_t* const table5_emit_[2]; 250 static const uint8_t* const table5_ops_[2]; 251 static const uint8_t table6_0_emit_[2]; 252 static const uint8_t table6_0_ops_[32]; 253 static const uint8_t table6_1_emit_[2]; 254 static const uint8_t table6_2_emit_[2]; 255 static const uint8_t table6_3_emit_[2]; 256 static const uint8_t table6_4_emit_[2]; 257 static const uint8_t table6_5_emit_[4]; 258 static const uint8_t table6_5_ops_[32]; 259 static const uint8_t table6_6_emit_[4]; 260 static const uint8_t table6_7_emit_[4]; 261 static const uint8_t table6_8_emit_[4]; 262 static const uint8_t table6_9_emit_[4]; 263 static const uint8_t table6_10_emit_[4]; 264 static const uint8_t table6_11_emit_[6]; 265 static const uint8_t table6_11_ops_[32]; 266 static const uint8_t table6_12_emit_[8]; 267 static const uint8_t table6_12_ops_[32]; 268 static const uint8_t table6_13_emit_[8]; 269 static const uint8_t table6_14_emit_[8]; 270 static const uint8_t table6_15_emit_[10]; 271 static const uint8_t table6_15_ops_[32]; 272 static const uint8_t* const table6_emit_[16]; 273 static const uint8_t* const table6_ops_[16]; 274 static const uint8_t table7_0_emit_[36]; 275 static const uint8_t table7_0_ops_[64]; 276 static const uint8_t table7_1_emit_[36]; 277 static const uint8_t table7_1_ops_[64]; 278 static const uint8_t table7_2_emit_[36]; 279 static const uint8_t table7_2_ops_[64]; 280 static const uint8_t table7_3_emit_[36]; 281 static const uint8_t table7_3_ops_[64]; 282 static const uint8_t table7_4_emit_[38]; 283 static const uint8_t table7_4_ops_[64]; 284 static const uint8_t table7_5_ops_[64]; 285 static const uint8_t table7_11_ops_[64]; 286 static const uint8_t table7_12_ops_[64]; 287 static const uint8_t table7_15_emit_[15]; 288 static const uint8_t table7_15_ops_[64]; 289 static const uint8_t* const table7_emit_[16]; 290 static const uint8_t* const table7_ops_[16]; 291 static const uint8_t table8_0_emit_[71]; 292 static const uint16_t table8_0_inner_[38]; 293 static const uint8_t table8_0_outer_[64]; 294 static const uint8_t table8_1_emit_[71]; 295 static const uint16_t table8_1_inner_[38]; 296 static const uint8_t table8_2_emit_[71]; 297 static const uint16_t table8_2_inner_[38]; 298 static const uint8_t table8_3_emit_[71]; 299 static const uint16_t table8_3_inner_[38]; 300 static const uint8_t table8_4_emit_[71]; 301 static const uint16_t table8_4_inner_[38]; 302 static const uint8_t table8_5_emit_[71]; 303 static const uint16_t table8_5_inner_[38]; 304 static const uint8_t table8_6_emit_[71]; 305 static const uint16_t table8_6_inner_[38]; 306 static const uint8_t table8_7_emit_[71]; 307 static const uint16_t table8_7_inner_[38]; 308 static const uint8_t table8_8_emit_[71]; 309 static const uint16_t table8_8_inner_[38]; 310 static const uint8_t table8_9_emit_[71]; 311 static const uint16_t table8_9_inner_[38]; 312 static const uint8_t table8_10_emit_[40]; 313 static const uint16_t table8_10_inner_[23]; 314 static const uint8_t table8_10_outer_[64]; 315 static const uint8_t table8_11_emit_[40]; 316 static const uint8_t table8_12_emit_[40]; 317 static const uint8_t table8_13_emit_[40]; 318 static const uint8_t table8_14_emit_[40]; 319 static const uint8_t table8_15_emit_[40]; 320 static const uint8_t table8_16_emit_[40]; 321 static const uint8_t table8_17_emit_[40]; 322 static const uint8_t table8_18_emit_[40]; 323 static const uint8_t table8_19_emit_[40]; 324 static const uint8_t table8_20_emit_[40]; 325 static const uint8_t table8_21_emit_[40]; 326 static const uint8_t table8_22_emit_[40]; 327 static const uint8_t table8_23_emit_[4]; 328 static const uint16_t table8_23_inner_[5]; 329 static const uint8_t table8_23_outer_[64]; 330 static const uint8_t table8_24_emit_[4]; 331 static const uint8_t table8_25_emit_[4]; 332 static const uint8_t table8_26_emit_[4]; 333 static const uint8_t table8_27_emit_[4]; 334 static const uint8_t table8_28_emit_[4]; 335 static const uint8_t table8_29_emit_[4]; 336 static const uint8_t table8_30_emit_[4]; 337 static const uint8_t table8_31_emit_[14]; 338 static const uint16_t table8_31_inner_[16]; 339 static const uint8_t table8_31_outer_[64]; 340 static const uint8_t* const table8_emit_[32]; 341 static const uint16_t* const table8_inner_[32]; 342 static const uint8_t* const table8_outer_[32]; 343 static const uint8_t table1_0_emit_[135]; 344 static const uint16_t table1_0_inner_[69]; 345 static const uint8_t table1_0_outer_[128]; 346 static const uint8_t table1_1_emit_[135]; 347 static const uint16_t table1_1_inner_[69]; 348 static const uint8_t table1_2_emit_[135]; 349 static const uint16_t table1_2_inner_[69]; 350 static const uint8_t table1_3_emit_[135]; 351 static const uint16_t table1_3_inner_[69]; 352 static const uint8_t table1_4_emit_[135]; 353 static const uint16_t table1_4_inner_[69]; 354 static const uint8_t table1_5_emit_[135]; 355 static const uint16_t table1_5_inner_[69]; 356 static const uint8_t table1_6_emit_[135]; 357 static const uint16_t table1_6_inner_[69]; 358 static const uint8_t table1_7_emit_[135]; 359 static const uint16_t table1_7_inner_[69]; 360 static const uint8_t table1_8_emit_[135]; 361 static const uint16_t table1_8_inner_[69]; 362 static const uint8_t table1_9_emit_[135]; 363 static const uint16_t table1_9_inner_[69]; 364 static const uint8_t table1_10_emit_[140]; 365 static const uint16_t table1_10_inner_[74]; 366 static const uint8_t table1_10_outer_[128]; 367 static const uint8_t table1_11_emit_[140]; 368 static const uint16_t table1_11_inner_[74]; 369 static const uint8_t table1_12_emit_[140]; 370 static const uint16_t table1_12_inner_[74]; 371 static const uint8_t table1_13_emit_[140]; 372 static const uint16_t table1_13_inner_[74]; 373 static const uint8_t table1_14_emit_[140]; 374 static const uint16_t table1_14_inner_[74]; 375 static const uint8_t table1_15_emit_[140]; 376 static const uint16_t table1_15_inner_[74]; 377 static const uint8_t table1_16_emit_[140]; 378 static const uint16_t table1_16_inner_[74]; 379 static const uint8_t table1_17_emit_[140]; 380 static const uint16_t table1_17_inner_[74]; 381 static const uint8_t table1_18_emit_[140]; 382 static const uint16_t table1_18_inner_[74]; 383 static const uint8_t table1_19_emit_[140]; 384 static const uint16_t table1_19_inner_[74]; 385 static const uint8_t table1_20_emit_[140]; 386 static const uint16_t table1_20_inner_[74]; 387 static const uint8_t table1_21_emit_[140]; 388 static const uint16_t table1_21_inner_[74]; 389 static const uint8_t table1_22_emit_[142]; 390 static const uint16_t table1_22_inner_[74]; 391 static const uint8_t table1_23_emit_[80]; 392 static const uint16_t table1_23_inner_[44]; 393 static const uint8_t table1_23_outer_[128]; 394 static const uint8_t table1_24_emit_[80]; 395 static const uint8_t table1_25_emit_[80]; 396 static const uint8_t table1_26_emit_[80]; 397 static const uint8_t table1_27_emit_[80]; 398 static const uint8_t table1_28_emit_[80]; 399 static const uint8_t table1_29_emit_[80]; 400 static const uint8_t table1_30_emit_[80]; 401 static const uint8_t table1_31_emit_[16]; 402 static const uint16_t table1_31_inner_[20]; 403 static const uint8_t table1_31_outer_[128]; 404 static const uint8_t* const table1_emit_[32]; 405 static const uint16_t* const table1_inner_[32]; 406 static const uint8_t* const table1_outer_[32]; 407 static const uint8_t table14_0_emit_[5]; 408 static const uint8_t table14_0_inner_[7]; 409 static const uint8_t table14_0_outer_[8]; 410 static const uint8_t table15_0_outer_[16]; 411 static const uint8_t table16_0_ops_[32]; 412 static const uint8_t table17_0_ops_[64]; 413 static const uint8_t table18_0_emit_[46]; 414 static const uint8_t table18_0_ops_[128]; 415 static const uint8_t table19_0_emit_[44]; 416 static const uint8_t table19_0_ops_[32]; 417 static const uint8_t table19_1_emit_[28]; 418 static const uint8_t table19_1_ops_[32]; 419 static const uint8_t table19_2_emit_[44]; 420 static const uint8_t table19_3_emit_[28]; 421 static const uint8_t table19_4_emit_[20]; 422 static const uint8_t table19_4_ops_[32]; 423 static const uint8_t table19_5_emit_[20]; 424 static const uint8_t table19_6_emit_[20]; 425 static const uint8_t table19_7_emit_[11]; 426 static const uint8_t table19_7_ops_[32]; 427 static const uint8_t* const table19_emit_[8]; 428 static const uint8_t* const table19_ops_[8]; 429 static const uint16_t table20_0_ops_[64]; 430 static const uint8_t table20_1_emit_[92]; 431 static const uint16_t table20_1_ops_[64]; 432 static const uint8_t table20_3_emit_[92]; 433 static const uint8_t table20_4_emit_[72]; 434 static const uint16_t table20_4_ops_[64]; 435 static const uint8_t table20_5_emit_[72]; 436 static const uint8_t table20_6_emit_[72]; 437 static const uint8_t table20_7_emit_[24]; 438 static const uint16_t table20_7_ops_[64]; 439 static const uint8_t* const table20_emit_[8]; 440 static const uint16_t* const table20_ops_[8]; 441 static const uint16_t table21_0_ops_[128]; 442 static const uint8_t table21_1_emit_[104]; 443 static const uint16_t table21_1_ops_[128]; 444 static const uint8_t table21_3_emit_[104]; 445 static const uint8_t table21_4_emit_[136]; 446 static const uint16_t table21_4_ops_[128]; 447 static const uint8_t table21_5_emit_[136]; 448 static const uint8_t table21_6_emit_[136]; 449 static const uint8_t table21_7_emit_[50]; 450 static const uint16_t table21_7_ops_[128]; 451 static const uint8_t* const table21_emit_[8]; 452 static const uint16_t* const table21_ops_[8]; 453 static const uint8_t table22_0_emit_[16]; 454 static const uint16_t table22_0_ops_[128]; 455 static const uint8_t table22_1_emit_[28]; 456 static const uint16_t table22_1_ops_[128]; 457 static const uint8_t table22_2_emit_[36]; 458 static const uint16_t table22_2_ops_[128]; 459 static const uint8_t table22_3_emit_[68]; 460 static const uint16_t table22_3_ops_[128]; 461 static const uint8_t table22_4_emit_[16]; 462 static const uint8_t table22_5_emit_[28]; 463 static const uint8_t table22_6_emit_[36]; 464 static const uint8_t table22_7_emit_[68]; 465 static const uint8_t table22_8_emit_[44]; 466 static const uint8_t table22_9_emit_[104]; 467 static const uint8_t table22_10_emit_[44]; 468 static const uint8_t table22_11_emit_[104]; 469 static const uint8_t table22_12_emit_[44]; 470 static const uint8_t table22_13_emit_[104]; 471 static const uint8_t table22_14_emit_[15]; 472 static const uint16_t table22_14_ops_[128]; 473 static const uint8_t table22_15_emit_[64]; 474 static const uint16_t table22_15_ops_[128]; 475 static const uint8_t* const table22_emit_[16]; 476 static const uint16_t* const table22_ops_[16]; 477 static const uint8_t table23_0_emit_[60]; 478 static const uint16_t table23_0_ops_[64]; 479 static const uint8_t table23_1_emit_[60]; 480 static const uint8_t table23_2_emit_[60]; 481 static const uint8_t table23_3_emit_[60]; 482 static const uint8_t table23_4_emit_[60]; 483 static const uint8_t table23_5_emit_[8]; 484 static const uint16_t table23_5_ops_[64]; 485 static const uint8_t table23_6_emit_[8]; 486 static const uint8_t table23_7_emit_[8]; 487 static const uint8_t table23_8_emit_[8]; 488 static const uint8_t table23_9_emit_[8]; 489 static const uint8_t table23_10_emit_[8]; 490 static const uint8_t table23_11_emit_[12]; 491 static const uint16_t table23_11_ops_[64]; 492 static const uint8_t table23_12_emit_[16]; 493 static const uint16_t table23_12_ops_[64]; 494 static const uint8_t table23_13_emit_[16]; 495 static const uint8_t table23_14_emit_[16]; 496 static const uint8_t table23_15_emit_[30]; 497 static const uint16_t table23_15_ops_[64]; 498 static const uint8_t table23_16_emit_[60]; 499 static const uint8_t table23_17_emit_[60]; 500 static const uint8_t table23_18_emit_[60]; 501 static const uint8_t table23_19_emit_[60]; 502 static const uint8_t table23_20_emit_[60]; 503 static const uint8_t table23_21_emit_[8]; 504 static const uint8_t table23_22_emit_[8]; 505 static const uint8_t table23_23_emit_[8]; 506 static const uint8_t table23_24_emit_[8]; 507 static const uint8_t table23_25_emit_[8]; 508 static const uint8_t table23_26_emit_[8]; 509 static const uint8_t table23_27_emit_[12]; 510 static const uint8_t table23_28_emit_[16]; 511 static const uint8_t table23_29_emit_[16]; 512 static const uint8_t table23_30_emit_[16]; 513 static const uint8_t table23_31_emit_[30]; 514 static const uint8_t table23_32_emit_[8]; 515 static const uint8_t table23_33_emit_[8]; 516 static const uint8_t table23_34_emit_[12]; 517 static const uint8_t table23_35_emit_[16]; 518 static const uint8_t table23_36_emit_[16]; 519 static const uint8_t table23_37_emit_[20]; 520 static const uint16_t table23_37_ops_[64]; 521 static const uint8_t table23_38_emit_[32]; 522 static const uint16_t table23_38_ops_[64]; 523 static const uint8_t table23_39_emit_[36]; 524 static const uint16_t table23_39_ops_[64]; 525 static const uint8_t table23_40_emit_[8]; 526 static const uint8_t table23_41_emit_[8]; 527 static const uint8_t table23_42_emit_[12]; 528 static const uint8_t table23_43_emit_[16]; 529 static const uint8_t table23_44_emit_[16]; 530 static const uint8_t table23_45_emit_[20]; 531 static const uint8_t table23_46_emit_[32]; 532 static const uint8_t table23_47_emit_[36]; 533 static const uint8_t table23_48_emit_[8]; 534 static const uint8_t table23_49_emit_[8]; 535 static const uint8_t table23_50_emit_[12]; 536 static const uint8_t table23_51_emit_[16]; 537 static const uint8_t table23_52_emit_[16]; 538 static const uint8_t table23_53_emit_[20]; 539 static const uint8_t table23_54_emit_[32]; 540 static const uint8_t table23_55_emit_[36]; 541 static const uint8_t table23_56_emit_[40]; 542 static const uint16_t table23_56_ops_[64]; 543 static const uint8_t table23_57_emit_[22]; 544 static const uint16_t table23_57_ops_[64]; 545 static const uint8_t table23_58_emit_[4]; 546 static const uint16_t table23_58_ops_[64]; 547 static const uint8_t table23_59_emit_[6]; 548 static const uint16_t table23_59_ops_[64]; 549 static const uint8_t table23_60_emit_[8]; 550 static const uint16_t table23_60_ops_[64]; 551 static const uint8_t table23_61_emit_[15]; 552 static const uint16_t table23_61_ops_[64]; 553 static const uint8_t table23_62_emit_[20]; 554 static const uint16_t table23_62_ops_[64]; 555 static const uint8_t table23_63_emit_[33]; 556 static const uint16_t table23_63_ops_[64]; 557 static const uint8_t* const table23_emit_[64]; 558 static const uint16_t* const table23_ops_[64]; 559 static const uint8_t table12_0_emit_[1]; 560 static const uint16_t table12_0_ops_[256]; 561 static const uint8_t table12_8_emit_[1]; 562 static const uint8_t table12_16_emit_[1]; 563 static const uint16_t table12_16_ops_[256]; 564 static const uint8_t table12_20_emit_[1]; 565 static const uint8_t table12_24_emit_[1]; 566 static const uint8_t table12_28_emit_[5]; 567 static const uint16_t table12_28_ops_[256]; 568 static const uint8_t table12_29_emit_[10]; 569 static const uint16_t table12_29_ops_[256]; 570 static const uint8_t table12_30_emit_[23]; 571 static const uint16_t table12_30_ops_[256]; 572 static const uint8_t table12_31_emit_[57]; 573 static const uint16_t table12_31_ops_[256]; 574 static const uint8_t* const table12_emit_[32]; 575 static const uint16_t* const table12_ops_[32]; 576 static const uint8_t table35_0_emit_[8]; 577 static const uint8_t table35_0_inner_[8]; 578 static const uint8_t table39_0_inner_[7]; 579 static const uint8_t table42_0_emit_[7]; 580 static const uint8_t table42_0_inner_[8]; 581 static const uint8_t table43_0_inner_[9]; 582 static const uint8_t table43_0_outer_[16]; 583 static const uint8_t table41_0_emit_[10]; 584 static const uint8_t table41_0_ops_[32]; 585 }; 586 template <typename F> 587 class HuffDecoder : public HuffDecoderCommon { 588 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)589 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 590 : sink_(sink), begin_(begin), end_(end) {} Run()591 bool Run() { 592 while (!done_) { 593 if (!RefillTo12()) { 594 Done0(); 595 break; 596 } 597 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 598 const auto op = GetOp1(index); 599 const int consumed = op & 15; 600 buffer_len_ -= consumed; 601 const auto emit_ofs = op >> 7; 602 switch ((op >> 4) & 7) { 603 case 0: { 604 sink_(GetEmit1(index, emit_ofs + 0)); 605 sink_(GetEmit1(index, emit_ofs + 1)); 606 break; 607 } 608 case 1: { 609 sink_(GetEmit1(index, emit_ofs + 0)); 610 break; 611 } 612 case 2: { 613 DecodeStep0(); 614 break; 615 } 616 case 3: { 617 DecodeStep1(); 618 break; 619 } 620 case 4: { 621 DecodeStep2(); 622 break; 623 } 624 case 5: { 625 DecodeStep3(); 626 break; 627 } 628 } 629 } 630 return ok_; 631 } 632 633 private: RefillTo12()634 bool RefillTo12() { 635 switch (buffer_len_) { 636 case 0: { 637 return Read2to8Bytes(); 638 } 639 case 1: 640 case 2: 641 case 3: { 642 return Read2to7Bytes(); 643 } 644 case 4: 645 case 5: 646 case 6: 647 case 7: 648 case 8: { 649 return Read1to7Bytes(); 650 } 651 case 9: 652 case 10: 653 case 11: { 654 return Read1to6Bytes(); 655 } 656 } 657 return true; 658 } Read2to8Bytes()659 bool Read2to8Bytes() { 660 switch (end_ - begin_) { 661 case 0: 662 case 1: { 663 return false; 664 } 665 case 2: { 666 Fill2(); 667 return true; 668 } 669 case 3: { 670 Fill3(); 671 return true; 672 } 673 case 4: { 674 Fill4(); 675 return true; 676 } 677 case 5: { 678 Fill5(); 679 return true; 680 } 681 case 6: { 682 Fill6(); 683 return true; 684 } 685 case 7: { 686 Fill7(); 687 return true; 688 } 689 default: { 690 Fill8(); 691 return true; 692 } 693 } 694 } Fill2()695 void Fill2() { 696 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 697 (static_cast<uint64_t>(begin_[1]) << 0); 698 begin_ += 2; 699 buffer_len_ += 16; 700 } Fill3()701 void Fill3() { 702 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 703 (static_cast<uint64_t>(begin_[1]) << 8) | 704 (static_cast<uint64_t>(begin_[2]) << 0); 705 begin_ += 3; 706 buffer_len_ += 24; 707 } Fill4()708 void Fill4() { 709 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 710 (static_cast<uint64_t>(begin_[1]) << 16) | 711 (static_cast<uint64_t>(begin_[2]) << 8) | 712 (static_cast<uint64_t>(begin_[3]) << 0); 713 begin_ += 4; 714 buffer_len_ += 32; 715 } Fill5()716 void Fill5() { 717 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 718 (static_cast<uint64_t>(begin_[1]) << 24) | 719 (static_cast<uint64_t>(begin_[2]) << 16) | 720 (static_cast<uint64_t>(begin_[3]) << 8) | 721 (static_cast<uint64_t>(begin_[4]) << 0); 722 begin_ += 5; 723 buffer_len_ += 40; 724 } Fill6()725 void Fill6() { 726 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 727 (static_cast<uint64_t>(begin_[1]) << 32) | 728 (static_cast<uint64_t>(begin_[2]) << 24) | 729 (static_cast<uint64_t>(begin_[3]) << 16) | 730 (static_cast<uint64_t>(begin_[4]) << 8) | 731 (static_cast<uint64_t>(begin_[5]) << 0); 732 begin_ += 6; 733 buffer_len_ += 48; 734 } Fill7()735 void Fill7() { 736 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 737 (static_cast<uint64_t>(begin_[1]) << 40) | 738 (static_cast<uint64_t>(begin_[2]) << 32) | 739 (static_cast<uint64_t>(begin_[3]) << 24) | 740 (static_cast<uint64_t>(begin_[4]) << 16) | 741 (static_cast<uint64_t>(begin_[5]) << 8) | 742 (static_cast<uint64_t>(begin_[6]) << 0); 743 begin_ += 7; 744 buffer_len_ += 56; 745 } Fill8()746 void Fill8() { 747 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 748 (static_cast<uint64_t>(begin_[1]) << 48) | 749 (static_cast<uint64_t>(begin_[2]) << 40) | 750 (static_cast<uint64_t>(begin_[3]) << 32) | 751 (static_cast<uint64_t>(begin_[4]) << 24) | 752 (static_cast<uint64_t>(begin_[5]) << 16) | 753 (static_cast<uint64_t>(begin_[6]) << 8) | 754 (static_cast<uint64_t>(begin_[7]) << 0); 755 begin_ += 8; 756 buffer_len_ += 64; 757 } Read2to7Bytes()758 bool Read2to7Bytes() { 759 switch (end_ - begin_) { 760 case 0: 761 case 1: { 762 return false; 763 } 764 case 2: { 765 Fill2(); 766 return true; 767 } 768 case 3: { 769 Fill3(); 770 return true; 771 } 772 case 4: { 773 Fill4(); 774 return true; 775 } 776 case 5: { 777 Fill5(); 778 return true; 779 } 780 case 6: { 781 Fill6(); 782 return true; 783 } 784 default: { 785 Fill7(); 786 return true; 787 } 788 } 789 } Read1to7Bytes()790 bool Read1to7Bytes() { 791 switch (end_ - begin_) { 792 case 0: { 793 return false; 794 } 795 case 1: { 796 Fill1(); 797 return true; 798 } 799 case 2: { 800 Fill2(); 801 return true; 802 } 803 case 3: { 804 Fill3(); 805 return true; 806 } 807 case 4: { 808 Fill4(); 809 return true; 810 } 811 case 5: { 812 Fill5(); 813 return true; 814 } 815 case 6: { 816 Fill6(); 817 return true; 818 } 819 default: { 820 Fill7(); 821 return true; 822 } 823 } 824 } Fill1()825 void Fill1() { 826 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 827 begin_ += 1; 828 buffer_len_ += 8; 829 } Read1to6Bytes()830 bool Read1to6Bytes() { 831 switch (end_ - begin_) { 832 case 0: { 833 return false; 834 } 835 case 1: { 836 Fill1(); 837 return true; 838 } 839 case 2: { 840 Fill2(); 841 return true; 842 } 843 case 3: { 844 Fill3(); 845 return true; 846 } 847 case 4: { 848 Fill4(); 849 return true; 850 } 851 case 5: { 852 Fill5(); 853 return true; 854 } 855 default: { 856 Fill6(); 857 return true; 858 } 859 } 860 } Done0()861 void Done0() { 862 done_ = true; 863 switch (end_ - begin_) { 864 case 1: { 865 Fill1(); 866 break; 867 } 868 } 869 switch (buffer_len_) { 870 case 1: 871 case 2: 872 case 3: 873 case 4: { 874 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 875 return; 876 } 877 case 5: { 878 const auto index = buffer_ & 31; 879 const auto op = GetOp2(index); 880 switch (op & 3) { 881 case 0: { 882 sink_(GetEmit2(index, (op >> 2) + 0)); 883 break; 884 } 885 case 1: { 886 ok_ = false; 887 break; 888 } 889 } 890 return; 891 } 892 case 6: { 893 const auto index = buffer_ & 63; 894 const auto op = GetOp3(index); 895 switch (op & 3) { 896 case 0: { 897 ok_ = false; 898 break; 899 } 900 case 1: { 901 sink_(GetEmit3(index, (op >> 2) + 0)); 902 break; 903 } 904 } 905 return; 906 } 907 case 7: { 908 const auto index = buffer_ & 127; 909 const auto op = GetOp4(index); 910 switch (op & 3) { 911 case 0: { 912 ok_ = false; 913 break; 914 } 915 case 1: { 916 sink_(GetEmit4(index, (op >> 2) + 0)); 917 break; 918 } 919 } 920 return; 921 } 922 case 8: { 923 const auto index = buffer_ & 255; 924 const auto op = GetOp5(index); 925 switch (op & 3) { 926 case 0: { 927 ok_ = false; 928 break; 929 } 930 case 1: { 931 sink_(GetEmit5(index, (op >> 2) + 0)); 932 break; 933 } 934 } 935 return; 936 } 937 case 9: { 938 const auto index = buffer_ & 511; 939 const auto op = GetOp6(index); 940 switch (op & 3) { 941 case 0: { 942 ok_ = false; 943 break; 944 } 945 case 1: { 946 sink_(GetEmit6(index, (op >> 2) + 0)); 947 break; 948 } 949 } 950 return; 951 } 952 case 10: { 953 const auto index = buffer_ & 1023; 954 const auto op = GetOp7(index); 955 switch (op & 3) { 956 case 0: { 957 sink_(GetEmit7(index, (op >> 2) + 0)); 958 sink_(GetEmit7(index, (op >> 2) + 1)); 959 break; 960 } 961 case 1: { 962 ok_ = false; 963 break; 964 } 965 case 2: { 966 sink_(GetEmit7(index, (op >> 2) + 0)); 967 break; 968 } 969 } 970 return; 971 } 972 case 11: { 973 const auto index = buffer_ & 2047; 974 const auto op = GetOp8(index); 975 switch (op & 3) { 976 case 0: { 977 ok_ = false; 978 break; 979 } 980 case 1: { 981 sink_(GetEmit8(index, (op >> 2) + 0)); 982 sink_(GetEmit8(index, (op >> 2) + 1)); 983 break; 984 } 985 case 2: { 986 sink_(GetEmit8(index, (op >> 2) + 0)); 987 break; 988 } 989 } 990 return; 991 } 992 case 0: { 993 return; 994 } 995 } 996 } DecodeStep0()997 void DecodeStep0() { 998 if (!RefillTo1()) { 999 Done1(); 1000 return; 1001 } 1002 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1003 const auto op = GetOp9(index); 1004 const int consumed = op & 1; 1005 buffer_len_ -= consumed; 1006 const auto emit_ofs = op >> 1; 1007 sink_(GetEmit9(index, emit_ofs + 0)); 1008 } RefillTo1()1009 bool RefillTo1() { 1010 switch (buffer_len_) { 1011 case 0: { 1012 return Read1to8Bytes(); 1013 } 1014 } 1015 return true; 1016 } Read1to8Bytes()1017 bool Read1to8Bytes() { 1018 switch (end_ - begin_) { 1019 case 0: { 1020 return false; 1021 } 1022 case 1: { 1023 Fill1(); 1024 return true; 1025 } 1026 case 2: { 1027 Fill2(); 1028 return true; 1029 } 1030 case 3: { 1031 Fill3(); 1032 return true; 1033 } 1034 case 4: { 1035 Fill4(); 1036 return true; 1037 } 1038 case 5: { 1039 Fill5(); 1040 return true; 1041 } 1042 case 6: { 1043 Fill6(); 1044 return true; 1045 } 1046 case 7: { 1047 Fill7(); 1048 return true; 1049 } 1050 default: { 1051 Fill8(); 1052 return true; 1053 } 1054 } 1055 } Done1()1056 void Done1() { 1057 done_ = true; 1058 ok_ = false; 1059 } DecodeStep1()1060 void DecodeStep1() { 1061 if (!RefillTo1()) { 1062 Done2(); 1063 return; 1064 } 1065 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1066 const auto op = GetOp10(index); 1067 const int consumed = op & 1; 1068 buffer_len_ -= consumed; 1069 const auto emit_ofs = op >> 1; 1070 sink_(GetEmit10(index, emit_ofs + 0)); 1071 } Done2()1072 void Done2() { 1073 done_ = true; 1074 ok_ = false; 1075 } DecodeStep2()1076 void DecodeStep2() { 1077 if (!RefillTo1()) { 1078 Done3(); 1079 return; 1080 } 1081 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1082 const auto op = GetOp11(index); 1083 const int consumed = op & 1; 1084 buffer_len_ -= consumed; 1085 const auto emit_ofs = op >> 1; 1086 sink_(GetEmit11(index, emit_ofs + 0)); 1087 } Done3()1088 void Done3() { 1089 done_ = true; 1090 ok_ = false; 1091 } DecodeStep3()1092 void DecodeStep3() { 1093 if (!RefillTo13()) { 1094 Done4(); 1095 return; 1096 } 1097 const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff; 1098 const auto op = GetOp12(index); 1099 const int consumed = op & 15; 1100 buffer_len_ -= consumed; 1101 const auto emit_ofs = op >> 9; 1102 switch ((op >> 4) & 31) { 1103 case 0: { 1104 sink_(GetEmit12(index, emit_ofs + 0)); 1105 break; 1106 } 1107 case 1: { 1108 DecodeStep4(); 1109 break; 1110 } 1111 case 2: { 1112 DecodeStep5(); 1113 break; 1114 } 1115 case 3: { 1116 DecodeStep6(); 1117 break; 1118 } 1119 case 4: { 1120 DecodeStep7(); 1121 break; 1122 } 1123 case 5: { 1124 DecodeStep8(); 1125 break; 1126 } 1127 case 6: { 1128 DecodeStep9(); 1129 break; 1130 } 1131 case 7: { 1132 DecodeStep10(); 1133 break; 1134 } 1135 case 8: { 1136 DecodeStep17(); 1137 break; 1138 } 1139 case 9: { 1140 DecodeStep11(); 1141 break; 1142 } 1143 case 10: { 1144 DecodeStep12(); 1145 break; 1146 } 1147 case 11: { 1148 DecodeStep13(); 1149 break; 1150 } 1151 case 12: { 1152 DecodeStep14(); 1153 break; 1154 } 1155 case 13: { 1156 DecodeStep18(); 1157 break; 1158 } 1159 case 14: { 1160 DecodeStep15(); 1161 break; 1162 } 1163 case 15: { 1164 DecodeStep16(); 1165 break; 1166 } 1167 case 16: { 1168 DecodeStep19(); 1169 break; 1170 } 1171 } 1172 } RefillTo13()1173 bool RefillTo13() { 1174 switch (buffer_len_) { 1175 case 0: { 1176 return Read2to8Bytes(); 1177 } 1178 case 1: 1179 case 2: 1180 case 3: 1181 case 4: { 1182 return Read2to7Bytes(); 1183 } 1184 case 5: 1185 case 6: 1186 case 7: 1187 case 8: { 1188 return Read1to7Bytes(); 1189 } 1190 case 9: 1191 case 10: 1192 case 11: 1193 case 12: { 1194 return Read1to6Bytes(); 1195 } 1196 } 1197 return true; 1198 } Done4()1199 void Done4() { 1200 done_ = true; 1201 switch (end_ - begin_) { 1202 case 1: { 1203 Fill1(); 1204 break; 1205 } 1206 } 1207 switch (buffer_len_) { 1208 case 1: { 1209 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1210 return; 1211 } 1212 case 2: { 1213 const auto index = buffer_ & 3; 1214 const auto op = GetOp13(index); 1215 switch (op & 3) { 1216 case 0: { 1217 sink_(GetEmit13(index, (op >> 2) + 0)); 1218 break; 1219 } 1220 case 1: { 1221 ok_ = false; 1222 break; 1223 } 1224 } 1225 return; 1226 } 1227 case 3: { 1228 const auto index = buffer_ & 7; 1229 const auto op = GetOp14(index); 1230 switch (op & 3) { 1231 case 0: { 1232 ok_ = false; 1233 break; 1234 } 1235 case 1: { 1236 sink_(GetEmit14(index, (op >> 2) + 0)); 1237 break; 1238 } 1239 } 1240 return; 1241 } 1242 case 4: { 1243 const auto index = buffer_ & 15; 1244 const auto op = GetOp15(index); 1245 switch (op & 3) { 1246 case 0: { 1247 ok_ = false; 1248 break; 1249 } 1250 case 1: { 1251 sink_(GetEmit15(index, (op >> 2) + 0)); 1252 break; 1253 } 1254 } 1255 return; 1256 } 1257 case 5: { 1258 const auto index = buffer_ & 31; 1259 const auto op = GetOp16(index); 1260 switch (op & 3) { 1261 case 0: { 1262 ok_ = false; 1263 break; 1264 } 1265 case 1: { 1266 sink_(GetEmit16(index, (op >> 2) + 0)); 1267 break; 1268 } 1269 } 1270 return; 1271 } 1272 case 6: { 1273 const auto index = buffer_ & 63; 1274 const auto op = GetOp17(index); 1275 switch (op & 3) { 1276 case 0: { 1277 ok_ = false; 1278 break; 1279 } 1280 case 1: { 1281 sink_(GetEmit17(index, (op >> 2) + 0)); 1282 break; 1283 } 1284 } 1285 return; 1286 } 1287 case 7: { 1288 const auto index = buffer_ & 127; 1289 const auto op = GetOp18(index); 1290 switch (op & 3) { 1291 case 0: { 1292 sink_(GetEmit18(index, (op >> 2) + 0)); 1293 sink_(GetEmit18(index, (op >> 2) + 1)); 1294 break; 1295 } 1296 case 1: { 1297 ok_ = false; 1298 break; 1299 } 1300 case 2: { 1301 sink_(GetEmit18(index, (op >> 2) + 0)); 1302 break; 1303 } 1304 } 1305 return; 1306 } 1307 case 8: { 1308 const auto index = buffer_ & 255; 1309 const auto op = GetOp19(index); 1310 switch (op & 3) { 1311 case 0: { 1312 ok_ = false; 1313 break; 1314 } 1315 case 1: { 1316 sink_(GetEmit19(index, (op >> 2) + 0)); 1317 sink_(GetEmit19(index, (op >> 2) + 1)); 1318 break; 1319 } 1320 case 2: { 1321 sink_(GetEmit19(index, (op >> 2) + 0)); 1322 break; 1323 } 1324 } 1325 return; 1326 } 1327 case 9: { 1328 const auto index = buffer_ & 511; 1329 const auto op = GetOp20(index); 1330 switch (op & 3) { 1331 case 0: { 1332 ok_ = false; 1333 break; 1334 } 1335 case 1: { 1336 sink_(GetEmit20(index, (op >> 2) + 0)); 1337 sink_(GetEmit20(index, (op >> 2) + 1)); 1338 break; 1339 } 1340 case 2: { 1341 sink_(GetEmit20(index, (op >> 2) + 0)); 1342 break; 1343 } 1344 } 1345 return; 1346 } 1347 case 10: { 1348 const auto index = buffer_ & 1023; 1349 const auto op = GetOp21(index); 1350 switch (op & 3) { 1351 case 0: { 1352 ok_ = false; 1353 break; 1354 } 1355 case 1: { 1356 sink_(GetEmit21(index, (op >> 2) + 0)); 1357 sink_(GetEmit21(index, (op >> 2) + 1)); 1358 break; 1359 } 1360 case 2: { 1361 sink_(GetEmit21(index, (op >> 2) + 0)); 1362 break; 1363 } 1364 } 1365 return; 1366 } 1367 case 11: { 1368 const auto index = buffer_ & 2047; 1369 const auto op = GetOp22(index); 1370 switch (op & 3) { 1371 case 0: { 1372 ok_ = false; 1373 break; 1374 } 1375 case 1: { 1376 sink_(GetEmit22(index, (op >> 2) + 0)); 1377 sink_(GetEmit22(index, (op >> 2) + 1)); 1378 break; 1379 } 1380 case 2: { 1381 sink_(GetEmit22(index, (op >> 2) + 0)); 1382 break; 1383 } 1384 } 1385 return; 1386 } 1387 case 12: { 1388 const auto index = buffer_ & 4095; 1389 const auto op = GetOp23(index); 1390 switch (op & 7) { 1391 case 0: { 1392 sink_(GetEmit23(index, (op >> 3) + 0)); 1393 sink_(GetEmit23(index, (op >> 3) + 1)); 1394 sink_(GetEmit23(index, (op >> 3) + 2)); 1395 break; 1396 } 1397 case 1: { 1398 ok_ = false; 1399 break; 1400 } 1401 case 2: { 1402 sink_(GetEmit23(index, (op >> 3) + 0)); 1403 sink_(GetEmit23(index, (op >> 3) + 1)); 1404 break; 1405 } 1406 case 3: { 1407 sink_(GetEmit23(index, (op >> 3) + 0)); 1408 break; 1409 } 1410 } 1411 return; 1412 } 1413 case 0: { 1414 return; 1415 } 1416 } 1417 } DecodeStep4()1418 void DecodeStep4() { 1419 if (!RefillTo1()) { 1420 Done5(); 1421 return; 1422 } 1423 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1424 const auto op = GetOp24(index); 1425 const int consumed = op & 1; 1426 buffer_len_ -= consumed; 1427 const auto emit_ofs = op >> 1; 1428 sink_(GetEmit24(index, emit_ofs + 0)); 1429 } Done5()1430 void Done5() { 1431 done_ = true; 1432 ok_ = false; 1433 } DecodeStep5()1434 void DecodeStep5() { 1435 if (!RefillTo1()) { 1436 Done6(); 1437 return; 1438 } 1439 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1440 const auto op = GetOp25(index); 1441 const int consumed = op & 1; 1442 buffer_len_ -= consumed; 1443 const auto emit_ofs = op >> 1; 1444 sink_(GetEmit25(index, emit_ofs + 0)); 1445 } Done6()1446 void Done6() { 1447 done_ = true; 1448 ok_ = false; 1449 } DecodeStep6()1450 void DecodeStep6() { 1451 if (!RefillTo1()) { 1452 Done7(); 1453 return; 1454 } 1455 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1456 const auto op = GetOp26(index); 1457 const int consumed = op & 1; 1458 buffer_len_ -= consumed; 1459 const auto emit_ofs = op >> 1; 1460 sink_(GetEmit26(index, emit_ofs + 0)); 1461 } Done7()1462 void Done7() { 1463 done_ = true; 1464 ok_ = false; 1465 } DecodeStep7()1466 void DecodeStep7() { 1467 if (!RefillTo1()) { 1468 Done8(); 1469 return; 1470 } 1471 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1472 const auto op = GetOp27(index); 1473 const int consumed = op & 1; 1474 buffer_len_ -= consumed; 1475 const auto emit_ofs = op >> 1; 1476 sink_(GetEmit27(index, emit_ofs + 0)); 1477 } Done8()1478 void Done8() { 1479 done_ = true; 1480 ok_ = false; 1481 } DecodeStep8()1482 void DecodeStep8() { 1483 if (!RefillTo1()) { 1484 Done9(); 1485 return; 1486 } 1487 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1488 const auto op = GetOp28(index); 1489 const int consumed = op & 1; 1490 buffer_len_ -= consumed; 1491 const auto emit_ofs = op >> 1; 1492 sink_(GetEmit28(index, emit_ofs + 0)); 1493 } Done9()1494 void Done9() { 1495 done_ = true; 1496 ok_ = false; 1497 } DecodeStep9()1498 void DecodeStep9() { 1499 if (!RefillTo1()) { 1500 Done10(); 1501 return; 1502 } 1503 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1504 const auto op = GetOp29(index); 1505 const int consumed = op & 1; 1506 buffer_len_ -= consumed; 1507 const auto emit_ofs = op >> 1; 1508 sink_(GetEmit29(index, emit_ofs + 0)); 1509 } Done10()1510 void Done10() { 1511 done_ = true; 1512 ok_ = false; 1513 } DecodeStep10()1514 void DecodeStep10() { 1515 if (!RefillTo1()) { 1516 Done11(); 1517 return; 1518 } 1519 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1520 const auto op = GetOp30(index); 1521 const int consumed = op & 1; 1522 buffer_len_ -= consumed; 1523 const auto emit_ofs = op >> 1; 1524 sink_(GetEmit30(index, emit_ofs + 0)); 1525 } Done11()1526 void Done11() { 1527 done_ = true; 1528 ok_ = false; 1529 } DecodeStep11()1530 void DecodeStep11() { 1531 if (!RefillTo2()) { 1532 Done12(); 1533 return; 1534 } 1535 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1536 const auto op = GetOp31(index); 1537 const int consumed = op & 3; 1538 buffer_len_ -= consumed; 1539 const auto emit_ofs = op >> 2; 1540 sink_(GetEmit31(index, emit_ofs + 0)); 1541 } RefillTo2()1542 bool RefillTo2() { 1543 switch (buffer_len_) { 1544 case 0: { 1545 return Read1to8Bytes(); 1546 } 1547 case 1: { 1548 return Read1to7Bytes(); 1549 } 1550 } 1551 return true; 1552 } Done12()1553 void Done12() { 1554 done_ = true; 1555 switch (buffer_len_) { 1556 case 1: 1557 case 0: { 1558 ok_ = false; 1559 return; 1560 } 1561 } 1562 } DecodeStep12()1563 void DecodeStep12() { 1564 if (!RefillTo2()) { 1565 Done13(); 1566 return; 1567 } 1568 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1569 const auto op = GetOp32(index); 1570 const int consumed = op & 3; 1571 buffer_len_ -= consumed; 1572 const auto emit_ofs = op >> 2; 1573 sink_(GetEmit32(index, emit_ofs + 0)); 1574 } Done13()1575 void Done13() { 1576 done_ = true; 1577 switch (buffer_len_) { 1578 case 1: 1579 case 0: { 1580 ok_ = false; 1581 return; 1582 } 1583 } 1584 } DecodeStep13()1585 void DecodeStep13() { 1586 if (!RefillTo2()) { 1587 Done14(); 1588 return; 1589 } 1590 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1591 const auto op = GetOp33(index); 1592 const int consumed = op & 3; 1593 buffer_len_ -= consumed; 1594 const auto emit_ofs = op >> 2; 1595 sink_(GetEmit33(index, emit_ofs + 0)); 1596 } Done14()1597 void Done14() { 1598 done_ = true; 1599 switch (buffer_len_) { 1600 case 1: 1601 case 0: { 1602 ok_ = false; 1603 return; 1604 } 1605 } 1606 } DecodeStep14()1607 void DecodeStep14() { 1608 if (!RefillTo2()) { 1609 Done15(); 1610 return; 1611 } 1612 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1613 const auto op = GetOp34(index); 1614 const int consumed = op & 3; 1615 buffer_len_ -= consumed; 1616 const auto emit_ofs = op >> 2; 1617 sink_(GetEmit34(index, emit_ofs + 0)); 1618 } Done15()1619 void Done15() { 1620 done_ = true; 1621 switch (buffer_len_) { 1622 case 1: 1623 case 0: { 1624 ok_ = false; 1625 return; 1626 } 1627 } 1628 } DecodeStep15()1629 void DecodeStep15() { 1630 if (!RefillTo3()) { 1631 Done16(); 1632 return; 1633 } 1634 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1635 const auto op = GetOp35(index); 1636 const int consumed = op & 3; 1637 buffer_len_ -= consumed; 1638 const auto emit_ofs = op >> 2; 1639 sink_(GetEmit35(index, emit_ofs + 0)); 1640 } RefillTo3()1641 bool RefillTo3() { 1642 switch (buffer_len_) { 1643 case 0: { 1644 return Read1to8Bytes(); 1645 } 1646 case 1: 1647 case 2: { 1648 return Read1to7Bytes(); 1649 } 1650 } 1651 return true; 1652 } Done16()1653 void Done16() { 1654 done_ = true; 1655 switch (buffer_len_) { 1656 case 1: 1657 case 2: 1658 case 0: { 1659 ok_ = false; 1660 return; 1661 } 1662 } 1663 } DecodeStep16()1664 void DecodeStep16() { 1665 if (!RefillTo3()) { 1666 Done17(); 1667 return; 1668 } 1669 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1670 const auto op = GetOp36(index); 1671 const int consumed = op & 3; 1672 buffer_len_ -= consumed; 1673 const auto emit_ofs = op >> 2; 1674 sink_(GetEmit36(index, emit_ofs + 0)); 1675 } Done17()1676 void Done17() { 1677 done_ = true; 1678 switch (buffer_len_) { 1679 case 1: 1680 case 2: 1681 case 0: { 1682 ok_ = false; 1683 return; 1684 } 1685 } 1686 } DecodeStep17()1687 void DecodeStep17() { 1688 if (!RefillTo2()) { 1689 Done18(); 1690 return; 1691 } 1692 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1693 const auto op = GetOp37(index); 1694 const int consumed = op & 3; 1695 buffer_len_ -= consumed; 1696 const auto emit_ofs = op >> 2; 1697 sink_(GetEmit37(index, emit_ofs + 0)); 1698 } Done18()1699 void Done18() { 1700 done_ = true; 1701 switch (buffer_len_) { 1702 case 1: { 1703 const auto index = buffer_ & 1; 1704 const auto op = GetOp38(index); 1705 switch (op & 1) { 1706 case 0: { 1707 sink_(GetEmit38(index, (op >> 1) + 0)); 1708 break; 1709 } 1710 case 1: { 1711 ok_ = false; 1712 break; 1713 } 1714 } 1715 return; 1716 } 1717 case 0: { 1718 ok_ = false; 1719 return; 1720 } 1721 } 1722 } DecodeStep18()1723 void DecodeStep18() { 1724 if (!RefillTo3()) { 1725 Done19(); 1726 return; 1727 } 1728 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1729 const auto op = GetOp39(index); 1730 const int consumed = op & 3; 1731 buffer_len_ -= consumed; 1732 const auto emit_ofs = op >> 2; 1733 sink_(GetEmit39(index, emit_ofs + 0)); 1734 } Done19()1735 void Done19() { 1736 done_ = true; 1737 switch (buffer_len_) { 1738 case 1: 1739 case 0: { 1740 ok_ = false; 1741 return; 1742 } 1743 case 2: { 1744 const auto index = buffer_ & 3; 1745 const auto op = GetOp40(index); 1746 switch (op & 1) { 1747 case 0: { 1748 sink_(GetEmit40(index, (op >> 1) + 0)); 1749 break; 1750 } 1751 case 1: { 1752 ok_ = false; 1753 break; 1754 } 1755 } 1756 return; 1757 } 1758 } 1759 } DecodeStep19()1760 void DecodeStep19() { 1761 if (!RefillTo5()) { 1762 Done20(); 1763 return; 1764 } 1765 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1766 const auto op = GetOp41(index); 1767 const int consumed = op & 7; 1768 buffer_len_ -= consumed; 1769 const auto emit_ofs = op >> 4; 1770 switch ((op >> 3) & 1) { 1771 case 0: { 1772 sink_(GetEmit41(index, emit_ofs + 0)); 1773 break; 1774 } 1775 case 1: { 1776 begin_ = end_; 1777 buffer_len_ = 0; 1778 break; 1779 } 1780 } 1781 } RefillTo5()1782 bool RefillTo5() { 1783 switch (buffer_len_) { 1784 case 0: { 1785 return Read1to8Bytes(); 1786 } 1787 case 1: 1788 case 2: 1789 case 3: 1790 case 4: { 1791 return Read1to7Bytes(); 1792 } 1793 } 1794 return true; 1795 } Done20()1796 void Done20() { 1797 done_ = true; 1798 switch (buffer_len_) { 1799 case 1: 1800 case 2: { 1801 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1802 return; 1803 } 1804 case 3: { 1805 const auto index = buffer_ & 7; 1806 const auto op = GetOp42(index); 1807 switch (op & 1) { 1808 case 0: { 1809 sink_(GetEmit42(index, (op >> 1) + 0)); 1810 break; 1811 } 1812 } 1813 return; 1814 } 1815 case 4: { 1816 const auto index = buffer_ & 15; 1817 const auto op = GetOp43(index); 1818 switch (op & 3) { 1819 case 0: { 1820 ok_ = false; 1821 break; 1822 } 1823 case 1: { 1824 sink_(GetEmit43(index, (op >> 2) + 0)); 1825 break; 1826 } 1827 } 1828 return; 1829 } 1830 case 0: { 1831 return; 1832 } 1833 } 1834 } 1835 F sink_; 1836 const uint8_t* begin_; 1837 const uint8_t* const end_; 1838 uint64_t buffer_ = 0; 1839 int buffer_len_ = 0; 1840 bool ok_ = true; 1841 bool done_ = false; 1842 }; 1843 } // namespace geometry_12_13_5 1844 } // namespace grpc_core 1845 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_13_5_H 1846