brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 59d3875 Raw
146 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8// UNSUPPORTED: c++03, c++11, c++14, c++179 10// <chrono>11// class year_month_weekday;12 13// constexpr year_month_weekday14//   operator/(const year_month& ym, const weekday_indexed& wdi) noexcept;15// Returns: {ym.year(), ym.month(), wdi}.16//17// constexpr year_month_weekday18//   operator/(const year& y, const month_weekday& mwd) noexcept;19// Returns: {y, mwd.month(), mwd.weekday_indexed()}.20//21// constexpr year_month_weekday22//   operator/(int y, const month_weekday& mwd) noexcept;23// Returns: year(y) / mwd.24//25// constexpr year_month_weekday26//   operator/(const month_weekday& mwd, const year& y) noexcept;27// Returns: y / mwd.28//29// constexpr year_month_weekday30//   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 39int 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