internal: add macro to round value to the next closest power of 2

There are two special cases, if the input number is 0 or the number is
larger then 2^31 (for 32bit unsigned int). For the special cases the
return value is 0 because they cannot be rounded.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Pavel Hrdina
2014-11-18 17:13:38 +01:00
parent 3a04f73997
commit ff28ebf136
3 changed files with 47 additions and 0 deletions

View File

@@ -143,6 +143,44 @@ testParseVersionString(const void *data ATTRIBUTE_UNUSED)
struct testRoundData {
unsigned int input;
unsigned int output;
};
static struct testRoundData roundData[] = {
{ 0, 0 },
{ 1, 1 },
{ 1000, 1024 },
{ 1024, 1024 },
{ 1025, 2048 },
{ UINT_MAX, 0 },
};
static int
testRoundValueToPowerOfTwo(const void *data ATTRIBUTE_UNUSED)
{
unsigned int result;
size_t i;
for (i = 0; i < ARRAY_CARDINALITY(roundData); i++) {
result = VIR_ROUND_UP_POWER_OF_TWO(roundData[i].input);
if (roundData[i].output != result) {
if (virTestGetDebug() > 0) {
fprintf(stderr, "\nInput number [%u]\n", roundData[i].input);
fprintf(stderr, "Expected number [%u]\n", roundData[i].output);
fprintf(stderr, "Actual number [%u]\n", result);
}
return -1;
}
}
return 0;
}
static int
mymain(void)
@@ -162,6 +200,7 @@ mymain(void)
DO_TEST(IndexToDiskName);
DO_TEST(DiskNameToIndex);
DO_TEST(ParseVersionString);
DO_TEST(RoundValueToPowerOfTwo);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}