5 * Copyright 2010 ZXing authors. All rights reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
20 #include <zxing/common/BitArray.h>
28 static unsigned int logDigits(unsigned digits) {
31 while (val < digits) {
38 const unsigned int BitArray::bitsPerWord_ = numeric_limits<unsigned int>::digits;
39 const unsigned int BitArray::logBits_ = logDigits(bitsPerWord_);
40 const unsigned int BitArray::bitsMask_ = (1 << logBits_) - 1;
42 size_t BitArray::wordsForBits(size_t bits) {
43 int arraySize = bits >> logBits_;
44 if (bits - (arraySize << logBits_) != 0) {
50 BitArray::BitArray(size_t size) :
51 size_(size), bits_(wordsForBits(size), (const unsigned int)0) {
54 BitArray::~BitArray() {
57 size_t BitArray::getSize() {
61 bool BitArray::get(size_t i) {
62 return (bits_[i >> logBits_] & (1 << (i & bitsMask_))) != 0;
65 void BitArray::set(size_t i) {
66 bits_[i >> logBits_] |= 1 << (i & bitsMask_);
69 void BitArray::setBulk(size_t i, unsigned int newBits) {
70 bits_[i >> logBits_] = newBits;
73 void BitArray::clear() {
74 size_t max = bits_.size();
75 for (size_t i = 0; i < max; i++) {
80 bool BitArray::isRange(size_t start, size_t end, bool value) {
82 throw IllegalArgumentException("end must be after start");
87 // treat the 'end' as inclusive, rather than exclusive
89 size_t firstWord = start >> logBits_;
90 size_t lastWord = end >> logBits_;
91 for (size_t i = firstWord; i <= lastWord; i++) {
92 size_t firstBit = i > firstWord ? 0 : start & bitsMask_;
93 size_t lastBit = i < lastWord ? bitsPerWord_ - 1: end & bitsMask_;
95 if (firstBit == 0 && lastBit == bitsPerWord_ - 1) {
96 mask = numeric_limits<unsigned int>::max();
99 for (size_t j = firstBit; j <= lastBit; j++) {
104 if ((bits_[i] & mask) != mask) {
108 if ((bits_[i] & mask) != 0) {
116 vector<unsigned int>& BitArray::getBitArray() {
120 void BitArray::reverse() {
121 std::vector<unsigned int> newBits(bits_.size(),(const unsigned int) 0);
122 for (size_t i = 0; i < size_; i++) {
123 if (get(size_ - i - 1)) {
124 newBits[i >> logBits_] |= 1<< (i & bitsMask_);