Restructure how we initialize hash nodes a little

This should help to silence coverity which was complaining
hundreds of times about Qt not initializing h and next in
QHashNode.

Change-Id: Ib7977693e9786d4b310799e4f428115c65bb3fee
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Lars Knoll 2012-04-30 11:01:05 +02:00 committed by Qt by Nokia
parent 69218f58a9
commit f9c2094e49
2 changed files with 17 additions and 18 deletions

View File

@ -369,7 +369,6 @@ QHashData *QHashData::detach_helper(void (*node_duplicate)(Node *, void *),
QT_RETHROW;
}
dup->h = oldNode->h;
*nextNode = dup;
nextNode = &dup->next;
oldNode = oldNode->next;

View File

@ -196,16 +196,6 @@ inline bool operator==(const QHashDummyValue & /* v1 */, const QHashDummyValue &
Q_DECLARE_TYPEINFO(QHashDummyValue, Q_MOVABLE_TYPE | Q_DUMMY_TYPE);
template <class Key, class T>
struct QHashDummyNode
{
QHashDummyNode *next;
uint h;
Key key;
inline QHashDummyNode(const Key &key0) : key(key0) {}
};
template <class Key, class T>
struct QHashNode
{
@ -214,10 +204,22 @@ struct QHashNode
Key key;
T value;
inline QHashNode(const Key &key0, const T &value0) : key(key0), value(value0) {}
inline QHashNode(const Key &key0, const T &value0, uint hash, QHashNode *n)
: next(n), h(hash), key(key0), value(value0) {}
inline bool same_key(uint h0, const Key &key0) { return h0 == h && key0 == key; }
};
template <class Key, class T>
struct QHashDummyNode
{
QHashNode<Key, T> *next;
uint h;
Key key;
inline QHashDummyNode(const Key &key0, uint hash, QHashNode<Key, T> *n) : next(n), h(hash), key(key0) {}
};
#if 0
// ###
// The introduction of the QHash random seed breaks this optimization, as it
@ -519,9 +521,9 @@ Q_INLINE_TEMPLATE void QHash<Key, T>::duplicateNode(QHashData::Node *node, void
{
Node *concreteNode = concrete(node);
if (QTypeInfo<T>::isDummy) {
(void) new (newNode) DummyNode(concreteNode->key);
(void) new (newNode) DummyNode(concreteNode->key, concreteNode->h, 0);
} else {
(void) new (newNode) Node(concreteNode->key, concreteNode->value);
(void) new (newNode) Node(concreteNode->key, concreteNode->value, concreteNode->h, 0);
}
}
@ -532,13 +534,11 @@ QHash<Key, T>::createNode(uint ah, const Key &akey, const T &avalue, Node **anex
Node *node;
if (QTypeInfo<T>::isDummy) {
node = reinterpret_cast<Node *>(new (d->allocateNode(alignOfDummyNode())) DummyNode(akey));
node = reinterpret_cast<Node *>(new (d->allocateNode(alignOfDummyNode())) DummyNode(akey, ah, *anextNode));
} else {
node = new (d->allocateNode(alignOfNode())) Node(akey, avalue);
node = new (d->allocateNode(alignOfNode())) Node(akey, avalue, ah, *anextNode);
}
node->h = ah;
node->next = *anextNode;
*anextNode = node;
++d->size;
return node;