mirror of
https://github.com/zxing/zxing.git
synced 2025-01-12 19:57:27 -08:00
improve profiled performance of C++ BitArray::get(). Closes issue 1101
From evansepdx. Thanks! git-svn-id: https://zxing.googlecode.com/svn/trunk@2083 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
1cd49dbcb1
commit
a569f179ff
|
@ -1,8 +1,5 @@
|
|||
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
||||
/*
|
||||
* BitArray.cpp
|
||||
* zxing
|
||||
*
|
||||
* Copyright 2010 ZXing authors. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
@ -19,32 +16,14 @@
|
|||
*/
|
||||
|
||||
#include <zxing/common/BitArray.h>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace zxing {
|
||||
|
||||
static unsigned int logDigits(unsigned digits) {
|
||||
unsigned log = 0;
|
||||
unsigned val = 1;
|
||||
while (val < digits) {
|
||||
log++;
|
||||
val <<= 1;
|
||||
}
|
||||
return log;
|
||||
}
|
||||
|
||||
const unsigned int BitArray::bitsPerWord_ = numeric_limits<unsigned int>::digits;
|
||||
const unsigned int BitArray::logBits_ = logDigits(bitsPerWord_);
|
||||
const unsigned int BitArray::bitsMask_ = (1 << logBits_) - 1;
|
||||
|
||||
size_t BitArray::wordsForBits(size_t bits) {
|
||||
int arraySize = bits >> logBits_;
|
||||
if (bits - (arraySize << logBits_) != 0) {
|
||||
arraySize++;
|
||||
}
|
||||
int arraySize = (bits + bitsPerWord_ - 1) >> logBits_;
|
||||
return arraySize;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,9 +3,6 @@
|
|||
#define __BIT_ARRAY_H__
|
||||
|
||||
/*
|
||||
* BitArray.h
|
||||
* zxing
|
||||
*
|
||||
* Copyright 2010 ZXing authors. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
@ -24,17 +21,26 @@
|
|||
#include <zxing/common/Counted.h>
|
||||
#include <zxing/common/IllegalArgumentException.h>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
|
||||
namespace zxing {
|
||||
|
||||
#define ZX_LOG_DIGITS(digits) \
|
||||
((digits == 8) ? 3 : \
|
||||
((digits == 16) ? 4 : \
|
||||
((digits == 32) ? 5 : \
|
||||
((digits == 64) ? 6 : \
|
||||
((digits == 128) ? 7 : \
|
||||
(-1))))))
|
||||
|
||||
class BitArray : public Counted {
|
||||
private:
|
||||
size_t size_;
|
||||
std::vector<unsigned int> bits_;
|
||||
static const unsigned int bitsPerWord_;
|
||||
static const unsigned int logBits_;
|
||||
static const unsigned int bitsMask_;
|
||||
static const unsigned int bitsPerWord_ =
|
||||
std::numeric_limits<unsigned int>::digits;
|
||||
static const unsigned int logBits_ = ZX_LOG_DIGITS(bitsPerWord_);
|
||||
static const unsigned int bitsMask_ = (1 << logBits_) - 1;
|
||||
static size_t wordsForBits(size_t bits);
|
||||
explicit BitArray();
|
||||
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
||||
/*
|
||||
* BitMatrix.cpp
|
||||
* zxing
|
||||
*
|
||||
* Copyright 2010 ZXing authors. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
@ -35,26 +32,24 @@ using zxing::Ref;
|
|||
namespace {
|
||||
size_t wordsForSize(size_t width,
|
||||
size_t height,
|
||||
unsigned int bitsPerWord,
|
||||
unsigned int logBits) {
|
||||
size_t bits = width * height;
|
||||
int arraySize = bits >> logBits;
|
||||
if (bits - (arraySize << logBits) != 0) {
|
||||
arraySize++;
|
||||
}
|
||||
int arraySize = (bits + bitsPerWord - 1) >> logBits;
|
||||
return arraySize;
|
||||
}
|
||||
}
|
||||
|
||||
BitMatrix::BitMatrix(size_t dimension) :
|
||||
width_(dimension), height_(dimension), words_(0), bits_(NULL) {
|
||||
words_ = wordsForSize(width_, height_, logBits);
|
||||
words_ = wordsForSize(width_, height_, bitsPerWord, logBits);
|
||||
bits_ = new unsigned int[words_];
|
||||
clear();
|
||||
}
|
||||
|
||||
BitMatrix::BitMatrix(size_t width, size_t height) :
|
||||
width_(width), height_(height), words_(0), bits_(NULL) {
|
||||
words_ = wordsForSize(width_, height_, logBits);
|
||||
words_ = wordsForSize(width_, height_, bitsPerWord, logBits);
|
||||
bits_ = new unsigned int[words_];
|
||||
clear();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue