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_weekday; 12 13 // constexpr year_month_weekday 14 // operator/(const year_month& ym, const weekday_indexed& wdi) noexcept; 15 // Returns: {ym.year(), ym.month(), wdi}. 16 // 17 // constexpr year_month_weekday 18 // operator/(const year& y, const month_weekday& mwd) noexcept; 19 // Returns: {y, mwd.month(), mwd.weekday_indexed()}. 20 // 21 // constexpr year_month_weekday 22 // operator/(int y, const month_weekday& mwd) noexcept; 23 // Returns: year(y) / mwd. 24 // 25 // constexpr year_month_weekday 26 // operator/(const month_weekday& mwd, const year& y) noexcept; 27 // Returns: y / mwd. 28 // 29 // constexpr year_month_weekday 30 // operator/(const month_weekday& mwd, int y) noexcept; 31 // Returns: year(y) / mwd. 32 33 #include <chrono> 34 #include <type_traits> 35 #include <cassert> 36 37 #include "test_macros.h" 38 39 int main(int, char**) 40 { 41 using year = std::chrono::year; 42 using year_month = std::chrono::year_month; 43 using month_weekday = std::chrono::month_weekday; 44 using year_month_weekday = std::chrono::year_month_weekday; 45 using month = std::chrono::month; 46 using weekday = std::chrono::weekday; 47 using weekday = std::chrono::weekday; 48 using weekday_indexed = std::chrono::weekday_indexed; 49 50 constexpr weekday Tuesday = std::chrono::Tuesday; 51 constexpr month February = std::chrono::February; 52 53 54 { // operator/(const year_month& ym, const weekday_indexed& wdi) 55 constexpr year_month Feb2018{year{2018}, February}; 56 57 ASSERT_NOEXCEPT ( Feb2018/weekday_indexed{Tuesday, 2}); 58 ASSERT_SAME_TYPE(year_month_weekday, decltype(Feb2018/weekday_indexed{Tuesday, 2})); 59 60 static_assert((Feb2018/weekday_indexed{Tuesday, 2}).year() == year{2018}, "" ); 61 static_assert((Feb2018/weekday_indexed{Tuesday, 2}).month() == February, "" ); 62 static_assert((Feb2018/weekday_indexed{Tuesday, 2}).weekday() == Tuesday, "" ); 63 64 for (int i = 1000; i < 1010; ++i) 65 for (int j = 1; j <= 12; ++j) 66 for (unsigned k = 0; k <= 6; ++k) 67 for (unsigned l = 1; l <= 5; ++l) 68 { 69 year y(i); 70 month m(j); 71 weekday wd{k}; 72 year_month_weekday ymd = year_month{y,m}/weekday_indexed{wd,l}; 73 assert(ymd.year() == y); 74 assert(ymd.month() == m); 75 assert(ymd.weekday() == wd); 76 } 77 } 78 79 { // operator/(const year& y, const month_weekday& mwd) (and switched) 80 constexpr month_weekday Feb1stTues{February, weekday_indexed{Tuesday, 1}}; 81 ASSERT_NOEXCEPT ( year{2018}/Feb1stTues); 82 ASSERT_SAME_TYPE(year_month_weekday, decltype(year{2018}/Feb1stTues)); 83 ASSERT_NOEXCEPT ( Feb1stTues/year{2018}); 84 ASSERT_SAME_TYPE(year_month_weekday, decltype(Feb1stTues/year{2018})); 85 86 static_assert((year{2018}/Feb1stTues).year() == year{2018}, "" ); 87 static_assert((year{2018}/Feb1stTues).month() == February, "" ); 88 static_assert((year{2018}/Feb1stTues).weekday() == Tuesday, "" ); 89 90 for (int i = 1000; i < 1010; ++i) 91 for (int j = 1; j <= 12; ++j) 92 for (unsigned k = 0; k <= 6; ++k) 93 for (unsigned l = 1; l <= 5; ++l) 94 { 95 year y(i); 96 month m(j); 97 weekday wd{k}; 98 month_weekday mwd{m, weekday_indexed{weekday{k}, l}}; 99 year_month_weekday ymd1 = y/mwd; 100 year_month_weekday ymd2 = mwd/y; 101 assert(ymd1.year() == y); 102 assert(ymd2.year() == y); 103 assert(ymd1.month() == m); 104 assert(ymd2.month() == m); 105 assert(ymd1.weekday() == wd); 106 assert(ymd2.weekday() == wd); 107 assert(ymd1 == ymd2); 108 } 109 } 110 111 112 { // operator/(int y, const month_weekday& mwd) (and switched) 113 constexpr month_weekday Feb1stTues{February, weekday_indexed{Tuesday, 1}}; 114 ASSERT_NOEXCEPT ( 2018/Feb1stTues); 115 ASSERT_SAME_TYPE(year_month_weekday, decltype(2018/Feb1stTues)); 116 ASSERT_NOEXCEPT ( Feb1stTues/2018); 117 ASSERT_SAME_TYPE(year_month_weekday, decltype(Feb1stTues/2018)); 118 119 static_assert((2018/Feb1stTues).year() == year{2018}, "" ); 120 static_assert((2018/Feb1stTues).month() == February, "" ); 121 static_assert((2018/Feb1stTues).weekday() == Tuesday, "" ); 122 123 for (int i = 1000; i < 1010; ++i) 124 for (int j = 1; j <= 12; ++j) 125 for (unsigned k = 0; k <= 6; ++k) 126 for (unsigned l = 1; l <= 5; ++l) 127 { 128 year y(i); 129 month m(j); 130 weekday wd{k}; 131 month_weekday mwd{m, weekday_indexed{weekday{k}, l}}; 132 year_month_weekday ymd1 = i/mwd; 133 year_month_weekday ymd2 = mwd/i; 134 assert(ymd1.year() == y); 135 assert(ymd2.year() == y); 136 assert(ymd1.month() == m); 137 assert(ymd2.month() == m); 138 assert(ymd1.weekday() == wd); 139 assert(ymd2.weekday() == wd); 140 assert(ymd1 == ymd2); 141 } 142 } 143 144 return 0; 145 } 146