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