Skip to content

Commit 24e1151

Browse files
committed
[libc++][TZDB] Implements zoned_time's operator==.
Implements parts of: - P0355 Extending to chrono Calendars and Time Zones - P1614R2 The Mothership has Landed
1 parent 072f456 commit 24e1151

File tree

4 files changed

+83
-2
lines changed

4 files changed

+83
-2
lines changed

libcxx/docs/Status/SpaceshipProjects.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ Section,Description,Dependencies,Assignee,Complete
140140
"| `[class.slice.overview] <https://wg21.link/class.slice.overview>`_
141141
| `[slice.ops] <https://wg21.link/slice.ops>`_",| `slice <https://reviews.llvm.org/D152617>`_,None,Hristo Hristov,|Complete|
142142
- `5.12 Clause 27: Time library <https://wg21.link/p1614r2#clause-27-time-library>`_,,,,
143-
| `[time.syn] <https://wg21.link/time.syn>`_,|,None,Mark de Wever,|In Progress|
143+
| `[time.syn] <https://wg21.link/time.syn>`_,|,None,Mark de Wever,|Complete|
144144
| `[time.duration.comparisons] <https://wg21.link/time.duration.comparisons>`_, `chrono::duration <https://reviews.llvm.org/D145881>`_, None, Hristo Hristov, |Complete|
145145
| `[time.point.comparisons] <https://wg21.link/time.point.comparisons>`_, `chrono::time_point <https://reviews.llvm.org/D146250>`_, None, Hristo Hristov, |Complete|
146146
"| `[time.cal.day.nonmembers] <https://wg21.link/time.cal.day.nonmembers>`_
@@ -172,7 +172,7 @@ Section,Description,Dependencies,Assignee,Complete
172172
| `year_month_weekday <https://reviews.llvm.org/D152699>`_
173173
| `year_month_weekday_last <https://reviews.llvm.org/D152699>`_",None,Hristo Hristov,|Complete|
174174
`[time.zone.nonmembers] <https://wg21.link/time.zone.nonmembers>`_,"`chrono::time_zone`",,Mark de Wever,|Complete|
175-
`[time.zone.zonedtime.nonmembers] <https://wg21.link/time.zone.zonedtime.nonmembers>`_,"`chrono::zoned_time`",A ``<chrono>`` implementation,Mark de Wever,|In Progress|
175+
`[time.zone.zonedtime.nonmembers] <https://wg21.link/time.zone.zonedtime.nonmembers>`_,"`chrono::zoned_time`",,Mark de Wever,|Complete|
176176
`[time.zone.leap.nonmembers] <https://wg21.link/time.zone.leap.nonmembers>`_,"`chrono::time_leap_seconds`",,Mark de Wever,|Complete|
177177
`[time.zone.link.nonmembers] <https://wg21.link/time.zone.link.nonmembers>`_,"`chrono::time_zone_link`",,Mark de Wever,|Complete|
178178
- `5.13 Clause 28: Localization library <https://wg21.link/p1614r2#clause-28-localization-library>`_,,,,

libcxx/include/__chrono/zoned_time.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ template <class _Duration, class _TimeZonePtrOrName, class TimeZonePtr2>
205205
zoned_time(_TimeZonePtrOrName&&, zoned_time<_Duration, TimeZonePtr2>, choose = choose::earliest)
206206
-> zoned_time<common_type_t<_Duration, seconds>, __time_zone_representation<_TimeZonePtrOrName>>;
207207

208+
template <class _Duration1, class _Duration2, class _TimeZonePtr>
209+
_LIBCPP_HIDE_FROM_ABI bool
210+
operator==(const zoned_time<_Duration1, _TimeZonePtr>& __lhs, const zoned_time<_Duration2, _TimeZonePtr>& __rhs) {
211+
return __lhs.get_time_zone() == __rhs.get_time_zone() && __lhs.get_sys_time() == __rhs.get_sys_time();
212+
}
213+
208214
} // namespace chrono
209215

210216
# endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM)

libcxx/include/chrono

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,10 @@ template<class T> struct zoned_traits;
793793
template<class Duration, class TimeZonePtr = const time_zone*> // C++20
794794
class zoned_time;
795795
796+
template<class Duration1, class Duration2, class TimeZonePtr> // C++20
797+
bool operator==(const zoned_time<Duration1, TimeZonePtr>& x,
798+
const zoned_time<Duration2, TimeZonePtr>& y);
799+
796800
// [time.zone.leap], leap second support
797801
class leap_second { // C++20
798802
public:
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17
10+
11+
// REQUIRES: has-unix-headers
12+
// REQUIRES: libcpp-hardening-mode={{extensive|debug}}
13+
// XFAIL: libcpp-hardening-mode=debug && availability-verbose_abort-missing
14+
15+
// XFAIL: libcpp-has-no-experimental-tzdb
16+
17+
// <chrono>
18+
19+
// template<class Duration1, class Duration2, class TimeZonePtr>
20+
// bool operator==(const zoned_time<Duration1, TimeZonePtr>& x,
21+
// const zoned_time<Duration2, TimeZonePtr>& y);
22+
//
23+
// Note operator!= is generated by the compiler
24+
25+
#include <chrono>
26+
27+
#include "test_comparisons.h"
28+
29+
int main(int, char**) {
30+
{
31+
std::chrono::zoned_time zt;
32+
assert(testEquality(zt, zt, true));
33+
}
34+
{
35+
std::chrono::zoned_time lhs{"UTC"};
36+
std::chrono::zoned_time rhs{"Europe/Berlin"};
37+
assert(testEquality(lhs, rhs, false));
38+
}
39+
{
40+
std::chrono::zoned_time lhs{"UTC", std::chrono::sys_time<std::chrono::seconds>{std::chrono::seconds{123}}};
41+
42+
assert(testEquality(lhs,
43+
std::chrono::zoned_time{
44+
std::chrono::sys_time<std::chrono::nanoseconds>{std::chrono::nanoseconds{123'000'000'000}}},
45+
true));
46+
assert(testEquality(lhs,
47+
std::chrono::zoned_time{
48+
std::chrono::sys_time<std::chrono::nanoseconds>{std::chrono::nanoseconds{123'000'000'001}}},
49+
false));
50+
51+
assert(testEquality(lhs,
52+
std::chrono::zoned_time{
53+
std::chrono::sys_time<std::chrono::microseconds>{std::chrono::microseconds{123'000'000}}},
54+
true));
55+
assert(testEquality(lhs,
56+
std::chrono::zoned_time{
57+
std::chrono::sys_time<std::chrono::microseconds>{std::chrono::microseconds{123'000'001}}},
58+
false));
59+
60+
assert(testEquality(
61+
lhs,
62+
std::chrono::zoned_time{std::chrono::sys_time<std::chrono::milliseconds>{std::chrono::milliseconds{123'000}}},
63+
true));
64+
assert(testEquality(
65+
lhs,
66+
std::chrono::zoned_time{std::chrono::sys_time<std::chrono::milliseconds>{std::chrono::milliseconds{123'001}}},
67+
false));
68+
}
69+
70+
return 0;
71+
}

0 commit comments

Comments
 (0)