[prev in list] [next in list] [prev in thread] [next in thread]
List: libvir-list
Subject: [libvirt] [PATCH 1/4] util: Introduce virBitmapUnion()
From: Andrea Bolognani <abologna () redhat ! com>
Date: 2019-05-31 15:21:59
Message-ID: 20190531152202.2909-2-abologna () redhat ! com
[Download RAW message or body]
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virbitmap.c | 26 ++++++++++++++++++++++++++
src/util/virbitmap.h | 4 ++++
tests/virbitmaptest.c | 37 +++++++++++++++++++++++++++++++++++++
4 files changed, 68 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 909975750c..678d0348a2 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1517,6 +1517,7 @@ virBitmapSubtract;
virBitmapToData;
virBitmapToDataBuf;
virBitmapToString;
+virBitmapUnion;
# util/virbuffer.h
diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
index 91df4b8601..1f0db563ab 100644
--- a/src/util/virbitmap.c
+++ b/src/util/virbitmap.c
@@ -1260,6 +1260,32 @@ virBitmapIntersect(virBitmapPtr a,
}
+/**
+ * virBitmapUnion:
+ * @a: bitmap, modified to contain result
+ * @b: other bitmap
+ *
+ * Performs union of two bitmaps: a = union(a, b)
+ *
+ * Returns 0 on success, <0 on failure.
+ */
+int
+virBitmapUnion(virBitmapPtr a,
+ virBitmapPtr b)
+{
+ size_t i;
+
+ for (i = 0; i < b->nbits; i++) {
+ if (virBitmapIsBitSet(b, i)) {
+ if (virBitmapSetBitExpand(a, i) < 0)
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
/**
* virBitmapSubtract:
* @a: minuend/result
diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h
index 38dc06412a..49d9910fa7 100644
--- a/src/util/virbitmap.h
+++ b/src/util/virbitmap.h
@@ -149,6 +149,10 @@ bool virBitmapOverlaps(virBitmapPtr b1,
void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+int virBitmapUnion(virBitmapPtr a,
+ virBitmapPtr b)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c
index 2fbafc0a76..f9d3cfd995 100644
--- a/tests/virbitmaptest.c
+++ b/tests/virbitmaptest.c
@@ -740,6 +740,34 @@ test14(const void *opaque)
return ret;
}
+/* virBitmapUnion() */
+static int
+test15(const void *opaque)
+{
+ const struct testBinaryOpData *data = opaque;
+ VIR_AUTOPTR(virBitmap) amap = NULL;
+ VIR_AUTOPTR(virBitmap) bmap = NULL;
+ VIR_AUTOPTR(virBitmap) resmap = NULL;
+
+ if (!(amap = virBitmapParseUnlimited(data->a)) ||
+ !(bmap = virBitmapParseUnlimited(data->b)) ||
+ !(resmap = virBitmapParseUnlimited(data->res))) {
+ return -1;
+ }
+
+ if (virBitmapUnion(amap, bmap) < 0)
+ return -1;
+
+ if (!virBitmapEqual(amap, resmap)) {
+ fprintf(stderr,
+ "\n bitmap union failed: union('%s', '%s') != '%s'\n",
+ data->a, data->b, data->res);
+ return -1;
+ }
+
+ return 0;
+}
+
#define TESTBINARYOP(A, B, RES, FUNC) \
testBinaryOpData.a = A; \
@@ -798,6 +826,15 @@ mymain(void)
TESTBINARYOP("0-3", "0,^0", "0-3", test14);
TESTBINARYOP("0,2", "1,3", "0,2", test14);
+ virTestCounterReset("test15-");
+ TESTBINARYOP("0-1", "0-1", "0-1", test15);
+ TESTBINARYOP("0", "1", "0-1", test15);
+ TESTBINARYOP("0-1", "2-3", "0-3", test15);
+ TESTBINARYOP("0-3", "1-2", "0-3", test15);
+ TESTBINARYOP("0,^0", "12345", "12345", test15);
+ TESTBINARYOP("12345", "0,^0", "12345", test15);
+ TESTBINARYOP("0,^0", "0,^0", "0,^0", test15);
+
return ret;
}
--
2.21.0
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic