michael@0: michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkBitSet.h" michael@0: michael@0: SkBitSet::SkBitSet(int numberOfBits) michael@0: : fBitData(NULL), fDwordCount(0), fBitCount(numberOfBits) { michael@0: SkASSERT(numberOfBits > 0); michael@0: // Round up size to 32-bit boundary. michael@0: fDwordCount = (numberOfBits + 31) / 32; michael@0: fBitData.set(malloc(fDwordCount * sizeof(uint32_t))); michael@0: clearAll(); michael@0: } michael@0: michael@0: SkBitSet::SkBitSet(const SkBitSet& source) michael@0: : fBitData(NULL), fDwordCount(0), fBitCount(0) { michael@0: *this = source; michael@0: } michael@0: michael@0: SkBitSet& SkBitSet::operator=(const SkBitSet& rhs) { michael@0: if (this == &rhs) { michael@0: return *this; michael@0: } michael@0: fBitCount = rhs.fBitCount; michael@0: fBitData.free(); michael@0: fDwordCount = rhs.fDwordCount; michael@0: fBitData.set(malloc(fDwordCount * sizeof(uint32_t))); michael@0: memcpy(fBitData.get(), rhs.fBitData.get(), fDwordCount * sizeof(uint32_t)); michael@0: return *this; michael@0: } michael@0: michael@0: bool SkBitSet::operator==(const SkBitSet& rhs) { michael@0: if (fBitCount == rhs.fBitCount) { michael@0: if (fBitData.get() != NULL) { michael@0: return (memcmp(fBitData.get(), rhs.fBitData.get(), michael@0: fDwordCount * sizeof(uint32_t)) == 0); michael@0: } michael@0: return true; michael@0: } michael@0: return false; michael@0: } michael@0: michael@0: bool SkBitSet::operator!=(const SkBitSet& rhs) { michael@0: return !(*this == rhs); michael@0: } michael@0: michael@0: void SkBitSet::clearAll() { michael@0: if (fBitData.get() != NULL) { michael@0: sk_bzero(fBitData.get(), fDwordCount * sizeof(uint32_t)); michael@0: } michael@0: } michael@0: michael@0: void SkBitSet::setBit(int index, bool value) { michael@0: uint32_t mask = 1 << (index % 32); michael@0: if (value) { michael@0: *(internalGet(index)) |= mask; michael@0: } else { michael@0: *(internalGet(index)) &= ~mask; michael@0: } michael@0: } michael@0: michael@0: bool SkBitSet::isBitSet(int index) const { michael@0: uint32_t mask = 1 << (index % 32); michael@0: return 0 != (*internalGet(index) & mask); michael@0: } michael@0: michael@0: bool SkBitSet::orBits(const SkBitSet& source) { michael@0: if (fBitCount != source.fBitCount) { michael@0: return false; michael@0: } michael@0: uint32_t* targetBitmap = internalGet(0); michael@0: uint32_t* sourceBitmap = source.internalGet(0); michael@0: for (size_t i = 0; i < fDwordCount; ++i) { michael@0: targetBitmap[i] |= sourceBitmap[i]; michael@0: } michael@0: return true; michael@0: }