/// <summary> /// Constructs a new value for the given year, month, day and calendar. No validation is performed. /// </summary> internal YearMonthDayCalendar(int year, int month, int day, CalendarOrdinal calendarOrdinal) { unchecked { value = ((year - 1) << CalendarDayMonthBits) | ((month - 1) << CalendarDayBits) | ((day - 1) << CalendarBits) | (int)calendarOrdinal; } }
public void AllCalendars() { for (int ordinal = 0; ordinal < 128; ordinal++) { CalendarOrdinal calendar = (CalendarOrdinal)ordinal; var ymdc = new YearMonthDayCalendar(-123, 12, 64, calendar); Assert.AreEqual(-123, ymdc.Year); Assert.AreEqual(12, ymdc.Month); Assert.AreEqual(64, ymdc.Day); Assert.AreEqual(calendar, ymdc.CalendarOrdinal); } }
private CalendarSystem(CalendarOrdinal ordinal, string id, string name, YearMonthDayCalculator yearMonthDayCalculator, EraCalculator eraCalculator) { this.Ordinal = ordinal; this.Id = id; this.Name = name; this.YearMonthDayCalculator = yearMonthDayCalculator; this.MinYear = yearMonthDayCalculator.MinYear; this.MaxYear = yearMonthDayCalculator.MaxYear; this.MinDays = yearMonthDayCalculator.GetStartOfYearInDays(MinYear); this.MaxDays = yearMonthDayCalculator.GetStartOfYearInDays(MaxYear + 1) - 1; // We trust the construction code not to mutate the array... this.eraCalculator = eraCalculator; CalendarByOrdinal[(int)ordinal] = this; }
static IslamicCalendars() { ByLeapYearPatterAndEpoch = new CalendarSystem[4, 2]; for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 2; j++) { var leapYearPattern = (IslamicLeapYearPattern)i; var epoch = (IslamicEpoch)j; var calculator = new IslamicYearMonthDayCalculator((IslamicLeapYearPattern)i, (IslamicEpoch)j); CalendarOrdinal ordinal = CalendarOrdinal.IslamicAstronomicalBase15 + (i - 1) + (j - 1) * 4; ByLeapYearPatterAndEpoch[i - 1, j - 1] = new CalendarSystem(ordinal, GetIslamicId(leapYearPattern, epoch), IslamicName, calculator, Era.AnnoHegirae); } } }
/// <summary> /// Fetches a calendar system by its ordinal value, constructing it if necessary. /// </summary> internal static CalendarSystem ForOrdinal([Trusted] CalendarOrdinal ordinal) { Preconditions.DebugCheckArgument(ordinal >= 0 && ordinal < CalendarOrdinal.Size, nameof(ordinal), "Unknown ordinal value {0}", ordinal); // Avoid an array lookup for the overwhelmingly common case. if (ordinal == CalendarOrdinal.Iso) { return(Iso); } CalendarSystem calendar = CalendarByOrdinal[(int)ordinal]; if (calendar != null) { return(calendar); } // Not found it in the array. This can happen if the calendar system was initialized in // a different thread, and the write to the array isn't visible in this thread yet. // A simple switch will do the right thing. This is separated out (directly below) to allow // it to be tested separately. (It may also help this method be inlined...) The return // statement below is unlikely to ever be hit by code coverage, as it's handling a very // unusual and hard-to-provoke situation. return(ForOrdinalUncached(ordinal)); }
internal YearMonthDayCalendar WithCalendarOrdinal(CalendarOrdinal calendarOrdinal) => new YearMonthDayCalendar(value, calendarOrdinal);
internal static CalendarSystem ForOrdinalUncached([Trusted] CalendarOrdinal ordinal) => ordinal switch {
private CalendarSystem(CalendarOrdinal ordinal, string id, string name, YearMonthDayCalculator yearMonthDayCalculator, Era singleEra) : this(ordinal, id, name, yearMonthDayCalculator, new SingleEraCalculator(singleEra, yearMonthDayCalculator)) { }
internal static CalendarSystem ForOrdinalUncached([Trusted] CalendarOrdinal ordinal) { switch (ordinal) { // This entry is really just for completeness. We'd never get called with this. case CalendarOrdinal.Iso: return(Iso); case CalendarOrdinal.Gregorian: return(Gregorian); case CalendarOrdinal.Julian: return(Julian); case CalendarOrdinal.Coptic: return(Coptic); case CalendarOrdinal.Badi: return(Badi); case CalendarOrdinal.HebrewCivil: return(HebrewCivil); case CalendarOrdinal.HebrewScriptural: return(HebrewScriptural); case CalendarOrdinal.PersianSimple: return(PersianSimple); case CalendarOrdinal.PersianArithmetic: return(PersianArithmetic); case CalendarOrdinal.PersianAstronomical: return(PersianAstronomical); case CalendarOrdinal.IslamicAstronomicalBase15: return(GetIslamicCalendar(IslamicLeapYearPattern.Base15, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicAstronomicalBase16: return(GetIslamicCalendar(IslamicLeapYearPattern.Base16, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicAstronomicalIndian: return(GetIslamicCalendar(IslamicLeapYearPattern.Indian, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicAstronomicalHabashAlHasib: return(GetIslamicCalendar(IslamicLeapYearPattern.HabashAlHasib, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicCivilBase15: return(GetIslamicCalendar(IslamicLeapYearPattern.Base15, IslamicEpoch.Civil)); case CalendarOrdinal.IslamicCivilBase16: return(GetIslamicCalendar(IslamicLeapYearPattern.Base16, IslamicEpoch.Civil)); case CalendarOrdinal.IslamicCivilIndian: return(GetIslamicCalendar(IslamicLeapYearPattern.Indian, IslamicEpoch.Civil)); case CalendarOrdinal.IslamicCivilHabashAlHasib: return(GetIslamicCalendar(IslamicLeapYearPattern.HabashAlHasib, IslamicEpoch.Civil)); case CalendarOrdinal.UmAlQura: return(UmAlQura); default: throw new InvalidOperationException($"Bug in Noda Time: calendar ordinal {ordinal} missing from switch in CalendarSystem.ForOrdinal."); } }
internal YearMonthDayCalendar(int yearMonthDay, CalendarOrdinal calendarOrdinal) { this.value = (yearMonthDay << CalendarBits) | (int)calendarOrdinal; }
private CalendarSystem(CalendarOrdinal ordinal, string id, string name, YearMonthDayCalculator yearMonthDayCalculator, int minDaysInFirstWeek, EraCalculator eraCalculator) { this.Ordinal = ordinal; this.Id = id; this.Name = name; this.YearMonthDayCalculator = yearMonthDayCalculator; this.weekYearCalculator = new WeekYearCalculator(yearMonthDayCalculator, minDaysInFirstWeek); this.MinYear = yearMonthDayCalculator.MinYear; this.MaxYear = yearMonthDayCalculator.MaxYear; this.MinDays = yearMonthDayCalculator.GetStartOfYearInDays(MinYear); this.MaxDays = yearMonthDayCalculator.GetStartOfYearInDays(MaxYear + 1) - 1; // We trust the construction code not to mutate the array... this.eraCalculator = eraCalculator; CalendarByOrdinal[(int) ordinal] = this; }
private CalendarSystem(CalendarOrdinal ordinal, string id, string name, YearMonthDayCalculator yearMonthDayCalculator, Era singleEra) : this(ordinal, id, name, yearMonthDayCalculator, 4, new SingleEraCalculator(singleEra, yearMonthDayCalculator)) { }
/// <summary> /// Fetches a calendar system by its ordinal value. This currently assumes that the relevant <see cref="CalendarSystem" /> will have been /// initialized beforehand (as construction populates the array). In other words, this should not be called with an arbitrary ordinal; /// this is fine as it's usually called for an existing local date, which must have been initialized using a known calendar system. /// </summary> [NotNull] internal static CalendarSystem ForOrdinal([Trusted] CalendarOrdinal ordinal) { Preconditions.DebugCheckArgument(ordinal >= 0 && ordinal < CalendarOrdinal.Size, nameof(ordinal), "Unknown ordinal value {0}", ordinal); // Avoid an array lookup for the overwhelmingly common case. if (ordinal == CalendarOrdinal.Iso) { return(IsoCalendarSystem); } CalendarSystem calendar = CalendarByOrdinal[(int)ordinal]; if (calendar != null) { return(calendar); } // Not found it in the array. This can happen if the calendar system was initialized in // a different thread, and the write to the array isn't visible in this thread yet. // A simple switch will do the right thing. switch (ordinal) { case CalendarOrdinal.Gregorian: return(Gregorian); case CalendarOrdinal.Julian: return(Julian); case CalendarOrdinal.Coptic: return(Coptic); case CalendarOrdinal.HebrewCivil: return(HebrewCivil); case CalendarOrdinal.HebrewScriptural: return(HebrewScriptural); case CalendarOrdinal.PersianSimple: return(PersianSimple); case CalendarOrdinal.PersianArithmetic: return(PersianArithmetic); case CalendarOrdinal.PersianAstronomical: return(PersianAstronomical); case CalendarOrdinal.IslamicAstronomicalBase15: return(GetIslamicCalendar(IslamicLeapYearPattern.Base15, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicAstronomicalBase16: return(GetIslamicCalendar(IslamicLeapYearPattern.Base16, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicAstronomicalIndian: return(GetIslamicCalendar(IslamicLeapYearPattern.Indian, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicAstronomicalHabashAlHasib: return(GetIslamicCalendar(IslamicLeapYearPattern.HabashAlHasib, IslamicEpoch.Astronomical)); case CalendarOrdinal.IslamicCivilBase15: return(GetIslamicCalendar(IslamicLeapYearPattern.Base15, IslamicEpoch.Civil)); case CalendarOrdinal.IslamicCivilBase16: return(GetIslamicCalendar(IslamicLeapYearPattern.Base16, IslamicEpoch.Civil)); case CalendarOrdinal.IslamicCivilIndian: return(GetIslamicCalendar(IslamicLeapYearPattern.Indian, IslamicEpoch.Civil)); case CalendarOrdinal.IslamicCivilHabashAlHasib: return(GetIslamicCalendar(IslamicLeapYearPattern.HabashAlHasib, IslamicEpoch.Civil)); case CalendarOrdinal.UmAlQura: return(UmAlQura); default: throw new InvalidOperationException($"Bug in Noda Time: calendar ordinal {ordinal} missing from switch in CalendarSystem.ForOrdinal."); } }