brintos

brintos / llvm-project-archived public Read only

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