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