1 // Copyright 2023 gRPC authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // This file is autogenerated: see 16 // tools/codegen/core/gen_huffman_decompressor.cc 17 18 #ifndef GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_7_13_H 19 #define GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_7_13_H 20 #include <cstddef> 21 #include <cstdint> 22 23 #include <grpc/support/port_platform.h> 24 namespace grpc_core { 25 namespace geometry_10_7_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 } GetOp5(size_t i)42 static inline uint64_t GetOp5(size_t i) { 43 return table5_ops_[i >> 7][i & 0x7f]; 44 } GetEmit5(size_t i,size_t emit)45 static inline uint64_t GetEmit5(size_t i, size_t emit) { 46 return table5_emit_[i >> 7][emit]; 47 } GetOp6(size_t i)48 static inline uint64_t GetOp6(size_t i) { 49 return table6_ops_[i >> 5][i & 0x1f]; 50 } GetEmit6(size_t i,size_t emit)51 static inline uint64_t GetEmit6(size_t i, size_t emit) { 52 return table6_emit_[i >> 5][emit]; 53 } GetOp1(size_t i)54 static inline uint64_t GetOp1(size_t i) { 55 return table1_inner_[i >> 6][table1_outer_[i >> 6][i & 0x3f]]; 56 } GetEmit1(size_t i,size_t emit)57 static inline uint64_t GetEmit1(size_t i, size_t emit) { 58 return table1_emit_[i >> 6][emit]; 59 } GetOp7(size_t i)60 static inline uint64_t GetOp7(size_t i) { return i ? 3 : 1; } GetEmit7(size_t,size_t emit)61 static inline uint64_t GetEmit7(size_t, size_t emit) { 62 return emit ? 43 : 39; 63 } GetOp9(size_t i)64 static inline uint64_t GetOp9(size_t i) { return table9_0_inner_[i]; } GetEmit9(size_t,size_t emit)65 static inline uint64_t GetEmit9(size_t, size_t emit) { 66 return table9_0_emit_[emit]; 67 } GetOp10(size_t i)68 static inline uint64_t GetOp10(size_t i) { 69 return table10_0_inner_[table10_0_outer_[i]]; 70 } GetEmit10(size_t,size_t emit)71 static inline uint64_t GetEmit10(size_t, size_t emit) { 72 return table10_0_emit_[emit]; 73 } GetOp11(size_t i)74 static inline uint64_t GetOp11(size_t i) { return table11_0_ops_[i]; } GetEmit11(size_t,size_t emit)75 static inline uint64_t GetEmit11(size_t, size_t emit) { 76 return table11_0_emit_[emit]; 77 } GetOp12(size_t i)78 static inline uint64_t GetOp12(size_t i) { return table12_0_ops_[i]; } GetEmit12(size_t,size_t emit)79 static inline uint64_t GetEmit12(size_t, size_t emit) { 80 return table11_0_emit_[emit]; 81 } GetOp8(size_t i)82 static inline uint64_t GetOp8(size_t i) { 83 return table8_ops_[i >> 5][i & 0x1f]; 84 } GetEmit8(size_t i,size_t emit)85 static inline uint64_t GetEmit8(size_t i, size_t emit) { 86 return table8_emit_[i >> 5][emit]; 87 } GetOp14(size_t i)88 static inline uint64_t GetOp14(size_t i) { 89 return (i < 2 ? (i ? 2 : 0) : ((i - 2) ? 1 : 4)); 90 } GetEmit14(size_t,size_t emit)91 static inline uint64_t GetEmit14(size_t, size_t emit) { 92 return (emit < 1 ? (((void)emit, 92)) : ((emit - 1) ? 208 : 195)); 93 } GetOp13(size_t i)94 static inline uint64_t GetOp13(size_t i) { 95 return table13_0_inner_[(i < 5 ? (i / 2 + 0) : ((i - 5) + 2))]; 96 } GetEmit13(size_t,size_t emit)97 static inline uint64_t GetEmit13(size_t, size_t emit) { 98 return table13_0_emit_[emit]; 99 } GetOp16(size_t i)100 static inline uint64_t GetOp16(size_t i) { 101 return table16_0_inner_[(i < 6 ? (i) : (((void)(i - 6), 6)))]; 102 } GetEmit16(size_t,size_t emit)103 static inline uint64_t GetEmit16(size_t, size_t emit) { 104 return table16_0_emit_[emit]; 105 } GetOp15(size_t i)106 static inline uint64_t GetOp15(size_t i) { 107 return table15_0_inner_[(i < 11 ? (i / 2 + 0) : ((i - 11) + 5))]; 108 } GetEmit15(size_t,size_t emit)109 static inline uint64_t GetEmit15(size_t, size_t emit) { 110 return table15_0_emit_[emit]; 111 } GetOp18(size_t i)112 static inline uint64_t GetOp18(size_t i) { 113 return table18_0_inner_[(i < 9 ? (i) : (((void)(i - 9), 9)))]; 114 } GetEmit18(size_t,size_t emit)115 static inline uint64_t GetEmit18(size_t, size_t emit) { 116 return table18_0_emit_[emit]; 117 } GetOp17(size_t i)118 static inline uint64_t GetOp17(size_t i) { return table17_0_ops_[i]; } GetEmit17(size_t,size_t emit)119 static inline uint64_t GetEmit17(size_t, size_t emit) { 120 return table17_0_emit_[emit]; 121 } GetOp20(size_t i)122 static inline uint64_t GetOp20(size_t i) { return table20_0_ops_[i]; } GetEmit20(size_t,size_t emit)123 static inline uint64_t GetEmit20(size_t, size_t emit) { 124 return table20_0_emit_[emit]; 125 } GetOp21(size_t i)126 static inline uint64_t GetOp21(size_t i) { return table21_0_ops_[i]; } GetEmit21(size_t,size_t emit)127 static inline uint64_t GetEmit21(size_t, size_t emit) { 128 return table21_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) { 139 return table24_ops_[i >> 6][i & 0x3f]; 140 } GetEmit24(size_t i,size_t emit)141 static inline uint64_t GetEmit24(size_t i, size_t emit) { 142 return table24_emit_[i >> 6][emit]; 143 } GetOp25(size_t i)144 static inline uint64_t GetOp25(size_t i) { 145 return table25_ops_[i >> 6][i & 0x3f]; 146 } GetEmit25(size_t i,size_t emit)147 static inline uint64_t GetEmit25(size_t i, size_t emit) { 148 return table25_emit_[i >> 6][emit]; 149 } GetOp26(size_t i)150 static inline uint64_t GetOp26(size_t i) { 151 return table26_ops_[i >> 7][i & 0x7f]; 152 } GetEmit26(size_t i,size_t emit)153 static inline uint64_t GetEmit26(size_t i, size_t emit) { 154 return table26_emit_[i >> 7][emit]; 155 } GetOp27(size_t i)156 static inline uint64_t GetOp27(size_t i) { 157 return table27_ops_[i >> 7][i & 0x7f]; 158 } GetEmit27(size_t i,size_t emit)159 static inline uint64_t GetEmit27(size_t i, size_t emit) { 160 return table27_emit_[i >> 7][emit]; 161 } GetOp19(size_t i)162 static inline uint64_t GetOp19(size_t i) { 163 return table19_ops_[i >> 7][i & 0x7f]; 164 } GetEmit19(size_t i,size_t emit)165 static inline uint64_t GetEmit19(size_t i, size_t emit) { 166 return table19_emit_[i >> 7][emit]; 167 } GetOp29(size_t i)168 static inline uint64_t GetOp29(size_t i) { return i; } GetEmit29(size_t,size_t emit)169 static inline uint64_t GetEmit29(size_t, size_t emit) { 170 return ((void)emit, 124); 171 } GetOp28(size_t i)172 static inline uint64_t GetOp28(size_t i) { 173 return ((i < 1 ? (((void)i, 0)) : ((i - 1))) < 1 174 ? (((void)(i < 1 ? (((void)i, 0)) : ((i - 1))), 1)) 175 : (((i < 1 ? (((void)i, 0)) : ((i - 1))) - 1) ? 10 : 6)); 176 } GetEmit28(size_t,size_t emit)177 static inline uint64_t GetEmit28(size_t, size_t emit) { 178 return (emit < 1 ? (((void)emit, 124)) : ((emit - 1) ? 62 : 35)); 179 } 180 181 private: 182 static const uint8_t table2_0_emit_[10]; 183 static const uint8_t table2_0_ops_[32]; 184 static const uint8_t table3_0_emit_[36]; 185 static const uint8_t table3_0_ops_[64]; 186 static const uint8_t table4_0_emit_[22]; 187 static const uint8_t table4_0_ops_[64]; 188 static const uint8_t table4_1_emit_[46]; 189 static const uint8_t table4_1_ops_[64]; 190 static const uint8_t* const table4_emit_[2]; 191 static const uint8_t* const table4_ops_[2]; 192 static const uint8_t table5_0_ops_[128]; 193 static const uint8_t table5_1_emit_[52]; 194 static const uint8_t table5_1_ops_[128]; 195 static const uint8_t* const table5_emit_[2]; 196 static const uint8_t* const table5_ops_[2]; 197 static const uint8_t table6_0_emit_[2]; 198 static const uint8_t table6_0_ops_[32]; 199 static const uint8_t table6_1_emit_[2]; 200 static const uint8_t table6_2_emit_[2]; 201 static const uint8_t table6_3_emit_[2]; 202 static const uint8_t table6_4_emit_[2]; 203 static const uint8_t table6_5_emit_[4]; 204 static const uint8_t table6_5_ops_[32]; 205 static const uint8_t table6_6_emit_[4]; 206 static const uint8_t table6_7_emit_[4]; 207 static const uint8_t table6_8_emit_[4]; 208 static const uint8_t table6_9_emit_[4]; 209 static const uint8_t table6_10_emit_[4]; 210 static const uint8_t table6_11_emit_[6]; 211 static const uint8_t table6_11_ops_[32]; 212 static const uint8_t table6_12_emit_[8]; 213 static const uint8_t table6_12_ops_[32]; 214 static const uint8_t table6_13_emit_[8]; 215 static const uint8_t table6_14_emit_[8]; 216 static const uint8_t table6_15_emit_[10]; 217 static const uint8_t table6_15_ops_[32]; 218 static const uint8_t* const table6_emit_[16]; 219 static const uint8_t* const table6_ops_[16]; 220 static const uint8_t table1_0_emit_[36]; 221 static const uint16_t table1_0_inner_[22]; 222 static const uint8_t table1_0_outer_[64]; 223 static const uint8_t table1_1_emit_[36]; 224 static const uint16_t table1_1_inner_[22]; 225 static const uint8_t table1_2_emit_[36]; 226 static const uint16_t table1_2_inner_[22]; 227 static const uint8_t table1_3_emit_[36]; 228 static const uint16_t table1_3_inner_[22]; 229 static const uint8_t table1_4_emit_[38]; 230 static const uint16_t table1_4_inner_[22]; 231 static const uint16_t table1_5_inner_[4]; 232 static const uint8_t table1_5_outer_[64]; 233 static const uint16_t table1_11_inner_[6]; 234 static const uint8_t table1_11_outer_[64]; 235 static const uint16_t table1_12_inner_[8]; 236 static const uint8_t table1_12_outer_[64]; 237 static const uint8_t table1_15_emit_[15]; 238 static const uint16_t table1_15_inner_[18]; 239 static const uint8_t table1_15_outer_[64]; 240 static const uint8_t* const table1_emit_[16]; 241 static const uint16_t* const table1_inner_[16]; 242 static const uint8_t* const table1_outer_[16]; 243 static const uint8_t table9_0_emit_[6]; 244 static const uint8_t table9_0_inner_[8]; 245 static const uint8_t table10_0_emit_[8]; 246 static const uint8_t table10_0_inner_[10]; 247 static const uint8_t table10_0_outer_[16]; 248 static const uint8_t table11_0_emit_[11]; 249 static const uint8_t table11_0_ops_[32]; 250 static const uint8_t table12_0_ops_[64]; 251 static const uint8_t table8_0_emit_[2]; 252 static const uint16_t table8_0_ops_[32]; 253 static const uint8_t table8_1_emit_[2]; 254 static const uint8_t table8_2_emit_[2]; 255 static const uint8_t table8_3_emit_[5]; 256 static const uint16_t table8_3_ops_[32]; 257 static const uint8_t* const table8_emit_[4]; 258 static const uint16_t* const table8_ops_[4]; 259 static const uint8_t table13_0_emit_[5]; 260 static const uint8_t table13_0_inner_[5]; 261 static const uint8_t table16_0_emit_[6]; 262 static const uint8_t table16_0_inner_[7]; 263 static const uint8_t table15_0_emit_[10]; 264 static const uint8_t table15_0_inner_[10]; 265 static const uint8_t table18_0_emit_[9]; 266 static const uint8_t table18_0_inner_[10]; 267 static const uint8_t table17_0_emit_[23]; 268 static const uint8_t table17_0_ops_[32]; 269 static const uint8_t table20_0_emit_[12]; 270 static const uint8_t table20_0_ops_[32]; 271 static const uint8_t table21_0_emit_[41]; 272 static const uint8_t table21_0_ops_[64]; 273 static const uint8_t table22_0_emit_[53]; 274 static const uint8_t table22_0_ops_[128]; 275 static const uint8_t table23_0_emit_[57]; 276 static const uint8_t table23_0_ops_[256]; 277 static const uint8_t table24_0_emit_[4]; 278 static const uint8_t table24_0_ops_[64]; 279 static const uint8_t table24_1_emit_[4]; 280 static const uint8_t table24_2_emit_[4]; 281 static const uint8_t table24_3_emit_[8]; 282 static const uint8_t table24_3_ops_[64]; 283 static const uint8_t table24_4_emit_[8]; 284 static const uint8_t table24_5_emit_[8]; 285 static const uint8_t table24_6_emit_[11]; 286 static const uint8_t table24_6_ops_[64]; 287 static const uint8_t table24_7_emit_[25]; 288 static const uint8_t table24_7_ops_[64]; 289 static const uint8_t* const table24_emit_[8]; 290 static const uint8_t* const table24_ops_[8]; 291 static const uint8_t table25_0_emit_[40]; 292 static const uint8_t table25_0_ops_[64]; 293 static const uint8_t table25_1_emit_[40]; 294 static const uint8_t table25_2_emit_[40]; 295 static const uint8_t table25_3_emit_[40]; 296 static const uint8_t table25_4_emit_[40]; 297 static const uint8_t table25_5_emit_[40]; 298 static const uint8_t table25_6_emit_[4]; 299 static const uint8_t table25_6_ops_[64]; 300 static const uint8_t table25_7_emit_[4]; 301 static const uint8_t table25_8_emit_[4]; 302 static const uint8_t table25_9_emit_[4]; 303 static const uint8_t table25_10_emit_[4]; 304 static const uint8_t table25_11_emit_[4]; 305 static const uint8_t table25_12_emit_[4]; 306 static const uint8_t table25_13_emit_[7]; 307 static const uint8_t table25_13_ops_[64]; 308 static const uint8_t table25_14_emit_[10]; 309 static const uint8_t table25_14_ops_[64]; 310 static const uint8_t table25_15_emit_[34]; 311 static const uint8_t table25_15_ops_[64]; 312 static const uint8_t* const table25_emit_[16]; 313 static const uint8_t* const table25_ops_[16]; 314 static const uint8_t table26_0_emit_[144]; 315 static const uint16_t table26_0_ops_[128]; 316 static const uint8_t table26_1_emit_[144]; 317 static const uint8_t table26_2_emit_[144]; 318 static const uint8_t table26_3_emit_[144]; 319 static const uint8_t table26_4_emit_[144]; 320 static const uint8_t table26_5_emit_[144]; 321 static const uint8_t table26_6_emit_[80]; 322 static const uint16_t table26_6_ops_[128]; 323 static const uint8_t table26_7_emit_[80]; 324 static const uint8_t table26_8_emit_[80]; 325 static const uint8_t table26_9_emit_[80]; 326 static const uint8_t table26_10_emit_[80]; 327 static const uint8_t table26_11_emit_[80]; 328 static const uint8_t table26_12_emit_[80]; 329 static const uint8_t table26_13_emit_[26]; 330 static const uint16_t table26_13_ops_[128]; 331 static const uint16_t table26_14_ops_[128]; 332 static const uint8_t table26_15_emit_[63]; 333 static const uint16_t table26_15_ops_[128]; 334 static const uint8_t* const table26_emit_[16]; 335 static const uint16_t* const table26_ops_[16]; 336 static const uint8_t table27_0_emit_[136]; 337 static const uint16_t table27_0_ops_[128]; 338 static const uint8_t table27_1_emit_[136]; 339 static const uint8_t table27_2_emit_[136]; 340 static const uint8_t table27_3_emit_[136]; 341 static const uint8_t table27_4_emit_[136]; 342 static const uint8_t table27_5_emit_[136]; 343 static const uint8_t table27_6_emit_[136]; 344 static const uint8_t table27_7_emit_[136]; 345 static const uint8_t table27_8_emit_[136]; 346 static const uint8_t table27_9_emit_[136]; 347 static const uint8_t table27_10_emit_[136]; 348 static const uint8_t table27_11_emit_[136]; 349 static const uint8_t table27_12_emit_[144]; 350 static const uint8_t table27_13_emit_[144]; 351 static const uint8_t table27_14_emit_[144]; 352 static const uint8_t table27_15_emit_[144]; 353 static const uint8_t table27_16_emit_[144]; 354 static const uint8_t table27_17_emit_[144]; 355 static const uint8_t table27_18_emit_[144]; 356 static const uint8_t table27_19_emit_[144]; 357 static const uint8_t table27_20_emit_[144]; 358 static const uint8_t table27_21_emit_[144]; 359 static const uint8_t table27_22_emit_[144]; 360 static const uint8_t table27_23_emit_[144]; 361 static const uint8_t table27_24_emit_[144]; 362 static const uint8_t table27_25_emit_[144]; 363 static const uint8_t table27_26_emit_[112]; 364 static const uint16_t table27_26_ops_[128]; 365 static const uint8_t table27_27_emit_[80]; 366 static const uint8_t table27_28_emit_[80]; 367 static const uint8_t table27_29_emit_[44]; 368 static const uint16_t table27_29_ops_[128]; 369 static const uint8_t table27_30_emit_[17]; 370 static const uint16_t table27_30_ops_[128]; 371 static const uint8_t table27_31_emit_[46]; 372 static const uint16_t table27_31_ops_[128]; 373 static const uint8_t* const table27_emit_[32]; 374 static const uint16_t* const table27_ops_[32]; 375 static const uint8_t table19_0_emit_[1]; 376 static const uint16_t table19_0_ops_[128]; 377 static const uint8_t table19_2_emit_[1]; 378 static const uint8_t table19_4_emit_[1]; 379 static const uint8_t table19_6_emit_[1]; 380 static const uint8_t table19_8_emit_[1]; 381 static const uint8_t table19_10_emit_[1]; 382 static const uint8_t table19_12_emit_[1]; 383 static const uint8_t table19_14_emit_[1]; 384 static const uint8_t table19_16_emit_[1]; 385 static const uint8_t table19_18_emit_[1]; 386 static const uint8_t table19_20_emit_[1]; 387 static const uint8_t table19_22_emit_[1]; 388 static const uint8_t table19_24_emit_[1]; 389 static const uint16_t table19_24_ops_[128]; 390 static const uint8_t table19_25_emit_[1]; 391 static const uint8_t table19_26_emit_[1]; 392 static const uint8_t table19_27_emit_[1]; 393 static const uint8_t table19_28_emit_[1]; 394 static const uint8_t table19_29_emit_[1]; 395 static const uint8_t table19_30_emit_[1]; 396 static const uint8_t table19_31_emit_[1]; 397 static const uint8_t table19_32_emit_[1]; 398 static const uint8_t table19_33_emit_[1]; 399 static const uint8_t table19_34_emit_[1]; 400 static const uint8_t table19_35_emit_[1]; 401 static const uint8_t table19_36_emit_[1]; 402 static const uint8_t table19_37_emit_[1]; 403 static const uint8_t table19_38_emit_[1]; 404 static const uint8_t table19_39_emit_[1]; 405 static const uint8_t table19_40_emit_[1]; 406 static const uint8_t table19_41_emit_[1]; 407 static const uint8_t table19_42_emit_[1]; 408 static const uint8_t table19_43_emit_[1]; 409 static const uint8_t table19_44_emit_[1]; 410 static const uint8_t table19_45_emit_[1]; 411 static const uint8_t table19_46_emit_[1]; 412 static const uint8_t table19_47_emit_[1]; 413 static const uint8_t table19_48_emit_[1]; 414 static const uint8_t table19_49_emit_[1]; 415 static const uint8_t table19_50_emit_[1]; 416 static const uint8_t table19_51_emit_[1]; 417 static const uint8_t table19_52_emit_[1]; 418 static const uint8_t table19_53_emit_[2]; 419 static const uint16_t table19_53_ops_[128]; 420 static const uint8_t table19_54_emit_[2]; 421 static const uint8_t table19_55_emit_[2]; 422 static const uint8_t table19_56_emit_[2]; 423 static const uint8_t table19_57_emit_[2]; 424 static const uint8_t table19_58_emit_[2]; 425 static const uint8_t table19_59_emit_[4]; 426 static const uint16_t table19_59_ops_[128]; 427 static const uint8_t table19_60_emit_[8]; 428 static const uint16_t table19_60_ops_[128]; 429 static const uint8_t table19_61_emit_[9]; 430 static const uint16_t table19_61_ops_[128]; 431 static const uint8_t table19_62_emit_[16]; 432 static const uint16_t table19_62_ops_[128]; 433 static const uint8_t table19_63_emit_[33]; 434 static const uint16_t table19_63_ops_[128]; 435 static const uint8_t* const table19_emit_[64]; 436 static const uint16_t* const table19_ops_[64]; 437 }; 438 template <typename F> 439 class HuffDecoder : public HuffDecoderCommon { 440 public: HuffDecoder(F sink,const uint8_t * begin,const uint8_t * end)441 HuffDecoder(F sink, const uint8_t* begin, const uint8_t* end) 442 : sink_(sink), begin_(begin), end_(end) {} Run()443 bool Run() { 444 while (!done_) { 445 if (!RefillTo10()) { 446 Done0(); 447 break; 448 } 449 const auto index = (buffer_ >> (buffer_len_ - 10)) & 0x3ff; 450 const auto op = GetOp1(index); 451 const int consumed = op & 15; 452 buffer_len_ -= consumed; 453 const auto emit_ofs = op >> 7; 454 switch ((op >> 4) & 7) { 455 case 0: { 456 sink_(GetEmit1(index, emit_ofs + 0)); 457 sink_(GetEmit1(index, emit_ofs + 1)); 458 break; 459 } 460 case 1: { 461 sink_(GetEmit1(index, emit_ofs + 0)); 462 break; 463 } 464 case 2: { 465 DecodeStep0(); 466 break; 467 } 468 case 3: { 469 DecodeStep6(); 470 break; 471 } 472 case 4: { 473 DecodeStep1(); 474 break; 475 } 476 } 477 } 478 return ok_; 479 } 480 481 private: RefillTo10()482 bool RefillTo10() { 483 switch (buffer_len_) { 484 case 0: { 485 return Read2to8Bytes(); 486 } 487 case 1: { 488 return Read2to7Bytes(); 489 } 490 case 2: 491 case 3: 492 case 4: 493 case 5: 494 case 6: 495 case 7: 496 case 8: { 497 return Read1to7Bytes(); 498 } 499 case 9: { 500 return Read1to6Bytes(); 501 } 502 } 503 return true; 504 } Read2to8Bytes()505 bool Read2to8Bytes() { 506 switch (end_ - begin_) { 507 case 0: 508 case 1: { 509 return false; 510 } 511 case 2: { 512 Fill2(); 513 return true; 514 } 515 case 3: { 516 Fill3(); 517 return true; 518 } 519 case 4: { 520 Fill4(); 521 return true; 522 } 523 case 5: { 524 Fill5(); 525 return true; 526 } 527 case 6: { 528 Fill6(); 529 return true; 530 } 531 case 7: { 532 Fill7(); 533 return true; 534 } 535 default: { 536 Fill8(); 537 return true; 538 } 539 } 540 } Fill2()541 void Fill2() { 542 buffer_ = (buffer_ << 16) | (static_cast<uint64_t>(begin_[0]) << 8) | 543 (static_cast<uint64_t>(begin_[1]) << 0); 544 begin_ += 2; 545 buffer_len_ += 16; 546 } Fill3()547 void Fill3() { 548 buffer_ = (buffer_ << 24) | (static_cast<uint64_t>(begin_[0]) << 16) | 549 (static_cast<uint64_t>(begin_[1]) << 8) | 550 (static_cast<uint64_t>(begin_[2]) << 0); 551 begin_ += 3; 552 buffer_len_ += 24; 553 } Fill4()554 void Fill4() { 555 buffer_ = (buffer_ << 32) | (static_cast<uint64_t>(begin_[0]) << 24) | 556 (static_cast<uint64_t>(begin_[1]) << 16) | 557 (static_cast<uint64_t>(begin_[2]) << 8) | 558 (static_cast<uint64_t>(begin_[3]) << 0); 559 begin_ += 4; 560 buffer_len_ += 32; 561 } Fill5()562 void Fill5() { 563 buffer_ = (buffer_ << 40) | (static_cast<uint64_t>(begin_[0]) << 32) | 564 (static_cast<uint64_t>(begin_[1]) << 24) | 565 (static_cast<uint64_t>(begin_[2]) << 16) | 566 (static_cast<uint64_t>(begin_[3]) << 8) | 567 (static_cast<uint64_t>(begin_[4]) << 0); 568 begin_ += 5; 569 buffer_len_ += 40; 570 } Fill6()571 void Fill6() { 572 buffer_ = (buffer_ << 48) | (static_cast<uint64_t>(begin_[0]) << 40) | 573 (static_cast<uint64_t>(begin_[1]) << 32) | 574 (static_cast<uint64_t>(begin_[2]) << 24) | 575 (static_cast<uint64_t>(begin_[3]) << 16) | 576 (static_cast<uint64_t>(begin_[4]) << 8) | 577 (static_cast<uint64_t>(begin_[5]) << 0); 578 begin_ += 6; 579 buffer_len_ += 48; 580 } Fill7()581 void Fill7() { 582 buffer_ = (buffer_ << 56) | (static_cast<uint64_t>(begin_[0]) << 48) | 583 (static_cast<uint64_t>(begin_[1]) << 40) | 584 (static_cast<uint64_t>(begin_[2]) << 32) | 585 (static_cast<uint64_t>(begin_[3]) << 24) | 586 (static_cast<uint64_t>(begin_[4]) << 16) | 587 (static_cast<uint64_t>(begin_[5]) << 8) | 588 (static_cast<uint64_t>(begin_[6]) << 0); 589 begin_ += 7; 590 buffer_len_ += 56; 591 } Fill8()592 void Fill8() { 593 buffer_ = 0 | (static_cast<uint64_t>(begin_[0]) << 56) | 594 (static_cast<uint64_t>(begin_[1]) << 48) | 595 (static_cast<uint64_t>(begin_[2]) << 40) | 596 (static_cast<uint64_t>(begin_[3]) << 32) | 597 (static_cast<uint64_t>(begin_[4]) << 24) | 598 (static_cast<uint64_t>(begin_[5]) << 16) | 599 (static_cast<uint64_t>(begin_[6]) << 8) | 600 (static_cast<uint64_t>(begin_[7]) << 0); 601 begin_ += 8; 602 buffer_len_ += 64; 603 } Read2to7Bytes()604 bool Read2to7Bytes() { 605 switch (end_ - begin_) { 606 case 0: 607 case 1: { 608 return false; 609 } 610 case 2: { 611 Fill2(); 612 return true; 613 } 614 case 3: { 615 Fill3(); 616 return true; 617 } 618 case 4: { 619 Fill4(); 620 return true; 621 } 622 case 5: { 623 Fill5(); 624 return true; 625 } 626 case 6: { 627 Fill6(); 628 return true; 629 } 630 default: { 631 Fill7(); 632 return true; 633 } 634 } 635 } Read1to7Bytes()636 bool Read1to7Bytes() { 637 switch (end_ - begin_) { 638 case 0: { 639 return false; 640 } 641 case 1: { 642 Fill1(); 643 return true; 644 } 645 case 2: { 646 Fill2(); 647 return true; 648 } 649 case 3: { 650 Fill3(); 651 return true; 652 } 653 case 4: { 654 Fill4(); 655 return true; 656 } 657 case 5: { 658 Fill5(); 659 return true; 660 } 661 case 6: { 662 Fill6(); 663 return true; 664 } 665 default: { 666 Fill7(); 667 return true; 668 } 669 } 670 } Fill1()671 void Fill1() { 672 buffer_ = (buffer_ << 8) | (static_cast<uint64_t>(begin_[0]) << 0); 673 begin_ += 1; 674 buffer_len_ += 8; 675 } Read1to6Bytes()676 bool Read1to6Bytes() { 677 switch (end_ - begin_) { 678 case 0: { 679 return false; 680 } 681 case 1: { 682 Fill1(); 683 return true; 684 } 685 case 2: { 686 Fill2(); 687 return true; 688 } 689 case 3: { 690 Fill3(); 691 return true; 692 } 693 case 4: { 694 Fill4(); 695 return true; 696 } 697 case 5: { 698 Fill5(); 699 return true; 700 } 701 default: { 702 Fill6(); 703 return true; 704 } 705 } 706 } Done0()707 void Done0() { 708 done_ = true; 709 switch (end_ - begin_) { 710 case 1: { 711 Fill1(); 712 break; 713 } 714 } 715 switch (buffer_len_) { 716 case 1: 717 case 2: 718 case 3: 719 case 4: { 720 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 721 return; 722 } 723 case 5: { 724 const auto index = buffer_ & 31; 725 const auto op = GetOp2(index); 726 switch (op & 3) { 727 case 0: { 728 sink_(GetEmit2(index, (op >> 2) + 0)); 729 break; 730 } 731 case 1: { 732 ok_ = false; 733 break; 734 } 735 } 736 return; 737 } 738 case 6: { 739 const auto index = buffer_ & 63; 740 const auto op = GetOp3(index); 741 switch (op & 3) { 742 case 0: { 743 ok_ = false; 744 break; 745 } 746 case 1: { 747 sink_(GetEmit3(index, (op >> 2) + 0)); 748 break; 749 } 750 } 751 return; 752 } 753 case 7: { 754 const auto index = buffer_ & 127; 755 const auto op = GetOp4(index); 756 switch (op & 3) { 757 case 0: { 758 ok_ = false; 759 break; 760 } 761 case 1: { 762 sink_(GetEmit4(index, (op >> 2) + 0)); 763 break; 764 } 765 } 766 return; 767 } 768 case 8: { 769 const auto index = buffer_ & 255; 770 const auto op = GetOp5(index); 771 switch (op & 3) { 772 case 0: { 773 ok_ = false; 774 break; 775 } 776 case 1: { 777 sink_(GetEmit5(index, (op >> 2) + 0)); 778 break; 779 } 780 } 781 return; 782 } 783 case 9: { 784 const auto index = buffer_ & 511; 785 const auto op = GetOp6(index); 786 switch (op & 3) { 787 case 0: { 788 ok_ = false; 789 break; 790 } 791 case 1: { 792 sink_(GetEmit6(index, (op >> 2) + 0)); 793 break; 794 } 795 } 796 return; 797 } 798 case 0: { 799 return; 800 } 801 } 802 } DecodeStep0()803 void DecodeStep0() { 804 if (!RefillTo1()) { 805 Done1(); 806 return; 807 } 808 const auto index = (buffer_ >> (buffer_len_ - 1)) & 0x1; 809 const auto op = GetOp7(index); 810 const int consumed = op & 1; 811 buffer_len_ -= consumed; 812 const auto emit_ofs = op >> 1; 813 sink_(GetEmit7(index, emit_ofs + 0)); 814 } RefillTo1()815 bool RefillTo1() { 816 switch (buffer_len_) { 817 case 0: { 818 return Read1to8Bytes(); 819 } 820 } 821 return true; 822 } Read1to8Bytes()823 bool Read1to8Bytes() { 824 switch (end_ - begin_) { 825 case 0: { 826 return false; 827 } 828 case 1: { 829 Fill1(); 830 return true; 831 } 832 case 2: { 833 Fill2(); 834 return true; 835 } 836 case 3: { 837 Fill3(); 838 return true; 839 } 840 case 4: { 841 Fill4(); 842 return true; 843 } 844 case 5: { 845 Fill5(); 846 return true; 847 } 848 case 6: { 849 Fill6(); 850 return true; 851 } 852 case 7: { 853 Fill7(); 854 return true; 855 } 856 default: { 857 Fill8(); 858 return true; 859 } 860 } 861 } Done1()862 void Done1() { 863 done_ = true; 864 ok_ = false; 865 } DecodeStep1()866 void DecodeStep1() { 867 if (!RefillTo7()) { 868 Done2(); 869 return; 870 } 871 const auto index = (buffer_ >> (buffer_len_ - 7)) & 0x7f; 872 const auto op = GetOp8(index); 873 const int consumed = op & 7; 874 buffer_len_ -= consumed; 875 const auto emit_ofs = op >> 6; 876 switch ((op >> 3) & 7) { 877 case 0: { 878 sink_(GetEmit8(index, emit_ofs + 0)); 879 break; 880 } 881 case 1: { 882 DecodeStep2(); 883 break; 884 } 885 case 2: { 886 DecodeStep3(); 887 break; 888 } 889 case 3: { 890 DecodeStep4(); 891 break; 892 } 893 case 4: { 894 DecodeStep5(); 895 break; 896 } 897 } 898 } RefillTo7()899 bool RefillTo7() { 900 switch (buffer_len_) { 901 case 0: { 902 return Read1to8Bytes(); 903 } 904 case 1: 905 case 2: 906 case 3: 907 case 4: 908 case 5: 909 case 6: { 910 return Read1to7Bytes(); 911 } 912 } 913 return true; 914 } Done2()915 void Done2() { 916 done_ = true; 917 switch (buffer_len_) { 918 case 1: 919 case 2: { 920 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 921 return; 922 } 923 case 3: { 924 const auto index = buffer_ & 7; 925 const auto op = GetOp9(index); 926 switch (op & 3) { 927 case 0: { 928 sink_(GetEmit9(index, (op >> 2) + 0)); 929 break; 930 } 931 case 1: { 932 ok_ = false; 933 break; 934 } 935 } 936 return; 937 } 938 case 4: { 939 const auto index = buffer_ & 15; 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 5: { 954 const auto index = buffer_ & 31; 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 6: { 969 const auto index = buffer_ & 63; 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 0: { 984 return; 985 } 986 } 987 } DecodeStep2()988 void DecodeStep2() { 989 if (!RefillTo3()) { 990 Done3(); 991 return; 992 } 993 const auto index = (buffer_ >> (buffer_len_ - 3)) & 0x7; 994 const auto op = GetOp13(index); 995 const int consumed = op & 3; 996 buffer_len_ -= consumed; 997 const auto emit_ofs = op >> 2; 998 sink_(GetEmit13(index, emit_ofs + 0)); 999 } RefillTo3()1000 bool RefillTo3() { 1001 switch (buffer_len_) { 1002 case 0: { 1003 return Read1to8Bytes(); 1004 } 1005 case 1: 1006 case 2: { 1007 return Read1to7Bytes(); 1008 } 1009 } 1010 return true; 1011 } Done3()1012 void Done3() { 1013 done_ = true; 1014 switch (buffer_len_) { 1015 case 1: 1016 case 0: { 1017 ok_ = false; 1018 return; 1019 } 1020 case 2: { 1021 const auto index = buffer_ & 3; 1022 const auto op = GetOp14(index); 1023 switch (op & 1) { 1024 case 0: { 1025 sink_(GetEmit14(index, (op >> 1) + 0)); 1026 break; 1027 } 1028 case 1: { 1029 ok_ = false; 1030 break; 1031 } 1032 } 1033 return; 1034 } 1035 } 1036 } DecodeStep3()1037 void DecodeStep3() { 1038 if (!RefillTo4()) { 1039 Done4(); 1040 return; 1041 } 1042 const auto index = (buffer_ >> (buffer_len_ - 4)) & 0xf; 1043 const auto op = GetOp15(index); 1044 const int consumed = op & 7; 1045 buffer_len_ -= consumed; 1046 const auto emit_ofs = op >> 3; 1047 sink_(GetEmit15(index, emit_ofs + 0)); 1048 } RefillTo4()1049 bool RefillTo4() { 1050 switch (buffer_len_) { 1051 case 0: { 1052 return Read1to8Bytes(); 1053 } 1054 case 1: 1055 case 2: 1056 case 3: { 1057 return Read1to7Bytes(); 1058 } 1059 } 1060 return true; 1061 } Done4()1062 void Done4() { 1063 done_ = true; 1064 switch (buffer_len_) { 1065 case 1: 1066 case 2: 1067 case 0: { 1068 ok_ = false; 1069 return; 1070 } 1071 case 3: { 1072 const auto index = buffer_ & 7; 1073 const auto op = GetOp16(index); 1074 switch (op & 1) { 1075 case 0: { 1076 sink_(GetEmit16(index, (op >> 1) + 0)); 1077 break; 1078 } 1079 case 1: { 1080 ok_ = false; 1081 break; 1082 } 1083 } 1084 return; 1085 } 1086 } 1087 } DecodeStep4()1088 void DecodeStep4() { 1089 if (!RefillTo5()) { 1090 Done5(); 1091 return; 1092 } 1093 const auto index = (buffer_ >> (buffer_len_ - 5)) & 0x1f; 1094 const auto op = GetOp17(index); 1095 const int consumed = op & 7; 1096 buffer_len_ -= consumed; 1097 const auto emit_ofs = op >> 3; 1098 sink_(GetEmit17(index, emit_ofs + 0)); 1099 } RefillTo5()1100 bool RefillTo5() { 1101 switch (buffer_len_) { 1102 case 0: { 1103 return Read1to8Bytes(); 1104 } 1105 case 1: 1106 case 2: 1107 case 3: 1108 case 4: { 1109 return Read1to7Bytes(); 1110 } 1111 } 1112 return true; 1113 } Done5()1114 void Done5() { 1115 done_ = true; 1116 switch (buffer_len_) { 1117 case 1: 1118 case 2: 1119 case 3: 1120 case 0: { 1121 ok_ = false; 1122 return; 1123 } 1124 case 4: { 1125 const auto index = buffer_ & 15; 1126 const auto op = GetOp18(index); 1127 switch (op & 1) { 1128 case 0: { 1129 sink_(GetEmit18(index, (op >> 1) + 0)); 1130 break; 1131 } 1132 case 1: { 1133 ok_ = false; 1134 break; 1135 } 1136 } 1137 return; 1138 } 1139 } 1140 } DecodeStep5()1141 void DecodeStep5() { 1142 if (!RefillTo13()) { 1143 Done6(); 1144 return; 1145 } 1146 const auto index = (buffer_ >> (buffer_len_ - 13)) & 0x1fff; 1147 const auto op = GetOp19(index); 1148 const int consumed = op & 15; 1149 buffer_len_ -= consumed; 1150 const auto emit_ofs = op >> 5; 1151 switch ((op >> 4) & 1) { 1152 case 0: { 1153 sink_(GetEmit19(index, emit_ofs + 0)); 1154 break; 1155 } 1156 case 1: { 1157 begin_ = end_; 1158 buffer_len_ = 0; 1159 break; 1160 } 1161 } 1162 } RefillTo13()1163 bool RefillTo13() { 1164 switch (buffer_len_) { 1165 case 0: { 1166 return Read2to8Bytes(); 1167 } 1168 case 1: 1169 case 2: 1170 case 3: 1171 case 4: { 1172 return Read2to7Bytes(); 1173 } 1174 case 5: 1175 case 6: 1176 case 7: 1177 case 8: { 1178 return Read1to7Bytes(); 1179 } 1180 case 9: 1181 case 10: 1182 case 11: 1183 case 12: { 1184 return Read1to6Bytes(); 1185 } 1186 } 1187 return true; 1188 } Done6()1189 void Done6() { 1190 done_ = true; 1191 switch (end_ - begin_) { 1192 case 1: { 1193 Fill1(); 1194 break; 1195 } 1196 } 1197 switch (buffer_len_) { 1198 case 1: 1199 case 2: 1200 case 3: 1201 case 4: { 1202 ok_ = (buffer_ & ((1 << buffer_len_) - 1)) == (1 << buffer_len_) - 1; 1203 return; 1204 } 1205 case 5: { 1206 const auto index = buffer_ & 31; 1207 const auto op = GetOp20(index); 1208 switch (op & 3) { 1209 case 0: { 1210 sink_(GetEmit20(index, (op >> 2) + 0)); 1211 break; 1212 } 1213 case 1: { 1214 ok_ = false; 1215 break; 1216 } 1217 } 1218 return; 1219 } 1220 case 6: { 1221 const auto index = buffer_ & 63; 1222 const auto op = GetOp21(index); 1223 switch (op & 3) { 1224 case 0: { 1225 ok_ = false; 1226 break; 1227 } 1228 case 1: { 1229 sink_(GetEmit21(index, (op >> 2) + 0)); 1230 break; 1231 } 1232 } 1233 return; 1234 } 1235 case 7: { 1236 const auto index = buffer_ & 127; 1237 const auto op = GetOp22(index); 1238 switch (op & 3) { 1239 case 0: { 1240 ok_ = false; 1241 break; 1242 } 1243 case 1: { 1244 sink_(GetEmit22(index, (op >> 2) + 0)); 1245 break; 1246 } 1247 } 1248 return; 1249 } 1250 case 8: { 1251 const auto index = buffer_ & 255; 1252 const auto op = GetOp23(index); 1253 switch (op & 3) { 1254 case 0: { 1255 ok_ = false; 1256 break; 1257 } 1258 case 1: { 1259 sink_(GetEmit23(index, (op >> 2) + 0)); 1260 break; 1261 } 1262 } 1263 return; 1264 } 1265 case 9: { 1266 const auto index = buffer_ & 511; 1267 const auto op = GetOp24(index); 1268 switch (op & 3) { 1269 case 0: { 1270 ok_ = false; 1271 break; 1272 } 1273 case 1: { 1274 sink_(GetEmit24(index, (op >> 2) + 0)); 1275 break; 1276 } 1277 } 1278 return; 1279 } 1280 case 10: { 1281 const auto index = buffer_ & 1023; 1282 const auto op = GetOp25(index); 1283 switch (op & 3) { 1284 case 0: { 1285 sink_(GetEmit25(index, (op >> 2) + 0)); 1286 sink_(GetEmit25(index, (op >> 2) + 1)); 1287 break; 1288 } 1289 case 1: { 1290 ok_ = false; 1291 break; 1292 } 1293 case 2: { 1294 sink_(GetEmit25(index, (op >> 2) + 0)); 1295 break; 1296 } 1297 } 1298 return; 1299 } 1300 case 11: { 1301 const auto index = buffer_ & 2047; 1302 const auto op = GetOp26(index); 1303 switch (op & 3) { 1304 case 0: { 1305 ok_ = false; 1306 break; 1307 } 1308 case 1: { 1309 sink_(GetEmit26(index, (op >> 2) + 0)); 1310 sink_(GetEmit26(index, (op >> 2) + 1)); 1311 break; 1312 } 1313 case 2: { 1314 sink_(GetEmit26(index, (op >> 2) + 0)); 1315 break; 1316 } 1317 } 1318 return; 1319 } 1320 case 12: { 1321 const auto index = buffer_ & 4095; 1322 const auto op = GetOp27(index); 1323 switch (op & 3) { 1324 case 0: { 1325 ok_ = false; 1326 break; 1327 } 1328 case 1: { 1329 sink_(GetEmit27(index, (op >> 2) + 0)); 1330 sink_(GetEmit27(index, (op >> 2) + 1)); 1331 break; 1332 } 1333 case 2: { 1334 sink_(GetEmit27(index, (op >> 2) + 0)); 1335 break; 1336 } 1337 } 1338 return; 1339 } 1340 case 0: { 1341 return; 1342 } 1343 } 1344 } DecodeStep6()1345 void DecodeStep6() { 1346 if (!RefillTo2()) { 1347 Done7(); 1348 return; 1349 } 1350 const auto index = (buffer_ >> (buffer_len_ - 2)) & 0x3; 1351 const auto op = GetOp28(index); 1352 const int consumed = op & 3; 1353 buffer_len_ -= consumed; 1354 const auto emit_ofs = op >> 2; 1355 sink_(GetEmit28(index, emit_ofs + 0)); 1356 } RefillTo2()1357 bool RefillTo2() { 1358 switch (buffer_len_) { 1359 case 0: { 1360 return Read1to8Bytes(); 1361 } 1362 case 1: { 1363 return Read1to7Bytes(); 1364 } 1365 } 1366 return true; 1367 } Done7()1368 void Done7() { 1369 done_ = true; 1370 switch (buffer_len_) { 1371 case 1: { 1372 const auto index = buffer_ & 1; 1373 const auto op = GetOp29(index); 1374 switch (op & 1) { 1375 case 0: { 1376 sink_(GetEmit29(index, (op >> 1) + 0)); 1377 break; 1378 } 1379 case 1: { 1380 ok_ = false; 1381 break; 1382 } 1383 } 1384 return; 1385 } 1386 case 0: { 1387 ok_ = false; 1388 return; 1389 } 1390 } 1391 } 1392 F sink_; 1393 const uint8_t* begin_; 1394 const uint8_t* const end_; 1395 uint64_t buffer_ = 0; 1396 int buffer_len_ = 0; 1397 bool ok_ = true; 1398 bool done_ = false; 1399 }; 1400 } // namespace geometry_10_7_13 1401 } // namespace grpc_core 1402 #endif // GRPC_TEST_CPP_MICROBENCHMARKS_HUFFMAN_GEOMETRIES_DECODE_HUFF_10_7_13_H 1403