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