[libcxx-commits] [libcxx] [libc++][chrono] Adds year_month_day_last&::operator<=>. (PR #98169)
Mark de Wever via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jul 10 01:02:45 PDT 2024
https://github.com/mordante updated https://github.com/llvm/llvm-project/pull/98169
>From 6d624bfb7c37d807cca3d272372517c8afc6603a Mon Sep 17 00:00:00 2001
From: Mark de Wever <koraq at xs4all.nl>
Date: Thu, 9 May 2024 20:54:47 +0200
Subject: [PATCH] [libc++][chrono] Adds year_month_day_last&::operator<=>.
41f7bb9975bcaffae0267fa87b63c90b83ffd551 claimed it implemented this
change but the code was not adjusted. The other spaceship operators in the
calendar code have been validated too.
Implements parts of
- P1614R2 The Mothership has Landed
---
libcxx/include/__chrono/year_month_day.h | 32 +----
libcxx/modules/std/chrono.inc | 1 -
.../comparisons.pass.cpp | 127 +++++++++---------
3 files changed, 65 insertions(+), 95 deletions(-)
diff --git a/libcxx/include/__chrono/year_month_day.h b/libcxx/include/__chrono/year_month_day.h
index 75884f3654d87..b06c0be03e0de 100644
--- a/libcxx/include/__chrono/year_month_day.h
+++ b/libcxx/include/__chrono/year_month_day.h
@@ -239,33 +239,11 @@ operator==(const year_month_day_last& __lhs, const year_month_day_last& __rhs) n
return __lhs.year() == __rhs.year() && __lhs.month_day_last() == __rhs.month_day_last();
}
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool
-operator!=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept {
- return !(__lhs == __rhs);
-}
-
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool
-operator<(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept {
- if (__lhs.year() < __rhs.year())
- return true;
- if (__lhs.year() > __rhs.year())
- return false;
- return __lhs.month_day_last() < __rhs.month_day_last();
-}
-
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool
-operator>(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept {
- return __rhs < __lhs;
-}
-
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool
-operator<=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept {
- return !(__rhs < __lhs);
-}
-
-_LIBCPP_HIDE_FROM_ABI inline constexpr bool
-operator>=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept {
- return !(__lhs < __rhs);
+_LIBCPP_HIDE_FROM_ABI inline constexpr strong_ordering
+operator<=>(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept {
+ if (auto __c = __lhs.year() <=> __rhs.year(); __c != 0)
+ return __c;
+ return __lhs.month_day_last() <=> __rhs.month_day_last();
}
_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last operator/(const year_month& __lhs, last_spec) noexcept {
diff --git a/libcxx/modules/std/chrono.inc b/libcxx/modules/std/chrono.inc
index 87e32afbe4bdc..9d7e7dbbacf8a 100644
--- a/libcxx/modules/std/chrono.inc
+++ b/libcxx/modules/std/chrono.inc
@@ -37,7 +37,6 @@ export namespace std {
// [time.duration.comparisons], duration comparisons
using std::chrono::operator==;
- using std::chrono::operator!=;
using std::chrono::operator<;
using std::chrono::operator>;
using std::chrono::operator<=;
diff --git a/libcxx/test/std/time/time.cal/time.cal.ymdlast/time.cal.ymdlast.nonmembers/comparisons.pass.cpp b/libcxx/test/std/time/time.cal/time.cal.ymdlast/time.cal.ymdlast.nonmembers/comparisons.pass.cpp
index 45d7e51fbe718..e28b6d8609bc4 100644
--- a/libcxx/test/std/time/time.cal/time.cal.ymdlast/time.cal.ymdlast.nonmembers/comparisons.pass.cpp
+++ b/libcxx/test/std/time/time.cal/time.cal.ymdlast/time.cal.ymdlast.nonmembers/comparisons.pass.cpp
@@ -5,19 +5,14 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
-// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
// <chrono>
// class year_month_day_last;
// constexpr bool operator==(const year_month_day_last& x, const year_month_day_last& y) noexcept;
-// Returns: x.year() == y.year() && x.month_day_last() == y.month_day_last().
-//
-// constexpr bool operator< (const year_month_day_last& x, const year_month_day_last& y) noexcept;
-// Returns:
-// If x.year() < y.year(), returns true.
-// Otherwise, if x.year() > y.year(), returns false.
-// Otherwise, returns x.month_day_last() < y.month_day_last()
+// constexpr bool operator<=>(const year_month_day_last& x, const year_month_day_last& y) noexcept;
#include <chrono>
#include <type_traits>
@@ -26,63 +21,61 @@
#include "test_macros.h"
#include "test_comparisons.h"
-int main(int, char**)
-{
- using year = std::chrono::year;
- using month = std::chrono::month;
- using month_day_last = std::chrono::month_day_last;
- using year_month_day_last = std::chrono::year_month_day_last;
-
- AssertComparisonsAreNoexcept<year_month_day_last>();
- AssertComparisonsReturnBool<year_month_day_last>();
-
- constexpr month January = std::chrono::January;
- constexpr month February = std::chrono::February;
-
- static_assert( testComparisons(
- year_month_day_last{year{1234}, month_day_last{January}},
- year_month_day_last{year{1234}, month_day_last{January}},
- true, false), "");
-
- // different month
- static_assert( testComparisons(
- year_month_day_last{year{1234}, month_day_last{January}},
- year_month_day_last{year{1234}, month_day_last{February}},
- false, true), "");
-
- // different year
- static_assert( testComparisons(
- year_month_day_last{year{1234}, month_day_last{January}},
- year_month_day_last{year{1235}, month_day_last{January}},
- false, true), "");
-
- // different month
- static_assert( testComparisons(
- year_month_day_last{year{1234}, month_day_last{January}},
- year_month_day_last{year{1234}, month_day_last{February}},
- false, true), "");
-
- // different year and month
- static_assert( testComparisons(
- year_month_day_last{year{1234}, month_day_last{February}},
- year_month_day_last{year{1235}, month_day_last{January}},
- false, true), "");
-
- // same year, different months
- for (unsigned i = 1; i < 12; ++i)
- for (unsigned j = 1; j < 12; ++j)
- assert((testComparisons(
- year_month_day_last{year{1234}, month_day_last{month{i}}},
- year_month_day_last{year{1234}, month_day_last{month{j}}},
- i == j, i < j )));
-
- // same month, different years
- for (int i = 1000; i < 2000; ++i)
- for (int j = 1000; j < 2000; ++j)
- assert((testComparisons(
- year_month_day_last{year{i}, month_day_last{January}},
- year_month_day_last{year{j}, month_day_last{January}},
- i == j, i < j )));
-
- return 0;
+constexpr bool test() {
+ using year = std::chrono::year;
+ using month = std::chrono::month;
+ using month_day_last = std::chrono::month_day_last;
+ using year_month_day_last = std::chrono::year_month_day_last;
+
+ constexpr month January = std::chrono::January;
+ constexpr month February = std::chrono::February;
+
+ assert(testOrder(year_month_day_last{year{1234}, month_day_last{January}},
+ year_month_day_last{year{1234}, month_day_last{January}},
+ std::strong_ordering::equal));
+
+ // different month
+ assert(testOrder(year_month_day_last{year{1234}, month_day_last{January}},
+ year_month_day_last{year{1234}, month_day_last{February}},
+ std::strong_ordering::less));
+
+ // different year
+ assert(testOrder(year_month_day_last{year{1234}, month_day_last{January}},
+ year_month_day_last{year{1235}, month_day_last{January}},
+ std::strong_ordering::less));
+
+ // different year and month
+ assert(testOrder(year_month_day_last{year{1234}, month_day_last{February}},
+ year_month_day_last{year{1235}, month_day_last{January}},
+ std::strong_ordering::less));
+
+ // same year, different months
+ for (unsigned i = 1; i < 12; ++i)
+ for (unsigned j = 1; j < 12; ++j)
+ assert((testOrder(year_month_day_last{year{1234}, month_day_last{month{i}}},
+ year_month_day_last{year{1234}, month_day_last{month{j}}},
+ i == j ? std::strong_ordering::equal
+ : i < j ? std::strong_ordering::less
+ : std::strong_ordering::greater)));
+
+ // same month, different years
+ for (int i = 1000; i < 20; ++i)
+ for (int j = 1000; j < 20; ++j)
+ assert((testOrder(year_month_day_last{year{i}, month_day_last{January}},
+ year_month_day_last{year{j}, month_day_last{January}},
+ i == j ? std::strong_ordering::equal
+ : i < j ? std::strong_ordering::less
+ : std::strong_ordering::greater)));
+ return true;
+}
+
+int main(int, char**) {
+ using year_month_day_last = std::chrono::year_month_day_last;
+ AssertOrderAreNoexcept<year_month_day_last>();
+ AssertOrderReturn<std::strong_ordering, year_month_day_last>();
+
+ test();
+ static_assert(test());
+
+ return 0;
}
More information about the libcxx-commits
mailing list