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