util: Introduce virBitmapUnion()

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Andrea Bolognani 2019-05-30 19:08:28 +02:00
parent eee8427a1c
commit 1b2ac8010c
4 changed files with 70 additions and 0 deletions

View File

@ -1517,6 +1517,7 @@ virBitmapSubtract;
virBitmapToData;
virBitmapToDataBuf;
virBitmapToString;
virBitmapUnion;
# util/virbuffer.h

View File

@ -1260,6 +1260,33 @@ 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,
const virBitmap *b)
{
size_t i;
if (a->nbits < b->nbits &&
virBitmapExpand(a, b->nbits - 1) < 0) {
return -1;
}
for (i = 0; i < b->map_len; i++)
a->map[i] |= b->map[i];
return 0;
}
/**
* virBitmapSubtract:
* @a: minuend/result

View File

@ -149,6 +149,10 @@ bool virBitmapOverlaps(virBitmapPtr b1,
void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int virBitmapUnion(virBitmapPtr a,
const virBitmap *b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

View File

@ -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,16 @@ mymain(void)
TESTBINARYOP("0-3", "0,^0", "0-3", test14);
TESTBINARYOP("0,2", "1,3", "0,2", test14);
/* virBitmapUnion() */
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;
}