mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-07-06 09:55:46 +00:00
util: Introduce virBitmapUnion()
Signed-off-by: Andrea Bolognani <abologna@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
eee8427a1c
commit
1b2ac8010c
@ -1517,6 +1517,7 @@ virBitmapSubtract;
|
|||||||
virBitmapToData;
|
virBitmapToData;
|
||||||
virBitmapToDataBuf;
|
virBitmapToDataBuf;
|
||||||
virBitmapToString;
|
virBitmapToString;
|
||||||
|
virBitmapUnion;
|
||||||
|
|
||||||
|
|
||||||
# util/virbuffer.h
|
# util/virbuffer.h
|
||||||
|
@ -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:
|
* virBitmapSubtract:
|
||||||
* @a: minuend/result
|
* @a: minuend/result
|
||||||
|
@ -149,6 +149,10 @@ bool virBitmapOverlaps(virBitmapPtr b1,
|
|||||||
void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b)
|
void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
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)
|
void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
||||||
|
|
||||||
|
@ -740,6 +740,34 @@ test14(const void *opaque)
|
|||||||
return ret;
|
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) \
|
#define TESTBINARYOP(A, B, RES, FUNC) \
|
||||||
testBinaryOpData.a = A; \
|
testBinaryOpData.a = A; \
|
||||||
@ -798,6 +826,16 @@ mymain(void)
|
|||||||
TESTBINARYOP("0-3", "0,^0", "0-3", test14);
|
TESTBINARYOP("0-3", "0,^0", "0-3", test14);
|
||||||
TESTBINARYOP("0,2", "1,3", "0,2", 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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user