ceil2.pass.cpp 4.9 KB

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