# include "c-strcase.h"
# include "ignore-value.h"
+# include "count-leading-zeros.h"
/* On architectures which lack these limits, define them (ie. Cygwin).
* Note that the libvirt code should be robust enough to handle the
/* round up value to the closest multiple of size */
# define VIR_ROUND_UP(value, size) (VIR_DIV_UP(value, size) * (size))
+/* Round up to the next closest power of 2. It will return rounded number or 0
+ * for 0 or number more than 2^31 (for 32bit unsigned int). */
+# define VIR_ROUND_UP_POWER_OF_TWO(value) \
+ ((value) > 0 && (value) <= 1U << (sizeof(unsigned int) * 8 - 1) ? \
+ 1U << (sizeof(unsigned int) * 8 - count_leading_zeros((value) - 1)) : 0)
+
/* Specific error values for use in forwarding programs such as
* virt-login-shell; these values match what GNU env does. */
+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)
DO_TEST(IndexToDiskName);
DO_TEST(DiskNameToIndex);
DO_TEST(ParseVersionString);
+ DO_TEST(RoundValueToPowerOfTwo);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}