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 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