diff --git a/test/test_binary.cpp b/test/test_binary.cpp index 9878c608..30c1fd4f 100644 --- a/test/test_binary.cpp +++ b/test/test_binary.cpp @@ -62,6 +62,39 @@ size_t test_parity(T value) return count & 1; } +// Power of 2. +uint64_t test_power_of_2(int power) +{ + uint64_t result = 1; + + for (int i = 0; i < power; ++i) + { + result *= 2; + } + + return result; +} + +// Fold bits. +template +TReturn test_fold_bits(uint64_t value, int size) +{ + int bits_remaining = 64; + uint64_t mask = test_power_of_2(size) - 1; + TReturn result = 0; + + while (bits_remaining > size) + { + result = result ^ (value & mask); + value = value >> size; + bits_remaining -= size; + } + + result = result ^ (value & mask); + + return result; +} + namespace { SUITE(test_binary) @@ -667,5 +700,75 @@ namespace CHECK_EQUAL(test_parity(value), etl::parity(value)); } } + + //************************************************************************* + TEST(test_fold_bits) + { + const uint64_t data = 0xF8E9DACBBCAD9E8F; + + CHECK_EQUAL(test_fold_bits(data, 1), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 2), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 3), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 4), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 5), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 6), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 7), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 8), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 9), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 10), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 11), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 12), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 13), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 14), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 15), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 16), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 17), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 18), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 19), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 20), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 21), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 22), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 23), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 24), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 25), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 26), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 27), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 28), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 29), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 30), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 31), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 32), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 33), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 34), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 35), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 36), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 37), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 38), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 39), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 40), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 41), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 42), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 43), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 44), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 45), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 46), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 47), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 48), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 49), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 50), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 51), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 52), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 53), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 54), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 55), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 56), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 57), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 58), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 59), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 60), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 61), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 62), (etl::fold_bits(data))); + CHECK_EQUAL(test_fold_bits(data, 63), (etl::fold_bits(data))); + } }; }