]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: bitmap: Introduce bitmap subtraction
authorPeter Krempa <pkrempa@redhat.com>
Thu, 7 Jan 2016 14:45:39 +0000 (15:45 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 5 Feb 2016 15:21:45 +0000 (16:21 +0100)
Performs binary subtraction of two bitmaps. Stores result in the first
operand.

src/libvirt_private.syms
src/util/virbitmap.c
src/util/virbitmap.h
tests/virbitmaptest.c

index f118d979eec7fbe2a5ed3953c678973cc97c26d6..ddc6e14836f561714845eb177b9ad5e064cedb47 100644 (file)
@@ -1161,6 +1161,7 @@ virBitmapSetAll;
 virBitmapSetBit;
 virBitmapSize;
 virBitmapString;
+virBitmapSubtract;
 virBitmapToData;
 virBitmapToDataBuf;
 
index 57135a09f71eb088173e1c6f94a1cd0df3a9ef3f..f116607998c809c6b425b209139dbf43d33b14d9 100644 (file)
@@ -859,3 +859,24 @@ virBitmapOverlaps(virBitmapPtr b1,
 
     return false;
 }
+
+/**
+ * virBitmapSubtract:
+ * @a: minuend/result
+ * @b: subtrahend
+ *
+ * Performs bitwise subtraction: a = a - b
+ */
+void
+virBitmapSubtract(virBitmapPtr a,
+                  virBitmapPtr b)
+{
+    size_t i;
+    size_t max = a->map_len;
+
+    if (max > b->map_len)
+        max = b->map_len;
+
+    for (i = 0; i < max; i++)
+        a->map[i] &= ~b->map[i];
+}
index 47488de47c176e294e8142403fc5f1ce71717dd3..846aca3682537c09f6aa7e95d209e5e441b6a3ab 100644 (file)
@@ -129,4 +129,7 @@ bool virBitmapOverlaps(virBitmapPtr b1,
                        virBitmapPtr b2)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
 #endif
index 8e458d25971c5ec5cf5195450dc081168a10155b..967a5c8291041ec530704bf34d7c60387dcca043 100644 (file)
@@ -552,9 +552,55 @@ test10(const void *opaque ATTRIBUTE_UNUSED)
     return ret;
 }
 
+struct testBinaryOpData {
+    const char *a;
+    const char *b;
+    const char *res;
+};
+
+static int
+test11(const void *opaque)
+{
+    const struct testBinaryOpData *data = opaque;
+    virBitmapPtr amap = NULL;
+    virBitmapPtr bmap = NULL;
+    virBitmapPtr resmap = NULL;
+    int ret = -1;
+
+    if (virBitmapParse(data->a, 0, &amap, 256) < 0 ||
+        virBitmapParse(data->b, 0, &bmap, 256) < 0 ||
+        virBitmapParse(data->res, 0, &resmap, 256) < 0)
+        goto cleanup;
+
+    virBitmapSubtract(amap, bmap);
+
+    if (!virBitmapEqual(amap, resmap)) {
+        fprintf(stderr, "\n bitmap subtraction failed: '%s'-'%s'!='%s'\n",
+                data->a, data->b, data->res);
+        goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    virBitmapFree(amap);
+    virBitmapFree(bmap);
+    virBitmapFree(resmap);
+
+    return ret;
+}
+
+#define TESTBINARYOP(A, B, RES, FUNC)                                         \
+    testBinaryOpData.a = A;                                                   \
+    testBinaryOpData.b = B;                                                   \
+    testBinaryOpData.res = RES;                                               \
+    if (virtTestRun(virtTestCounterNext(), FUNC, &testBinaryOpData) < 0)      \
+        ret = -1;
+
 static int
 mymain(void)
 {
+    struct testBinaryOpData testBinaryOpData;
     int ret = 0;
 
     if (virtTestRun("test1", test1, NULL) < 0)
@@ -578,6 +624,15 @@ mymain(void)
     if (virtTestRun("test10", test10, NULL) < 0)
         ret = -1;
 
+    virtTestCounterReset("test11-");
+    TESTBINARYOP("0", "0", "0,^0", test11);
+    TESTBINARYOP("0-3", "0", "1-3", test11);
+    TESTBINARYOP("0-3", "0,3", "1-2", test11);
+    TESTBINARYOP("0,^0", "0", "0,^0", test11);
+    TESTBINARYOP("0-3", "0-3", "0,^0", test11);
+    TESTBINARYOP("0-3", "0,^0", "0-3", test11);
+    TESTBINARYOP("0,2", "1,3", "0,2", test11);
+
     return ret;
 }