mirror of https://github.com/qt/qtbase.git
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;
|
QT_RETHROW;
|
||||||
}
|
}
|
||||||
|
|
||||||
dup->h = oldNode->h;
|
|
||||||
*nextNode = dup;
|
*nextNode = dup;
|
||||||
nextNode = &dup->next;
|
nextNode = &dup->next;
|
||||||
oldNode = oldNode->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);
|
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>
|
template <class Key, class T>
|
||||||
struct QHashNode
|
struct QHashNode
|
||||||
{
|
{
|
||||||
|
@ -214,10 +204,22 @@ struct QHashNode
|
||||||
Key key;
|
Key key;
|
||||||
T value;
|
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; }
|
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
|
#if 0
|
||||||
// ###
|
// ###
|
||||||
// The introduction of the QHash random seed breaks this optimization, as it
|
// 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);
|
Node *concreteNode = concrete(node);
|
||||||
if (QTypeInfo<T>::isDummy) {
|
if (QTypeInfo<T>::isDummy) {
|
||||||
(void) new (newNode) DummyNode(concreteNode->key);
|
(void) new (newNode) DummyNode(concreteNode->key, concreteNode->h, 0);
|
||||||
} else {
|
} 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;
|
Node *node;
|
||||||
|
|
||||||
if (QTypeInfo<T>::isDummy) {
|
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 {
|
} 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;
|
*anextNode = node;
|
||||||
++d->size;
|
++d->size;
|
||||||
return node;
|
return node;
|
||||||
|
|
Loading…
Reference in New Issue