| 343 | } |
| 344 | |
| 345 | void CopySubset(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices) override { |
| 346 | auto other_bin = dynamic_cast<const Dense4bitsBin*>(full_bin); |
| 347 | const data_size_t rest = num_used_indices & 1; |
| 348 | for (int i = 0; i < num_used_indices - rest; i += 2) { |
| 349 | data_size_t idx = used_indices[i]; |
| 350 | const auto bin1 = static_cast<uint8_t>((other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf); |
| 351 | idx = used_indices[i + 1]; |
| 352 | const auto bin2 = static_cast<uint8_t>((other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf); |
| 353 | const int i1 = i >> 1; |
| 354 | data_[i1] = (bin1 | (bin2 << 4)); |
| 355 | } |
| 356 | if (rest) { |
| 357 | data_size_t idx = used_indices[num_used_indices - 1]; |
| 358 | data_[num_used_indices >> 1] = (other_bin->data_[idx >> 1] >> ((idx & 1) << 2)) & 0xf; |
| 359 | } |
| 360 | } |
| 361 | |
| 362 | void SaveBinaryToFile(const VirtualFileWriter* writer) const override { |
| 363 | writer->Write(data_.data(), sizeof(uint8_t) * data_.size()); |
nothing calls this directly
no outgoing calls
no test coverage detected