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_10_5_15_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_5_15_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_10_5_15 { 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 } GetOp1(size_t i)54 static inline uint64_t GetOp1(size_t i) { 55 return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]]; 56 } GetEmit1(size_t i,size_t emit)57 static inline uint64_t GetEmit1(size_t i, size_t emit) { 58 return table1_emit_[i >> 6][emit]; 59 } GetOp7(size_t i)60 static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; } GetEmit7(size_t,size_t emit)61 static inline uint64_t GetEmit7(size_t, size_t emit) { 62 return emit ? 43 : 39; 63 } GetOp9(size_t i)64 static inline uint64_t GetOp9(size_t i) { return table9_0_inner_[i]; } GetEmit9(size_t,size_t emit)65 static inline uint64_t GetEmit9(size_t, size_t emit) { 66 return table9_0_emit_[emit]; 67 } GetOp10(size_t i)68 static inline uint64_t GetOp10(size_t i) { 69 return table10_0_inner_[table10_0_outer_[i]]; 70 } GetEmit10(size_t,size_t emit)71 static inline uint64_t GetEmit10(size_t, size_t emit) { 72 return table10_0_emit_[emit]; 73 } GetOp8(size_t i)74 static inline uint64_t GetOp8(size_t i) { return table8_0_ops_[i]; } GetEmit8(size_t,size_t emit)75 static inline uint64_t GetEmit8(size_t, size_t emit) { 76 return table8_0_emit_[emit]; 77 } GetOp12(size_t i)78 static inline uint64_t GetOp12(size_t i) { 79 return table12_0_inner_[(i < 3 ? (i) : ((i - 3) / 12 + 3))]; 80 } GetEmit12(size_t,size_t emit)81 static inline uint64_t GetEmit12(size_t, size_t emit) { 82 return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195)); 83 } GetOp13(size_t i)84 static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; } GetEmit13(size_t,size_t emit)85 static inline uint64_t GetEmit13(size_t, size_t emit) { 86 return table13_0_emit_[emit]; 87 } GetOp14(size_t i)88 static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; } GetEmit14(size_t,size_t emit)89 static inline uint64_t GetEmit14(size_t, size_t emit) { 90 return table14_0_emit_[emit]; 91 } GetOp15(size_t i)92 static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; } GetEmit15(size_t,size_t emit)93 static inline uint64_t GetEmit15(size_t, size_t emit) { 94 return table15_0_emit_[emit]; 95 } GetOp16(size_t i)96 static inline uint64_t GetOp16(size_t i) { 97 return table16_ops_[i >> 7][i & 0x7f]; 98 } GetEmit16(size_t i,size_t emit)99 static inline uint64_t GetEmit16(size_t i, size_t emit) { 100 return table16_emit_[i >> 7][emit]; 101 } GetOp17(size_t i)102 static inline uint64_t GetOp17(size_t i) { 103 return table17_ops_[i >> 7][i & 0x7f]; 104 } GetEmit17(size_t i,size_t emit)105 static inline uint64_t GetEmit17(size_t i, size_t emit) { 106 return table17_emit_[i >> 7][emit]; 107 } GetOp18(size_t i)108 static inline uint64_t GetOp18(size_t i) { 109 return table18_ops_[i >> 6][i & 0x3f]; 110 } GetEmit18(size_t i,size_t emit)111 static inline uint64_t GetEmit18(size_t i, size_t emit) { 112 return table18_emit_[i >> 6][emit]; 113 } GetOp19(size_t i)114 static inline uint64_t GetOp19(size_t i) { 115 return table19_ops_[i >> 6][i & 0x3f]; 116 } GetEmit19(size_t i,size_t emit)117 static inline uint64_t GetEmit19(size_t i, size_t emit) { 118 return table19_emit_[i >> 6][emit]; 119 } GetOp20(size_t i)120 static inline uint64_t GetOp20(size_t i) { 121 return table20_ops_[i >> 6][i & 0x3f]; 122 } GetEmit20(size_t i,size_t emit)123 static inline uint64_t GetEmit20(size_t i, size_t emit) { 124 return table20_emit_[i >> 6][emit]; 125 } GetOp21(size_t i)126 static inline uint64_t GetOp21(size_t i) { 127 return table21_ops_[i >> 7][i & 0x7f]; 128 } GetEmit21(size_t i,size_t emit)129 static inline uint64_t GetEmit21(size_t i, size_t emit) { 130 return table21_emit_[i >> 7][emit]; 131 } GetOp22(size_t i)132 static inline uint64_t GetOp22(size_t i) { 133 return table22_ops_[i >> 7][i & 0x7f]; 134 } GetEmit22(size_t i,size_t emit)135 static inline uint64_t GetEmit22(size_t i, size_t emit) { 136 return table22_emit_[i >> 7][emit]; 137 } GetOp11(size_t i)138 static inline uint64_t GetOp11(size_t i) { 139 return table11_ops_[i >> 8][i & 0xff]; 140 } GetEmit11(size_t i,size_t emit)141 static inline uint64_t GetEmit11(size_t i, size_t emit) { 142 return table11_emit_[i >> 8][emit]; 143 } GetOp24(size_t i)144 static inline uint64_t GetOp24(size_t i) { return i; } GetEmit24(size_t,size_t emit)145 static inline uint64_t GetEmit24(size_t, size_t emit) { 146 return ((void)emit, 124); 147 } GetOp23(size_t i)148 static inline uint64_t GetOp23(size_t i) { 149 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 150 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 151 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 152 } GetEmit23(size_t,size_t emit)153 static inline uint64_t GetEmit23(size_t, size_t emit) { 154 return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35)); 155 } 156 157 private: 158 static const uint8_t table2_0_emit_[10]; 159 static const uint8_t table2_0_ops_[32]; 160 static const uint8_t table3_0_emit_[36]; 161 static const uint8_t table3_0_ops_[64]; 162 static const uint8_t table4_0_emit_[22]; 163 static const uint8_t table4_0_ops_[64]; 164 static const uint8_t table4_1_emit_[46]; 165 static const uint8_t table4_1_ops_[64]; 166 static const uint8_t* const table4_emit_[2]; 167 static const uint8_t* const table4_ops_[2]; 168 static const uint8_t table5_0_ops_[128]; 169 static const uint8_t table5_1_emit_[52]; 170 static const uint8_t table5_1_ops_[128]; 171 static const uint8_t* const table5_emit_[2]; 172 static const uint8_t* const table5_ops_[2]; 173 static const uint8_t table6_0_emit_[2]; 174 static const uint8_t table6_0_ops_[32]; 175 static const uint8_t table6_1_emit_[2]; 176 static const uint8_t table6_2_emit_[2]; 177 static const uint8_t table6_3_emit_[2]; 178 static const uint8_t table6_4_emit_[2]; 179 static const uint8_t table6_5_emit_[4]; 180 static const uint8_t table6_5_ops_[32]; 181 static const uint8_t table6_6_emit_[4]; 182 static const uint8_t table6_7_emit_[4]; 183 static const uint8_t table6_8_emit_[4]; 184 static const uint8_t table6_9_emit_[4]; 185 static const uint8_t table6_10_emit_[4]; 186 static const uint8_t table6_11_emit_[6]; 187 static const uint8_t table6_11_ops_[32]; 188 static const uint8_t table6_12_emit_[8]; 189 static const uint8_t table6_12_ops_[32]; 190 static const uint8_t table6_13_emit_[8]; 191 static const uint8_t table6_14_emit_[8]; 192 static const uint8_t table6_15_emit_[10]; 193 static const uint8_t table6_15_ops_[32]; 194 static const uint8_t* const table6_emit_[16]; 195 static const uint8_t* const table6_ops_[16]; 196 static const uint8_t table1_0_emit_[36]; 197 static const uint16_t table1_0_inner_[22]; 198 static const uint8_t table1_0_outer_[64]; 199 static const uint8_t table1_1_emit_[36]; 200 static const uint16_t table1_1_inner_[22]; 201 static const uint8_t table1_2_emit_[36]; 202 static const uint16_t table1_2_inner_[22]; 203 static const uint8_t table1_3_emit_[36]; 204 static const uint16_t table1_3_inner_[22]; 205 static const uint8_t table1_4_emit_[38]; 206 static const uint16_t table1_4_inner_[22]; 207 static const uint16_t table1_5_inner_[4]; 208 static const uint8_t table1_5_outer_[64]; 209 static const uint16_t table1_11_inner_[6]; 210 static const uint8_t table1_11_outer_[64]; 211 static const uint16_t table1_12_inner_[8]; 212 static const uint8_t table1_12_outer_[64]; 213 static const uint8_t table1_15_emit_[15]; 214 static const uint16_t table1_15_inner_[18]; 215 static const uint8_t table1_15_outer_[64]; 216 static const uint8_t* const table1_emit_[16]; 217 static const uint16_t* const table1_inner_[16]; 218 static const uint8_t* const table1_outer_[16]; 219 static const uint8_t table9_0_emit_[6]; 220 static const uint8_t table9_0_inner_[8]; 221 static const uint8_t table10_0_emit_[8]; 222 static const uint8_t table10_0_inner_[10]; 223 static const uint8_t table10_0_outer_[16]; 224 static const uint8_t table8_0_emit_[11]; 225 static const uint8_t table8_0_ops_[32]; 226 static const uint8_t table12_0_inner_[5]; 227 static const uint8_t table13_0_emit_[11]; 228 static const uint8_t table13_0_ops_[32]; 229 static const uint8_t table14_0_emit_[24]; 230 static const uint8_t table14_0_ops_[64]; 231 static const uint8_t table15_0_emit_[50]; 232 static const uint8_t table15_0_ops_[128]; 233 static const uint8_t table16_0_emit_[15]; 234 static const uint8_t table16_0_ops_[128]; 235 static const uint8_t table16_1_emit_[64]; 236 static const uint8_t table16_1_ops_[128]; 237 static const uint8_t* const table16_emit_[2]; 238 static const uint8_t* const table16_ops_[2]; 239 static const uint8_t table17_0_emit_[62]; 240 static const uint8_t table17_0_ops_[128]; 241 static const uint8_t table17_1_emit_[10]; 242 static const uint8_t table17_1_ops_[128]; 243 static const uint8_t table17_2_emit_[23]; 244 static const uint8_t table17_2_ops_[128]; 245 static const uint8_t table17_3_emit_[53]; 246 static const uint8_t table17_3_ops_[128]; 247 static const uint8_t* const table17_emit_[4]; 248 static const uint8_t* const table17_ops_[4]; 249 static const uint8_t table18_0_emit_[72]; 250 static const uint16_t table18_0_ops_[64]; 251 static const uint8_t table18_1_emit_[72]; 252 static const uint8_t table18_2_emit_[72]; 253 static const uint8_t table18_3_emit_[40]; 254 static const uint16_t table18_3_ops_[64]; 255 static const uint8_t table18_4_emit_[40]; 256 static const uint8_t table18_5_emit_[40]; 257 static const uint8_t table18_6_emit_[40]; 258 static const uint8_t table18_7_emit_[4]; 259 static const uint16_t table18_7_ops_[64]; 260 static const uint8_t table18_8_emit_[4]; 261 static const uint8_t table18_9_emit_[4]; 262 static const uint8_t table18_10_emit_[7]; 263 static const uint16_t table18_10_ops_[64]; 264 static const uint8_t table18_11_emit_[8]; 265 static const uint16_t table18_11_ops_[64]; 266 static const uint8_t table18_12_emit_[8]; 267 static const uint8_t table18_13_emit_[12]; 268 static const uint16_t table18_13_ops_[64]; 269 static const uint8_t table18_14_emit_[16]; 270 static const uint16_t table18_14_ops_[64]; 271 static const uint8_t table18_15_emit_[21]; 272 static const uint16_t table18_15_ops_[64]; 273 static const uint8_t* const table18_emit_[16]; 274 static const uint16_t* const table18_ops_[16]; 275 static const uint8_t table19_0_emit_[44]; 276 static const uint16_t table19_0_ops_[64]; 277 static const uint8_t table19_1_emit_[92]; 278 static const uint16_t table19_1_ops_[64]; 279 static const uint8_t table19_2_emit_[44]; 280 static const uint8_t table19_3_emit_[92]; 281 static const uint8_t table19_4_emit_[44]; 282 static const uint8_t table19_5_emit_[92]; 283 static const uint8_t table19_6_emit_[72]; 284 static const uint8_t table19_7_emit_[72]; 285 static const uint8_t table19_8_emit_[72]; 286 static const uint8_t table19_9_emit_[72]; 287 static const uint8_t table19_10_emit_[72]; 288 static const uint8_t table19_11_emit_[72]; 289 static const uint8_t table19_12_emit_[72]; 290 static const uint8_t table19_13_emit_[72]; 291 static const uint8_t table19_14_emit_[40]; 292 static const uint8_t table19_15_emit_[40]; 293 static const uint8_t table19_16_emit_[40]; 294 static const uint8_t table19_17_emit_[40]; 295 static const uint8_t table19_18_emit_[40]; 296 static const uint8_t table19_19_emit_[40]; 297 static const uint8_t table19_20_emit_[22]; 298 static const uint16_t table19_20_ops_[64]; 299 static const uint8_t table19_21_emit_[4]; 300 static const uint8_t table19_22_emit_[4]; 301 static const uint8_t table19_23_emit_[4]; 302 static const uint8_t table19_24_emit_[4]; 303 static const uint8_t table19_25_emit_[4]; 304 static const uint8_t table19_26_emit_[4]; 305 static const uint8_t table19_27_emit_[8]; 306 static const uint8_t table19_28_emit_[8]; 307 static const uint8_t table19_29_emit_[8]; 308 static const uint8_t table19_30_emit_[11]; 309 static const uint16_t table19_30_ops_[64]; 310 static const uint8_t table19_31_emit_[25]; 311 static const uint16_t table19_31_ops_[64]; 312 static const uint8_t* const table19_emit_[32]; 313 static const uint16_t* const table19_ops_[32]; 314 static const uint8_t table20_0_emit_[16]; 315 static const uint16_t table20_0_ops_[64]; 316 static const uint8_t table20_1_emit_[28]; 317 static const uint16_t table20_1_ops_[64]; 318 static const uint8_t table20_2_emit_[36]; 319 static const uint16_t table20_2_ops_[64]; 320 static const uint8_t table20_3_emit_[68]; 321 static const uint16_t table20_3_ops_[64]; 322 static const uint8_t table20_4_emit_[16]; 323 static const uint8_t table20_5_emit_[28]; 324 static const uint8_t table20_6_emit_[36]; 325 static const uint8_t table20_7_emit_[68]; 326 static const uint8_t table20_8_emit_[16]; 327 static const uint8_t table20_9_emit_[28]; 328 static const uint8_t table20_10_emit_[36]; 329 static const uint8_t table20_11_emit_[68]; 330 static const uint8_t table20_12_emit_[44]; 331 static const uint8_t table20_13_emit_[92]; 332 static const uint8_t table20_14_emit_[44]; 333 static const uint8_t table20_15_emit_[92]; 334 static const uint8_t table20_16_emit_[44]; 335 static const uint8_t table20_17_emit_[92]; 336 static const uint8_t table20_18_emit_[44]; 337 static const uint8_t table20_19_emit_[92]; 338 static const uint8_t table20_20_emit_[44]; 339 static const uint8_t table20_21_emit_[92]; 340 static const uint8_t table20_22_emit_[44]; 341 static const uint8_t table20_23_emit_[92]; 342 static const uint8_t table20_24_emit_[44]; 343 static const uint8_t table20_25_emit_[92]; 344 static const uint8_t table20_26_emit_[44]; 345 static const uint8_t table20_27_emit_[92]; 346 static const uint8_t table20_28_emit_[72]; 347 static const uint8_t table20_29_emit_[72]; 348 static const uint8_t table20_30_emit_[72]; 349 static const uint8_t table20_31_emit_[72]; 350 static const uint8_t table20_32_emit_[72]; 351 static const uint8_t table20_33_emit_[72]; 352 static const uint8_t table20_34_emit_[72]; 353 static const uint8_t table20_35_emit_[72]; 354 static const uint8_t table20_36_emit_[72]; 355 static const uint8_t table20_37_emit_[72]; 356 static const uint8_t table20_38_emit_[72]; 357 static const uint8_t table20_39_emit_[72]; 358 static const uint8_t table20_40_emit_[72]; 359 static const uint8_t table20_41_emit_[40]; 360 static const uint8_t table20_42_emit_[40]; 361 static const uint8_t table20_43_emit_[40]; 362 static const uint8_t table20_44_emit_[40]; 363 static const uint8_t table20_45_emit_[40]; 364 static const uint8_t table20_46_emit_[40]; 365 static const uint8_t table20_47_emit_[40]; 366 static const uint8_t table20_48_emit_[40]; 367 static const uint8_t table20_49_emit_[40]; 368 static const uint8_t table20_50_emit_[40]; 369 static const uint8_t table20_51_emit_[40]; 370 static const uint8_t table20_52_emit_[40]; 371 static const uint8_t table20_53_emit_[40]; 372 static const uint8_t table20_54_emit_[4]; 373 static const uint8_t table20_55_emit_[4]; 374 static const uint8_t table20_56_emit_[4]; 375 static const uint8_t table20_57_emit_[4]; 376 static const uint8_t table20_58_emit_[4]; 377 static const uint8_t table20_59_emit_[4]; 378 static const uint8_t table20_60_emit_[4]; 379 static const uint8_t table20_61_emit_[7]; 380 static const uint8_t table20_62_emit_[10]; 381 static const uint16_t table20_62_ops_[64]; 382 static const uint8_t table20_63_emit_[34]; 383 static const uint16_t table20_63_ops_[64]; 384 static const uint8_t* const table20_emit_[64]; 385 static const uint16_t* const table20_ops_[64]; 386 static const uint16_t table21_0_ops_[128]; 387 static const uint16_t table21_1_ops_[128]; 388 static const uint16_t table21_2_ops_[128]; 389 static const uint16_t table21_3_ops_[128]; 390 static const uint16_t table21_12_ops_[128]; 391 static const uint8_t table21_13_emit_[104]; 392 static const uint16_t table21_13_ops_[128]; 393 static const uint8_t table21_15_emit_[104]; 394 static const uint8_t table21_17_emit_[104]; 395 static const uint8_t table21_19_emit_[104]; 396 static const uint8_t table21_21_emit_[104]; 397 static const uint8_t table21_23_emit_[104]; 398 static const uint8_t table21_25_emit_[104]; 399 static const uint8_t table21_27_emit_[104]; 400 static const uint8_t table21_28_emit_[136]; 401 static const uint16_t table21_28_ops_[128]; 402 static const uint8_t table21_29_emit_[136]; 403 static const uint8_t table21_30_emit_[136]; 404 static const uint8_t table21_31_emit_[136]; 405 static const uint8_t table21_32_emit_[136]; 406 static const uint8_t table21_33_emit_[136]; 407 static const uint8_t table21_34_emit_[136]; 408 static const uint8_t table21_35_emit_[136]; 409 static const uint8_t table21_36_emit_[136]; 410 static const uint8_t table21_37_emit_[136]; 411 static const uint8_t table21_38_emit_[136]; 412 static const uint8_t table21_39_emit_[136]; 413 static const uint8_t table21_40_emit_[136]; 414 static const uint8_t table21_41_emit_[144]; 415 static const uint16_t table21_41_ops_[128]; 416 static const uint8_t table21_42_emit_[144]; 417 static const uint8_t table21_43_emit_[144]; 418 static const uint8_t table21_44_emit_[144]; 419 static const uint8_t table21_45_emit_[144]; 420 static const uint8_t table21_46_emit_[144]; 421 static const uint8_t table21_47_emit_[144]; 422 static const uint8_t table21_48_emit_[144]; 423 static const uint8_t table21_49_emit_[144]; 424 static const uint8_t table21_50_emit_[144]; 425 static const uint8_t table21_51_emit_[144]; 426 static const uint8_t table21_52_emit_[144]; 427 static const uint8_t table21_53_emit_[144]; 428 static const uint8_t table21_54_emit_[80]; 429 static const uint16_t table21_54_ops_[128]; 430 static const uint8_t table21_55_emit_[80]; 431 static const uint8_t table21_56_emit_[80]; 432 static const uint8_t table21_57_emit_[80]; 433 static const uint8_t table21_58_emit_[80]; 434 static const uint8_t table21_59_emit_[80]; 435 static const uint8_t table21_60_emit_[80]; 436 static const uint8_t table21_61_emit_[26]; 437 static const uint16_t table21_61_ops_[128]; 438 static const uint16_t table21_62_ops_[128]; 439 static const uint8_t table21_63_emit_[63]; 440 static const uint16_t table21_63_ops_[128]; 441 static const uint8_t* const table21_emit_[64]; 442 static const uint16_t* const table21_ops_[64]; 443 static const uint8_t table22_0_emit_[120]; 444 static const uint16_t table22_0_ops_[128]; 445 static const uint8_t table22_1_emit_[120]; 446 static const uint8_t table22_2_emit_[68]; 447 static const uint16_t table22_2_ops_[128]; 448 static const uint8_t table22_3_emit_[16]; 449 static const uint16_t table22_3_ops_[128]; 450 static const uint8_t table22_4_emit_[16]; 451 static const uint8_t table22_5_emit_[20]; 452 static const uint16_t table22_5_ops_[128]; 453 static const uint8_t table22_6_emit_[32]; 454 static const uint16_t table22_6_ops_[128]; 455 static const uint8_t table22_7_emit_[46]; 456 static const uint16_t table22_7_ops_[128]; 457 static const uint8_t table22_8_emit_[120]; 458 static const uint8_t table22_9_emit_[120]; 459 static const uint8_t table22_10_emit_[68]; 460 static const uint8_t table22_11_emit_[16]; 461 static const uint8_t table22_12_emit_[16]; 462 static const uint8_t table22_13_emit_[20]; 463 static const uint8_t table22_14_emit_[32]; 464 static const uint8_t table22_15_emit_[46]; 465 static const uint8_t table22_16_emit_[120]; 466 static const uint8_t table22_17_emit_[120]; 467 static const uint8_t table22_18_emit_[68]; 468 static const uint8_t table22_19_emit_[16]; 469 static const uint8_t table22_20_emit_[16]; 470 static const uint8_t table22_21_emit_[20]; 471 static const uint8_t table22_22_emit_[32]; 472 static const uint8_t table22_23_emit_[46]; 473 static const uint8_t table22_24_emit_[16]; 474 static const uint8_t table22_25_emit_[28]; 475 static const uint16_t table22_25_ops_[128]; 476 static const uint8_t table22_26_emit_[36]; 477 static const uint16_t table22_26_ops_[128]; 478 static const uint8_t table22_27_emit_[68]; 479 static const uint16_t table22_27_ops_[128]; 480 static const uint8_t table22_28_emit_[16]; 481 static const uint8_t table22_29_emit_[28]; 482 static const uint8_t table22_30_emit_[36]; 483 static const uint8_t table22_31_emit_[68]; 484 static const uint8_t table22_32_emit_[16]; 485 static const uint8_t table22_33_emit_[28]; 486 static const uint8_t table22_34_emit_[36]; 487 static const uint8_t table22_35_emit_[68]; 488 static const uint8_t table22_36_emit_[16]; 489 static const uint8_t table22_37_emit_[28]; 490 static const uint8_t table22_38_emit_[36]; 491 static const uint8_t table22_39_emit_[68]; 492 static const uint8_t table22_40_emit_[16]; 493 static const uint8_t table22_41_emit_[28]; 494 static const uint8_t table22_42_emit_[36]; 495 static const uint8_t table22_43_emit_[68]; 496 static const uint8_t table22_44_emit_[16]; 497 static const uint8_t table22_45_emit_[28]; 498 static const uint8_t table22_46_emit_[36]; 499 static const uint8_t table22_47_emit_[68]; 500 static const uint8_t table22_48_emit_[16]; 501 static const uint8_t table22_49_emit_[28]; 502 static const uint8_t table22_50_emit_[36]; 503 static const uint8_t table22_51_emit_[68]; 504 static const uint8_t table22_52_emit_[16]; 505 static const uint8_t table22_53_emit_[28]; 506 static const uint8_t table22_54_emit_[36]; 507 static const uint8_t table22_55_emit_[68]; 508 static const uint8_t table22_56_emit_[44]; 509 static const uint16_t table22_56_ops_[128]; 510 static const uint8_t table22_57_emit_[104]; 511 static const uint16_t table22_57_ops_[128]; 512 static const uint8_t table22_58_emit_[44]; 513 static const uint8_t table22_59_emit_[104]; 514 static const uint8_t table22_60_emit_[44]; 515 static const uint8_t table22_61_emit_[104]; 516 static const uint8_t table22_62_emit_[44]; 517 static const uint8_t table22_63_emit_[104]; 518 static const uint8_t table22_64_emit_[44]; 519 static const uint8_t table22_65_emit_[104]; 520 static const uint8_t table22_66_emit_[44]; 521 static const uint8_t table22_67_emit_[104]; 522 static const uint8_t table22_68_emit_[44]; 523 static const uint8_t table22_69_emit_[104]; 524 static const uint8_t table22_70_emit_[44]; 525 static const uint8_t table22_71_emit_[104]; 526 static const uint8_t table22_72_emit_[44]; 527 static const uint8_t table22_73_emit_[104]; 528 static const uint8_t table22_74_emit_[44]; 529 static const uint8_t table22_75_emit_[104]; 530 static const uint8_t table22_76_emit_[44]; 531 static const uint8_t table22_77_emit_[104]; 532 static const uint8_t table22_78_emit_[44]; 533 static const uint8_t table22_79_emit_[104]; 534 static const uint8_t table22_80_emit_[44]; 535 static const uint8_t table22_81_emit_[104]; 536 static const uint8_t table22_82_emit_[136]; 537 static const uint16_t table22_82_ops_[128]; 538 static const uint8_t table22_83_emit_[136]; 539 static const uint8_t table22_84_emit_[136]; 540 static const uint8_t table22_85_emit_[136]; 541 static const uint8_t table22_86_emit_[136]; 542 static const uint8_t table22_87_emit_[136]; 543 static const uint8_t table22_88_emit_[136]; 544 static const uint8_t table22_89_emit_[136]; 545 static const uint8_t table22_90_emit_[136]; 546 static const uint8_t table22_91_emit_[136]; 547 static const uint8_t table22_92_emit_[136]; 548 static const uint8_t table22_93_emit_[136]; 549 static const uint8_t table22_94_emit_[136]; 550 static const uint8_t table22_95_emit_[136]; 551 static const uint8_t table22_96_emit_[136]; 552 static const uint8_t table22_97_emit_[136]; 553 static const uint8_t table22_98_emit_[136]; 554 static const uint8_t table22_99_emit_[136]; 555 static const uint8_t table22_100_emit_[136]; 556 static const uint8_t table22_101_emit_[136]; 557 static const uint8_t table22_102_emit_[136]; 558 static const uint8_t table22_103_emit_[136]; 559 static const uint8_t table22_104_emit_[136]; 560 static const uint8_t table22_105_emit_[136]; 561 static const uint8_t table22_106_emit_[136]; 562 static const uint8_t table22_107_emit_[136]; 563 static const uint8_t table22_108_emit_[144]; 564 static const uint16_t table22_108_ops_[128]; 565 static const uint8_t table22_109_emit_[144]; 566 static const uint8_t table22_110_emit_[144]; 567 static const uint8_t table22_111_emit_[144]; 568 static const uint8_t table22_112_emit_[144]; 569 static const uint8_t table22_113_emit_[144]; 570 static const uint8_t table22_114_emit_[144]; 571 static const uint8_t table22_115_emit_[144]; 572 static const uint8_t table22_116_emit_[144]; 573 static const uint8_t table22_117_emit_[144]; 574 static const uint8_t table22_118_emit_[144]; 575 static const uint8_t table22_119_emit_[144]; 576 static const uint8_t table22_120_emit_[144]; 577 static const uint8_t table22_121_emit_[144]; 578 static const uint8_t table22_122_emit_[112]; 579 static const uint16_t table22_122_ops_[128]; 580 static const uint8_t table22_123_emit_[80]; 581 static const uint16_t table22_123_ops_[128]; 582 static const uint8_t table22_124_emit_[80]; 583 static const uint8_t table22_125_emit_[44]; 584 static const uint16_t table22_125_ops_[128]; 585 static const uint8_t table22_126_emit_[17]; 586 static const uint16_t table22_126_ops_[128]; 587 static const uint8_t table22_127_emit_[46]; 588 static const uint16_t table22_127_ops_[128]; 589 static const uint8_t* const table22_emit_[128]; 590 static const uint16_t* const table22_ops_[128]; 591 static const uint8_t table11_0_emit_[1]; 592 static const uint16_t table11_0_ops_[256]; 593 static const uint8_t table11_8_emit_[1]; 594 static const uint8_t table11_16_emit_[1]; 595 static const uint8_t table11_24_emit_[1]; 596 static const uint16_t table11_24_ops_[256]; 597 static const uint8_t table11_28_emit_[1]; 598 static const uint8_t table11_32_emit_[1]; 599 static const uint8_t table11_36_emit_[1]; 600 static const uint8_t table11_40_emit_[1]; 601 static const uint8_t table11_44_emit_[1]; 602 static const uint8_t table11_48_emit_[1]; 603 static const uint8_t table11_52_emit_[1]; 604 static const uint8_t table11_56_emit_[1]; 605 static const uint16_t table11_56_ops_[256]; 606 static const uint8_t table11_58_emit_[1]; 607 static const uint8_t table11_60_emit_[1]; 608 static const uint8_t table11_62_emit_[1]; 609 static const uint8_t table11_64_emit_[1]; 610 static const uint8_t table11_66_emit_[1]; 611 static const uint8_t table11_68_emit_[1]; 612 static const uint8_t table11_70_emit_[1]; 613 static const uint8_t table11_72_emit_[1]; 614 static const uint8_t table11_74_emit_[1]; 615 static const uint8_t table11_76_emit_[1]; 616 static const uint8_t table11_78_emit_[1]; 617 static const uint8_t table11_80_emit_[1]; 618 static const uint8_t table11_82_emit_[1]; 619 static const uint16_t table11_82_ops_[256]; 620 static const uint8_t table11_83_emit_[1]; 621 static const uint8_t table11_84_emit_[1]; 622 static const uint8_t table11_85_emit_[1]; 623 static const uint8_t table11_86_emit_[1]; 624 static const uint8_t table11_87_emit_[1]; 625 static const uint8_t table11_88_emit_[1]; 626 static const uint8_t table11_89_emit_[1]; 627 static const uint8_t table11_90_emit_[1]; 628 static const uint8_t table11_91_emit_[1]; 629 static const uint8_t table11_92_emit_[1]; 630 static const uint8_t table11_93_emit_[1]; 631 static const uint8_t table11_94_emit_[1]; 632 static const uint8_t table11_95_emit_[1]; 633 static const uint8_t table11_96_emit_[1]; 634 static const uint8_t table11_97_emit_[1]; 635 static const uint8_t table11_98_emit_[1]; 636 static const uint8_t table11_99_emit_[1]; 637 static const uint8_t table11_100_emit_[1]; 638 static const uint8_t table11_101_emit_[1]; 639 static const uint8_t table11_102_emit_[1]; 640 static const uint8_t table11_103_emit_[1]; 641 static const uint8_t table11_104_emit_[1]; 642 static const uint8_t table11_105_emit_[1]; 643 static const uint8_t table11_106_emit_[1]; 644 static const uint8_t table11_107_emit_[1]; 645 static const uint8_t table11_108_emit_[2]; 646 static const uint16_t table11_108_ops_[256]; 647 static const uint8_t table11_109_emit_[2]; 648 static const uint8_t table11_110_emit_[2]; 649 static const uint8_t table11_111_emit_[2]; 650 static const uint8_t table11_112_emit_[2]; 651 static const uint8_t table11_113_emit_[2]; 652 static const uint8_t table11_114_emit_[2]; 653 static const uint8_t table11_115_emit_[2]; 654 static const uint8_t table11_116_emit_[2]; 655 static const uint8_t table11_117_emit_[2]; 656 static const uint8_t table11_118_emit_[2]; 657 static const uint8_t table11_119_emit_[2]; 658 static const uint8_t table11_120_emit_[2]; 659 static const uint8_t table11_121_emit_[2]; 660 static const uint8_t table11_122_emit_[3]; 661 static const uint16_t table11_122_ops_[256]; 662 static const uint8_t table11_123_emit_[4]; 663 static const uint16_t table11_123_ops_[256]; 664 static const uint8_t table11_124_emit_[4]; 665 static const uint8_t table11_125_emit_[6]; 666 static const uint16_t table11_125_ops_[256]; 667 static const uint16_t table11_126_ops_[256]; 668 static const uint8_t table11_127_emit_[49]; 669 static const uint16_t table11_127_ops_[256]; 670 static const uint8_t* const table11_emit_[128]; 671 static const uint16_t* const table11_ops_[128]; 672 }; 673 template <typename F> 674 class HuffDecoder : public HuffDecoderCommon { 675 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)676 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 677 : sink_(sink), begin_(begin), end_(end) {} Run()678 bool Run() { 679 while (!done_) { 680 if (!RefillTo10()) { 681 Done0(); 682 break; 683 } 684 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 685 const auto op = GetOp1(index); 686 const int consumed = op & 15; 687 buffer_len_ -= consumed; 688 const auto emit_ofs = op >> 7; 689 switch ((op >> 4) & 7) { 690 case 0: { 691 sink_(GetEmit1(index, emit_ofs + 0)); 692 sink_(GetEmit1(index, emit_ofs + 1)); 693 break; 694 } 695 case 1: { 696 sink_(GetEmit1(index, emit_ofs + 0)); 697 break; 698 } 699 case 2: { 700 DecodeStep0(); 701 break; 702 } 703 case 3: { 704 DecodeStep3(); 705 break; 706 } 707 case 4: { 708 DecodeStep1(); 709 break; 710 } 711 } 712 } 713 return ok_; 714 } 715 716 private: RefillTo10()717 bool RefillTo10() { 718 switch (buffer_len_) { 719 case 0: { 720 return Read2to8Bytes(); 721 } 722 case 1: { 723 return Read2to7Bytes(); 724 } 725 case 2: 726 case 3: 727 case 4: 728 case 5: 729 case 6: 730 case 7: 731 case 8: { 732 return Read1to7Bytes(); 733 } 734 case 9: { 735 return Read1to6Bytes(); 736 } 737 } 738 return true; 739 } Read2to8Bytes()740 bool Read2to8Bytes() { 741 switch (end_ - begin_) { 742 case 0: 743 case 1: { 744 return false; 745 } 746 case 2: { 747 Fill2(); 748 return true; 749 } 750 case 3: { 751 Fill3(); 752 return true; 753 } 754 case 4: { 755 Fill4(); 756 return true; 757 } 758 case 5: { 759 Fill5(); 760 return true; 761 } 762 case 6: { 763 Fill6(); 764 return true; 765 } 766 case 7: { 767 Fill7(); 768 return true; 769 } 770 default: { 771 Fill8(); 772 return true; 773 } 774 } 775 } Fill2()776 void Fill2() { 777 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 778 (static_cast<uint64_t>(begin_[1]) << 0); 779 begin_ += 2; 780 buffer_len_ += 16; 781 } Fill3()782 void Fill3() { 783 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 784 (static_cast<uint64_t>(begin_[1]) << 8) | 785 (static_cast<uint64_t>(begin_[2]) << 0); 786 begin_ += 3; 787 buffer_len_ += 24; 788 } Fill4()789 void Fill4() { 790 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 791 (static_cast<uint64_t>(begin_[1]) << 16) | 792 (static_cast<uint64_t>(begin_[2]) << 8) | 793 (static_cast<uint64_t>(begin_[3]) << 0); 794 begin_ += 4; 795 buffer_len_ += 32; 796 } Fill5()797 void Fill5() { 798 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 799 (static_cast<uint64_t>(begin_[1]) << 24) | 800 (static_cast<uint64_t>(begin_[2]) << 16) | 801 (static_cast<uint64_t>(begin_[3]) << 8) | 802 (static_cast<uint64_t>(begin_[4]) << 0); 803 begin_ += 5; 804 buffer_len_ += 40; 805 } Fill6()806 void Fill6() { 807 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 808 (static_cast<uint64_t>(begin_[1]) << 32) | 809 (static_cast<uint64_t>(begin_[2]) << 24) | 810 (static_cast<uint64_t>(begin_[3]) << 16) | 811 (static_cast<uint64_t>(begin_[4]) << 8) | 812 (static_cast<uint64_t>(begin_[5]) << 0); 813 begin_ += 6; 814 buffer_len_ += 48; 815 } Fill7()816 void Fill7() { 817 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 818 (static_cast<uint64_t>(begin_[1]) << 40) | 819 (static_cast<uint64_t>(begin_[2]) << 32) | 820 (static_cast<uint64_t>(begin_[3]) << 24) | 821 (static_cast<uint64_t>(begin_[4]) << 16) | 822 (static_cast<uint64_t>(begin_[5]) << 8) | 823 (static_cast<uint64_t>(begin_[6]) << 0); 824 begin_ += 7; 825 buffer_len_ += 56; 826 } Fill8()827 void Fill8() { 828 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 829 (static_cast<uint64_t>(begin_[1]) << 48) | 830 (static_cast<uint64_t>(begin_[2]) << 40) | 831 (static_cast<uint64_t>(begin_[3]) << 32) | 832 (static_cast<uint64_t>(begin_[4]) << 24) | 833 (static_cast<uint64_t>(begin_[5]) << 16) | 834 (static_cast<uint64_t>(begin_[6]) << 8) | 835 (static_cast<uint64_t>(begin_[7]) << 0); 836 begin_ += 8; 837 buffer_len_ += 64; 838 } Read2to7Bytes()839 bool Read2to7Bytes() { 840 switch (end_ - begin_) { 841 case 0: 842 case 1: { 843 return false; 844 } 845 case 2: { 846 Fill2(); 847 return true; 848 } 849 case 3: { 850 Fill3(); 851 return true; 852 } 853 case 4: { 854 Fill4(); 855 return true; 856 } 857 case 5: { 858 Fill5(); 859 return true; 860 } 861 case 6: { 862 Fill6(); 863 return true; 864 } 865 default: { 866 Fill7(); 867 return true; 868 } 869 } 870 } Read1to7Bytes()871 bool Read1to7Bytes() { 872 switch (end_ - begin_) { 873 case 0: { 874 return false; 875 } 876 case 1: { 877 Fill1(); 878 return true; 879 } 880 case 2: { 881 Fill2(); 882 return true; 883 } 884 case 3: { 885 Fill3(); 886 return true; 887 } 888 case 4: { 889 Fill4(); 890 return true; 891 } 892 case 5: { 893 Fill5(); 894 return true; 895 } 896 case 6: { 897 Fill6(); 898 return true; 899 } 900 default: { 901 Fill7(); 902 return true; 903 } 904 } 905 } Fill1()906 void Fill1() { 907 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 908 begin_ += 1; 909 buffer_len_ += 8; 910 } Read1to6Bytes()911 bool Read1to6Bytes() { 912 switch (end_ - begin_) { 913 case 0: { 914 return false; 915 } 916 case 1: { 917 Fill1(); 918 return true; 919 } 920 case 2: { 921 Fill2(); 922 return true; 923 } 924 case 3: { 925 Fill3(); 926 return true; 927 } 928 case 4: { 929 Fill4(); 930 return true; 931 } 932 case 5: { 933 Fill5(); 934 return true; 935 } 936 default: { 937 Fill6(); 938 return true; 939 } 940 } 941 } Done0()942 void Done0() { 943 done_ = true; 944 switch (end_ - begin_) { 945 case 1: { 946 Fill1(); 947 break; 948 } 949 } 950 switch (buffer_len_) { 951 case 1: 952 case 2: 953 case 3: 954 case 4: { 955 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 956 return; 957 } 958 case 5: { 959 const auto index = buffer_ & 31; 960 const auto op = GetOp2(index); 961 switch (op & 3) { 962 case 0: { 963 sink_(GetEmit2(index, (op >> 2) + 0)); 964 break; 965 } 966 case 1: { 967 ok_ = false; 968 break; 969 } 970 } 971 return; 972 } 973 case 6: { 974 const auto index = buffer_ & 63; 975 const auto op = GetOp3(index); 976 switch (op & 3) { 977 case 0: { 978 ok_ = false; 979 break; 980 } 981 case 1: { 982 sink_(GetEmit3(index, (op >> 2) + 0)); 983 break; 984 } 985 } 986 return; 987 } 988 case 7: { 989 const auto index = buffer_ & 127; 990 const auto op = GetOp4(index); 991 switch (op & 3) { 992 case 0: { 993 ok_ = false; 994 break; 995 } 996 case 1: { 997 sink_(GetEmit4(index, (op >> 2) + 0)); 998 break; 999 } 1000 } 1001 return; 1002 } 1003 case 8: { 1004 const auto index = buffer_ & 255; 1005 const auto op = GetOp5(index); 1006 switch (op & 3) { 1007 case 0: { 1008 ok_ = false; 1009 break; 1010 } 1011 case 1: { 1012 sink_(GetEmit5(index, (op >> 2) + 0)); 1013 break; 1014 } 1015 } 1016 return; 1017 } 1018 case 9: { 1019 const auto index = buffer_ & 511; 1020 const auto op = GetOp6(index); 1021 switch (op & 3) { 1022 case 0: { 1023 ok_ = false; 1024 break; 1025 } 1026 case 1: { 1027 sink_(GetEmit6(index, (op >> 2) + 0)); 1028 break; 1029 } 1030 } 1031 return; 1032 } 1033 case 0: { 1034 return; 1035 } 1036 } 1037 } DecodeStep0()1038 void DecodeStep0() { 1039 if (!RefillTo1()) { 1040 Done1(); 1041 return; 1042 } 1043 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1044 const auto op = GetOp7(index); 1045 const int consumed = op & 1; 1046 buffer_len_ -= consumed; 1047 const auto emit_ofs = op >> 1; 1048 sink_(GetEmit7(index, emit_ofs + 0)); 1049 } RefillTo1()1050 bool RefillTo1() { 1051 switch (buffer_len_) { 1052 case 0: { 1053 return Read1to8Bytes(); 1054 } 1055 } 1056 return true; 1057 } Read1to8Bytes()1058 bool Read1to8Bytes() { 1059 switch (end_ - begin_) { 1060 case 0: { 1061 return false; 1062 } 1063 case 1: { 1064 Fill1(); 1065 return true; 1066 } 1067 case 2: { 1068 Fill2(); 1069 return true; 1070 } 1071 case 3: { 1072 Fill3(); 1073 return true; 1074 } 1075 case 4: { 1076 Fill4(); 1077 return true; 1078 } 1079 case 5: { 1080 Fill5(); 1081 return true; 1082 } 1083 case 6: { 1084 Fill6(); 1085 return true; 1086 } 1087 case 7: { 1088 Fill7(); 1089 return true; 1090 } 1091 default: { 1092 Fill8(); 1093 return true; 1094 } 1095 } 1096 } Done1()1097 void Done1() { 1098 done_ = true; 1099 ok_ = false; 1100 } DecodeStep1()1101 void DecodeStep1() { 1102 if (!RefillTo5()) { 1103 Done2(); 1104 return; 1105 } 1106 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1107 const auto op = GetOp8(index); 1108 const int consumed = op & 7; 1109 buffer_len_ -= consumed; 1110 const auto emit_ofs = op >> 4; 1111 switch ((op >> 3) & 1) { 1112 case 0: { 1113 sink_(GetEmit8(index, emit_ofs + 0)); 1114 break; 1115 } 1116 case 1: { 1117 DecodeStep2(); 1118 break; 1119 } 1120 } 1121 } RefillTo5()1122 bool RefillTo5() { 1123 switch (buffer_len_) { 1124 case 0: { 1125 return Read1to8Bytes(); 1126 } 1127 case 1: 1128 case 2: 1129 case 3: 1130 case 4: { 1131 return Read1to7Bytes(); 1132 } 1133 } 1134 return true; 1135 } Done2()1136 void Done2() { 1137 done_ = true; 1138 switch (buffer_len_) { 1139 case 1: 1140 case 2: { 1141 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1142 return; 1143 } 1144 case 3: { 1145 const auto index = buffer_ & 7; 1146 const auto op = GetOp9(index); 1147 switch (op & 3) { 1148 case 0: { 1149 sink_(GetEmit9(index, (op >> 2) + 0)); 1150 break; 1151 } 1152 case 1: { 1153 ok_ = false; 1154 break; 1155 } 1156 } 1157 return; 1158 } 1159 case 4: { 1160 const auto index = buffer_ & 15; 1161 const auto op = GetOp10(index); 1162 switch (op & 3) { 1163 case 0: { 1164 ok_ = false; 1165 break; 1166 } 1167 case 1: { 1168 sink_(GetEmit10(index, (op >> 2) + 0)); 1169 break; 1170 } 1171 } 1172 return; 1173 } 1174 case 0: { 1175 return; 1176 } 1177 } 1178 } DecodeStep2()1179 void DecodeStep2() { 1180 if (!RefillTo15()) { 1181 Done3(); 1182 return; 1183 } 1184 const auto index = (buffer_ >> (buffer_len_ - 15)) & 0x7fff; 1185 const auto op = GetOp11(index); 1186 const int consumed = op & 15; 1187 buffer_len_ -= consumed; 1188 const auto emit_ofs = op >> 5; 1189 switch ((op >> 4) & 1) { 1190 case 0: { 1191 sink_(GetEmit11(index, emit_ofs + 0)); 1192 break; 1193 } 1194 case 1: { 1195 begin_ = end_; 1196 buffer_len_ = 0; 1197 break; 1198 } 1199 } 1200 } RefillTo15()1201 bool RefillTo15() { 1202 switch (buffer_len_) { 1203 case 0: { 1204 return Read2to8Bytes(); 1205 } 1206 case 1: 1207 case 2: 1208 case 3: 1209 case 4: 1210 case 5: 1211 case 6: { 1212 return Read2to7Bytes(); 1213 } 1214 case 7: 1215 case 8: { 1216 return Read1to7Bytes(); 1217 } 1218 case 9: 1219 case 10: 1220 case 11: 1221 case 12: 1222 case 13: 1223 case 14: { 1224 return Read1to6Bytes(); 1225 } 1226 } 1227 return true; 1228 } Done3()1229 void Done3() { 1230 done_ = true; 1231 switch (end_ - begin_) { 1232 case 1: { 1233 Fill1(); 1234 break; 1235 } 1236 } 1237 switch (buffer_len_) { 1238 case 1: 1239 case 2: 1240 case 3: { 1241 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1242 return; 1243 } 1244 case 4: { 1245 const auto index = buffer_ & 15; 1246 const auto op = GetOp12(index); 1247 switch (op & 3) { 1248 case 0: { 1249 sink_(GetEmit12(index, (op >> 2) + 0)); 1250 break; 1251 } 1252 case 1: { 1253 ok_ = false; 1254 break; 1255 } 1256 } 1257 return; 1258 } 1259 case 5: { 1260 const auto index = buffer_ & 31; 1261 const auto op = GetOp13(index); 1262 switch (op & 3) { 1263 case 0: { 1264 ok_ = false; 1265 break; 1266 } 1267 case 1: { 1268 sink_(GetEmit13(index, (op >> 2) + 0)); 1269 break; 1270 } 1271 } 1272 return; 1273 } 1274 case 6: { 1275 const auto index = buffer_ & 63; 1276 const auto op = GetOp14(index); 1277 switch (op & 3) { 1278 case 0: { 1279 ok_ = false; 1280 break; 1281 } 1282 case 1: { 1283 sink_(GetEmit14(index, (op >> 2) + 0)); 1284 break; 1285 } 1286 } 1287 return; 1288 } 1289 case 7: { 1290 const auto index = buffer_ & 127; 1291 const auto op = GetOp15(index); 1292 switch (op & 3) { 1293 case 0: { 1294 ok_ = false; 1295 break; 1296 } 1297 case 1: { 1298 sink_(GetEmit15(index, (op >> 2) + 0)); 1299 break; 1300 } 1301 } 1302 return; 1303 } 1304 case 8: { 1305 const auto index = buffer_ & 255; 1306 const auto op = GetOp16(index); 1307 switch (op & 3) { 1308 case 0: { 1309 ok_ = false; 1310 break; 1311 } 1312 case 1: { 1313 sink_(GetEmit16(index, (op >> 2) + 0)); 1314 break; 1315 } 1316 } 1317 return; 1318 } 1319 case 9: { 1320 const auto index = buffer_ & 511; 1321 const auto op = GetOp17(index); 1322 switch (op & 3) { 1323 case 0: { 1324 sink_(GetEmit17(index, (op >> 2) + 0)); 1325 sink_(GetEmit17(index, (op >> 2) + 1)); 1326 break; 1327 } 1328 case 1: { 1329 ok_ = false; 1330 break; 1331 } 1332 case 2: { 1333 sink_(GetEmit17(index, (op >> 2) + 0)); 1334 break; 1335 } 1336 } 1337 return; 1338 } 1339 case 10: { 1340 const auto index = buffer_ & 1023; 1341 const auto op = GetOp18(index); 1342 switch (op & 3) { 1343 case 0: { 1344 ok_ = false; 1345 break; 1346 } 1347 case 1: { 1348 sink_(GetEmit18(index, (op >> 2) + 0)); 1349 sink_(GetEmit18(index, (op >> 2) + 1)); 1350 break; 1351 } 1352 case 2: { 1353 sink_(GetEmit18(index, (op >> 2) + 0)); 1354 break; 1355 } 1356 } 1357 return; 1358 } 1359 case 11: { 1360 const auto index = buffer_ & 2047; 1361 const auto op = GetOp19(index); 1362 switch (op & 3) { 1363 case 0: { 1364 ok_ = false; 1365 break; 1366 } 1367 case 1: { 1368 sink_(GetEmit19(index, (op >> 2) + 0)); 1369 sink_(GetEmit19(index, (op >> 2) + 1)); 1370 break; 1371 } 1372 case 2: { 1373 sink_(GetEmit19(index, (op >> 2) + 0)); 1374 break; 1375 } 1376 } 1377 return; 1378 } 1379 case 12: { 1380 const auto index = buffer_ & 4095; 1381 const auto op = GetOp20(index); 1382 switch (op & 3) { 1383 case 0: { 1384 ok_ = false; 1385 break; 1386 } 1387 case 1: { 1388 sink_(GetEmit20(index, (op >> 2) + 0)); 1389 sink_(GetEmit20(index, (op >> 2) + 1)); 1390 break; 1391 } 1392 case 2: { 1393 sink_(GetEmit20(index, (op >> 2) + 0)); 1394 break; 1395 } 1396 } 1397 return; 1398 } 1399 case 13: { 1400 const auto index = buffer_ & 8191; 1401 const auto op = GetOp21(index); 1402 switch (op & 3) { 1403 case 0: { 1404 ok_ = false; 1405 break; 1406 } 1407 case 1: { 1408 sink_(GetEmit21(index, (op >> 2) + 0)); 1409 sink_(GetEmit21(index, (op >> 2) + 1)); 1410 break; 1411 } 1412 case 2: { 1413 sink_(GetEmit21(index, (op >> 2) + 0)); 1414 break; 1415 } 1416 } 1417 return; 1418 } 1419 case 14: { 1420 const auto index = buffer_ & 16383; 1421 const auto op = GetOp22(index); 1422 switch (op & 7) { 1423 case 0: { 1424 sink_(GetEmit22(index, (op >> 3) + 0)); 1425 sink_(GetEmit22(index, (op >> 3) + 1)); 1426 sink_(GetEmit22(index, (op >> 3) + 2)); 1427 break; 1428 } 1429 case 1: { 1430 ok_ = false; 1431 break; 1432 } 1433 case 2: { 1434 sink_(GetEmit22(index, (op >> 3) + 0)); 1435 sink_(GetEmit22(index, (op >> 3) + 1)); 1436 break; 1437 } 1438 case 3: { 1439 sink_(GetEmit22(index, (op >> 3) + 0)); 1440 break; 1441 } 1442 } 1443 return; 1444 } 1445 case 0: { 1446 return; 1447 } 1448 } 1449 } DecodeStep3()1450 void DecodeStep3() { 1451 if (!RefillTo2()) { 1452 Done4(); 1453 return; 1454 } 1455 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1456 const auto op = GetOp23(index); 1457 const int consumed = op & 3; 1458 buffer_len_ -= consumed; 1459 const auto emit_ofs = op >> 2; 1460 sink_(GetEmit23(index, emit_ofs + 0)); 1461 } RefillTo2()1462 bool RefillTo2() { 1463 switch (buffer_len_) { 1464 case 0: { 1465 return Read1to8Bytes(); 1466 } 1467 case 1: { 1468 return Read1to7Bytes(); 1469 } 1470 } 1471 return true; 1472 } Done4()1473 void Done4() { 1474 done_ = true; 1475 switch (buffer_len_) { 1476 case 1: { 1477 const auto index = buffer_ & 1; 1478 const auto op = GetOp24(index); 1479 switch (op & 1) { 1480 case 0: { 1481 sink_(GetEmit24(index, (op >> 1) + 0)); 1482 break; 1483 } 1484 case 1: { 1485 ok_ = false; 1486 break; 1487 } 1488 } 1489 return; 1490 } 1491 case 0: { 1492 ok_ = false; 1493 return; 1494 } 1495 } 1496 } 1497 F sink_; 1498 const uint8_t* begin_; 1499 const uint8_t* const end_; 1500 uint64_t buffer_ = 0; 1501 int buffer_len_ = 0; 1502 bool ok_ = true; 1503 bool done_ = false; 1504 }; 1505 } // namespace geometry_10_5_15 1506 } // namespace grpc_core 1507 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_5_15_H 1508