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