libstdcpp_midpoint.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright (C) 2019-2020 Free Software Foundation, Inc.
  2. //
  3. // This file is part of the GNU ISO C++ Library. This library is free
  4. // software; you can redistribute it and/or modify it under the
  5. // terms of the GNU General Public License as published by the
  6. // Free Software Foundation; either version 3, or (at your option)
  7. // any later version.
  8. // This library is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. // You should have received a copy of the GNU General Public License along
  13. // with this library; see the file COPYING3. If not see
  14. // <http://www.gnu.org/licenses/>.
  15. #include <climits>
  16. #include <cassert>
  17. #include "simple/support/algorithm.hpp"
  18. using simple::support::midpoint;
  19. static_assert(std::is_same_v<decltype(midpoint(0, 1)), int>);
  20. static_assert(noexcept(midpoint(1, 2)));
  21. struct test_type { };
  22. template<typename T> decltype(midpoint<T>(T(), T())) try_midpoint(int);
  23. template<typename T> test_type try_midpoint(...);
  24. template<typename T> constexpr bool no_midpoint()
  25. { return std::is_same_v<decltype(try_midpoint<T>()), test_type>; }
  26. static_assert(no_midpoint<bool>());
  27. static_assert(no_midpoint<const bool>());
  28. static_assert(no_midpoint<const int>());
  29. static_assert(no_midpoint<volatile int>());
  30. static_assert( midpoint(0, 0) == 0 );
  31. static_assert( midpoint(1, 1) == 1 );
  32. static_assert( midpoint(0, 1) == 0 );
  33. static_assert( midpoint(1, 0) == 1 );
  34. static_assert( midpoint(0, 2) == 1 );
  35. static_assert( midpoint(3, 2) == 3 );
  36. static_assert( midpoint(-5, 4) == -1 );
  37. static_assert( midpoint(5, -4) == 1 );
  38. static_assert( midpoint(-5, -4) == -5 );
  39. static_assert( midpoint(-4, -5) == -4 );
  40. static_assert( midpoint(INT_MIN, INT_MAX) == -1 );
  41. static_assert( midpoint(INT_MAX, INT_MIN) == 0 );
  42. static_assert( midpoint(INT_MAX, INT_MAX) == INT_MAX );
  43. static_assert( midpoint(INT_MAX, INT_MAX-1) == INT_MAX );
  44. static_assert( midpoint(INT_MAX-1, INT_MAX-1) == INT_MAX-1 );
  45. static_assert( midpoint(INT_MAX-1, INT_MAX) == INT_MAX-1 );
  46. static_assert( midpoint(INT_MAX, INT_MAX-2) == INT_MAX-1 );
  47. static_assert( midpoint(0u, 0u) == 0 );
  48. static_assert( midpoint(0u, 1u) == 0 );
  49. static_assert( midpoint(1u, 0u) == 1 );
  50. static_assert( midpoint(0u, 2u) == 1 );
  51. static_assert( midpoint(3u, 2u) == 3 );
  52. static_assert( midpoint(0u, UINT_MAX) == UINT_MAX/2 );
  53. static_assert( midpoint(UINT_MAX, 0u) == (UINT_MAX/2 + 1) );
  54. static_assert( midpoint(UINT_MAX, UINT_MAX) == UINT_MAX );
  55. static_assert( midpoint(UINT_MAX, UINT_MAX-1) == UINT_MAX );
  56. static_assert( midpoint(UINT_MAX-1, UINT_MAX-1) == UINT_MAX-1 );
  57. static_assert( midpoint(UINT_MAX-1, UINT_MAX) == UINT_MAX-1 );
  58. static_assert( midpoint(UINT_MAX, UINT_MAX-2) == UINT_MAX-1 );
  59. static_assert( midpoint<short>(0, 0) == 0 );
  60. static_assert( midpoint<short>(0, 1) == 0 );
  61. static_assert( midpoint<short>(1, 0) == 1 );
  62. static_assert( midpoint<short>(0, 2) == 1 );
  63. static_assert( midpoint<short>(3, 2) == 3 );
  64. static_assert( midpoint<short>(-5, 4) == -1 );
  65. static_assert( midpoint<short>(5, -4) == 1 );
  66. static_assert( midpoint<short>(-5, -4) == -5 );
  67. static_assert( midpoint<short>(-4, -5) == -4 );
  68. static_assert( midpoint<short>(SHRT_MIN, SHRT_MAX) == -1 );
  69. static_assert( midpoint<short>(SHRT_MAX, SHRT_MIN) == 0 );
  70. static_assert( midpoint<short>(SHRT_MAX, SHRT_MAX) == SHRT_MAX );
  71. static_assert( midpoint<short>(SHRT_MAX, SHRT_MAX-1) == SHRT_MAX );
  72. static_assert( midpoint<short>(SHRT_MAX-1, SHRT_MAX-1) == SHRT_MAX-1 );
  73. static_assert( midpoint<short>(SHRT_MAX-1, SHRT_MAX) == SHRT_MAX-1 );
  74. static_assert( midpoint<short>(SHRT_MAX, SHRT_MAX-2) == SHRT_MAX-1 );
  75. static_assert( midpoint<signed char>(0, 0) == 0 );
  76. static_assert( midpoint<signed char>(1, 1) == 1 );
  77. static_assert( midpoint<signed char>(0, 1) == 0 );
  78. static_assert( midpoint<signed char>(1, 0) == 1 );
  79. static_assert( midpoint<signed char>(0, 2) == 1 );
  80. static_assert( midpoint<signed char>(3, 2) == 3 );
  81. static_assert( midpoint<signed char>(-5, 4) == -1 );
  82. static_assert( midpoint<signed char>(5, -4) == 1 );
  83. static_assert( midpoint<signed char>(-5, -4) == -5 );
  84. static_assert( midpoint<signed char>(-4, -5) == -4 );
  85. static_assert( midpoint<signed char>(SCHAR_MIN, SCHAR_MAX) == -1 );
  86. static_assert( midpoint<signed char>(SCHAR_MAX, SCHAR_MIN) == 0 );
  87. static_assert( midpoint<signed char>(SCHAR_MAX, SCHAR_MAX) == SCHAR_MAX );
  88. static_assert( midpoint<signed char>(SCHAR_MAX, SCHAR_MAX-1) == SCHAR_MAX);
  89. void
  90. test01()
  91. {
  92. // Test every possibility for signed char.
  93. for (int a = SCHAR_MIN; a <= SCHAR_MAX; ++a)
  94. for (int b = SCHAR_MIN; b <= SCHAR_MAX; ++b)
  95. assert( midpoint(a, b) == midpoint<int>(a, b) );
  96. }
  97. int main()
  98. {
  99. test01();
  100. }