1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // UNSUPPORTED: c++03, c++11, c++14, c++17 10 11 // template <class T> 12 // constexpr int popcount(T x) noexcept; 13 14 // Constraints: T is an unsigned integer type 15 // Returns: The number of bits set to one in the value of x. 16 17 #include <bit> 18 #include <cassert> 19 #include <cstdint> 20 #include <type_traits> 21 22 #include "test_macros.h" 23 24 struct A {}; 25 enum E1 : unsigned char { rEd }; 26 enum class E2 : unsigned char { red }; 27 28 template <class T> 29 constexpr bool test() 30 { 31 ASSERT_SAME_TYPE(decltype(std::popcount(T())), int); 32 ASSERT_NOEXCEPT(std::popcount(T())); 33 T max = std::numeric_limits<T>::max(); 34 35 assert(std::popcount(T(0)) == 0); 36 assert(std::popcount(T(1)) == 1); 37 assert(std::popcount(T(2)) == 1); 38 assert(std::popcount(T(3)) == 2); 39 assert(std::popcount(T(4)) == 1); 40 assert(std::popcount(T(5)) == 2); 41 assert(std::popcount(T(6)) == 2); 42 assert(std::popcount(T(7)) == 3); 43 assert(std::popcount(T(8)) == 1); 44 assert(std::popcount(T(9)) == 2); 45 assert(std::popcount(T(121)) == 5); 46 assert(std::popcount(T(127)) == 7); 47 assert(std::popcount(T(128)) == 1); 48 assert(std::popcount(T(130)) == 2); 49 assert(std::popcount(T(max >> 1)) == std::numeric_limits<T>::digits - 1); 50 assert(std::popcount(T(max - 1)) == std::numeric_limits<T>::digits - 1); 51 assert(std::popcount(max) == std::numeric_limits<T>::digits); 52 53 #ifndef _LIBCPP_HAS_NO_INT128 54 if constexpr (std::is_same_v<T, __uint128_t>) { 55 T val = 128; 56 assert(std::popcount(val-1) == 7); 57 assert(std::popcount(val) == 1); 58 assert(std::popcount(val+1) == 2); 59 val <<= 32; 60 assert(std::popcount(val-1) == 39); 61 assert(std::popcount(val) == 1); 62 assert(std::popcount(val+1) == 2); 63 val <<= 60; 64 assert(std::popcount(val-1) == 99); 65 assert(std::popcount(val) == 1); 66 assert(std::popcount(val+1) == 2); 67 68 T x = T(1) << 63; 69 T y = T(1) << 64; 70 assert(std::popcount(x) == 1); 71 assert(std::popcount(y) == 1); 72 assert(std::popcount(x+y) == 2); 73 } 74 #endif 75 76 return true; 77 } 78 79 int main(int, char**) 80 { 81 { 82 auto lambda = [](auto x) -> decltype(std::popcount(x)) {}; 83 using L = decltype(lambda); 84 85 static_assert(!std::is_invocable_v<L, signed char>); 86 static_assert(!std::is_invocable_v<L, short>); 87 static_assert(!std::is_invocable_v<L, int>); 88 static_assert(!std::is_invocable_v<L, long>); 89 static_assert(!std::is_invocable_v<L, long long>); 90 #ifndef _LIBCPP_HAS_NO_INT128 91 static_assert(!std::is_invocable_v<L, __int128_t>); 92 #endif 93 94 static_assert(!std::is_invocable_v<L, int8_t>); 95 static_assert(!std::is_invocable_v<L, int16_t>); 96 static_assert(!std::is_invocable_v<L, int32_t>); 97 static_assert(!std::is_invocable_v<L, int64_t>); 98 static_assert(!std::is_invocable_v<L, intmax_t>); 99 static_assert(!std::is_invocable_v<L, intptr_t>); 100 static_assert(!std::is_invocable_v<L, ptrdiff_t>); 101 102 static_assert(!std::is_invocable_v<L, bool>); 103 static_assert(!std::is_invocable_v<L, char>); 104 static_assert(!std::is_invocable_v<L, wchar_t>); 105 #ifndef _LIBCPP_HAS_NO_CHAR8_T 106 static_assert(!std::is_invocable_v<L, char8_t>); 107 #endif 108 static_assert(!std::is_invocable_v<L, char16_t>); 109 static_assert(!std::is_invocable_v<L, char32_t>); 110 111 static_assert(!std::is_invocable_v<L, A>); 112 static_assert(!std::is_invocable_v<L, A*>); 113 static_assert(!std::is_invocable_v<L, E1>); 114 static_assert(!std::is_invocable_v<L, E2>); 115 } 116 117 static_assert(test<unsigned char>()); 118 static_assert(test<unsigned short>()); 119 static_assert(test<unsigned int>()); 120 static_assert(test<unsigned long>()); 121 static_assert(test<unsigned long long>()); 122 #ifndef _LIBCPP_HAS_NO_INT128 123 static_assert(test<__uint128_t>()); 124 #endif 125 static_assert(test<uint8_t>()); 126 static_assert(test<uint16_t>()); 127 static_assert(test<uint32_t>()); 128 static_assert(test<uint64_t>()); 129 static_assert(test<uintmax_t>()); 130 static_assert(test<uintptr_t>()); 131 static_assert(test<size_t>()); 132 133 test<unsigned char>(); 134 test<unsigned short>(); 135 test<unsigned int>(); 136 test<unsigned long>(); 137 test<unsigned long long>(); 138 #ifndef _LIBCPP_HAS_NO_INT128 139 test<__uint128_t>(); 140 #endif 141 test<uint8_t>(); 142 test<uint16_t>(); 143 test<uint32_t>(); 144 test<uint64_t>(); 145 test<uintmax_t>(); 146 test<uintptr_t>(); 147 test<size_t>(); 148 149 return 0; 150 } 151