1 // Copyright 2023 gRPC authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // This file is autogenerated: see 16 // tools/codegen/core/gen_huffman_decompressor.cc 17 18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_8_12_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_8_12_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_10_8_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 } GetOp6(size_t i)48 static inline uint64_t GetOp6(size_t i) { 49 return table6_ops_[i >> 5][i & 0x1f]; 50 } GetEmit6(size_t i,size_t emit)51 static inline uint64_t GetEmit6(size_t i, size_t emit) { 52 return table6_emit_[i >> 5][emit]; 53 } GetOp1(size_t i)54 static inline uint64_t GetOp1(size_t i) { 55 return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]]; 56 } GetEmit1(size_t i,size_t emit)57 static inline uint64_t GetEmit1(size_t i, size_t emit) { 58 return table1_emit_[i >> 6][emit]; 59 } GetOp7(size_t i)60 static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; } GetEmit7(size_t,size_t emit)61 static inline uint64_t GetEmit7(size_t, size_t emit) { 62 return emit ? 43 : 39; 63 } GetOp9(size_t i)64 static inline uint64_t GetOp9(size_t i) { return table9_0_inner_[i]; } GetEmit9(size_t,size_t emit)65 static inline uint64_t GetEmit9(size_t, size_t emit) { 66 return table9_0_emit_[emit]; 67 } GetOp10(size_t i)68 static inline uint64_t GetOp10(size_t i) { 69 return table10_0_inner_[table10_0_outer_[i]]; 70 } GetEmit10(size_t,size_t emit)71 static inline uint64_t GetEmit10(size_t, size_t emit) { 72 return table10_0_emit_[emit]; 73 } GetOp11(size_t i)74 static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; } GetEmit11(size_t,size_t emit)75 static inline uint64_t GetEmit11(size_t, size_t emit) { 76 return table11_0_emit_[emit]; 77 } GetOp12(size_t i)78 static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; } GetEmit12(size_t,size_t emit)79 static inline uint64_t GetEmit12(size_t, size_t emit) { 80 return table11_0_emit_[emit]; 81 } GetOp13(size_t i)82 static inline uint64_t GetOp13(size_t i) { return table13_0_ops_[i]; } GetEmit13(size_t,size_t emit)83 static inline uint64_t GetEmit13(size_t, size_t emit) { 84 return table11_0_emit_[emit]; 85 } GetOp8(size_t i)86 static inline uint64_t GetOp8(size_t i) { 87 return table8_ops_[i >> 6][i & 0x3f]; 88 } GetEmit8(size_t i,size_t emit)89 static inline uint64_t GetEmit8(size_t i, size_t emit) { 90 return table8_emit_[i >> 6][emit]; 91 } GetOp14(size_t i)92 static inline uint64_t GetOp14(size_t i) { return i ? 3 : 1; } GetEmit14(size_t,size_t emit)93 static inline uint64_t GetEmit14(size_t, size_t emit) { 94 return emit ? 195 : 92; 95 } GetOp15(size_t i)96 static inline uint64_t GetOp15(size_t i) { 97 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 98 } GetEmit15(size_t,size_t emit)99 static inline uint64_t GetEmit15(size_t, size_t emit) { 100 return (emit < 2 ? (emit ? 162 : 131) : ((emit - 2) ? 194 : 184)); 101 } GetOp16(size_t i)102 static inline uint64_t GetOp16(size_t i) { return table16_0_inner_[i]; } GetEmit16(size_t,size_t emit)103 static inline uint64_t GetEmit16(size_t, size_t emit) { 104 return table16_0_emit_[emit]; 105 } GetOp18(size_t i)106 static inline uint64_t GetOp18(size_t i) { return i; } GetEmit18(size_t,size_t emit)107 static inline uint64_t GetEmit18(size_t, size_t emit) { 108 return ((void)emit, 208); 109 } GetOp17(size_t i)110 static inline uint64_t GetOp17(size_t i) { 111 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 112 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 113 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 114 } GetEmit17(size_t,size_t emit)115 static inline uint64_t GetEmit17(size_t, size_t emit) { 116 return (emit < 1 ? (((void)emit, 208)) : ((emit - 1) ? 130 : 128)); 117 } GetOp20(size_t i)118 static inline uint64_t GetOp20(size_t i) { 119 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 120 } GetEmit20(size_t,size_t emit)121 static inline uint64_t GetEmit20(size_t, size_t emit) { 122 return ((void)emit, 230); 123 } GetOp19(size_t i)124 static inline uint64_t GetOp19(size_t i) { 125 return table19_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 126 } GetEmit19(size_t,size_t emit)127 static inline uint64_t GetEmit19(size_t, size_t emit) { 128 return table19_0_emit_[emit]; 129 } GetOp22(size_t i)130 static inline uint64_t GetOp22(size_t i) { 131 return ((i < 2 ? (i) : (((void)(i - 2), 2))) < 1 132 ? (((void)(i < 2 ? (i) : (((void)(i - 2), 2))), 0)) 133 : (((i < 2 ? (i) : (((void)(i - 2), 2))) - 1) ? 1 : 2)); 134 } GetEmit22(size_t,size_t emit)135 static inline uint64_t GetEmit22(size_t, size_t emit) { 136 return emit ? 226 : 224; 137 } GetOp21(size_t i)138 static inline uint64_t GetOp21(size_t i) { 139 return table21_0_inner_[(i < 3 ? (i / 2 + 0) : ((i - 3) + 1))]; 140 } GetEmit21(size_t,size_t emit)141 static inline uint64_t GetEmit21(size_t, size_t emit) { 142 return table21_0_emit_[emit]; 143 } GetOp24(size_t i)144 static inline uint64_t GetOp24(size_t i) { 145 return table24_0_inner_[(i < 12 ? (i) : (((void)(i - 12), 12)))]; 146 } GetEmit24(size_t,size_t emit)147 static inline uint64_t GetEmit24(size_t, size_t emit) { 148 return table24_0_emit_[emit]; 149 } GetOp23(size_t i)150 static inline uint64_t GetOp23(size_t i) { return table23_0_ops_[i]; } GetEmit23(size_t,size_t emit)151 static inline uint64_t GetEmit23(size_t, size_t emit) { 152 return table23_0_emit_[emit]; 153 } GetOp26(size_t i)154 static inline uint64_t GetOp26(size_t i) { return table26_0_ops_[i]; } GetEmit26(size_t,size_t emit)155 static inline uint64_t GetEmit26(size_t, size_t emit) { 156 return table26_0_emit_[emit]; 157 } GetOp27(size_t i)158 static inline uint64_t GetOp27(size_t i) { return table27_0_ops_[i]; } GetEmit27(size_t,size_t emit)159 static inline uint64_t GetEmit27(size_t, size_t emit) { 160 return table27_0_emit_[emit]; 161 } GetOp28(size_t i)162 static inline uint64_t GetOp28(size_t i) { return table28_0_ops_[i]; } GetEmit28(size_t,size_t emit)163 static inline uint64_t GetEmit28(size_t, size_t emit) { 164 return table28_0_emit_[emit]; 165 } GetOp29(size_t i)166 static inline uint64_t GetOp29(size_t i) { return table29_0_ops_[i]; } GetEmit29(size_t,size_t emit)167 static inline uint64_t GetEmit29(size_t, size_t emit) { 168 return table29_0_emit_[emit]; 169 } GetOp30(size_t i)170 static inline uint64_t GetOp30(size_t i) { 171 return table30_ops_[i >> 6][i & 0x3f]; 172 } GetEmit30(size_t i,size_t emit)173 static inline uint64_t GetEmit30(size_t i, size_t emit) { 174 return table30_emit_[i >> 6][emit]; 175 } GetOp31(size_t i)176 static inline uint64_t GetOp31(size_t i) { 177 return table31_ops_[i >> 6][i & 0x3f]; 178 } GetEmit31(size_t i,size_t emit)179 static inline uint64_t GetEmit31(size_t i, size_t emit) { 180 return table31_emit_[i >> 6][emit]; 181 } GetOp32(size_t i)182 static inline uint64_t GetOp32(size_t i) { 183 return table32_ops_[i >> 6][i & 0x3f]; 184 } GetEmit32(size_t i,size_t emit)185 static inline uint64_t GetEmit32(size_t i, size_t emit) { 186 return table32_emit_[i >> 6][emit]; 187 } GetOp25(size_t i)188 static inline uint64_t GetOp25(size_t i) { 189 return table25_ops_[i >> 7][i & 0x7f]; 190 } GetEmit25(size_t i,size_t emit)191 static inline uint64_t GetEmit25(size_t i, size_t emit) { 192 return table25_emit_[i >> 7][emit]; 193 } GetOp34(size_t i)194 static inline uint64_t GetOp34(size_t i) { return i; } GetEmit34(size_t,size_t emit)195 static inline uint64_t GetEmit34(size_t, size_t emit) { 196 return ((void)emit, 124); 197 } GetOp33(size_t i)198 static inline uint64_t GetOp33(size_t i) { 199 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 200 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 201 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 202 } GetEmit33(size_t,size_t emit)203 static inline uint64_t GetEmit33(size_t, size_t emit) { 204 return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35)); 205 } 206 207 private: 208 static const uint8_t table2_0_emit_[10]; 209 static const uint8_t table2_0_ops_[32]; 210 static const uint8_t table3_0_emit_[36]; 211 static const uint8_t table3_0_ops_[64]; 212 static const uint8_t table4_0_emit_[22]; 213 static const uint8_t table4_0_ops_[64]; 214 static const uint8_t table4_1_emit_[46]; 215 static const uint8_t table4_1_ops_[64]; 216 static const uint8_t* const table4_emit_[2]; 217 static const uint8_t* const table4_ops_[2]; 218 static const uint8_t table5_0_ops_[128]; 219 static const uint8_t table5_1_emit_[52]; 220 static const uint8_t table5_1_ops_[128]; 221 static const uint8_t* const table5_emit_[2]; 222 static const uint8_t* const table5_ops_[2]; 223 static const uint8_t table6_0_emit_[2]; 224 static const uint8_t table6_0_ops_[32]; 225 static const uint8_t table6_1_emit_[2]; 226 static const uint8_t table6_2_emit_[2]; 227 static const uint8_t table6_3_emit_[2]; 228 static const uint8_t table6_4_emit_[2]; 229 static const uint8_t table6_5_emit_[4]; 230 static const uint8_t table6_5_ops_[32]; 231 static const uint8_t table6_6_emit_[4]; 232 static const uint8_t table6_7_emit_[4]; 233 static const uint8_t table6_8_emit_[4]; 234 static const uint8_t table6_9_emit_[4]; 235 static const uint8_t table6_10_emit_[4]; 236 static const uint8_t table6_11_emit_[6]; 237 static const uint8_t table6_11_ops_[32]; 238 static const uint8_t table6_12_emit_[8]; 239 static const uint8_t table6_12_ops_[32]; 240 static const uint8_t table6_13_emit_[8]; 241 static const uint8_t table6_14_emit_[8]; 242 static const uint8_t table6_15_emit_[10]; 243 static const uint8_t table6_15_ops_[32]; 244 static const uint8_t* const table6_emit_[16]; 245 static const uint8_t* const table6_ops_[16]; 246 static const uint8_t table1_0_emit_[36]; 247 static const uint16_t table1_0_inner_[22]; 248 static const uint8_t table1_0_outer_[64]; 249 static const uint8_t table1_1_emit_[36]; 250 static const uint16_t table1_1_inner_[22]; 251 static const uint8_t table1_2_emit_[36]; 252 static const uint16_t table1_2_inner_[22]; 253 static const uint8_t table1_3_emit_[36]; 254 static const uint16_t table1_3_inner_[22]; 255 static const uint8_t table1_4_emit_[38]; 256 static const uint16_t table1_4_inner_[22]; 257 static const uint16_t table1_5_inner_[4]; 258 static const uint8_t table1_5_outer_[64]; 259 static const uint16_t table1_11_inner_[6]; 260 static const uint8_t table1_11_outer_[64]; 261 static const uint16_t table1_12_inner_[8]; 262 static const uint8_t table1_12_outer_[64]; 263 static const uint8_t table1_15_emit_[15]; 264 static const uint16_t table1_15_inner_[18]; 265 static const uint8_t table1_15_outer_[64]; 266 static const uint8_t* const table1_emit_[16]; 267 static const uint16_t* const table1_inner_[16]; 268 static const uint8_t* const table1_outer_[16]; 269 static const uint8_t table9_0_emit_[6]; 270 static const uint8_t table9_0_inner_[8]; 271 static const uint8_t table10_0_emit_[8]; 272 static const uint8_t table10_0_inner_[10]; 273 static const uint8_t table10_0_outer_[16]; 274 static const uint8_t table11_0_emit_[11]; 275 static const uint8_t table11_0_ops_[32]; 276 static const uint8_t table12_0_ops_[64]; 277 static const uint8_t table13_0_ops_[128]; 278 static const uint8_t table8_0_emit_[2]; 279 static const uint16_t table8_0_ops_[64]; 280 static const uint8_t table8_1_emit_[2]; 281 static const uint8_t table8_2_emit_[2]; 282 static const uint8_t table8_3_emit_[5]; 283 static const uint16_t table8_3_ops_[64]; 284 static const uint8_t* const table8_emit_[4]; 285 static const uint16_t* const table8_ops_[4]; 286 static const uint8_t table16_0_emit_[8]; 287 static const uint8_t table16_0_inner_[8]; 288 static const uint8_t table19_0_emit_[15]; 289 static const uint8_t table19_0_inner_[15]; 290 static const uint8_t table21_0_emit_[6]; 291 static const uint8_t table21_0_inner_[6]; 292 static const uint8_t table24_0_emit_[12]; 293 static const uint8_t table24_0_inner_[13]; 294 static const uint8_t table23_0_emit_[20]; 295 static const uint8_t table23_0_ops_[32]; 296 static const uint8_t table26_0_emit_[21]; 297 static const uint8_t table26_0_ops_[32]; 298 static const uint8_t table27_0_emit_[33]; 299 static const uint8_t table27_0_ops_[64]; 300 static const uint8_t table28_0_emit_[37]; 301 static const uint8_t table28_0_ops_[128]; 302 static const uint8_t table29_0_emit_[52]; 303 static const uint8_t table29_0_ops_[256]; 304 static const uint8_t table30_0_emit_[4]; 305 static const uint8_t table30_0_ops_[64]; 306 static const uint8_t table30_1_emit_[4]; 307 static const uint8_t table30_2_emit_[4]; 308 static const uint8_t table30_3_emit_[4]; 309 static const uint8_t table30_4_emit_[4]; 310 static const uint8_t table30_5_emit_[7]; 311 static const uint8_t table30_5_ops_[64]; 312 static const uint8_t table30_6_emit_[10]; 313 static const uint8_t table30_6_ops_[64]; 314 static const uint8_t table30_7_emit_[34]; 315 static const uint8_t table30_7_ops_[64]; 316 static const uint8_t* const table30_emit_[8]; 317 static const uint8_t* const table30_ops_[8]; 318 static const uint8_t table31_0_emit_[40]; 319 static const uint8_t table31_0_ops_[64]; 320 static const uint8_t table31_1_emit_[40]; 321 static const uint8_t table31_2_emit_[40]; 322 static const uint8_t table31_3_emit_[40]; 323 static const uint8_t table31_4_emit_[40]; 324 static const uint8_t table31_5_emit_[40]; 325 static const uint8_t table31_6_emit_[40]; 326 static const uint8_t table31_7_emit_[40]; 327 static const uint8_t table31_8_emit_[40]; 328 static const uint8_t table31_9_emit_[40]; 329 static const uint8_t table31_10_emit_[22]; 330 static const uint8_t table31_10_ops_[64]; 331 static const uint8_t table31_11_emit_[4]; 332 static const uint8_t table31_11_ops_[64]; 333 static const uint8_t table31_12_emit_[4]; 334 static const uint8_t table31_13_emit_[6]; 335 static const uint8_t table31_13_ops_[64]; 336 static const uint8_t table31_14_emit_[17]; 337 static const uint8_t table31_14_ops_[64]; 338 static const uint8_t table31_15_emit_[46]; 339 static const uint8_t table31_15_ops_[64]; 340 static const uint8_t* const table31_emit_[16]; 341 static const uint8_t* const table31_ops_[16]; 342 static const uint8_t table32_0_emit_[72]; 343 static const uint16_t table32_0_ops_[64]; 344 static const uint8_t table32_1_emit_[72]; 345 static const uint8_t table32_2_emit_[72]; 346 static const uint8_t table32_3_emit_[72]; 347 static const uint8_t table32_4_emit_[72]; 348 static const uint8_t table32_5_emit_[72]; 349 static const uint8_t table32_6_emit_[72]; 350 static const uint8_t table32_7_emit_[72]; 351 static const uint8_t table32_8_emit_[72]; 352 static const uint8_t table32_9_emit_[72]; 353 static const uint8_t table32_10_emit_[72]; 354 static const uint8_t table32_11_emit_[72]; 355 static const uint8_t table32_12_emit_[72]; 356 static const uint8_t table32_13_emit_[72]; 357 static const uint8_t table32_14_emit_[72]; 358 static const uint8_t table32_15_emit_[72]; 359 static const uint8_t table32_16_emit_[72]; 360 static const uint8_t table32_17_emit_[72]; 361 static const uint8_t table32_18_emit_[72]; 362 static const uint8_t table32_19_emit_[72]; 363 static const uint8_t table32_20_emit_[72]; 364 static const uint8_t table32_21_emit_[40]; 365 static const uint16_t table32_21_ops_[64]; 366 static const uint8_t table32_22_emit_[40]; 367 static const uint8_t table32_23_emit_[40]; 368 static const uint8_t table32_24_emit_[40]; 369 static const uint8_t table32_25_emit_[40]; 370 static const uint8_t table32_26_emit_[40]; 371 static const uint8_t table32_27_emit_[4]; 372 static const uint16_t table32_27_ops_[64]; 373 static const uint8_t table32_28_emit_[8]; 374 static const uint16_t table32_28_ops_[64]; 375 static const uint8_t table32_29_emit_[9]; 376 static const uint16_t table32_29_ops_[64]; 377 static const uint8_t table32_30_emit_[16]; 378 static const uint16_t table32_30_ops_[64]; 379 static const uint8_t table32_31_emit_[30]; 380 static const uint16_t table32_31_ops_[64]; 381 static const uint8_t* const table32_emit_[32]; 382 static const uint16_t* const table32_ops_[32]; 383 static const uint8_t table25_0_emit_[1]; 384 static const uint16_t table25_0_ops_[128]; 385 static const uint8_t table25_1_emit_[1]; 386 static const uint8_t table25_2_emit_[1]; 387 static const uint8_t table25_3_emit_[1]; 388 static const uint8_t table25_4_emit_[1]; 389 static const uint8_t table25_5_emit_[1]; 390 static const uint8_t table25_6_emit_[1]; 391 static const uint8_t table25_7_emit_[1]; 392 static const uint8_t table25_8_emit_[1]; 393 static const uint8_t table25_9_emit_[1]; 394 static const uint8_t table25_10_emit_[1]; 395 static const uint8_t table25_11_emit_[1]; 396 static const uint8_t table25_12_emit_[1]; 397 static const uint8_t table25_13_emit_[1]; 398 static const uint8_t table25_14_emit_[1]; 399 static const uint8_t table25_15_emit_[1]; 400 static const uint8_t table25_16_emit_[1]; 401 static const uint8_t table25_17_emit_[1]; 402 static const uint8_t table25_18_emit_[1]; 403 static const uint8_t table25_19_emit_[1]; 404 static const uint8_t table25_20_emit_[1]; 405 static const uint8_t table25_21_emit_[2]; 406 static const uint16_t table25_21_ops_[128]; 407 static const uint8_t table25_22_emit_[2]; 408 static const uint8_t table25_23_emit_[2]; 409 static const uint8_t table25_24_emit_[2]; 410 static const uint8_t table25_25_emit_[2]; 411 static const uint8_t table25_26_emit_[2]; 412 static const uint16_t table25_27_ops_[128]; 413 static const uint16_t table25_28_ops_[128]; 414 static const uint16_t table25_29_ops_[128]; 415 static const uint16_t table25_30_ops_[128]; 416 static const uint8_t table25_31_emit_[33]; 417 static const uint16_t table25_31_ops_[128]; 418 static const uint8_t* const table25_emit_[32]; 419 static const uint16_t* const table25_ops_[32]; 420 }; 421 template <typename F> 422 class HuffDecoder : public HuffDecoderCommon { 423 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)424 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 425 : sink_(sink), begin_(begin), end_(end) {} Run()426 bool Run() { 427 while (!done_) { 428 if (!RefillTo10()) { 429 Done0(); 430 break; 431 } 432 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 433 const auto op = GetOp1(index); 434 const int consumed = op & 15; 435 buffer_len_ -= consumed; 436 const auto emit_ofs = op >> 7; 437 switch ((op >> 4) & 7) { 438 case 0: { 439 sink_(GetEmit1(index, emit_ofs + 0)); 440 sink_(GetEmit1(index, emit_ofs + 1)); 441 break; 442 } 443 case 1: { 444 sink_(GetEmit1(index, emit_ofs + 0)); 445 break; 446 } 447 case 2: { 448 DecodeStep0(); 449 break; 450 } 451 case 3: { 452 DecodeStep10(); 453 break; 454 } 455 case 4: { 456 DecodeStep1(); 457 break; 458 } 459 } 460 } 461 return ok_; 462 } 463 464 private: RefillTo10()465 bool RefillTo10() { 466 switch (buffer_len_) { 467 case 0: { 468 return Read2to8Bytes(); 469 } 470 case 1: { 471 return Read2to7Bytes(); 472 } 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 case 9: { 483 return Read1to6Bytes(); 484 } 485 } 486 return true; 487 } Read2to8Bytes()488 bool Read2to8Bytes() { 489 switch (end_ - begin_) { 490 case 0: 491 case 1: { 492 return false; 493 } 494 case 2: { 495 Fill2(); 496 return true; 497 } 498 case 3: { 499 Fill3(); 500 return true; 501 } 502 case 4: { 503 Fill4(); 504 return true; 505 } 506 case 5: { 507 Fill5(); 508 return true; 509 } 510 case 6: { 511 Fill6(); 512 return true; 513 } 514 case 7: { 515 Fill7(); 516 return true; 517 } 518 default: { 519 Fill8(); 520 return true; 521 } 522 } 523 } Fill2()524 void Fill2() { 525 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 526 (static_cast<uint64_t>(begin_[1]) << 0); 527 begin_ += 2; 528 buffer_len_ += 16; 529 } Fill3()530 void Fill3() { 531 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 532 (static_cast<uint64_t>(begin_[1]) << 8) | 533 (static_cast<uint64_t>(begin_[2]) << 0); 534 begin_ += 3; 535 buffer_len_ += 24; 536 } Fill4()537 void Fill4() { 538 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 539 (static_cast<uint64_t>(begin_[1]) << 16) | 540 (static_cast<uint64_t>(begin_[2]) << 8) | 541 (static_cast<uint64_t>(begin_[3]) << 0); 542 begin_ += 4; 543 buffer_len_ += 32; 544 } Fill5()545 void Fill5() { 546 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 547 (static_cast<uint64_t>(begin_[1]) << 24) | 548 (static_cast<uint64_t>(begin_[2]) << 16) | 549 (static_cast<uint64_t>(begin_[3]) << 8) | 550 (static_cast<uint64_t>(begin_[4]) << 0); 551 begin_ += 5; 552 buffer_len_ += 40; 553 } Fill6()554 void Fill6() { 555 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 556 (static_cast<uint64_t>(begin_[1]) << 32) | 557 (static_cast<uint64_t>(begin_[2]) << 24) | 558 (static_cast<uint64_t>(begin_[3]) << 16) | 559 (static_cast<uint64_t>(begin_[4]) << 8) | 560 (static_cast<uint64_t>(begin_[5]) << 0); 561 begin_ += 6; 562 buffer_len_ += 48; 563 } Fill7()564 void Fill7() { 565 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 566 (static_cast<uint64_t>(begin_[1]) << 40) | 567 (static_cast<uint64_t>(begin_[2]) << 32) | 568 (static_cast<uint64_t>(begin_[3]) << 24) | 569 (static_cast<uint64_t>(begin_[4]) << 16) | 570 (static_cast<uint64_t>(begin_[5]) << 8) | 571 (static_cast<uint64_t>(begin_[6]) << 0); 572 begin_ += 7; 573 buffer_len_ += 56; 574 } Fill8()575 void Fill8() { 576 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 577 (static_cast<uint64_t>(begin_[1]) << 48) | 578 (static_cast<uint64_t>(begin_[2]) << 40) | 579 (static_cast<uint64_t>(begin_[3]) << 32) | 580 (static_cast<uint64_t>(begin_[4]) << 24) | 581 (static_cast<uint64_t>(begin_[5]) << 16) | 582 (static_cast<uint64_t>(begin_[6]) << 8) | 583 (static_cast<uint64_t>(begin_[7]) << 0); 584 begin_ += 8; 585 buffer_len_ += 64; 586 } Read2to7Bytes()587 bool Read2to7Bytes() { 588 switch (end_ - begin_) { 589 case 0: 590 case 1: { 591 return false; 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 } Read1to7Bytes()619 bool Read1to7Bytes() { 620 switch (end_ - begin_) { 621 case 0: { 622 return false; 623 } 624 case 1: { 625 Fill1(); 626 return true; 627 } 628 case 2: { 629 Fill2(); 630 return true; 631 } 632 case 3: { 633 Fill3(); 634 return true; 635 } 636 case 4: { 637 Fill4(); 638 return true; 639 } 640 case 5: { 641 Fill5(); 642 return true; 643 } 644 case 6: { 645 Fill6(); 646 return true; 647 } 648 default: { 649 Fill7(); 650 return true; 651 } 652 } 653 } Fill1()654 void Fill1() { 655 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 656 begin_ += 1; 657 buffer_len_ += 8; 658 } Read1to6Bytes()659 bool Read1to6Bytes() { 660 switch (end_ - begin_) { 661 case 0: { 662 return false; 663 } 664 case 1: { 665 Fill1(); 666 return true; 667 } 668 case 2: { 669 Fill2(); 670 return true; 671 } 672 case 3: { 673 Fill3(); 674 return true; 675 } 676 case 4: { 677 Fill4(); 678 return true; 679 } 680 case 5: { 681 Fill5(); 682 return true; 683 } 684 default: { 685 Fill6(); 686 return true; 687 } 688 } 689 } Done0()690 void Done0() { 691 done_ = true; 692 switch (end_ - begin_) { 693 case 1: { 694 Fill1(); 695 break; 696 } 697 } 698 switch (buffer_len_) { 699 case 1: 700 case 2: 701 case 3: 702 case 4: { 703 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 704 return; 705 } 706 case 5: { 707 const auto index = buffer_ & 31; 708 const auto op = GetOp2(index); 709 switch (op & 3) { 710 case 0: { 711 sink_(GetEmit2(index, (op >> 2) + 0)); 712 break; 713 } 714 case 1: { 715 ok_ = false; 716 break; 717 } 718 } 719 return; 720 } 721 case 6: { 722 const auto index = buffer_ & 63; 723 const auto op = GetOp3(index); 724 switch (op & 3) { 725 case 0: { 726 ok_ = false; 727 break; 728 } 729 case 1: { 730 sink_(GetEmit3(index, (op >> 2) + 0)); 731 break; 732 } 733 } 734 return; 735 } 736 case 7: { 737 const auto index = buffer_ & 127; 738 const auto op = GetOp4(index); 739 switch (op & 3) { 740 case 0: { 741 ok_ = false; 742 break; 743 } 744 case 1: { 745 sink_(GetEmit4(index, (op >> 2) + 0)); 746 break; 747 } 748 } 749 return; 750 } 751 case 8: { 752 const auto index = buffer_ & 255; 753 const auto op = GetOp5(index); 754 switch (op & 3) { 755 case 0: { 756 ok_ = false; 757 break; 758 } 759 case 1: { 760 sink_(GetEmit5(index, (op >> 2) + 0)); 761 break; 762 } 763 } 764 return; 765 } 766 case 9: { 767 const auto index = buffer_ & 511; 768 const auto op = GetOp6(index); 769 switch (op & 3) { 770 case 0: { 771 ok_ = false; 772 break; 773 } 774 case 1: { 775 sink_(GetEmit6(index, (op >> 2) + 0)); 776 break; 777 } 778 } 779 return; 780 } 781 case 0: { 782 return; 783 } 784 } 785 } DecodeStep0()786 void DecodeStep0() { 787 if (!RefillTo1()) { 788 Done1(); 789 return; 790 } 791 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 792 const auto op = GetOp7(index); 793 const int consumed = op & 1; 794 buffer_len_ -= consumed; 795 const auto emit_ofs = op >> 1; 796 sink_(GetEmit7(index, emit_ofs + 0)); 797 } RefillTo1()798 bool RefillTo1() { 799 switch (buffer_len_) { 800 case 0: { 801 return Read1to8Bytes(); 802 } 803 } 804 return true; 805 } Read1to8Bytes()806 bool Read1to8Bytes() { 807 switch (end_ - begin_) { 808 case 0: { 809 return false; 810 } 811 case 1: { 812 Fill1(); 813 return true; 814 } 815 case 2: { 816 Fill2(); 817 return true; 818 } 819 case 3: { 820 Fill3(); 821 return true; 822 } 823 case 4: { 824 Fill4(); 825 return true; 826 } 827 case 5: { 828 Fill5(); 829 return true; 830 } 831 case 6: { 832 Fill6(); 833 return true; 834 } 835 case 7: { 836 Fill7(); 837 return true; 838 } 839 default: { 840 Fill8(); 841 return true; 842 } 843 } 844 } Done1()845 void Done1() { 846 done_ = true; 847 ok_ = false; 848 } DecodeStep1()849 void DecodeStep1() { 850 if (!RefillTo8()) { 851 Done2(); 852 return; 853 } 854 const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff; 855 const auto op = GetOp8(index); 856 const int consumed = op & 15; 857 buffer_len_ -= consumed; 858 const auto emit_ofs = op >> 8; 859 switch ((op >> 4) & 15) { 860 case 0: { 861 sink_(GetEmit8(index, emit_ofs + 0)); 862 break; 863 } 864 case 1: { 865 DecodeStep2(); 866 break; 867 } 868 case 2: { 869 DecodeStep5(); 870 break; 871 } 872 case 3: { 873 DecodeStep3(); 874 break; 875 } 876 case 4: { 877 DecodeStep7(); 878 break; 879 } 880 case 5: { 881 DecodeStep4(); 882 break; 883 } 884 case 6: { 885 DecodeStep6(); 886 break; 887 } 888 case 7: { 889 DecodeStep8(); 890 break; 891 } 892 case 8: { 893 DecodeStep9(); 894 break; 895 } 896 } 897 } RefillTo8()898 bool RefillTo8() { 899 switch (buffer_len_) { 900 case 0: { 901 return Read1to8Bytes(); 902 } 903 case 1: 904 case 2: 905 case 3: 906 case 4: 907 case 5: 908 case 6: 909 case 7: { 910 return Read1to7Bytes(); 911 } 912 } 913 return true; 914 } Done2()915 void Done2() { 916 done_ = true; 917 switch (end_ - begin_) {} 918 switch (buffer_len_) { 919 case 1: 920 case 2: { 921 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 922 return; 923 } 924 case 3: { 925 const auto index = buffer_ & 7; 926 const auto op = GetOp9(index); 927 switch (op & 3) { 928 case 0: { 929 sink_(GetEmit9(index, (op >> 2) + 0)); 930 break; 931 } 932 case 1: { 933 ok_ = false; 934 break; 935 } 936 } 937 return; 938 } 939 case 4: { 940 const auto index = buffer_ & 15; 941 const auto op = GetOp10(index); 942 switch (op & 3) { 943 case 0: { 944 ok_ = false; 945 break; 946 } 947 case 1: { 948 sink_(GetEmit10(index, (op >> 2) + 0)); 949 break; 950 } 951 } 952 return; 953 } 954 case 5: { 955 const auto index = buffer_ & 31; 956 const auto op = GetOp11(index); 957 switch (op & 3) { 958 case 0: { 959 ok_ = false; 960 break; 961 } 962 case 1: { 963 sink_(GetEmit11(index, (op >> 2) + 0)); 964 break; 965 } 966 } 967 return; 968 } 969 case 6: { 970 const auto index = buffer_ & 63; 971 const auto op = GetOp12(index); 972 switch (op & 3) { 973 case 0: { 974 ok_ = false; 975 break; 976 } 977 case 1: { 978 sink_(GetEmit12(index, (op >> 2) + 0)); 979 break; 980 } 981 } 982 return; 983 } 984 case 7: { 985 const auto index = buffer_ & 127; 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 break; 995 } 996 } 997 return; 998 } 999 case 0: { 1000 return; 1001 } 1002 } 1003 } DecodeStep2()1004 void DecodeStep2() { 1005 if (!RefillTo1()) { 1006 Done3(); 1007 return; 1008 } 1009 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1010 const auto op = GetOp14(index); 1011 const int consumed = op & 1; 1012 buffer_len_ -= consumed; 1013 const auto emit_ofs = op >> 1; 1014 sink_(GetEmit14(index, emit_ofs + 0)); 1015 } Done3()1016 void Done3() { 1017 done_ = true; 1018 ok_ = false; 1019 } DecodeStep3()1020 void DecodeStep3() { 1021 if (!RefillTo2()) { 1022 Done4(); 1023 return; 1024 } 1025 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1026 const auto op = GetOp15(index); 1027 const int consumed = op & 3; 1028 buffer_len_ -= consumed; 1029 const auto emit_ofs = op >> 2; 1030 sink_(GetEmit15(index, emit_ofs + 0)); 1031 } RefillTo2()1032 bool RefillTo2() { 1033 switch (buffer_len_) { 1034 case 0: { 1035 return Read1to8Bytes(); 1036 } 1037 case 1: { 1038 return Read1to7Bytes(); 1039 } 1040 } 1041 return true; 1042 } Done4()1043 void Done4() { 1044 done_ = true; 1045 switch (buffer_len_) { 1046 case 1: 1047 case 0: { 1048 ok_ = false; 1049 return; 1050 } 1051 } 1052 } DecodeStep4()1053 void DecodeStep4() { 1054 if (!RefillTo3()) { 1055 Done5(); 1056 return; 1057 } 1058 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 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 } RefillTo3()1065 bool RefillTo3() { 1066 switch (buffer_len_) { 1067 case 0: { 1068 return Read1to8Bytes(); 1069 } 1070 case 1: 1071 case 2: { 1072 return Read1to7Bytes(); 1073 } 1074 } 1075 return true; 1076 } Done5()1077 void Done5() { 1078 done_ = true; 1079 switch (buffer_len_) { 1080 case 1: 1081 case 2: 1082 case 0: { 1083 ok_ = false; 1084 return; 1085 } 1086 } 1087 } DecodeStep5()1088 void DecodeStep5() { 1089 if (!RefillTo2()) { 1090 Done6(); 1091 return; 1092 } 1093 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1094 const auto op = GetOp17(index); 1095 const int consumed = op & 3; 1096 buffer_len_ -= consumed; 1097 const auto emit_ofs = op >> 2; 1098 sink_(GetEmit17(index, emit_ofs + 0)); 1099 } Done6()1100 void Done6() { 1101 done_ = true; 1102 switch (buffer_len_) { 1103 case 1: { 1104 const auto index = buffer_ & 1; 1105 const auto op = GetOp18(index); 1106 switch (op & 1) { 1107 case 0: { 1108 sink_(GetEmit18(index, (op >> 1) + 0)); 1109 break; 1110 } 1111 case 1: { 1112 ok_ = false; 1113 break; 1114 } 1115 } 1116 return; 1117 } 1118 case 0: { 1119 ok_ = false; 1120 return; 1121 } 1122 } 1123 } DecodeStep6()1124 void DecodeStep6() { 1125 if (!RefillTo4()) { 1126 Done7(); 1127 return; 1128 } 1129 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1130 const auto op = GetOp19(index); 1131 const int consumed = op & 7; 1132 buffer_len_ -= consumed; 1133 const auto emit_ofs = op >> 3; 1134 sink_(GetEmit19(index, emit_ofs + 0)); 1135 } RefillTo4()1136 bool RefillTo4() { 1137 switch (buffer_len_) { 1138 case 0: { 1139 return Read1to8Bytes(); 1140 } 1141 case 1: 1142 case 2: 1143 case 3: { 1144 return Read1to7Bytes(); 1145 } 1146 } 1147 return true; 1148 } Done7()1149 void Done7() { 1150 done_ = true; 1151 switch (buffer_len_) { 1152 case 1: 1153 case 2: 1154 case 0: { 1155 ok_ = false; 1156 return; 1157 } 1158 case 3: { 1159 const auto index = buffer_ & 7; 1160 const auto op = GetOp20(index); 1161 switch (op & 1) { 1162 case 0: { 1163 sink_(GetEmit20(index, (op >> 1) + 0)); 1164 break; 1165 } 1166 case 1: { 1167 ok_ = false; 1168 break; 1169 } 1170 } 1171 return; 1172 } 1173 } 1174 } DecodeStep7()1175 void DecodeStep7() { 1176 if (!RefillTo3()) { 1177 Done8(); 1178 return; 1179 } 1180 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1181 const auto op = GetOp21(index); 1182 const int consumed = op & 3; 1183 buffer_len_ -= consumed; 1184 const auto emit_ofs = op >> 2; 1185 sink_(GetEmit21(index, emit_ofs + 0)); 1186 } Done8()1187 void Done8() { 1188 done_ = true; 1189 switch (buffer_len_) { 1190 case 1: 1191 case 0: { 1192 ok_ = false; 1193 return; 1194 } 1195 case 2: { 1196 const auto index = buffer_ & 3; 1197 const auto op = GetOp22(index); 1198 switch (op & 1) { 1199 case 0: { 1200 sink_(GetEmit22(index, (op >> 1) + 0)); 1201 break; 1202 } 1203 case 1: { 1204 ok_ = false; 1205 break; 1206 } 1207 } 1208 return; 1209 } 1210 } 1211 } DecodeStep8()1212 void DecodeStep8() { 1213 if (!RefillTo5()) { 1214 Done9(); 1215 return; 1216 } 1217 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1218 const auto op = GetOp23(index); 1219 const int consumed = op & 7; 1220 buffer_len_ -= consumed; 1221 const auto emit_ofs = op >> 3; 1222 sink_(GetEmit23(index, emit_ofs + 0)); 1223 } RefillTo5()1224 bool RefillTo5() { 1225 switch (buffer_len_) { 1226 case 0: { 1227 return Read1to8Bytes(); 1228 } 1229 case 1: 1230 case 2: 1231 case 3: 1232 case 4: { 1233 return Read1to7Bytes(); 1234 } 1235 } 1236 return true; 1237 } Done9()1238 void Done9() { 1239 done_ = true; 1240 switch (buffer_len_) { 1241 case 1: 1242 case 2: 1243 case 3: 1244 case 0: { 1245 ok_ = false; 1246 return; 1247 } 1248 case 4: { 1249 const auto index = buffer_ & 15; 1250 const auto op = GetOp24(index); 1251 switch (op & 1) { 1252 case 0: { 1253 sink_(GetEmit24(index, (op >> 1) + 0)); 1254 break; 1255 } 1256 case 1: { 1257 ok_ = false; 1258 break; 1259 } 1260 } 1261 return; 1262 } 1263 } 1264 } DecodeStep9()1265 void DecodeStep9() { 1266 if (!RefillTo12()) { 1267 Done10(); 1268 return; 1269 } 1270 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 1271 const auto op = GetOp25(index); 1272 const int consumed = op & 15; 1273 buffer_len_ -= consumed; 1274 const auto emit_ofs = op >> 5; 1275 switch ((op >> 4) & 1) { 1276 case 0: { 1277 sink_(GetEmit25(index, emit_ofs + 0)); 1278 break; 1279 } 1280 case 1: { 1281 begin_ = end_; 1282 buffer_len_ = 0; 1283 break; 1284 } 1285 } 1286 } RefillTo12()1287 bool RefillTo12() { 1288 switch (buffer_len_) { 1289 case 0: { 1290 return Read2to8Bytes(); 1291 } 1292 case 1: 1293 case 2: 1294 case 3: { 1295 return Read2to7Bytes(); 1296 } 1297 case 4: 1298 case 5: 1299 case 6: 1300 case 7: 1301 case 8: { 1302 return Read1to7Bytes(); 1303 } 1304 case 9: 1305 case 10: 1306 case 11: { 1307 return Read1to6Bytes(); 1308 } 1309 } 1310 return true; 1311 } Done10()1312 void Done10() { 1313 done_ = true; 1314 switch (end_ - begin_) { 1315 case 1: { 1316 Fill1(); 1317 break; 1318 } 1319 } 1320 switch (buffer_len_) { 1321 case 1: 1322 case 2: 1323 case 3: 1324 case 4: { 1325 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1326 return; 1327 } 1328 case 5: { 1329 const auto index = buffer_ & 31; 1330 const auto op = GetOp26(index); 1331 switch (op & 3) { 1332 case 0: { 1333 sink_(GetEmit26(index, (op >> 2) + 0)); 1334 break; 1335 } 1336 case 1: { 1337 ok_ = false; 1338 break; 1339 } 1340 } 1341 return; 1342 } 1343 case 6: { 1344 const auto index = buffer_ & 63; 1345 const auto op = GetOp27(index); 1346 switch (op & 3) { 1347 case 0: { 1348 ok_ = false; 1349 break; 1350 } 1351 case 1: { 1352 sink_(GetEmit27(index, (op >> 2) + 0)); 1353 break; 1354 } 1355 } 1356 return; 1357 } 1358 case 7: { 1359 const auto index = buffer_ & 127; 1360 const auto op = GetOp28(index); 1361 switch (op & 3) { 1362 case 0: { 1363 ok_ = false; 1364 break; 1365 } 1366 case 1: { 1367 sink_(GetEmit28(index, (op >> 2) + 0)); 1368 break; 1369 } 1370 } 1371 return; 1372 } 1373 case 8: { 1374 const auto index = buffer_ & 255; 1375 const auto op = GetOp29(index); 1376 switch (op & 3) { 1377 case 0: { 1378 ok_ = false; 1379 break; 1380 } 1381 case 1: { 1382 sink_(GetEmit29(index, (op >> 2) + 0)); 1383 break; 1384 } 1385 } 1386 return; 1387 } 1388 case 9: { 1389 const auto index = buffer_ & 511; 1390 const auto op = GetOp30(index); 1391 switch (op & 3) { 1392 case 0: { 1393 ok_ = false; 1394 break; 1395 } 1396 case 1: { 1397 sink_(GetEmit30(index, (op >> 2) + 0)); 1398 break; 1399 } 1400 } 1401 return; 1402 } 1403 case 10: { 1404 const auto index = buffer_ & 1023; 1405 const auto op = GetOp31(index); 1406 switch (op & 3) { 1407 case 0: { 1408 sink_(GetEmit31(index, (op >> 2) + 0)); 1409 sink_(GetEmit31(index, (op >> 2) + 1)); 1410 break; 1411 } 1412 case 1: { 1413 ok_ = false; 1414 break; 1415 } 1416 case 2: { 1417 sink_(GetEmit31(index, (op >> 2) + 0)); 1418 break; 1419 } 1420 } 1421 return; 1422 } 1423 case 11: { 1424 const auto index = buffer_ & 2047; 1425 const auto op = GetOp32(index); 1426 switch (op & 3) { 1427 case 0: { 1428 ok_ = false; 1429 break; 1430 } 1431 case 1: { 1432 sink_(GetEmit32(index, (op >> 2) + 0)); 1433 sink_(GetEmit32(index, (op >> 2) + 1)); 1434 break; 1435 } 1436 case 2: { 1437 sink_(GetEmit32(index, (op >> 2) + 0)); 1438 break; 1439 } 1440 } 1441 return; 1442 } 1443 case 0: { 1444 return; 1445 } 1446 } 1447 } DecodeStep10()1448 void DecodeStep10() { 1449 if (!RefillTo2()) { 1450 Done11(); 1451 return; 1452 } 1453 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1454 const auto op = GetOp33(index); 1455 const int consumed = op & 3; 1456 buffer_len_ -= consumed; 1457 const auto emit_ofs = op >> 2; 1458 sink_(GetEmit33(index, emit_ofs + 0)); 1459 } Done11()1460 void Done11() { 1461 done_ = true; 1462 switch (buffer_len_) { 1463 case 1: { 1464 const auto index = buffer_ & 1; 1465 const auto op = GetOp34(index); 1466 switch (op & 1) { 1467 case 0: { 1468 sink_(GetEmit34(index, (op >> 1) + 0)); 1469 break; 1470 } 1471 case 1: { 1472 ok_ = false; 1473 break; 1474 } 1475 } 1476 return; 1477 } 1478 case 0: { 1479 ok_ = false; 1480 return; 1481 } 1482 } 1483 } 1484 F sink_; 1485 const uint8_t* begin_; 1486 const uint8_t* const end_; 1487 uint64_t buffer_ = 0; 1488 int buffer_len_ = 0; 1489 bool ok_ = true; 1490 bool done_ = false; 1491 }; 1492 } // namespace geometry_10_8_12 1493 } // namespace grpc_core 1494 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_8_12_H 1495