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:
parent
69218f58a9
commit
f9c2094e49
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user