Skip to content

Commit a17e97e

Browse files
maflckoMarcoFalkeZingam
authored
[libc++] Add missing C++20 [time.point.arithmetic] (#143165)
This was part of https://wg21.link/p0355r7, but apparently never implemented. --------- Co-authored-by: MarcoFalke <*~=`'#}+{/-|&$^[email protected]> Co-authored-by: Hristo Hristov <[email protected]>
1 parent c2cb571 commit a17e97e

File tree

6 files changed

+158
-0
lines changed

6 files changed

+158
-0
lines changed

libcxx/include/__chrono/time_point.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ class time_point {
5858

5959
// arithmetic
6060

61+
#if _LIBCPP_STD_VER >= 20
62+
_LIBCPP_HIDE_FROM_ABI constexpr time_point& operator++() {
63+
++__d_;
64+
return *this;
65+
}
66+
_LIBCPP_HIDE_FROM_ABI constexpr time_point operator++(int) { return time_point{__d_++}; }
67+
_LIBCPP_HIDE_FROM_ABI constexpr time_point& operator--() {
68+
--__d_;
69+
return *this;
70+
}
71+
_LIBCPP_HIDE_FROM_ABI constexpr time_point operator--(int) { return time_point{__d_--}; }
72+
#endif // _LIBCPP_STD_VER >= 20
73+
6174
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 time_point& operator+=(const duration& __d) {
6275
__d_ += __d;
6376
return *this;

libcxx/include/chrono

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ public:
132132
133133
// arithmetic
134134
135+
constexpr time_point& operator++(); // C++20
136+
constexpr time_point operator++(int); // C++20
137+
constexpr time_point& operator--(); // C++20
138+
constexpr time_point operator--(int); // C++20
139+
135140
time_point& operator+=(const duration& d); // constexpr in C++17
136141
time_point& operator-=(const duration& d); // constexpr in C++17
137142
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
// REQUIRES: std-at-least-c++20
9+
10+
// <chrono>
11+
12+
// time_point
13+
14+
// constexpr time_point& operator++();
15+
16+
#include <cassert>
17+
#include <chrono>
18+
19+
#include "test_macros.h"
20+
21+
constexpr bool test() {
22+
using Clock = std::chrono::system_clock;
23+
using Duration = std::chrono::milliseconds;
24+
std::chrono::time_point<Clock, Duration> t{Duration{5}};
25+
std::chrono::time_point<Clock, Duration>& tref{++t};
26+
assert(&tref == &t);
27+
assert(tref.time_since_epoch() == Duration{6});
28+
return true;
29+
}
30+
31+
int main(int, char**) {
32+
test();
33+
static_assert(test());
34+
return 0;
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
// REQUIRES: std-at-least-c++20
9+
10+
// <chrono>
11+
12+
// time_point
13+
14+
// constexpr time_point operator++(int);
15+
16+
#include <cassert>
17+
#include <chrono>
18+
19+
#include "test_macros.h"
20+
21+
constexpr bool test() {
22+
using Clock = std::chrono::system_clock;
23+
using Duration = std::chrono::milliseconds;
24+
std::chrono::time_point<Clock, Duration> t1{Duration{3}};
25+
std::chrono::time_point<Clock, Duration> t2{t1++};
26+
assert(t1.time_since_epoch() == Duration{4});
27+
assert(t2.time_since_epoch() == Duration{3});
28+
return true;
29+
}
30+
31+
int main(int, char**) {
32+
test();
33+
static_assert(test());
34+
return 0;
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
// REQUIRES: std-at-least-c++20
9+
10+
// <chrono>
11+
12+
// time_point
13+
14+
// constexpr time_point& operator--();
15+
16+
#include <cassert>
17+
#include <chrono>
18+
19+
#include "test_macros.h"
20+
21+
constexpr bool test() {
22+
using Clock = std::chrono::system_clock;
23+
using Duration = std::chrono::milliseconds;
24+
std::chrono::time_point<Clock, Duration> t{Duration{5}};
25+
std::chrono::time_point<Clock, Duration>& tref{--t};
26+
assert(&tref == &t);
27+
assert(tref.time_since_epoch() == Duration{4});
28+
return true;
29+
}
30+
31+
int main(int, char**) {
32+
test();
33+
static_assert(test());
34+
return 0;
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
// REQUIRES: std-at-least-c++20
9+
10+
// <chrono>
11+
12+
// time_point
13+
14+
// constexpr time_point operator--(int);
15+
16+
#include <cassert>
17+
#include <chrono>
18+
19+
#include "test_macros.h"
20+
21+
constexpr bool test() {
22+
using Clock = std::chrono::system_clock;
23+
using Duration = std::chrono::milliseconds;
24+
std::chrono::time_point<Clock, Duration> t1{Duration{3}};
25+
std::chrono::time_point<Clock, Duration> t2{t1--};
26+
assert(t1.time_since_epoch() == Duration{2});
27+
assert(t2.time_since_epoch() == Duration{3});
28+
return true;
29+
}
30+
31+
int main(int, char**) {
32+
test();
33+
static_assert(test());
34+
return 0;
35+
}

0 commit comments

Comments
 (0)