1 // Copyright 2023 gRPC authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // This file is autogenerated: see 16 // tools/codegen/core/gen_huffman_decompressor.cc 17 18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_7_12_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_7_12_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_11_7_12 { 26 class HuffDecoderCommon { 27 protected: GetOp2(size_t i)28 static inline uint64_t GetOp2(size_t i) { return table2_0_ops_[i]; } GetEmit2(size_t,size_t emit)29 static inline uint64_t GetEmit2(size_t, size_t emit) { 30 return table2_0_emit_[emit]; 31 } GetOp3(size_t i)32 static inline uint64_t GetOp3(size_t i) { return table3_0_ops_[i]; } GetEmit3(size_t,size_t emit)33 static inline uint64_t GetEmit3(size_t, size_t emit) { 34 return table3_0_emit_[emit]; 35 } GetOp4(size_t i)36 static inline uint64_t GetOp4(size_t i) { 37 return table4_ops_[i >> 6][i & 0x3f]; 38 } GetEmit4(size_t i,size_t emit)39 static inline uint64_t GetEmit4(size_t i, size_t emit) { 40 return table4_emit_[i >> 6][emit]; 41 } GetOp5(size_t i)42 static inline uint64_t GetOp5(size_t i) { 43 return table5_ops_[i >> 7][i & 0x7f]; 44 } GetEmit5(size_t i,size_t emit)45 static inline uint64_t GetEmit5(size_t i, size_t emit) { 46 return table5_emit_[i >> 7][emit]; 47 } GetOp6(size_t i)48 static inline uint64_t GetOp6(size_t i) { 49 return table6_ops_[i >> 5][i & 0x1f]; 50 } GetEmit6(size_t i,size_t emit)51 static inline uint64_t GetEmit6(size_t i, size_t emit) { 52 return table6_emit_[i >> 5][emit]; 53 } GetOp7(size_t i)54 static inline uint64_t GetOp7(size_t i) { 55 return table7_ops_[i >> 6][i & 0x3f]; 56 } GetEmit7(size_t i,size_t emit)57 static inline uint64_t GetEmit7(size_t i, size_t emit) { 58 return table7_emit_[i >> 6][emit]; 59 } GetOp1(size_t i)60 static inline uint64_t GetOp1(size_t i) { 61 return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]]; 62 } GetEmit1(size_t i,size_t emit)63 static inline uint64_t GetEmit1(size_t i, size_t emit) { 64 return table1_emit_[i >> 6][emit]; 65 } GetOp8(size_t i)66 static inline uint64_t GetOp8(size_t i) { return i ? 3 : 1; } GetEmit8(size_t,size_t emit)67 static inline uint64_t GetEmit8(size_t, size_t emit) { 68 return emit ? 62 : 35; 69 } GetOp9(size_t i)70 static inline uint64_t GetOp9(size_t i) { 71 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 72 } GetEmit9(size_t,size_t emit)73 static inline uint64_t GetEmit9(size_t, size_t emit) { 74 return (emit < 2 ? (emit ? 36 : 0) : ((emit - 2) ? 91 : 64)); 75 } GetOp11(size_t i)76 static inline uint64_t GetOp11(size_t i) { 77 return (i < 2 ? (i ? 4 : 0) : ((i - 2) + 1)); 78 } GetEmit11(size_t,size_t emit)79 static inline uint64_t GetEmit11(size_t, size_t emit) { 80 return emit ? 126 : 93; 81 } GetOp12(size_t i)82 static inline uint64_t GetOp12(size_t i) { 83 return table12_0_inner_[table12_0_outer_[i]]; 84 } GetEmit12(size_t,size_t emit)85 static inline uint64_t GetEmit12(size_t, size_t emit) { 86 return (emit < 2 ? (emit ? 126 : 93) : ((emit - 2) ? 125 : 94)); 87 } GetOp13(size_t i)88 static inline uint64_t GetOp13(size_t i) { 89 return table13_0_inner_[table13_0_outer_[i]]; 90 } GetEmit13(size_t,size_t emit)91 static inline uint64_t GetEmit13(size_t, size_t emit) { 92 return table13_0_emit_[emit]; 93 } GetOp14(size_t i)94 static inline uint64_t GetOp14(size_t i) { return table14_0_ops_[i]; } GetEmit14(size_t,size_t emit)95 static inline uint64_t GetEmit14(size_t, size_t emit) { 96 return table13_0_emit_[emit]; 97 } GetOp15(size_t i)98 static inline uint64_t GetOp15(size_t i) { return table15_0_ops_[i]; } GetEmit15(size_t,size_t emit)99 static inline uint64_t GetEmit15(size_t, size_t emit) { 100 return table13_0_emit_[emit]; 101 } GetOp10(size_t i)102 static inline uint64_t GetOp10(size_t i) { 103 return table10_ops_[i >> 5][i & 0x1f]; 104 } GetEmit10(size_t i,size_t emit)105 static inline uint64_t GetEmit10(size_t i, size_t emit) { 106 return table10_emit_[i >> 5][emit]; 107 } GetOp16(size_t i)108 static inline uint64_t GetOp16(size_t i) { return i ? 3 : 1; } GetEmit16(size_t,size_t emit)109 static inline uint64_t GetEmit16(size_t, size_t emit) { 110 return emit ? 195 : 92; 111 } GetOp17(size_t i)112 static inline uint64_t GetOp17(size_t i) { 113 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 114 } GetEmit17(size_t,size_t emit)115 static inline uint64_t GetEmit17(size_t, size_t emit) { 116 return (emit < 2 ? (emit ? 162 : 131) : ((emit - 2) ? 194 : 184)); 117 } GetOp18(size_t i)118 static inline uint64_t GetOp18(size_t i) { return table18_0_inner_[i]; } GetEmit18(size_t,size_t emit)119 static inline uint64_t GetEmit18(size_t, size_t emit) { 120 return table18_0_emit_[emit]; 121 } GetOp20(size_t i)122 static inline uint64_t GetOp20(size_t i) { return i; } GetEmit20(size_t,size_t emit)123 static inline uint64_t GetEmit20(size_t, size_t emit) { 124 return ((void)emit, 208); 125 } GetOp19(size_t i)126 static inline uint64_t GetOp19(size_t i) { 127 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 128 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 129 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 130 } GetEmit19(size_t,size_t emit)131 static inline uint64_t GetEmit19(size_t, size_t emit) { 132 return (emit < 1 ? (((void)emit, 208)) : ((emit - 1) ? 130 : 128)); 133 } GetOp22(size_t i)134 static inline uint64_t GetOp22(size_t i) { 135 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 136 } GetEmit22(size_t,size_t emit)137 static inline uint64_t GetEmit22(size_t, size_t emit) { 138 return ((void)emit, 230); 139 } GetOp21(size_t i)140 static inline uint64_t GetOp21(size_t i) { 141 return table21_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 142 } GetEmit21(size_t,size_t emit)143 static inline uint64_t GetEmit21(size_t, size_t emit) { 144 return table21_0_emit_[emit]; 145 } GetOp24(size_t i)146 static inline uint64_t GetOp24(size_t i) { 147 return ((i < 2 ? (i) : (((void)(i - 2), 2))) < 1 148 ? (((void)(i < 2 ? (i) : (((void)(i - 2), 2))), 0)) 149 : (((i < 2 ? (i) : (((void)(i - 2), 2))) - 1) ? 1 : 2)); 150 } GetEmit24(size_t,size_t emit)151 static inline uint64_t GetEmit24(size_t, size_t emit) { 152 return emit ? 226 : 224; 153 } GetOp23(size_t i)154 static inline uint64_t GetOp23(size_t i) { 155 return table23_0_inner_[(i < 3 ? (i / 2 + 0) : ((i - 3) + 1))]; 156 } GetEmit23(size_t,size_t emit)157 static inline uint64_t GetEmit23(size_t, size_t emit) { 158 return table23_0_emit_[emit]; 159 } GetOp26(size_t i)160 static inline uint64_t GetOp26(size_t i) { 161 return table26_0_inner_[(i < 12 ? (i) : (((void)(i - 12), 12)))]; 162 } GetEmit26(size_t,size_t emit)163 static inline uint64_t GetEmit26(size_t, size_t emit) { 164 return table26_0_emit_[emit]; 165 } GetOp25(size_t i)166 static inline uint64_t GetOp25(size_t i) { return table25_0_ops_[i]; } GetEmit25(size_t,size_t emit)167 static inline uint64_t GetEmit25(size_t, size_t emit) { 168 return table25_0_emit_[emit]; 169 } GetOp28(size_t i)170 static inline uint64_t GetOp28(size_t i) { return table28_0_ops_[i]; } GetEmit28(size_t,size_t emit)171 static inline uint64_t GetEmit28(size_t, size_t emit) { 172 return table28_0_emit_[emit]; 173 } GetOp29(size_t i)174 static inline uint64_t GetOp29(size_t i) { return table29_0_ops_[i]; } GetEmit29(size_t,size_t emit)175 static inline uint64_t GetEmit29(size_t, size_t emit) { 176 return table29_0_emit_[emit]; 177 } GetOp30(size_t i)178 static inline uint64_t GetOp30(size_t i) { return table30_0_ops_[i]; } GetEmit30(size_t,size_t emit)179 static inline uint64_t GetEmit30(size_t, size_t emit) { 180 return table30_0_emit_[emit]; 181 } GetOp31(size_t i)182 static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; } GetEmit31(size_t,size_t emit)183 static inline uint64_t GetEmit31(size_t, size_t emit) { 184 return table31_0_emit_[emit]; 185 } GetOp32(size_t i)186 static inline uint64_t GetOp32(size_t i) { 187 return table32_ops_[i >> 6][i & 0x3f]; 188 } GetEmit32(size_t i,size_t emit)189 static inline uint64_t GetEmit32(size_t i, size_t emit) { 190 return table32_emit_[i >> 6][emit]; 191 } GetOp33(size_t i)192 static inline uint64_t GetOp33(size_t i) { 193 return table33_ops_[i >> 6][i & 0x3f]; 194 } GetEmit33(size_t i,size_t emit)195 static inline uint64_t GetEmit33(size_t i, size_t emit) { 196 return table33_emit_[i >> 6][emit]; 197 } GetOp34(size_t i)198 static inline uint64_t GetOp34(size_t i) { 199 return table34_ops_[i >> 6][i & 0x3f]; 200 } GetEmit34(size_t i,size_t emit)201 static inline uint64_t GetEmit34(size_t i, size_t emit) { 202 return table34_emit_[i >> 6][emit]; 203 } GetOp27(size_t i)204 static inline uint64_t GetOp27(size_t i) { 205 return table27_ops_[i >> 7][i & 0x7f]; 206 } GetEmit27(size_t i,size_t emit)207 static inline uint64_t GetEmit27(size_t i, size_t emit) { 208 return table27_emit_[i >> 7][emit]; 209 } 210 211 private: 212 static const uint8_t table2_0_emit_[10]; 213 static const uint8_t table2_0_ops_[32]; 214 static const uint8_t table3_0_emit_[36]; 215 static const uint8_t table3_0_ops_[64]; 216 static const uint8_t table4_0_emit_[22]; 217 static const uint8_t table4_0_ops_[64]; 218 static const uint8_t table4_1_emit_[46]; 219 static const uint8_t table4_1_ops_[64]; 220 static const uint8_t* const table4_emit_[2]; 221 static const uint8_t* const table4_ops_[2]; 222 static const uint8_t table5_0_ops_[128]; 223 static const uint8_t table5_1_emit_[52]; 224 static const uint8_t table5_1_ops_[128]; 225 static const uint8_t* const table5_emit_[2]; 226 static const uint8_t* const table5_ops_[2]; 227 static const uint8_t table6_0_emit_[2]; 228 static const uint8_t table6_0_ops_[32]; 229 static const uint8_t table6_1_emit_[2]; 230 static const uint8_t table6_2_emit_[2]; 231 static const uint8_t table6_3_emit_[2]; 232 static const uint8_t table6_4_emit_[2]; 233 static const uint8_t table6_5_emit_[4]; 234 static const uint8_t table6_5_ops_[32]; 235 static const uint8_t table6_6_emit_[4]; 236 static const uint8_t table6_7_emit_[4]; 237 static const uint8_t table6_8_emit_[4]; 238 static const uint8_t table6_9_emit_[4]; 239 static const uint8_t table6_10_emit_[4]; 240 static const uint8_t table6_11_emit_[6]; 241 static const uint8_t table6_11_ops_[32]; 242 static const uint8_t table6_12_emit_[8]; 243 static const uint8_t table6_12_ops_[32]; 244 static const uint8_t table6_13_emit_[8]; 245 static const uint8_t table6_14_emit_[8]; 246 static const uint8_t table6_15_emit_[10]; 247 static const uint8_t table6_15_ops_[32]; 248 static const uint8_t* const table6_emit_[16]; 249 static const uint8_t* const table6_ops_[16]; 250 static const uint8_t table7_0_emit_[36]; 251 static const uint8_t table7_0_ops_[64]; 252 static const uint8_t table7_1_emit_[36]; 253 static const uint8_t table7_1_ops_[64]; 254 static const uint8_t table7_2_emit_[36]; 255 static const uint8_t table7_2_ops_[64]; 256 static const uint8_t table7_3_emit_[36]; 257 static const uint8_t table7_3_ops_[64]; 258 static const uint8_t table7_4_emit_[38]; 259 static const uint8_t table7_4_ops_[64]; 260 static const uint8_t table7_5_ops_[64]; 261 static const uint8_t table7_11_ops_[64]; 262 static const uint8_t table7_12_ops_[64]; 263 static const uint8_t table7_15_emit_[15]; 264 static const uint8_t table7_15_ops_[64]; 265 static const uint8_t* const table7_emit_[16]; 266 static const uint8_t* const table7_ops_[16]; 267 static const uint8_t table1_0_emit_[71]; 268 static const uint16_t table1_0_inner_[37]; 269 static const uint8_t table1_0_outer_[64]; 270 static const uint8_t table1_1_emit_[71]; 271 static const uint16_t table1_1_inner_[37]; 272 static const uint8_t table1_2_emit_[71]; 273 static const uint16_t table1_2_inner_[37]; 274 static const uint8_t table1_3_emit_[71]; 275 static const uint16_t table1_3_inner_[37]; 276 static const uint8_t table1_4_emit_[71]; 277 static const uint16_t table1_4_inner_[37]; 278 static const uint8_t table1_5_emit_[71]; 279 static const uint16_t table1_5_inner_[37]; 280 static const uint8_t table1_6_emit_[71]; 281 static const uint16_t table1_6_inner_[37]; 282 static const uint8_t table1_7_emit_[71]; 283 static const uint16_t table1_7_inner_[37]; 284 static const uint8_t table1_8_emit_[71]; 285 static const uint16_t table1_8_inner_[37]; 286 static const uint8_t table1_9_emit_[71]; 287 static const uint16_t table1_9_inner_[37]; 288 static const uint8_t table1_10_emit_[40]; 289 static const uint16_t table1_10_inner_[22]; 290 static const uint8_t table1_10_outer_[64]; 291 static const uint8_t table1_11_emit_[40]; 292 static const uint8_t table1_12_emit_[40]; 293 static const uint8_t table1_13_emit_[40]; 294 static const uint8_t table1_14_emit_[40]; 295 static const uint8_t table1_15_emit_[40]; 296 static const uint8_t table1_16_emit_[40]; 297 static const uint8_t table1_17_emit_[40]; 298 static const uint8_t table1_18_emit_[40]; 299 static const uint8_t table1_19_emit_[40]; 300 static const uint8_t table1_20_emit_[40]; 301 static const uint8_t table1_21_emit_[40]; 302 static const uint8_t table1_22_emit_[40]; 303 static const uint8_t table1_23_emit_[4]; 304 static const uint16_t table1_23_inner_[4]; 305 static const uint8_t table1_23_outer_[64]; 306 static const uint8_t table1_24_emit_[4]; 307 static const uint8_t table1_25_emit_[4]; 308 static const uint8_t table1_26_emit_[4]; 309 static const uint8_t table1_27_emit_[4]; 310 static const uint8_t table1_28_emit_[4]; 311 static const uint8_t table1_29_emit_[4]; 312 static const uint8_t table1_30_emit_[4]; 313 static const uint8_t table1_31_emit_[14]; 314 static const uint16_t table1_31_inner_[17]; 315 static const uint8_t table1_31_outer_[64]; 316 static const uint8_t* const table1_emit_[32]; 317 static const uint16_t* const table1_inner_[32]; 318 static const uint8_t* const table1_outer_[32]; 319 static const uint8_t table12_0_inner_[6]; 320 static const uint8_t table12_0_outer_[8]; 321 static const uint8_t table13_0_emit_[7]; 322 static const uint8_t table13_0_inner_[9]; 323 static const uint8_t table13_0_outer_[16]; 324 static const uint8_t table14_0_ops_[32]; 325 static const uint8_t table15_0_ops_[64]; 326 static const uint8_t table10_0_emit_[1]; 327 static const uint16_t table10_0_ops_[32]; 328 static const uint8_t table10_1_emit_[1]; 329 static const uint8_t table10_2_emit_[2]; 330 static const uint16_t table10_2_ops_[32]; 331 static const uint8_t table10_3_emit_[3]; 332 static const uint16_t table10_3_ops_[32]; 333 static const uint8_t* const table10_emit_[4]; 334 static const uint16_t* const table10_ops_[4]; 335 static const uint8_t table18_0_emit_[8]; 336 static const uint8_t table18_0_inner_[8]; 337 static const uint8_t table21_0_emit_[15]; 338 static const uint8_t table21_0_inner_[15]; 339 static const uint8_t table23_0_emit_[6]; 340 static const uint8_t table23_0_inner_[6]; 341 static const uint8_t table26_0_emit_[12]; 342 static const uint8_t table26_0_inner_[13]; 343 static const uint8_t table25_0_emit_[20]; 344 static const uint8_t table25_0_ops_[32]; 345 static const uint8_t table28_0_emit_[21]; 346 static const uint8_t table28_0_ops_[32]; 347 static const uint8_t table29_0_emit_[33]; 348 static const uint8_t table29_0_ops_[64]; 349 static const uint8_t table30_0_emit_[37]; 350 static const uint8_t table30_0_ops_[128]; 351 static const uint8_t table31_0_emit_[52]; 352 static const uint8_t table31_0_ops_[256]; 353 static const uint8_t table32_0_emit_[4]; 354 static const uint8_t table32_0_ops_[64]; 355 static const uint8_t table32_1_emit_[4]; 356 static const uint8_t table32_2_emit_[4]; 357 static const uint8_t table32_3_emit_[4]; 358 static const uint8_t table32_4_emit_[4]; 359 static const uint8_t table32_5_emit_[7]; 360 static const uint8_t table32_5_ops_[64]; 361 static const uint8_t table32_6_emit_[10]; 362 static const uint8_t table32_6_ops_[64]; 363 static const uint8_t table32_7_emit_[34]; 364 static const uint8_t table32_7_ops_[64]; 365 static const uint8_t* const table32_emit_[8]; 366 static const uint8_t* const table32_ops_[8]; 367 static const uint8_t table33_0_emit_[40]; 368 static const uint8_t table33_0_ops_[64]; 369 static const uint8_t table33_1_emit_[40]; 370 static const uint8_t table33_2_emit_[40]; 371 static const uint8_t table33_3_emit_[40]; 372 static const uint8_t table33_4_emit_[40]; 373 static const uint8_t table33_5_emit_[40]; 374 static const uint8_t table33_6_emit_[40]; 375 static const uint8_t table33_7_emit_[40]; 376 static const uint8_t table33_8_emit_[40]; 377 static const uint8_t table33_9_emit_[40]; 378 static const uint8_t table33_10_emit_[22]; 379 static const uint8_t table33_10_ops_[64]; 380 static const uint8_t table33_11_emit_[4]; 381 static const uint8_t table33_12_emit_[4]; 382 static const uint8_t table33_13_emit_[6]; 383 static const uint8_t table33_14_emit_[17]; 384 static const uint8_t table33_14_ops_[64]; 385 static const uint8_t table33_15_emit_[46]; 386 static const uint8_t table33_15_ops_[64]; 387 static const uint8_t* const table33_emit_[16]; 388 static const uint8_t* const table33_ops_[16]; 389 static const uint8_t table34_0_emit_[72]; 390 static const uint16_t table34_0_ops_[64]; 391 static const uint8_t table34_1_emit_[72]; 392 static const uint8_t table34_2_emit_[72]; 393 static const uint8_t table34_3_emit_[72]; 394 static const uint8_t table34_4_emit_[72]; 395 static const uint8_t table34_5_emit_[72]; 396 static const uint8_t table34_6_emit_[72]; 397 static const uint8_t table34_7_emit_[72]; 398 static const uint8_t table34_8_emit_[72]; 399 static const uint8_t table34_9_emit_[72]; 400 static const uint8_t table34_10_emit_[72]; 401 static const uint8_t table34_11_emit_[72]; 402 static const uint8_t table34_12_emit_[72]; 403 static const uint8_t table34_13_emit_[72]; 404 static const uint8_t table34_14_emit_[72]; 405 static const uint8_t table34_15_emit_[72]; 406 static const uint8_t table34_16_emit_[72]; 407 static const uint8_t table34_17_emit_[72]; 408 static const uint8_t table34_18_emit_[72]; 409 static const uint8_t table34_19_emit_[72]; 410 static const uint8_t table34_20_emit_[72]; 411 static const uint8_t table34_21_emit_[40]; 412 static const uint16_t table34_21_ops_[64]; 413 static const uint8_t table34_22_emit_[40]; 414 static const uint8_t table34_23_emit_[40]; 415 static const uint8_t table34_24_emit_[40]; 416 static const uint8_t table34_25_emit_[40]; 417 static const uint8_t table34_26_emit_[40]; 418 static const uint8_t table34_27_emit_[4]; 419 static const uint16_t table34_27_ops_[64]; 420 static const uint8_t table34_28_emit_[8]; 421 static const uint16_t table34_28_ops_[64]; 422 static const uint8_t table34_29_emit_[9]; 423 static const uint16_t table34_29_ops_[64]; 424 static const uint8_t table34_30_emit_[16]; 425 static const uint16_t table34_30_ops_[64]; 426 static const uint8_t table34_31_emit_[30]; 427 static const uint16_t table34_31_ops_[64]; 428 static const uint8_t* const table34_emit_[32]; 429 static const uint16_t* const table34_ops_[32]; 430 static const uint8_t table27_0_emit_[1]; 431 static const uint16_t table27_0_ops_[128]; 432 static const uint8_t table27_1_emit_[1]; 433 static const uint8_t table27_2_emit_[1]; 434 static const uint8_t table27_3_emit_[1]; 435 static const uint8_t table27_4_emit_[1]; 436 static const uint8_t table27_5_emit_[1]; 437 static const uint8_t table27_6_emit_[1]; 438 static const uint8_t table27_7_emit_[1]; 439 static const uint8_t table27_8_emit_[1]; 440 static const uint8_t table27_9_emit_[1]; 441 static const uint8_t table27_10_emit_[1]; 442 static const uint8_t table27_11_emit_[1]; 443 static const uint8_t table27_12_emit_[1]; 444 static const uint8_t table27_13_emit_[1]; 445 static const uint8_t table27_14_emit_[1]; 446 static const uint8_t table27_15_emit_[1]; 447 static const uint8_t table27_16_emit_[1]; 448 static const uint8_t table27_17_emit_[1]; 449 static const uint8_t table27_18_emit_[1]; 450 static const uint8_t table27_19_emit_[1]; 451 static const uint8_t table27_20_emit_[1]; 452 static const uint8_t table27_21_emit_[2]; 453 static const uint16_t table27_21_ops_[128]; 454 static const uint8_t table27_22_emit_[2]; 455 static const uint8_t table27_23_emit_[2]; 456 static const uint8_t table27_24_emit_[2]; 457 static const uint8_t table27_25_emit_[2]; 458 static const uint8_t table27_26_emit_[2]; 459 static const uint16_t table27_27_ops_[128]; 460 static const uint16_t table27_28_ops_[128]; 461 static const uint16_t table27_29_ops_[128]; 462 static const uint16_t table27_30_ops_[128]; 463 static const uint8_t table27_31_emit_[33]; 464 static const uint16_t table27_31_ops_[128]; 465 static const uint8_t* const table27_emit_[32]; 466 static const uint16_t* const table27_ops_[32]; 467 }; 468 template <typename F> 469 class HuffDecoder : public HuffDecoderCommon { 470 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)471 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 472 : sink_(sink), begin_(begin), end_(end) {} Run()473 bool Run() { 474 while (!done_) { 475 if (!RefillTo11()) { 476 Done0(); 477 break; 478 } 479 const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff; 480 const auto op = GetOp1(index); 481 const int consumed = op & 15; 482 buffer_len_ -= consumed; 483 const auto emit_ofs = op >> 7; 484 switch ((op >> 4) & 7) { 485 case 0: { 486 sink_(GetEmit1(index, emit_ofs + 0)); 487 sink_(GetEmit1(index, emit_ofs + 1)); 488 break; 489 } 490 case 1: { 491 sink_(GetEmit1(index, emit_ofs + 0)); 492 break; 493 } 494 case 2: { 495 DecodeStep0(); 496 break; 497 } 498 case 3: { 499 DecodeStep1(); 500 break; 501 } 502 case 4: { 503 DecodeStep2(); 504 break; 505 } 506 } 507 } 508 return ok_; 509 } 510 511 private: RefillTo11()512 bool RefillTo11() { 513 switch (buffer_len_) { 514 case 0: { 515 return Read2to8Bytes(); 516 } 517 case 1: 518 case 2: { 519 return Read2to7Bytes(); 520 } 521 case 3: 522 case 4: 523 case 5: 524 case 6: 525 case 7: 526 case 8: { 527 return Read1to7Bytes(); 528 } 529 case 9: 530 case 10: { 531 return Read1to6Bytes(); 532 } 533 } 534 return true; 535 } Read2to8Bytes()536 bool Read2to8Bytes() { 537 switch (end_ - begin_) { 538 case 0: 539 case 1: { 540 return false; 541 } 542 case 2: { 543 Fill2(); 544 return true; 545 } 546 case 3: { 547 Fill3(); 548 return true; 549 } 550 case 4: { 551 Fill4(); 552 return true; 553 } 554 case 5: { 555 Fill5(); 556 return true; 557 } 558 case 6: { 559 Fill6(); 560 return true; 561 } 562 case 7: { 563 Fill7(); 564 return true; 565 } 566 default: { 567 Fill8(); 568 return true; 569 } 570 } 571 } Fill2()572 void Fill2() { 573 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 574 (static_cast<uint64_t>(begin_[1]) << 0); 575 begin_ += 2; 576 buffer_len_ += 16; 577 } Fill3()578 void Fill3() { 579 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 580 (static_cast<uint64_t>(begin_[1]) << 8) | 581 (static_cast<uint64_t>(begin_[2]) << 0); 582 begin_ += 3; 583 buffer_len_ += 24; 584 } Fill4()585 void Fill4() { 586 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 587 (static_cast<uint64_t>(begin_[1]) << 16) | 588 (static_cast<uint64_t>(begin_[2]) << 8) | 589 (static_cast<uint64_t>(begin_[3]) << 0); 590 begin_ += 4; 591 buffer_len_ += 32; 592 } Fill5()593 void Fill5() { 594 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 595 (static_cast<uint64_t>(begin_[1]) << 24) | 596 (static_cast<uint64_t>(begin_[2]) << 16) | 597 (static_cast<uint64_t>(begin_[3]) << 8) | 598 (static_cast<uint64_t>(begin_[4]) << 0); 599 begin_ += 5; 600 buffer_len_ += 40; 601 } Fill6()602 void Fill6() { 603 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 604 (static_cast<uint64_t>(begin_[1]) << 32) | 605 (static_cast<uint64_t>(begin_[2]) << 24) | 606 (static_cast<uint64_t>(begin_[3]) << 16) | 607 (static_cast<uint64_t>(begin_[4]) << 8) | 608 (static_cast<uint64_t>(begin_[5]) << 0); 609 begin_ += 6; 610 buffer_len_ += 48; 611 } Fill7()612 void Fill7() { 613 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 614 (static_cast<uint64_t>(begin_[1]) << 40) | 615 (static_cast<uint64_t>(begin_[2]) << 32) | 616 (static_cast<uint64_t>(begin_[3]) << 24) | 617 (static_cast<uint64_t>(begin_[4]) << 16) | 618 (static_cast<uint64_t>(begin_[5]) << 8) | 619 (static_cast<uint64_t>(begin_[6]) << 0); 620 begin_ += 7; 621 buffer_len_ += 56; 622 } Fill8()623 void Fill8() { 624 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 625 (static_cast<uint64_t>(begin_[1]) << 48) | 626 (static_cast<uint64_t>(begin_[2]) << 40) | 627 (static_cast<uint64_t>(begin_[3]) << 32) | 628 (static_cast<uint64_t>(begin_[4]) << 24) | 629 (static_cast<uint64_t>(begin_[5]) << 16) | 630 (static_cast<uint64_t>(begin_[6]) << 8) | 631 (static_cast<uint64_t>(begin_[7]) << 0); 632 begin_ += 8; 633 buffer_len_ += 64; 634 } Read2to7Bytes()635 bool Read2to7Bytes() { 636 switch (end_ - begin_) { 637 case 0: 638 case 1: { 639 return false; 640 } 641 case 2: { 642 Fill2(); 643 return true; 644 } 645 case 3: { 646 Fill3(); 647 return true; 648 } 649 case 4: { 650 Fill4(); 651 return true; 652 } 653 case 5: { 654 Fill5(); 655 return true; 656 } 657 case 6: { 658 Fill6(); 659 return true; 660 } 661 default: { 662 Fill7(); 663 return true; 664 } 665 } 666 } Read1to7Bytes()667 bool Read1to7Bytes() { 668 switch (end_ - begin_) { 669 case 0: { 670 return false; 671 } 672 case 1: { 673 Fill1(); 674 return true; 675 } 676 case 2: { 677 Fill2(); 678 return true; 679 } 680 case 3: { 681 Fill3(); 682 return true; 683 } 684 case 4: { 685 Fill4(); 686 return true; 687 } 688 case 5: { 689 Fill5(); 690 return true; 691 } 692 case 6: { 693 Fill6(); 694 return true; 695 } 696 default: { 697 Fill7(); 698 return true; 699 } 700 } 701 } Fill1()702 void Fill1() { 703 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 704 begin_ += 1; 705 buffer_len_ += 8; 706 } Read1to6Bytes()707 bool Read1to6Bytes() { 708 switch (end_ - begin_) { 709 case 0: { 710 return false; 711 } 712 case 1: { 713 Fill1(); 714 return true; 715 } 716 case 2: { 717 Fill2(); 718 return true; 719 } 720 case 3: { 721 Fill3(); 722 return true; 723 } 724 case 4: { 725 Fill4(); 726 return true; 727 } 728 case 5: { 729 Fill5(); 730 return true; 731 } 732 default: { 733 Fill6(); 734 return true; 735 } 736 } 737 } Done0()738 void Done0() { 739 done_ = true; 740 switch (end_ - begin_) { 741 case 1: { 742 Fill1(); 743 break; 744 } 745 } 746 switch (buffer_len_) { 747 case 1: 748 case 2: 749 case 3: 750 case 4: { 751 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 752 return; 753 } 754 case 5: { 755 const auto index = buffer_ & 31; 756 const auto op = GetOp2(index); 757 switch (op & 3) { 758 case 0: { 759 sink_(GetEmit2(index, (op >> 2) + 0)); 760 break; 761 } 762 case 1: { 763 ok_ = false; 764 break; 765 } 766 } 767 return; 768 } 769 case 6: { 770 const auto index = buffer_ & 63; 771 const auto op = GetOp3(index); 772 switch (op & 3) { 773 case 0: { 774 ok_ = false; 775 break; 776 } 777 case 1: { 778 sink_(GetEmit3(index, (op >> 2) + 0)); 779 break; 780 } 781 } 782 return; 783 } 784 case 7: { 785 const auto index = buffer_ & 127; 786 const auto op = GetOp4(index); 787 switch (op & 3) { 788 case 0: { 789 ok_ = false; 790 break; 791 } 792 case 1: { 793 sink_(GetEmit4(index, (op >> 2) + 0)); 794 break; 795 } 796 } 797 return; 798 } 799 case 8: { 800 const auto index = buffer_ & 255; 801 const auto op = GetOp5(index); 802 switch (op & 3) { 803 case 0: { 804 ok_ = false; 805 break; 806 } 807 case 1: { 808 sink_(GetEmit5(index, (op >> 2) + 0)); 809 break; 810 } 811 } 812 return; 813 } 814 case 9: { 815 const auto index = buffer_ & 511; 816 const auto op = GetOp6(index); 817 switch (op & 3) { 818 case 0: { 819 ok_ = false; 820 break; 821 } 822 case 1: { 823 sink_(GetEmit6(index, (op >> 2) + 0)); 824 break; 825 } 826 } 827 return; 828 } 829 case 10: { 830 const auto index = buffer_ & 1023; 831 const auto op = GetOp7(index); 832 switch (op & 3) { 833 case 0: { 834 sink_(GetEmit7(index, (op >> 2) + 0)); 835 sink_(GetEmit7(index, (op >> 2) + 1)); 836 break; 837 } 838 case 1: { 839 ok_ = false; 840 break; 841 } 842 case 2: { 843 sink_(GetEmit7(index, (op >> 2) + 0)); 844 break; 845 } 846 } 847 return; 848 } 849 case 0: { 850 return; 851 } 852 } 853 } DecodeStep0()854 void DecodeStep0() { 855 if (!RefillTo1()) { 856 Done1(); 857 return; 858 } 859 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 860 const auto op = GetOp8(index); 861 const int consumed = op & 1; 862 buffer_len_ -= consumed; 863 const auto emit_ofs = op >> 1; 864 sink_(GetEmit8(index, emit_ofs + 0)); 865 } RefillTo1()866 bool RefillTo1() { 867 switch (buffer_len_) { 868 case 0: { 869 return Read1to8Bytes(); 870 } 871 } 872 return true; 873 } Read1to8Bytes()874 bool Read1to8Bytes() { 875 switch (end_ - begin_) { 876 case 0: { 877 return false; 878 } 879 case 1: { 880 Fill1(); 881 return true; 882 } 883 case 2: { 884 Fill2(); 885 return true; 886 } 887 case 3: { 888 Fill3(); 889 return true; 890 } 891 case 4: { 892 Fill4(); 893 return true; 894 } 895 case 5: { 896 Fill5(); 897 return true; 898 } 899 case 6: { 900 Fill6(); 901 return true; 902 } 903 case 7: { 904 Fill7(); 905 return true; 906 } 907 default: { 908 Fill8(); 909 return true; 910 } 911 } 912 } Done1()913 void Done1() { 914 done_ = true; 915 ok_ = false; 916 } DecodeStep1()917 void DecodeStep1() { 918 if (!RefillTo2()) { 919 Done2(); 920 return; 921 } 922 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 923 const auto op = GetOp9(index); 924 const int consumed = op & 3; 925 buffer_len_ -= consumed; 926 const auto emit_ofs = op >> 2; 927 sink_(GetEmit9(index, emit_ofs + 0)); 928 } RefillTo2()929 bool RefillTo2() { 930 switch (buffer_len_) { 931 case 0: { 932 return Read1to8Bytes(); 933 } 934 case 1: { 935 return Read1to7Bytes(); 936 } 937 } 938 return true; 939 } Done2()940 void Done2() { 941 done_ = true; 942 switch (buffer_len_) { 943 case 1: 944 case 0: { 945 ok_ = false; 946 return; 947 } 948 } 949 } DecodeStep2()950 void DecodeStep2() { 951 if (!RefillTo7()) { 952 Done3(); 953 return; 954 } 955 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 956 const auto op = GetOp10(index); 957 const int consumed = op & 7; 958 buffer_len_ -= consumed; 959 const auto emit_ofs = op >> 7; 960 switch ((op >> 3) & 15) { 961 case 0: { 962 sink_(GetEmit10(index, emit_ofs + 0)); 963 break; 964 } 965 case 1: { 966 DecodeStep3(); 967 break; 968 } 969 case 2: { 970 DecodeStep6(); 971 break; 972 } 973 case 3: { 974 DecodeStep4(); 975 break; 976 } 977 case 4: { 978 DecodeStep8(); 979 break; 980 } 981 case 5: { 982 DecodeStep5(); 983 break; 984 } 985 case 6: { 986 DecodeStep7(); 987 break; 988 } 989 case 7: { 990 DecodeStep9(); 991 break; 992 } 993 case 8: { 994 DecodeStep10(); 995 break; 996 } 997 } 998 } RefillTo7()999 bool RefillTo7() { 1000 switch (buffer_len_) { 1001 case 0: { 1002 return Read1to8Bytes(); 1003 } 1004 case 1: 1005 case 2: 1006 case 3: 1007 case 4: 1008 case 5: 1009 case 6: { 1010 return Read1to7Bytes(); 1011 } 1012 } 1013 return true; 1014 } Done3()1015 void Done3() { 1016 done_ = true; 1017 switch (buffer_len_) { 1018 case 1: { 1019 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1020 return; 1021 } 1022 case 2: { 1023 const auto index = buffer_ & 3; 1024 const auto op = GetOp11(index); 1025 switch (op & 3) { 1026 case 0: { 1027 sink_(GetEmit11(index, (op >> 2) + 0)); 1028 break; 1029 } 1030 case 1: { 1031 ok_ = false; 1032 break; 1033 } 1034 } 1035 return; 1036 } 1037 case 3: { 1038 const auto index = buffer_ & 7; 1039 const auto op = GetOp12(index); 1040 switch (op & 3) { 1041 case 0: { 1042 ok_ = false; 1043 break; 1044 } 1045 case 1: { 1046 sink_(GetEmit12(index, (op >> 2) + 0)); 1047 break; 1048 } 1049 } 1050 return; 1051 } 1052 case 4: { 1053 const auto index = buffer_ & 15; 1054 const auto op = GetOp13(index); 1055 switch (op & 3) { 1056 case 0: { 1057 ok_ = false; 1058 break; 1059 } 1060 case 1: { 1061 sink_(GetEmit13(index, (op >> 2) + 0)); 1062 break; 1063 } 1064 } 1065 return; 1066 } 1067 case 5: { 1068 const auto index = buffer_ & 31; 1069 const auto op = GetOp14(index); 1070 switch (op & 3) { 1071 case 0: { 1072 ok_ = false; 1073 break; 1074 } 1075 case 1: { 1076 sink_(GetEmit14(index, (op >> 2) + 0)); 1077 break; 1078 } 1079 } 1080 return; 1081 } 1082 case 6: { 1083 const auto index = buffer_ & 63; 1084 const auto op = GetOp15(index); 1085 switch (op & 3) { 1086 case 0: { 1087 ok_ = false; 1088 break; 1089 } 1090 case 1: { 1091 sink_(GetEmit15(index, (op >> 2) + 0)); 1092 break; 1093 } 1094 } 1095 return; 1096 } 1097 case 0: { 1098 return; 1099 } 1100 } 1101 } DecodeStep3()1102 void DecodeStep3() { 1103 if (!RefillTo1()) { 1104 Done4(); 1105 return; 1106 } 1107 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1108 const auto op = GetOp16(index); 1109 const int consumed = op & 1; 1110 buffer_len_ -= consumed; 1111 const auto emit_ofs = op >> 1; 1112 sink_(GetEmit16(index, emit_ofs + 0)); 1113 } Done4()1114 void Done4() { 1115 done_ = true; 1116 ok_ = false; 1117 } DecodeStep4()1118 void DecodeStep4() { 1119 if (!RefillTo2()) { 1120 Done5(); 1121 return; 1122 } 1123 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1124 const auto op = GetOp17(index); 1125 const int consumed = op & 3; 1126 buffer_len_ -= consumed; 1127 const auto emit_ofs = op >> 2; 1128 sink_(GetEmit17(index, emit_ofs + 0)); 1129 } Done5()1130 void Done5() { 1131 done_ = true; 1132 switch (buffer_len_) { 1133 case 1: 1134 case 0: { 1135 ok_ = false; 1136 return; 1137 } 1138 } 1139 } DecodeStep5()1140 void DecodeStep5() { 1141 if (!RefillTo3()) { 1142 Done6(); 1143 return; 1144 } 1145 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1146 const auto op = GetOp18(index); 1147 const int consumed = op & 3; 1148 buffer_len_ -= consumed; 1149 const auto emit_ofs = op >> 2; 1150 sink_(GetEmit18(index, emit_ofs + 0)); 1151 } RefillTo3()1152 bool RefillTo3() { 1153 switch (buffer_len_) { 1154 case 0: { 1155 return Read1to8Bytes(); 1156 } 1157 case 1: 1158 case 2: { 1159 return Read1to7Bytes(); 1160 } 1161 } 1162 return true; 1163 } Done6()1164 void Done6() { 1165 done_ = true; 1166 switch (buffer_len_) { 1167 case 1: 1168 case 2: 1169 case 0: { 1170 ok_ = false; 1171 return; 1172 } 1173 } 1174 } DecodeStep6()1175 void DecodeStep6() { 1176 if (!RefillTo2()) { 1177 Done7(); 1178 return; 1179 } 1180 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1181 const auto op = GetOp19(index); 1182 const int consumed = op & 3; 1183 buffer_len_ -= consumed; 1184 const auto emit_ofs = op >> 2; 1185 sink_(GetEmit19(index, emit_ofs + 0)); 1186 } Done7()1187 void Done7() { 1188 done_ = true; 1189 switch (buffer_len_) { 1190 case 1: { 1191 const auto index = buffer_ & 1; 1192 const auto op = GetOp20(index); 1193 switch (op & 1) { 1194 case 0: { 1195 sink_(GetEmit20(index, (op >> 1) + 0)); 1196 break; 1197 } 1198 case 1: { 1199 ok_ = false; 1200 break; 1201 } 1202 } 1203 return; 1204 } 1205 case 0: { 1206 ok_ = false; 1207 return; 1208 } 1209 } 1210 } DecodeStep7()1211 void DecodeStep7() { 1212 if (!RefillTo4()) { 1213 Done8(); 1214 return; 1215 } 1216 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1217 const auto op = GetOp21(index); 1218 const int consumed = op & 7; 1219 buffer_len_ -= consumed; 1220 const auto emit_ofs = op >> 3; 1221 sink_(GetEmit21(index, emit_ofs + 0)); 1222 } RefillTo4()1223 bool RefillTo4() { 1224 switch (buffer_len_) { 1225 case 0: { 1226 return Read1to8Bytes(); 1227 } 1228 case 1: 1229 case 2: 1230 case 3: { 1231 return Read1to7Bytes(); 1232 } 1233 } 1234 return true; 1235 } Done8()1236 void Done8() { 1237 done_ = true; 1238 switch (buffer_len_) { 1239 case 1: 1240 case 2: 1241 case 0: { 1242 ok_ = false; 1243 return; 1244 } 1245 case 3: { 1246 const auto index = buffer_ & 7; 1247 const auto op = GetOp22(index); 1248 switch (op & 1) { 1249 case 0: { 1250 sink_(GetEmit22(index, (op >> 1) + 0)); 1251 break; 1252 } 1253 case 1: { 1254 ok_ = false; 1255 break; 1256 } 1257 } 1258 return; 1259 } 1260 } 1261 } DecodeStep8()1262 void DecodeStep8() { 1263 if (!RefillTo3()) { 1264 Done9(); 1265 return; 1266 } 1267 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1268 const auto op = GetOp23(index); 1269 const int consumed = op & 3; 1270 buffer_len_ -= consumed; 1271 const auto emit_ofs = op >> 2; 1272 sink_(GetEmit23(index, emit_ofs + 0)); 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 case 2: { 1283 const auto index = buffer_ & 3; 1284 const auto op = GetOp24(index); 1285 switch (op & 1) { 1286 case 0: { 1287 sink_(GetEmit24(index, (op >> 1) + 0)); 1288 break; 1289 } 1290 case 1: { 1291 ok_ = false; 1292 break; 1293 } 1294 } 1295 return; 1296 } 1297 } 1298 } DecodeStep9()1299 void DecodeStep9() { 1300 if (!RefillTo5()) { 1301 Done10(); 1302 return; 1303 } 1304 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1305 const auto op = GetOp25(index); 1306 const int consumed = op & 7; 1307 buffer_len_ -= consumed; 1308 const auto emit_ofs = op >> 3; 1309 sink_(GetEmit25(index, emit_ofs + 0)); 1310 } RefillTo5()1311 bool RefillTo5() { 1312 switch (buffer_len_) { 1313 case 0: { 1314 return Read1to8Bytes(); 1315 } 1316 case 1: 1317 case 2: 1318 case 3: 1319 case 4: { 1320 return Read1to7Bytes(); 1321 } 1322 } 1323 return true; 1324 } Done10()1325 void Done10() { 1326 done_ = true; 1327 switch (buffer_len_) { 1328 case 1: 1329 case 2: 1330 case 3: 1331 case 0: { 1332 ok_ = false; 1333 return; 1334 } 1335 case 4: { 1336 const auto index = buffer_ & 15; 1337 const auto op = GetOp26(index); 1338 switch (op & 1) { 1339 case 0: { 1340 sink_(GetEmit26(index, (op >> 1) + 0)); 1341 break; 1342 } 1343 case 1: { 1344 ok_ = false; 1345 break; 1346 } 1347 } 1348 return; 1349 } 1350 } 1351 } DecodeStep10()1352 void DecodeStep10() { 1353 if (!RefillTo12()) { 1354 Done11(); 1355 return; 1356 } 1357 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 1358 const auto op = GetOp27(index); 1359 const int consumed = op & 15; 1360 buffer_len_ -= consumed; 1361 const auto emit_ofs = op >> 5; 1362 switch ((op >> 4) & 1) { 1363 case 0: { 1364 sink_(GetEmit27(index, emit_ofs + 0)); 1365 break; 1366 } 1367 case 1: { 1368 begin_ = end_; 1369 buffer_len_ = 0; 1370 break; 1371 } 1372 } 1373 } RefillTo12()1374 bool RefillTo12() { 1375 switch (buffer_len_) { 1376 case 0: { 1377 return Read2to8Bytes(); 1378 } 1379 case 1: 1380 case 2: 1381 case 3: { 1382 return Read2to7Bytes(); 1383 } 1384 case 4: 1385 case 5: 1386 case 6: 1387 case 7: 1388 case 8: { 1389 return Read1to7Bytes(); 1390 } 1391 case 9: 1392 case 10: 1393 case 11: { 1394 return Read1to6Bytes(); 1395 } 1396 } 1397 return true; 1398 } Done11()1399 void Done11() { 1400 done_ = true; 1401 switch (end_ - begin_) { 1402 case 1: { 1403 Fill1(); 1404 break; 1405 } 1406 } 1407 switch (buffer_len_) { 1408 case 1: 1409 case 2: 1410 case 3: 1411 case 4: { 1412 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1413 return; 1414 } 1415 case 5: { 1416 const auto index = buffer_ & 31; 1417 const auto op = GetOp28(index); 1418 switch (op & 3) { 1419 case 0: { 1420 sink_(GetEmit28(index, (op >> 2) + 0)); 1421 break; 1422 } 1423 case 1: { 1424 ok_ = false; 1425 break; 1426 } 1427 } 1428 return; 1429 } 1430 case 6: { 1431 const auto index = buffer_ & 63; 1432 const auto op = GetOp29(index); 1433 switch (op & 3) { 1434 case 0: { 1435 ok_ = false; 1436 break; 1437 } 1438 case 1: { 1439 sink_(GetEmit29(index, (op >> 2) + 0)); 1440 break; 1441 } 1442 } 1443 return; 1444 } 1445 case 7: { 1446 const auto index = buffer_ & 127; 1447 const auto op = GetOp30(index); 1448 switch (op & 3) { 1449 case 0: { 1450 ok_ = false; 1451 break; 1452 } 1453 case 1: { 1454 sink_(GetEmit30(index, (op >> 2) + 0)); 1455 break; 1456 } 1457 } 1458 return; 1459 } 1460 case 8: { 1461 const auto index = buffer_ & 255; 1462 const auto op = GetOp31(index); 1463 switch (op & 3) { 1464 case 0: { 1465 ok_ = false; 1466 break; 1467 } 1468 case 1: { 1469 sink_(GetEmit31(index, (op >> 2) + 0)); 1470 break; 1471 } 1472 } 1473 return; 1474 } 1475 case 9: { 1476 const auto index = buffer_ & 511; 1477 const auto op = GetOp32(index); 1478 switch (op & 3) { 1479 case 0: { 1480 ok_ = false; 1481 break; 1482 } 1483 case 1: { 1484 sink_(GetEmit32(index, (op >> 2) + 0)); 1485 break; 1486 } 1487 } 1488 return; 1489 } 1490 case 10: { 1491 const auto index = buffer_ & 1023; 1492 const auto op = GetOp33(index); 1493 switch (op & 3) { 1494 case 0: { 1495 sink_(GetEmit33(index, (op >> 2) + 0)); 1496 sink_(GetEmit33(index, (op >> 2) + 1)); 1497 break; 1498 } 1499 case 1: { 1500 ok_ = false; 1501 break; 1502 } 1503 case 2: { 1504 sink_(GetEmit33(index, (op >> 2) + 0)); 1505 break; 1506 } 1507 } 1508 return; 1509 } 1510 case 11: { 1511 const auto index = buffer_ & 2047; 1512 const auto op = GetOp34(index); 1513 switch (op & 3) { 1514 case 0: { 1515 ok_ = false; 1516 break; 1517 } 1518 case 1: { 1519 sink_(GetEmit34(index, (op >> 2) + 0)); 1520 sink_(GetEmit34(index, (op >> 2) + 1)); 1521 break; 1522 } 1523 case 2: { 1524 sink_(GetEmit34(index, (op >> 2) + 0)); 1525 break; 1526 } 1527 } 1528 return; 1529 } 1530 case 0: { 1531 return; 1532 } 1533 } 1534 } 1535 F sink_; 1536 const uint8_t* begin_; 1537 const uint8_t* const end_; 1538 uint64_t buffer_ = 0; 1539 int buffer_len_ = 0; 1540 bool ok_ = true; 1541 bool done_ = false; 1542 }; 1543 } // namespace geometry_11_7_12 1544 } // namespace grpc_core 1545 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_11_7_12_H 1546