Signed-off-by: Andrea Bolognani <abologna@xxxxxxxxxx> --- 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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list