QByteArray decode(const QString& encoded, bool * ok) { QByteArray result; int size = encoded.size(), capacity = size; if(size % 8) { * ok = false; return result; } while(size > 0 && encoded[size -1] == pad()) { size --; } switch(capacity - size) { case 0: capacity = determineCapacity(size, 0, 0); break; case 1: capacity = determineCapacity(size, 7, 4); break; case 3: capacity = determineCapacity(size, 5, 3); break; case 4: capacity = determineCapacity(size, 4, 2); break; case 6: capacity = determineCapacity(size, 2, 1); break; default: * ok = false; return result; } result.resize(capacity); char * output = result.data(); const QChar * input = encoded.constData(); for(int k = 0, i = 0; k < size; k += 8, i += 5) { if(!decode(input, k, size, i, capacity, output)) { * ok = false; return QByteArray(); } } * ok = true; return result; }
void BasicHashtableImpl::rehash(size_t minimumCapacity, float loadFactor) { if (minimumCapacity < mSize) { minimumCapacity = mSize; } size_t newBucketCount, newCapacity; determineCapacity(minimumCapacity, loadFactor, &newBucketCount, &newCapacity); if (newBucketCount != mBucketCount || newCapacity != mCapacity) { if (mBuckets) { void* newBuckets; if (mSize) { newBuckets = allocateBuckets(newBucketCount); for (size_t i = 0; i < mBucketCount; i++) { const Bucket& fromBucket = bucketAt(mBuckets, i); if (fromBucket.cookie & Bucket::PRESENT) { hash_t hash = fromBucket.cookie & Bucket::HASH_MASK; size_t index = chainStart(hash, newBucketCount); Bucket* toBucket = &bucketAt(newBuckets, size_t(index)); if (toBucket->cookie & Bucket::PRESENT) { size_t inc = chainIncrement(hash, newBucketCount); do { toBucket->cookie |= Bucket::COLLISION; index = chainSeek(index, inc, newBucketCount); toBucket = &bucketAt(newBuckets, size_t(index)); } while (toBucket->cookie & Bucket::PRESENT); } toBucket->cookie = Bucket::PRESENT | hash; initializeBucketEntry(*toBucket, fromBucket.entry); } } } else { newBuckets = NULL; } releaseBuckets(mBuckets, mBucketCount); mBuckets = newBuckets; mFilledBuckets = mSize; } mBucketCount = newBucketCount; mCapacity = newCapacity; } mLoadFactor = loadFactor; }