]> xenbits.xensource.com Git - libvirt.git/commitdiff
Compare two hash tables for equality
authorStefan Berger <stefanb@linux.vnet.ibm.com>
Mon, 23 Jan 2012 20:35:54 +0000 (15:35 -0500)
committerStefan Berger <stefanb@us.ibm.com>
Mon, 23 Jan 2012 20:35:54 +0000 (15:35 -0500)
Add function to compare two hash tables for equality.

src/util/hash.c
src/util/hash.h

index 665bcce1d57ddd4388a1835d1ec827412e1228b1..ff86f163f627076e4f3a6e7a62f2ecb3eda9fa11 100644 (file)
@@ -663,3 +663,49 @@ virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
 
     return iter.sortArray;
 }
+
+struct virHashEqualData
+{
+    bool equal;
+    const virHashTablePtr table2;
+    virHashValueComparator compar;
+};
+
+static int virHashEqualSearcher(const void *payload, const void *name,
+                                const void *data)
+{
+    struct virHashEqualData *vhed = (void *)data;
+    const void *value;
+
+    value = virHashLookup(vhed->table2, name);
+    if (!value ||
+        vhed->compar(value, payload) != 0) {
+        /* key is missing in 2nd table or values are different */
+        vhed->equal = false;
+        /* stop 'iteration' */
+        return 1;
+    }
+    return 0;
+}
+
+bool virHashEqual(const virHashTablePtr table1,
+                  const virHashTablePtr table2,
+                  virHashValueComparator compar)
+{
+    struct virHashEqualData data = {
+        .equal = true,
+        .table2 = table2,
+        .compar = compar,
+    };
+
+    if (table1 == table2)
+        return true;
+
+    if (!table1 || !table2 ||
+        virHashSize(table1) != virHashSize(table2))
+        return false;
+
+    virHashSearch(table1, virHashEqualSearcher, &data);
+
+    return data.equal;
+}
index 1ba12b91d33906989010c0af037159030ff7f6a4..9da2da5f8715c16316355d5a15763ed279a25872 100644 (file)
@@ -153,6 +153,18 @@ typedef int (*virHashKeyComparator)(const virHashKeyValuePairPtr,
 virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
                                        virHashKeyComparator compar);
 
+/*
+ * Compare two tables for equality: the lookup of a key's value in
+ * both tables must result in an equivalent value.
+ * The caller must pass in a comparator function for comparing the values
+ * of two keys.
+ */
+typedef int (*virHashValueComparator)(const void *value1, const void *value2);
+bool virHashEqual(const virHashTablePtr table1,
+                  const virHashTablePtr table2,
+                  virHashValueComparator compar);
+
+
 /*
  * Iterators
  */