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_11_7_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_11_7_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_12_11_7 { 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 } GetOp19(size_t i)112 static inline uint64_t GetOp19(size_t i) { 113 return table19_ops_[i >> 5][i & 0x1f]; 114 } GetEmit19(size_t i,size_t emit)115 static inline uint64_t GetEmit19(size_t i, size_t emit) { 116 return table19_emit_[i >> 5][emit]; 117 } GetOp20(size_t i)118 static inline uint64_t GetOp20(size_t i) { 119 return table20_ops_[i >> 6][i & 0x3f]; 120 } GetEmit20(size_t i,size_t emit)121 static inline uint64_t GetEmit20(size_t i, size_t emit) { 122 return table20_emit_[i >> 6][emit]; 123 } GetOp21(size_t i)124 static inline uint64_t GetOp21(size_t i) { 125 return table21_ops_[i >> 7][i & 0x7f]; 126 } GetEmit21(size_t i,size_t emit)127 static inline uint64_t GetEmit21(size_t i, size_t emit) { 128 return table21_emit_[i >> 7][emit]; 129 } GetOp12(size_t i)130 static inline uint64_t GetOp12(size_t i) { 131 return table12_ops_[i >> 7][i & 0x7f]; 132 } GetEmit12(size_t i,size_t emit)133 static inline uint64_t GetEmit12(size_t i, size_t emit) { 134 return table12_emit_[i >> 7][emit]; 135 } 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) { 138 return emit ? 142 : 9; 139 } GetOp23(size_t i)140 static inline uint64_t GetOp23(size_t i) { return i ? 3 : 1; } GetEmit23(size_t,size_t emit)141 static inline uint64_t GetEmit23(size_t, size_t emit) { return emit + 144; } 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 ? 159 : 148; 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) { 148 return emit ? 206 : 171; 149 } GetOp26(size_t i)150 static inline uint64_t GetOp26(size_t i) { return i ? 3 : 1; } GetEmit26(size_t,size_t emit)151 static inline uint64_t GetEmit26(size_t, size_t emit) { 152 return emit ? 225 : 215; 153 } GetOp27(size_t i)154 static inline uint64_t GetOp27(size_t i) { return i ? 3 : 1; } GetEmit27(size_t,size_t emit)155 static inline uint64_t GetEmit27(size_t, size_t emit) { return emit + 236; } 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 ? 207 : 199) : ((emit - 2) + 234)); 161 } GetOp29(size_t i)162 static inline uint64_t GetOp29(size_t i) { return table29_0_inner_[i]; } GetEmit29(size_t,size_t emit)163 static inline uint64_t GetEmit29(size_t, size_t emit) { 164 return table29_0_emit_[emit]; 165 } GetOp30(size_t i)166 static inline uint64_t GetOp30(size_t i) { return table30_0_inner_[i]; } GetEmit30(size_t,size_t emit)167 static inline uint64_t GetEmit30(size_t, size_t emit) { 168 return table30_0_emit_[emit]; 169 } GetOp32(size_t i)170 static inline uint64_t GetOp32(size_t i) { 171 return (i < 1 ? (((void)i, 0)) : ((i - 1) / 14 + 1)); 172 } GetEmit32(size_t,size_t emit)173 static inline uint64_t GetEmit32(size_t, size_t emit) { 174 return ((void)emit, 254); 175 } GetOp33(size_t i)176 static inline uint64_t GetOp33(size_t i) { return table33_0_ops_[i]; } GetEmit33(size_t,size_t emit)177 static inline uint64_t GetEmit33(size_t, size_t emit) { 178 return table33_0_emit_[emit]; 179 } GetOp34(size_t i)180 static inline uint64_t GetOp34(size_t i) { return table34_0_ops_[i]; } GetEmit34(size_t,size_t emit)181 static inline uint64_t GetEmit34(size_t, size_t emit) { 182 return table33_0_emit_[emit]; 183 } GetOp31(size_t i)184 static inline uint64_t GetOp31(size_t i) { 185 return table31_ops_[i >> 5][i & 0x1f]; 186 } GetEmit31(size_t i,size_t emit)187 static inline uint64_t GetEmit31(size_t i, size_t emit) { 188 return table31_emit_[i >> 5][emit]; 189 } GetOp36(size_t i)190 static inline uint64_t GetOp36(size_t i) { return table36_0_inner_[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 } GetOp35(size_t i)194 static inline uint64_t GetOp35(size_t i) { 195 return table35_0_inner_[(i < 13 ? (i / 2 + 0) : ((i - 13) + 6))]; 196 } GetEmit35(size_t,size_t emit)197 static inline uint64_t GetEmit35(size_t, size_t emit) { 198 return table35_0_emit_[emit]; 199 } 200 201 private: 202 static const uint8_t table2_0_emit_[10]; 203 static const uint8_t table2_0_ops_[32]; 204 static const uint8_t table3_0_emit_[36]; 205 static const uint8_t table3_0_ops_[64]; 206 static const uint8_t table4_0_emit_[22]; 207 static const uint8_t table4_0_ops_[64]; 208 static const uint8_t table4_1_emit_[46]; 209 static const uint8_t table4_1_ops_[64]; 210 static const uint8_t* const table4_emit_[2]; 211 static const uint8_t* const table4_ops_[2]; 212 static const uint8_t table5_0_ops_[128]; 213 static const uint8_t table5_1_emit_[52]; 214 static const uint8_t table5_1_ops_[128]; 215 static const uint8_t* const table5_emit_[2]; 216 static const uint8_t* const table5_ops_[2]; 217 static const uint8_t table6_0_emit_[2]; 218 static const uint8_t table6_0_ops_[32]; 219 static const uint8_t table6_1_emit_[2]; 220 static const uint8_t table6_2_emit_[2]; 221 static const uint8_t table6_3_emit_[2]; 222 static const uint8_t table6_4_emit_[2]; 223 static const uint8_t table6_5_emit_[4]; 224 static const uint8_t table6_5_ops_[32]; 225 static const uint8_t table6_6_emit_[4]; 226 static const uint8_t table6_7_emit_[4]; 227 static const uint8_t table6_8_emit_[4]; 228 static const uint8_t table6_9_emit_[4]; 229 static const uint8_t table6_10_emit_[4]; 230 static const uint8_t table6_11_emit_[6]; 231 static const uint8_t table6_11_ops_[32]; 232 static const uint8_t table6_12_emit_[8]; 233 static const uint8_t table6_12_ops_[32]; 234 static const uint8_t table6_13_emit_[8]; 235 static const uint8_t table6_14_emit_[8]; 236 static const uint8_t table6_15_emit_[10]; 237 static const uint8_t table6_15_ops_[32]; 238 static const uint8_t* const table6_emit_[16]; 239 static const uint8_t* const table6_ops_[16]; 240 static const uint8_t table7_0_emit_[36]; 241 static const uint8_t table7_0_ops_[64]; 242 static const uint8_t table7_1_emit_[36]; 243 static const uint8_t table7_1_ops_[64]; 244 static const uint8_t table7_2_emit_[36]; 245 static const uint8_t table7_2_ops_[64]; 246 static const uint8_t table7_3_emit_[36]; 247 static const uint8_t table7_3_ops_[64]; 248 static const uint8_t table7_4_emit_[38]; 249 static const uint8_t table7_4_ops_[64]; 250 static const uint8_t table7_5_ops_[64]; 251 static const uint8_t table7_11_ops_[64]; 252 static const uint8_t table7_12_ops_[64]; 253 static const uint8_t table7_15_emit_[15]; 254 static const uint8_t table7_15_ops_[64]; 255 static const uint8_t* const table7_emit_[16]; 256 static const uint8_t* const table7_ops_[16]; 257 static const uint8_t table8_0_emit_[71]; 258 static const uint16_t table8_0_inner_[38]; 259 static const uint8_t table8_0_outer_[64]; 260 static const uint8_t table8_1_emit_[71]; 261 static const uint16_t table8_1_inner_[38]; 262 static const uint8_t table8_2_emit_[71]; 263 static const uint16_t table8_2_inner_[38]; 264 static const uint8_t table8_3_emit_[71]; 265 static const uint16_t table8_3_inner_[38]; 266 static const uint8_t table8_4_emit_[71]; 267 static const uint16_t table8_4_inner_[38]; 268 static const uint8_t table8_5_emit_[71]; 269 static const uint16_t table8_5_inner_[38]; 270 static const uint8_t table8_6_emit_[71]; 271 static const uint16_t table8_6_inner_[38]; 272 static const uint8_t table8_7_emit_[71]; 273 static const uint16_t table8_7_inner_[38]; 274 static const uint8_t table8_8_emit_[71]; 275 static const uint16_t table8_8_inner_[38]; 276 static const uint8_t table8_9_emit_[71]; 277 static const uint16_t table8_9_inner_[38]; 278 static const uint8_t table8_10_emit_[40]; 279 static const uint16_t table8_10_inner_[23]; 280 static const uint8_t table8_10_outer_[64]; 281 static const uint8_t table8_11_emit_[40]; 282 static const uint8_t table8_12_emit_[40]; 283 static const uint8_t table8_13_emit_[40]; 284 static const uint8_t table8_14_emit_[40]; 285 static const uint8_t table8_15_emit_[40]; 286 static const uint8_t table8_16_emit_[40]; 287 static const uint8_t table8_17_emit_[40]; 288 static const uint8_t table8_18_emit_[40]; 289 static const uint8_t table8_19_emit_[40]; 290 static const uint8_t table8_20_emit_[40]; 291 static const uint8_t table8_21_emit_[40]; 292 static const uint8_t table8_22_emit_[40]; 293 static const uint8_t table8_23_emit_[4]; 294 static const uint16_t table8_23_inner_[5]; 295 static const uint8_t table8_23_outer_[64]; 296 static const uint8_t table8_24_emit_[4]; 297 static const uint8_t table8_25_emit_[4]; 298 static const uint8_t table8_26_emit_[4]; 299 static const uint8_t table8_27_emit_[4]; 300 static const uint8_t table8_28_emit_[4]; 301 static const uint8_t table8_29_emit_[4]; 302 static const uint8_t table8_30_emit_[4]; 303 static const uint8_t table8_31_emit_[14]; 304 static const uint16_t table8_31_inner_[16]; 305 static const uint8_t table8_31_outer_[64]; 306 static const uint8_t* const table8_emit_[32]; 307 static const uint16_t* const table8_inner_[32]; 308 static const uint8_t* const table8_outer_[32]; 309 static const uint8_t table1_0_emit_[135]; 310 static const uint16_t table1_0_inner_[69]; 311 static const uint8_t table1_0_outer_[128]; 312 static const uint8_t table1_1_emit_[135]; 313 static const uint16_t table1_1_inner_[69]; 314 static const uint8_t table1_2_emit_[135]; 315 static const uint16_t table1_2_inner_[69]; 316 static const uint8_t table1_3_emit_[135]; 317 static const uint16_t table1_3_inner_[69]; 318 static const uint8_t table1_4_emit_[135]; 319 static const uint16_t table1_4_inner_[69]; 320 static const uint8_t table1_5_emit_[135]; 321 static const uint16_t table1_5_inner_[69]; 322 static const uint8_t table1_6_emit_[135]; 323 static const uint16_t table1_6_inner_[69]; 324 static const uint8_t table1_7_emit_[135]; 325 static const uint16_t table1_7_inner_[69]; 326 static const uint8_t table1_8_emit_[135]; 327 static const uint16_t table1_8_inner_[69]; 328 static const uint8_t table1_9_emit_[135]; 329 static const uint16_t table1_9_inner_[69]; 330 static const uint8_t table1_10_emit_[140]; 331 static const uint16_t table1_10_inner_[74]; 332 static const uint8_t table1_10_outer_[128]; 333 static const uint8_t table1_11_emit_[140]; 334 static const uint16_t table1_11_inner_[74]; 335 static const uint8_t table1_12_emit_[140]; 336 static const uint16_t table1_12_inner_[74]; 337 static const uint8_t table1_13_emit_[140]; 338 static const uint16_t table1_13_inner_[74]; 339 static const uint8_t table1_14_emit_[140]; 340 static const uint16_t table1_14_inner_[74]; 341 static const uint8_t table1_15_emit_[140]; 342 static const uint16_t table1_15_inner_[74]; 343 static const uint8_t table1_16_emit_[140]; 344 static const uint16_t table1_16_inner_[74]; 345 static const uint8_t table1_17_emit_[140]; 346 static const uint16_t table1_17_inner_[74]; 347 static const uint8_t table1_18_emit_[140]; 348 static const uint16_t table1_18_inner_[74]; 349 static const uint8_t table1_19_emit_[140]; 350 static const uint16_t table1_19_inner_[74]; 351 static const uint8_t table1_20_emit_[140]; 352 static const uint16_t table1_20_inner_[74]; 353 static const uint8_t table1_21_emit_[140]; 354 static const uint16_t table1_21_inner_[74]; 355 static const uint8_t table1_22_emit_[142]; 356 static const uint16_t table1_22_inner_[74]; 357 static const uint8_t table1_23_emit_[80]; 358 static const uint16_t table1_23_inner_[44]; 359 static const uint8_t table1_23_outer_[128]; 360 static const uint8_t table1_24_emit_[80]; 361 static const uint8_t table1_25_emit_[80]; 362 static const uint8_t table1_26_emit_[80]; 363 static const uint8_t table1_27_emit_[80]; 364 static const uint8_t table1_28_emit_[80]; 365 static const uint8_t table1_29_emit_[80]; 366 static const uint8_t table1_30_emit_[80]; 367 static const uint8_t table1_31_emit_[16]; 368 static const uint16_t table1_31_inner_[20]; 369 static const uint8_t table1_31_outer_[128]; 370 static const uint8_t* const table1_emit_[32]; 371 static const uint16_t* const table1_inner_[32]; 372 static const uint8_t* const table1_outer_[32]; 373 static const uint8_t table14_0_emit_[5]; 374 static const uint8_t table14_0_inner_[7]; 375 static const uint8_t table14_0_outer_[8]; 376 static const uint8_t table15_0_outer_[16]; 377 static const uint8_t table16_0_ops_[32]; 378 static const uint8_t table17_0_ops_[64]; 379 static const uint8_t table18_0_emit_[46]; 380 static const uint8_t table18_0_ops_[128]; 381 static const uint8_t table19_0_emit_[44]; 382 static const uint8_t table19_0_ops_[32]; 383 static const uint8_t table19_1_emit_[28]; 384 static const uint8_t table19_1_ops_[32]; 385 static const uint8_t table19_2_emit_[44]; 386 static const uint8_t table19_3_emit_[28]; 387 static const uint8_t table19_4_emit_[20]; 388 static const uint8_t table19_4_ops_[32]; 389 static const uint8_t table19_5_emit_[20]; 390 static const uint8_t table19_6_emit_[20]; 391 static const uint8_t table19_7_emit_[11]; 392 static const uint8_t table19_7_ops_[32]; 393 static const uint8_t* const table19_emit_[8]; 394 static const uint8_t* const table19_ops_[8]; 395 static const uint16_t table20_0_ops_[64]; 396 static const uint8_t table20_1_emit_[92]; 397 static const uint16_t table20_1_ops_[64]; 398 static const uint8_t table20_3_emit_[92]; 399 static const uint8_t table20_4_emit_[72]; 400 static const uint16_t table20_4_ops_[64]; 401 static const uint8_t table20_5_emit_[72]; 402 static const uint8_t table20_6_emit_[72]; 403 static const uint8_t table20_7_emit_[24]; 404 static const uint16_t table20_7_ops_[64]; 405 static const uint8_t* const table20_emit_[8]; 406 static const uint16_t* const table20_ops_[8]; 407 static const uint16_t table21_0_ops_[128]; 408 static const uint8_t table21_1_emit_[104]; 409 static const uint16_t table21_1_ops_[128]; 410 static const uint8_t table21_3_emit_[104]; 411 static const uint8_t table21_4_emit_[136]; 412 static const uint16_t table21_4_ops_[128]; 413 static const uint8_t table21_5_emit_[136]; 414 static const uint8_t table21_6_emit_[136]; 415 static const uint8_t table21_7_emit_[50]; 416 static const uint16_t table21_7_ops_[128]; 417 static const uint8_t* const table21_emit_[8]; 418 static const uint16_t* const table21_ops_[8]; 419 static const uint8_t table12_0_emit_[1]; 420 static const uint16_t table12_0_ops_[128]; 421 static const uint8_t table12_4_emit_[1]; 422 static const uint8_t table12_8_emit_[1]; 423 static const uint16_t table12_8_ops_[128]; 424 static const uint8_t table12_10_emit_[1]; 425 static const uint8_t table12_12_emit_[1]; 426 static const uint8_t table12_14_emit_[15]; 427 static const uint16_t table12_14_ops_[128]; 428 static const uint8_t table12_15_emit_[64]; 429 static const uint16_t table12_15_ops_[128]; 430 static const uint8_t* const table12_emit_[16]; 431 static const uint16_t* const table12_ops_[16]; 432 static const uint8_t table29_0_emit_[8]; 433 static const uint8_t table29_0_inner_[8]; 434 static const uint8_t table30_0_emit_[16]; 435 static const uint8_t table30_0_inner_[16]; 436 static const uint8_t table33_0_emit_[30]; 437 static const uint8_t table33_0_ops_[32]; 438 static const uint8_t table34_0_ops_[64]; 439 static const uint8_t table31_0_emit_[7]; 440 static const uint8_t table31_0_ops_[32]; 441 static const uint8_t table31_1_emit_[8]; 442 static const uint8_t table31_1_ops_[32]; 443 static const uint8_t table31_2_emit_[8]; 444 static const uint8_t table31_3_emit_[10]; 445 static const uint8_t table31_3_ops_[32]; 446 static const uint8_t* const table31_emit_[4]; 447 static const uint8_t* const table31_ops_[4]; 448 static const uint8_t table36_0_emit_[7]; 449 static const uint8_t table36_0_inner_[8]; 450 static const uint8_t table35_0_emit_[9]; 451 static const uint8_t table35_0_inner_[9]; 452 }; 453 template <typename F> 454 class HuffDecoder : public HuffDecoderCommon { 455 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)456 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 457 : sink_(sink), begin_(begin), end_(end) {} Run()458 bool Run() { 459 while (!done_) { 460 if (!RefillTo12()) { 461 Done0(); 462 break; 463 } 464 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 465 const auto op = GetOp1(index); 466 const int consumed = op & 15; 467 buffer_len_ -= consumed; 468 const auto emit_ofs = op >> 7; 469 switch ((op >> 4) & 7) { 470 case 0: { 471 sink_(GetEmit1(index, emit_ofs + 0)); 472 sink_(GetEmit1(index, emit_ofs + 1)); 473 break; 474 } 475 case 1: { 476 sink_(GetEmit1(index, emit_ofs + 0)); 477 break; 478 } 479 case 2: { 480 DecodeStep0(); 481 break; 482 } 483 case 3: { 484 DecodeStep1(); 485 break; 486 } 487 case 4: { 488 DecodeStep2(); 489 break; 490 } 491 case 5: { 492 DecodeStep3(); 493 break; 494 } 495 } 496 } 497 return ok_; 498 } 499 500 private: RefillTo12()501 bool RefillTo12() { 502 switch (buffer_len_) { 503 case 0: { 504 return Read2to8Bytes(); 505 } 506 case 1: 507 case 2: 508 case 3: { 509 return Read2to7Bytes(); 510 } 511 case 4: 512 case 5: 513 case 6: 514 case 7: 515 case 8: { 516 return Read1to7Bytes(); 517 } 518 case 9: 519 case 10: 520 case 11: { 521 return Read1to6Bytes(); 522 } 523 } 524 return true; 525 } Read2to8Bytes()526 bool Read2to8Bytes() { 527 switch (end_ - begin_) { 528 case 0: 529 case 1: { 530 return false; 531 } 532 case 2: { 533 Fill2(); 534 return true; 535 } 536 case 3: { 537 Fill3(); 538 return true; 539 } 540 case 4: { 541 Fill4(); 542 return true; 543 } 544 case 5: { 545 Fill5(); 546 return true; 547 } 548 case 6: { 549 Fill6(); 550 return true; 551 } 552 case 7: { 553 Fill7(); 554 return true; 555 } 556 default: { 557 Fill8(); 558 return true; 559 } 560 } 561 } Fill2()562 void Fill2() { 563 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 564 (static_cast<uint64_t>(begin_[1]) << 0); 565 begin_ += 2; 566 buffer_len_ += 16; 567 } Fill3()568 void Fill3() { 569 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 570 (static_cast<uint64_t>(begin_[1]) << 8) | 571 (static_cast<uint64_t>(begin_[2]) << 0); 572 begin_ += 3; 573 buffer_len_ += 24; 574 } Fill4()575 void Fill4() { 576 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 577 (static_cast<uint64_t>(begin_[1]) << 16) | 578 (static_cast<uint64_t>(begin_[2]) << 8) | 579 (static_cast<uint64_t>(begin_[3]) << 0); 580 begin_ += 4; 581 buffer_len_ += 32; 582 } Fill5()583 void Fill5() { 584 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 585 (static_cast<uint64_t>(begin_[1]) << 24) | 586 (static_cast<uint64_t>(begin_[2]) << 16) | 587 (static_cast<uint64_t>(begin_[3]) << 8) | 588 (static_cast<uint64_t>(begin_[4]) << 0); 589 begin_ += 5; 590 buffer_len_ += 40; 591 } Fill6()592 void Fill6() { 593 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 594 (static_cast<uint64_t>(begin_[1]) << 32) | 595 (static_cast<uint64_t>(begin_[2]) << 24) | 596 (static_cast<uint64_t>(begin_[3]) << 16) | 597 (static_cast<uint64_t>(begin_[4]) << 8) | 598 (static_cast<uint64_t>(begin_[5]) << 0); 599 begin_ += 6; 600 buffer_len_ += 48; 601 } Fill7()602 void Fill7() { 603 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 604 (static_cast<uint64_t>(begin_[1]) << 40) | 605 (static_cast<uint64_t>(begin_[2]) << 32) | 606 (static_cast<uint64_t>(begin_[3]) << 24) | 607 (static_cast<uint64_t>(begin_[4]) << 16) | 608 (static_cast<uint64_t>(begin_[5]) << 8) | 609 (static_cast<uint64_t>(begin_[6]) << 0); 610 begin_ += 7; 611 buffer_len_ += 56; 612 } Fill8()613 void Fill8() { 614 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 615 (static_cast<uint64_t>(begin_[1]) << 48) | 616 (static_cast<uint64_t>(begin_[2]) << 40) | 617 (static_cast<uint64_t>(begin_[3]) << 32) | 618 (static_cast<uint64_t>(begin_[4]) << 24) | 619 (static_cast<uint64_t>(begin_[5]) << 16) | 620 (static_cast<uint64_t>(begin_[6]) << 8) | 621 (static_cast<uint64_t>(begin_[7]) << 0); 622 begin_ += 8; 623 buffer_len_ += 64; 624 } Read2to7Bytes()625 bool Read2to7Bytes() { 626 switch (end_ - begin_) { 627 case 0: 628 case 1: { 629 return false; 630 } 631 case 2: { 632 Fill2(); 633 return true; 634 } 635 case 3: { 636 Fill3(); 637 return true; 638 } 639 case 4: { 640 Fill4(); 641 return true; 642 } 643 case 5: { 644 Fill5(); 645 return true; 646 } 647 case 6: { 648 Fill6(); 649 return true; 650 } 651 default: { 652 Fill7(); 653 return true; 654 } 655 } 656 } Read1to7Bytes()657 bool Read1to7Bytes() { 658 switch (end_ - begin_) { 659 case 0: { 660 return false; 661 } 662 case 1: { 663 Fill1(); 664 return true; 665 } 666 case 2: { 667 Fill2(); 668 return true; 669 } 670 case 3: { 671 Fill3(); 672 return true; 673 } 674 case 4: { 675 Fill4(); 676 return true; 677 } 678 case 5: { 679 Fill5(); 680 return true; 681 } 682 case 6: { 683 Fill6(); 684 return true; 685 } 686 default: { 687 Fill7(); 688 return true; 689 } 690 } 691 } Fill1()692 void Fill1() { 693 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 694 begin_ += 1; 695 buffer_len_ += 8; 696 } Read1to6Bytes()697 bool Read1to6Bytes() { 698 switch (end_ - begin_) { 699 case 0: { 700 return false; 701 } 702 case 1: { 703 Fill1(); 704 return true; 705 } 706 case 2: { 707 Fill2(); 708 return true; 709 } 710 case 3: { 711 Fill3(); 712 return true; 713 } 714 case 4: { 715 Fill4(); 716 return true; 717 } 718 case 5: { 719 Fill5(); 720 return true; 721 } 722 default: { 723 Fill6(); 724 return true; 725 } 726 } 727 } Done0()728 void Done0() { 729 done_ = true; 730 switch (end_ - begin_) { 731 case 1: { 732 Fill1(); 733 break; 734 } 735 } 736 switch (buffer_len_) { 737 case 1: 738 case 2: 739 case 3: 740 case 4: { 741 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 742 return; 743 } 744 case 5: { 745 const auto index = buffer_ & 31; 746 const auto op = GetOp2(index); 747 switch (op & 3) { 748 case 0: { 749 sink_(GetEmit2(index, (op >> 2) + 0)); 750 break; 751 } 752 case 1: { 753 ok_ = false; 754 break; 755 } 756 } 757 return; 758 } 759 case 6: { 760 const auto index = buffer_ & 63; 761 const auto op = GetOp3(index); 762 switch (op & 3) { 763 case 0: { 764 ok_ = false; 765 break; 766 } 767 case 1: { 768 sink_(GetEmit3(index, (op >> 2) + 0)); 769 break; 770 } 771 } 772 return; 773 } 774 case 7: { 775 const auto index = buffer_ & 127; 776 const auto op = GetOp4(index); 777 switch (op & 3) { 778 case 0: { 779 ok_ = false; 780 break; 781 } 782 case 1: { 783 sink_(GetEmit4(index, (op >> 2) + 0)); 784 break; 785 } 786 } 787 return; 788 } 789 case 8: { 790 const auto index = buffer_ & 255; 791 const auto op = GetOp5(index); 792 switch (op & 3) { 793 case 0: { 794 ok_ = false; 795 break; 796 } 797 case 1: { 798 sink_(GetEmit5(index, (op >> 2) + 0)); 799 break; 800 } 801 } 802 return; 803 } 804 case 9: { 805 const auto index = buffer_ & 511; 806 const auto op = GetOp6(index); 807 switch (op & 3) { 808 case 0: { 809 ok_ = false; 810 break; 811 } 812 case 1: { 813 sink_(GetEmit6(index, (op >> 2) + 0)); 814 break; 815 } 816 } 817 return; 818 } 819 case 10: { 820 const auto index = buffer_ & 1023; 821 const auto op = GetOp7(index); 822 switch (op & 3) { 823 case 0: { 824 sink_(GetEmit7(index, (op >> 2) + 0)); 825 sink_(GetEmit7(index, (op >> 2) + 1)); 826 break; 827 } 828 case 1: { 829 ok_ = false; 830 break; 831 } 832 case 2: { 833 sink_(GetEmit7(index, (op >> 2) + 0)); 834 break; 835 } 836 } 837 return; 838 } 839 case 11: { 840 const auto index = buffer_ & 2047; 841 const auto op = GetOp8(index); 842 switch (op & 3) { 843 case 0: { 844 ok_ = false; 845 break; 846 } 847 case 1: { 848 sink_(GetEmit8(index, (op >> 2) + 0)); 849 sink_(GetEmit8(index, (op >> 2) + 1)); 850 break; 851 } 852 case 2: { 853 sink_(GetEmit8(index, (op >> 2) + 0)); 854 break; 855 } 856 } 857 return; 858 } 859 case 0: { 860 return; 861 } 862 } 863 } DecodeStep0()864 void DecodeStep0() { 865 if (!RefillTo1()) { 866 Done1(); 867 return; 868 } 869 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 870 const auto op = GetOp9(index); 871 const int consumed = op & 1; 872 buffer_len_ -= consumed; 873 const auto emit_ofs = op >> 1; 874 sink_(GetEmit9(index, emit_ofs + 0)); 875 } RefillTo1()876 bool RefillTo1() { 877 switch (buffer_len_) { 878 case 0: { 879 return Read1to8Bytes(); 880 } 881 } 882 return true; 883 } Read1to8Bytes()884 bool Read1to8Bytes() { 885 switch (end_ - begin_) { 886 case 0: { 887 return false; 888 } 889 case 1: { 890 Fill1(); 891 return true; 892 } 893 case 2: { 894 Fill2(); 895 return true; 896 } 897 case 3: { 898 Fill3(); 899 return true; 900 } 901 case 4: { 902 Fill4(); 903 return true; 904 } 905 case 5: { 906 Fill5(); 907 return true; 908 } 909 case 6: { 910 Fill6(); 911 return true; 912 } 913 case 7: { 914 Fill7(); 915 return true; 916 } 917 default: { 918 Fill8(); 919 return true; 920 } 921 } 922 } Done1()923 void Done1() { 924 done_ = true; 925 ok_ = false; 926 } DecodeStep1()927 void DecodeStep1() { 928 if (!RefillTo1()) { 929 Done2(); 930 return; 931 } 932 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 933 const auto op = GetOp10(index); 934 const int consumed = op & 1; 935 buffer_len_ -= consumed; 936 const auto emit_ofs = op >> 1; 937 sink_(GetEmit10(index, emit_ofs + 0)); 938 } Done2()939 void Done2() { 940 done_ = true; 941 ok_ = false; 942 } DecodeStep2()943 void DecodeStep2() { 944 if (!RefillTo1()) { 945 Done3(); 946 return; 947 } 948 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 949 const auto op = GetOp11(index); 950 const int consumed = op & 1; 951 buffer_len_ -= consumed; 952 const auto emit_ofs = op >> 1; 953 sink_(GetEmit11(index, emit_ofs + 0)); 954 } Done3()955 void Done3() { 956 done_ = true; 957 ok_ = false; 958 } DecodeStep3()959 void DecodeStep3() { 960 if (!RefillTo11()) { 961 Done4(); 962 return; 963 } 964 const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff; 965 const auto op = GetOp12(index); 966 const int consumed = op & 15; 967 buffer_len_ -= consumed; 968 const auto emit_ofs = op >> 8; 969 switch ((op >> 4) & 15) { 970 case 0: { 971 sink_(GetEmit12(index, emit_ofs + 0)); 972 break; 973 } 974 case 1: { 975 DecodeStep4(); 976 break; 977 } 978 case 2: { 979 DecodeStep5(); 980 break; 981 } 982 case 3: { 983 DecodeStep6(); 984 break; 985 } 986 case 4: { 987 DecodeStep7(); 988 break; 989 } 990 case 5: { 991 DecodeStep8(); 992 break; 993 } 994 case 6: { 995 DecodeStep9(); 996 break; 997 } 998 case 7: { 999 DecodeStep10(); 1000 break; 1001 } 1002 case 8: { 1003 DecodeStep11(); 1004 break; 1005 } 1006 case 9: { 1007 DecodeStep14(); 1008 break; 1009 } 1010 case 10: { 1011 DecodeStep12(); 1012 break; 1013 } 1014 case 11: { 1015 DecodeStep13(); 1016 break; 1017 } 1018 } 1019 } RefillTo11()1020 bool RefillTo11() { 1021 switch (buffer_len_) { 1022 case 0: { 1023 return Read2to8Bytes(); 1024 } 1025 case 1: 1026 case 2: { 1027 return Read2to7Bytes(); 1028 } 1029 case 3: 1030 case 4: 1031 case 5: 1032 case 6: 1033 case 7: 1034 case 8: { 1035 return Read1to7Bytes(); 1036 } 1037 case 9: 1038 case 10: { 1039 return Read1to6Bytes(); 1040 } 1041 } 1042 return true; 1043 } Done4()1044 void Done4() { 1045 done_ = true; 1046 switch (end_ - begin_) { 1047 case 1: { 1048 Fill1(); 1049 break; 1050 } 1051 } 1052 switch (buffer_len_) { 1053 case 1: { 1054 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1055 return; 1056 } 1057 case 2: { 1058 const auto index = buffer_ & 3; 1059 const auto op = GetOp13(index); 1060 switch (op & 3) { 1061 case 0: { 1062 sink_(GetEmit13(index, (op >> 2) + 0)); 1063 break; 1064 } 1065 case 1: { 1066 ok_ = false; 1067 break; 1068 } 1069 } 1070 return; 1071 } 1072 case 3: { 1073 const auto index = buffer_ & 7; 1074 const auto op = GetOp14(index); 1075 switch (op & 3) { 1076 case 0: { 1077 ok_ = false; 1078 break; 1079 } 1080 case 1: { 1081 sink_(GetEmit14(index, (op >> 2) + 0)); 1082 break; 1083 } 1084 } 1085 return; 1086 } 1087 case 4: { 1088 const auto index = buffer_ & 15; 1089 const auto op = GetOp15(index); 1090 switch (op & 3) { 1091 case 0: { 1092 ok_ = false; 1093 break; 1094 } 1095 case 1: { 1096 sink_(GetEmit15(index, (op >> 2) + 0)); 1097 break; 1098 } 1099 } 1100 return; 1101 } 1102 case 5: { 1103 const auto index = buffer_ & 31; 1104 const auto op = GetOp16(index); 1105 switch (op & 3) { 1106 case 0: { 1107 ok_ = false; 1108 break; 1109 } 1110 case 1: { 1111 sink_(GetEmit16(index, (op >> 2) + 0)); 1112 break; 1113 } 1114 } 1115 return; 1116 } 1117 case 6: { 1118 const auto index = buffer_ & 63; 1119 const auto op = GetOp17(index); 1120 switch (op & 3) { 1121 case 0: { 1122 ok_ = false; 1123 break; 1124 } 1125 case 1: { 1126 sink_(GetEmit17(index, (op >> 2) + 0)); 1127 break; 1128 } 1129 } 1130 return; 1131 } 1132 case 7: { 1133 const auto index = buffer_ & 127; 1134 const auto op = GetOp18(index); 1135 switch (op & 3) { 1136 case 0: { 1137 sink_(GetEmit18(index, (op >> 2) + 0)); 1138 sink_(GetEmit18(index, (op >> 2) + 1)); 1139 break; 1140 } 1141 case 1: { 1142 ok_ = false; 1143 break; 1144 } 1145 case 2: { 1146 sink_(GetEmit18(index, (op >> 2) + 0)); 1147 break; 1148 } 1149 } 1150 return; 1151 } 1152 case 8: { 1153 const auto index = buffer_ & 255; 1154 const auto op = GetOp19(index); 1155 switch (op & 3) { 1156 case 0: { 1157 ok_ = false; 1158 break; 1159 } 1160 case 1: { 1161 sink_(GetEmit19(index, (op >> 2) + 0)); 1162 sink_(GetEmit19(index, (op >> 2) + 1)); 1163 break; 1164 } 1165 case 2: { 1166 sink_(GetEmit19(index, (op >> 2) + 0)); 1167 break; 1168 } 1169 } 1170 return; 1171 } 1172 case 9: { 1173 const auto index = buffer_ & 511; 1174 const auto op = GetOp20(index); 1175 switch (op & 3) { 1176 case 0: { 1177 ok_ = false; 1178 break; 1179 } 1180 case 1: { 1181 sink_(GetEmit20(index, (op >> 2) + 0)); 1182 sink_(GetEmit20(index, (op >> 2) + 1)); 1183 break; 1184 } 1185 case 2: { 1186 sink_(GetEmit20(index, (op >> 2) + 0)); 1187 break; 1188 } 1189 } 1190 return; 1191 } 1192 case 10: { 1193 const auto index = buffer_ & 1023; 1194 const auto op = GetOp21(index); 1195 switch (op & 3) { 1196 case 0: { 1197 ok_ = false; 1198 break; 1199 } 1200 case 1: { 1201 sink_(GetEmit21(index, (op >> 2) + 0)); 1202 sink_(GetEmit21(index, (op >> 2) + 1)); 1203 break; 1204 } 1205 case 2: { 1206 sink_(GetEmit21(index, (op >> 2) + 0)); 1207 break; 1208 } 1209 } 1210 return; 1211 } 1212 case 0: { 1213 return; 1214 } 1215 } 1216 } DecodeStep4()1217 void DecodeStep4() { 1218 if (!RefillTo1()) { 1219 Done5(); 1220 return; 1221 } 1222 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1223 const auto op = GetOp22(index); 1224 const int consumed = op & 1; 1225 buffer_len_ -= consumed; 1226 const auto emit_ofs = op >> 1; 1227 sink_(GetEmit22(index, emit_ofs + 0)); 1228 } Done5()1229 void Done5() { 1230 done_ = true; 1231 ok_ = false; 1232 } DecodeStep5()1233 void DecodeStep5() { 1234 if (!RefillTo1()) { 1235 Done6(); 1236 return; 1237 } 1238 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1239 const auto op = GetOp23(index); 1240 const int consumed = op & 1; 1241 buffer_len_ -= consumed; 1242 const auto emit_ofs = op >> 1; 1243 sink_(GetEmit23(index, emit_ofs + 0)); 1244 } Done6()1245 void Done6() { 1246 done_ = true; 1247 ok_ = false; 1248 } DecodeStep6()1249 void DecodeStep6() { 1250 if (!RefillTo1()) { 1251 Done7(); 1252 return; 1253 } 1254 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1255 const auto op = GetOp24(index); 1256 const int consumed = op & 1; 1257 buffer_len_ -= consumed; 1258 const auto emit_ofs = op >> 1; 1259 sink_(GetEmit24(index, emit_ofs + 0)); 1260 } Done7()1261 void Done7() { 1262 done_ = true; 1263 ok_ = false; 1264 } DecodeStep7()1265 void DecodeStep7() { 1266 if (!RefillTo1()) { 1267 Done8(); 1268 return; 1269 } 1270 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1271 const auto op = GetOp25(index); 1272 const int consumed = op & 1; 1273 buffer_len_ -= consumed; 1274 const auto emit_ofs = op >> 1; 1275 sink_(GetEmit25(index, emit_ofs + 0)); 1276 } Done8()1277 void Done8() { 1278 done_ = true; 1279 ok_ = false; 1280 } DecodeStep8()1281 void DecodeStep8() { 1282 if (!RefillTo1()) { 1283 Done9(); 1284 return; 1285 } 1286 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1287 const auto op = GetOp26(index); 1288 const int consumed = op & 1; 1289 buffer_len_ -= consumed; 1290 const auto emit_ofs = op >> 1; 1291 sink_(GetEmit26(index, emit_ofs + 0)); 1292 } Done9()1293 void Done9() { 1294 done_ = true; 1295 ok_ = false; 1296 } DecodeStep9()1297 void DecodeStep9() { 1298 if (!RefillTo1()) { 1299 Done10(); 1300 return; 1301 } 1302 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1303 const auto op = GetOp27(index); 1304 const int consumed = op & 1; 1305 buffer_len_ -= consumed; 1306 const auto emit_ofs = op >> 1; 1307 sink_(GetEmit27(index, emit_ofs + 0)); 1308 } Done10()1309 void Done10() { 1310 done_ = true; 1311 ok_ = false; 1312 } DecodeStep10()1313 void DecodeStep10() { 1314 if (!RefillTo2()) { 1315 Done11(); 1316 return; 1317 } 1318 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1319 const auto op = GetOp28(index); 1320 const int consumed = op & 3; 1321 buffer_len_ -= consumed; 1322 const auto emit_ofs = op >> 2; 1323 sink_(GetEmit28(index, emit_ofs + 0)); 1324 } RefillTo2()1325 bool RefillTo2() { 1326 switch (buffer_len_) { 1327 case 0: { 1328 return Read1to8Bytes(); 1329 } 1330 case 1: { 1331 return Read1to7Bytes(); 1332 } 1333 } 1334 return true; 1335 } Done11()1336 void Done11() { 1337 done_ = true; 1338 switch (buffer_len_) { 1339 case 1: 1340 case 0: { 1341 ok_ = false; 1342 return; 1343 } 1344 } 1345 } DecodeStep11()1346 void DecodeStep11() { 1347 if (!RefillTo3()) { 1348 Done12(); 1349 return; 1350 } 1351 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1352 const auto op = GetOp29(index); 1353 const int consumed = op & 3; 1354 buffer_len_ -= consumed; 1355 const auto emit_ofs = op >> 2; 1356 sink_(GetEmit29(index, emit_ofs + 0)); 1357 } RefillTo3()1358 bool RefillTo3() { 1359 switch (buffer_len_) { 1360 case 0: { 1361 return Read1to8Bytes(); 1362 } 1363 case 1: 1364 case 2: { 1365 return Read1to7Bytes(); 1366 } 1367 } 1368 return true; 1369 } Done12()1370 void Done12() { 1371 done_ = true; 1372 switch (buffer_len_) { 1373 case 1: 1374 case 2: 1375 case 0: { 1376 ok_ = false; 1377 return; 1378 } 1379 } 1380 } DecodeStep12()1381 void DecodeStep12() { 1382 if (!RefillTo4()) { 1383 Done13(); 1384 return; 1385 } 1386 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1387 const auto op = GetOp30(index); 1388 const int consumed = op & 7; 1389 buffer_len_ -= consumed; 1390 const auto emit_ofs = op >> 3; 1391 sink_(GetEmit30(index, emit_ofs + 0)); 1392 } RefillTo4()1393 bool RefillTo4() { 1394 switch (buffer_len_) { 1395 case 0: { 1396 return Read1to8Bytes(); 1397 } 1398 case 1: 1399 case 2: 1400 case 3: { 1401 return Read1to7Bytes(); 1402 } 1403 } 1404 return true; 1405 } Done13()1406 void Done13() { 1407 done_ = true; 1408 switch (buffer_len_) { 1409 case 1: 1410 case 2: 1411 case 3: 1412 case 0: { 1413 ok_ = false; 1414 return; 1415 } 1416 } 1417 } DecodeStep13()1418 void DecodeStep13() { 1419 if (!RefillTo7()) { 1420 Done14(); 1421 return; 1422 } 1423 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 1424 const auto op = GetOp31(index); 1425 const int consumed = op & 7; 1426 buffer_len_ -= consumed; 1427 const auto emit_ofs = op >> 4; 1428 switch ((op >> 3) & 1) { 1429 case 0: { 1430 sink_(GetEmit31(index, emit_ofs + 0)); 1431 break; 1432 } 1433 case 1: { 1434 begin_ = end_; 1435 buffer_len_ = 0; 1436 break; 1437 } 1438 } 1439 } RefillTo7()1440 bool RefillTo7() { 1441 switch (buffer_len_) { 1442 case 0: { 1443 return Read1to8Bytes(); 1444 } 1445 case 1: 1446 case 2: 1447 case 3: 1448 case 4: 1449 case 5: 1450 case 6: { 1451 return Read1to7Bytes(); 1452 } 1453 } 1454 return true; 1455 } Done14()1456 void Done14() { 1457 done_ = true; 1458 switch (buffer_len_) { 1459 case 1: 1460 case 2: 1461 case 3: { 1462 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1463 return; 1464 } 1465 case 4: { 1466 const auto index = buffer_ & 15; 1467 const auto op = GetOp32(index); 1468 switch (op & 3) { 1469 case 0: { 1470 sink_(GetEmit32(index, (op >> 2) + 0)); 1471 break; 1472 } 1473 case 1: { 1474 ok_ = false; 1475 break; 1476 } 1477 } 1478 return; 1479 } 1480 case 5: { 1481 const auto index = buffer_ & 31; 1482 const auto op = GetOp33(index); 1483 switch (op & 3) { 1484 case 0: { 1485 ok_ = false; 1486 break; 1487 } 1488 case 1: { 1489 sink_(GetEmit33(index, (op >> 2) + 0)); 1490 break; 1491 } 1492 } 1493 return; 1494 } 1495 case 6: { 1496 const auto index = buffer_ & 63; 1497 const auto op = GetOp34(index); 1498 switch (op & 3) { 1499 case 0: { 1500 ok_ = false; 1501 break; 1502 } 1503 case 1: { 1504 sink_(GetEmit34(index, (op >> 2) + 0)); 1505 break; 1506 } 1507 } 1508 return; 1509 } 1510 case 0: { 1511 return; 1512 } 1513 } 1514 } DecodeStep14()1515 void DecodeStep14() { 1516 if (!RefillTo4()) { 1517 Done15(); 1518 return; 1519 } 1520 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1521 const auto op = GetOp35(index); 1522 const int consumed = op & 7; 1523 buffer_len_ -= consumed; 1524 const auto emit_ofs = op >> 3; 1525 sink_(GetEmit35(index, emit_ofs + 0)); 1526 } Done15()1527 void Done15() { 1528 done_ = true; 1529 switch (buffer_len_) { 1530 case 1: 1531 case 2: 1532 case 0: { 1533 ok_ = false; 1534 return; 1535 } 1536 case 3: { 1537 const auto index = buffer_ & 7; 1538 const auto op = GetOp36(index); 1539 switch (op & 1) { 1540 case 0: { 1541 sink_(GetEmit36(index, (op >> 1) + 0)); 1542 break; 1543 } 1544 case 1: { 1545 ok_ = false; 1546 break; 1547 } 1548 } 1549 return; 1550 } 1551 } 1552 } 1553 F sink_; 1554 const uint8_t* begin_; 1555 const uint8_t* const end_; 1556 uint64_t buffer_ = 0; 1557 int buffer_len_ = 0; 1558 bool ok_ = true; 1559 bool done_ = false; 1560 }; 1561 } // namespace geometry_12_11_7 1562 } // namespace grpc_core 1563 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_12_11_7_H 1564