|
1 |
|
2 /* |
|
3 * Copyright 2011 Google Inc. |
|
4 * |
|
5 * Use of this source code is governed by a BSD-style license that can be |
|
6 * found in the LICENSE file. |
|
7 */ |
|
8 |
|
9 |
|
10 #include "SkBitSet.h" |
|
11 |
|
12 SkBitSet::SkBitSet(int numberOfBits) |
|
13 : fBitData(NULL), fDwordCount(0), fBitCount(numberOfBits) { |
|
14 SkASSERT(numberOfBits > 0); |
|
15 // Round up size to 32-bit boundary. |
|
16 fDwordCount = (numberOfBits + 31) / 32; |
|
17 fBitData.set(malloc(fDwordCount * sizeof(uint32_t))); |
|
18 clearAll(); |
|
19 } |
|
20 |
|
21 SkBitSet::SkBitSet(const SkBitSet& source) |
|
22 : fBitData(NULL), fDwordCount(0), fBitCount(0) { |
|
23 *this = source; |
|
24 } |
|
25 |
|
26 SkBitSet& SkBitSet::operator=(const SkBitSet& rhs) { |
|
27 if (this == &rhs) { |
|
28 return *this; |
|
29 } |
|
30 fBitCount = rhs.fBitCount; |
|
31 fBitData.free(); |
|
32 fDwordCount = rhs.fDwordCount; |
|
33 fBitData.set(malloc(fDwordCount * sizeof(uint32_t))); |
|
34 memcpy(fBitData.get(), rhs.fBitData.get(), fDwordCount * sizeof(uint32_t)); |
|
35 return *this; |
|
36 } |
|
37 |
|
38 bool SkBitSet::operator==(const SkBitSet& rhs) { |
|
39 if (fBitCount == rhs.fBitCount) { |
|
40 if (fBitData.get() != NULL) { |
|
41 return (memcmp(fBitData.get(), rhs.fBitData.get(), |
|
42 fDwordCount * sizeof(uint32_t)) == 0); |
|
43 } |
|
44 return true; |
|
45 } |
|
46 return false; |
|
47 } |
|
48 |
|
49 bool SkBitSet::operator!=(const SkBitSet& rhs) { |
|
50 return !(*this == rhs); |
|
51 } |
|
52 |
|
53 void SkBitSet::clearAll() { |
|
54 if (fBitData.get() != NULL) { |
|
55 sk_bzero(fBitData.get(), fDwordCount * sizeof(uint32_t)); |
|
56 } |
|
57 } |
|
58 |
|
59 void SkBitSet::setBit(int index, bool value) { |
|
60 uint32_t mask = 1 << (index % 32); |
|
61 if (value) { |
|
62 *(internalGet(index)) |= mask; |
|
63 } else { |
|
64 *(internalGet(index)) &= ~mask; |
|
65 } |
|
66 } |
|
67 |
|
68 bool SkBitSet::isBitSet(int index) const { |
|
69 uint32_t mask = 1 << (index % 32); |
|
70 return 0 != (*internalGet(index) & mask); |
|
71 } |
|
72 |
|
73 bool SkBitSet::orBits(const SkBitSet& source) { |
|
74 if (fBitCount != source.fBitCount) { |
|
75 return false; |
|
76 } |
|
77 uint32_t* targetBitmap = internalGet(0); |
|
78 uint32_t* sourceBitmap = source.internalGet(0); |
|
79 for (size_t i = 0; i < fDwordCount; ++i) { |
|
80 targetBitmap[i] |= sourceBitmap[i]; |
|
81 } |
|
82 return true; |
|
83 } |