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