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_7_11_12_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_11_12_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_7_11_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 } GetOp1(size_t i)36 static inline uint64_t GetOp1(size_t i) { 37 return table1_0_inner_[table1_0_outer_[i]]; 38 } GetEmit1(size_t,size_t emit)39 static inline uint64_t GetEmit1(size_t, size_t emit) { 40 return table1_0_emit_[emit]; 41 } GetOp4(size_t i)42 static inline uint64_t GetOp4(size_t i) { return i ? 3 : 1; } GetEmit4(size_t,size_t emit)43 static inline uint64_t GetEmit4(size_t, size_t emit) { 44 return emit ? 42 : 38; 45 } GetOp5(size_t i)46 static inline uint64_t GetOp5(size_t i) { return i ? 3 : 1; } GetEmit5(size_t,size_t emit)47 static inline uint64_t GetEmit5(size_t, size_t emit) { 48 return emit ? 59 : 44; 49 } GetOp6(size_t i)50 static inline uint64_t GetOp6(size_t i) { return i ? 3 : 1; } GetEmit6(size_t,size_t emit)51 static inline uint64_t GetEmit6(size_t, size_t emit) { 52 return emit ? 90 : 88; 53 } GetOp8(size_t i)54 static inline uint64_t GetOp8(size_t i) { 55 return table8_0_inner_[(i < 6 ? (i) : ((i - 6) + 5))]; 56 } GetEmit8(size_t,size_t emit)57 static inline uint64_t GetEmit8(size_t, size_t emit) { 58 return table8_0_emit_[emit]; 59 } GetOp9(size_t i)60 static inline uint64_t GetOp9(size_t i) { 61 return table9_0_inner_[table9_0_outer_[i]]; 62 } GetEmit9(size_t,size_t emit)63 static inline uint64_t GetEmit9(size_t, size_t emit) { 64 return table9_0_emit_[emit]; 65 } GetOp10(size_t i)66 static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; } GetEmit10(size_t,size_t emit)67 static inline uint64_t GetEmit10(size_t, size_t emit) { 68 return table10_0_emit_[emit]; 69 } GetOp11(size_t i)70 static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; } GetEmit11(size_t,size_t emit)71 static inline uint64_t GetEmit11(size_t, size_t emit) { 72 return table11_0_emit_[emit]; 73 } GetOp12(size_t i)74 static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; } GetEmit12(size_t,size_t emit)75 static inline uint64_t GetEmit12(size_t, size_t emit) { 76 return table12_0_emit_[emit]; 77 } GetOp13(size_t i)78 static inline uint64_t GetOp13(size_t i) { 79 return table13_ops_[i >> 6][i & 0x3f]; 80 } GetEmit13(size_t i,size_t emit)81 static inline uint64_t GetEmit13(size_t i, size_t emit) { 82 return table13_emit_[i >> 6][emit]; 83 } GetOp14(size_t i)84 static inline uint64_t GetOp14(size_t i) { 85 return table14_ops_[i >> 6][i & 0x3f]; 86 } GetEmit14(size_t i,size_t emit)87 static inline uint64_t GetEmit14(size_t i, size_t emit) { 88 return table14_emit_[i >> 6][emit]; 89 } GetOp15(size_t i)90 static inline uint64_t GetOp15(size_t i) { 91 return table15_ops_[i >> 6][i & 0x3f]; 92 } GetEmit15(size_t i,size_t emit)93 static inline uint64_t GetEmit15(size_t i, size_t emit) { 94 return table15_emit_[i >> 6][emit]; 95 } GetOp7(size_t i)96 static inline uint64_t GetOp7(size_t i) { 97 return table7_ops_[i >> 6][i & 0x3f]; 98 } GetEmit7(size_t i,size_t emit)99 static inline uint64_t GetEmit7(size_t i, size_t emit) { 100 return table7_emit_[i >> 6][emit]; 101 } GetOp16(size_t i)102 static inline uint64_t GetOp16(size_t i) { return i ? 3 : 1; } GetEmit16(size_t,size_t emit)103 static inline uint64_t GetEmit16(size_t, size_t emit) { 104 return emit ? 195 : 92; 105 } GetOp17(size_t i)106 static inline uint64_t GetOp17(size_t i) { 107 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 108 } GetEmit17(size_t,size_t emit)109 static inline uint64_t GetEmit17(size_t, size_t emit) { 110 return (emit < 2 ? (emit ? 162 : 131) : ((emit - 2) ? 194 : 184)); 111 } GetOp18(size_t i)112 static inline uint64_t GetOp18(size_t i) { return table18_0_inner_[i]; } GetEmit18(size_t,size_t emit)113 static inline uint64_t GetEmit18(size_t, size_t emit) { 114 return table18_0_emit_[emit]; 115 } GetOp20(size_t i)116 static inline uint64_t GetOp20(size_t i) { return i; } GetEmit20(size_t,size_t emit)117 static inline uint64_t GetEmit20(size_t, size_t emit) { 118 return ((void)emit, 208); 119 } GetOp19(size_t i)120 static inline uint64_t GetOp19(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 } GetEmit19(size_t,size_t emit)125 static inline uint64_t GetEmit19(size_t, size_t emit) { 126 return (emit < 1 ? (((void)emit, 208)) : ((emit - 1) ? 130 : 128)); 127 } GetOp22(size_t i)128 static inline uint64_t GetOp22(size_t i) { 129 return (i < 1 ? (((void)i, 0)) : (((void)(i - 1), 1))); 130 } GetEmit22(size_t,size_t emit)131 static inline uint64_t GetEmit22(size_t, size_t emit) { 132 return ((void)emit, 230); 133 } GetOp21(size_t i)134 static inline uint64_t GetOp21(size_t i) { 135 return table21_0_inner_[(i < 1 ? (((void)i, 0)) : ((i - 1)))]; 136 } GetEmit21(size_t,size_t emit)137 static inline uint64_t GetEmit21(size_t, size_t emit) { 138 return table21_0_emit_[emit]; 139 } GetOp24(size_t i)140 static inline uint64_t GetOp24(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 } GetEmit24(size_t,size_t emit)145 static inline uint64_t GetEmit24(size_t, size_t emit) { 146 return emit ? 226 : 224; 147 } GetOp23(size_t i)148 static inline uint64_t GetOp23(size_t i) { 149 return table23_0_inner_[(i < 3 ? (i / 2 + 0) : ((i - 3) + 1))]; 150 } 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) { 155 return table26_0_inner_[(i < 12 ? (i) : (((void)(i - 12), 12)))]; 156 } GetEmit26(size_t,size_t emit)157 static inline uint64_t GetEmit26(size_t, size_t emit) { 158 return table26_0_emit_[emit]; 159 } GetOp25(size_t i)160 static inline uint64_t GetOp25(size_t i) { return table25_0_ops_[i]; } GetEmit25(size_t,size_t emit)161 static inline uint64_t GetEmit25(size_t, size_t emit) { 162 return table25_0_emit_[emit]; 163 } GetOp28(size_t i)164 static inline uint64_t GetOp28(size_t i) { return table28_0_ops_[i]; } GetEmit28(size_t,size_t emit)165 static inline uint64_t GetEmit28(size_t, size_t emit) { 166 return table28_0_emit_[emit]; 167 } GetOp29(size_t i)168 static inline uint64_t GetOp29(size_t i) { return table29_0_ops_[i]; } GetEmit29(size_t,size_t emit)169 static inline uint64_t GetEmit29(size_t, size_t emit) { 170 return table29_0_emit_[emit]; 171 } GetOp30(size_t i)172 static inline uint64_t GetOp30(size_t i) { return table30_0_ops_[i]; } GetEmit30(size_t,size_t emit)173 static inline uint64_t GetEmit30(size_t, size_t emit) { 174 return table30_0_emit_[emit]; 175 } GetOp31(size_t i)176 static inline uint64_t GetOp31(size_t i) { return table31_0_ops_[i]; } GetEmit31(size_t,size_t emit)177 static inline uint64_t GetEmit31(size_t, size_t emit) { 178 return table31_0_emit_[emit]; 179 } GetOp32(size_t i)180 static inline uint64_t GetOp32(size_t i) { 181 return table32_ops_[i >> 6][i & 0x3f]; 182 } GetEmit32(size_t i,size_t emit)183 static inline uint64_t GetEmit32(size_t i, size_t emit) { 184 return table32_emit_[i >> 6][emit]; 185 } GetOp33(size_t i)186 static inline uint64_t GetOp33(size_t i) { 187 return table33_ops_[i >> 6][i & 0x3f]; 188 } GetEmit33(size_t i,size_t emit)189 static inline uint64_t GetEmit33(size_t i, size_t emit) { 190 return table33_emit_[i >> 6][emit]; 191 } GetOp34(size_t i)192 static inline uint64_t GetOp34(size_t i) { 193 return table34_ops_[i >> 6][i & 0x3f]; 194 } GetEmit34(size_t i,size_t emit)195 static inline uint64_t GetEmit34(size_t i, size_t emit) { 196 return table34_emit_[i >> 6][emit]; 197 } GetOp27(size_t i)198 static inline uint64_t GetOp27(size_t i) { 199 return table27_ops_[i >> 7][i & 0x7f]; 200 } GetEmit27(size_t i,size_t emit)201 static inline uint64_t GetEmit27(size_t i, size_t emit) { 202 return table27_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 table1_0_emit_[68]; 211 static const uint16_t table1_0_inner_[72]; 212 static const uint8_t table1_0_outer_[128]; 213 static const uint8_t table8_0_emit_[5]; 214 static const uint8_t table8_0_inner_[7]; 215 static const uint8_t table9_0_emit_[8]; 216 static const uint8_t table9_0_inner_[10]; 217 static const uint8_t table9_0_outer_[16]; 218 static const uint8_t table10_0_emit_[10]; 219 static const uint8_t table10_0_ops_[32]; 220 static const uint8_t table11_0_emit_[16]; 221 static const uint8_t table11_0_ops_[64]; 222 static const uint8_t table12_0_emit_[18]; 223 static const uint8_t table12_0_ops_[128]; 224 static const uint8_t table13_0_emit_[40]; 225 static const uint8_t table13_0_ops_[64]; 226 static const uint8_t table13_1_emit_[40]; 227 static const uint8_t table13_2_emit_[22]; 228 static const uint8_t table13_2_ops_[64]; 229 static const uint8_t table13_3_emit_[14]; 230 static const uint8_t table13_3_ops_[64]; 231 static const uint8_t* const table13_emit_[4]; 232 static const uint8_t* const table13_ops_[4]; 233 static const uint8_t table14_0_emit_[72]; 234 static const uint16_t table14_0_ops_[64]; 235 static const uint8_t table14_1_emit_[72]; 236 static const uint8_t table14_2_emit_[72]; 237 static const uint8_t table14_3_emit_[72]; 238 static const uint8_t table14_4_emit_[72]; 239 static const uint8_t table14_5_emit_[40]; 240 static const uint16_t table14_5_ops_[64]; 241 static const uint8_t table14_6_emit_[22]; 242 static const uint16_t table14_6_ops_[64]; 243 static const uint8_t table14_7_emit_[11]; 244 static const uint16_t table14_7_ops_[64]; 245 static const uint8_t* const table14_emit_[8]; 246 static const uint16_t* const table14_ops_[8]; 247 static const uint8_t table15_0_emit_[44]; 248 static const uint16_t table15_0_ops_[64]; 249 static const uint8_t table15_1_emit_[92]; 250 static const uint16_t table15_1_ops_[64]; 251 static const uint8_t table15_2_emit_[44]; 252 static const uint8_t table15_3_emit_[92]; 253 static const uint8_t table15_4_emit_[44]; 254 static const uint8_t table15_5_emit_[92]; 255 static const uint8_t table15_6_emit_[44]; 256 static const uint8_t table15_7_emit_[92]; 257 static const uint8_t table15_8_emit_[44]; 258 static const uint8_t table15_9_emit_[92]; 259 static const uint8_t table15_10_emit_[72]; 260 static const uint8_t table15_11_emit_[72]; 261 static const uint8_t table15_12_emit_[72]; 262 static const uint8_t table15_13_emit_[40]; 263 static const uint8_t table15_14_emit_[4]; 264 static const uint16_t table15_14_ops_[64]; 265 static const uint8_t table15_15_emit_[7]; 266 static const uint16_t table15_15_ops_[64]; 267 static const uint8_t* const table15_emit_[16]; 268 static const uint16_t* const table15_ops_[16]; 269 static const uint8_t table7_0_emit_[1]; 270 static const uint16_t table7_0_ops_[64]; 271 static const uint8_t table7_4_emit_[1]; 272 static const uint8_t table7_8_emit_[1]; 273 static const uint8_t table7_12_emit_[1]; 274 static const uint8_t table7_16_emit_[1]; 275 static const uint8_t table7_20_emit_[1]; 276 static const uint16_t table7_20_ops_[64]; 277 static const uint8_t table7_22_emit_[1]; 278 static const uint8_t table7_24_emit_[1]; 279 static const uint8_t table7_26_emit_[1]; 280 static const uint16_t table7_26_ops_[64]; 281 static const uint8_t table7_27_emit_[1]; 282 static const uint8_t table7_28_emit_[2]; 283 static const uint16_t table7_28_ops_[64]; 284 static const uint8_t table7_29_emit_[2]; 285 static const uint8_t table7_30_emit_[2]; 286 static const uint8_t table7_31_emit_[5]; 287 static const uint16_t table7_31_ops_[64]; 288 static const uint8_t* const table7_emit_[32]; 289 static const uint16_t* const table7_ops_[32]; 290 static const uint8_t table18_0_emit_[8]; 291 static const uint8_t table18_0_inner_[8]; 292 static const uint8_t table21_0_emit_[15]; 293 static const uint8_t table21_0_inner_[15]; 294 static const uint8_t table23_0_emit_[6]; 295 static const uint8_t table23_0_inner_[6]; 296 static const uint8_t table26_0_emit_[12]; 297 static const uint8_t table26_0_inner_[13]; 298 static const uint8_t table25_0_emit_[20]; 299 static const uint8_t table25_0_ops_[32]; 300 static const uint8_t table28_0_emit_[21]; 301 static const uint8_t table28_0_ops_[32]; 302 static const uint8_t table29_0_emit_[33]; 303 static const uint8_t table29_0_ops_[64]; 304 static const uint8_t table30_0_emit_[37]; 305 static const uint8_t table30_0_ops_[128]; 306 static const uint8_t table31_0_emit_[52]; 307 static const uint8_t table31_0_ops_[256]; 308 static const uint8_t table32_0_emit_[4]; 309 static const uint8_t table32_0_ops_[64]; 310 static const uint8_t table32_1_emit_[4]; 311 static const uint8_t table32_2_emit_[4]; 312 static const uint8_t table32_3_emit_[4]; 313 static const uint8_t table32_4_emit_[4]; 314 static const uint8_t table32_5_emit_[7]; 315 static const uint8_t table32_5_ops_[64]; 316 static const uint8_t table32_6_emit_[10]; 317 static const uint8_t table32_6_ops_[64]; 318 static const uint8_t table32_7_emit_[34]; 319 static const uint8_t table32_7_ops_[64]; 320 static const uint8_t* const table32_emit_[8]; 321 static const uint8_t* const table32_ops_[8]; 322 static const uint8_t table33_0_emit_[40]; 323 static const uint8_t table33_1_emit_[40]; 324 static const uint8_t table33_2_emit_[40]; 325 static const uint8_t table33_3_emit_[40]; 326 static const uint8_t table33_4_emit_[40]; 327 static const uint8_t table33_5_emit_[40]; 328 static const uint8_t table33_6_emit_[40]; 329 static const uint8_t table33_7_emit_[40]; 330 static const uint8_t table33_8_emit_[40]; 331 static const uint8_t table33_9_emit_[40]; 332 static const uint8_t table33_10_emit_[22]; 333 static const uint8_t table33_11_emit_[4]; 334 static const uint8_t table33_11_ops_[64]; 335 static const uint8_t table33_12_emit_[4]; 336 static const uint8_t table33_13_emit_[6]; 337 static const uint8_t table33_13_ops_[64]; 338 static const uint8_t table33_14_emit_[17]; 339 static const uint8_t table33_14_ops_[64]; 340 static const uint8_t table33_15_emit_[46]; 341 static const uint8_t table33_15_ops_[64]; 342 static const uint8_t* const table33_emit_[16]; 343 static const uint8_t* const table33_ops_[16]; 344 static const uint8_t table34_0_emit_[72]; 345 static const uint8_t table34_1_emit_[72]; 346 static const uint8_t table34_2_emit_[72]; 347 static const uint8_t table34_3_emit_[72]; 348 static const uint8_t table34_4_emit_[72]; 349 static const uint8_t table34_5_emit_[72]; 350 static const uint8_t table34_6_emit_[72]; 351 static const uint8_t table34_7_emit_[72]; 352 static const uint8_t table34_8_emit_[72]; 353 static const uint8_t table34_9_emit_[72]; 354 static const uint8_t table34_10_emit_[72]; 355 static const uint8_t table34_11_emit_[72]; 356 static const uint8_t table34_12_emit_[72]; 357 static const uint8_t table34_13_emit_[72]; 358 static const uint8_t table34_14_emit_[72]; 359 static const uint8_t table34_15_emit_[72]; 360 static const uint8_t table34_16_emit_[72]; 361 static const uint8_t table34_17_emit_[72]; 362 static const uint8_t table34_18_emit_[72]; 363 static const uint8_t table34_19_emit_[72]; 364 static const uint8_t table34_20_emit_[72]; 365 static const uint8_t table34_21_emit_[40]; 366 static const uint8_t table34_22_emit_[40]; 367 static const uint8_t table34_23_emit_[40]; 368 static const uint8_t table34_24_emit_[40]; 369 static const uint8_t table34_25_emit_[40]; 370 static const uint8_t table34_26_emit_[40]; 371 static const uint8_t table34_27_emit_[4]; 372 static const uint8_t table34_28_emit_[8]; 373 static const uint16_t table34_28_ops_[64]; 374 static const uint8_t table34_29_emit_[9]; 375 static const uint16_t table34_29_ops_[64]; 376 static const uint8_t table34_30_emit_[16]; 377 static const uint16_t table34_30_ops_[64]; 378 static const uint8_t table34_31_emit_[30]; 379 static const uint16_t table34_31_ops_[64]; 380 static const uint8_t* const table34_emit_[32]; 381 static const uint16_t* const table34_ops_[32]; 382 static const uint8_t table27_0_emit_[1]; 383 static const uint16_t table27_0_ops_[128]; 384 static const uint8_t table27_1_emit_[1]; 385 static const uint8_t table27_2_emit_[1]; 386 static const uint8_t table27_3_emit_[1]; 387 static const uint8_t table27_4_emit_[1]; 388 static const uint8_t table27_5_emit_[1]; 389 static const uint8_t table27_6_emit_[1]; 390 static const uint8_t table27_7_emit_[1]; 391 static const uint8_t table27_8_emit_[1]; 392 static const uint8_t table27_9_emit_[1]; 393 static const uint8_t table27_10_emit_[1]; 394 static const uint8_t table27_11_emit_[1]; 395 static const uint8_t table27_12_emit_[1]; 396 static const uint8_t table27_13_emit_[1]; 397 static const uint8_t table27_14_emit_[1]; 398 static const uint8_t table27_15_emit_[1]; 399 static const uint8_t table27_16_emit_[1]; 400 static const uint8_t table27_17_emit_[1]; 401 static const uint8_t table27_18_emit_[1]; 402 static const uint8_t table27_19_emit_[1]; 403 static const uint8_t table27_20_emit_[1]; 404 static const uint8_t table27_21_emit_[2]; 405 static const uint16_t table27_21_ops_[128]; 406 static const uint8_t table27_22_emit_[2]; 407 static const uint8_t table27_23_emit_[2]; 408 static const uint8_t table27_24_emit_[2]; 409 static const uint8_t table27_25_emit_[2]; 410 static const uint8_t table27_26_emit_[2]; 411 static const uint16_t table27_27_ops_[128]; 412 static const uint16_t table27_28_ops_[128]; 413 static const uint16_t table27_29_ops_[128]; 414 static const uint16_t table27_30_ops_[128]; 415 static const uint8_t table27_31_emit_[33]; 416 static const uint16_t table27_31_ops_[128]; 417 static const uint8_t* const table27_emit_[32]; 418 static const uint16_t* const table27_ops_[32]; 419 }; 420 template <typename F> 421 class HuffDecoder : public HuffDecoderCommon { 422 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)423 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 424 : sink_(sink), begin_(begin), end_(end) {} Run()425 bool Run() { 426 while (!done_) { 427 if (!RefillTo7()) { 428 Done0(); 429 break; 430 } 431 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 432 const auto op = GetOp1(index); 433 const int consumed = op & 7; 434 buffer_len_ -= consumed; 435 const auto emit_ofs = op >> 6; 436 switch ((op >> 3) & 7) { 437 case 0: { 438 sink_(GetEmit1(index, emit_ofs + 0)); 439 break; 440 } 441 case 1: { 442 DecodeStep0(); 443 break; 444 } 445 case 2: { 446 DecodeStep1(); 447 break; 448 } 449 case 3: { 450 DecodeStep2(); 451 break; 452 } 453 case 4: { 454 DecodeStep3(); 455 break; 456 } 457 } 458 } 459 return ok_; 460 } 461 462 private: RefillTo7()463 bool RefillTo7() { 464 switch (buffer_len_) { 465 case 0: { 466 return Read1to8Bytes(); 467 } 468 case 1: 469 case 2: 470 case 3: 471 case 4: 472 case 5: 473 case 6: { 474 return Read1to7Bytes(); 475 } 476 } 477 return true; 478 } Read1to8Bytes()479 bool Read1to8Bytes() { 480 switch (end_ - begin_) { 481 case 0: { 482 return false; 483 } 484 case 1: { 485 Fill1(); 486 return true; 487 } 488 case 2: { 489 Fill2(); 490 return true; 491 } 492 case 3: { 493 Fill3(); 494 return true; 495 } 496 case 4: { 497 Fill4(); 498 return true; 499 } 500 case 5: { 501 Fill5(); 502 return true; 503 } 504 case 6: { 505 Fill6(); 506 return true; 507 } 508 case 7: { 509 Fill7(); 510 return true; 511 } 512 default: { 513 Fill8(); 514 return true; 515 } 516 } 517 } Fill1()518 void Fill1() { 519 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 520 begin_ += 1; 521 buffer_len_ += 8; 522 } Fill2()523 void Fill2() { 524 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 525 (static_cast<uint64_t>(begin_[1]) << 0); 526 begin_ += 2; 527 buffer_len_ += 16; 528 } Fill3()529 void Fill3() { 530 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 531 (static_cast<uint64_t>(begin_[1]) << 8) | 532 (static_cast<uint64_t>(begin_[2]) << 0); 533 begin_ += 3; 534 buffer_len_ += 24; 535 } Fill4()536 void Fill4() { 537 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 538 (static_cast<uint64_t>(begin_[1]) << 16) | 539 (static_cast<uint64_t>(begin_[2]) << 8) | 540 (static_cast<uint64_t>(begin_[3]) << 0); 541 begin_ += 4; 542 buffer_len_ += 32; 543 } Fill5()544 void Fill5() { 545 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 546 (static_cast<uint64_t>(begin_[1]) << 24) | 547 (static_cast<uint64_t>(begin_[2]) << 16) | 548 (static_cast<uint64_t>(begin_[3]) << 8) | 549 (static_cast<uint64_t>(begin_[4]) << 0); 550 begin_ += 5; 551 buffer_len_ += 40; 552 } Fill6()553 void Fill6() { 554 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 555 (static_cast<uint64_t>(begin_[1]) << 32) | 556 (static_cast<uint64_t>(begin_[2]) << 24) | 557 (static_cast<uint64_t>(begin_[3]) << 16) | 558 (static_cast<uint64_t>(begin_[4]) << 8) | 559 (static_cast<uint64_t>(begin_[5]) << 0); 560 begin_ += 6; 561 buffer_len_ += 48; 562 } Fill7()563 void Fill7() { 564 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 565 (static_cast<uint64_t>(begin_[1]) << 40) | 566 (static_cast<uint64_t>(begin_[2]) << 32) | 567 (static_cast<uint64_t>(begin_[3]) << 24) | 568 (static_cast<uint64_t>(begin_[4]) << 16) | 569 (static_cast<uint64_t>(begin_[5]) << 8) | 570 (static_cast<uint64_t>(begin_[6]) << 0); 571 begin_ += 7; 572 buffer_len_ += 56; 573 } Fill8()574 void Fill8() { 575 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 576 (static_cast<uint64_t>(begin_[1]) << 48) | 577 (static_cast<uint64_t>(begin_[2]) << 40) | 578 (static_cast<uint64_t>(begin_[3]) << 32) | 579 (static_cast<uint64_t>(begin_[4]) << 24) | 580 (static_cast<uint64_t>(begin_[5]) << 16) | 581 (static_cast<uint64_t>(begin_[6]) << 8) | 582 (static_cast<uint64_t>(begin_[7]) << 0); 583 begin_ += 8; 584 buffer_len_ += 64; 585 } Read1to7Bytes()586 bool Read1to7Bytes() { 587 switch (end_ - begin_) { 588 case 0: { 589 return false; 590 } 591 case 1: { 592 Fill1(); 593 return true; 594 } 595 case 2: { 596 Fill2(); 597 return true; 598 } 599 case 3: { 600 Fill3(); 601 return true; 602 } 603 case 4: { 604 Fill4(); 605 return true; 606 } 607 case 5: { 608 Fill5(); 609 return true; 610 } 611 case 6: { 612 Fill6(); 613 return true; 614 } 615 default: { 616 Fill7(); 617 return true; 618 } 619 } 620 } Done0()621 void Done0() { 622 done_ = true; 623 switch (buffer_len_) { 624 case 1: 625 case 2: 626 case 3: 627 case 4: { 628 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 629 return; 630 } 631 case 5: { 632 const auto index = buffer_ & 31; 633 const auto op = GetOp2(index); 634 switch (op & 3) { 635 case 0: { 636 sink_(GetEmit2(index, (op >> 2) + 0)); 637 break; 638 } 639 case 1: { 640 ok_ = false; 641 break; 642 } 643 } 644 return; 645 } 646 case 6: { 647 const auto index = buffer_ & 63; 648 const auto op = GetOp3(index); 649 switch (op & 3) { 650 case 0: { 651 ok_ = false; 652 break; 653 } 654 case 1: { 655 sink_(GetEmit3(index, (op >> 2) + 0)); 656 break; 657 } 658 } 659 return; 660 } 661 case 0: { 662 return; 663 } 664 } 665 } DecodeStep0()666 void DecodeStep0() { 667 if (!RefillTo1()) { 668 Done1(); 669 return; 670 } 671 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 672 const auto op = GetOp4(index); 673 const int consumed = op & 1; 674 buffer_len_ -= consumed; 675 const auto emit_ofs = op >> 1; 676 sink_(GetEmit4(index, emit_ofs + 0)); 677 } RefillTo1()678 bool RefillTo1() { 679 switch (buffer_len_) { 680 case 0: { 681 return Read1to8Bytes(); 682 } 683 } 684 return true; 685 } Done1()686 void Done1() { 687 done_ = true; 688 ok_ = false; 689 } DecodeStep1()690 void DecodeStep1() { 691 if (!RefillTo1()) { 692 Done2(); 693 return; 694 } 695 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 696 const auto op = GetOp5(index); 697 const int consumed = op & 1; 698 buffer_len_ -= consumed; 699 const auto emit_ofs = op >> 1; 700 sink_(GetEmit5(index, emit_ofs + 0)); 701 } Done2()702 void Done2() { 703 done_ = true; 704 ok_ = false; 705 } DecodeStep2()706 void DecodeStep2() { 707 if (!RefillTo1()) { 708 Done3(); 709 return; 710 } 711 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 712 const auto op = GetOp6(index); 713 const int consumed = op & 1; 714 buffer_len_ -= consumed; 715 const auto emit_ofs = op >> 1; 716 sink_(GetEmit6(index, emit_ofs + 0)); 717 } Done3()718 void Done3() { 719 done_ = true; 720 ok_ = false; 721 } DecodeStep3()722 void DecodeStep3() { 723 if (!RefillTo11()) { 724 Done4(); 725 return; 726 } 727 const auto index = (buffer_ >> (buffer_len_ - 11)) & 0x7ff; 728 const auto op = GetOp7(index); 729 const int consumed = op & 15; 730 buffer_len_ -= consumed; 731 const auto emit_ofs = op >> 8; 732 switch ((op >> 4) & 15) { 733 case 0: { 734 sink_(GetEmit7(index, emit_ofs + 0)); 735 break; 736 } 737 case 1: { 738 DecodeStep4(); 739 break; 740 } 741 case 2: { 742 DecodeStep7(); 743 break; 744 } 745 case 3: { 746 DecodeStep5(); 747 break; 748 } 749 case 4: { 750 DecodeStep9(); 751 break; 752 } 753 case 5: { 754 DecodeStep6(); 755 break; 756 } 757 case 6: { 758 DecodeStep8(); 759 break; 760 } 761 case 7: { 762 DecodeStep10(); 763 break; 764 } 765 case 8: { 766 DecodeStep11(); 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 } Done4()894 void Done4() { 895 done_ = true; 896 switch (end_ - begin_) { 897 case 1: { 898 Fill1(); 899 break; 900 } 901 } 902 switch (buffer_len_) { 903 case 1: 904 case 2: { 905 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 906 return; 907 } 908 case 3: { 909 const auto index = buffer_ & 7; 910 const auto op = GetOp8(index); 911 switch (op & 3) { 912 case 0: { 913 sink_(GetEmit8(index, (op >> 2) + 0)); 914 break; 915 } 916 case 1: { 917 ok_ = false; 918 break; 919 } 920 } 921 return; 922 } 923 case 4: { 924 const auto index = buffer_ & 15; 925 const auto op = GetOp9(index); 926 switch (op & 3) { 927 case 0: { 928 ok_ = false; 929 break; 930 } 931 case 1: { 932 sink_(GetEmit9(index, (op >> 2) + 0)); 933 break; 934 } 935 } 936 return; 937 } 938 case 5: { 939 const auto index = buffer_ & 31; 940 const auto op = GetOp10(index); 941 switch (op & 3) { 942 case 0: { 943 ok_ = false; 944 break; 945 } 946 case 1: { 947 sink_(GetEmit10(index, (op >> 2) + 0)); 948 break; 949 } 950 } 951 return; 952 } 953 case 6: { 954 const auto index = buffer_ & 63; 955 const auto op = GetOp11(index); 956 switch (op & 3) { 957 case 0: { 958 ok_ = false; 959 break; 960 } 961 case 1: { 962 sink_(GetEmit11(index, (op >> 2) + 0)); 963 break; 964 } 965 } 966 return; 967 } 968 case 7: { 969 const auto index = buffer_ & 127; 970 const auto op = GetOp12(index); 971 switch (op & 3) { 972 case 0: { 973 ok_ = false; 974 break; 975 } 976 case 1: { 977 sink_(GetEmit12(index, (op >> 2) + 0)); 978 break; 979 } 980 } 981 return; 982 } 983 case 8: { 984 const auto index = buffer_ & 255; 985 const auto op = GetOp13(index); 986 switch (op & 3) { 987 case 0: { 988 sink_(GetEmit13(index, (op >> 2) + 0)); 989 sink_(GetEmit13(index, (op >> 2) + 1)); 990 break; 991 } 992 case 1: { 993 ok_ = false; 994 break; 995 } 996 case 2: { 997 sink_(GetEmit13(index, (op >> 2) + 0)); 998 break; 999 } 1000 } 1001 return; 1002 } 1003 case 9: { 1004 const auto index = buffer_ & 511; 1005 const auto op = GetOp14(index); 1006 switch (op & 3) { 1007 case 0: { 1008 ok_ = false; 1009 break; 1010 } 1011 case 1: { 1012 sink_(GetEmit14(index, (op >> 2) + 0)); 1013 sink_(GetEmit14(index, (op >> 2) + 1)); 1014 break; 1015 } 1016 case 2: { 1017 sink_(GetEmit14(index, (op >> 2) + 0)); 1018 break; 1019 } 1020 } 1021 return; 1022 } 1023 case 10: { 1024 const auto index = buffer_ & 1023; 1025 const auto op = GetOp15(index); 1026 switch (op & 3) { 1027 case 0: { 1028 ok_ = false; 1029 break; 1030 } 1031 case 1: { 1032 sink_(GetEmit15(index, (op >> 2) + 0)); 1033 sink_(GetEmit15(index, (op >> 2) + 1)); 1034 break; 1035 } 1036 case 2: { 1037 sink_(GetEmit15(index, (op >> 2) + 0)); 1038 break; 1039 } 1040 } 1041 return; 1042 } 1043 case 0: { 1044 return; 1045 } 1046 } 1047 } DecodeStep4()1048 void DecodeStep4() { 1049 if (!RefillTo1()) { 1050 Done5(); 1051 return; 1052 } 1053 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 1054 const auto op = GetOp16(index); 1055 const int consumed = op & 1; 1056 buffer_len_ -= consumed; 1057 const auto emit_ofs = op >> 1; 1058 sink_(GetEmit16(index, emit_ofs + 0)); 1059 } Done5()1060 void Done5() { 1061 done_ = true; 1062 ok_ = false; 1063 } DecodeStep5()1064 void DecodeStep5() { 1065 if (!RefillTo2()) { 1066 Done6(); 1067 return; 1068 } 1069 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1070 const auto op = GetOp17(index); 1071 const int consumed = op & 3; 1072 buffer_len_ -= consumed; 1073 const auto emit_ofs = op >> 2; 1074 sink_(GetEmit17(index, emit_ofs + 0)); 1075 } RefillTo2()1076 bool RefillTo2() { 1077 switch (buffer_len_) { 1078 case 0: { 1079 return Read1to8Bytes(); 1080 } 1081 case 1: { 1082 return Read1to7Bytes(); 1083 } 1084 } 1085 return true; 1086 } Done6()1087 void Done6() { 1088 done_ = true; 1089 switch (buffer_len_) { 1090 case 1: 1091 case 0: { 1092 ok_ = false; 1093 return; 1094 } 1095 } 1096 } DecodeStep6()1097 void DecodeStep6() { 1098 if (!RefillTo3()) { 1099 Done7(); 1100 return; 1101 } 1102 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1103 const auto op = GetOp18(index); 1104 const int consumed = op & 3; 1105 buffer_len_ -= consumed; 1106 const auto emit_ofs = op >> 2; 1107 sink_(GetEmit18(index, emit_ofs + 0)); 1108 } RefillTo3()1109 bool RefillTo3() { 1110 switch (buffer_len_) { 1111 case 0: { 1112 return Read1to8Bytes(); 1113 } 1114 case 1: 1115 case 2: { 1116 return Read1to7Bytes(); 1117 } 1118 } 1119 return true; 1120 } Done7()1121 void Done7() { 1122 done_ = true; 1123 switch (buffer_len_) { 1124 case 1: 1125 case 2: 1126 case 0: { 1127 ok_ = false; 1128 return; 1129 } 1130 } 1131 } DecodeStep7()1132 void DecodeStep7() { 1133 if (!RefillTo2()) { 1134 Done8(); 1135 return; 1136 } 1137 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1138 const auto op = GetOp19(index); 1139 const int consumed = op & 3; 1140 buffer_len_ -= consumed; 1141 const auto emit_ofs = op >> 2; 1142 sink_(GetEmit19(index, emit_ofs + 0)); 1143 } Done8()1144 void Done8() { 1145 done_ = true; 1146 switch (buffer_len_) { 1147 case 1: { 1148 const auto index = buffer_ & 1; 1149 const auto op = GetOp20(index); 1150 switch (op & 1) { 1151 case 0: { 1152 sink_(GetEmit20(index, (op >> 1) + 0)); 1153 break; 1154 } 1155 case 1: { 1156 ok_ = false; 1157 break; 1158 } 1159 } 1160 return; 1161 } 1162 case 0: { 1163 ok_ = false; 1164 return; 1165 } 1166 } 1167 } DecodeStep8()1168 void DecodeStep8() { 1169 if (!RefillTo4()) { 1170 Done9(); 1171 return; 1172 } 1173 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1174 const auto op = GetOp21(index); 1175 const int consumed = op & 7; 1176 buffer_len_ -= consumed; 1177 const auto emit_ofs = op >> 3; 1178 sink_(GetEmit21(index, emit_ofs + 0)); 1179 } RefillTo4()1180 bool RefillTo4() { 1181 switch (buffer_len_) { 1182 case 0: { 1183 return Read1to8Bytes(); 1184 } 1185 case 1: 1186 case 2: 1187 case 3: { 1188 return Read1to7Bytes(); 1189 } 1190 } 1191 return true; 1192 } Done9()1193 void Done9() { 1194 done_ = true; 1195 switch (buffer_len_) { 1196 case 1: 1197 case 2: 1198 case 0: { 1199 ok_ = false; 1200 return; 1201 } 1202 case 3: { 1203 const auto index = buffer_ & 7; 1204 const auto op = GetOp22(index); 1205 switch (op & 1) { 1206 case 0: { 1207 sink_(GetEmit22(index, (op >> 1) + 0)); 1208 break; 1209 } 1210 case 1: { 1211 ok_ = false; 1212 break; 1213 } 1214 } 1215 return; 1216 } 1217 } 1218 } DecodeStep9()1219 void DecodeStep9() { 1220 if (!RefillTo3()) { 1221 Done10(); 1222 return; 1223 } 1224 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1225 const auto op = GetOp23(index); 1226 const int consumed = op & 3; 1227 buffer_len_ -= consumed; 1228 const auto emit_ofs = op >> 2; 1229 sink_(GetEmit23(index, emit_ofs + 0)); 1230 } Done10()1231 void Done10() { 1232 done_ = true; 1233 switch (buffer_len_) { 1234 case 1: 1235 case 0: { 1236 ok_ = false; 1237 return; 1238 } 1239 case 2: { 1240 const auto index = buffer_ & 3; 1241 const auto op = GetOp24(index); 1242 switch (op & 1) { 1243 case 0: { 1244 sink_(GetEmit24(index, (op >> 1) + 0)); 1245 break; 1246 } 1247 case 1: { 1248 ok_ = false; 1249 break; 1250 } 1251 } 1252 return; 1253 } 1254 } 1255 } DecodeStep10()1256 void DecodeStep10() { 1257 if (!RefillTo5()) { 1258 Done11(); 1259 return; 1260 } 1261 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1262 const auto op = GetOp25(index); 1263 const int consumed = op & 7; 1264 buffer_len_ -= consumed; 1265 const auto emit_ofs = op >> 3; 1266 sink_(GetEmit25(index, emit_ofs + 0)); 1267 } RefillTo5()1268 bool RefillTo5() { 1269 switch (buffer_len_) { 1270 case 0: { 1271 return Read1to8Bytes(); 1272 } 1273 case 1: 1274 case 2: 1275 case 3: 1276 case 4: { 1277 return Read1to7Bytes(); 1278 } 1279 } 1280 return true; 1281 } Done11()1282 void Done11() { 1283 done_ = true; 1284 switch (buffer_len_) { 1285 case 1: 1286 case 2: 1287 case 3: 1288 case 0: { 1289 ok_ = false; 1290 return; 1291 } 1292 case 4: { 1293 const auto index = buffer_ & 15; 1294 const auto op = GetOp26(index); 1295 switch (op & 1) { 1296 case 0: { 1297 sink_(GetEmit26(index, (op >> 1) + 0)); 1298 break; 1299 } 1300 case 1: { 1301 ok_ = false; 1302 break; 1303 } 1304 } 1305 return; 1306 } 1307 } 1308 } DecodeStep11()1309 void DecodeStep11() { 1310 if (!RefillTo12()) { 1311 Done12(); 1312 return; 1313 } 1314 const auto index = (buffer_ >> (buffer_len_ - 12)) & 0xfff; 1315 const auto op = GetOp27(index); 1316 const int consumed = op & 15; 1317 buffer_len_ -= consumed; 1318 const auto emit_ofs = op >> 5; 1319 switch ((op >> 4) & 1) { 1320 case 0: { 1321 sink_(GetEmit27(index, emit_ofs + 0)); 1322 break; 1323 } 1324 case 1: { 1325 begin_ = end_; 1326 buffer_len_ = 0; 1327 break; 1328 } 1329 } 1330 } RefillTo12()1331 bool RefillTo12() { 1332 switch (buffer_len_) { 1333 case 0: { 1334 return Read2to8Bytes(); 1335 } 1336 case 1: 1337 case 2: 1338 case 3: { 1339 return Read2to7Bytes(); 1340 } 1341 case 4: 1342 case 5: 1343 case 6: 1344 case 7: 1345 case 8: { 1346 return Read1to7Bytes(); 1347 } 1348 case 9: 1349 case 10: 1350 case 11: { 1351 return Read1to6Bytes(); 1352 } 1353 } 1354 return true; 1355 } Done12()1356 void Done12() { 1357 done_ = true; 1358 switch (end_ - begin_) { 1359 case 1: { 1360 Fill1(); 1361 break; 1362 } 1363 } 1364 switch (buffer_len_) { 1365 case 1: 1366 case 2: 1367 case 3: 1368 case 4: { 1369 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1370 return; 1371 } 1372 case 5: { 1373 const auto index = buffer_ & 31; 1374 const auto op = GetOp28(index); 1375 switch (op & 3) { 1376 case 0: { 1377 sink_(GetEmit28(index, (op >> 2) + 0)); 1378 break; 1379 } 1380 case 1: { 1381 ok_ = false; 1382 break; 1383 } 1384 } 1385 return; 1386 } 1387 case 6: { 1388 const auto index = buffer_ & 63; 1389 const auto op = GetOp29(index); 1390 switch (op & 3) { 1391 case 0: { 1392 ok_ = false; 1393 break; 1394 } 1395 case 1: { 1396 sink_(GetEmit29(index, (op >> 2) + 0)); 1397 break; 1398 } 1399 } 1400 return; 1401 } 1402 case 7: { 1403 const auto index = buffer_ & 127; 1404 const auto op = GetOp30(index); 1405 switch (op & 3) { 1406 case 0: { 1407 ok_ = false; 1408 break; 1409 } 1410 case 1: { 1411 sink_(GetEmit30(index, (op >> 2) + 0)); 1412 break; 1413 } 1414 } 1415 return; 1416 } 1417 case 8: { 1418 const auto index = buffer_ & 255; 1419 const auto op = GetOp31(index); 1420 switch (op & 3) { 1421 case 0: { 1422 ok_ = false; 1423 break; 1424 } 1425 case 1: { 1426 sink_(GetEmit31(index, (op >> 2) + 0)); 1427 break; 1428 } 1429 } 1430 return; 1431 } 1432 case 9: { 1433 const auto index = buffer_ & 511; 1434 const auto op = GetOp32(index); 1435 switch (op & 3) { 1436 case 0: { 1437 ok_ = false; 1438 break; 1439 } 1440 case 1: { 1441 sink_(GetEmit32(index, (op >> 2) + 0)); 1442 break; 1443 } 1444 } 1445 return; 1446 } 1447 case 10: { 1448 const auto index = buffer_ & 1023; 1449 const auto op = GetOp33(index); 1450 switch (op & 3) { 1451 case 0: { 1452 sink_(GetEmit33(index, (op >> 2) + 0)); 1453 sink_(GetEmit33(index, (op >> 2) + 1)); 1454 break; 1455 } 1456 case 1: { 1457 ok_ = false; 1458 break; 1459 } 1460 case 2: { 1461 sink_(GetEmit33(index, (op >> 2) + 0)); 1462 break; 1463 } 1464 } 1465 return; 1466 } 1467 case 11: { 1468 const auto index = buffer_ & 2047; 1469 const auto op = GetOp34(index); 1470 switch (op & 3) { 1471 case 0: { 1472 ok_ = false; 1473 break; 1474 } 1475 case 1: { 1476 sink_(GetEmit34(index, (op >> 2) + 0)); 1477 sink_(GetEmit34(index, (op >> 2) + 1)); 1478 break; 1479 } 1480 case 2: { 1481 sink_(GetEmit34(index, (op >> 2) + 0)); 1482 break; 1483 } 1484 } 1485 return; 1486 } 1487 case 0: { 1488 return; 1489 } 1490 } 1491 } 1492 F sink_; 1493 const uint8_t* begin_; 1494 const uint8_t* const end_; 1495 uint64_t buffer_ = 0; 1496 int buffer_len_ = 0; 1497 bool ok_ = true; 1498 bool done_ = false; 1499 }; 1500 } // namespace geometry_7_11_12 1501 } // namespace grpc_core 1502 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_11_12_H 1503