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