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 // UNSUPPORTED: c++03, c++11, c++14, c++17
9
10 // <chrono>
11 // class year_month_day;
12
13 // constexpr year_month_day
14 // operator/(const year_month& ym, const day& d) noexcept;
15 // Returns: {ym.year(), ym.month(), d}.
16 //
17 // constexpr year_month_day
18 // operator/(const year_month& ym, int d) noexcept;
19 // Returns: ym / day(d).
20 //
21 // constexpr year_month_day
22 // operator/(const year& y, const month_day& md) noexcept;
23 // Returns: y / md.month() / md.day().
24 //
25 // constexpr year_month_day
26 // operator/(int y, const month_day& md) noexcept;
27 // Returns: year(y) / md.
28 //
29 // constexpr year_month_day
30 // operator/(const month_day& md, const year& y) noexcept;
31 // Returns: y / md.
32 //
33 // constexpr year_month_day
34 // operator/(const month_day& md, int y) noexcept;
35 // Returns: year(y) / md.
36
37
38 #include <chrono>
39 #include <type_traits>
40 #include <cassert>
41
42 #include "test_macros.h"
43
main(int,char **)44 int main(int, char**)
45 {
46 using year = std::chrono::year;
47 using month = std::chrono::month;
48 using day = std::chrono::day;
49 using year_month = std::chrono::year_month;
50 using month_day = std::chrono::month_day;
51 using year_month_day = std::chrono::year_month_day;
52
53 constexpr month February = std::chrono::February;
54 constexpr year_month Feb2018{year{2018}, February};
55
56 { // operator/(const year_month& ym, const day& d)
57 ASSERT_NOEXCEPT ( Feb2018/day{2});
58 ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/day{2}));
59
60 static_assert((Feb2018/day{2}).month() == February, "");
61 static_assert((Feb2018/day{2}).day() == day{2}, "");
62
63 for (int i = 1000; i < 1010; ++i)
64 for (int j = 1; j <= 12; ++j)
65 for (unsigned k = 0; k <= 28; ++k)
66 {
67 year y(i);
68 month m(j);
69 day d(k);
70 year_month ym(y, m);
71 year_month_day ymd = ym/d;
72 assert(ymd.year() == y);
73 assert(ymd.month() == m);
74 assert(ymd.day() == d);
75 }
76 }
77
78
79 { // operator/(const year_month& ym, int d)
80 ASSERT_NOEXCEPT ( Feb2018/2);
81 ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/2));
82
83 static_assert((Feb2018/2).month() == February, "");
84 static_assert((Feb2018/2).day() == day{2}, "");
85
86 for (int i = 1000; i < 1010; ++i)
87 for (int j = 1; j <= 12; ++j)
88 for (unsigned k = 0; k <= 28; ++k)
89 {
90 year y(i);
91 month m(j);
92 day d(k);
93 year_month ym(y, m);
94 year_month_day ymd = ym/k;
95 assert(ymd.year() == y);
96 assert(ymd.month() == m);
97 assert(ymd.day() == d);
98 }
99 }
100
101
102 { // operator/(const year_month& ym, int d)
103 ASSERT_NOEXCEPT ( Feb2018/2);
104 ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/2));
105
106 static_assert((Feb2018/2).month() == February, "");
107 static_assert((Feb2018/2).day() == day{2}, "");
108
109 for (int i = 1000; i < 1010; ++i)
110 for (int j = 1; j <= 12; ++j)
111 for (unsigned k = 0; k <= 28; ++k)
112 {
113 year y(i);
114 month m(j);
115 day d(k);
116 year_month ym(y, m);
117 year_month_day ymd = ym/k;
118 assert(ymd.year() == y);
119 assert(ymd.month() == m);
120 assert(ymd.day() == d);
121 }
122 }
123
124
125
126
127 { // operator/(const year& y, const month_day& md) (and switched)
128 ASSERT_NOEXCEPT ( year{2018}/month_day{February, day{2}});
129 ASSERT_SAME_TYPE(year_month_day, decltype(year{2018}/month_day{February, day{2}}));
130 ASSERT_NOEXCEPT ( month_day{February, day{2}}/year{2018});
131 ASSERT_SAME_TYPE(year_month_day, decltype(month_day{February, day{2}}/year{2018}));
132
133 static_assert((year{2018}/month_day{February, day{2}}).month() == February, "" );
134 static_assert((year{2018}/month_day{February, day{2}}).day() == day{2}, "" );
135 static_assert((month_day{February, day{2}}/year{2018}).month() == February, "" );
136 static_assert((month_day{February, day{2}}/year{2018}).day() == day{2}, "" );
137
138 for (int i = 1000; i < 1010; ++i)
139 for (int j = 1; j <= 12; ++j)
140 for (unsigned k = 0; k <= 28; ++k)
141 {
142 year y(i);
143 month m(j);
144 day d(k);
145 month_day md(m, d);
146 year_month_day ymd1 = y/md;
147 year_month_day ymd2 = md/y;
148 assert(ymd1.year() == y);
149 assert(ymd2.year() == y);
150 assert(ymd1.month() == m);
151 assert(ymd2.month() == m);
152 assert(ymd1.day() == d);
153 assert(ymd2.day() == d);
154 assert(ymd1 == ymd2);
155 }
156 }
157
158 { // operator/(const month_day& md, int y) (and switched)
159 ASSERT_NOEXCEPT ( 2018/month_day{February, day{2}});
160 ASSERT_SAME_TYPE(year_month_day, decltype(2018/month_day{February, day{2}}));
161 ASSERT_NOEXCEPT ( month_day{February, day{2}}/2018);
162 ASSERT_SAME_TYPE(year_month_day, decltype(month_day{February, day{2}}/2018));
163
164 static_assert((2018/month_day{February, day{2}}).month() == February, "" );
165 static_assert((2018/month_day{February, day{2}}).day() == day{2}, "" );
166 static_assert((month_day{February, day{2}}/2018).month() == February, "" );
167 static_assert((month_day{February, day{2}}/2018).day() == day{2}, "" );
168
169 for (int i = 1000; i < 1010; ++i)
170 for (int j = 1; j <= 12; ++j)
171 for (unsigned k = 0; k <= 28; ++k)
172 {
173 year y(i);
174 month m(j);
175 day d(k);
176 month_day md(m, d);
177 year_month_day ymd1 = i/md;
178 year_month_day ymd2 = md/i;
179 assert(ymd1.year() == y);
180 assert(ymd2.year() == y);
181 assert(ymd1.month() == m);
182 assert(ymd2.month() == m);
183 assert(ymd1.day() == d);
184 assert(ymd2.day() == d);
185 assert(ymd1 == ymd2);
186 }
187 }
188
189
190 return 0;
191 }
192