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