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_7_13_10_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_13_10_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_7_13_10 { 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 } GetOp1(size_t i)36 static inline uint64_t GetOp1(size_t i) { 37 return table1_0_inner_[table1_0_outer_[i]]; 38 } GetEmit1(size_t,size_t emit)39 static inline uint64_t GetEmit1(size_t, size_t emit) { 40 return table1_0_emit_[emit]; 41 } GetOp4(size_t i)42 static inline uint64_t GetOp4(size_t i) { return i ? 3 : 1; } GetEmit4(size_t,size_t emit)43 static inline uint64_t GetEmit4(size_t, size_t emit) { 44 return emit ? 42 : 38; 45 } GetOp5(size_t i)46 static inline uint64_t GetOp5(size_t i) { return i ? 3 : 1; } GetEmit5(size_t,size_t emit)47 static inline uint64_t GetEmit5(size_t, size_t emit) { 48 return emit ? 59 : 44; 49 } GetOp6(size_t i)50 static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; } GetEmit6(size_t,size_t emit)51 static inline uint64_t GetEmit6(size_t, size_t emit) { 52 return emit ? 90 : 88; 53 } GetOp8(size_t i)54 static inline uint64_t GetOp8(size_t i) { 55 return table8_0_inner_[(i < 6 ? (i) : ((i - 6) + 5))]; 56 } GetEmit8(size_t,size_t emit)57 static inline uint64_t GetEmit8(size_t, size_t emit) { 58 return table8_0_emit_[emit]; 59 } GetOp9(size_t i)60 static inline uint64_t GetOp9(size_t i) { 61 return table9_0_inner_[table9_0_outer_[i]]; 62 } GetEmit9(size_t,size_t emit)63 static inline uint64_t GetEmit9(size_t, size_t emit) { 64 return table9_0_emit_[emit]; 65 } GetOp10(size_t i)66 static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; } GetEmit10(size_t,size_t emit)67 static inline uint64_t GetEmit10(size_t, size_t emit) { 68 return table10_0_emit_[emit]; 69 } GetOp11(size_t i)70 static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; } GetEmit11(size_t,size_t emit)71 static inline uint64_t GetEmit11(size_t, size_t emit) { 72 return table11_0_emit_[emit]; 73 } GetOp12(size_t i)74 static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; } GetEmit12(size_t,size_t emit)75 static inline uint64_t GetEmit12(size_t, size_t emit) { 76 return table12_0_emit_[emit]; 77 } GetOp13(size_t i)78 static inline uint64_t GetOp13(size_t i) { 79 return table13_ops_[i >> 6][i & 0x3f]; 80 } GetEmit13(size_t i,size_t emit)81 static inline uint64_t GetEmit13(size_t i, size_t emit) { 82 return table13_emit_[i >> 6][emit]; 83 } GetOp14(size_t i)84 static inline uint64_t GetOp14(size_t i) { 85 return table14_ops_[i >> 6][i & 0x3f]; 86 } GetEmit14(size_t i,size_t emit)87 static inline uint64_t GetEmit14(size_t i, size_t emit) { 88 return table14_emit_[i >> 6][emit]; 89 } GetOp15(size_t i)90 static inline uint64_t GetOp15(size_t i) { 91 return table15_ops_[i >> 6][i & 0x3f]; 92 } GetEmit15(size_t i,size_t emit)93 static inline uint64_t GetEmit15(size_t i, size_t emit) { 94 return table15_emit_[i >> 6][emit]; 95 } GetOp16(size_t i)96 static inline uint64_t GetOp16(size_t i) { 97 return table16_ops_[i >> 6][i & 0x3f]; 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 >> 6][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 } GetOp7(size_t i)108 static inline uint64_t GetOp7(size_t i) { 109 return table7_ops_[i >> 8][i & 0xff]; 110 } GetEmit7(size_t i,size_t emit)111 static inline uint64_t GetEmit7(size_t i, size_t emit) { 112 return table7_emit_[i >> 8][emit]; 113 } GetOp18(size_t i)114 static inline uint64_t GetOp18(size_t i) { return i ? 3 : 1; } GetEmit18(size_t,size_t emit)115 static inline uint64_t GetEmit18(size_t, size_t emit) { 116 return emit ? 161 : 153; 117 } GetOp19(size_t i)118 static inline uint64_t GetOp19(size_t i) { return i ? 3 : 1; } GetEmit19(size_t,size_t emit)119 static inline uint64_t GetEmit19(size_t, size_t emit) { 120 return emit ? 172 : 167; 121 } GetOp20(size_t i)122 static inline uint64_t GetOp20(size_t i) { return i ? 3 : 1; } GetEmit20(size_t,size_t emit)123 static inline uint64_t GetEmit20(size_t, size_t emit) { return emit + 176; } GetOp21(size_t i)124 static inline uint64_t GetOp21(size_t i) { return i ? 3 : 1; } GetEmit21(size_t,size_t emit)125 static inline uint64_t GetEmit21(size_t, size_t emit) { 126 return emit ? 209 : 179; 127 } GetOp22(size_t i)128 static inline uint64_t GetOp22(size_t i) { return i ? 3 : 1; } GetEmit22(size_t,size_t emit)129 static inline uint64_t GetEmit22(size_t, size_t emit) { return emit + 216; } GetOp23(size_t i)130 static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; } GetEmit23(size_t,size_t emit)131 static inline uint64_t GetEmit23(size_t, size_t emit) { 132 return emit ? 229 : 227; 133 } GetOp24(size_t i)134 static inline uint64_t GetOp24(size_t i) { 135 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 136 } GetEmit24(size_t,size_t emit)137 static inline uint64_t GetEmit24(size_t, size_t emit) { 138 return (emit < 2 ? (emit + 133) : ((emit - 2) ? 146 : 136)); 139 } GetOp25(size_t i)140 static inline uint64_t GetOp25(size_t i) { 141 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 142 } GetEmit25(size_t,size_t emit)143 static inline uint64_t GetEmit25(size_t, size_t emit) { 144 return (emit < 2 ? (emit ? 156 : 154) : ((emit - 2) ? 163 : 160)); 145 } GetOp26(size_t i)146 static inline uint64_t GetOp26(size_t i) { 147 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 148 } GetEmit26(size_t,size_t emit)149 static inline uint64_t GetEmit26(size_t, size_t emit) { 150 return (emit < 2 ? (emit ? 169 : 164) : ((emit - 2) ? 173 : 170)); 151 } GetOp27(size_t i)152 static inline uint64_t GetOp27(size_t i) { 153 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 154 } GetEmit27(size_t,size_t emit)155 static inline uint64_t GetEmit27(size_t, size_t emit) { 156 return (emit < 2 ? (emit ? 181 : 178) : ((emit - 2) + 185)); 157 } GetOp28(size_t i)158 static inline uint64_t GetOp28(size_t i) { 159 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 160 } GetEmit28(size_t,size_t emit)161 static inline uint64_t GetEmit28(size_t, size_t emit) { 162 return (emit < 2 ? (emit ? 189 : 187) : ((emit - 2) ? 196 : 190)); 163 } GetOp29(size_t i)164 static inline uint64_t GetOp29(size_t i) { 165 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 166 } GetEmit29(size_t,size_t emit)167 static inline uint64_t GetEmit29(size_t, size_t emit) { 168 return (emit < 2 ? (emit ? 228 : 198) : ((emit - 2) + 232)); 169 } GetOp30(size_t i)170 static inline uint64_t GetOp30(size_t i) { return table30_0_inner_[i]; } GetEmit30(size_t,size_t emit)171 static inline uint64_t GetEmit30(size_t, size_t emit) { 172 return table30_0_emit_[emit]; 173 } GetOp31(size_t i)174 static inline uint64_t GetOp31(size_t i) { return table30_0_inner_[i]; } GetEmit31(size_t,size_t emit)175 static inline uint64_t GetEmit31(size_t, size_t emit) { 176 return table31_0_emit_[emit]; 177 } GetOp32(size_t i)178 static inline uint64_t GetOp32(size_t i) { return table30_0_inner_[i]; } GetEmit32(size_t,size_t emit)179 static inline uint64_t GetEmit32(size_t, size_t emit) { 180 return table32_0_emit_[emit]; 181 } GetOp34(size_t i)182 static inline uint64_t GetOp34(size_t i) { return i; } GetEmit34(size_t,size_t emit)183 static inline uint64_t GetEmit34(size_t, size_t emit) { 184 return ((void)emit, 230); 185 } GetOp33(size_t i)186 static inline uint64_t GetOp33(size_t i) { 187 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 188 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 189 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 190 } GetEmit33(size_t,size_t emit)191 static inline uint64_t GetEmit33(size_t, size_t emit) { 192 return (emit < 1 ? (((void)emit, 230)) : ((emit - 1) ? 132 : 129)); 193 } GetOp36(size_t i)194 static inline uint64_t GetOp36(size_t i) { 195 return table36_0_inner_[(i < 5 ? (i) : (((void)(i - 5), 5)))]; 196 } GetEmit36(size_t,size_t emit)197 static inline uint64_t GetEmit36(size_t, size_t emit) { 198 return table36_0_emit_[emit]; 199 } GetOp35(size_t i)200 static inline uint64_t GetOp35(size_t i) { 201 return table35_0_inner_[(i < 9 ? (i / 2 + 0) : ((i - 9) + 4))]; 202 } GetEmit35(size_t,size_t emit)203 static inline uint64_t GetEmit35(size_t, size_t emit) { 204 return table35_0_emit_[emit]; 205 } GetOp38(size_t i)206 static inline uint64_t GetOp38(size_t i) { 207 return table38_0_inner_[(i < 6 ? (i) : ((i - 6) / 9 + 6))]; 208 } GetEmit38(size_t,size_t emit)209 static inline uint64_t GetEmit38(size_t, size_t emit) { 210 return table38_0_emit_[emit]; 211 } GetOp39(size_t i)212 static inline uint64_t GetOp39(size_t i) { return table39_0_ops_[i]; } GetEmit39(size_t,size_t emit)213 static inline uint64_t GetEmit39(size_t, size_t emit) { 214 return table39_0_emit_[emit]; 215 } GetOp40(size_t i)216 static inline uint64_t GetOp40(size_t i) { return table40_0_ops_[i]; } GetEmit40(size_t,size_t emit)217 static inline uint64_t GetEmit40(size_t, size_t emit) { 218 return table40_0_emit_[emit]; 219 } GetOp41(size_t i)220 static inline uint64_t GetOp41(size_t i) { return table41_0_ops_[i]; } GetEmit41(size_t,size_t emit)221 static inline uint64_t GetEmit41(size_t, size_t emit) { 222 return table41_0_emit_[emit]; 223 } GetOp42(size_t i)224 static inline uint64_t GetOp42(size_t i) { 225 return table42_ops_[i >> 7][i & 0x7f]; 226 } GetEmit42(size_t i,size_t emit)227 static inline uint64_t GetEmit42(size_t i, size_t emit) { 228 return table42_emit_[i >> 7][emit]; 229 } GetOp43(size_t i)230 static inline uint64_t GetOp43(size_t i) { 231 return table43_ops_[i >> 6][i & 0x3f]; 232 } GetEmit43(size_t i,size_t emit)233 static inline uint64_t GetEmit43(size_t i, size_t emit) { 234 return table43_emit_[i >> 6][emit]; 235 } GetOp37(size_t i)236 static inline uint64_t GetOp37(size_t i) { 237 return table37_ops_[i >> 6][i & 0x3f]; 238 } GetEmit37(size_t i,size_t emit)239 static inline uint64_t GetEmit37(size_t i, size_t emit) { 240 return table37_emit_[i >> 6][emit]; 241 } 242 243 private: 244 static const uint8_t table2_0_emit_[10]; 245 static const uint8_t table2_0_ops_[32]; 246 static const uint8_t table3_0_emit_[36]; 247 static const uint8_t table3_0_ops_[64]; 248 static const uint8_t table1_0_emit_[68]; 249 static const uint16_t table1_0_inner_[72]; 250 static const uint8_t table1_0_outer_[128]; 251 static const uint8_t table8_0_emit_[5]; 252 static const uint8_t table8_0_inner_[7]; 253 static const uint8_t table9_0_emit_[8]; 254 static const uint8_t table9_0_inner_[10]; 255 static const uint8_t table9_0_outer_[16]; 256 static const uint8_t table10_0_emit_[10]; 257 static const uint8_t table10_0_ops_[32]; 258 static const uint8_t table11_0_emit_[16]; 259 static const uint8_t table11_0_ops_[64]; 260 static const uint8_t table12_0_emit_[18]; 261 static const uint8_t table12_0_ops_[128]; 262 static const uint8_t table13_0_emit_[40]; 263 static const uint8_t table13_0_ops_[64]; 264 static const uint8_t table13_1_emit_[40]; 265 static const uint8_t table13_2_emit_[22]; 266 static const uint8_t table13_2_ops_[64]; 267 static const uint8_t table13_3_emit_[14]; 268 static const uint8_t table13_3_ops_[64]; 269 static const uint8_t* const table13_emit_[4]; 270 static const uint8_t* const table13_ops_[4]; 271 static const uint8_t table14_0_emit_[72]; 272 static const uint16_t table14_0_ops_[64]; 273 static const uint8_t table14_1_emit_[72]; 274 static const uint8_t table14_2_emit_[72]; 275 static const uint8_t table14_3_emit_[72]; 276 static const uint8_t table14_4_emit_[72]; 277 static const uint8_t table14_5_emit_[40]; 278 static const uint16_t table14_5_ops_[64]; 279 static const uint8_t table14_6_emit_[22]; 280 static const uint16_t table14_6_ops_[64]; 281 static const uint8_t table14_7_emit_[11]; 282 static const uint16_t table14_7_ops_[64]; 283 static const uint8_t* const table14_emit_[8]; 284 static const uint16_t* const table14_ops_[8]; 285 static const uint8_t table15_0_emit_[44]; 286 static const uint16_t table15_0_ops_[64]; 287 static const uint8_t table15_1_emit_[92]; 288 static const uint16_t table15_1_ops_[64]; 289 static const uint8_t table15_2_emit_[44]; 290 static const uint8_t table15_3_emit_[92]; 291 static const uint8_t table15_4_emit_[44]; 292 static const uint8_t table15_5_emit_[92]; 293 static const uint8_t table15_6_emit_[44]; 294 static const uint8_t table15_7_emit_[92]; 295 static const uint8_t table15_8_emit_[44]; 296 static const uint8_t table15_9_emit_[92]; 297 static const uint8_t table15_10_emit_[72]; 298 static const uint8_t table15_11_emit_[72]; 299 static const uint8_t table15_12_emit_[72]; 300 static const uint8_t table15_13_emit_[40]; 301 static const uint8_t table15_14_emit_[4]; 302 static const uint16_t table15_14_ops_[64]; 303 static const uint8_t table15_15_emit_[7]; 304 static const uint16_t table15_15_ops_[64]; 305 static const uint8_t* const table15_emit_[16]; 306 static const uint16_t* const table15_ops_[16]; 307 static const uint8_t table16_0_emit_[16]; 308 static const uint16_t table16_0_ops_[64]; 309 static const uint8_t table16_1_emit_[28]; 310 static const uint16_t table16_1_ops_[64]; 311 static const uint8_t table16_2_emit_[36]; 312 static const uint16_t table16_2_ops_[64]; 313 static const uint8_t table16_3_emit_[68]; 314 static const uint16_t table16_3_ops_[64]; 315 static const uint8_t table16_4_emit_[16]; 316 static const uint8_t table16_5_emit_[28]; 317 static const uint8_t table16_6_emit_[36]; 318 static const uint8_t table16_7_emit_[68]; 319 static const uint8_t table16_8_emit_[16]; 320 static const uint8_t table16_9_emit_[28]; 321 static const uint8_t table16_10_emit_[36]; 322 static const uint8_t table16_11_emit_[68]; 323 static const uint8_t table16_12_emit_[16]; 324 static const uint8_t table16_13_emit_[28]; 325 static const uint8_t table16_14_emit_[36]; 326 static const uint8_t table16_15_emit_[68]; 327 static const uint8_t table16_16_emit_[16]; 328 static const uint8_t table16_17_emit_[28]; 329 static const uint8_t table16_18_emit_[36]; 330 static const uint8_t table16_19_emit_[68]; 331 static const uint8_t table16_20_emit_[44]; 332 static const uint8_t table16_21_emit_[92]; 333 static const uint8_t table16_22_emit_[44]; 334 static const uint8_t table16_23_emit_[92]; 335 static const uint8_t table16_24_emit_[44]; 336 static const uint8_t table16_25_emit_[92]; 337 static const uint8_t table16_26_emit_[72]; 338 static const uint8_t table16_27_emit_[72]; 339 static const uint8_t table16_28_emit_[40]; 340 static const uint8_t table16_29_emit_[40]; 341 static const uint8_t table16_30_emit_[40]; 342 static const uint8_t table16_31_emit_[5]; 343 static const uint16_t table16_31_ops_[64]; 344 static const uint8_t* const table16_emit_[32]; 345 static const uint16_t* const table16_ops_[32]; 346 static const uint16_t table17_0_ops_[128]; 347 static const uint16_t table17_1_ops_[128]; 348 static const uint16_t table17_2_ops_[128]; 349 static const uint16_t table17_3_ops_[128]; 350 static const uint16_t table17_20_ops_[128]; 351 static const uint8_t table17_21_emit_[104]; 352 static const uint16_t table17_21_ops_[128]; 353 static const uint8_t table17_23_emit_[104]; 354 static const uint8_t table17_25_emit_[104]; 355 static const uint8_t table17_26_emit_[136]; 356 static const uint16_t table17_26_ops_[128]; 357 static const uint8_t table17_27_emit_[136]; 358 static const uint8_t table17_28_emit_[144]; 359 static const uint16_t table17_28_ops_[128]; 360 static const uint8_t table17_29_emit_[144]; 361 static const uint8_t table17_30_emit_[144]; 362 static const uint8_t table17_31_emit_[46]; 363 static const uint16_t table17_31_ops_[128]; 364 static const uint8_t* const table17_emit_[32]; 365 static const uint16_t* const table17_ops_[32]; 366 static const uint8_t table7_0_emit_[1]; 367 static const uint16_t table7_0_ops_[256]; 368 static const uint8_t table7_4_emit_[1]; 369 static const uint8_t table7_8_emit_[1]; 370 static const uint8_t table7_12_emit_[1]; 371 static const uint8_t table7_16_emit_[1]; 372 static const uint8_t table7_20_emit_[1]; 373 static const uint16_t table7_20_ops_[256]; 374 static const uint8_t table7_22_emit_[1]; 375 static const uint8_t table7_24_emit_[1]; 376 static const uint8_t table7_26_emit_[1]; 377 static const uint16_t table7_26_ops_[256]; 378 static const uint8_t table7_27_emit_[1]; 379 static const uint8_t table7_28_emit_[2]; 380 static const uint16_t table7_28_ops_[256]; 381 static const uint8_t table7_29_emit_[2]; 382 static const uint8_t table7_30_emit_[2]; 383 static const uint8_t table7_31_emit_[16]; 384 static const uint16_t table7_31_ops_[256]; 385 static const uint8_t* const table7_emit_[32]; 386 static const uint16_t* const table7_ops_[32]; 387 static const uint8_t table30_0_emit_[8]; 388 static const uint8_t table30_0_inner_[8]; 389 static const uint8_t table31_0_emit_[8]; 390 static const uint8_t table32_0_emit_[8]; 391 static const uint8_t table36_0_emit_[5]; 392 static const uint8_t table36_0_inner_[6]; 393 static const uint8_t table35_0_emit_[11]; 394 static const uint8_t table35_0_inner_[11]; 395 static const uint8_t table38_0_emit_[6]; 396 static const uint8_t table38_0_inner_[8]; 397 static const uint8_t table39_0_emit_[10]; 398 static const uint8_t table39_0_ops_[32]; 399 static const uint8_t table40_0_emit_[25]; 400 static const uint8_t table40_0_ops_[64]; 401 static const uint8_t table41_0_emit_[44]; 402 static const uint8_t table41_0_ops_[128]; 403 static const uint8_t table42_0_ops_[128]; 404 static const uint8_t table42_1_emit_[63]; 405 static const uint8_t table42_1_ops_[128]; 406 static const uint8_t* const table42_emit_[2]; 407 static const uint8_t* const table42_ops_[2]; 408 static const uint8_t table43_0_emit_[40]; 409 static const uint8_t table43_1_emit_[40]; 410 static const uint8_t table43_2_emit_[40]; 411 static const uint8_t table43_3_emit_[4]; 412 static const uint8_t table43_3_ops_[64]; 413 static const uint8_t table43_4_emit_[8]; 414 static const uint8_t table43_4_ops_[64]; 415 static const uint8_t table43_5_emit_[9]; 416 static const uint8_t table43_5_ops_[64]; 417 static const uint8_t table43_6_emit_[16]; 418 static const uint8_t table43_6_ops_[64]; 419 static const uint8_t table43_7_emit_[30]; 420 static const uint8_t table43_7_ops_[64]; 421 static const uint8_t* const table43_emit_[8]; 422 static const uint8_t* const table43_ops_[8]; 423 static const uint8_t table37_0_emit_[1]; 424 static const uint16_t table37_0_ops_[64]; 425 static const uint8_t table37_1_emit_[1]; 426 static const uint8_t table37_2_emit_[1]; 427 static const uint8_t table37_3_emit_[1]; 428 static const uint8_t table37_4_emit_[1]; 429 static const uint8_t table37_5_emit_[1]; 430 static const uint8_t table37_6_emit_[2]; 431 static const uint16_t table37_6_ops_[64]; 432 static const uint8_t table37_7_emit_[2]; 433 static const uint8_t table37_8_emit_[4]; 434 static const uint16_t table37_8_ops_[64]; 435 static const uint8_t table37_9_emit_[4]; 436 static const uint8_t table37_10_emit_[4]; 437 static const uint8_t table37_11_emit_[5]; 438 static const uint16_t table37_11_ops_[64]; 439 static const uint8_t table37_12_emit_[8]; 440 static const uint16_t table37_12_ops_[64]; 441 static const uint8_t table37_13_emit_[8]; 442 static const uint8_t table37_14_emit_[15]; 443 static const uint16_t table37_14_ops_[64]; 444 static const uint8_t table37_15_emit_[18]; 445 static const uint16_t table37_15_ops_[64]; 446 static const uint8_t* const table37_emit_[16]; 447 static const uint16_t* const table37_ops_[16]; 448 }; 449 template <typename F> 450 class HuffDecoder : public HuffDecoderCommon { 451 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)452 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 453 : sink_(sink), begin_(begin), end_(end) {} Run()454 bool Run() { 455 while (!done_) { 456 if (!RefillTo7()) { 457 Done0(); 458 break; 459 } 460 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 461 const auto op = GetOp1(index); 462 const int consumed = op & 7; 463 buffer_len_ -= consumed; 464 const auto emit_ofs = op >> 6; 465 switch ((op >> 3) & 7) { 466 case 0: { 467 sink_(GetEmit1(index, emit_ofs + 0)); 468 break; 469 } 470 case 1: { 471 DecodeStep0(); 472 break; 473 } 474 case 2: { 475 DecodeStep1(); 476 break; 477 } 478 case 3: { 479 DecodeStep2(); 480 break; 481 } 482 case 4: { 483 DecodeStep3(); 484 break; 485 } 486 } 487 } 488 return ok_; 489 } 490 491 private: RefillTo7()492 bool RefillTo7() { 493 switch (buffer_len_) { 494 case 0: { 495 return Read1to8Bytes(); 496 } 497 case 1: 498 case 2: 499 case 3: 500 case 4: 501 case 5: 502 case 6: { 503 return Read1to7Bytes(); 504 } 505 } 506 return true; 507 } Read1to8Bytes()508 bool Read1to8Bytes() { 509 switch (end_ - begin_) { 510 case 0: { 511 return false; 512 } 513 case 1: { 514 Fill1(); 515 return true; 516 } 517 case 2: { 518 Fill2(); 519 return true; 520 } 521 case 3: { 522 Fill3(); 523 return true; 524 } 525 case 4: { 526 Fill4(); 527 return true; 528 } 529 case 5: { 530 Fill5(); 531 return true; 532 } 533 case 6: { 534 Fill6(); 535 return true; 536 } 537 case 7: { 538 Fill7(); 539 return true; 540 } 541 default: { 542 Fill8(); 543 return true; 544 } 545 } 546 } Fill1()547 void Fill1() { 548 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 549 begin_ += 1; 550 buffer_len_ += 8; 551 } Fill2()552 void Fill2() { 553 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 554 (static_cast<uint64_t>(begin_[1]) << 0); 555 begin_ += 2; 556 buffer_len_ += 16; 557 } Fill3()558 void Fill3() { 559 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 560 (static_cast<uint64_t>(begin_[1]) << 8) | 561 (static_cast<uint64_t>(begin_[2]) << 0); 562 begin_ += 3; 563 buffer_len_ += 24; 564 } Fill4()565 void Fill4() { 566 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 567 (static_cast<uint64_t>(begin_[1]) << 16) | 568 (static_cast<uint64_t>(begin_[2]) << 8) | 569 (static_cast<uint64_t>(begin_[3]) << 0); 570 begin_ += 4; 571 buffer_len_ += 32; 572 } Fill5()573 void Fill5() { 574 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 575 (static_cast<uint64_t>(begin_[1]) << 24) | 576 (static_cast<uint64_t>(begin_[2]) << 16) | 577 (static_cast<uint64_t>(begin_[3]) << 8) | 578 (static_cast<uint64_t>(begin_[4]) << 0); 579 begin_ += 5; 580 buffer_len_ += 40; 581 } Fill6()582 void Fill6() { 583 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 584 (static_cast<uint64_t>(begin_[1]) << 32) | 585 (static_cast<uint64_t>(begin_[2]) << 24) | 586 (static_cast<uint64_t>(begin_[3]) << 16) | 587 (static_cast<uint64_t>(begin_[4]) << 8) | 588 (static_cast<uint64_t>(begin_[5]) << 0); 589 begin_ += 6; 590 buffer_len_ += 48; 591 } Fill7()592 void Fill7() { 593 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 594 (static_cast<uint64_t>(begin_[1]) << 40) | 595 (static_cast<uint64_t>(begin_[2]) << 32) | 596 (static_cast<uint64_t>(begin_[3]) << 24) | 597 (static_cast<uint64_t>(begin_[4]) << 16) | 598 (static_cast<uint64_t>(begin_[5]) << 8) | 599 (static_cast<uint64_t>(begin_[6]) << 0); 600 begin_ += 7; 601 buffer_len_ += 56; 602 } Fill8()603 void Fill8() { 604 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 605 (static_cast<uint64_t>(begin_[1]) << 48) | 606 (static_cast<uint64_t>(begin_[2]) << 40) | 607 (static_cast<uint64_t>(begin_[3]) << 32) | 608 (static_cast<uint64_t>(begin_[4]) << 24) | 609 (static_cast<uint64_t>(begin_[5]) << 16) | 610 (static_cast<uint64_t>(begin_[6]) << 8) | 611 (static_cast<uint64_t>(begin_[7]) << 0); 612 begin_ += 8; 613 buffer_len_ += 64; 614 } Read1to7Bytes()615 bool Read1to7Bytes() { 616 switch (end_ - begin_) { 617 case 0: { 618 return false; 619 } 620 case 1: { 621 Fill1(); 622 return true; 623 } 624 case 2: { 625 Fill2(); 626 return true; 627 } 628 case 3: { 629 Fill3(); 630 return true; 631 } 632 case 4: { 633 Fill4(); 634 return true; 635 } 636 case 5: { 637 Fill5(); 638 return true; 639 } 640 case 6: { 641 Fill6(); 642 return true; 643 } 644 default: { 645 Fill7(); 646 return true; 647 } 648 } 649 } Done0()650 void Done0() { 651 done_ = true; 652 switch (buffer_len_) { 653 case 1: 654 case 2: 655 case 3: 656 case 4: { 657 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 658 return; 659 } 660 case 5: { 661 const auto index = buffer_ & 31; 662 const auto op = GetOp2(index); 663 switch (op & 3) { 664 case 0: { 665 sink_(GetEmit2(index, (op >> 2) + 0)); 666 break; 667 } 668 case 1: { 669 ok_ = false; 670 break; 671 } 672 } 673 return; 674 } 675 case 6: { 676 const auto index = buffer_ & 63; 677 const auto op = GetOp3(index); 678 switch (op & 3) { 679 case 0: { 680 ok_ = false; 681 break; 682 } 683 case 1: { 684 sink_(GetEmit3(index, (op >> 2) + 0)); 685 break; 686 } 687 } 688 return; 689 } 690 case 0: { 691 return; 692 } 693 } 694 } DecodeStep0()695 void DecodeStep0() { 696 if (!RefillTo1()) { 697 Done1(); 698 return; 699 } 700 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 701 const auto op = GetOp4(index); 702 const int consumed = op & 1; 703 buffer_len_ -= consumed; 704 const auto emit_ofs = op >> 1; 705 sink_(GetEmit4(index, emit_ofs + 0)); 706 } RefillTo1()707 bool RefillTo1() { 708 switch (buffer_len_) { 709 case 0: { 710 return Read1to8Bytes(); 711 } 712 } 713 return true; 714 } Done1()715 void Done1() { 716 done_ = true; 717 ok_ = false; 718 } DecodeStep1()719 void DecodeStep1() { 720 if (!RefillTo1()) { 721 Done2(); 722 return; 723 } 724 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 725 const auto op = GetOp5(index); 726 const int consumed = op & 1; 727 buffer_len_ -= consumed; 728 const auto emit_ofs = op >> 1; 729 sink_(GetEmit5(index, emit_ofs + 0)); 730 } Done2()731 void Done2() { 732 done_ = true; 733 ok_ = false; 734 } DecodeStep2()735 void DecodeStep2() { 736 if (!RefillTo1()) { 737 Done3(); 738 return; 739 } 740 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 741 const auto op = GetOp6(index); 742 const int consumed = op & 1; 743 buffer_len_ -= consumed; 744 const auto emit_ofs = op >> 1; 745 sink_(GetEmit6(index, emit_ofs + 0)); 746 } Done3()747 void Done3() { 748 done_ = true; 749 ok_ = false; 750 } DecodeStep3()751 void DecodeStep3() { 752 if (!RefillTo13()) { 753 Done4(); 754 return; 755 } 756 const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff; 757 const auto op = GetOp7(index); 758 const int consumed = op & 15; 759 buffer_len_ -= consumed; 760 const auto emit_ofs = op >> 9; 761 switch ((op >> 4) & 31) { 762 case 0: { 763 sink_(GetEmit7(index, emit_ofs + 0)); 764 break; 765 } 766 case 1: { 767 DecodeStep4(); 768 break; 769 } 770 case 2: { 771 DecodeStep5(); 772 break; 773 } 774 case 3: { 775 DecodeStep6(); 776 break; 777 } 778 case 4: { 779 DecodeStep7(); 780 break; 781 } 782 case 5: { 783 DecodeStep8(); 784 break; 785 } 786 case 6: { 787 DecodeStep9(); 788 break; 789 } 790 case 7: { 791 DecodeStep19(); 792 break; 793 } 794 case 8: { 795 DecodeStep10(); 796 break; 797 } 798 case 9: { 799 DecodeStep11(); 800 break; 801 } 802 case 10: { 803 DecodeStep12(); 804 break; 805 } 806 case 11: { 807 DecodeStep13(); 808 break; 809 } 810 case 12: { 811 DecodeStep14(); 812 break; 813 } 814 case 13: { 815 DecodeStep15(); 816 break; 817 } 818 case 14: { 819 DecodeStep16(); 820 break; 821 } 822 case 15: { 823 DecodeStep17(); 824 break; 825 } 826 case 16: { 827 DecodeStep18(); 828 break; 829 } 830 case 17: { 831 DecodeStep20(); 832 break; 833 } 834 case 18: { 835 DecodeStep21(); 836 break; 837 } 838 } 839 } RefillTo13()840 bool RefillTo13() { 841 switch (buffer_len_) { 842 case 0: { 843 return Read2to8Bytes(); 844 } 845 case 1: 846 case 2: 847 case 3: 848 case 4: { 849 return Read2to7Bytes(); 850 } 851 case 5: 852 case 6: 853 case 7: 854 case 8: { 855 return Read1to7Bytes(); 856 } 857 case 9: 858 case 10: 859 case 11: 860 case 12: { 861 return Read1to6Bytes(); 862 } 863 } 864 return true; 865 } Read2to8Bytes()866 bool Read2to8Bytes() { 867 switch (end_ - begin_) { 868 case 0: 869 case 1: { 870 return false; 871 } 872 case 2: { 873 Fill2(); 874 return true; 875 } 876 case 3: { 877 Fill3(); 878 return true; 879 } 880 case 4: { 881 Fill4(); 882 return true; 883 } 884 case 5: { 885 Fill5(); 886 return true; 887 } 888 case 6: { 889 Fill6(); 890 return true; 891 } 892 case 7: { 893 Fill7(); 894 return true; 895 } 896 default: { 897 Fill8(); 898 return true; 899 } 900 } 901 } Read2to7Bytes()902 bool Read2to7Bytes() { 903 switch (end_ - begin_) { 904 case 0: 905 case 1: { 906 return false; 907 } 908 case 2: { 909 Fill2(); 910 return true; 911 } 912 case 3: { 913 Fill3(); 914 return true; 915 } 916 case 4: { 917 Fill4(); 918 return true; 919 } 920 case 5: { 921 Fill5(); 922 return true; 923 } 924 case 6: { 925 Fill6(); 926 return true; 927 } 928 default: { 929 Fill7(); 930 return true; 931 } 932 } 933 } Read1to6Bytes()934 bool Read1to6Bytes() { 935 switch (end_ - begin_) { 936 case 0: { 937 return false; 938 } 939 case 1: { 940 Fill1(); 941 return true; 942 } 943 case 2: { 944 Fill2(); 945 return true; 946 } 947 case 3: { 948 Fill3(); 949 return true; 950 } 951 case 4: { 952 Fill4(); 953 return true; 954 } 955 case 5: { 956 Fill5(); 957 return true; 958 } 959 default: { 960 Fill6(); 961 return true; 962 } 963 } 964 } Done4()965 void Done4() { 966 done_ = true; 967 switch (end_ - begin_) { 968 case 1: { 969 Fill1(); 970 break; 971 } 972 } 973 switch (buffer_len_) { 974 case 1: 975 case 2: { 976 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 977 return; 978 } 979 case 3: { 980 const auto index = buffer_ & 7; 981 const auto op = GetOp8(index); 982 switch (op & 3) { 983 case 0: { 984 sink_(GetEmit8(index, (op >> 2) + 0)); 985 break; 986 } 987 case 1: { 988 ok_ = false; 989 break; 990 } 991 } 992 return; 993 } 994 case 4: { 995 const auto index = buffer_ & 15; 996 const auto op = GetOp9(index); 997 switch (op & 3) { 998 case 0: { 999 ok_ = false; 1000 break; 1001 } 1002 case 1: { 1003 sink_(GetEmit9(index, (op >> 2) + 0)); 1004 break; 1005 } 1006 } 1007 return; 1008 } 1009 case 5: { 1010 const auto index = buffer_ & 31; 1011 const auto op = GetOp10(index); 1012 switch (op & 3) { 1013 case 0: { 1014 ok_ = false; 1015 break; 1016 } 1017 case 1: { 1018 sink_(GetEmit10(index, (op >> 2) + 0)); 1019 break; 1020 } 1021 } 1022 return; 1023 } 1024 case 6: { 1025 const auto index = buffer_ & 63; 1026 const auto op = GetOp11(index); 1027 switch (op & 3) { 1028 case 0: { 1029 ok_ = false; 1030 break; 1031 } 1032 case 1: { 1033 sink_(GetEmit11(index, (op >> 2) + 0)); 1034 break; 1035 } 1036 } 1037 return; 1038 } 1039 case 7: { 1040 const auto index = buffer_ & 127; 1041 const auto op = GetOp12(index); 1042 switch (op & 3) { 1043 case 0: { 1044 ok_ = false; 1045 break; 1046 } 1047 case 1: { 1048 sink_(GetEmit12(index, (op >> 2) + 0)); 1049 break; 1050 } 1051 } 1052 return; 1053 } 1054 case 8: { 1055 const auto index = buffer_ & 255; 1056 const auto op = GetOp13(index); 1057 switch (op & 3) { 1058 case 0: { 1059 sink_(GetEmit13(index, (op >> 2) + 0)); 1060 sink_(GetEmit13(index, (op >> 2) + 1)); 1061 break; 1062 } 1063 case 1: { 1064 ok_ = false; 1065 break; 1066 } 1067 case 2: { 1068 sink_(GetEmit13(index, (op >> 2) + 0)); 1069 break; 1070 } 1071 } 1072 return; 1073 } 1074 case 9: { 1075 const auto index = buffer_ & 511; 1076 const auto op = GetOp14(index); 1077 switch (op & 3) { 1078 case 0: { 1079 ok_ = false; 1080 break; 1081 } 1082 case 1: { 1083 sink_(GetEmit14(index, (op >> 2) + 0)); 1084 sink_(GetEmit14(index, (op >> 2) + 1)); 1085 break; 1086 } 1087 case 2: { 1088 sink_(GetEmit14(index, (op >> 2) + 0)); 1089 break; 1090 } 1091 } 1092 return; 1093 } 1094 case 10: { 1095 const auto index = buffer_ & 1023; 1096 const auto op = GetOp15(index); 1097 switch (op & 3) { 1098 case 0: { 1099 ok_ = false; 1100 break; 1101 } 1102 case 1: { 1103 sink_(GetEmit15(index, (op >> 2) + 0)); 1104 sink_(GetEmit15(index, (op >> 2) + 1)); 1105 break; 1106 } 1107 case 2: { 1108 sink_(GetEmit15(index, (op >> 2) + 0)); 1109 break; 1110 } 1111 } 1112 return; 1113 } 1114 case 11: { 1115 const auto index = buffer_ & 2047; 1116 const auto op = GetOp16(index); 1117 switch (op & 3) { 1118 case 0: { 1119 ok_ = false; 1120 break; 1121 } 1122 case 1: { 1123 sink_(GetEmit16(index, (op >> 2) + 0)); 1124 sink_(GetEmit16(index, (op >> 2) + 1)); 1125 break; 1126 } 1127 case 2: { 1128 sink_(GetEmit16(index, (op >> 2) + 0)); 1129 break; 1130 } 1131 } 1132 return; 1133 } 1134 case 12: { 1135 const auto index = buffer_ & 4095; 1136 const auto op = GetOp17(index); 1137 switch (op & 3) { 1138 case 0: { 1139 ok_ = false; 1140 break; 1141 } 1142 case 1: { 1143 sink_(GetEmit17(index, (op >> 2) + 0)); 1144 sink_(GetEmit17(index, (op >> 2) + 1)); 1145 break; 1146 } 1147 case 2: { 1148 sink_(GetEmit17(index, (op >> 2) + 0)); 1149 break; 1150 } 1151 } 1152 return; 1153 } 1154 case 0: { 1155 return; 1156 } 1157 } 1158 } DecodeStep4()1159 void DecodeStep4() { 1160 if (!RefillTo1()) { 1161 Done5(); 1162 return; 1163 } 1164 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1165 const auto op = GetOp18(index); 1166 const int consumed = op & 1; 1167 buffer_len_ -= consumed; 1168 const auto emit_ofs = op >> 1; 1169 sink_(GetEmit18(index, emit_ofs + 0)); 1170 } Done5()1171 void Done5() { 1172 done_ = true; 1173 ok_ = false; 1174 } DecodeStep5()1175 void DecodeStep5() { 1176 if (!RefillTo1()) { 1177 Done6(); 1178 return; 1179 } 1180 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1181 const auto op = GetOp19(index); 1182 const int consumed = op & 1; 1183 buffer_len_ -= consumed; 1184 const auto emit_ofs = op >> 1; 1185 sink_(GetEmit19(index, emit_ofs + 0)); 1186 } Done6()1187 void Done6() { 1188 done_ = true; 1189 ok_ = false; 1190 } DecodeStep6()1191 void DecodeStep6() { 1192 if (!RefillTo1()) { 1193 Done7(); 1194 return; 1195 } 1196 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1197 const auto op = GetOp20(index); 1198 const int consumed = op & 1; 1199 buffer_len_ -= consumed; 1200 const auto emit_ofs = op >> 1; 1201 sink_(GetEmit20(index, emit_ofs + 0)); 1202 } Done7()1203 void Done7() { 1204 done_ = true; 1205 ok_ = false; 1206 } DecodeStep7()1207 void DecodeStep7() { 1208 if (!RefillTo1()) { 1209 Done8(); 1210 return; 1211 } 1212 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1213 const auto op = GetOp21(index); 1214 const int consumed = op & 1; 1215 buffer_len_ -= consumed; 1216 const auto emit_ofs = op >> 1; 1217 sink_(GetEmit21(index, emit_ofs + 0)); 1218 } Done8()1219 void Done8() { 1220 done_ = true; 1221 ok_ = false; 1222 } DecodeStep8()1223 void DecodeStep8() { 1224 if (!RefillTo1()) { 1225 Done9(); 1226 return; 1227 } 1228 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1229 const auto op = GetOp22(index); 1230 const int consumed = op & 1; 1231 buffer_len_ -= consumed; 1232 const auto emit_ofs = op >> 1; 1233 sink_(GetEmit22(index, emit_ofs + 0)); 1234 } Done9()1235 void Done9() { 1236 done_ = true; 1237 ok_ = false; 1238 } DecodeStep9()1239 void DecodeStep9() { 1240 if (!RefillTo1()) { 1241 Done10(); 1242 return; 1243 } 1244 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1245 const auto op = GetOp23(index); 1246 const int consumed = op & 1; 1247 buffer_len_ -= consumed; 1248 const auto emit_ofs = op >> 1; 1249 sink_(GetEmit23(index, emit_ofs + 0)); 1250 } Done10()1251 void Done10() { 1252 done_ = true; 1253 ok_ = false; 1254 } DecodeStep10()1255 void DecodeStep10() { 1256 if (!RefillTo2()) { 1257 Done11(); 1258 return; 1259 } 1260 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1261 const auto op = GetOp24(index); 1262 const int consumed = op & 3; 1263 buffer_len_ -= consumed; 1264 const auto emit_ofs = op >> 2; 1265 sink_(GetEmit24(index, emit_ofs + 0)); 1266 } RefillTo2()1267 bool RefillTo2() { 1268 switch (buffer_len_) { 1269 case 0: { 1270 return Read1to8Bytes(); 1271 } 1272 case 1: { 1273 return Read1to7Bytes(); 1274 } 1275 } 1276 return true; 1277 } Done11()1278 void Done11() { 1279 done_ = true; 1280 switch (buffer_len_) { 1281 case 1: 1282 case 0: { 1283 ok_ = false; 1284 return; 1285 } 1286 } 1287 } DecodeStep11()1288 void DecodeStep11() { 1289 if (!RefillTo2()) { 1290 Done12(); 1291 return; 1292 } 1293 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1294 const auto op = GetOp25(index); 1295 const int consumed = op & 3; 1296 buffer_len_ -= consumed; 1297 const auto emit_ofs = op >> 2; 1298 sink_(GetEmit25(index, emit_ofs + 0)); 1299 } Done12()1300 void Done12() { 1301 done_ = true; 1302 switch (buffer_len_) { 1303 case 1: 1304 case 0: { 1305 ok_ = false; 1306 return; 1307 } 1308 } 1309 } DecodeStep12()1310 void DecodeStep12() { 1311 if (!RefillTo2()) { 1312 Done13(); 1313 return; 1314 } 1315 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1316 const auto op = GetOp26(index); 1317 const int consumed = op & 3; 1318 buffer_len_ -= consumed; 1319 const auto emit_ofs = op >> 2; 1320 sink_(GetEmit26(index, emit_ofs + 0)); 1321 } Done13()1322 void Done13() { 1323 done_ = true; 1324 switch (buffer_len_) { 1325 case 1: 1326 case 0: { 1327 ok_ = false; 1328 return; 1329 } 1330 } 1331 } DecodeStep13()1332 void DecodeStep13() { 1333 if (!RefillTo2()) { 1334 Done14(); 1335 return; 1336 } 1337 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1338 const auto op = GetOp27(index); 1339 const int consumed = op & 3; 1340 buffer_len_ -= consumed; 1341 const auto emit_ofs = op >> 2; 1342 sink_(GetEmit27(index, emit_ofs + 0)); 1343 } Done14()1344 void Done14() { 1345 done_ = true; 1346 switch (buffer_len_) { 1347 case 1: 1348 case 0: { 1349 ok_ = false; 1350 return; 1351 } 1352 } 1353 } DecodeStep14()1354 void DecodeStep14() { 1355 if (!RefillTo2()) { 1356 Done15(); 1357 return; 1358 } 1359 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1360 const auto op = GetOp28(index); 1361 const int consumed = op & 3; 1362 buffer_len_ -= consumed; 1363 const auto emit_ofs = op >> 2; 1364 sink_(GetEmit28(index, emit_ofs + 0)); 1365 } Done15()1366 void Done15() { 1367 done_ = true; 1368 switch (buffer_len_) { 1369 case 1: 1370 case 0: { 1371 ok_ = false; 1372 return; 1373 } 1374 } 1375 } DecodeStep15()1376 void DecodeStep15() { 1377 if (!RefillTo2()) { 1378 Done16(); 1379 return; 1380 } 1381 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1382 const auto op = GetOp29(index); 1383 const int consumed = op & 3; 1384 buffer_len_ -= consumed; 1385 const auto emit_ofs = op >> 2; 1386 sink_(GetEmit29(index, emit_ofs + 0)); 1387 } Done16()1388 void Done16() { 1389 done_ = true; 1390 switch (buffer_len_) { 1391 case 1: 1392 case 0: { 1393 ok_ = false; 1394 return; 1395 } 1396 } 1397 } DecodeStep16()1398 void DecodeStep16() { 1399 if (!RefillTo3()) { 1400 Done17(); 1401 return; 1402 } 1403 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1404 const auto op = GetOp30(index); 1405 const int consumed = op & 3; 1406 buffer_len_ -= consumed; 1407 const auto emit_ofs = op >> 2; 1408 sink_(GetEmit30(index, emit_ofs + 0)); 1409 } RefillTo3()1410 bool RefillTo3() { 1411 switch (buffer_len_) { 1412 case 0: { 1413 return Read1to8Bytes(); 1414 } 1415 case 1: 1416 case 2: { 1417 return Read1to7Bytes(); 1418 } 1419 } 1420 return true; 1421 } Done17()1422 void Done17() { 1423 done_ = true; 1424 switch (buffer_len_) { 1425 case 1: 1426 case 2: 1427 case 0: { 1428 ok_ = false; 1429 return; 1430 } 1431 } 1432 } DecodeStep17()1433 void DecodeStep17() { 1434 if (!RefillTo3()) { 1435 Done18(); 1436 return; 1437 } 1438 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1439 const auto op = GetOp31(index); 1440 const int consumed = op & 3; 1441 buffer_len_ -= consumed; 1442 const auto emit_ofs = op >> 2; 1443 sink_(GetEmit31(index, emit_ofs + 0)); 1444 } Done18()1445 void Done18() { 1446 done_ = true; 1447 switch (buffer_len_) { 1448 case 1: 1449 case 2: 1450 case 0: { 1451 ok_ = false; 1452 return; 1453 } 1454 } 1455 } DecodeStep18()1456 void DecodeStep18() { 1457 if (!RefillTo3()) { 1458 Done19(); 1459 return; 1460 } 1461 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1462 const auto op = GetOp32(index); 1463 const int consumed = op & 3; 1464 buffer_len_ -= consumed; 1465 const auto emit_ofs = op >> 2; 1466 sink_(GetEmit32(index, emit_ofs + 0)); 1467 } Done19()1468 void Done19() { 1469 done_ = true; 1470 switch (buffer_len_) { 1471 case 1: 1472 case 2: 1473 case 0: { 1474 ok_ = false; 1475 return; 1476 } 1477 } 1478 } DecodeStep19()1479 void DecodeStep19() { 1480 if (!RefillTo2()) { 1481 Done20(); 1482 return; 1483 } 1484 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1485 const auto op = GetOp33(index); 1486 const int consumed = op & 3; 1487 buffer_len_ -= consumed; 1488 const auto emit_ofs = op >> 2; 1489 sink_(GetEmit33(index, emit_ofs + 0)); 1490 } Done20()1491 void Done20() { 1492 done_ = true; 1493 switch (buffer_len_) { 1494 case 1: { 1495 const auto index = buffer_ & 1; 1496 const auto op = GetOp34(index); 1497 switch (op & 1) { 1498 case 0: { 1499 sink_(GetEmit34(index, (op >> 1) + 0)); 1500 break; 1501 } 1502 case 1: { 1503 ok_ = false; 1504 break; 1505 } 1506 } 1507 return; 1508 } 1509 case 0: { 1510 ok_ = false; 1511 return; 1512 } 1513 } 1514 } DecodeStep20()1515 void DecodeStep20() { 1516 if (!RefillTo4()) { 1517 Done21(); 1518 return; 1519 } 1520 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1521 const auto op = GetOp35(index); 1522 const int consumed = op & 7; 1523 buffer_len_ -= consumed; 1524 const auto emit_ofs = op >> 3; 1525 sink_(GetEmit35(index, emit_ofs + 0)); 1526 } RefillTo4()1527 bool RefillTo4() { 1528 switch (buffer_len_) { 1529 case 0: { 1530 return Read1to8Bytes(); 1531 } 1532 case 1: 1533 case 2: 1534 case 3: { 1535 return Read1to7Bytes(); 1536 } 1537 } 1538 return true; 1539 } Done21()1540 void Done21() { 1541 done_ = true; 1542 switch (buffer_len_) { 1543 case 1: 1544 case 2: 1545 case 0: { 1546 ok_ = false; 1547 return; 1548 } 1549 case 3: { 1550 const auto index = buffer_ & 7; 1551 const auto op = GetOp36(index); 1552 switch (op & 1) { 1553 case 0: { 1554 sink_(GetEmit36(index, (op >> 1) + 0)); 1555 break; 1556 } 1557 case 1: { 1558 ok_ = false; 1559 break; 1560 } 1561 } 1562 return; 1563 } 1564 } 1565 } DecodeStep21()1566 void DecodeStep21() { 1567 if (!RefillTo10()) { 1568 Done22(); 1569 return; 1570 } 1571 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 1572 const auto op = GetOp37(index); 1573 const int consumed = op & 15; 1574 buffer_len_ -= consumed; 1575 const auto emit_ofs = op >> 5; 1576 switch ((op >> 4) & 1) { 1577 case 0: { 1578 sink_(GetEmit37(index, emit_ofs + 0)); 1579 break; 1580 } 1581 case 1: { 1582 begin_ = end_; 1583 buffer_len_ = 0; 1584 break; 1585 } 1586 } 1587 } RefillTo10()1588 bool RefillTo10() { 1589 switch (buffer_len_) { 1590 case 0: { 1591 return Read2to8Bytes(); 1592 } 1593 case 1: { 1594 return Read2to7Bytes(); 1595 } 1596 case 2: 1597 case 3: 1598 case 4: 1599 case 5: 1600 case 6: 1601 case 7: 1602 case 8: { 1603 return Read1to7Bytes(); 1604 } 1605 case 9: { 1606 return Read1to6Bytes(); 1607 } 1608 } 1609 return true; 1610 } Done22()1611 void Done22() { 1612 done_ = true; 1613 switch (end_ - begin_) { 1614 case 1: { 1615 Fill1(); 1616 break; 1617 } 1618 } 1619 switch (buffer_len_) { 1620 case 1: 1621 case 2: 1622 case 3: { 1623 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1624 return; 1625 } 1626 case 4: { 1627 const auto index = buffer_ & 15; 1628 const auto op = GetOp38(index); 1629 switch (op & 3) { 1630 case 0: { 1631 sink_(GetEmit38(index, (op >> 2) + 0)); 1632 break; 1633 } 1634 case 1: { 1635 ok_ = false; 1636 break; 1637 } 1638 } 1639 return; 1640 } 1641 case 5: { 1642 const auto index = buffer_ & 31; 1643 const auto op = GetOp39(index); 1644 switch (op & 3) { 1645 case 0: { 1646 ok_ = false; 1647 break; 1648 } 1649 case 1: { 1650 sink_(GetEmit39(index, (op >> 2) + 0)); 1651 break; 1652 } 1653 } 1654 return; 1655 } 1656 case 6: { 1657 const auto index = buffer_ & 63; 1658 const auto op = GetOp40(index); 1659 switch (op & 3) { 1660 case 0: { 1661 ok_ = false; 1662 break; 1663 } 1664 case 1: { 1665 sink_(GetEmit40(index, (op >> 2) + 0)); 1666 break; 1667 } 1668 } 1669 return; 1670 } 1671 case 7: { 1672 const auto index = buffer_ & 127; 1673 const auto op = GetOp41(index); 1674 switch (op & 3) { 1675 case 0: { 1676 ok_ = false; 1677 break; 1678 } 1679 case 1: { 1680 sink_(GetEmit41(index, (op >> 2) + 0)); 1681 break; 1682 } 1683 } 1684 return; 1685 } 1686 case 8: { 1687 const auto index = buffer_ & 255; 1688 const auto op = GetOp42(index); 1689 switch (op & 3) { 1690 case 0: { 1691 ok_ = false; 1692 break; 1693 } 1694 case 1: { 1695 sink_(GetEmit42(index, (op >> 2) + 0)); 1696 break; 1697 } 1698 } 1699 return; 1700 } 1701 case 9: { 1702 const auto index = buffer_ & 511; 1703 const auto op = GetOp43(index); 1704 switch (op & 3) { 1705 case 0: { 1706 sink_(GetEmit43(index, (op >> 2) + 0)); 1707 sink_(GetEmit43(index, (op >> 2) + 1)); 1708 break; 1709 } 1710 case 1: { 1711 ok_ = false; 1712 break; 1713 } 1714 case 2: { 1715 sink_(GetEmit43(index, (op >> 2) + 0)); 1716 break; 1717 } 1718 } 1719 return; 1720 } 1721 case 0: { 1722 return; 1723 } 1724 } 1725 } 1726 F sink_; 1727 const uint8_t* begin_; 1728 const uint8_t* const end_; 1729 uint64_t buffer_ = 0; 1730 int buffer_len_ = 0; 1731 bool ok_ = true; 1732 bool done_ = false; 1733 }; 1734 } // namespace geometry_7_13_10 1735 } // namespace grpc_core 1736 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_13_10_H 1737