brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · c724be6 Raw
106 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_day operator+(const year_month_day& ymd, const months& dm) noexcept;14//   Returns: (ymd.year() / ymd.month() + dm) / ymd.day().15//16// constexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;17//   Returns: ymd + dm.18//19//20// constexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;21//   Returns: (ymd.year() + dy) / ymd.month() / ymd.day().22//23// constexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;24//   Returns: ym + dm.25 26#include <chrono>27#include <cassert>28#include <type_traits>29#include <utility>30 31#include "test_macros.h"32 33using day            = std::chrono::day;34using year           = std::chrono::year;35using years          = std::chrono::years;36using month          = std::chrono::month;37using months         = std::chrono::months;38using year_month_day = std::chrono::year_month_day;39 40constexpr bool test() {41  { // year_month_day + months42    year_month_day ym{year{1234}, std::chrono::January, day{12}};43    for (int i = 0; i <= 10; ++i) {44      year_month_day ymd1 = ym + months{i};45      year_month_day ymd2 = months{i} + ym;46      assert(static_cast<int>(ymd1.year()) == 1234);47      assert(static_cast<int>(ymd2.year()) == 1234);48      assert(ymd1.month() == month(1 + i));49      assert(ymd2.month() == month(1 + i));50      assert(ymd1.day() == day{12});51      assert(ymd2.day() == day{12});52      assert(ymd1 == ymd2);53    }54    // Test the year wraps around.55    for (int i = 12; i <= 15; ++i) {56      year_month_day ymd1 = ym + months{i};57      year_month_day ymd2 = months{i} + ym;58      assert(static_cast<int>(ymd1.year()) == 1235);59      assert(static_cast<int>(ymd2.year()) == 1235);60      assert(ymd1.month() == month(1 + i - 12));61      assert(ymd2.month() == month(1 + i - 12));62      assert(ymd1.day() == day{12});63      assert(ymd2.day() == day{12});64      assert(ymd1 == ymd2);65    }66  }67 68  { // year_month_day + years69    year_month_day ym{year{1234}, std::chrono::January, day{12}};70    for (int i = 0; i <= 10; ++i) {71      year_month_day ymd1 = ym + years{i};72      year_month_day ymd2 = years{i} + ym;73      assert(static_cast<int>(ymd1.year()) == i + 1234);74      assert(static_cast<int>(ymd2.year()) == i + 1234);75      assert(ymd1.month() == std::chrono::January);76      assert(ymd2.month() == std::chrono::January);77      assert(ymd1.day() == day{12});78      assert(ymd2.day() == day{12});79      assert(ymd1 == ymd2);80    }81  }82 83  return true;84}85 86int main(int, char**) {87  // year_month_day + months88  ASSERT_NOEXCEPT(std::declval<year_month_day>() + std::declval<months>());89  ASSERT_NOEXCEPT(std::declval<months>() + std::declval<year_month_day>());90 91  ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<year_month_day>() + std::declval<months>()));92  ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<months>() + std::declval<year_month_day>()));93 94  // year_month_day + years95  ASSERT_NOEXCEPT(std::declval<year_month_day>() + std::declval<years>());96  ASSERT_NOEXCEPT(std::declval<years>() + std::declval<year_month_day>());97 98  ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<year_month_day>() + std::declval<years>()));99  ASSERT_SAME_TYPE(year_month_day, decltype(std::declval<years>() + std::declval<year_month_day>()));100 101  test();102  static_assert(test());103 104  return 0;105}106