288 lines · c
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP___CHRONO_YEAR_MONTH_WEEKDAY_H11#define _LIBCPP___CHRONO_YEAR_MONTH_WEEKDAY_H12 13#include <__chrono/calendar.h>14#include <__chrono/day.h>15#include <__chrono/duration.h>16#include <__chrono/month.h>17#include <__chrono/month_weekday.h>18#include <__chrono/system_clock.h>19#include <__chrono/time_point.h>20#include <__chrono/weekday.h>21#include <__chrono/year.h>22#include <__chrono/year_month.h>23#include <__chrono/year_month_day.h>24#include <__config>25 26#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)27# pragma GCC system_header28#endif29 30#if _LIBCPP_STD_VER >= 2031 32_LIBCPP_BEGIN_NAMESPACE_STD33 34namespace chrono {35 36class year_month_weekday {37 chrono::year __y_;38 chrono::month __m_;39 chrono::weekday_indexed __wdi_;40 41public:42 year_month_weekday() = default;43 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday(44 const chrono::year& __yval, const chrono::month& __mval, const chrono::weekday_indexed& __wdival) noexcept45 : __y_{__yval}, __m_{__mval}, __wdi_{__wdival} {}46 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday(const sys_days& __sysd) noexcept47 : year_month_weekday(__from_days(__sysd.time_since_epoch())) {}48 _LIBCPP_HIDE_FROM_ABI inline explicit constexpr year_month_weekday(const local_days& __locd) noexcept49 : year_month_weekday(__from_days(__locd.time_since_epoch())) {}50 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator+=(const months&) noexcept;51 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator-=(const months&) noexcept;52 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator+=(const years&) noexcept;53 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator-=(const years&) noexcept;54 55 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }56 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }57 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wdi_.weekday(); }58 _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __wdi_.index(); }59 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi_; }60 61 _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }62 _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {63 return local_days{__to_days()};64 }65 _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept {66 if (!__y_.ok() || !__m_.ok() || !__wdi_.ok())67 return false;68 if (__wdi_.index() <= 4)69 return true;70 auto __nth_weekday_day =71 __wdi_.weekday() - chrono::weekday{static_cast<sys_days>(__y_ / __m_ / 1)} + days{(__wdi_.index() - 1) * 7 + 1};72 return static_cast<unsigned>(__nth_weekday_day.count()) <= static_cast<unsigned>((__y_ / __m_ / last).day());73 }74 75 _LIBCPP_HIDE_FROM_ABI static constexpr year_month_weekday __from_days(days __d) noexcept;76 _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept;77};78 79_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday year_month_weekday::__from_days(days __d) noexcept {80 const sys_days __sysd{__d};81 const chrono::weekday __wd = chrono::weekday(__sysd);82 const year_month_day __ymd = year_month_day(__sysd);83 return year_month_weekday{__ymd.year(), __ymd.month(), __wd[(static_cast<unsigned>(__ymd.day()) - 1) / 7 + 1]};84}85 86_LIBCPP_HIDE_FROM_ABI inline constexpr days year_month_weekday::__to_days() const noexcept {87 const sys_days __sysd = sys_days(__y_ / __m_ / 1);88 return (__sysd + (__wdi_.weekday() - chrono::weekday(__sysd) + days{(__wdi_.index() - 1) * 7})).time_since_epoch();89}90 91_LIBCPP_HIDE_FROM_ABI inline constexpr bool92operator==(const year_month_weekday& __lhs, const year_month_weekday& __rhs) noexcept {93 return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() &&94 __lhs.weekday_indexed() == __rhs.weekday_indexed();95}96 97_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday98operator/(const year_month& __lhs, const weekday_indexed& __rhs) noexcept {99 return year_month_weekday{__lhs.year(), __lhs.month(), __rhs};100}101 102_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday103operator/(const year& __lhs, const month_weekday& __rhs) noexcept {104 return year_month_weekday{__lhs, __rhs.month(), __rhs.weekday_indexed()};105}106 107_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday operator/(int __lhs, const month_weekday& __rhs) noexcept {108 return year(__lhs) / __rhs;109}110 111_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday112operator/(const month_weekday& __lhs, const year& __rhs) noexcept {113 return __rhs / __lhs;114}115 116_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday operator/(const month_weekday& __lhs, int __rhs) noexcept {117 return year(__rhs) / __lhs;118}119 120_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday121operator+(const year_month_weekday& __lhs, const months& __rhs) noexcept {122 return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_indexed();123}124 125_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday126operator+(const months& __lhs, const year_month_weekday& __rhs) noexcept {127 return __rhs + __lhs;128}129 130_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday131operator-(const year_month_weekday& __lhs, const months& __rhs) noexcept {132 return __lhs + (-__rhs);133}134 135_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday136operator+(const year_month_weekday& __lhs, const years& __rhs) noexcept {137 return year_month_weekday{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_indexed()};138}139 140_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday141operator+(const years& __lhs, const year_month_weekday& __rhs) noexcept {142 return __rhs + __lhs;143}144 145_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday146operator-(const year_month_weekday& __lhs, const years& __rhs) noexcept {147 return __lhs + (-__rhs);148}149 150_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator+=(const months& __dm) noexcept {151 *this = *this + __dm;152 return *this;153}154_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator-=(const months& __dm) noexcept {155 *this = *this - __dm;156 return *this;157}158_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator+=(const years& __dy) noexcept {159 *this = *this + __dy;160 return *this;161}162_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator-=(const years& __dy) noexcept {163 *this = *this - __dy;164 return *this;165}166 167class year_month_weekday_last {168private:169 chrono::year __y_;170 chrono::month __m_;171 chrono::weekday_last __wdl_;172 173public:174 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last(175 const chrono::year& __yval, const chrono::month& __mval, const chrono::weekday_last& __wdlval) noexcept176 : __y_{__yval}, __m_{__mval}, __wdl_{__wdlval} {}177 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator+=(const months& __dm) noexcept;178 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator-=(const months& __dm) noexcept;179 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator+=(const years& __dy) noexcept;180 _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator-=(const years& __dy) noexcept;181 182 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; }183 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; }184 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wdl_.weekday(); }185 _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl_; }186 _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; }187 _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept {188 return local_days{__to_days()};189 }190 _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __m_.ok() && __wdl_.ok(); }191 192 _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept;193};194 195_LIBCPP_HIDE_FROM_ABI inline constexpr days year_month_weekday_last::__to_days() const noexcept {196 const sys_days __last = sys_days{__y_ / __m_ / last};197 return (__last - (chrono::weekday{__last} - __wdl_.weekday())).time_since_epoch();198}199 200_LIBCPP_HIDE_FROM_ABI inline constexpr bool201operator==(const year_month_weekday_last& __lhs, const year_month_weekday_last& __rhs) noexcept {202 return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last();203}204 205_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last206operator/(const year_month& __lhs, const weekday_last& __rhs) noexcept {207 return year_month_weekday_last{__lhs.year(), __lhs.month(), __rhs};208}209 210_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last211operator/(const year& __lhs, const month_weekday_last& __rhs) noexcept {212 return year_month_weekday_last{__lhs, __rhs.month(), __rhs.weekday_last()};213}214 215_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last216operator/(int __lhs, const month_weekday_last& __rhs) noexcept {217 return year(__lhs) / __rhs;218}219 220_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last221operator/(const month_weekday_last& __lhs, const year& __rhs) noexcept {222 return __rhs / __lhs;223}224 225_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last226operator/(const month_weekday_last& __lhs, int __rhs) noexcept {227 return year(__rhs) / __lhs;228}229 230_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last231operator+(const year_month_weekday_last& __lhs, const months& __rhs) noexcept {232 return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_last();233}234 235_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last236operator+(const months& __lhs, const year_month_weekday_last& __rhs) noexcept {237 return __rhs + __lhs;238}239 240_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last241operator-(const year_month_weekday_last& __lhs, const months& __rhs) noexcept {242 return __lhs + (-__rhs);243}244 245_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last246operator+(const year_month_weekday_last& __lhs, const years& __rhs) noexcept {247 return year_month_weekday_last{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_last()};248}249 250_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last251operator+(const years& __lhs, const year_month_weekday_last& __rhs) noexcept {252 return __rhs + __lhs;253}254 255_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last256operator-(const year_month_weekday_last& __lhs, const years& __rhs) noexcept {257 return __lhs + (-__rhs);258}259 260_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last&261year_month_weekday_last::operator+=(const months& __dm) noexcept {262 *this = *this + __dm;263 return *this;264}265_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last&266year_month_weekday_last::operator-=(const months& __dm) noexcept {267 *this = *this - __dm;268 return *this;269}270_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last&271year_month_weekday_last::operator+=(const years& __dy) noexcept {272 *this = *this + __dy;273 return *this;274}275_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last&276year_month_weekday_last::operator-=(const years& __dy) noexcept {277 *this = *this - __dy;278 return *this;279}280 281} // namespace chrono282 283_LIBCPP_END_NAMESPACE_STD284 285#endif // _LIBCPP_STD_VER >= 20286 287#endif // _LIBCPP___CHRONO_YEAR_MONTH_WEEKDAY_H288