| 350 | |
| 351 | template <template <typename> class BitOp> |
| 352 | void UnalignedBitmapOp(const uint8_t* left, int64_t left_offset, const uint8_t* right, |
| 353 | int64_t right_offset, uint8_t* out, int64_t out_offset, |
| 354 | int64_t length) { |
| 355 | BitOp<uint64_t> op_word; |
| 356 | BitOp<uint8_t> op_byte; |
| 357 | |
| 358 | auto left_reader = internal::BitmapWordReader<uint64_t>(left, left_offset, length); |
| 359 | auto right_reader = internal::BitmapWordReader<uint64_t>(right, right_offset, length); |
| 360 | auto writer = internal::BitmapWordWriter<uint64_t>(out, out_offset, length); |
| 361 | |
| 362 | auto nwords = left_reader.words(); |
| 363 | while (nwords--) { |
| 364 | writer.PutNextWord(op_word(left_reader.NextWord(), right_reader.NextWord())); |
| 365 | } |
| 366 | auto nbytes = left_reader.trailing_bytes(); |
| 367 | while (nbytes--) { |
| 368 | int left_valid_bits, right_valid_bits; |
| 369 | uint8_t left_byte = left_reader.NextTrailingByte(left_valid_bits); |
| 370 | uint8_t right_byte = right_reader.NextTrailingByte(right_valid_bits); |
| 371 | DCHECK_EQ(left_valid_bits, right_valid_bits); |
| 372 | writer.PutNextTrailingByte(op_byte(left_byte, right_byte), left_valid_bits); |
| 373 | } |
| 374 | } |
| 375 | |
| 376 | // XXX: The bits before left/right/out_offset, if unaligned, are untouched. But not for |
| 377 | // the bits after length. Caller should ensure proper alignment for the tail bits if |
nothing calls this directly
no test coverage detected