From 24e1151d23ba3b6b72461498ababb8b0821422ae Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Wed, 17 Apr 2024 21:00:22 +0200 Subject: [libc++][TZDB] Implements zoned_time's operator==. Implements parts of: - P0355 Extending to chrono Calendars and Time Zones - P1614R2 The Mothership has Landed --- libcxx/docs/Status/SpaceshipProjects.csv | 4 +- libcxx/include/__chrono/zoned_time.h | 6 ++ libcxx/include/chrono | 4 ++ .../time.zone.zonedtime.nonmembers/eq.pass.cpp | 71 ++++++++++++++++++++++ 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 libcxx/test/std/time/time.zone/time.zone.zonedtime/time.zone.zonedtime.nonmembers/eq.pass.cpp diff --git a/libcxx/docs/Status/SpaceshipProjects.csv b/libcxx/docs/Status/SpaceshipProjects.csv index 128b23b..74441dc 100644 --- a/libcxx/docs/Status/SpaceshipProjects.csv +++ b/libcxx/docs/Status/SpaceshipProjects.csv @@ -140,7 +140,7 @@ Section,Description,Dependencies,Assignee,Complete "| `[class.slice.overview] `_ | `[slice.ops] `_",| `slice `_,None,Hristo Hristov,|Complete| - `5.12 Clause 27: Time library `_,,,, -| `[time.syn] `_,|,None,Mark de Wever,|In Progress| +| `[time.syn] `_,|,None,Mark de Wever,|Complete| | `[time.duration.comparisons] `_, `chrono::duration `_, None, Hristo Hristov, |Complete| | `[time.point.comparisons] `_, `chrono::time_point `_, None, Hristo Hristov, |Complete| "| `[time.cal.day.nonmembers] `_ @@ -172,7 +172,7 @@ Section,Description,Dependencies,Assignee,Complete | `year_month_weekday `_ | `year_month_weekday_last `_",None,Hristo Hristov,|Complete| `[time.zone.nonmembers] `_,"`chrono::time_zone`",,Mark de Wever,|Complete| -`[time.zone.zonedtime.nonmembers] `_,"`chrono::zoned_time`",A ```` implementation,Mark de Wever,|In Progress| +`[time.zone.zonedtime.nonmembers] `_,"`chrono::zoned_time`",,Mark de Wever,|Complete| `[time.zone.leap.nonmembers] `_,"`chrono::time_leap_seconds`",,Mark de Wever,|Complete| `[time.zone.link.nonmembers] `_,"`chrono::time_zone_link`",,Mark de Wever,|Complete| - `5.13 Clause 28: Localization library `_,,,, diff --git a/libcxx/include/__chrono/zoned_time.h b/libcxx/include/__chrono/zoned_time.h index 7a13c4e..9be206d 100644 --- a/libcxx/include/__chrono/zoned_time.h +++ b/libcxx/include/__chrono/zoned_time.h @@ -205,6 +205,12 @@ template zoned_time(_TimeZonePtrOrName&&, zoned_time<_Duration, TimeZonePtr2>, choose = choose::earliest) -> zoned_time, __time_zone_representation<_TimeZonePtrOrName>>; +template +_LIBCPP_HIDE_FROM_ABI bool +operator==(const zoned_time<_Duration1, _TimeZonePtr>& __lhs, const zoned_time<_Duration2, _TimeZonePtr>& __rhs) { + return __lhs.get_time_zone() == __rhs.get_time_zone() && __lhs.get_sys_time() == __rhs.get_sys_time(); +} + } // namespace chrono # endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) diff --git a/libcxx/include/chrono b/libcxx/include/chrono index f377a57a..68a7fe3 100644 --- a/libcxx/include/chrono +++ b/libcxx/include/chrono @@ -793,6 +793,10 @@ template struct zoned_traits; template // C++20 class zoned_time; +template // C++20 + bool operator==(const zoned_time& x, + const zoned_time& y); + // [time.zone.leap], leap second support class leap_second { // C++20 public: diff --git a/libcxx/test/std/time/time.zone/time.zone.zonedtime/time.zone.zonedtime.nonmembers/eq.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.zonedtime/time.zone.zonedtime.nonmembers/eq.pass.cpp new file mode 100644 index 0000000..2ccb060 --- /dev/null +++ b/libcxx/test/std/time/time.zone/time.zone.zonedtime/time.zone.zonedtime.nonmembers/eq.pass.cpp @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +// REQUIRES: has-unix-headers +// REQUIRES: libcpp-hardening-mode={{extensive|debug}} +// XFAIL: libcpp-hardening-mode=debug && availability-verbose_abort-missing + +// XFAIL: libcpp-has-no-experimental-tzdb + +// + +// template +// bool operator==(const zoned_time& x, +// const zoned_time& y); +// +// Note operator!= is generated by the compiler + +#include + +#include "test_comparisons.h" + +int main(int, char**) { + { + std::chrono::zoned_time zt; + assert(testEquality(zt, zt, true)); + } + { + std::chrono::zoned_time lhs{"UTC"}; + std::chrono::zoned_time rhs{"Europe/Berlin"}; + assert(testEquality(lhs, rhs, false)); + } + { + std::chrono::zoned_time lhs{"UTC", std::chrono::sys_time{std::chrono::seconds{123}}}; + + assert(testEquality(lhs, + std::chrono::zoned_time{ + std::chrono::sys_time{std::chrono::nanoseconds{123'000'000'000}}}, + true)); + assert(testEquality(lhs, + std::chrono::zoned_time{ + std::chrono::sys_time{std::chrono::nanoseconds{123'000'000'001}}}, + false)); + + assert(testEquality(lhs, + std::chrono::zoned_time{ + std::chrono::sys_time{std::chrono::microseconds{123'000'000}}}, + true)); + assert(testEquality(lhs, + std::chrono::zoned_time{ + std::chrono::sys_time{std::chrono::microseconds{123'000'001}}}, + false)); + + assert(testEquality( + lhs, + std::chrono::zoned_time{std::chrono::sys_time{std::chrono::milliseconds{123'000}}}, + true)); + assert(testEquality( + lhs, + std::chrono::zoned_time{std::chrono::sys_time{std::chrono::milliseconds{123'001}}}, + false)); + } + + return 0; +} -- cgit v1.1