]> xenbits.xensource.com Git - libvirt.git/commitdiff
virbitmap: Introduce virBitmapOverlaps
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 23 Jul 2014 15:37:19 +0000 (17:37 +0200)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 29 Jul 2014 11:00:42 +0000 (12:00 +0100)
This internal API just checks if two bitmaps intersect or not.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/libvirt_private.syms
src/util/virbitmap.c
src/util/virbitmap.h
tests/virbitmaptest.c

index 0e3057430edca45a057207720324651ff684e73a..e792a44acb60aca527ba1a774b9bf68e6823472a 100644 (file)
@@ -1005,6 +1005,7 @@ virBitmapNewCopy;
 virBitmapNewData;
 virBitmapNextClearBit;
 virBitmapNextSetBit;
+virBitmapOverlaps;
 virBitmapParse;
 virBitmapSetAll;
 virBitmapSetBit;
index 102963517f4972380d394799ebf5cdfcac3b995b..27282df9e7fdb36149d3f8bf3faac412d7800e24 100644 (file)
@@ -732,3 +732,23 @@ virBitmapDataToString(void *data,
     virBitmapFree(map);
     return ret;
 }
+
+bool
+virBitmapOverlaps(virBitmapPtr b1,
+                  virBitmapPtr b2)
+{
+    size_t i;
+
+    if (b1->max_bit > b2->max_bit) {
+        virBitmapPtr tmp = b1;
+        b1 = b2;
+        b2 = tmp;
+    }
+
+    for (i = 0; i < b1->map_len; i++) {
+        if (b1->map[i] & b2->map[i])
+            return true;
+    }
+
+    return false;
+}
index 142a2181d773dbf55ceda8257c63f51946f4d8ad..4493cc94ba500f716458504cbcccdf9d73fbc004 100644 (file)
@@ -114,5 +114,8 @@ size_t virBitmapCountBits(virBitmapPtr bitmap)
 char *virBitmapDataToString(void *data,
                             int len)
     ATTRIBUTE_NONNULL(1);
+bool virBitmapOverlaps(virBitmapPtr b1,
+                       virBitmapPtr b2)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 #endif
index 048946fcff92a2343b2ec1edc02ef03cbed70102..ea832ad7f3fa3ad4b99be04b6b955137122457c7 100644 (file)
@@ -509,6 +509,30 @@ test9(const void *opaque ATTRIBUTE_UNUSED)
 
 }
 
+static int
+test10(const void *opaque ATTRIBUTE_UNUSED)
+{
+    int ret = -1;
+    virBitmapPtr b1 = NULL, b2 = NULL, b3 = NULL;
+
+    if (virBitmapParse("0-3,5-8,11-15", 0, &b1, 20) < 0 ||
+        virBitmapParse("4,9,10,16-19", 0, &b2, 20) < 0 ||
+        virBitmapParse("15", 0, &b3, 20) < 0)
+        goto cleanup;
+
+    if (virBitmapOverlaps(b1, b2) ||
+        virBitmapOverlaps(b2, b3) ||
+        !virBitmapOverlaps(b1, b3))
+        goto cleanup;
+
+    ret = 0;
+ cleanup:
+    virBitmapFree(b1);
+    virBitmapFree(b2);
+    virBitmapFree(b3);
+    return ret;
+}
+
 static int
 mymain(void)
 {
@@ -532,6 +556,8 @@ mymain(void)
         ret = -1;
     if (virtTestRun("test9", test9, NULL) < 0)
         ret = -1;
+    if (virtTestRun("test10", test10, NULL) < 0)
+        ret = -1;
 
     return ret;
 }