mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
util: hash: Introduce virHashForEachSorted
Iterate the hash elements sorted by key. This is useful to provide a stable ordering such as in cases when the output is checked in tests. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Reviewed-by: Matt Coleman <matt@datto.com>
This commit is contained in:
parent
4eb8e9ae8b
commit
280a6d8330
@ -2207,6 +2207,7 @@ virHashAtomicSteal;
|
|||||||
virHashAtomicUpdate;
|
virHashAtomicUpdate;
|
||||||
virHashEqual;
|
virHashEqual;
|
||||||
virHashForEach;
|
virHashForEach;
|
||||||
|
virHashForEachSorted;
|
||||||
virHashFree;
|
virHashFree;
|
||||||
virHashGetItems;
|
virHashGetItems;
|
||||||
virHashHasEntry;
|
virHashHasEntry;
|
||||||
|
@ -481,14 +481,25 @@ virHashRemoveEntry(virHashTablePtr table, const char *name)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virHashForEach
|
* virHashForEach, virHashForEachSorted
|
||||||
* @table: the hash table to process
|
* @table: the hash table to process
|
||||||
* @iter: callback to process each element
|
* @iter: callback to process each element
|
||||||
* @opaque: opaque data to pass to the iterator
|
* @opaque: opaque data to pass to the iterator
|
||||||
*
|
*
|
||||||
* Iterates over every element in the hash table, invoking the
|
* Iterates over every element in the hash table, invoking the 'iter' callback.
|
||||||
* 'iter' callback. The callback is allowed to remove the current element
|
*
|
||||||
* using virHashRemoveEntry but calling other virHash* functions is prohibited.
|
* The elements are iterated in arbitrary order.
|
||||||
|
*
|
||||||
|
* virHashForEach allows the callback to remove the current
|
||||||
|
* element using virHashRemoveEntry but calling other virHash* functions is
|
||||||
|
* prohibited. Note that removing the entry invalidates @key and @payload in
|
||||||
|
* the callback.
|
||||||
|
*
|
||||||
|
* virHashForEachSorted iterates the elements in order by sorted key.
|
||||||
|
*
|
||||||
|
* virHashForEachSorted is more computationally
|
||||||
|
* expensive than virHashForEach.
|
||||||
|
*
|
||||||
* If @iter fails and returns a negative value, the evaluation is stopped and -1
|
* If @iter fails and returns a negative value, the evaluation is stopped and -1
|
||||||
* is returned.
|
* is returned.
|
||||||
*
|
*
|
||||||
@ -520,6 +531,26 @@ virHashForEach(virHashTablePtr table, virHashIterator iter, void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
virHashForEachSorted(virHashTablePtr table,
|
||||||
|
virHashIterator iter,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
g_autofree virHashKeyValuePairPtr items = virHashGetItems(table, NULL, true);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (!items)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; items[i].key; i++) {
|
||||||
|
if (iter((void *)items[i].value, items[i].key, opaque) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virHashRemoveSet
|
* virHashRemoveSet
|
||||||
* @table: the hash table to process
|
* @table: the hash table to process
|
||||||
|
@ -136,6 +136,7 @@ bool virHashEqual(const virHashTable *table1,
|
|||||||
* Iterators
|
* Iterators
|
||||||
*/
|
*/
|
||||||
int virHashForEach(virHashTablePtr table, virHashIterator iter, void *opaque);
|
int virHashForEach(virHashTablePtr table, virHashIterator iter, void *opaque);
|
||||||
|
int virHashForEachSorted(virHashTablePtr table, virHashIterator iter, void *opaque);
|
||||||
ssize_t virHashRemoveSet(virHashTablePtr table, virHashSearcher iter, const void *opaque);
|
ssize_t virHashRemoveSet(virHashTablePtr table, virHashSearcher iter, const void *opaque);
|
||||||
void *virHashSearch(const virHashTable *table, virHashSearcher iter,
|
void *virHashSearch(const virHashTable *table, virHashSearcher iter,
|
||||||
const void *opaque, char **name);
|
const void *opaque, char **name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user