From fd36a3d48d0554930db0381286f4cad3e9c7c1ea Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Sun, 26 Jun 2022 10:58:02 +0200 Subject: [PATCH] [libc++][chrono] Adds operator<=> for day. Since the calendar classes were introduced in C++20 there's no need to keep the old comparison operators. This commit does the day calender class, the other calendar classes will be in a followup commit. Implements parts of: - P1614R2 The mothership has landed Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D128603 --- libcxx/include/__chrono/day.h | 23 ++--------- libcxx/include/chrono | 12 +++--- .../comparisons.pass.cpp | 38 +++++++++++-------- 3 files changed, 32 insertions(+), 41 deletions(-) diff --git a/libcxx/include/__chrono/day.h b/libcxx/include/__chrono/day.h index 7e425558e359f..d9fa4ffbc45e9 100644 --- a/libcxx/include/__chrono/day.h +++ b/libcxx/include/__chrono/day.h @@ -12,6 +12,7 @@ #include <__chrono/duration.h> #include <__config> +#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -45,25 +46,9 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr bool operator==(const day& __lhs, const day& __rhs) noexcept { return static_cast(__lhs) == static_cast(__rhs); } -_LIBCPP_HIDE_FROM_ABI inline constexpr -bool operator!=(const day& __lhs, const day& __rhs) noexcept -{ return !(__lhs == __rhs); } - -_LIBCPP_HIDE_FROM_ABI inline constexpr -bool operator< (const day& __lhs, const day& __rhs) noexcept -{ return static_cast(__lhs) < static_cast(__rhs); } - -_LIBCPP_HIDE_FROM_ABI inline constexpr -bool operator> (const day& __lhs, const day& __rhs) noexcept -{ return __rhs < __lhs; } - -_LIBCPP_HIDE_FROM_ABI inline constexpr -bool operator<=(const day& __lhs, const day& __rhs) noexcept -{ return !(__rhs < __lhs);} - -_LIBCPP_HIDE_FROM_ABI inline constexpr -bool operator>=(const day& __lhs, const day& __rhs) noexcept -{ return !(__lhs < __rhs); } +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const day& __lhs, const day& __rhs) noexcept { + return static_cast(__lhs) <=> static_cast(__rhs); +} _LIBCPP_HIDE_FROM_ABI inline constexpr day operator+ (const day& __lhs, const days& __rhs) noexcept diff --git a/libcxx/include/chrono b/libcxx/include/chrono index 9185d74c09c41..2af5fbcc51651 100644 --- a/libcxx/include/chrono +++ b/libcxx/include/chrono @@ -13,6 +13,8 @@ /* chrono synopsis +#include // C++20 + namespace std { namespace chrono @@ -325,11 +327,7 @@ struct last_spec; class day; constexpr bool operator==(const day& x, const day& y) noexcept; -constexpr bool operator!=(const day& x, const day& y) noexcept; -constexpr bool operator< (const day& x, const day& y) noexcept; -constexpr bool operator> (const day& x, const day& y) noexcept; -constexpr bool operator<=(const day& x, const day& y) noexcept; -constexpr bool operator>=(const day& x, const day& y) noexcept; +constexpr strong_ordering operator<=>(const day& x, const day& y) noexcept; constexpr day operator+(const day& x, const days& y) noexcept; constexpr day operator+(const days& x, const day& y) noexcept; constexpr day operator-(const day& x, const days& y) noexcept; @@ -715,9 +713,11 @@ constexpr chrono::year operator ""y(unsigned lo #include <__chrono/year_month_day.h> #include <__chrono/year_month_weekday.h> #include <__config> -#include #include +// standard-mandated includes +#include + #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif diff --git a/libcxx/test/std/time/time.cal/time.cal.day/time.cal.day.nonmembers/comparisons.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.day/time.cal.day.nonmembers/comparisons.pass.cpp index 1b5b712095ce7..959565a0a55a6 100644 --- a/libcxx/test/std/time/time.cal/time.cal.day/time.cal.day.nonmembers/comparisons.pass.cpp +++ b/libcxx/test/std/time/time.cal/time.cal.day/time.cal.day.nonmembers/comparisons.pass.cpp @@ -12,9 +12,8 @@ // constexpr bool operator==(const day& x, const day& y) noexcept; // Returns: unsigned{x} == unsigned{y}. -// constexpr bool operator<(const day& x, const day& y) noexcept; -// Returns: unsigned{x} < unsigned{y}. - +// constexpr strong_ordering operator<=>(const day& x, const day& y) noexcept; +// Returns: unsigned{x} <=> unsigned{y}. #include #include @@ -23,23 +22,30 @@ #include "test_macros.h" #include "test_comparisons.h" -int main(int, char**) -{ - using day = std::chrono::day; +constexpr bool test() { + using day = std::chrono::day; + + // Validate invalid values. The range [0, 255] is guaranteed to be allowed. + assert(testOrderValues(0U, 0U)); + assert(testOrderValues(0U, 1U)); + assert(testOrderValues(254U, 255U)); + assert(testOrderValues(255U, 255U)); - AssertComparisonsAreNoexcept(); - AssertComparisonsReturnBool(); + // Validate some valid values. + for (unsigned i = 1; i < 10; ++i) + for (unsigned j = 1; j < 10; ++j) + assert(testOrderValues(i, j)); - static_assert(testComparisonsValues(0U, 0U), ""); - static_assert(testComparisonsValues(0U, 1U), ""); + return true; +} - // Some 'ok' values as well - static_assert(testComparisonsValues( 5U, 5U), ""); - static_assert(testComparisonsValues( 5U, 10U), ""); +int main(int, char**) { + using day = std::chrono::day; + AssertOrderAreNoexcept(); + AssertOrderReturn(); - for (unsigned i = 1; i < 10; ++i) - for (unsigned j = 1; j < 10; ++j) - assert(testComparisonsValues(i, j)); + test(); + static_assert(test()); return 0; }