1 // Copyright 2023 gRPC authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // This file is autogenerated: see 16 // tools/codegen/core/gen_huffman_decompressor.cc 17 18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_9_13_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_9_13_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_8_9_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 } GetOp4(size_t i)36 static inline uint64_t GetOp4(size_t i) { 37 return table4_ops_[i >> 6][i & 0x3f]; 38 } GetEmit4(size_t i,size_t emit)39 static inline uint64_t GetEmit4(size_t i, size_t emit) { 40 return table4_emit_[i >> 6][emit]; 41 } GetOp1(size_t i)42 static inline uint64_t GetOp1(size_t i) { 43 return table1_0_inner_[table1_0_outer_[i]]; 44 } GetEmit1(size_t,size_t emit)45 static inline uint64_t GetEmit1(size_t, size_t emit) { 46 return table1_0_emit_[emit]; 47 } GetOp5(size_t i)48 static inline uint64_t GetOp5(size_t i) { 49 return (i < 2 ? (i ? 6 : 2) : ((i - 2) ? 14 : 10)); 50 } GetEmit5(size_t,size_t emit)51 static inline uint64_t GetEmit5(size_t, size_t emit) { 52 return (emit < 2 ? (emit + 33) : ((emit - 2) + 40)); 53 } GetOp7(size_t i)54 static inline uint64_t GetOp7(size_t i) { 55 return (i < 2 ? (i) : ((i - 2) + 1)); 56 } GetEmit7(size_t,size_t emit)57 static inline uint64_t GetEmit7(size_t, size_t emit) { 58 return ((void)emit, 63); 59 } GetOp8(size_t i)60 static inline uint64_t GetOp8(size_t i) { 61 return table8_0_inner_[table8_0_outer_[i]]; 62 } GetEmit8(size_t,size_t emit)63 static inline uint64_t GetEmit8(size_t, size_t emit) { 64 return (emit < 2 ? (emit ? 39 : 63) : ((emit - 2) ? 124 : 43)); 65 } GetOp9(size_t i)66 static inline uint64_t GetOp9(size_t i) { 67 return table9_0_inner_[table9_0_outer_[i]]; 68 } GetEmit9(size_t,size_t emit)69 static inline uint64_t GetEmit9(size_t, size_t emit) { 70 return table9_0_emit_[emit]; 71 } GetOp10(size_t i)72 static inline uint64_t GetOp10(size_t i) { return table10_0_ops_[i]; } GetEmit10(size_t,size_t emit)73 static inline uint64_t GetEmit10(size_t, size_t emit) { 74 return table10_0_emit_[emit]; 75 } GetOp11(size_t i)76 static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; } GetEmit11(size_t,size_t emit)77 static inline uint64_t GetEmit11(size_t, size_t emit) { 78 return table11_0_emit_[emit]; 79 } GetOp12(size_t i)80 static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; } GetEmit12(size_t,size_t emit)81 static inline uint64_t GetEmit12(size_t, size_t emit) { 82 return table12_0_emit_[emit]; 83 } GetOp13(size_t i)84 static inline uint64_t GetOp13(size_t i) { 85 return table13_ops_[i >> 5][i & 0x1f]; 86 } GetEmit13(size_t i,size_t emit)87 static inline uint64_t GetEmit13(size_t i, size_t emit) { 88 return table13_emit_[i >> 5][emit]; 89 } GetOp6(size_t i)90 static inline uint64_t GetOp6(size_t i) { 91 return table6_ops_[i >> 5][i & 0x1f]; 92 } GetEmit6(size_t i,size_t emit)93 static inline uint64_t GetEmit6(size_t i, size_t emit) { 94 return table6_emit_[i >> 5][emit]; 95 } GetOp15(size_t i)96 static inline uint64_t GetOp15(size_t i) { 97 return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4)); 98 } GetEmit15(size_t,size_t emit)99 static inline uint64_t GetEmit15(size_t, size_t emit) { 100 return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195)); 101 } GetOp14(size_t i)102 static inline uint64_t GetOp14(size_t i) { 103 return table14_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))]; 104 } GetEmit14(size_t,size_t emit)105 static inline uint64_t GetEmit14(size_t, size_t emit) { 106 return table14_0_emit_[emit]; 107 } GetOp17(size_t i)108 static inline uint64_t GetOp17(size_t i) { 109 return table17_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))]; 110 } GetEmit17(size_t,size_t emit)111 static inline uint64_t GetEmit17(size_t, size_t emit) { 112 return table17_0_emit_[emit]; 113 } GetOp16(size_t i)114 static inline uint64_t GetOp16(size_t i) { 115 return table16_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))]; 116 } GetEmit16(size_t,size_t emit)117 static inline uint64_t GetEmit16(size_t, size_t emit) { 118 return table16_0_emit_[emit]; 119 } GetOp19(size_t i)120 static inline uint64_t GetOp19(size_t i) { 121 return table19_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))]; 122 } GetEmit19(size_t,size_t emit)123 static inline uint64_t GetEmit19(size_t, size_t emit) { 124 return table19_0_emit_[emit]; 125 } GetOp18(size_t i)126 static inline uint64_t GetOp18(size_t i) { return table18_0_ops_[i]; } GetEmit18(size_t,size_t emit)127 static inline uint64_t GetEmit18(size_t, size_t emit) { 128 return table18_0_emit_[emit]; 129 } GetOp21(size_t i)130 static inline uint64_t GetOp21(size_t i) { return table21_0_ops_[i]; } GetEmit21(size_t,size_t emit)131 static inline uint64_t GetEmit21(size_t, size_t emit) { 132 return table21_0_emit_[emit]; 133 } GetOp22(size_t i)134 static inline uint64_t GetOp22(size_t i) { return table22_0_ops_[i]; } GetEmit22(size_t,size_t emit)135 static inline uint64_t GetEmit22(size_t, size_t emit) { 136 return table22_0_emit_[emit]; 137 } GetOp23(size_t i)138 static inline uint64_t GetOp23(size_t i) { return table23_0_ops_[i]; } GetEmit23(size_t,size_t emit)139 static inline uint64_t GetEmit23(size_t, size_t emit) { 140 return table23_0_emit_[emit]; 141 } GetOp24(size_t i)142 static inline uint64_t GetOp24(size_t i) { return table24_0_ops_[i]; } GetEmit24(size_t,size_t emit)143 static inline uint64_t GetEmit24(size_t, size_t emit) { 144 return table24_0_emit_[emit]; 145 } GetOp25(size_t i)146 static inline uint64_t GetOp25(size_t i) { 147 return table25_ops_[i >> 6][i & 0x3f]; 148 } GetEmit25(size_t i,size_t emit)149 static inline uint64_t GetEmit25(size_t i, size_t emit) { 150 return table25_emit_[i >> 6][emit]; 151 } GetOp26(size_t i)152 static inline uint64_t GetOp26(size_t i) { 153 return table26_ops_[i >> 6][i & 0x3f]; 154 } GetEmit26(size_t i,size_t emit)155 static inline uint64_t GetEmit26(size_t i, size_t emit) { 156 return table26_emit_[i >> 6][emit]; 157 } GetOp27(size_t i)158 static inline uint64_t GetOp27(size_t i) { 159 return table27_ops_[i >> 7][i & 0x7f]; 160 } GetEmit27(size_t i,size_t emit)161 static inline uint64_t GetEmit27(size_t i, size_t emit) { 162 return table27_emit_[i >> 7][emit]; 163 } GetOp28(size_t i)164 static inline uint64_t GetOp28(size_t i) { 165 return table28_ops_[i >> 7][i & 0x7f]; 166 } GetEmit28(size_t i,size_t emit)167 static inline uint64_t GetEmit28(size_t i, size_t emit) { 168 return table28_emit_[i >> 7][emit]; 169 } GetOp20(size_t i)170 static inline uint64_t GetOp20(size_t i) { 171 return table20_ops_[i >> 7][i & 0x7f]; 172 } GetEmit20(size_t i,size_t emit)173 static inline uint64_t GetEmit20(size_t i, size_t emit) { 174 return table20_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 table4_0_emit_[22]; 183 static const uint8_t table4_0_ops_[64]; 184 static const uint8_t table4_1_emit_[46]; 185 static const uint8_t table4_1_ops_[64]; 186 static const uint8_t* const table4_emit_[2]; 187 static const uint8_t* const table4_ops_[2]; 188 static const uint8_t table1_0_emit_[74]; 189 static const uint16_t table1_0_inner_[76]; 190 static const uint8_t table1_0_outer_[256]; 191 static const uint8_t table8_0_inner_[6]; 192 static const uint8_t table8_0_outer_[8]; 193 static const uint8_t table9_0_emit_[6]; 194 static const uint8_t table9_0_inner_[8]; 195 static const uint8_t table9_0_outer_[16]; 196 static const uint8_t table10_0_emit_[12]; 197 static const uint8_t table10_0_ops_[32]; 198 static const uint8_t table11_0_emit_[14]; 199 static const uint8_t table11_0_ops_[64]; 200 static const uint8_t table12_0_emit_[36]; 201 static const uint8_t table12_0_ops_[128]; 202 static const uint8_t table13_0_emit_[44]; 203 static const uint8_t table13_0_ops_[32]; 204 static const uint8_t table13_1_emit_[28]; 205 static const uint8_t table13_1_ops_[32]; 206 static const uint8_t table13_2_emit_[20]; 207 static const uint8_t table13_2_ops_[32]; 208 static const uint8_t table13_3_emit_[20]; 209 static const uint8_t table13_4_emit_[20]; 210 static const uint8_t table13_5_emit_[2]; 211 static const uint8_t table13_5_ops_[32]; 212 static const uint8_t table13_6_emit_[4]; 213 static const uint8_t table13_6_ops_[32]; 214 static const uint8_t table13_7_emit_[7]; 215 static const uint8_t table13_7_ops_[32]; 216 static const uint8_t* const table13_emit_[8]; 217 static const uint8_t* const table13_ops_[8]; 218 static const uint8_t table6_0_emit_[1]; 219 static const uint16_t table6_0_ops_[32]; 220 static const uint8_t table6_4_emit_[1]; 221 static const uint16_t table6_4_ops_[32]; 222 static const uint8_t table6_6_emit_[1]; 223 static const uint8_t table6_8_emit_[1]; 224 static const uint8_t table6_10_emit_[1]; 225 static const uint16_t table6_10_ops_[32]; 226 static const uint8_t table6_11_emit_[1]; 227 static const uint8_t table6_12_emit_[2]; 228 static const uint16_t table6_12_ops_[32]; 229 static const uint8_t table6_13_emit_[2]; 230 static const uint8_t table6_14_emit_[2]; 231 static const uint8_t table6_15_emit_[5]; 232 static const uint16_t table6_15_ops_[32]; 233 static const uint8_t* const table6_emit_[16]; 234 static const uint16_t* const table6_ops_[16]; 235 static const uint8_t table14_0_emit_[5]; 236 static const uint8_t table14_0_inner_[5]; 237 static const uint8_t table17_0_emit_[6]; 238 static const uint8_t table17_0_inner_[7]; 239 static const uint8_t table16_0_emit_[10]; 240 static const uint8_t table16_0_inner_[10]; 241 static const uint8_t table19_0_emit_[9]; 242 static const uint8_t table19_0_inner_[10]; 243 static const uint8_t table18_0_emit_[23]; 244 static const uint8_t table18_0_ops_[32]; 245 static const uint8_t table21_0_emit_[12]; 246 static const uint8_t table21_0_ops_[32]; 247 static const uint8_t table22_0_emit_[41]; 248 static const uint8_t table22_0_ops_[64]; 249 static const uint8_t table23_0_emit_[53]; 250 static const uint8_t table23_0_ops_[128]; 251 static const uint8_t table24_0_emit_[57]; 252 static const uint8_t table24_0_ops_[256]; 253 static const uint8_t table25_0_emit_[4]; 254 static const uint8_t table25_0_ops_[64]; 255 static const uint8_t table25_1_emit_[4]; 256 static const uint8_t table25_2_emit_[4]; 257 static const uint8_t table25_3_emit_[8]; 258 static const uint8_t table25_3_ops_[64]; 259 static const uint8_t table25_4_emit_[8]; 260 static const uint8_t table25_5_emit_[8]; 261 static const uint8_t table25_6_emit_[11]; 262 static const uint8_t table25_6_ops_[64]; 263 static const uint8_t table25_7_emit_[25]; 264 static const uint8_t table25_7_ops_[64]; 265 static const uint8_t* const table25_emit_[8]; 266 static const uint8_t* const table25_ops_[8]; 267 static const uint8_t table26_0_emit_[40]; 268 static const uint8_t table26_0_ops_[64]; 269 static const uint8_t table26_1_emit_[40]; 270 static const uint8_t table26_2_emit_[40]; 271 static const uint8_t table26_3_emit_[40]; 272 static const uint8_t table26_4_emit_[40]; 273 static const uint8_t table26_5_emit_[40]; 274 static const uint8_t table26_6_emit_[4]; 275 static const uint8_t table26_6_ops_[64]; 276 static const uint8_t table26_7_emit_[4]; 277 static const uint8_t table26_8_emit_[4]; 278 static const uint8_t table26_9_emit_[4]; 279 static const uint8_t table26_10_emit_[4]; 280 static const uint8_t table26_11_emit_[4]; 281 static const uint8_t table26_12_emit_[4]; 282 static const uint8_t table26_13_emit_[7]; 283 static const uint8_t table26_13_ops_[64]; 284 static const uint8_t table26_14_emit_[10]; 285 static const uint8_t table26_14_ops_[64]; 286 static const uint8_t table26_15_emit_[34]; 287 static const uint8_t table26_15_ops_[64]; 288 static const uint8_t* const table26_emit_[16]; 289 static const uint8_t* const table26_ops_[16]; 290 static const uint8_t table27_0_emit_[144]; 291 static const uint16_t table27_0_ops_[128]; 292 static const uint8_t table27_1_emit_[144]; 293 static const uint8_t table27_2_emit_[144]; 294 static const uint8_t table27_3_emit_[144]; 295 static const uint8_t table27_4_emit_[144]; 296 static const uint8_t table27_5_emit_[144]; 297 static const uint8_t table27_6_emit_[80]; 298 static const uint16_t table27_6_ops_[128]; 299 static const uint8_t table27_7_emit_[80]; 300 static const uint8_t table27_8_emit_[80]; 301 static const uint8_t table27_9_emit_[80]; 302 static const uint8_t table27_10_emit_[80]; 303 static const uint8_t table27_11_emit_[80]; 304 static const uint8_t table27_12_emit_[80]; 305 static const uint8_t table27_13_emit_[26]; 306 static const uint16_t table27_13_ops_[128]; 307 static const uint16_t table27_14_ops_[128]; 308 static const uint8_t table27_15_emit_[63]; 309 static const uint16_t table27_15_ops_[128]; 310 static const uint8_t* const table27_emit_[16]; 311 static const uint16_t* const table27_ops_[16]; 312 static const uint8_t table28_0_emit_[136]; 313 static const uint16_t table28_0_ops_[128]; 314 static const uint8_t table28_1_emit_[136]; 315 static const uint8_t table28_2_emit_[136]; 316 static const uint8_t table28_3_emit_[136]; 317 static const uint8_t table28_4_emit_[136]; 318 static const uint8_t table28_5_emit_[136]; 319 static const uint8_t table28_6_emit_[136]; 320 static const uint8_t table28_7_emit_[136]; 321 static const uint8_t table28_8_emit_[136]; 322 static const uint8_t table28_9_emit_[136]; 323 static const uint8_t table28_10_emit_[136]; 324 static const uint8_t table28_11_emit_[136]; 325 static const uint8_t table28_12_emit_[144]; 326 static const uint8_t table28_13_emit_[144]; 327 static const uint8_t table28_14_emit_[144]; 328 static const uint8_t table28_15_emit_[144]; 329 static const uint8_t table28_16_emit_[144]; 330 static const uint8_t table28_17_emit_[144]; 331 static const uint8_t table28_18_emit_[144]; 332 static const uint8_t table28_19_emit_[144]; 333 static const uint8_t table28_20_emit_[144]; 334 static const uint8_t table28_21_emit_[144]; 335 static const uint8_t table28_22_emit_[144]; 336 static const uint8_t table28_23_emit_[144]; 337 static const uint8_t table28_24_emit_[144]; 338 static const uint8_t table28_25_emit_[144]; 339 static const uint8_t table28_26_emit_[112]; 340 static const uint16_t table28_26_ops_[128]; 341 static const uint8_t table28_27_emit_[80]; 342 static const uint8_t table28_28_emit_[80]; 343 static const uint8_t table28_29_emit_[44]; 344 static const uint16_t table28_29_ops_[128]; 345 static const uint8_t table28_30_emit_[17]; 346 static const uint16_t table28_30_ops_[128]; 347 static const uint8_t table28_31_emit_[46]; 348 static const uint16_t table28_31_ops_[128]; 349 static const uint8_t* const table28_emit_[32]; 350 static const uint16_t* const table28_ops_[32]; 351 static const uint8_t table20_0_emit_[1]; 352 static const uint16_t table20_0_ops_[128]; 353 static const uint8_t table20_2_emit_[1]; 354 static const uint8_t table20_4_emit_[1]; 355 static const uint8_t table20_6_emit_[1]; 356 static const uint8_t table20_8_emit_[1]; 357 static const uint8_t table20_10_emit_[1]; 358 static const uint8_t table20_12_emit_[1]; 359 static const uint8_t table20_14_emit_[1]; 360 static const uint8_t table20_16_emit_[1]; 361 static const uint8_t table20_18_emit_[1]; 362 static const uint8_t table20_20_emit_[1]; 363 static const uint8_t table20_22_emit_[1]; 364 static const uint8_t table20_24_emit_[1]; 365 static const uint16_t table20_24_ops_[128]; 366 static const uint8_t table20_25_emit_[1]; 367 static const uint8_t table20_26_emit_[1]; 368 static const uint8_t table20_27_emit_[1]; 369 static const uint8_t table20_28_emit_[1]; 370 static const uint8_t table20_29_emit_[1]; 371 static const uint8_t table20_30_emit_[1]; 372 static const uint8_t table20_31_emit_[1]; 373 static const uint8_t table20_32_emit_[1]; 374 static const uint8_t table20_33_emit_[1]; 375 static const uint8_t table20_34_emit_[1]; 376 static const uint8_t table20_35_emit_[1]; 377 static const uint8_t table20_36_emit_[1]; 378 static const uint8_t table20_37_emit_[1]; 379 static const uint8_t table20_38_emit_[1]; 380 static const uint8_t table20_39_emit_[1]; 381 static const uint8_t table20_40_emit_[1]; 382 static const uint8_t table20_41_emit_[1]; 383 static const uint8_t table20_42_emit_[1]; 384 static const uint8_t table20_43_emit_[1]; 385 static const uint8_t table20_44_emit_[1]; 386 static const uint8_t table20_45_emit_[1]; 387 static const uint8_t table20_46_emit_[1]; 388 static const uint8_t table20_47_emit_[1]; 389 static const uint8_t table20_48_emit_[1]; 390 static const uint8_t table20_49_emit_[1]; 391 static const uint8_t table20_50_emit_[1]; 392 static const uint8_t table20_51_emit_[1]; 393 static const uint8_t table20_52_emit_[1]; 394 static const uint8_t table20_53_emit_[2]; 395 static const uint16_t table20_53_ops_[128]; 396 static const uint8_t table20_54_emit_[2]; 397 static const uint8_t table20_55_emit_[2]; 398 static const uint8_t table20_56_emit_[2]; 399 static const uint8_t table20_57_emit_[2]; 400 static const uint8_t table20_58_emit_[2]; 401 static const uint8_t table20_59_emit_[4]; 402 static const uint16_t table20_59_ops_[128]; 403 static const uint8_t table20_60_emit_[8]; 404 static const uint16_t table20_60_ops_[128]; 405 static const uint8_t table20_61_emit_[9]; 406 static const uint16_t table20_61_ops_[128]; 407 static const uint8_t table20_62_emit_[16]; 408 static const uint16_t table20_62_ops_[128]; 409 static const uint8_t table20_63_emit_[33]; 410 static const uint16_t table20_63_ops_[128]; 411 static const uint8_t* const table20_emit_[64]; 412 static const uint16_t* const table20_ops_[64]; 413 }; 414 template <typename F> 415 class HuffDecoder : public HuffDecoderCommon { 416 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)417 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 418 : sink_(sink), begin_(begin), end_(end) {} Run()419 bool Run() { 420 while (!done_) { 421 if (!RefillTo8()) { 422 Done0(); 423 break; 424 } 425 const auto index = (buffer_ >> (buffer_len_ - 8)) & 0xff; 426 const auto op = GetOp1(index); 427 const int consumed = op & 15; 428 buffer_len_ -= consumed; 429 const auto emit_ofs = op >> 6; 430 switch ((op >> 4) & 3) { 431 case 0: { 432 sink_(GetEmit1(index, emit_ofs + 0)); 433 break; 434 } 435 case 1: { 436 DecodeStep0(); 437 break; 438 } 439 case 2: { 440 DecodeStep1(); 441 break; 442 } 443 } 444 } 445 return ok_; 446 } 447 448 private: RefillTo8()449 bool RefillTo8() { 450 switch (buffer_len_) { 451 case 0: { 452 return Read1to8Bytes(); 453 } 454 case 1: 455 case 2: 456 case 3: 457 case 4: 458 case 5: 459 case 6: 460 case 7: { 461 return Read1to7Bytes(); 462 } 463 } 464 return true; 465 } Read1to8Bytes()466 bool Read1to8Bytes() { 467 switch (end_ - begin_) { 468 case 0: { 469 return false; 470 } 471 case 1: { 472 Fill1(); 473 return true; 474 } 475 case 2: { 476 Fill2(); 477 return true; 478 } 479 case 3: { 480 Fill3(); 481 return true; 482 } 483 case 4: { 484 Fill4(); 485 return true; 486 } 487 case 5: { 488 Fill5(); 489 return true; 490 } 491 case 6: { 492 Fill6(); 493 return true; 494 } 495 case 7: { 496 Fill7(); 497 return true; 498 } 499 default: { 500 Fill8(); 501 return true; 502 } 503 } 504 } Fill1()505 void Fill1() { 506 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 507 begin_ += 1; 508 buffer_len_ += 8; 509 } Fill2()510 void Fill2() { 511 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 512 (static_cast<uint64_t>(begin_[1]) << 0); 513 begin_ += 2; 514 buffer_len_ += 16; 515 } Fill3()516 void Fill3() { 517 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 518 (static_cast<uint64_t>(begin_[1]) << 8) | 519 (static_cast<uint64_t>(begin_[2]) << 0); 520 begin_ += 3; 521 buffer_len_ += 24; 522 } Fill4()523 void Fill4() { 524 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 525 (static_cast<uint64_t>(begin_[1]) << 16) | 526 (static_cast<uint64_t>(begin_[2]) << 8) | 527 (static_cast<uint64_t>(begin_[3]) << 0); 528 begin_ += 4; 529 buffer_len_ += 32; 530 } Fill5()531 void Fill5() { 532 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 533 (static_cast<uint64_t>(begin_[1]) << 24) | 534 (static_cast<uint64_t>(begin_[2]) << 16) | 535 (static_cast<uint64_t>(begin_[3]) << 8) | 536 (static_cast<uint64_t>(begin_[4]) << 0); 537 begin_ += 5; 538 buffer_len_ += 40; 539 } Fill6()540 void Fill6() { 541 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 542 (static_cast<uint64_t>(begin_[1]) << 32) | 543 (static_cast<uint64_t>(begin_[2]) << 24) | 544 (static_cast<uint64_t>(begin_[3]) << 16) | 545 (static_cast<uint64_t>(begin_[4]) << 8) | 546 (static_cast<uint64_t>(begin_[5]) << 0); 547 begin_ += 6; 548 buffer_len_ += 48; 549 } Fill7()550 void Fill7() { 551 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 552 (static_cast<uint64_t>(begin_[1]) << 40) | 553 (static_cast<uint64_t>(begin_[2]) << 32) | 554 (static_cast<uint64_t>(begin_[3]) << 24) | 555 (static_cast<uint64_t>(begin_[4]) << 16) | 556 (static_cast<uint64_t>(begin_[5]) << 8) | 557 (static_cast<uint64_t>(begin_[6]) << 0); 558 begin_ += 7; 559 buffer_len_ += 56; 560 } Fill8()561 void Fill8() { 562 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 563 (static_cast<uint64_t>(begin_[1]) << 48) | 564 (static_cast<uint64_t>(begin_[2]) << 40) | 565 (static_cast<uint64_t>(begin_[3]) << 32) | 566 (static_cast<uint64_t>(begin_[4]) << 24) | 567 (static_cast<uint64_t>(begin_[5]) << 16) | 568 (static_cast<uint64_t>(begin_[6]) << 8) | 569 (static_cast<uint64_t>(begin_[7]) << 0); 570 begin_ += 8; 571 buffer_len_ += 64; 572 } Read1to7Bytes()573 bool Read1to7Bytes() { 574 switch (end_ - begin_) { 575 case 0: { 576 return false; 577 } 578 case 1: { 579 Fill1(); 580 return true; 581 } 582 case 2: { 583 Fill2(); 584 return true; 585 } 586 case 3: { 587 Fill3(); 588 return true; 589 } 590 case 4: { 591 Fill4(); 592 return true; 593 } 594 case 5: { 595 Fill5(); 596 return true; 597 } 598 case 6: { 599 Fill6(); 600 return true; 601 } 602 default: { 603 Fill7(); 604 return true; 605 } 606 } 607 } Done0()608 void Done0() { 609 done_ = true; 610 switch (end_ - begin_) {} 611 switch (buffer_len_) { 612 case 1: 613 case 2: 614 case 3: 615 case 4: { 616 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 617 return; 618 } 619 case 5: { 620 const auto index = buffer_ & 31; 621 const auto op = GetOp2(index); 622 switch (op & 3) { 623 case 0: { 624 sink_(GetEmit2(index, (op >> 2) + 0)); 625 break; 626 } 627 case 1: { 628 ok_ = false; 629 break; 630 } 631 } 632 return; 633 } 634 case 6: { 635 const auto index = buffer_ & 63; 636 const auto op = GetOp3(index); 637 switch (op & 3) { 638 case 0: { 639 ok_ = false; 640 break; 641 } 642 case 1: { 643 sink_(GetEmit3(index, (op >> 2) + 0)); 644 break; 645 } 646 } 647 return; 648 } 649 case 7: { 650 const auto index = buffer_ & 127; 651 const auto op = GetOp4(index); 652 switch (op & 3) { 653 case 0: { 654 ok_ = false; 655 break; 656 } 657 case 1: { 658 sink_(GetEmit4(index, (op >> 2) + 0)); 659 break; 660 } 661 } 662 return; 663 } 664 case 0: { 665 return; 666 } 667 } 668 } DecodeStep0()669 void DecodeStep0() { 670 if (!RefillTo2()) { 671 Done1(); 672 return; 673 } 674 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 675 const auto op = GetOp5(index); 676 const int consumed = op & 3; 677 buffer_len_ -= consumed; 678 const auto emit_ofs = op >> 2; 679 sink_(GetEmit5(index, emit_ofs + 0)); 680 } RefillTo2()681 bool RefillTo2() { 682 switch (buffer_len_) { 683 case 0: { 684 return Read1to8Bytes(); 685 } 686 case 1: { 687 return Read1to7Bytes(); 688 } 689 } 690 return true; 691 } Done1()692 void Done1() { 693 done_ = true; 694 switch (buffer_len_) { 695 case 1: 696 case 0: { 697 ok_ = false; 698 return; 699 } 700 } 701 } DecodeStep1()702 void DecodeStep1() { 703 if (!RefillTo9()) { 704 Done2(); 705 return; 706 } 707 const auto index = (buffer_ >> (buffer_len_ - 9)) & 0x1ff; 708 const auto op = GetOp6(index); 709 const int consumed = op & 15; 710 buffer_len_ -= consumed; 711 const auto emit_ofs = op >> 7; 712 switch ((op >> 4) & 7) { 713 case 0: { 714 sink_(GetEmit6(index, emit_ofs + 0)); 715 break; 716 } 717 case 1: { 718 DecodeStep2(); 719 break; 720 } 721 case 2: { 722 DecodeStep3(); 723 break; 724 } 725 case 3: { 726 DecodeStep4(); 727 break; 728 } 729 case 4: { 730 DecodeStep5(); 731 break; 732 } 733 } 734 } RefillTo9()735 bool RefillTo9() { 736 switch (buffer_len_) { 737 case 0: { 738 return Read2to8Bytes(); 739 } 740 case 1: 741 case 2: 742 case 3: 743 case 4: 744 case 5: 745 case 6: 746 case 7: 747 case 8: { 748 return Read1to7Bytes(); 749 } 750 } 751 return true; 752 } Read2to8Bytes()753 bool Read2to8Bytes() { 754 switch (end_ - begin_) { 755 case 0: 756 case 1: { 757 return false; 758 } 759 case 2: { 760 Fill2(); 761 return true; 762 } 763 case 3: { 764 Fill3(); 765 return true; 766 } 767 case 4: { 768 Fill4(); 769 return true; 770 } 771 case 5: { 772 Fill5(); 773 return true; 774 } 775 case 6: { 776 Fill6(); 777 return true; 778 } 779 case 7: { 780 Fill7(); 781 return true; 782 } 783 default: { 784 Fill8(); 785 return true; 786 } 787 } 788 } Done2()789 void Done2() { 790 done_ = true; 791 switch (end_ - begin_) { 792 case 1: { 793 Fill1(); 794 break; 795 } 796 } 797 switch (buffer_len_) { 798 case 1: { 799 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 800 return; 801 } 802 case 2: { 803 const auto index = buffer_ & 3; 804 const auto op = GetOp7(index); 805 switch (op & 3) { 806 case 0: { 807 sink_(GetEmit7(index, (op >> 2) + 0)); 808 break; 809 } 810 case 1: { 811 ok_ = false; 812 break; 813 } 814 } 815 return; 816 } 817 case 3: { 818 const auto index = buffer_ & 7; 819 const auto op = GetOp8(index); 820 switch (op & 3) { 821 case 0: { 822 ok_ = false; 823 break; 824 } 825 case 1: { 826 sink_(GetEmit8(index, (op >> 2) + 0)); 827 break; 828 } 829 } 830 return; 831 } 832 case 4: { 833 const auto index = buffer_ & 15; 834 const auto op = GetOp9(index); 835 switch (op & 3) { 836 case 0: { 837 ok_ = false; 838 break; 839 } 840 case 1: { 841 sink_(GetEmit9(index, (op >> 2) + 0)); 842 break; 843 } 844 } 845 return; 846 } 847 case 5: { 848 const auto index = buffer_ & 31; 849 const auto op = GetOp10(index); 850 switch (op & 3) { 851 case 0: { 852 ok_ = false; 853 break; 854 } 855 case 1: { 856 sink_(GetEmit10(index, (op >> 2) + 0)); 857 break; 858 } 859 } 860 return; 861 } 862 case 6: { 863 const auto index = buffer_ & 63; 864 const auto op = GetOp11(index); 865 switch (op & 3) { 866 case 0: { 867 ok_ = false; 868 break; 869 } 870 case 1: { 871 sink_(GetEmit11(index, (op >> 2) + 0)); 872 break; 873 } 874 } 875 return; 876 } 877 case 7: { 878 const auto index = buffer_ & 127; 879 const auto op = GetOp12(index); 880 switch (op & 3) { 881 case 0: { 882 sink_(GetEmit12(index, (op >> 2) + 0)); 883 sink_(GetEmit12(index, (op >> 2) + 1)); 884 break; 885 } 886 case 1: { 887 ok_ = false; 888 break; 889 } 890 case 2: { 891 sink_(GetEmit12(index, (op >> 2) + 0)); 892 break; 893 } 894 } 895 return; 896 } 897 case 8: { 898 const auto index = buffer_ & 255; 899 const auto op = GetOp13(index); 900 switch (op & 3) { 901 case 0: { 902 ok_ = false; 903 break; 904 } 905 case 1: { 906 sink_(GetEmit13(index, (op >> 2) + 0)); 907 sink_(GetEmit13(index, (op >> 2) + 1)); 908 break; 909 } 910 case 2: { 911 sink_(GetEmit13(index, (op >> 2) + 0)); 912 break; 913 } 914 } 915 return; 916 } 917 case 0: { 918 return; 919 } 920 } 921 } DecodeStep2()922 void DecodeStep2() { 923 if (!RefillTo3()) { 924 Done3(); 925 return; 926 } 927 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 928 const auto op = GetOp14(index); 929 const int consumed = op & 3; 930 buffer_len_ -= consumed; 931 const auto emit_ofs = op >> 2; 932 sink_(GetEmit14(index, emit_ofs + 0)); 933 } RefillTo3()934 bool RefillTo3() { 935 switch (buffer_len_) { 936 case 0: { 937 return Read1to8Bytes(); 938 } 939 case 1: 940 case 2: { 941 return Read1to7Bytes(); 942 } 943 } 944 return true; 945 } Done3()946 void Done3() { 947 done_ = true; 948 switch (buffer_len_) { 949 case 1: 950 case 0: { 951 ok_ = false; 952 return; 953 } 954 case 2: { 955 const auto index = buffer_ & 3; 956 const auto op = GetOp15(index); 957 switch (op & 1) { 958 case 0: { 959 sink_(GetEmit15(index, (op >> 1) + 0)); 960 break; 961 } 962 case 1: { 963 ok_ = false; 964 break; 965 } 966 } 967 return; 968 } 969 } 970 } DecodeStep3()971 void DecodeStep3() { 972 if (!RefillTo4()) { 973 Done4(); 974 return; 975 } 976 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 977 const auto op = GetOp16(index); 978 const int consumed = op & 7; 979 buffer_len_ -= consumed; 980 const auto emit_ofs = op >> 3; 981 sink_(GetEmit16(index, emit_ofs + 0)); 982 } RefillTo4()983 bool RefillTo4() { 984 switch (buffer_len_) { 985 case 0: { 986 return Read1to8Bytes(); 987 } 988 case 1: 989 case 2: 990 case 3: { 991 return Read1to7Bytes(); 992 } 993 } 994 return true; 995 } Done4()996 void Done4() { 997 done_ = true; 998 switch (buffer_len_) { 999 case 1: 1000 case 2: 1001 case 0: { 1002 ok_ = false; 1003 return; 1004 } 1005 case 3: { 1006 const auto index = buffer_ & 7; 1007 const auto op = GetOp17(index); 1008 switch (op & 1) { 1009 case 0: { 1010 sink_(GetEmit17(index, (op >> 1) + 0)); 1011 break; 1012 } 1013 case 1: { 1014 ok_ = false; 1015 break; 1016 } 1017 } 1018 return; 1019 } 1020 } 1021 } DecodeStep4()1022 void DecodeStep4() { 1023 if (!RefillTo5()) { 1024 Done5(); 1025 return; 1026 } 1027 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1028 const auto op = GetOp18(index); 1029 const int consumed = op & 7; 1030 buffer_len_ -= consumed; 1031 const auto emit_ofs = op >> 3; 1032 sink_(GetEmit18(index, emit_ofs + 0)); 1033 } RefillTo5()1034 bool RefillTo5() { 1035 switch (buffer_len_) { 1036 case 0: { 1037 return Read1to8Bytes(); 1038 } 1039 case 1: 1040 case 2: 1041 case 3: 1042 case 4: { 1043 return Read1to7Bytes(); 1044 } 1045 } 1046 return true; 1047 } Done5()1048 void Done5() { 1049 done_ = true; 1050 switch (buffer_len_) { 1051 case 1: 1052 case 2: 1053 case 3: 1054 case 0: { 1055 ok_ = false; 1056 return; 1057 } 1058 case 4: { 1059 const auto index = buffer_ & 15; 1060 const auto op = GetOp19(index); 1061 switch (op & 1) { 1062 case 0: { 1063 sink_(GetEmit19(index, (op >> 1) + 0)); 1064 break; 1065 } 1066 case 1: { 1067 ok_ = false; 1068 break; 1069 } 1070 } 1071 return; 1072 } 1073 } 1074 } DecodeStep5()1075 void DecodeStep5() { 1076 if (!RefillTo13()) { 1077 Done6(); 1078 return; 1079 } 1080 const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff; 1081 const auto op = GetOp20(index); 1082 const int consumed = op & 15; 1083 buffer_len_ -= consumed; 1084 const auto emit_ofs = op >> 5; 1085 switch ((op >> 4) & 1) { 1086 case 0: { 1087 sink_(GetEmit20(index, emit_ofs + 0)); 1088 break; 1089 } 1090 case 1: { 1091 begin_ = end_; 1092 buffer_len_ = 0; 1093 break; 1094 } 1095 } 1096 } RefillTo13()1097 bool RefillTo13() { 1098 switch (buffer_len_) { 1099 case 0: { 1100 return Read2to8Bytes(); 1101 } 1102 case 1: 1103 case 2: 1104 case 3: 1105 case 4: { 1106 return Read2to7Bytes(); 1107 } 1108 case 5: 1109 case 6: 1110 case 7: 1111 case 8: { 1112 return Read1to7Bytes(); 1113 } 1114 case 9: 1115 case 10: 1116 case 11: 1117 case 12: { 1118 return Read1to6Bytes(); 1119 } 1120 } 1121 return true; 1122 } Read2to7Bytes()1123 bool Read2to7Bytes() { 1124 switch (end_ - begin_) { 1125 case 0: 1126 case 1: { 1127 return false; 1128 } 1129 case 2: { 1130 Fill2(); 1131 return true; 1132 } 1133 case 3: { 1134 Fill3(); 1135 return true; 1136 } 1137 case 4: { 1138 Fill4(); 1139 return true; 1140 } 1141 case 5: { 1142 Fill5(); 1143 return true; 1144 } 1145 case 6: { 1146 Fill6(); 1147 return true; 1148 } 1149 default: { 1150 Fill7(); 1151 return true; 1152 } 1153 } 1154 } Read1to6Bytes()1155 bool Read1to6Bytes() { 1156 switch (end_ - begin_) { 1157 case 0: { 1158 return false; 1159 } 1160 case 1: { 1161 Fill1(); 1162 return true; 1163 } 1164 case 2: { 1165 Fill2(); 1166 return true; 1167 } 1168 case 3: { 1169 Fill3(); 1170 return true; 1171 } 1172 case 4: { 1173 Fill4(); 1174 return true; 1175 } 1176 case 5: { 1177 Fill5(); 1178 return true; 1179 } 1180 default: { 1181 Fill6(); 1182 return true; 1183 } 1184 } 1185 } Done6()1186 void Done6() { 1187 done_ = true; 1188 switch (end_ - begin_) { 1189 case 1: { 1190 Fill1(); 1191 break; 1192 } 1193 } 1194 switch (buffer_len_) { 1195 case 1: 1196 case 2: 1197 case 3: 1198 case 4: { 1199 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1200 return; 1201 } 1202 case 5: { 1203 const auto index = buffer_ & 31; 1204 const auto op = GetOp21(index); 1205 switch (op & 3) { 1206 case 0: { 1207 sink_(GetEmit21(index, (op >> 2) + 0)); 1208 break; 1209 } 1210 case 1: { 1211 ok_ = false; 1212 break; 1213 } 1214 } 1215 return; 1216 } 1217 case 6: { 1218 const auto index = buffer_ & 63; 1219 const auto op = GetOp22(index); 1220 switch (op & 3) { 1221 case 0: { 1222 ok_ = false; 1223 break; 1224 } 1225 case 1: { 1226 sink_(GetEmit22(index, (op >> 2) + 0)); 1227 break; 1228 } 1229 } 1230 return; 1231 } 1232 case 7: { 1233 const auto index = buffer_ & 127; 1234 const auto op = GetOp23(index); 1235 switch (op & 3) { 1236 case 0: { 1237 ok_ = false; 1238 break; 1239 } 1240 case 1: { 1241 sink_(GetEmit23(index, (op >> 2) + 0)); 1242 break; 1243 } 1244 } 1245 return; 1246 } 1247 case 8: { 1248 const auto index = buffer_ & 255; 1249 const auto op = GetOp24(index); 1250 switch (op & 3) { 1251 case 0: { 1252 ok_ = false; 1253 break; 1254 } 1255 case 1: { 1256 sink_(GetEmit24(index, (op >> 2) + 0)); 1257 break; 1258 } 1259 } 1260 return; 1261 } 1262 case 9: { 1263 const auto index = buffer_ & 511; 1264 const auto op = GetOp25(index); 1265 switch (op & 3) { 1266 case 0: { 1267 ok_ = false; 1268 break; 1269 } 1270 case 1: { 1271 sink_(GetEmit25(index, (op >> 2) + 0)); 1272 break; 1273 } 1274 } 1275 return; 1276 } 1277 case 10: { 1278 const auto index = buffer_ & 1023; 1279 const auto op = GetOp26(index); 1280 switch (op & 3) { 1281 case 0: { 1282 sink_(GetEmit26(index, (op >> 2) + 0)); 1283 sink_(GetEmit26(index, (op >> 2) + 1)); 1284 break; 1285 } 1286 case 1: { 1287 ok_ = false; 1288 break; 1289 } 1290 case 2: { 1291 sink_(GetEmit26(index, (op >> 2) + 0)); 1292 break; 1293 } 1294 } 1295 return; 1296 } 1297 case 11: { 1298 const auto index = buffer_ & 2047; 1299 const auto op = GetOp27(index); 1300 switch (op & 3) { 1301 case 0: { 1302 ok_ = false; 1303 break; 1304 } 1305 case 1: { 1306 sink_(GetEmit27(index, (op >> 2) + 0)); 1307 sink_(GetEmit27(index, (op >> 2) + 1)); 1308 break; 1309 } 1310 case 2: { 1311 sink_(GetEmit27(index, (op >> 2) + 0)); 1312 break; 1313 } 1314 } 1315 return; 1316 } 1317 case 12: { 1318 const auto index = buffer_ & 4095; 1319 const auto op = GetOp28(index); 1320 switch (op & 3) { 1321 case 0: { 1322 ok_ = false; 1323 break; 1324 } 1325 case 1: { 1326 sink_(GetEmit28(index, (op >> 2) + 0)); 1327 sink_(GetEmit28(index, (op >> 2) + 1)); 1328 break; 1329 } 1330 case 2: { 1331 sink_(GetEmit28(index, (op >> 2) + 0)); 1332 break; 1333 } 1334 } 1335 return; 1336 } 1337 case 0: { 1338 return; 1339 } 1340 } 1341 } 1342 F sink_; 1343 const uint8_t* begin_; 1344 const uint8_t* const end_; 1345 uint64_t buffer_ = 0; 1346 int buffer_len_ = 0; 1347 bool ok_ = true; 1348 bool done_ = false; 1349 }; 1350 } // namespace geometry_8_9_13 1351 } // namespace grpc_core 1352 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_8_9_13_H 1353