/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: set ts=8 sts=2 et sw=2 tw=80: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/** * Returns the maximum non-leap month. This is the epagomenal month "M13".
*/
constexpr staticauto maxNonLeapMonth() { return MonthCode{Code::M13}; }
/** * Returns the maximum leap month.
*/
constexpr staticauto maxLeapMonth() { return MonthCode{Code::M12L}; }
};
class MonthCodes final {
mozilla::EnumSet<MonthCode::Code> monthCodes_{
MonthCode::Code::M01, MonthCode::Code::M02, MonthCode::Code::M03,
MonthCode::Code::M04, MonthCode::Code::M05, MonthCode::Code::M06,
MonthCode::Code::M07, MonthCode::Code::M08, MonthCode::Code::M09,
MonthCode::Code::M10, MonthCode::Code::M11, MonthCode::Code::M12,
};
public:
constexpr MOZ_IMPLICIT MonthCodes(std::initializer_list<MonthCode> list) { for (auto value : list) {
monthCodes_ += value.code();
}
}
constexpr auto& CalendarMonthCodes(CalendarId id) { switch (id) { case CalendarId::ISO8601: case CalendarId::Buddhist: case CalendarId::Gregorian: case CalendarId::Indian: case CalendarId::Islamic: case CalendarId::IslamicCivil: case CalendarId::IslamicRGSA: case CalendarId::IslamicTabular: case CalendarId::IslamicUmmAlQura: case CalendarId::Persian: case CalendarId::Japanese: case CalendarId::ROC: return monthcodes::ISO8601;
case CalendarId::Chinese: case CalendarId::Dangi: return monthcodes::ChineseOrDangi;
case CalendarId::Coptic: case CalendarId::Ethiopian: case CalendarId::EthiopianAmeteAlem: return monthcodes::CopticOrEthiopian;
case CalendarId::Hebrew: return monthcodes::Hebrew;
}
JS_CONSTEXPR_CRASH("invalid calendar id");
}
constexpr bool CalendarHasLeapMonths(CalendarId id) { switch (id) { case CalendarId::ISO8601: case CalendarId::Buddhist: case CalendarId::Coptic: case CalendarId::Ethiopian: case CalendarId::EthiopianAmeteAlem: case CalendarId::Gregorian: case CalendarId::Indian: case CalendarId::Islamic: case CalendarId::IslamicCivil: case CalendarId::IslamicRGSA: case CalendarId::IslamicTabular: case CalendarId::IslamicUmmAlQura: case CalendarId::Japanese: case CalendarId::Persian: case CalendarId::ROC: returnfalse;
case CalendarId::Chinese: case CalendarId::Dangi: case CalendarId::Hebrew: returntrue;
}
JS_CONSTEXPR_CRASH("invalid calendar id");
}
constexpr bool CalendarHasEpagomenalMonths(CalendarId id) { switch (id) { case CalendarId::ISO8601: case CalendarId::Buddhist: case CalendarId::Chinese: case CalendarId::Dangi: case CalendarId::Gregorian: case CalendarId::Hebrew: case CalendarId::Indian: case CalendarId::Islamic: case CalendarId::IslamicCivil: case CalendarId::IslamicRGSA: case CalendarId::IslamicTabular: case CalendarId::IslamicUmmAlQura: case CalendarId::Japanese: case CalendarId::Persian: case CalendarId::ROC: returnfalse;
case CalendarId::Coptic: case CalendarId::Ethiopian: case CalendarId::EthiopianAmeteAlem: returntrue;
}
JS_CONSTEXPR_CRASH("invalid calendar id");
}
constexpr std::pair<int32_t, int32_t> CalendarDaysInMonth(CalendarId id,
MonthCode monthCode) { switch (id) { case CalendarId::ISO8601: case CalendarId::Buddhist: case CalendarId::Gregorian: case CalendarId::Japanese: case CalendarId::ROC: return ISODaysInMonth(monthCode);
// Chinese/Dangi calendars have 29-30 days per month. case CalendarId::Chinese: case CalendarId::Dangi: return {29, 30};
// Coptic, Ethiopian, EthiopianAmeteAlem: // M01..M12: 30 days. // M13: 5-6 days. case CalendarId::Coptic: case CalendarId::Ethiopian: case CalendarId::EthiopianAmeteAlem: { if (monthCode.ordinal() <= 12) { return {30, 30};
} return {5, 6};
}
// Indian: // M1: 30-31 days. // M02..M06: 31 days // M07..M12: 30 days case CalendarId::Indian: {
int32_t ordinal = monthCode.ordinal(); if (ordinal == 1) { return {30, 31};
} if (ordinal <= 6) { return {31, 31};
} return {30, 30};
}
// Islamic calendars have 29-30 days per month. case CalendarId::Islamic: case CalendarId::IslamicRGSA: case CalendarId::IslamicUmmAlQura: return {29, 30};
// IslamicCivil, IslamicTabular: // M01, M03, M05, M07, M09, M11: 30 days // M02, M04, M06, M08, M10: 29 days // M12: 29-30 days. case CalendarId::IslamicCivil: case CalendarId::IslamicTabular: {
int32_t ordinal = monthCode.ordinal(); if ((ordinal & 1) == 1) { return {30, 30};
} if (ordinal < 12) { return {29, 29};
} return {29, 30};
}
// Persian: // M01..M06: 31 days // M07..M11: 30 days // M12: 29-30 days case CalendarId::Persian: {
int32_t ordinal = monthCode.ordinal(); if (ordinal <= 6) { return {31, 31};
} if (ordinal <= 11) { return {30, 30};
} return {29, 30};
}
}
JS_CONSTEXPR_CRASH("invalid calendar id");
}
} // namespace js::temporal
#endif/* builtin_temporal_MonthCode_h */
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-06-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.