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_14_6_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_14_6_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_10_14_6 { 26 class HuffDecoderCommon { 27 protected: GetOp2(size_t i)28 static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; } GetEmit2(size_t,size_t emit)29 static inline uint64_t GetEmit2(size_t, size_t emit) { 30 return table2_0_emit_[emit]; 31 } GetOp3(size_t i)32 static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; } GetEmit3(size_t,size_t emit)33 static inline uint64_t GetEmit3(size_t, size_t emit) { 34 return table3_0_emit_[emit]; 35 } GetOp4(size_t i)36 static inline uint64_t GetOp4(size_t i) { 37 return table4_ops_[i >> 6][i & 0x3f]; 38 } GetEmit4(size_t i,size_t emit)39 static inline uint64_t GetEmit4(size_t i, size_t emit) { 40 return table4_emit_[i >> 6][emit]; 41 } GetOp5(size_t i)42 static inline uint64_t GetOp5(size_t i) { 43 return table5_ops_[i >> 7][i & 0x7f]; 44 } GetEmit5(size_t i,size_t emit)45 static inline uint64_t GetEmit5(size_t i, size_t emit) { 46 return table5_emit_[i >> 7][emit]; 47 } GetOp6(size_t i)48 static inline uint64_t GetOp6(size_t i) { 49 return table6_ops_[i >> 5][i & 0x1f]; 50 } GetEmit6(size_t i,size_t emit)51 static inline uint64_t GetEmit6(size_t i, size_t emit) { 52 return table6_emit_[i >> 5][emit]; 53 } 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 } GetOp11(size_t i)74 static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; } GetEmit11(size_t,size_t emit)75 static inline uint64_t GetEmit11(size_t, size_t emit) { 76 return table11_0_emit_[emit]; 77 } GetOp12(size_t i)78 static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; } GetEmit12(size_t,size_t emit)79 static inline uint64_t GetEmit12(size_t, size_t emit) { 80 return table11_0_emit_[emit]; 81 } GetOp13(size_t i)82 static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; } GetEmit13(size_t,size_t emit)83 static inline uint64_t GetEmit13(size_t, size_t emit) { 84 return table11_0_emit_[emit]; 85 } GetOp14(size_t i)86 static inline uint64_t GetOp14(size_t i) { 87 return table14_ops_[i >> 6][i & 0x3f]; 88 } GetEmit14(size_t i,size_t emit)89 static inline uint64_t GetEmit14(size_t i, size_t emit) { 90 return table14_emit_[i >> 6][emit]; 91 } GetOp15(size_t i)92 static inline uint64_t GetOp15(size_t i) { 93 return table15_ops_[i >> 6][i & 0x3f]; 94 } GetEmit15(size_t i,size_t emit)95 static inline uint64_t GetEmit15(size_t i, size_t emit) { 96 return table15_emit_[i >> 6][emit]; 97 } GetOp16(size_t i)98 static inline uint64_t GetOp16(size_t i) { 99 return table16_ops_[i >> 6][i & 0x3f]; 100 } GetEmit16(size_t i,size_t emit)101 static inline uint64_t GetEmit16(size_t i, size_t emit) { 102 return table16_emit_[i >> 6][emit]; 103 } GetOp17(size_t i)104 static inline uint64_t GetOp17(size_t i) { 105 return table17_ops_[i >> 6][i & 0x3f]; 106 } GetEmit17(size_t i,size_t emit)107 static inline uint64_t GetEmit17(size_t i, size_t emit) { 108 return table17_emit_[i >> 6][emit]; 109 } GetOp18(size_t i)110 static inline uint64_t GetOp18(size_t i) { 111 return table18_ops_[i >> 7][i & 0x7f]; 112 } GetEmit18(size_t i,size_t emit)113 static inline uint64_t GetEmit18(size_t i, size_t emit) { 114 return table18_emit_[i >> 7][emit]; 115 } GetOp19(size_t i)116 static inline uint64_t GetOp19(size_t i) { 117 return table19_ops_[i >> 7][i & 0x7f]; 118 } GetEmit19(size_t i,size_t emit)119 static inline uint64_t GetEmit19(size_t i, size_t emit) { 120 return table19_emit_[i >> 7][emit]; 121 } GetOp8(size_t i)122 static inline uint64_t GetOp8(size_t i) { 123 return table8_ops_[i >> 9][i & 0x1ff]; 124 } GetEmit8(size_t i,size_t emit)125 static inline uint64_t GetEmit8(size_t i, size_t emit) { 126 return table8_emit_[i >> 9][emit]; 127 } GetOp20(size_t i)128 static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; } GetEmit20(size_t,size_t emit)129 static inline uint64_t GetEmit20(size_t, size_t emit) { 130 return emit ? 207 : 199; 131 } GetOp21(size_t i)132 static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; } GetEmit21(size_t,size_t emit)133 static inline uint64_t GetEmit21(size_t, size_t emit) { return emit + 234; } GetOp22(size_t i)134 static inline uint64_t GetOp22(size_t i) { 135 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 136 } GetEmit22(size_t,size_t emit)137 static inline uint64_t GetEmit22(size_t, size_t emit) { 138 return (emit < 2 ? (emit + 192) : ((emit - 2) + 200)); 139 } GetOp23(size_t i)140 static inline uint64_t GetOp23(size_t i) { 141 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 142 } GetEmit23(size_t,size_t emit)143 static inline uint64_t GetEmit23(size_t, size_t emit) { 144 return (emit < 2 ? (emit ? 205 : 202) : ((emit - 2) ? 213 : 210)); 145 } GetOp24(size_t i)146 static inline uint64_t GetOp24(size_t i) { 147 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 148 } GetEmit24(size_t,size_t emit)149 static inline uint64_t GetEmit24(size_t, size_t emit) { 150 return (emit < 2 ? (emit + 218) : ((emit - 2) ? 240 : 238)); 151 } GetOp25(size_t i)152 static inline uint64_t GetOp25(size_t i) { return table25_0_inner_[i]; } GetEmit25(size_t,size_t emit)153 static inline uint64_t GetEmit25(size_t, size_t emit) { 154 return table25_0_emit_[emit]; 155 } GetOp26(size_t i)156 static inline uint64_t GetOp26(size_t i) { return table25_0_inner_[i]; } GetEmit26(size_t,size_t emit)157 static inline uint64_t GetEmit26(size_t, size_t emit) { 158 return (emit < 4 ? (emit + 245) : ((emit - 4) + 250)); 159 } GetOp28(size_t i)160 static inline uint64_t GetOp28(size_t i) { 161 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 162 } GetEmit28(size_t,size_t emit)163 static inline uint64_t GetEmit28(size_t, size_t emit) { 164 return ((void)emit, 254); 165 } GetOp27(size_t i)166 static inline uint64_t GetOp27(size_t i) { 167 return table27_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 168 } GetEmit27(size_t,size_t emit)169 static inline uint64_t GetEmit27(size_t, size_t emit) { 170 return table27_0_emit_[emit]; 171 } GetOp30(size_t i)172 static inline uint64_t GetOp30(size_t i) { 173 return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4)); 174 } GetEmit30(size_t,size_t emit)175 static inline uint64_t GetEmit30(size_t, size_t emit) { 176 return (emit < 1 ? (((void)emit, 242)) : ((emit - 1) ? 255 : 243)); 177 } GetOp29(size_t i)178 static inline uint64_t GetOp29(size_t i) { 179 return table29_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))]; 180 } GetEmit29(size_t,size_t emit)181 static inline uint64_t GetEmit29(size_t, size_t emit) { 182 return table29_0_emit_[emit]; 183 } GetOp32(size_t i)184 static inline uint64_t GetOp32(size_t i) { return table32_0_inner_[i]; } GetEmit32(size_t,size_t emit)185 static inline uint64_t GetEmit32(size_t, size_t emit) { 186 return table32_0_emit_[emit]; 187 } GetOp33(size_t i)188 static inline uint64_t GetOp33(size_t i) { return table33_0_ops_[i]; } GetEmit33(size_t,size_t emit)189 static inline uint64_t GetEmit33(size_t, size_t emit) { 190 return table32_0_emit_[emit]; 191 } GetOp31(size_t i)192 static inline uint64_t GetOp31(size_t i) { 193 return table31_ops_[i >> 5][i & 0x1f]; 194 } GetEmit31(size_t i,size_t emit)195 static inline uint64_t GetEmit31(size_t i, size_t emit) { 196 return table31_emit_[i >> 5][emit]; 197 } GetOp35(size_t i)198 static inline uint64_t GetOp35(size_t i) { return i; } GetEmit35(size_t,size_t emit)199 static inline uint64_t GetEmit35(size_t, size_t emit) { 200 return ((void)emit, 124); 201 } GetOp34(size_t i)202 static inline uint64_t GetOp34(size_t i) { 203 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 204 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 205 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 206 } GetEmit34(size_t,size_t emit)207 static inline uint64_t GetEmit34(size_t, size_t emit) { 208 return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35)); 209 } 210 211 private: 212 static const uint8_t table2_0_emit_[10]; 213 static const uint8_t table2_0_ops_[32]; 214 static const uint8_t table3_0_emit_[36]; 215 static const uint8_t table3_0_ops_[64]; 216 static const uint8_t table4_0_emit_[22]; 217 static const uint8_t table4_0_ops_[64]; 218 static const uint8_t table4_1_emit_[46]; 219 static const uint8_t table4_1_ops_[64]; 220 static const uint8_t* const table4_emit_[2]; 221 static const uint8_t* const table4_ops_[2]; 222 static const uint8_t table5_0_ops_[128]; 223 static const uint8_t table5_1_emit_[52]; 224 static const uint8_t table5_1_ops_[128]; 225 static const uint8_t* const table5_emit_[2]; 226 static const uint8_t* const table5_ops_[2]; 227 static const uint8_t table6_0_emit_[2]; 228 static const uint8_t table6_0_ops_[32]; 229 static const uint8_t table6_1_emit_[2]; 230 static const uint8_t table6_2_emit_[2]; 231 static const uint8_t table6_3_emit_[2]; 232 static const uint8_t table6_4_emit_[2]; 233 static const uint8_t table6_5_emit_[4]; 234 static const uint8_t table6_5_ops_[32]; 235 static const uint8_t table6_6_emit_[4]; 236 static const uint8_t table6_7_emit_[4]; 237 static const uint8_t table6_8_emit_[4]; 238 static const uint8_t table6_9_emit_[4]; 239 static const uint8_t table6_10_emit_[4]; 240 static const uint8_t table6_11_emit_[6]; 241 static const uint8_t table6_11_ops_[32]; 242 static const uint8_t table6_12_emit_[8]; 243 static const uint8_t table6_12_ops_[32]; 244 static const uint8_t table6_13_emit_[8]; 245 static const uint8_t table6_14_emit_[8]; 246 static const uint8_t table6_15_emit_[10]; 247 static const uint8_t table6_15_ops_[32]; 248 static const uint8_t* const table6_emit_[16]; 249 static const uint8_t* const table6_ops_[16]; 250 static const uint8_t table1_0_emit_[36]; 251 static const uint16_t table1_0_inner_[22]; 252 static const uint8_t table1_0_outer_[64]; 253 static const uint8_t table1_1_emit_[36]; 254 static const uint16_t table1_1_inner_[22]; 255 static const uint8_t table1_2_emit_[36]; 256 static const uint16_t table1_2_inner_[22]; 257 static const uint8_t table1_3_emit_[36]; 258 static const uint16_t table1_3_inner_[22]; 259 static const uint8_t table1_4_emit_[38]; 260 static const uint16_t table1_4_inner_[22]; 261 static const uint16_t table1_5_inner_[4]; 262 static const uint8_t table1_5_outer_[64]; 263 static const uint16_t table1_11_inner_[6]; 264 static const uint8_t table1_11_outer_[64]; 265 static const uint16_t table1_12_inner_[8]; 266 static const uint8_t table1_12_outer_[64]; 267 static const uint8_t table1_15_emit_[15]; 268 static const uint16_t table1_15_inner_[18]; 269 static const uint8_t table1_15_outer_[64]; 270 static const uint8_t* const table1_emit_[16]; 271 static const uint16_t* const table1_inner_[16]; 272 static const uint8_t* const table1_outer_[16]; 273 static const uint8_t table9_0_emit_[6]; 274 static const uint8_t table9_0_inner_[8]; 275 static const uint8_t table10_0_emit_[8]; 276 static const uint8_t table10_0_inner_[10]; 277 static const uint8_t table10_0_outer_[16]; 278 static const uint8_t table11_0_emit_[11]; 279 static const uint8_t table11_0_ops_[32]; 280 static const uint8_t table12_0_ops_[64]; 281 static const uint8_t table13_0_ops_[128]; 282 static const uint8_t table14_0_emit_[40]; 283 static const uint8_t table14_0_ops_[64]; 284 static const uint8_t table14_1_emit_[40]; 285 static const uint8_t table14_2_emit_[40]; 286 static const uint8_t table14_3_emit_[5]; 287 static const uint8_t table14_3_ops_[64]; 288 static const uint8_t* const table14_emit_[4]; 289 static const uint8_t* const table14_ops_[4]; 290 static const uint8_t table15_0_emit_[72]; 291 static const uint16_t table15_0_ops_[64]; 292 static const uint8_t table15_1_emit_[72]; 293 static const uint8_t table15_2_emit_[72]; 294 static const uint8_t table15_3_emit_[72]; 295 static const uint8_t table15_4_emit_[72]; 296 static const uint8_t table15_5_emit_[72]; 297 static const uint8_t table15_6_emit_[40]; 298 static const uint16_t table15_6_ops_[64]; 299 static const uint8_t table15_7_emit_[6]; 300 static const uint16_t table15_7_ops_[64]; 301 static const uint8_t* const table15_emit_[8]; 302 static const uint16_t* const table15_ops_[8]; 303 static const uint8_t table16_0_emit_[44]; 304 static const uint16_t table16_0_ops_[64]; 305 static const uint8_t table16_1_emit_[92]; 306 static const uint16_t table16_1_ops_[64]; 307 static const uint8_t table16_2_emit_[44]; 308 static const uint8_t table16_3_emit_[92]; 309 static const uint8_t table16_4_emit_[44]; 310 static const uint8_t table16_5_emit_[92]; 311 static const uint8_t table16_6_emit_[44]; 312 static const uint8_t table16_7_emit_[92]; 313 static const uint8_t table16_8_emit_[44]; 314 static const uint8_t table16_9_emit_[92]; 315 static const uint8_t table16_10_emit_[44]; 316 static const uint8_t table16_11_emit_[92]; 317 static const uint8_t table16_12_emit_[72]; 318 static const uint8_t table16_13_emit_[72]; 319 static const uint8_t table16_14_emit_[40]; 320 static const uint8_t table16_15_emit_[31]; 321 static const uint16_t table16_15_ops_[64]; 322 static const uint8_t* const table16_emit_[16]; 323 static const uint16_t* const table16_ops_[16]; 324 static const uint8_t table17_0_emit_[16]; 325 static const uint16_t table17_0_ops_[64]; 326 static const uint8_t table17_1_emit_[28]; 327 static const uint16_t table17_1_ops_[64]; 328 static const uint8_t table17_2_emit_[36]; 329 static const uint16_t table17_2_ops_[64]; 330 static const uint8_t table17_3_emit_[68]; 331 static const uint16_t table17_3_ops_[64]; 332 static const uint8_t table17_4_emit_[16]; 333 static const uint8_t table17_5_emit_[28]; 334 static const uint8_t table17_6_emit_[36]; 335 static const uint8_t table17_7_emit_[68]; 336 static const uint8_t table17_8_emit_[16]; 337 static const uint8_t table17_9_emit_[28]; 338 static const uint8_t table17_10_emit_[36]; 339 static const uint8_t table17_11_emit_[68]; 340 static const uint8_t table17_12_emit_[16]; 341 static const uint8_t table17_13_emit_[28]; 342 static const uint8_t table17_14_emit_[36]; 343 static const uint8_t table17_15_emit_[68]; 344 static const uint8_t table17_16_emit_[16]; 345 static const uint8_t table17_17_emit_[28]; 346 static const uint8_t table17_18_emit_[36]; 347 static const uint8_t table17_19_emit_[68]; 348 static const uint8_t table17_20_emit_[16]; 349 static const uint8_t table17_21_emit_[28]; 350 static const uint8_t table17_22_emit_[36]; 351 static const uint8_t table17_23_emit_[68]; 352 static const uint8_t table17_24_emit_[44]; 353 static const uint8_t table17_25_emit_[92]; 354 static const uint8_t table17_26_emit_[44]; 355 static const uint8_t table17_27_emit_[92]; 356 static const uint8_t table17_28_emit_[72]; 357 static const uint8_t table17_29_emit_[72]; 358 static const uint8_t table17_30_emit_[72]; 359 static const uint8_t table17_31_emit_[24]; 360 static const uint16_t table17_31_ops_[64]; 361 static const uint8_t* const table17_emit_[32]; 362 static const uint16_t* const table17_ops_[32]; 363 static const uint16_t table18_0_ops_[128]; 364 static const uint16_t table18_1_ops_[128]; 365 static const uint16_t table18_2_ops_[128]; 366 static const uint16_t table18_3_ops_[128]; 367 static const uint16_t table18_24_ops_[128]; 368 static const uint8_t table18_25_emit_[104]; 369 static const uint16_t table18_25_ops_[128]; 370 static const uint8_t table18_27_emit_[104]; 371 static const uint8_t table18_28_emit_[136]; 372 static const uint16_t table18_28_ops_[128]; 373 static const uint8_t table18_29_emit_[136]; 374 static const uint8_t table18_30_emit_[136]; 375 static const uint8_t table18_31_emit_[50]; 376 static const uint16_t table18_31_ops_[128]; 377 static const uint8_t* const table18_emit_[32]; 378 static const uint16_t* const table18_ops_[32]; 379 static const uint8_t table19_0_emit_[120]; 380 static const uint16_t table19_0_ops_[128]; 381 static const uint8_t table19_1_emit_[120]; 382 static const uint8_t table19_2_emit_[68]; 383 static const uint16_t table19_2_ops_[128]; 384 static const uint8_t table19_3_emit_[16]; 385 static const uint16_t table19_3_ops_[128]; 386 static const uint8_t table19_4_emit_[16]; 387 static const uint8_t table19_5_emit_[20]; 388 static const uint16_t table19_5_ops_[128]; 389 static const uint8_t table19_6_emit_[32]; 390 static const uint16_t table19_6_ops_[128]; 391 static const uint8_t table19_7_emit_[46]; 392 static const uint16_t table19_7_ops_[128]; 393 static const uint8_t table19_8_emit_[120]; 394 static const uint8_t table19_9_emit_[120]; 395 static const uint8_t table19_10_emit_[68]; 396 static const uint8_t table19_11_emit_[16]; 397 static const uint8_t table19_12_emit_[16]; 398 static const uint8_t table19_13_emit_[20]; 399 static const uint8_t table19_14_emit_[32]; 400 static const uint8_t table19_15_emit_[46]; 401 static const uint8_t table19_16_emit_[120]; 402 static const uint8_t table19_17_emit_[120]; 403 static const uint8_t table19_18_emit_[68]; 404 static const uint8_t table19_19_emit_[16]; 405 static const uint8_t table19_20_emit_[16]; 406 static const uint8_t table19_21_emit_[20]; 407 static const uint8_t table19_22_emit_[32]; 408 static const uint8_t table19_23_emit_[46]; 409 static const uint8_t table19_24_emit_[120]; 410 static const uint8_t table19_25_emit_[120]; 411 static const uint8_t table19_26_emit_[68]; 412 static const uint8_t table19_27_emit_[16]; 413 static const uint8_t table19_28_emit_[16]; 414 static const uint8_t table19_29_emit_[20]; 415 static const uint8_t table19_30_emit_[32]; 416 static const uint8_t table19_31_emit_[46]; 417 static const uint8_t table19_32_emit_[120]; 418 static const uint8_t table19_33_emit_[120]; 419 static const uint8_t table19_34_emit_[68]; 420 static const uint8_t table19_35_emit_[16]; 421 static const uint8_t table19_36_emit_[16]; 422 static const uint8_t table19_37_emit_[20]; 423 static const uint8_t table19_38_emit_[32]; 424 static const uint8_t table19_39_emit_[46]; 425 static const uint8_t table19_40_emit_[120]; 426 static const uint8_t table19_41_emit_[120]; 427 static const uint8_t table19_42_emit_[68]; 428 static const uint8_t table19_43_emit_[16]; 429 static const uint8_t table19_44_emit_[16]; 430 static const uint8_t table19_45_emit_[20]; 431 static const uint8_t table19_46_emit_[32]; 432 static const uint8_t table19_47_emit_[46]; 433 static const uint8_t table19_48_emit_[16]; 434 static const uint8_t table19_49_emit_[28]; 435 static const uint16_t table19_49_ops_[128]; 436 static const uint8_t table19_50_emit_[36]; 437 static const uint16_t table19_50_ops_[128]; 438 static const uint8_t table19_51_emit_[68]; 439 static const uint16_t table19_51_ops_[128]; 440 static const uint8_t table19_52_emit_[16]; 441 static const uint8_t table19_53_emit_[28]; 442 static const uint8_t table19_54_emit_[36]; 443 static const uint8_t table19_55_emit_[68]; 444 static const uint8_t table19_56_emit_[44]; 445 static const uint16_t table19_56_ops_[128]; 446 static const uint8_t table19_57_emit_[104]; 447 static const uint16_t table19_57_ops_[128]; 448 static const uint8_t table19_58_emit_[44]; 449 static const uint8_t table19_59_emit_[104]; 450 static const uint8_t table19_60_emit_[44]; 451 static const uint8_t table19_61_emit_[104]; 452 static const uint8_t table19_62_emit_[15]; 453 static const uint16_t table19_62_ops_[128]; 454 static const uint8_t table19_63_emit_[64]; 455 static const uint16_t table19_63_ops_[128]; 456 static const uint8_t* const table19_emit_[64]; 457 static const uint16_t* const table19_ops_[64]; 458 static const uint8_t table8_0_emit_[1]; 459 static const uint16_t table8_0_ops_[512]; 460 static const uint8_t table8_4_emit_[1]; 461 static const uint8_t table8_8_emit_[1]; 462 static const uint8_t table8_12_emit_[1]; 463 static const uint8_t table8_16_emit_[1]; 464 static const uint8_t table8_20_emit_[1]; 465 static const uint8_t table8_24_emit_[1]; 466 static const uint16_t table8_24_ops_[512]; 467 static const uint8_t table8_26_emit_[1]; 468 static const uint8_t table8_28_emit_[1]; 469 static const uint16_t table8_28_ops_[512]; 470 static const uint8_t table8_29_emit_[1]; 471 static const uint8_t table8_30_emit_[1]; 472 static const uint8_t table8_31_emit_[91]; 473 static const uint16_t table8_31_ops_[512]; 474 static const uint8_t* const table8_emit_[32]; 475 static const uint16_t* const table8_ops_[32]; 476 static const uint8_t table25_0_emit_[8]; 477 static const uint8_t table25_0_inner_[8]; 478 static const uint8_t table27_0_emit_[15]; 479 static const uint8_t table27_0_inner_[15]; 480 static const uint8_t table29_0_emit_[5]; 481 static const uint8_t table29_0_inner_[5]; 482 static const uint8_t table32_0_emit_[15]; 483 static const uint8_t table32_0_inner_[16]; 484 static const uint8_t table33_0_ops_[32]; 485 static const uint8_t table31_0_emit_[8]; 486 static const uint8_t table31_0_ops_[32]; 487 static const uint8_t table31_1_emit_[10]; 488 static const uint8_t table31_1_ops_[32]; 489 static const uint8_t* const table31_emit_[2]; 490 static const uint8_t* const table31_ops_[2]; 491 }; 492 template <typename F> 493 class HuffDecoder : public HuffDecoderCommon { 494 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)495 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 496 : sink_(sink), begin_(begin), end_(end) {} Run()497 bool Run() { 498 while (!done_) { 499 if (!RefillTo10()) { 500 Done0(); 501 break; 502 } 503 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 504 const auto op = GetOp1(index); 505 const int consumed = op & 15; 506 buffer_len_ -= consumed; 507 const auto emit_ofs = op >> 7; 508 switch ((op >> 4) & 7) { 509 case 0: { 510 sink_(GetEmit1(index, emit_ofs + 0)); 511 sink_(GetEmit1(index, emit_ofs + 1)); 512 break; 513 } 514 case 1: { 515 sink_(GetEmit1(index, emit_ofs + 0)); 516 break; 517 } 518 case 2: { 519 DecodeStep0(); 520 break; 521 } 522 case 3: { 523 DecodeStep12(); 524 break; 525 } 526 case 4: { 527 DecodeStep1(); 528 break; 529 } 530 } 531 } 532 return ok_; 533 } 534 535 private: RefillTo10()536 bool RefillTo10() { 537 switch (buffer_len_) { 538 case 0: { 539 return Read2to8Bytes(); 540 } 541 case 1: { 542 return Read2to7Bytes(); 543 } 544 case 2: 545 case 3: 546 case 4: 547 case 5: 548 case 6: 549 case 7: 550 case 8: { 551 return Read1to7Bytes(); 552 } 553 case 9: { 554 return Read1to6Bytes(); 555 } 556 } 557 return true; 558 } Read2to8Bytes()559 bool Read2to8Bytes() { 560 switch (end_ - begin_) { 561 case 0: 562 case 1: { 563 return false; 564 } 565 case 2: { 566 Fill2(); 567 return true; 568 } 569 case 3: { 570 Fill3(); 571 return true; 572 } 573 case 4: { 574 Fill4(); 575 return true; 576 } 577 case 5: { 578 Fill5(); 579 return true; 580 } 581 case 6: { 582 Fill6(); 583 return true; 584 } 585 case 7: { 586 Fill7(); 587 return true; 588 } 589 default: { 590 Fill8(); 591 return true; 592 } 593 } 594 } Fill2()595 void Fill2() { 596 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 597 (static_cast<uint64_t>(begin_[1]) << 0); 598 begin_ += 2; 599 buffer_len_ += 16; 600 } Fill3()601 void Fill3() { 602 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 603 (static_cast<uint64_t>(begin_[1]) << 8) | 604 (static_cast<uint64_t>(begin_[2]) << 0); 605 begin_ += 3; 606 buffer_len_ += 24; 607 } Fill4()608 void Fill4() { 609 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 610 (static_cast<uint64_t>(begin_[1]) << 16) | 611 (static_cast<uint64_t>(begin_[2]) << 8) | 612 (static_cast<uint64_t>(begin_[3]) << 0); 613 begin_ += 4; 614 buffer_len_ += 32; 615 } Fill5()616 void Fill5() { 617 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 618 (static_cast<uint64_t>(begin_[1]) << 24) | 619 (static_cast<uint64_t>(begin_[2]) << 16) | 620 (static_cast<uint64_t>(begin_[3]) << 8) | 621 (static_cast<uint64_t>(begin_[4]) << 0); 622 begin_ += 5; 623 buffer_len_ += 40; 624 } Fill6()625 void Fill6() { 626 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 627 (static_cast<uint64_t>(begin_[1]) << 32) | 628 (static_cast<uint64_t>(begin_[2]) << 24) | 629 (static_cast<uint64_t>(begin_[3]) << 16) | 630 (static_cast<uint64_t>(begin_[4]) << 8) | 631 (static_cast<uint64_t>(begin_[5]) << 0); 632 begin_ += 6; 633 buffer_len_ += 48; 634 } Fill7()635 void Fill7() { 636 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 637 (static_cast<uint64_t>(begin_[1]) << 40) | 638 (static_cast<uint64_t>(begin_[2]) << 32) | 639 (static_cast<uint64_t>(begin_[3]) << 24) | 640 (static_cast<uint64_t>(begin_[4]) << 16) | 641 (static_cast<uint64_t>(begin_[5]) << 8) | 642 (static_cast<uint64_t>(begin_[6]) << 0); 643 begin_ += 7; 644 buffer_len_ += 56; 645 } Fill8()646 void Fill8() { 647 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 648 (static_cast<uint64_t>(begin_[1]) << 48) | 649 (static_cast<uint64_t>(begin_[2]) << 40) | 650 (static_cast<uint64_t>(begin_[3]) << 32) | 651 (static_cast<uint64_t>(begin_[4]) << 24) | 652 (static_cast<uint64_t>(begin_[5]) << 16) | 653 (static_cast<uint64_t>(begin_[6]) << 8) | 654 (static_cast<uint64_t>(begin_[7]) << 0); 655 begin_ += 8; 656 buffer_len_ += 64; 657 } Read2to7Bytes()658 bool Read2to7Bytes() { 659 switch (end_ - begin_) { 660 case 0: 661 case 1: { 662 return false; 663 } 664 case 2: { 665 Fill2(); 666 return true; 667 } 668 case 3: { 669 Fill3(); 670 return true; 671 } 672 case 4: { 673 Fill4(); 674 return true; 675 } 676 case 5: { 677 Fill5(); 678 return true; 679 } 680 case 6: { 681 Fill6(); 682 return true; 683 } 684 default: { 685 Fill7(); 686 return true; 687 } 688 } 689 } Read1to7Bytes()690 bool Read1to7Bytes() { 691 switch (end_ - begin_) { 692 case 0: { 693 return false; 694 } 695 case 1: { 696 Fill1(); 697 return true; 698 } 699 case 2: { 700 Fill2(); 701 return true; 702 } 703 case 3: { 704 Fill3(); 705 return true; 706 } 707 case 4: { 708 Fill4(); 709 return true; 710 } 711 case 5: { 712 Fill5(); 713 return true; 714 } 715 case 6: { 716 Fill6(); 717 return true; 718 } 719 default: { 720 Fill7(); 721 return true; 722 } 723 } 724 } Fill1()725 void Fill1() { 726 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 727 begin_ += 1; 728 buffer_len_ += 8; 729 } Read1to6Bytes()730 bool Read1to6Bytes() { 731 switch (end_ - begin_) { 732 case 0: { 733 return false; 734 } 735 case 1: { 736 Fill1(); 737 return true; 738 } 739 case 2: { 740 Fill2(); 741 return true; 742 } 743 case 3: { 744 Fill3(); 745 return true; 746 } 747 case 4: { 748 Fill4(); 749 return true; 750 } 751 case 5: { 752 Fill5(); 753 return true; 754 } 755 default: { 756 Fill6(); 757 return true; 758 } 759 } 760 } Done0()761 void Done0() { 762 done_ = true; 763 switch (end_ - begin_) { 764 case 1: { 765 Fill1(); 766 break; 767 } 768 } 769 switch (buffer_len_) { 770 case 1: 771 case 2: 772 case 3: 773 case 4: { 774 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 775 return; 776 } 777 case 5: { 778 const auto index = buffer_ & 31; 779 const auto op = GetOp2(index); 780 switch (op & 3) { 781 case 0: { 782 sink_(GetEmit2(index, (op >> 2) + 0)); 783 break; 784 } 785 case 1: { 786 ok_ = false; 787 break; 788 } 789 } 790 return; 791 } 792 case 6: { 793 const auto index = buffer_ & 63; 794 const auto op = GetOp3(index); 795 switch (op & 3) { 796 case 0: { 797 ok_ = false; 798 break; 799 } 800 case 1: { 801 sink_(GetEmit3(index, (op >> 2) + 0)); 802 break; 803 } 804 } 805 return; 806 } 807 case 7: { 808 const auto index = buffer_ & 127; 809 const auto op = GetOp4(index); 810 switch (op & 3) { 811 case 0: { 812 ok_ = false; 813 break; 814 } 815 case 1: { 816 sink_(GetEmit4(index, (op >> 2) + 0)); 817 break; 818 } 819 } 820 return; 821 } 822 case 8: { 823 const auto index = buffer_ & 255; 824 const auto op = GetOp5(index); 825 switch (op & 3) { 826 case 0: { 827 ok_ = false; 828 break; 829 } 830 case 1: { 831 sink_(GetEmit5(index, (op >> 2) + 0)); 832 break; 833 } 834 } 835 return; 836 } 837 case 9: { 838 const auto index = buffer_ & 511; 839 const auto op = GetOp6(index); 840 switch (op & 3) { 841 case 0: { 842 ok_ = false; 843 break; 844 } 845 case 1: { 846 sink_(GetEmit6(index, (op >> 2) + 0)); 847 break; 848 } 849 } 850 return; 851 } 852 case 0: { 853 return; 854 } 855 } 856 } DecodeStep0()857 void DecodeStep0() { 858 if (!RefillTo1()) { 859 Done1(); 860 return; 861 } 862 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 863 const auto op = GetOp7(index); 864 const int consumed = op & 1; 865 buffer_len_ -= consumed; 866 const auto emit_ofs = op >> 1; 867 sink_(GetEmit7(index, emit_ofs + 0)); 868 } RefillTo1()869 bool RefillTo1() { 870 switch (buffer_len_) { 871 case 0: { 872 return Read1to8Bytes(); 873 } 874 } 875 return true; 876 } Read1to8Bytes()877 bool Read1to8Bytes() { 878 switch (end_ - begin_) { 879 case 0: { 880 return false; 881 } 882 case 1: { 883 Fill1(); 884 return true; 885 } 886 case 2: { 887 Fill2(); 888 return true; 889 } 890 case 3: { 891 Fill3(); 892 return true; 893 } 894 case 4: { 895 Fill4(); 896 return true; 897 } 898 case 5: { 899 Fill5(); 900 return true; 901 } 902 case 6: { 903 Fill6(); 904 return true; 905 } 906 case 7: { 907 Fill7(); 908 return true; 909 } 910 default: { 911 Fill8(); 912 return true; 913 } 914 } 915 } Done1()916 void Done1() { 917 done_ = true; 918 ok_ = false; 919 } DecodeStep1()920 void DecodeStep1() { 921 if (!RefillTo14()) { 922 Done2(); 923 return; 924 } 925 const auto index = (buffer_ >> (buffer_len_ - 14)) & 0x3fff; 926 const auto op = GetOp8(index); 927 const int consumed = op & 15; 928 buffer_len_ -= consumed; 929 const auto emit_ofs = op >> 8; 930 switch ((op >> 4) & 15) { 931 case 0: { 932 sink_(GetEmit8(index, emit_ofs + 0)); 933 break; 934 } 935 case 1: { 936 DecodeStep2(); 937 break; 938 } 939 case 2: { 940 DecodeStep3(); 941 break; 942 } 943 case 3: { 944 DecodeStep4(); 945 break; 946 } 947 case 4: { 948 DecodeStep5(); 949 break; 950 } 951 case 5: { 952 DecodeStep6(); 953 break; 954 } 955 case 6: { 956 DecodeStep10(); 957 break; 958 } 959 case 7: { 960 DecodeStep7(); 961 break; 962 } 963 case 8: { 964 DecodeStep8(); 965 break; 966 } 967 case 9: { 968 DecodeStep9(); 969 break; 970 } 971 case 10: { 972 DecodeStep11(); 973 break; 974 } 975 } 976 } RefillTo14()977 bool RefillTo14() { 978 switch (buffer_len_) { 979 case 0: { 980 return Read2to8Bytes(); 981 } 982 case 1: 983 case 2: 984 case 3: 985 case 4: 986 case 5: { 987 return Read2to7Bytes(); 988 } 989 case 6: 990 case 7: 991 case 8: { 992 return Read1to7Bytes(); 993 } 994 case 9: 995 case 10: 996 case 11: 997 case 12: 998 case 13: { 999 return Read1to6Bytes(); 1000 } 1001 } 1002 return true; 1003 } Done2()1004 void Done2() { 1005 done_ = true; 1006 switch (end_ - begin_) { 1007 case 1: { 1008 Fill1(); 1009 break; 1010 } 1011 } 1012 switch (buffer_len_) { 1013 case 1: 1014 case 2: { 1015 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1016 return; 1017 } 1018 case 3: { 1019 const auto index = buffer_ & 7; 1020 const auto op = GetOp9(index); 1021 switch (op & 3) { 1022 case 0: { 1023 sink_(GetEmit9(index, (op >> 2) + 0)); 1024 break; 1025 } 1026 case 1: { 1027 ok_ = false; 1028 break; 1029 } 1030 } 1031 return; 1032 } 1033 case 4: { 1034 const auto index = buffer_ & 15; 1035 const auto op = GetOp10(index); 1036 switch (op & 3) { 1037 case 0: { 1038 ok_ = false; 1039 break; 1040 } 1041 case 1: { 1042 sink_(GetEmit10(index, (op >> 2) + 0)); 1043 break; 1044 } 1045 } 1046 return; 1047 } 1048 case 5: { 1049 const auto index = buffer_ & 31; 1050 const auto op = GetOp11(index); 1051 switch (op & 3) { 1052 case 0: { 1053 ok_ = false; 1054 break; 1055 } 1056 case 1: { 1057 sink_(GetEmit11(index, (op >> 2) + 0)); 1058 break; 1059 } 1060 } 1061 return; 1062 } 1063 case 6: { 1064 const auto index = buffer_ & 63; 1065 const auto op = GetOp12(index); 1066 switch (op & 3) { 1067 case 0: { 1068 ok_ = false; 1069 break; 1070 } 1071 case 1: { 1072 sink_(GetEmit12(index, (op >> 2) + 0)); 1073 break; 1074 } 1075 } 1076 return; 1077 } 1078 case 7: { 1079 const auto index = buffer_ & 127; 1080 const auto op = GetOp13(index); 1081 switch (op & 3) { 1082 case 0: { 1083 ok_ = false; 1084 break; 1085 } 1086 case 1: { 1087 sink_(GetEmit13(index, (op >> 2) + 0)); 1088 break; 1089 } 1090 } 1091 return; 1092 } 1093 case 8: { 1094 const auto index = buffer_ & 255; 1095 const auto op = GetOp14(index); 1096 switch (op & 3) { 1097 case 0: { 1098 sink_(GetEmit14(index, (op >> 2) + 0)); 1099 sink_(GetEmit14(index, (op >> 2) + 1)); 1100 break; 1101 } 1102 case 1: { 1103 ok_ = false; 1104 break; 1105 } 1106 case 2: { 1107 sink_(GetEmit14(index, (op >> 2) + 0)); 1108 break; 1109 } 1110 } 1111 return; 1112 } 1113 case 9: { 1114 const auto index = buffer_ & 511; 1115 const auto op = GetOp15(index); 1116 switch (op & 3) { 1117 case 0: { 1118 ok_ = false; 1119 break; 1120 } 1121 case 1: { 1122 sink_(GetEmit15(index, (op >> 2) + 0)); 1123 sink_(GetEmit15(index, (op >> 2) + 1)); 1124 break; 1125 } 1126 case 2: { 1127 sink_(GetEmit15(index, (op >> 2) + 0)); 1128 break; 1129 } 1130 } 1131 return; 1132 } 1133 case 10: { 1134 const auto index = buffer_ & 1023; 1135 const auto op = GetOp16(index); 1136 switch (op & 3) { 1137 case 0: { 1138 ok_ = false; 1139 break; 1140 } 1141 case 1: { 1142 sink_(GetEmit16(index, (op >> 2) + 0)); 1143 sink_(GetEmit16(index, (op >> 2) + 1)); 1144 break; 1145 } 1146 case 2: { 1147 sink_(GetEmit16(index, (op >> 2) + 0)); 1148 break; 1149 } 1150 } 1151 return; 1152 } 1153 case 11: { 1154 const auto index = buffer_ & 2047; 1155 const auto op = GetOp17(index); 1156 switch (op & 3) { 1157 case 0: { 1158 ok_ = false; 1159 break; 1160 } 1161 case 1: { 1162 sink_(GetEmit17(index, (op >> 2) + 0)); 1163 sink_(GetEmit17(index, (op >> 2) + 1)); 1164 break; 1165 } 1166 case 2: { 1167 sink_(GetEmit17(index, (op >> 2) + 0)); 1168 break; 1169 } 1170 } 1171 return; 1172 } 1173 case 12: { 1174 const auto index = buffer_ & 4095; 1175 const auto op = GetOp18(index); 1176 switch (op & 3) { 1177 case 0: { 1178 ok_ = false; 1179 break; 1180 } 1181 case 1: { 1182 sink_(GetEmit18(index, (op >> 2) + 0)); 1183 sink_(GetEmit18(index, (op >> 2) + 1)); 1184 break; 1185 } 1186 case 2: { 1187 sink_(GetEmit18(index, (op >> 2) + 0)); 1188 break; 1189 } 1190 } 1191 return; 1192 } 1193 case 13: { 1194 const auto index = buffer_ & 8191; 1195 const auto op = GetOp19(index); 1196 switch (op & 7) { 1197 case 0: { 1198 sink_(GetEmit19(index, (op >> 3) + 0)); 1199 sink_(GetEmit19(index, (op >> 3) + 1)); 1200 sink_(GetEmit19(index, (op >> 3) + 2)); 1201 break; 1202 } 1203 case 1: { 1204 ok_ = false; 1205 break; 1206 } 1207 case 2: { 1208 sink_(GetEmit19(index, (op >> 3) + 0)); 1209 sink_(GetEmit19(index, (op >> 3) + 1)); 1210 break; 1211 } 1212 case 3: { 1213 sink_(GetEmit19(index, (op >> 3) + 0)); 1214 break; 1215 } 1216 } 1217 return; 1218 } 1219 case 0: { 1220 return; 1221 } 1222 } 1223 } DecodeStep2()1224 void DecodeStep2() { 1225 if (!RefillTo1()) { 1226 Done3(); 1227 return; 1228 } 1229 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1230 const auto op = GetOp20(index); 1231 const int consumed = op & 1; 1232 buffer_len_ -= consumed; 1233 const auto emit_ofs = op >> 1; 1234 sink_(GetEmit20(index, emit_ofs + 0)); 1235 } Done3()1236 void Done3() { 1237 done_ = true; 1238 ok_ = false; 1239 } DecodeStep3()1240 void DecodeStep3() { 1241 if (!RefillTo1()) { 1242 Done4(); 1243 return; 1244 } 1245 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1246 const auto op = GetOp21(index); 1247 const int consumed = op & 1; 1248 buffer_len_ -= consumed; 1249 const auto emit_ofs = op >> 1; 1250 sink_(GetEmit21(index, emit_ofs + 0)); 1251 } Done4()1252 void Done4() { 1253 done_ = true; 1254 ok_ = false; 1255 } DecodeStep4()1256 void DecodeStep4() { 1257 if (!RefillTo2()) { 1258 Done5(); 1259 return; 1260 } 1261 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1262 const auto op = GetOp22(index); 1263 const int consumed = op & 3; 1264 buffer_len_ -= consumed; 1265 const auto emit_ofs = op >> 2; 1266 sink_(GetEmit22(index, emit_ofs + 0)); 1267 } RefillTo2()1268 bool RefillTo2() { 1269 switch (buffer_len_) { 1270 case 0: { 1271 return Read1to8Bytes(); 1272 } 1273 case 1: { 1274 return Read1to7Bytes(); 1275 } 1276 } 1277 return true; 1278 } Done5()1279 void Done5() { 1280 done_ = true; 1281 switch (buffer_len_) { 1282 case 1: 1283 case 0: { 1284 ok_ = false; 1285 return; 1286 } 1287 } 1288 } DecodeStep5()1289 void DecodeStep5() { 1290 if (!RefillTo2()) { 1291 Done6(); 1292 return; 1293 } 1294 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1295 const auto op = GetOp23(index); 1296 const int consumed = op & 3; 1297 buffer_len_ -= consumed; 1298 const auto emit_ofs = op >> 2; 1299 sink_(GetEmit23(index, emit_ofs + 0)); 1300 } Done6()1301 void Done6() { 1302 done_ = true; 1303 switch (buffer_len_) { 1304 case 1: 1305 case 0: { 1306 ok_ = false; 1307 return; 1308 } 1309 } 1310 } DecodeStep6()1311 void DecodeStep6() { 1312 if (!RefillTo2()) { 1313 Done7(); 1314 return; 1315 } 1316 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1317 const auto op = GetOp24(index); 1318 const int consumed = op & 3; 1319 buffer_len_ -= consumed; 1320 const auto emit_ofs = op >> 2; 1321 sink_(GetEmit24(index, emit_ofs + 0)); 1322 } Done7()1323 void Done7() { 1324 done_ = true; 1325 switch (buffer_len_) { 1326 case 1: 1327 case 0: { 1328 ok_ = false; 1329 return; 1330 } 1331 } 1332 } DecodeStep7()1333 void DecodeStep7() { 1334 if (!RefillTo3()) { 1335 Done8(); 1336 return; 1337 } 1338 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1339 const auto op = GetOp25(index); 1340 const int consumed = op & 3; 1341 buffer_len_ -= consumed; 1342 const auto emit_ofs = op >> 2; 1343 sink_(GetEmit25(index, emit_ofs + 0)); 1344 } RefillTo3()1345 bool RefillTo3() { 1346 switch (buffer_len_) { 1347 case 0: { 1348 return Read1to8Bytes(); 1349 } 1350 case 1: 1351 case 2: { 1352 return Read1to7Bytes(); 1353 } 1354 } 1355 return true; 1356 } Done8()1357 void Done8() { 1358 done_ = true; 1359 switch (buffer_len_) { 1360 case 1: 1361 case 2: 1362 case 0: { 1363 ok_ = false; 1364 return; 1365 } 1366 } 1367 } DecodeStep8()1368 void DecodeStep8() { 1369 if (!RefillTo3()) { 1370 Done9(); 1371 return; 1372 } 1373 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1374 const auto op = GetOp26(index); 1375 const int consumed = op & 3; 1376 buffer_len_ -= consumed; 1377 const auto emit_ofs = op >> 2; 1378 sink_(GetEmit26(index, emit_ofs + 0)); 1379 } Done9()1380 void Done9() { 1381 done_ = true; 1382 switch (buffer_len_) { 1383 case 1: 1384 case 2: 1385 case 0: { 1386 ok_ = false; 1387 return; 1388 } 1389 } 1390 } DecodeStep9()1391 void DecodeStep9() { 1392 if (!RefillTo4()) { 1393 Done10(); 1394 return; 1395 } 1396 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1397 const auto op = GetOp27(index); 1398 const int consumed = op & 7; 1399 buffer_len_ -= consumed; 1400 const auto emit_ofs = op >> 3; 1401 sink_(GetEmit27(index, emit_ofs + 0)); 1402 } RefillTo4()1403 bool RefillTo4() { 1404 switch (buffer_len_) { 1405 case 0: { 1406 return Read1to8Bytes(); 1407 } 1408 case 1: 1409 case 2: 1410 case 3: { 1411 return Read1to7Bytes(); 1412 } 1413 } 1414 return true; 1415 } Done10()1416 void Done10() { 1417 done_ = true; 1418 switch (buffer_len_) { 1419 case 1: 1420 case 2: 1421 case 0: { 1422 ok_ = false; 1423 return; 1424 } 1425 case 3: { 1426 const auto index = buffer_ & 7; 1427 const auto op = GetOp28(index); 1428 switch (op & 1) { 1429 case 0: { 1430 sink_(GetEmit28(index, (op >> 1) + 0)); 1431 break; 1432 } 1433 case 1: { 1434 ok_ = false; 1435 break; 1436 } 1437 } 1438 return; 1439 } 1440 } 1441 } DecodeStep10()1442 void DecodeStep10() { 1443 if (!RefillTo3()) { 1444 Done11(); 1445 return; 1446 } 1447 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1448 const auto op = GetOp29(index); 1449 const int consumed = op & 3; 1450 buffer_len_ -= consumed; 1451 const auto emit_ofs = op >> 2; 1452 sink_(GetEmit29(index, emit_ofs + 0)); 1453 } Done11()1454 void Done11() { 1455 done_ = true; 1456 switch (buffer_len_) { 1457 case 1: 1458 case 0: { 1459 ok_ = false; 1460 return; 1461 } 1462 case 2: { 1463 const auto index = buffer_ & 3; 1464 const auto op = GetOp30(index); 1465 switch (op & 1) { 1466 case 0: { 1467 sink_(GetEmit30(index, (op >> 1) + 0)); 1468 break; 1469 } 1470 case 1: { 1471 ok_ = false; 1472 break; 1473 } 1474 } 1475 return; 1476 } 1477 } 1478 } DecodeStep11()1479 void DecodeStep11() { 1480 if (!RefillTo6()) { 1481 Done12(); 1482 return; 1483 } 1484 const auto index = (buffer_ >> (buffer_len_ - 6)) & 0x3f; 1485 const auto op = GetOp31(index); 1486 const int consumed = op & 7; 1487 buffer_len_ -= consumed; 1488 const auto emit_ofs = op >> 4; 1489 switch ((op >> 3) & 1) { 1490 case 0: { 1491 sink_(GetEmit31(index, emit_ofs + 0)); 1492 break; 1493 } 1494 case 1: { 1495 begin_ = end_; 1496 buffer_len_ = 0; 1497 break; 1498 } 1499 } 1500 } RefillTo6()1501 bool RefillTo6() { 1502 switch (buffer_len_) { 1503 case 0: { 1504 return Read1to8Bytes(); 1505 } 1506 case 1: 1507 case 2: 1508 case 3: 1509 case 4: 1510 case 5: { 1511 return Read1to7Bytes(); 1512 } 1513 } 1514 return true; 1515 } Done12()1516 void Done12() { 1517 done_ = true; 1518 switch (buffer_len_) { 1519 case 1: 1520 case 2: 1521 case 3: { 1522 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1523 return; 1524 } 1525 case 4: { 1526 const auto index = buffer_ & 15; 1527 const auto op = GetOp32(index); 1528 switch (op & 1) { 1529 case 0: { 1530 sink_(GetEmit32(index, (op >> 1) + 0)); 1531 break; 1532 } 1533 } 1534 return; 1535 } 1536 case 5: { 1537 const auto index = buffer_ & 31; 1538 const auto op = GetOp33(index); 1539 switch (op & 3) { 1540 case 0: { 1541 ok_ = false; 1542 break; 1543 } 1544 case 1: { 1545 sink_(GetEmit33(index, (op >> 2) + 0)); 1546 break; 1547 } 1548 } 1549 return; 1550 } 1551 case 0: { 1552 return; 1553 } 1554 } 1555 } DecodeStep12()1556 void DecodeStep12() { 1557 if (!RefillTo2()) { 1558 Done13(); 1559 return; 1560 } 1561 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1562 const auto op = GetOp34(index); 1563 const int consumed = op & 3; 1564 buffer_len_ -= consumed; 1565 const auto emit_ofs = op >> 2; 1566 sink_(GetEmit34(index, emit_ofs + 0)); 1567 } Done13()1568 void Done13() { 1569 done_ = true; 1570 switch (buffer_len_) { 1571 case 1: { 1572 const auto index = buffer_ & 1; 1573 const auto op = GetOp35(index); 1574 switch (op & 1) { 1575 case 0: { 1576 sink_(GetEmit35(index, (op >> 1) + 0)); 1577 break; 1578 } 1579 case 1: { 1580 ok_ = false; 1581 break; 1582 } 1583 } 1584 return; 1585 } 1586 case 0: { 1587 ok_ = false; 1588 return; 1589 } 1590 } 1591 } 1592 F sink_; 1593 const uint8_t* begin_; 1594 const uint8_t* const end_; 1595 uint64_t buffer_ = 0; 1596 int buffer_len_ = 0; 1597 bool ok_ = true; 1598 bool done_ = false; 1599 }; 1600 } // namespace geometry_10_14_6 1601 } // namespace grpc_core 1602 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_14_6_H 1603