Tweak validate() to check less as the size of the hash grows.

This makes working with a non-trivial SkTDynamicHash less painful in Debug
builds.  validate() is skipped in Release, so this has no effect there.

BUG=
R=kkinnunen@nvidia.com, bsalomon@google.com

Author: mtklein@google.com

Review URL: https://codereview.chromium.org/140753003

git-svn-id: http://skia.googlecode.com/svn/trunk@13121 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2014-01-17 17:55:14 +00:00
parent 2ab1ba0555
commit cd0bf0adaa

View File

@ -51,7 +51,6 @@ public:
void add(T* newEntry) {
SkASSERT(NULL == this->find(GetKey(*newEntry)));
this->maybeGrow();
SkASSERT(this->validate());
this->innerAdd(newEntry);
SkASSERT(this->validate());
}
@ -89,48 +88,43 @@ private:
bool validate() const {
#define SKTDYNAMICHASH_CHECK(x) SkASSERT((x)); if (!(x)) return false
static const int kLarge = 50; // Arbitrary, tweak to suit your patience.
// O(1) checks, always done.
// Is capacity sane?
SKTDYNAMICHASH_CHECK(SkIsPow2(fCapacity));
// Is fCount correct?
int count = 0;
for (int i = 0; i < fCapacity; i++) {
if (Empty() != fArray[i] && Deleted() != fArray[i]) {
count++;
// O(N) checks, skipped when very large.
if (fCount < kLarge * kLarge) {
// Are fCount and fDeleted correct, and are all elements findable?
int count = 0, deleted = 0;
for (int i = 0; i < fCapacity; i++) {
if (Deleted() == fArray[i]) {
deleted++;
} else if (Empty() != fArray[i]) {
count++;
SKTDYNAMICHASH_CHECK(NULL != this->find(GetKey(*fArray[i])));
}
}
}
SKTDYNAMICHASH_CHECK(count == fCount);
// Is fDeleted correct?
int deleted = 0;
for (int i = 0; i < fCapacity; i++) {
if (Deleted() == fArray[i]) {
deleted++;
}
}
SKTDYNAMICHASH_CHECK(deleted == fDeleted);
// Are all entries findable?
for (int i = 0; i < fCapacity; i++) {
if (Empty() == fArray[i] || Deleted() == fArray[i]) {
continue;
}
SKTDYNAMICHASH_CHECK(NULL != this->find(GetKey(*fArray[i])));
SKTDYNAMICHASH_CHECK(count == fCount);
SKTDYNAMICHASH_CHECK(deleted == fDeleted);
}
// Are all entries unique?
for (int i = 0; i < fCapacity; i++) {
if (Empty() == fArray[i] || Deleted() == fArray[i]) {
continue;
}
for (int j = i+1; j < fCapacity; j++) {
if (Empty() == fArray[j] || Deleted() == fArray[j]) {
// O(N^2) checks, skipped when large.
if (fCount < kLarge) {
// Are all entries unique?
for (int i = 0; i < fCapacity; i++) {
if (Empty() == fArray[i] || Deleted() == fArray[i]) {
continue;
}
SKTDYNAMICHASH_CHECK(fArray[i] != fArray[j]);
SKTDYNAMICHASH_CHECK(!Equal(*fArray[i], GetKey(*fArray[j])));
SKTDYNAMICHASH_CHECK(!Equal(*fArray[j], GetKey(*fArray[i])));
for (int j = i+1; j < fCapacity; j++) {
if (Empty() == fArray[j] || Deleted() == fArray[j]) {
continue;
}
SKTDYNAMICHASH_CHECK(fArray[i] != fArray[j]);
SKTDYNAMICHASH_CHECK(!Equal(*fArray[i], GetKey(*fArray[j])));
SKTDYNAMICHASH_CHECK(!Equal(*fArray[j], GetKey(*fArray[i])));
}
}
}
#undef SKTDYNAMICHASH_CHECK