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