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