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