|
4 | 4 |
|
5 | 5 | use core::fmt; |
6 | 6 |
|
7 | | -/// The year flags (aka the dominical letter). |
| 7 | +/// Year flags (aka the dominical letter). |
| 8 | +/// |
| 9 | +/// `YearFlags` are used as the last four bits of `NaiveDate`, `Mdf` and `IsoWeek`. |
8 | 10 | /// |
9 | 11 | /// There are 14 possible classes of year in the Gregorian calendar: |
10 | 12 | /// common and leap years starting with Monday through Sunday. |
11 | | -/// The `YearFlags` stores this information into 4 bits `abbb`, |
12 | | -/// where `a` is `1` for the common year (simplifies the `Of` validation) |
13 | | -/// and `bbb` is a non-zero `Weekday` (mapping `Mon` to 7) of the last day in the past year |
14 | | -/// (simplifies the day of week calculation from the 1-based ordinal). |
| 13 | +/// |
| 14 | +/// The `YearFlags` stores this information into 4 bits `LWWW`. `L` is the leap year flag, with `1` |
| 15 | +/// for the common year (this simplifies validating an ordinal in `NaiveDate`). `WWW` is a non-zero |
| 16 | +/// `Weekday` of the last day in the preceding year. |
15 | 17 | #[allow(unreachable_pub)] // public as an alias for benchmarks only |
16 | 18 | #[derive(PartialEq, Eq, Copy, Clone, Hash)] |
17 | 19 | pub struct YearFlags(pub(super) u8); |
18 | 20 |
|
19 | | -pub(super) const A: YearFlags = YearFlags(0o15); |
20 | | -pub(super) const AG: YearFlags = YearFlags(0o05); |
21 | | -pub(super) const B: YearFlags = YearFlags(0o14); |
22 | | -pub(super) const BA: YearFlags = YearFlags(0o04); |
23 | | -pub(super) const C: YearFlags = YearFlags(0o13); |
24 | | -pub(super) const CB: YearFlags = YearFlags(0o03); |
25 | | -pub(super) const D: YearFlags = YearFlags(0o12); |
26 | | -pub(super) const DC: YearFlags = YearFlags(0o02); |
27 | | -pub(super) const E: YearFlags = YearFlags(0o11); |
28 | | -pub(super) const ED: YearFlags = YearFlags(0o01); |
29 | | -pub(super) const F: YearFlags = YearFlags(0o17); |
30 | | -pub(super) const FE: YearFlags = YearFlags(0o07); |
31 | | -pub(super) const G: YearFlags = YearFlags(0o16); |
32 | | -pub(super) const GF: YearFlags = YearFlags(0o06); |
| 21 | +// Weekday of the last day in the preceding year. |
| 22 | +// Allows for quick day of week calculation from the 1-based ordinal. |
| 23 | +const YEAR_STARTS_AFTER_MONDAY: u8 = 7; // non-zero to allow use with `NonZero*`. |
| 24 | +const YEAR_STARTS_AFTER_THUESDAY: u8 = 1; |
| 25 | +const YEAR_STARTS_AFTER_WEDNESDAY: u8 = 2; |
| 26 | +const YEAR_STARTS_AFTER_THURSDAY: u8 = 3; |
| 27 | +const YEAR_STARTS_AFTER_FRIDAY: u8 = 4; |
| 28 | +const YEAR_STARTS_AFTER_SATURDAY: u8 = 5; |
| 29 | +const YEAR_STARTS_AFTER_SUNDAY: u8 = 6; |
| 30 | + |
| 31 | +const COMMON_YEAR: u8 = 1 << 3; |
| 32 | +const LEAP_YEAR: u8 = 0 << 3; |
| 33 | + |
| 34 | +pub(super) const A: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_SATURDAY); |
| 35 | +pub(super) const AG: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_SATURDAY); |
| 36 | +pub(super) const B: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_FRIDAY); |
| 37 | +pub(super) const BA: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_FRIDAY); |
| 38 | +pub(super) const C: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_THURSDAY); |
| 39 | +pub(super) const CB: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_THURSDAY); |
| 40 | +pub(super) const D: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_WEDNESDAY); |
| 41 | +pub(super) const DC: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_WEDNESDAY); |
| 42 | +pub(super) const E: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_THUESDAY); |
| 43 | +pub(super) const ED: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_THUESDAY); |
| 44 | +pub(super) const F: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_MONDAY); |
| 45 | +pub(super) const FE: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_MONDAY); |
| 46 | +pub(super) const G: YearFlags = YearFlags(COMMON_YEAR | YEAR_STARTS_AFTER_SUNDAY); |
| 47 | +pub(super) const GF: YearFlags = YearFlags(LEAP_YEAR | YEAR_STARTS_AFTER_SUNDAY); |
33 | 48 |
|
34 | 49 | const YEAR_TO_FLAGS: &[YearFlags; 400] = &[ |
35 | 50 | BA, G, F, E, DC, B, A, G, FE, D, C, B, AG, F, E, D, CB, A, G, F, ED, C, B, A, GF, E, D, C, BA, |
|
0 commit comments