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