1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//===----------------------------------------------------------------------===//
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//===----------------------------------------------------------------------===//
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test unsigned long long to_ullong() const;
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <bitset>
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <algorithm>
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <climits>
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <cassert>
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)template <std::size_t N>
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void test_to_ullong()
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles){
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::size_t M = sizeof(unsigned long long) * CHAR_BIT < N ? sizeof(unsigned long long) * CHAR_BIT : N;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::size_t X = M == 0 ? sizeof(unsigned long long) * CHAR_BIT - 1 : sizeof(unsigned long long) * CHAR_BIT - M;
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const unsigned long long max = M == 0 ? 0 : (unsigned long long)(-1) >> X;
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    unsigned long long tests[] = {0,
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           std::min<unsigned long long>(1, max),
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           std::min<unsigned long long>(2, max),
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           std::min<unsigned long long>(3, max),
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           std::min(max, max-3),
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           std::min(max, max-2),
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                           std::min(max, max-1),
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           max};
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (std::size_t i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        unsigned long long j = tests[i];
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        std::bitset<N> v(j);
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        assert(j == v.to_ullong());
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int main()
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles){
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<0>();
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<1>();
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<31>();
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<32>();
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<33>();
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<63>();
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<64>();
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<65>();
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    test_to_ullong<1000>();
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)