ispow2.pass.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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++98, c++03, c++11, c++14, c++17
  10. // template <class T>
  11. // constexpr bool ispow2(T x) noexcept;
  12. // Remarks: This function shall not participate in overload resolution unless
  13. // T is an unsigned integer type
  14. #include <bit>
  15. #include <cstdint>
  16. #include <type_traits>
  17. #include <cassert>
  18. #include "test_macros.h"
  19. class A{};
  20. enum E1 : unsigned char { rEd };
  21. enum class E2 : unsigned char { red };
  22. template <typename T>
  23. constexpr bool constexpr_test()
  24. {
  25. return std::ispow2(T(1))
  26. && std::ispow2(T(2))
  27. && !std::ispow2(T(3))
  28. && std::ispow2(T(4))
  29. && !std::ispow2(T(5))
  30. && !std::ispow2(T(6))
  31. && !std::ispow2(T(7))
  32. && std::ispow2(T(8))
  33. && !std::ispow2(T(9))
  34. ;
  35. }
  36. template <typename T>
  37. void runtime_test()
  38. {
  39. ASSERT_SAME_TYPE(bool, decltype(std::ispow2(T(0))));
  40. ASSERT_NOEXCEPT( std::ispow2(T(0)));
  41. assert(!std::ispow2(T(121)));
  42. assert(!std::ispow2(T(122)));
  43. assert(!std::ispow2(T(123)));
  44. assert(!std::ispow2(T(124)));
  45. assert(!std::ispow2(T(125)));
  46. assert(!std::ispow2(T(126)));
  47. assert(!std::ispow2(T(127)));
  48. assert( std::ispow2(T(128)));
  49. assert(!std::ispow2(T(129)));
  50. assert(!std::ispow2(T(130)));
  51. }
  52. int main()
  53. {
  54. {
  55. auto lambda = [](auto x) -> decltype(std::ispow2(x)) {};
  56. using L = decltype(lambda);
  57. static_assert( std::is_invocable_v<L, unsigned char>, "");
  58. static_assert( std::is_invocable_v<L, unsigned int>, "");
  59. static_assert( std::is_invocable_v<L, unsigned long>, "");
  60. static_assert( std::is_invocable_v<L, unsigned long long>, "");
  61. static_assert( std::is_invocable_v<L, uint8_t>, "");
  62. static_assert( std::is_invocable_v<L, uint16_t>, "");
  63. static_assert( std::is_invocable_v<L, uint32_t>, "");
  64. static_assert( std::is_invocable_v<L, uint64_t>, "");
  65. static_assert( std::is_invocable_v<L, size_t>, "");
  66. static_assert( std::is_invocable_v<L, uintmax_t>, "");
  67. static_assert( std::is_invocable_v<L, uintptr_t>, "");
  68. static_assert(!std::is_invocable_v<L, int>, "");
  69. static_assert(!std::is_invocable_v<L, signed int>, "");
  70. static_assert(!std::is_invocable_v<L, long>, "");
  71. static_assert(!std::is_invocable_v<L, long long>, "");
  72. static_assert(!std::is_invocable_v<L, int8_t>, "");
  73. static_assert(!std::is_invocable_v<L, int16_t>, "");
  74. static_assert(!std::is_invocable_v<L, int32_t>, "");
  75. static_assert(!std::is_invocable_v<L, int64_t>, "");
  76. static_assert(!std::is_invocable_v<L, ptrdiff_t>, "");
  77. static_assert(!std::is_invocable_v<L, bool>, "");
  78. static_assert(!std::is_invocable_v<L, signed char>, "");
  79. static_assert(!std::is_invocable_v<L, char16_t>, "");
  80. static_assert(!std::is_invocable_v<L, char32_t>, "");
  81. #ifndef _LIBCPP_HAS_NO_INT128
  82. static_assert( std::is_invocable_v<L, __uint128_t>, "");
  83. static_assert(!std::is_invocable_v<L, __int128_t>, "");
  84. #endif
  85. static_assert(!std::is_invocable_v<L, A>, "");
  86. static_assert(!std::is_invocable_v<L, E1>, "");
  87. static_assert(!std::is_invocable_v<L, E2>, "");
  88. }
  89. static_assert(constexpr_test<unsigned char>(), "");
  90. static_assert(constexpr_test<unsigned short>(), "");
  91. static_assert(constexpr_test<unsigned>(), "");
  92. static_assert(constexpr_test<unsigned long>(), "");
  93. static_assert(constexpr_test<unsigned long long>(), "");
  94. static_assert(constexpr_test<uint8_t>(), "");
  95. static_assert(constexpr_test<uint16_t>(), "");
  96. static_assert(constexpr_test<uint32_t>(), "");
  97. static_assert(constexpr_test<uint64_t>(), "");
  98. static_assert(constexpr_test<size_t>(), "");
  99. static_assert(constexpr_test<uintmax_t>(), "");
  100. static_assert(constexpr_test<uintptr_t>(), "");
  101. #ifndef _LIBCPP_HAS_NO_INT128
  102. static_assert(constexpr_test<__uint128_t>(), "");
  103. #endif
  104. runtime_test<unsigned char>();
  105. runtime_test<unsigned>();
  106. runtime_test<unsigned short>();
  107. runtime_test<unsigned long>();
  108. runtime_test<unsigned long long>();
  109. runtime_test<uint8_t>();
  110. runtime_test<uint16_t>();
  111. runtime_test<uint32_t>();
  112. runtime_test<uint64_t>();
  113. runtime_test<size_t>();
  114. runtime_test<uintmax_t>();
  115. runtime_test<uintptr_t>();
  116. #ifndef _LIBCPP_HAS_NO_INT128
  117. runtime_test<__uint128_t>();
  118. {
  119. __uint128_t val = 128;
  120. val <<= 32;
  121. assert(!std::ispow2(val-1));
  122. assert( std::ispow2(val));
  123. assert(!std::ispow2(val+1));
  124. val <<= 2;
  125. assert(!std::ispow2(val-1));
  126. assert( std::ispow2(val));
  127. assert(!std::ispow2(val+1));
  128. val <<= 3;
  129. assert(!std::ispow2(val-1));
  130. assert( std::ispow2(val));
  131. assert(!std::ispow2(val+1));
  132. }
  133. #endif
  134. }