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 month_weekday_last;
12 
13 // constexpr month_weekday_last
14 //   operator/(const month& m, const weekday_last& wdl) noexcept;
15 // Returns: {m, wdl}.
16 //
17 // constexpr month_weekday_last
18 //   operator/(int m, const weekday_last& wdl) noexcept;
19 // Returns: month(m) / wdl.
20 //
21 // constexpr month_weekday_last
22 //   operator/(const weekday_last& wdl, const month& m) noexcept;
23 // Returns: m / wdl.
24 //
25 // constexpr month_weekday_last
26 //   operator/(const weekday_last& wdl, int m) noexcept;
27 // Returns: month(m) / wdl.
28 
29 
30 
31 
32 #include <chrono>
33 #include <type_traits>
34 #include <cassert>
35 
36 #include "test_macros.h"
37 
main(int,char **)38 int main(int, char**)
39 {
40     using month_weekday      = std::chrono::month_weekday;
41     using month              = std::chrono::month;
42     using weekday            = std::chrono::weekday;
43     using weekday_last       = std::chrono::weekday_last;
44     using month_weekday_last = std::chrono::month_weekday_last;
45 
46     constexpr weekday Tuesday = std::chrono::Tuesday;
47     constexpr month February = std::chrono::February;
48     constexpr std::chrono::last_spec last = std::chrono::last;
49 
50     { // operator/(const month& m, const weekday_last& wdi) (and switched)
51         ASSERT_NOEXCEPT (February/Tuesday[last]);
52         ASSERT_SAME_TYPE(month_weekday_last, decltype(February/Tuesday[last]));
53         ASSERT_NOEXCEPT (Tuesday[last]/February);
54         ASSERT_SAME_TYPE(month_weekday_last, decltype(Tuesday[last]/February));
55 
56     //  Run the example
57         {
58         constexpr month_weekday_last wdi = February/Tuesday[last];
59         static_assert(wdi.month()        == February,      "");
60         static_assert(wdi.weekday_last() == Tuesday[last], "");
61         }
62 
63         for (int i = 1; i <= 12; ++i)
64             for (unsigned j = 0; j <= 6; ++j)
65             {
66                 month m(i);
67                 weekday_last wdi = weekday{j}[last];
68                 month_weekday_last mwd1 = m/wdi;
69                 month_weekday_last mwd2 = wdi/m;
70                 assert(mwd1.month() == m);
71                 assert(mwd1.weekday_last() == wdi);
72                 assert(mwd2.month() == m);
73                 assert(mwd2.weekday_last() == wdi);
74                 assert(mwd1 == mwd2);
75             }
76     }
77 
78 
79     { // operator/(int m, const weekday_last& wdi) (and switched)
80         ASSERT_NOEXCEPT (2/Tuesday[2]);
81         ASSERT_SAME_TYPE(month_weekday_last, decltype(2/Tuesday[last]));
82         ASSERT_NOEXCEPT (Tuesday[2]/2);
83         ASSERT_SAME_TYPE(month_weekday_last, decltype(Tuesday[last]/2));
84 
85     //  Run the example
86         {
87         constexpr month_weekday wdi = 2/Tuesday[3];
88         static_assert(wdi.month()           == February,   "");
89         static_assert(wdi.weekday_indexed() == Tuesday[3], "");
90         }
91 
92         for (int i = 1; i <= 12; ++i)
93             for (unsigned j = 0; j <= 6; ++j)
94             {
95                 weekday_last wdi = weekday{j}[last];
96                 month_weekday_last mwd1 = i/wdi;
97                 month_weekday_last mwd2 = wdi/i;
98                 assert(mwd1.month() == month(i));
99                 assert(mwd1.weekday_last() == wdi);
100                 assert(mwd2.month() == month(i));
101                 assert(mwd2.weekday_last() == wdi);
102                 assert(mwd1 == mwd2);
103             }
104     }
105 
106   return 0;
107 }
108