//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// REQUIRES: long_tests
// UNSUPPORTED: c++03

// Not a portable test

// <__hash_table>

// size_t __next_hash_pow2(size_t n);

// If n <= 1, return n. If n is a power of 2, return n.
// Otherwise, return the next power of 2.

#include <__hash_table>
#include <unordered_map>
#include <cassert>

#include "test_macros.h"


bool
is_power_of_two(unsigned long n)
{
    return __builtin_popcount(n) == 1;
}

void test_next_pow2_val(size_t n)
{
        std::size_t npow2 = std::__next_hash_pow2(n);
        assert(is_power_of_two(npow2) && npow2 > n);
}

void
test_next_pow2()
{
    assert(!is_power_of_two(0));
    assert(is_power_of_two(1));
    assert(is_power_of_two(2));
    assert(!is_power_of_two(3));

    assert(std::__next_hash_pow2(0) == 0);
    assert(std::__next_hash_pow2(1) == 1);

    for (std::size_t n = 2; n < (sizeof(std::size_t) * 8 - 1); ++n)
    {
        std::size_t pow2 = 1ULL << n;
        assert(std::__next_hash_pow2(pow2) == pow2);
    }

    test_next_pow2_val(3);
    test_next_pow2_val(7);
    test_next_pow2_val(9);
    test_next_pow2_val(15);
    test_next_pow2_val(127);
    test_next_pow2_val(129);
}

// Note: this is only really useful when run with -fsanitize=undefined.
void
fuzz_unordered_map_reserve(unsigned num_inserts,
                           unsigned num_reserve1,
                           unsigned num_reserve2)
{
    std::unordered_map<uint64_t, unsigned long> m;
    m.reserve(num_reserve1);
    for (unsigned I = 0; I < num_inserts; ++I) m[I] = 0;
    m.reserve(num_reserve2);
    assert(m.bucket_count() >= num_reserve2);
}

int main(int, char**)
{
    test_next_pow2();

    for (unsigned num_inserts = 0; num_inserts <= 64; ++num_inserts)
        for (unsigned num_reserve1 = 1; num_reserve1 <= 64; ++num_reserve1)
            for (unsigned num_reserve2 = 1; num_reserve2 <= 64; ++num_reserve2)
                fuzz_unordered_map_reserve(num_inserts, num_reserve1, num_reserve2);

    return 0;
}
