brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 742207d Raw
191 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_day;12 13// constexpr year_month_day14//   operator/(const year_month& ym, const day& d) noexcept;15// Returns: {ym.year(), ym.month(), d}.16//17// constexpr year_month_day18//   operator/(const year_month& ym, int d) noexcept;19// Returns: ym / day(d).20//21// constexpr year_month_day22//   operator/(const year& y, const month_day& md) noexcept;23// Returns: y / md.month() / md.day().24//25// constexpr year_month_day26//   operator/(int y, const month_day& md) noexcept;27// Returns: year(y) / md.28//29// constexpr year_month_day30//   operator/(const month_day& md, const year& y) noexcept;31// Returns: y / md.32//33// constexpr year_month_day34//   operator/(const month_day& md, int y) noexcept;35// Returns: year(y) / md.36 37#include <chrono>38#include <type_traits>39#include <cassert>40 41#include "test_macros.h"42 43int main(int, char**)44{45    using year           = std::chrono::year;46    using month          = std::chrono::month;47    using day            = std::chrono::day;48    using year_month     = std::chrono::year_month;49    using month_day      = std::chrono::month_day;50    using year_month_day = std::chrono::year_month_day;51 52    constexpr month February = std::chrono::February;53    constexpr year_month Feb2018{year{2018}, February};54 55    { // operator/(const year_month& ym, const day& d)56        ASSERT_NOEXCEPT (                         Feb2018/day{2});57        ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/day{2}));58 59        static_assert((Feb2018/day{2}).month() == February, "");60        static_assert((Feb2018/day{2}).day()   == day{2},   "");61 62        for (int i = 1000; i < 1010; ++i)63            for (int j = 1; j <= 12; ++j)64                for (unsigned k = 0; k <= 28; ++k)65                {66                    year y(i);67                    month m(j);68                    day d(k);69                    year_month ym(y, m);70                    year_month_day ymd = ym/d;71                    assert(ymd.year()  == y);72                    assert(ymd.month() == m);73                    assert(ymd.day()   == d);74                }75    }76 77 78    { // operator/(const year_month& ym, int d)79        ASSERT_NOEXCEPT (                         Feb2018/2);80        ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/2));81 82        static_assert((Feb2018/2).month() == February, "");83        static_assert((Feb2018/2).day()   == day{2},   "");84 85        for (int i = 1000; i < 1010; ++i)86            for (int j = 1; j <= 12; ++j)87                for (unsigned k = 0; k <= 28; ++k)88                {89                    year y(i);90                    month m(j);91                    day d(k);92                    year_month ym(y, m);93                    year_month_day ymd = ym/k;94                    assert(ymd.year()  == y);95                    assert(ymd.month() == m);96                    assert(ymd.day()   == d);97                }98    }99 100 101    { // operator/(const year_month& ym, int d)102        ASSERT_NOEXCEPT (                         Feb2018/2);103        ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/2));104 105        static_assert((Feb2018/2).month() == February, "");106        static_assert((Feb2018/2).day()   == day{2},   "");107 108        for (int i = 1000; i < 1010; ++i)109            for (int j = 1; j <= 12; ++j)110                for (unsigned k = 0; k <= 28; ++k)111                {112                    year y(i);113                    month m(j);114                    day d(k);115                    year_month ym(y, m);116                    year_month_day ymd = ym/k;117                    assert(ymd.year()  == y);118                    assert(ymd.month() == m);119                    assert(ymd.day()   == d);120                }121    }122 123 124 125 126    { // operator/(const year& y, const month_day& md) (and switched)127        ASSERT_NOEXCEPT (                         year{2018}/month_day{February, day{2}});128        ASSERT_SAME_TYPE(year_month_day, decltype(year{2018}/month_day{February, day{2}}));129        ASSERT_NOEXCEPT (                         month_day{February, day{2}}/year{2018});130        ASSERT_SAME_TYPE(year_month_day, decltype(month_day{February, day{2}}/year{2018}));131 132        static_assert((year{2018}/month_day{February, day{2}}).month() == February, "" );133        static_assert((year{2018}/month_day{February, day{2}}).day()   == day{2},   "" );134        static_assert((month_day{February, day{2}}/year{2018}).month() == February, "" );135        static_assert((month_day{February, day{2}}/year{2018}).day()   == day{2},   "" );136 137        for (int i = 1000; i < 1010; ++i)138            for (int j = 1; j <= 12; ++j)139                for (unsigned k = 0; k <= 28; ++k)140                {141                    year y(i);142                    month m(j);143                    day d(k);144                    month_day md(m, d);145                    year_month_day ymd1 = y/md;146                    year_month_day ymd2 = md/y;147                    assert(ymd1.year()  == y);148                    assert(ymd2.year()  == y);149                    assert(ymd1.month() == m);150                    assert(ymd2.month() == m);151                    assert(ymd1.day()   == d);152                    assert(ymd2.day()   == d);153                    assert(ymd1 == ymd2);154                }155    }156 157    { // operator/(const month_day& md, int y) (and switched)158        ASSERT_NOEXCEPT (                         2018/month_day{February, day{2}});159        ASSERT_SAME_TYPE(year_month_day, decltype(2018/month_day{February, day{2}}));160        ASSERT_NOEXCEPT (                         month_day{February, day{2}}/2018);161        ASSERT_SAME_TYPE(year_month_day, decltype(month_day{February, day{2}}/2018));162 163        static_assert((2018/month_day{February, day{2}}).month() == February, "" );164        static_assert((2018/month_day{February, day{2}}).day()   == day{2},   "" );165        static_assert((month_day{February, day{2}}/2018).month() == February, "" );166        static_assert((month_day{February, day{2}}/2018).day()   == day{2},   "" );167 168        for (int i = 1000; i < 1010; ++i)169            for (int j = 1; j <= 12; ++j)170                for (unsigned k = 0; k <= 28; ++k)171                {172                    year y(i);173                    month m(j);174                    day d(k);175                    month_day md(m, d);176                    year_month_day ymd1 = i/md;177                    year_month_day ymd2 = md/i;178                    assert(ymd1.year()  == y);179                    assert(ymd2.year()  == y);180                    assert(ymd1.month() == m);181                    assert(ymd2.month() == m);182                    assert(ymd1.day()   == d);183                    assert(ymd2.day()   == d);184                    assert(ymd1 == ymd2);185                }186    }187 188 189  return 0;190}191