MCPcopy Create free account
hub / github.com/apache/impala / BitmapChangeBits

Function BitmapChangeBits

be/src/kudu/util/bitmap.cc:32–68  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

30namespace kudu {
31
32void BitmapChangeBits(uint8_t *bitmap, size_t offset, size_t num_bits, bool value) {
33 DCHECK_GT(num_bits, 0);
34
35 size_t start_byte = (offset >> 3);
36 size_t end_byte = (offset + num_bits - 1) >> 3;
37 int single_byte = (start_byte == end_byte);
38
39 // Change the last bits of the first byte
40 size_t left = offset & 0x7;
41 size_t right = (single_byte) ? (left + num_bits) : 8;
42 uint8_t mask = ((0xff << left) & (0xff >> (8 - right)));
43 if (value) {
44 bitmap[start_byte++] |= mask;
45 } else {
46 bitmap[start_byte++] &= ~mask;
47 }
48
49 // Nothing left... I'm done
50 if (single_byte) {
51 return;
52 }
53
54 // change the middle bits
55 if (end_byte > start_byte) {
56 const uint8_t pattern8[2] = { 0x00, 0xff };
57 memset(bitmap + start_byte, pattern8[value], end_byte - start_byte);
58 }
59
60 // change the first bits of the last byte
61 right = offset + num_bits - (end_byte << 3);
62 mask = (0xff >> (8 - right));
63 if (value) {
64 bitmap[end_byte] |= mask;
65 } else {
66 bitmap[end_byte] &= ~mask;
67 }
68}
69
70bool BitmapFindFirst(const uint8_t *bitmap, size_t offset, size_t bitmap_size,
71 bool value, size_t *idx) {

Callers 1

TESTFunction · 0.85

Calls

no outgoing calls

Tested by 1

TESTFunction · 0.68