/// <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);
     }
 }
Exemple #3
0
 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;
 }
Exemple #4
0
 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);
         }
     }
 }
Exemple #5
0
        /// <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));
        }
Exemple #6
0
 internal YearMonthDayCalendar WithCalendarOrdinal(CalendarOrdinal calendarOrdinal) =>
 new YearMonthDayCalendar(value, calendarOrdinal);
Exemple #7
0
 internal static CalendarSystem ForOrdinalUncached([Trusted] CalendarOrdinal ordinal) => ordinal switch
 {
Exemple #8
0
 private CalendarSystem(CalendarOrdinal ordinal, string id, string name, YearMonthDayCalculator yearMonthDayCalculator, Era singleEra)
     : this(ordinal, id, name, yearMonthDayCalculator, new SingleEraCalculator(singleEra, yearMonthDayCalculator))
 {
 }
Exemple #9
0
        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))
 {
 }
Exemple #13
0
        /// <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.");
            }
        }