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_10_13_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_10_13_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_7_10_13 { 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 } GetOp7(size_t i)90 static inline uint64_t GetOp7(size_t i) { 91 return table7_ops_[i >> 6][i & 0x3f]; 92 } GetEmit7(size_t i,size_t emit)93 static inline uint64_t GetEmit7(size_t i, size_t emit) { 94 return table7_emit_[i >> 6][emit]; 95 } GetOp16(size_t i)96 static inline uint64_t GetOp16(size_t i) { 97 return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4)); 98 } GetEmit16(size_t,size_t emit)99 static inline uint64_t GetEmit16(size_t, size_t emit) { 100 return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195)); 101 } GetOp15(size_t i)102 static inline uint64_t GetOp15(size_t i) { 103 return table15_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))]; 104 } GetEmit15(size_t,size_t emit)105 static inline uint64_t GetEmit15(size_t, size_t emit) { 106 return table15_0_emit_[emit]; 107 } GetOp18(size_t i)108 static inline uint64_t GetOp18(size_t i) { 109 return table18_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))]; 110 } GetEmit18(size_t,size_t emit)111 static inline uint64_t GetEmit18(size_t, size_t emit) { 112 return table18_0_emit_[emit]; 113 } GetOp17(size_t i)114 static inline uint64_t GetOp17(size_t i) { 115 return table17_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))]; 116 } GetEmit17(size_t,size_t emit)117 static inline uint64_t GetEmit17(size_t, size_t emit) { 118 return table17_0_emit_[emit]; 119 } GetOp20(size_t i)120 static inline uint64_t GetOp20(size_t i) { 121 return table20_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))]; 122 } GetEmit20(size_t,size_t emit)123 static inline uint64_t GetEmit20(size_t, size_t emit) { 124 return table20_0_emit_[emit]; 125 } GetOp19(size_t i)126 static inline uint64_t GetOp19(size_t i) { return table19_0_ops_[i]; } 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) { return table22_0_ops_[i]; } GetEmit22(size_t,size_t emit)131 static inline uint64_t GetEmit22(size_t, size_t emit) { 132 return table22_0_emit_[emit]; 133 } GetOp23(size_t i)134 static inline uint64_t GetOp23(size_t i) { return table23_0_ops_[i]; } GetEmit23(size_t,size_t emit)135 static inline uint64_t GetEmit23(size_t, size_t emit) { 136 return table23_0_emit_[emit]; 137 } GetOp24(size_t i)138 static inline uint64_t GetOp24(size_t i) { return table24_0_ops_[i]; } GetEmit24(size_t,size_t emit)139 static inline uint64_t GetEmit24(size_t, size_t emit) { 140 return table24_0_emit_[emit]; 141 } GetOp25(size_t i)142 static inline uint64_t GetOp25(size_t i) { return table25_0_ops_[i]; } GetEmit25(size_t,size_t emit)143 static inline uint64_t GetEmit25(size_t, size_t emit) { 144 return table25_0_emit_[emit]; 145 } GetOp26(size_t i)146 static inline uint64_t GetOp26(size_t i) { 147 return table26_ops_[i >> 6][i & 0x3f]; 148 } GetEmit26(size_t i,size_t emit)149 static inline uint64_t GetEmit26(size_t i, size_t emit) { 150 return table26_emit_[i >> 6][emit]; 151 } GetOp27(size_t i)152 static inline uint64_t GetOp27(size_t i) { 153 return table27_ops_[i >> 6][i & 0x3f]; 154 } GetEmit27(size_t i,size_t emit)155 static inline uint64_t GetEmit27(size_t i, size_t emit) { 156 return table27_emit_[i >> 6][emit]; 157 } GetOp28(size_t i)158 static inline uint64_t GetOp28(size_t i) { 159 return table28_ops_[i >> 7][i & 0x7f]; 160 } GetEmit28(size_t i,size_t emit)161 static inline uint64_t GetEmit28(size_t i, size_t emit) { 162 return table28_emit_[i >> 7][emit]; 163 } GetOp29(size_t i)164 static inline uint64_t GetOp29(size_t i) { 165 return table29_ops_[i >> 7][i & 0x7f]; 166 } GetEmit29(size_t i,size_t emit)167 static inline uint64_t GetEmit29(size_t i, size_t emit) { 168 return table29_emit_[i >> 7][emit]; 169 } GetOp21(size_t i)170 static inline uint64_t GetOp21(size_t i) { 171 return table21_ops_[i >> 7][i & 0x7f]; 172 } GetEmit21(size_t i,size_t emit)173 static inline uint64_t GetEmit21(size_t i, size_t emit) { 174 return table21_emit_[i >> 7][emit]; 175 } 176 177 private: 178 static const uint8_t table2_0_emit_[10]; 179 static const uint8_t table2_0_ops_[32]; 180 static const uint8_t table3_0_emit_[36]; 181 static const uint8_t table3_0_ops_[64]; 182 static const uint8_t table1_0_emit_[68]; 183 static const uint16_t table1_0_inner_[72]; 184 static const uint8_t table1_0_outer_[128]; 185 static const uint8_t table8_0_emit_[5]; 186 static const uint8_t table8_0_inner_[7]; 187 static const uint8_t table9_0_emit_[8]; 188 static const uint8_t table9_0_inner_[10]; 189 static const uint8_t table9_0_outer_[16]; 190 static const uint8_t table10_0_emit_[10]; 191 static const uint8_t table10_0_ops_[32]; 192 static const uint8_t table11_0_emit_[16]; 193 static const uint8_t table11_0_ops_[64]; 194 static const uint8_t table12_0_emit_[18]; 195 static const uint8_t table12_0_ops_[128]; 196 static const uint8_t table13_0_emit_[40]; 197 static const uint8_t table13_0_ops_[64]; 198 static const uint8_t table13_1_emit_[40]; 199 static const uint8_t table13_2_emit_[22]; 200 static const uint8_t table13_2_ops_[64]; 201 static const uint8_t table13_3_emit_[14]; 202 static const uint8_t table13_3_ops_[64]; 203 static const uint8_t* const table13_emit_[4]; 204 static const uint8_t* const table13_ops_[4]; 205 static const uint8_t table14_0_emit_[72]; 206 static const uint16_t table14_0_ops_[64]; 207 static const uint8_t table14_1_emit_[72]; 208 static const uint8_t table14_2_emit_[72]; 209 static const uint8_t table14_3_emit_[72]; 210 static const uint8_t table14_4_emit_[72]; 211 static const uint8_t table14_5_emit_[40]; 212 static const uint16_t table14_5_ops_[64]; 213 static const uint8_t table14_6_emit_[22]; 214 static const uint16_t table14_6_ops_[64]; 215 static const uint8_t table14_7_emit_[11]; 216 static const uint16_t table14_7_ops_[64]; 217 static const uint8_t* const table14_emit_[8]; 218 static const uint16_t* const table14_ops_[8]; 219 static const uint8_t table7_0_emit_[1]; 220 static const uint16_t table7_0_ops_[64]; 221 static const uint8_t table7_2_emit_[1]; 222 static const uint8_t table7_4_emit_[1]; 223 static const uint8_t table7_6_emit_[1]; 224 static const uint8_t table7_8_emit_[1]; 225 static const uint8_t table7_10_emit_[1]; 226 static const uint16_t table7_10_ops_[64]; 227 static const uint8_t table7_11_emit_[1]; 228 static const uint8_t table7_12_emit_[1]; 229 static const uint8_t table7_13_emit_[2]; 230 static const uint16_t table7_13_ops_[64]; 231 static const uint8_t table7_14_emit_[4]; 232 static const uint16_t table7_14_ops_[64]; 233 static const uint8_t table7_15_emit_[7]; 234 static const uint16_t table7_15_ops_[64]; 235 static const uint8_t* const table7_emit_[16]; 236 static const uint16_t* const table7_ops_[16]; 237 static const uint8_t table15_0_emit_[5]; 238 static const uint8_t table15_0_inner_[5]; 239 static const uint8_t table18_0_emit_[6]; 240 static const uint8_t table18_0_inner_[7]; 241 static const uint8_t table17_0_emit_[10]; 242 static const uint8_t table17_0_inner_[10]; 243 static const uint8_t table20_0_emit_[9]; 244 static const uint8_t table20_0_inner_[10]; 245 static const uint8_t table19_0_emit_[23]; 246 static const uint8_t table19_0_ops_[32]; 247 static const uint8_t table22_0_emit_[12]; 248 static const uint8_t table22_0_ops_[32]; 249 static const uint8_t table23_0_emit_[41]; 250 static const uint8_t table23_0_ops_[64]; 251 static const uint8_t table24_0_emit_[53]; 252 static const uint8_t table24_0_ops_[128]; 253 static const uint8_t table25_0_emit_[57]; 254 static const uint8_t table25_0_ops_[256]; 255 static const uint8_t table26_0_emit_[4]; 256 static const uint8_t table26_0_ops_[64]; 257 static const uint8_t table26_1_emit_[4]; 258 static const uint8_t table26_2_emit_[4]; 259 static const uint8_t table26_3_emit_[8]; 260 static const uint8_t table26_3_ops_[64]; 261 static const uint8_t table26_4_emit_[8]; 262 static const uint8_t table26_5_emit_[8]; 263 static const uint8_t table26_6_emit_[11]; 264 static const uint8_t table26_6_ops_[64]; 265 static const uint8_t table26_7_emit_[25]; 266 static const uint8_t table26_7_ops_[64]; 267 static const uint8_t* const table26_emit_[8]; 268 static const uint8_t* const table26_ops_[8]; 269 static const uint8_t table27_0_emit_[40]; 270 static const uint8_t table27_1_emit_[40]; 271 static const uint8_t table27_2_emit_[40]; 272 static const uint8_t table27_3_emit_[40]; 273 static const uint8_t table27_4_emit_[40]; 274 static const uint8_t table27_5_emit_[40]; 275 static const uint8_t table27_6_emit_[4]; 276 static const uint8_t table27_6_ops_[64]; 277 static const uint8_t table27_7_emit_[4]; 278 static const uint8_t table27_8_emit_[4]; 279 static const uint8_t table27_9_emit_[4]; 280 static const uint8_t table27_10_emit_[4]; 281 static const uint8_t table27_11_emit_[4]; 282 static const uint8_t table27_12_emit_[4]; 283 static const uint8_t table27_13_emit_[7]; 284 static const uint8_t table27_13_ops_[64]; 285 static const uint8_t table27_14_emit_[10]; 286 static const uint8_t table27_14_ops_[64]; 287 static const uint8_t table27_15_emit_[34]; 288 static const uint8_t table27_15_ops_[64]; 289 static const uint8_t* const table27_emit_[16]; 290 static const uint8_t* const table27_ops_[16]; 291 static const uint8_t table28_0_emit_[144]; 292 static const uint16_t table28_0_ops_[128]; 293 static const uint8_t table28_1_emit_[144]; 294 static const uint8_t table28_2_emit_[144]; 295 static const uint8_t table28_3_emit_[144]; 296 static const uint8_t table28_4_emit_[144]; 297 static const uint8_t table28_5_emit_[144]; 298 static const uint8_t table28_6_emit_[80]; 299 static const uint16_t table28_6_ops_[128]; 300 static const uint8_t table28_7_emit_[80]; 301 static const uint8_t table28_8_emit_[80]; 302 static const uint8_t table28_9_emit_[80]; 303 static const uint8_t table28_10_emit_[80]; 304 static const uint8_t table28_11_emit_[80]; 305 static const uint8_t table28_12_emit_[80]; 306 static const uint8_t table28_13_emit_[26]; 307 static const uint16_t table28_13_ops_[128]; 308 static const uint16_t table28_14_ops_[128]; 309 static const uint8_t table28_15_emit_[63]; 310 static const uint16_t table28_15_ops_[128]; 311 static const uint8_t* const table28_emit_[16]; 312 static const uint16_t* const table28_ops_[16]; 313 static const uint8_t table29_0_emit_[136]; 314 static const uint16_t table29_0_ops_[128]; 315 static const uint8_t table29_1_emit_[136]; 316 static const uint8_t table29_2_emit_[136]; 317 static const uint8_t table29_3_emit_[136]; 318 static const uint8_t table29_4_emit_[136]; 319 static const uint8_t table29_5_emit_[136]; 320 static const uint8_t table29_6_emit_[136]; 321 static const uint8_t table29_7_emit_[136]; 322 static const uint8_t table29_8_emit_[136]; 323 static const uint8_t table29_9_emit_[136]; 324 static const uint8_t table29_10_emit_[136]; 325 static const uint8_t table29_11_emit_[136]; 326 static const uint8_t table29_12_emit_[144]; 327 static const uint8_t table29_13_emit_[144]; 328 static const uint8_t table29_14_emit_[144]; 329 static const uint8_t table29_15_emit_[144]; 330 static const uint8_t table29_16_emit_[144]; 331 static const uint8_t table29_17_emit_[144]; 332 static const uint8_t table29_18_emit_[144]; 333 static const uint8_t table29_19_emit_[144]; 334 static const uint8_t table29_20_emit_[144]; 335 static const uint8_t table29_21_emit_[144]; 336 static const uint8_t table29_22_emit_[144]; 337 static const uint8_t table29_23_emit_[144]; 338 static const uint8_t table29_24_emit_[144]; 339 static const uint8_t table29_25_emit_[144]; 340 static const uint8_t table29_26_emit_[112]; 341 static const uint16_t table29_26_ops_[128]; 342 static const uint8_t table29_27_emit_[80]; 343 static const uint8_t table29_28_emit_[80]; 344 static const uint8_t table29_29_emit_[44]; 345 static const uint16_t table29_29_ops_[128]; 346 static const uint8_t table29_30_emit_[17]; 347 static const uint16_t table29_30_ops_[128]; 348 static const uint8_t table29_31_emit_[46]; 349 static const uint16_t table29_31_ops_[128]; 350 static const uint8_t* const table29_emit_[32]; 351 static const uint16_t* const table29_ops_[32]; 352 static const uint8_t table21_0_emit_[1]; 353 static const uint16_t table21_0_ops_[128]; 354 static const uint8_t table21_2_emit_[1]; 355 static const uint8_t table21_4_emit_[1]; 356 static const uint8_t table21_6_emit_[1]; 357 static const uint8_t table21_8_emit_[1]; 358 static const uint8_t table21_10_emit_[1]; 359 static const uint8_t table21_12_emit_[1]; 360 static const uint8_t table21_14_emit_[1]; 361 static const uint8_t table21_16_emit_[1]; 362 static const uint8_t table21_18_emit_[1]; 363 static const uint8_t table21_20_emit_[1]; 364 static const uint8_t table21_22_emit_[1]; 365 static const uint8_t table21_24_emit_[1]; 366 static const uint16_t table21_24_ops_[128]; 367 static const uint8_t table21_25_emit_[1]; 368 static const uint8_t table21_26_emit_[1]; 369 static const uint8_t table21_27_emit_[1]; 370 static const uint8_t table21_28_emit_[1]; 371 static const uint8_t table21_29_emit_[1]; 372 static const uint8_t table21_30_emit_[1]; 373 static const uint8_t table21_31_emit_[1]; 374 static const uint8_t table21_32_emit_[1]; 375 static const uint8_t table21_33_emit_[1]; 376 static const uint8_t table21_34_emit_[1]; 377 static const uint8_t table21_35_emit_[1]; 378 static const uint8_t table21_36_emit_[1]; 379 static const uint8_t table21_37_emit_[1]; 380 static const uint8_t table21_38_emit_[1]; 381 static const uint8_t table21_39_emit_[1]; 382 static const uint8_t table21_40_emit_[1]; 383 static const uint8_t table21_41_emit_[1]; 384 static const uint8_t table21_42_emit_[1]; 385 static const uint8_t table21_43_emit_[1]; 386 static const uint8_t table21_44_emit_[1]; 387 static const uint8_t table21_45_emit_[1]; 388 static const uint8_t table21_46_emit_[1]; 389 static const uint8_t table21_47_emit_[1]; 390 static const uint8_t table21_48_emit_[1]; 391 static const uint8_t table21_49_emit_[1]; 392 static const uint8_t table21_50_emit_[1]; 393 static const uint8_t table21_51_emit_[1]; 394 static const uint8_t table21_52_emit_[1]; 395 static const uint8_t table21_53_emit_[2]; 396 static const uint16_t table21_53_ops_[128]; 397 static const uint8_t table21_54_emit_[2]; 398 static const uint8_t table21_55_emit_[2]; 399 static const uint8_t table21_56_emit_[2]; 400 static const uint8_t table21_57_emit_[2]; 401 static const uint8_t table21_58_emit_[2]; 402 static const uint8_t table21_59_emit_[4]; 403 static const uint16_t table21_59_ops_[128]; 404 static const uint8_t table21_60_emit_[8]; 405 static const uint16_t table21_60_ops_[128]; 406 static const uint8_t table21_61_emit_[9]; 407 static const uint16_t table21_61_ops_[128]; 408 static const uint8_t table21_62_emit_[16]; 409 static const uint16_t table21_62_ops_[128]; 410 static const uint8_t table21_63_emit_[33]; 411 static const uint16_t table21_63_ops_[128]; 412 static const uint8_t* const table21_emit_[64]; 413 static const uint16_t* const table21_ops_[64]; 414 }; 415 template <typename F> 416 class HuffDecoder : public HuffDecoderCommon { 417 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)418 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 419 : sink_(sink), begin_(begin), end_(end) {} Run()420 bool Run() { 421 while (!done_) { 422 if (!RefillTo7()) { 423 Done0(); 424 break; 425 } 426 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 427 const auto op = GetOp1(index); 428 const int consumed = op & 7; 429 buffer_len_ -= consumed; 430 const auto emit_ofs = op >> 6; 431 switch ((op >> 3) & 7) { 432 case 0: { 433 sink_(GetEmit1(index, emit_ofs + 0)); 434 break; 435 } 436 case 1: { 437 DecodeStep0(); 438 break; 439 } 440 case 2: { 441 DecodeStep1(); 442 break; 443 } 444 case 3: { 445 DecodeStep2(); 446 break; 447 } 448 case 4: { 449 DecodeStep3(); 450 break; 451 } 452 } 453 } 454 return ok_; 455 } 456 457 private: RefillTo7()458 bool RefillTo7() { 459 switch (buffer_len_) { 460 case 0: { 461 return Read1to8Bytes(); 462 } 463 case 1: 464 case 2: 465 case 3: 466 case 4: 467 case 5: 468 case 6: { 469 return Read1to7Bytes(); 470 } 471 } 472 return true; 473 } Read1to8Bytes()474 bool Read1to8Bytes() { 475 switch (end_ - begin_) { 476 case 0: { 477 return false; 478 } 479 case 1: { 480 Fill1(); 481 return true; 482 } 483 case 2: { 484 Fill2(); 485 return true; 486 } 487 case 3: { 488 Fill3(); 489 return true; 490 } 491 case 4: { 492 Fill4(); 493 return true; 494 } 495 case 5: { 496 Fill5(); 497 return true; 498 } 499 case 6: { 500 Fill6(); 501 return true; 502 } 503 case 7: { 504 Fill7(); 505 return true; 506 } 507 default: { 508 Fill8(); 509 return true; 510 } 511 } 512 } Fill1()513 void Fill1() { 514 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 515 begin_ += 1; 516 buffer_len_ += 8; 517 } Fill2()518 void Fill2() { 519 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 520 (static_cast<uint64_t>(begin_[1]) << 0); 521 begin_ += 2; 522 buffer_len_ += 16; 523 } Fill3()524 void Fill3() { 525 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 526 (static_cast<uint64_t>(begin_[1]) << 8) | 527 (static_cast<uint64_t>(begin_[2]) << 0); 528 begin_ += 3; 529 buffer_len_ += 24; 530 } Fill4()531 void Fill4() { 532 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 533 (static_cast<uint64_t>(begin_[1]) << 16) | 534 (static_cast<uint64_t>(begin_[2]) << 8) | 535 (static_cast<uint64_t>(begin_[3]) << 0); 536 begin_ += 4; 537 buffer_len_ += 32; 538 } Fill5()539 void Fill5() { 540 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 541 (static_cast<uint64_t>(begin_[1]) << 24) | 542 (static_cast<uint64_t>(begin_[2]) << 16) | 543 (static_cast<uint64_t>(begin_[3]) << 8) | 544 (static_cast<uint64_t>(begin_[4]) << 0); 545 begin_ += 5; 546 buffer_len_ += 40; 547 } Fill6()548 void Fill6() { 549 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 550 (static_cast<uint64_t>(begin_[1]) << 32) | 551 (static_cast<uint64_t>(begin_[2]) << 24) | 552 (static_cast<uint64_t>(begin_[3]) << 16) | 553 (static_cast<uint64_t>(begin_[4]) << 8) | 554 (static_cast<uint64_t>(begin_[5]) << 0); 555 begin_ += 6; 556 buffer_len_ += 48; 557 } Fill7()558 void Fill7() { 559 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 560 (static_cast<uint64_t>(begin_[1]) << 40) | 561 (static_cast<uint64_t>(begin_[2]) << 32) | 562 (static_cast<uint64_t>(begin_[3]) << 24) | 563 (static_cast<uint64_t>(begin_[4]) << 16) | 564 (static_cast<uint64_t>(begin_[5]) << 8) | 565 (static_cast<uint64_t>(begin_[6]) << 0); 566 begin_ += 7; 567 buffer_len_ += 56; 568 } Fill8()569 void Fill8() { 570 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 571 (static_cast<uint64_t>(begin_[1]) << 48) | 572 (static_cast<uint64_t>(begin_[2]) << 40) | 573 (static_cast<uint64_t>(begin_[3]) << 32) | 574 (static_cast<uint64_t>(begin_[4]) << 24) | 575 (static_cast<uint64_t>(begin_[5]) << 16) | 576 (static_cast<uint64_t>(begin_[6]) << 8) | 577 (static_cast<uint64_t>(begin_[7]) << 0); 578 begin_ += 8; 579 buffer_len_ += 64; 580 } Read1to7Bytes()581 bool Read1to7Bytes() { 582 switch (end_ - begin_) { 583 case 0: { 584 return false; 585 } 586 case 1: { 587 Fill1(); 588 return true; 589 } 590 case 2: { 591 Fill2(); 592 return true; 593 } 594 case 3: { 595 Fill3(); 596 return true; 597 } 598 case 4: { 599 Fill4(); 600 return true; 601 } 602 case 5: { 603 Fill5(); 604 return true; 605 } 606 case 6: { 607 Fill6(); 608 return true; 609 } 610 default: { 611 Fill7(); 612 return true; 613 } 614 } 615 } Done0()616 void Done0() { 617 done_ = true; 618 switch (buffer_len_) { 619 case 1: 620 case 2: 621 case 3: 622 case 4: { 623 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 624 return; 625 } 626 case 5: { 627 const auto index = buffer_ & 31; 628 const auto op = GetOp2(index); 629 switch (op & 3) { 630 case 0: { 631 sink_(GetEmit2(index, (op >> 2) + 0)); 632 break; 633 } 634 case 1: { 635 ok_ = false; 636 break; 637 } 638 } 639 return; 640 } 641 case 6: { 642 const auto index = buffer_ & 63; 643 const auto op = GetOp3(index); 644 switch (op & 3) { 645 case 0: { 646 ok_ = false; 647 break; 648 } 649 case 1: { 650 sink_(GetEmit3(index, (op >> 2) + 0)); 651 break; 652 } 653 } 654 return; 655 } 656 case 0: { 657 return; 658 } 659 } 660 } DecodeStep0()661 void DecodeStep0() { 662 if (!RefillTo1()) { 663 Done1(); 664 return; 665 } 666 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 667 const auto op = GetOp4(index); 668 const int consumed = op & 1; 669 buffer_len_ -= consumed; 670 const auto emit_ofs = op >> 1; 671 sink_(GetEmit4(index, emit_ofs + 0)); 672 } RefillTo1()673 bool RefillTo1() { 674 switch (buffer_len_) { 675 case 0: { 676 return Read1to8Bytes(); 677 } 678 } 679 return true; 680 } Done1()681 void Done1() { 682 done_ = true; 683 ok_ = false; 684 } DecodeStep1()685 void DecodeStep1() { 686 if (!RefillTo1()) { 687 Done2(); 688 return; 689 } 690 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 691 const auto op = GetOp5(index); 692 const int consumed = op & 1; 693 buffer_len_ -= consumed; 694 const auto emit_ofs = op >> 1; 695 sink_(GetEmit5(index, emit_ofs + 0)); 696 } Done2()697 void Done2() { 698 done_ = true; 699 ok_ = false; 700 } DecodeStep2()701 void DecodeStep2() { 702 if (!RefillTo1()) { 703 Done3(); 704 return; 705 } 706 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 707 const auto op = GetOp6(index); 708 const int consumed = op & 1; 709 buffer_len_ -= consumed; 710 const auto emit_ofs = op >> 1; 711 sink_(GetEmit6(index, emit_ofs + 0)); 712 } Done3()713 void Done3() { 714 done_ = true; 715 ok_ = false; 716 } DecodeStep3()717 void DecodeStep3() { 718 if (!RefillTo10()) { 719 Done4(); 720 return; 721 } 722 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 723 const auto op = GetOp7(index); 724 const int consumed = op & 15; 725 buffer_len_ -= consumed; 726 const auto emit_ofs = op >> 7; 727 switch ((op >> 4) & 7) { 728 case 0: { 729 sink_(GetEmit7(index, emit_ofs + 0)); 730 break; 731 } 732 case 1: { 733 DecodeStep4(); 734 break; 735 } 736 case 2: { 737 DecodeStep5(); 738 break; 739 } 740 case 3: { 741 DecodeStep6(); 742 break; 743 } 744 case 4: { 745 DecodeStep7(); 746 break; 747 } 748 } 749 } RefillTo10()750 bool RefillTo10() { 751 switch (buffer_len_) { 752 case 0: { 753 return Read2to8Bytes(); 754 } 755 case 1: { 756 return Read2to7Bytes(); 757 } 758 case 2: 759 case 3: 760 case 4: 761 case 5: 762 case 6: 763 case 7: 764 case 8: { 765 return Read1to7Bytes(); 766 } 767 case 9: { 768 return Read1to6Bytes(); 769 } 770 } 771 return true; 772 } Read2to8Bytes()773 bool Read2to8Bytes() { 774 switch (end_ - begin_) { 775 case 0: 776 case 1: { 777 return false; 778 } 779 case 2: { 780 Fill2(); 781 return true; 782 } 783 case 3: { 784 Fill3(); 785 return true; 786 } 787 case 4: { 788 Fill4(); 789 return true; 790 } 791 case 5: { 792 Fill5(); 793 return true; 794 } 795 case 6: { 796 Fill6(); 797 return true; 798 } 799 case 7: { 800 Fill7(); 801 return true; 802 } 803 default: { 804 Fill8(); 805 return true; 806 } 807 } 808 } Read2to7Bytes()809 bool Read2to7Bytes() { 810 switch (end_ - begin_) { 811 case 0: 812 case 1: { 813 return false; 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 default: { 836 Fill7(); 837 return true; 838 } 839 } 840 } Read1to6Bytes()841 bool Read1to6Bytes() { 842 switch (end_ - begin_) { 843 case 0: { 844 return false; 845 } 846 case 1: { 847 Fill1(); 848 return true; 849 } 850 case 2: { 851 Fill2(); 852 return true; 853 } 854 case 3: { 855 Fill3(); 856 return true; 857 } 858 case 4: { 859 Fill4(); 860 return true; 861 } 862 case 5: { 863 Fill5(); 864 return true; 865 } 866 default: { 867 Fill6(); 868 return true; 869 } 870 } 871 } Done4()872 void Done4() { 873 done_ = true; 874 switch (end_ - begin_) { 875 case 1: { 876 Fill1(); 877 break; 878 } 879 } 880 switch (buffer_len_) { 881 case 1: 882 case 2: { 883 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 884 return; 885 } 886 case 3: { 887 const auto index = buffer_ & 7; 888 const auto op = GetOp8(index); 889 switch (op & 3) { 890 case 0: { 891 sink_(GetEmit8(index, (op >> 2) + 0)); 892 break; 893 } 894 case 1: { 895 ok_ = false; 896 break; 897 } 898 } 899 return; 900 } 901 case 4: { 902 const auto index = buffer_ & 15; 903 const auto op = GetOp9(index); 904 switch (op & 3) { 905 case 0: { 906 ok_ = false; 907 break; 908 } 909 case 1: { 910 sink_(GetEmit9(index, (op >> 2) + 0)); 911 break; 912 } 913 } 914 return; 915 } 916 case 5: { 917 const auto index = buffer_ & 31; 918 const auto op = GetOp10(index); 919 switch (op & 3) { 920 case 0: { 921 ok_ = false; 922 break; 923 } 924 case 1: { 925 sink_(GetEmit10(index, (op >> 2) + 0)); 926 break; 927 } 928 } 929 return; 930 } 931 case 6: { 932 const auto index = buffer_ & 63; 933 const auto op = GetOp11(index); 934 switch (op & 3) { 935 case 0: { 936 ok_ = false; 937 break; 938 } 939 case 1: { 940 sink_(GetEmit11(index, (op >> 2) + 0)); 941 break; 942 } 943 } 944 return; 945 } 946 case 7: { 947 const auto index = buffer_ & 127; 948 const auto op = GetOp12(index); 949 switch (op & 3) { 950 case 0: { 951 ok_ = false; 952 break; 953 } 954 case 1: { 955 sink_(GetEmit12(index, (op >> 2) + 0)); 956 break; 957 } 958 } 959 return; 960 } 961 case 8: { 962 const auto index = buffer_ & 255; 963 const auto op = GetOp13(index); 964 switch (op & 3) { 965 case 0: { 966 sink_(GetEmit13(index, (op >> 2) + 0)); 967 sink_(GetEmit13(index, (op >> 2) + 1)); 968 break; 969 } 970 case 1: { 971 ok_ = false; 972 break; 973 } 974 case 2: { 975 sink_(GetEmit13(index, (op >> 2) + 0)); 976 break; 977 } 978 } 979 return; 980 } 981 case 9: { 982 const auto index = buffer_ & 511; 983 const auto op = GetOp14(index); 984 switch (op & 3) { 985 case 0: { 986 ok_ = false; 987 break; 988 } 989 case 1: { 990 sink_(GetEmit14(index, (op >> 2) + 0)); 991 sink_(GetEmit14(index, (op >> 2) + 1)); 992 break; 993 } 994 case 2: { 995 sink_(GetEmit14(index, (op >> 2) + 0)); 996 break; 997 } 998 } 999 return; 1000 } 1001 case 0: { 1002 return; 1003 } 1004 } 1005 } DecodeStep4()1006 void DecodeStep4() { 1007 if (!RefillTo3()) { 1008 Done5(); 1009 return; 1010 } 1011 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 1012 const auto op = GetOp15(index); 1013 const int consumed = op & 3; 1014 buffer_len_ -= consumed; 1015 const auto emit_ofs = op >> 2; 1016 sink_(GetEmit15(index, emit_ofs + 0)); 1017 } RefillTo3()1018 bool RefillTo3() { 1019 switch (buffer_len_) { 1020 case 0: { 1021 return Read1to8Bytes(); 1022 } 1023 case 1: 1024 case 2: { 1025 return Read1to7Bytes(); 1026 } 1027 } 1028 return true; 1029 } Done5()1030 void Done5() { 1031 done_ = true; 1032 switch (buffer_len_) { 1033 case 1: 1034 case 0: { 1035 ok_ = false; 1036 return; 1037 } 1038 case 2: { 1039 const auto index = buffer_ & 3; 1040 const auto op = GetOp16(index); 1041 switch (op & 1) { 1042 case 0: { 1043 sink_(GetEmit16(index, (op >> 1) + 0)); 1044 break; 1045 } 1046 case 1: { 1047 ok_ = false; 1048 break; 1049 } 1050 } 1051 return; 1052 } 1053 } 1054 } DecodeStep5()1055 void DecodeStep5() { 1056 if (!RefillTo4()) { 1057 Done6(); 1058 return; 1059 } 1060 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1061 const auto op = GetOp17(index); 1062 const int consumed = op & 7; 1063 buffer_len_ -= consumed; 1064 const auto emit_ofs = op >> 3; 1065 sink_(GetEmit17(index, emit_ofs + 0)); 1066 } RefillTo4()1067 bool RefillTo4() { 1068 switch (buffer_len_) { 1069 case 0: { 1070 return Read1to8Bytes(); 1071 } 1072 case 1: 1073 case 2: 1074 case 3: { 1075 return Read1to7Bytes(); 1076 } 1077 } 1078 return true; 1079 } Done6()1080 void Done6() { 1081 done_ = true; 1082 switch (buffer_len_) { 1083 case 1: 1084 case 2: 1085 case 0: { 1086 ok_ = false; 1087 return; 1088 } 1089 case 3: { 1090 const auto index = buffer_ & 7; 1091 const auto op = GetOp18(index); 1092 switch (op & 1) { 1093 case 0: { 1094 sink_(GetEmit18(index, (op >> 1) + 0)); 1095 break; 1096 } 1097 case 1: { 1098 ok_ = false; 1099 break; 1100 } 1101 } 1102 return; 1103 } 1104 } 1105 } DecodeStep6()1106 void DecodeStep6() { 1107 if (!RefillTo5()) { 1108 Done7(); 1109 return; 1110 } 1111 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1112 const auto op = GetOp19(index); 1113 const int consumed = op & 7; 1114 buffer_len_ -= consumed; 1115 const auto emit_ofs = op >> 3; 1116 sink_(GetEmit19(index, emit_ofs + 0)); 1117 } RefillTo5()1118 bool RefillTo5() { 1119 switch (buffer_len_) { 1120 case 0: { 1121 return Read1to8Bytes(); 1122 } 1123 case 1: 1124 case 2: 1125 case 3: 1126 case 4: { 1127 return Read1to7Bytes(); 1128 } 1129 } 1130 return true; 1131 } Done7()1132 void Done7() { 1133 done_ = true; 1134 switch (buffer_len_) { 1135 case 1: 1136 case 2: 1137 case 3: 1138 case 0: { 1139 ok_ = false; 1140 return; 1141 } 1142 case 4: { 1143 const auto index = buffer_ & 15; 1144 const auto op = GetOp20(index); 1145 switch (op & 1) { 1146 case 0: { 1147 sink_(GetEmit20(index, (op >> 1) + 0)); 1148 break; 1149 } 1150 case 1: { 1151 ok_ = false; 1152 break; 1153 } 1154 } 1155 return; 1156 } 1157 } 1158 } DecodeStep7()1159 void DecodeStep7() { 1160 if (!RefillTo13()) { 1161 Done8(); 1162 return; 1163 } 1164 const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff; 1165 const auto op = GetOp21(index); 1166 const int consumed = op & 15; 1167 buffer_len_ -= consumed; 1168 const auto emit_ofs = op >> 5; 1169 switch ((op >> 4) & 1) { 1170 case 0: { 1171 sink_(GetEmit21(index, emit_ofs + 0)); 1172 break; 1173 } 1174 case 1: { 1175 begin_ = end_; 1176 buffer_len_ = 0; 1177 break; 1178 } 1179 } 1180 } RefillTo13()1181 bool RefillTo13() { 1182 switch (buffer_len_) { 1183 case 0: { 1184 return Read2to8Bytes(); 1185 } 1186 case 1: 1187 case 2: 1188 case 3: 1189 case 4: { 1190 return Read2to7Bytes(); 1191 } 1192 case 5: 1193 case 6: 1194 case 7: 1195 case 8: { 1196 return Read1to7Bytes(); 1197 } 1198 case 9: 1199 case 10: 1200 case 11: 1201 case 12: { 1202 return Read1to6Bytes(); 1203 } 1204 } 1205 return true; 1206 } Done8()1207 void Done8() { 1208 done_ = true; 1209 switch (end_ - begin_) { 1210 case 1: { 1211 Fill1(); 1212 break; 1213 } 1214 } 1215 switch (buffer_len_) { 1216 case 1: 1217 case 2: 1218 case 3: 1219 case 4: { 1220 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1221 return; 1222 } 1223 case 5: { 1224 const auto index = buffer_ & 31; 1225 const auto op = GetOp22(index); 1226 switch (op & 3) { 1227 case 0: { 1228 sink_(GetEmit22(index, (op >> 2) + 0)); 1229 break; 1230 } 1231 case 1: { 1232 ok_ = false; 1233 break; 1234 } 1235 } 1236 return; 1237 } 1238 case 6: { 1239 const auto index = buffer_ & 63; 1240 const auto op = GetOp23(index); 1241 switch (op & 3) { 1242 case 0: { 1243 ok_ = false; 1244 break; 1245 } 1246 case 1: { 1247 sink_(GetEmit23(index, (op >> 2) + 0)); 1248 break; 1249 } 1250 } 1251 return; 1252 } 1253 case 7: { 1254 const auto index = buffer_ & 127; 1255 const auto op = GetOp24(index); 1256 switch (op & 3) { 1257 case 0: { 1258 ok_ = false; 1259 break; 1260 } 1261 case 1: { 1262 sink_(GetEmit24(index, (op >> 2) + 0)); 1263 break; 1264 } 1265 } 1266 return; 1267 } 1268 case 8: { 1269 const auto index = buffer_ & 255; 1270 const auto op = GetOp25(index); 1271 switch (op & 3) { 1272 case 0: { 1273 ok_ = false; 1274 break; 1275 } 1276 case 1: { 1277 sink_(GetEmit25(index, (op >> 2) + 0)); 1278 break; 1279 } 1280 } 1281 return; 1282 } 1283 case 9: { 1284 const auto index = buffer_ & 511; 1285 const auto op = GetOp26(index); 1286 switch (op & 3) { 1287 case 0: { 1288 ok_ = false; 1289 break; 1290 } 1291 case 1: { 1292 sink_(GetEmit26(index, (op >> 2) + 0)); 1293 break; 1294 } 1295 } 1296 return; 1297 } 1298 case 10: { 1299 const auto index = buffer_ & 1023; 1300 const auto op = GetOp27(index); 1301 switch (op & 3) { 1302 case 0: { 1303 sink_(GetEmit27(index, (op >> 2) + 0)); 1304 sink_(GetEmit27(index, (op >> 2) + 1)); 1305 break; 1306 } 1307 case 1: { 1308 ok_ = false; 1309 break; 1310 } 1311 case 2: { 1312 sink_(GetEmit27(index, (op >> 2) + 0)); 1313 break; 1314 } 1315 } 1316 return; 1317 } 1318 case 11: { 1319 const auto index = buffer_ & 2047; 1320 const auto op = GetOp28(index); 1321 switch (op & 3) { 1322 case 0: { 1323 ok_ = false; 1324 break; 1325 } 1326 case 1: { 1327 sink_(GetEmit28(index, (op >> 2) + 0)); 1328 sink_(GetEmit28(index, (op >> 2) + 1)); 1329 break; 1330 } 1331 case 2: { 1332 sink_(GetEmit28(index, (op >> 2) + 0)); 1333 break; 1334 } 1335 } 1336 return; 1337 } 1338 case 12: { 1339 const auto index = buffer_ & 4095; 1340 const auto op = GetOp29(index); 1341 switch (op & 3) { 1342 case 0: { 1343 ok_ = false; 1344 break; 1345 } 1346 case 1: { 1347 sink_(GetEmit29(index, (op >> 2) + 0)); 1348 sink_(GetEmit29(index, (op >> 2) + 1)); 1349 break; 1350 } 1351 case 2: { 1352 sink_(GetEmit29(index, (op >> 2) + 0)); 1353 break; 1354 } 1355 } 1356 return; 1357 } 1358 case 0: { 1359 return; 1360 } 1361 } 1362 } 1363 F sink_; 1364 const uint8_t* begin_; 1365 const uint8_t* const end_; 1366 uint64_t buffer_ = 0; 1367 int buffer_len_ = 0; 1368 bool ok_ = true; 1369 bool done_ = false; 1370 }; 1371 } // namespace geometry_7_10_13 1372 } // namespace grpc_core 1373 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_7_10_13_H 1374