| 380 | |
| 381 | template <template <typename> class BitOp> |
| 382 | void UnalignedBitmapOp(const uint8_t* left, int64_t left_offset, const uint8_t* right, |
| 383 | int64_t right_offset, uint8_t* out, int64_t out_offset, |
| 384 | int64_t length) { |
| 385 | BitOp<uint64_t> op_word; |
| 386 | BitOp<uint8_t> op_byte; |
| 387 | |
| 388 | auto left_reader = internal::BitmapWordReader<uint64_t>(left, left_offset, length); |
| 389 | auto right_reader = internal::BitmapWordReader<uint64_t>(right, right_offset, length); |
| 390 | auto writer = internal::BitmapWordWriter<uint64_t>(out, out_offset, length); |
| 391 | |
| 392 | auto nwords = left_reader.words(); |
| 393 | while (nwords--) { |
| 394 | writer.PutNextWord(op_word(left_reader.NextWord(), right_reader.NextWord())); |
| 395 | } |
| 396 | auto nbytes = left_reader.trailing_bytes(); |
| 397 | while (nbytes--) { |
| 398 | int left_valid_bits, right_valid_bits; |
| 399 | uint8_t left_byte = left_reader.NextTrailingByte(left_valid_bits); |
| 400 | uint8_t right_byte = right_reader.NextTrailingByte(right_valid_bits); |
| 401 | DCHECK_EQ(left_valid_bits, right_valid_bits); |
| 402 | writer.PutNextTrailingByte(op_byte(left_byte, right_byte), left_valid_bits); |
| 403 | } |
| 404 | } |
| 405 | |
| 406 | // XXX: The bits before left/right/out_offset, if unaligned, are untouched. But not for |
| 407 | // the bits after length. Caller should ensure proper alignment for the tail bits if |
nothing calls this directly
no test coverage detected