MCPcopy Create free account
hub / github.com/apache/arrow / UnalignedBitmapOp

Function UnalignedBitmapOp

cpp/src/arrow/util/bitmap_ops.cc:352–374  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

350
351template <template <typename> class BitOp>
352void 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

Callers

nothing calls this directly

Calls 6

PutNextWordMethod · 0.80
trailing_bytesMethod · 0.80
NextTrailingByteMethod · 0.80
PutNextTrailingByteMethod · 0.80
wordsMethod · 0.45
NextWordMethod · 0.45

Tested by

no test coverage detected